mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-02-26 23:09:41 +00:00
[General] Rework Attack packets and add synchronization for item magic
This commit is contained in:
parent
0f0e8b7c08
commit
20e0100706
5 changed files with 87 additions and 21 deletions
|
@ -936,6 +936,25 @@ namespace MWMechanics
|
|||
else if (isProjectile || !mTarget.isEmpty())
|
||||
inflict(mTarget, mCaster, enchantment->mEffects, ESM::RT_Target);
|
||||
|
||||
/*
|
||||
Start of tes3mp addition
|
||||
|
||||
If this mPtr belongs to a LocalPlayer or LocalActor, get their Attack and prepare
|
||||
it for sending
|
||||
*/
|
||||
mwmp::Attack *localAttack = MechanicsHelper::getLocalAttack(mCaster);
|
||||
|
||||
if (localAttack)
|
||||
{
|
||||
MechanicsHelper::resetAttack(localAttack);
|
||||
localAttack->type = mwmp::Attack::ITEM_MAGIC;
|
||||
localAttack->itemId = item.getCellRef().getRefId();
|
||||
localAttack->shouldSend = true;
|
||||
}
|
||||
/*
|
||||
End of tes3mp addition
|
||||
*/
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -201,8 +201,6 @@ void MechanicsHelper::processAttack(Attack attack, const MWWorld::Ptr& attacker)
|
|||
}
|
||||
|
||||
MWMechanics::CreatureStats &attackerStats = attacker.getClass().getCreatureStats(attacker);
|
||||
attackerStats.getSpells().setSelectedSpell(attack.spellId);
|
||||
|
||||
MWWorld::Ptr victim;
|
||||
|
||||
if (attack.target.isPlayer)
|
||||
|
@ -282,6 +280,8 @@ void MechanicsHelper::processAttack(Attack attack, const MWWorld::Ptr& attacker)
|
|||
}
|
||||
else if (attack.type == attack.MAGIC)
|
||||
{
|
||||
attackerStats.getSpells().setSelectedSpell(attack.spellId);
|
||||
|
||||
if (attack.instant)
|
||||
{
|
||||
MWBase::Environment::get().getWorld()->castSpell(attacker);
|
||||
|
@ -290,6 +290,32 @@ void MechanicsHelper::processAttack(Attack attack, const MWWorld::Ptr& attacker)
|
|||
|
||||
LOG_APPEND(Log::LOG_VERBOSE, "- spellId: %s, success: %s", attack.spellId.c_str(), attack.success ? "true" : "false");
|
||||
}
|
||||
else if (attack.type == attack.ITEM_MAGIC)
|
||||
{
|
||||
attackerStats.getSpells().setSelectedSpell("");
|
||||
|
||||
MWWorld::InventoryStore& inventoryStore = attacker.getClass().getInventoryStore(attacker);
|
||||
|
||||
MWWorld::ContainerStoreIterator it = inventoryStore.begin();
|
||||
for (; it != inventoryStore.end(); ++it)
|
||||
{
|
||||
if (Misc::StringUtils::ciEqual(it->getCellRef().getRefId(), attack.itemId))
|
||||
break;
|
||||
}
|
||||
|
||||
if (it != inventoryStore.end())
|
||||
{
|
||||
inventoryStore.setSelectedEnchantItem(it);
|
||||
LOG_APPEND(Log::LOG_VERBOSE, "- itemId: %s", attack.itemId.c_str());
|
||||
MWBase::Environment::get().getWorld()->castSpell(attacker);
|
||||
inventoryStore.setSelectedEnchantItem(inventoryStore.end());
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Could not find item %s used by %s to cast item spell!",
|
||||
attack.itemId.c_str(), attacker.getCellRef().getRefId().c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool MechanicsHelper::doesEffectListContainEffect(const ESM::EffectList& effectList, short effectId, short attributeId, short skillId)
|
||||
|
|
|
@ -41,15 +41,17 @@ namespace mwmp
|
|||
|
||||
Target target;
|
||||
|
||||
char type; // 0 - melee, 1 - magic, 2 - throwable
|
||||
char type; // 0 - melee, 1 - magic, 2 - item magic, 3 - throwable
|
||||
enum TYPE
|
||||
{
|
||||
MELEE = 0,
|
||||
MAGIC,
|
||||
ITEM_MAGIC,
|
||||
THROWABLE
|
||||
};
|
||||
|
||||
std::string spellId; // id of spell (e.g. "fireball")
|
||||
std::string itemId;
|
||||
|
||||
float damage;
|
||||
|
||||
|
|
|
@ -24,16 +24,22 @@ void PacketActorAttack::Actor(BaseActor &actor, bool send)
|
|||
RW(actor.attack.target.mpNum, send);
|
||||
}
|
||||
|
||||
RW(actor.attack.spellId, send);
|
||||
RW(actor.attack.type, send);
|
||||
RW(actor.attack.success, send);
|
||||
RW(actor.attack.damage, send);
|
||||
|
||||
RW(actor.attack.pressed, send);
|
||||
RW(actor.attack.knockdown, send);
|
||||
RW(actor.attack.block, send);
|
||||
|
||||
RW(actor.attack.instant, send);
|
||||
RW(actor.attack.applyWeaponEnchantment, send);
|
||||
RW(actor.attack.applyProjectileEnchantment, send);
|
||||
RW(actor.attack.success, send);
|
||||
RW(actor.attack.type, send);
|
||||
|
||||
if (actor.attack.type == mwmp::Attack::MELEE)
|
||||
{
|
||||
RW(actor.attack.damage, send);
|
||||
RW(actor.attack.block, send);
|
||||
RW(actor.attack.knockdown, send);
|
||||
|
||||
RW(actor.attack.applyWeaponEnchantment, send);
|
||||
RW(actor.attack.applyProjectileEnchantment, send);
|
||||
}
|
||||
else if (actor.attack.type == mwmp::Attack::MAGIC)
|
||||
RW(actor.attack.spellId, send, true);
|
||||
else if (actor.attack.type == mwmp::Attack::ITEM_MAGIC)
|
||||
RW(actor.attack.itemId, send, true);
|
||||
}
|
||||
|
|
|
@ -25,15 +25,28 @@ void PacketPlayerAttack::Packet(RakNet::BitStream *bs, bool send)
|
|||
RW(player->attack.target.mpNum, send);
|
||||
}
|
||||
|
||||
RW(player->attack.spellId, send, true);
|
||||
RW(player->attack.type, send);
|
||||
RW(player->attack.success, send);
|
||||
RW(player->attack.damage, send, false); // never compress damage
|
||||
|
||||
RW(player->attack.pressed, send);
|
||||
RW(player->attack.knockdown, send);
|
||||
RW(player->attack.block, send);
|
||||
if (player->attack.type == mwmp::Attack::MELEE || player->attack.type == mwmp::Attack::MAGIC)
|
||||
{
|
||||
RW(player->attack.pressed, send);
|
||||
RW(player->attack.success, send);
|
||||
|
||||
RW(player->attack.applyWeaponEnchantment, send);
|
||||
RW(player->attack.applyProjectileEnchantment, send);
|
||||
if (player->attack.type == mwmp::Attack::MELEE)
|
||||
{
|
||||
RW(player->attack.damage, send);
|
||||
RW(player->attack.block, send);
|
||||
RW(player->attack.knockdown, send);
|
||||
|
||||
RW(player->attack.applyWeaponEnchantment, send);
|
||||
RW(player->attack.applyProjectileEnchantment, send);
|
||||
}
|
||||
else if (player->attack.type == mwmp::Attack::MAGIC)
|
||||
{
|
||||
RW(player->attack.instant, send);
|
||||
RW(player->attack.spellId, send, true);
|
||||
}
|
||||
}
|
||||
else if (player->attack.type == mwmp::Attack::ITEM_MAGIC)
|
||||
RW(player->attack.itemId, send), true;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue