mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-02-27 05:09:40 +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())
|
else if (isProjectile || !mTarget.isEmpty())
|
||||||
inflict(mTarget, mCaster, enchantment->mEffects, ESM::RT_Target);
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -201,8 +201,6 @@ void MechanicsHelper::processAttack(Attack attack, const MWWorld::Ptr& attacker)
|
||||||
}
|
}
|
||||||
|
|
||||||
MWMechanics::CreatureStats &attackerStats = attacker.getClass().getCreatureStats(attacker);
|
MWMechanics::CreatureStats &attackerStats = attacker.getClass().getCreatureStats(attacker);
|
||||||
attackerStats.getSpells().setSelectedSpell(attack.spellId);
|
|
||||||
|
|
||||||
MWWorld::Ptr victim;
|
MWWorld::Ptr victim;
|
||||||
|
|
||||||
if (attack.target.isPlayer)
|
if (attack.target.isPlayer)
|
||||||
|
@ -282,6 +280,8 @@ void MechanicsHelper::processAttack(Attack attack, const MWWorld::Ptr& attacker)
|
||||||
}
|
}
|
||||||
else if (attack.type == attack.MAGIC)
|
else if (attack.type == attack.MAGIC)
|
||||||
{
|
{
|
||||||
|
attackerStats.getSpells().setSelectedSpell(attack.spellId);
|
||||||
|
|
||||||
if (attack.instant)
|
if (attack.instant)
|
||||||
{
|
{
|
||||||
MWBase::Environment::get().getWorld()->castSpell(attacker);
|
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");
|
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)
|
bool MechanicsHelper::doesEffectListContainEffect(const ESM::EffectList& effectList, short effectId, short attributeId, short skillId)
|
||||||
|
|
|
@ -41,15 +41,17 @@ namespace mwmp
|
||||||
|
|
||||||
Target target;
|
Target target;
|
||||||
|
|
||||||
char type; // 0 - melee, 1 - magic, 2 - throwable
|
char type; // 0 - melee, 1 - magic, 2 - item magic, 3 - throwable
|
||||||
enum TYPE
|
enum TYPE
|
||||||
{
|
{
|
||||||
MELEE = 0,
|
MELEE = 0,
|
||||||
MAGIC,
|
MAGIC,
|
||||||
|
ITEM_MAGIC,
|
||||||
THROWABLE
|
THROWABLE
|
||||||
};
|
};
|
||||||
|
|
||||||
std::string spellId; // id of spell (e.g. "fireball")
|
std::string spellId; // id of spell (e.g. "fireball")
|
||||||
|
std::string itemId;
|
||||||
|
|
||||||
float damage;
|
float damage;
|
||||||
|
|
||||||
|
|
|
@ -24,16 +24,22 @@ void PacketActorAttack::Actor(BaseActor &actor, bool send)
|
||||||
RW(actor.attack.target.mpNum, 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.pressed, send);
|
||||||
RW(actor.attack.knockdown, send);
|
|
||||||
RW(actor.attack.block, send);
|
|
||||||
|
|
||||||
RW(actor.attack.instant, send);
|
RW(actor.attack.instant, 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.applyWeaponEnchantment, send);
|
||||||
RW(actor.attack.applyProjectileEnchantment, 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.target.mpNum, send);
|
||||||
}
|
}
|
||||||
|
|
||||||
RW(player->attack.spellId, send, true);
|
|
||||||
RW(player->attack.type, send);
|
RW(player->attack.type, send);
|
||||||
RW(player->attack.success, send);
|
|
||||||
RW(player->attack.damage, send, false); // never compress damage
|
|
||||||
|
|
||||||
|
if (player->attack.type == mwmp::Attack::MELEE || player->attack.type == mwmp::Attack::MAGIC)
|
||||||
|
{
|
||||||
RW(player->attack.pressed, send);
|
RW(player->attack.pressed, send);
|
||||||
RW(player->attack.knockdown, send);
|
RW(player->attack.success, send);
|
||||||
|
|
||||||
|
if (player->attack.type == mwmp::Attack::MELEE)
|
||||||
|
{
|
||||||
|
RW(player->attack.damage, send);
|
||||||
RW(player->attack.block, send);
|
RW(player->attack.block, send);
|
||||||
|
RW(player->attack.knockdown, send);
|
||||||
|
|
||||||
RW(player->attack.applyWeaponEnchantment, send);
|
RW(player->attack.applyWeaponEnchantment, send);
|
||||||
RW(player->attack.applyProjectileEnchantment, 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