From b267533908a77e5642a52edadb9aa2cc759e392a Mon Sep 17 00:00:00 2001 From: amibu Date: Mon, 14 Aug 2017 17:10:19 +0200 Subject: [PATCH] More skill scripting --- bin/scripts/chai/global.inc | 7 +++ bin/scripts/chai/skill/skillDef_120.chai | 18 ++++++ bin/scripts/chai/skill/skillDef_127.chai | 18 ++++++ src/servers/Server_Common/Common.h | 7 +++ src/servers/Server_Common/ServerPacketDef.h | 2 +- src/servers/Server_Zone/ActionCast.cpp | 17 +----- src/servers/Server_Zone/Actor.cpp | 19 ++++++ src/servers/Server_Zone/Actor.h | 1 + src/servers/Server_Zone/Player.cpp | 59 +++++++++++++++++++ src/servers/Server_Zone/Player.h | 2 + src/servers/Server_Zone/ScriptManagerInit.cpp | 2 + 11 files changed, 135 insertions(+), 17 deletions(-) create mode 100644 bin/scripts/chai/skill/skillDef_120.chai create mode 100644 bin/scripts/chai/skill/skillDef_127.chai diff --git a/bin/scripts/chai/global.inc b/bin/scripts/chai/global.inc index 4ec015ea..078ad80e 100644 --- a/bin/scripts/chai/global.inc +++ b/bin/scripts/chai/global.inc @@ -224,3 +224,10 @@ GLOBAL CURRENCY_MGP = 0X0B GLOBAL CURRENCY_TOMESTONELAW = 0X0C GLOBAL CURRENCY_TOMESTONEESO = 0X0D GLOBAL CURRENCY_TOMESTONELORE = 0X0E + +//////////////////////////////////////////////////////////// +// Skill handle types +//////////////////////////////////////////////////////////// +GLOBAL STD_DAMAGE = 0X00 +GLOBAL STD_HEAL = 0X01 +GLOBAL STD_DOT = 0X02 \ No newline at end of file diff --git a/bin/scripts/chai/skill/skillDef_120.chai b/bin/scripts/chai/skill/skillDef_120.chai new file mode 100644 index 00000000..8966d095 --- /dev/null +++ b/bin/scripts/chai/skill/skillDef_120.chai @@ -0,0 +1,18 @@ +// Skill Name: Sprint +// Skill ID: 3 + +class skillDef_120Def +{ + def skillDef_120Def() + { + + } + + def onFinish( player, target ) + { + player.handleScriptSkill( STD_HEAL, 120, 1000, 0, target ); + } + +}; + +GLOBAL skillDef_120 = skillDef_120Def(); diff --git a/bin/scripts/chai/skill/skillDef_127.chai b/bin/scripts/chai/skill/skillDef_127.chai new file mode 100644 index 00000000..7317c106 --- /dev/null +++ b/bin/scripts/chai/skill/skillDef_127.chai @@ -0,0 +1,18 @@ +// Skill Name: Sprint +// Skill ID: 3 + +class skillDef_127Def +{ + def skillDef_127Def() + { + + } + + def onFinish( player, target ) + { + player.handleScriptSkill( STD_DAMAGE, 127, 1000, 0, target ); + } + +}; + +GLOBAL skillDef_127 = skillDef_127Def(); diff --git a/src/servers/Server_Common/Common.h b/src/servers/Server_Common/Common.h index 37520915..9add3d19 100644 --- a/src/servers/Server_Common/Common.h +++ b/src/servers/Server_Common/Common.h @@ -545,6 +545,13 @@ namespace Core { }; + enum HandleSkillType : uint8_t + { + StdDamage, + StdHeal, + StdDot, + }; + enum struct PlayerStateFlag : uint8_t { NoCombat, diff --git a/src/servers/Server_Common/ServerPacketDef.h b/src/servers/Server_Common/ServerPacketDef.h index fdc51b4c..76772db2 100644 --- a/src/servers/Server_Common/ServerPacketDef.h +++ b/src/servers/Server_Common/ServerPacketDef.h @@ -410,7 +410,7 @@ struct FFXIVIpcUpdateHpMpTp : FFXIVIpcBasePacket /** * Structural representation of the packet sent by the server -* to update HP / MP / TP +* for battle actions */ struct effectEntry { diff --git a/src/servers/Server_Zone/ActionCast.cpp b/src/servers/Server_Zone/ActionCast.cpp index c6ddc46e..410697cd 100644 --- a/src/servers/Server_Zone/ActionCast.cpp +++ b/src/servers/Server_Zone/ActionCast.cpp @@ -75,22 +75,7 @@ void Core::Action::ActionCast::onFinish() pPlayer->unsetStateFlag( PlayerStateFlag::Casting ); pPlayer->sendStateFlags(); - GamePacketNew< FFXIVIpcEffect > effectPacket( pPlayer->getId() ); - effectPacket.data().targetId = m_pTarget->getId(); - effectPacket.data().actionAnimationId = m_id; - effectPacket.data().unknown_2 = 0; -// effectPacket.data().unknown_3 = 1; - effectPacket.data().actionTextId = m_id; - effectPacket.data().numEffects = 1; - effectPacket.data().rotation = Math::Util::floatToUInt16Rot( pPlayer->getRotation() ); - effectPacket.data().effectTarget = m_pTarget->getId(); - effectPacket.data().effects[0].param1 = 30; - effectPacket.data().effects[0].unknown_1 = 3; - effectPacket.data().effects[0].unknown_2 = 1; - effectPacket.data().effects[0].unknown_3 = 7; - - pPlayer->sendToInRangeSet( effectPacket, true ); - m_pTarget->takeDamage( 30 ); + g_scriptMgr.onCastFinish( pPlayer, m_pTarget, m_id ); } diff --git a/src/servers/Server_Zone/Actor.cpp b/src/servers/Server_Zone/Actor.cpp index 6441abbb..9016ab41 100644 --- a/src/servers/Server_Zone/Actor.cpp +++ b/src/servers/Server_Zone/Actor.cpp @@ -337,6 +337,25 @@ void Core::Entity::Actor::takeDamage( uint32_t damage ) sendStatusUpdate( false ); } +/*! +Let an actor get healed and perform necessary steps +according to resulting hp, propagates new hp value to players +in range + +\param amount of hp to be healed +*/ +void Core::Entity::Actor::heal( uint32_t amount ) +{ + if( ( m_hp + amount ) > getMaxHp() ) + { + m_hp = getMaxHp(); + } + else + m_hp += amount; + + sendStatusUpdate( false ); +} + /*! Send an HpMpTp update to players in range ( and potentially to self ) TODO: poor naming, should be changed. Status is not HP. Also should be virtual diff --git a/src/servers/Server_Zone/Actor.h b/src/servers/Server_Zone/Actor.h index 95504553..8cab76b7 100644 --- a/src/servers/Server_Zone/Actor.h +++ b/src/servers/Server_Zone/Actor.h @@ -245,6 +245,7 @@ public: virtual uint8_t getLevel() const; virtual void sendStatusUpdate( bool toSelf = true ); virtual void takeDamage( uint32_t damage ); + virtual void heal( uint32_t amount ); virtual bool checkAction(); virtual void update( int64_t currTime ) {}; diff --git a/src/servers/Server_Zone/Player.cpp b/src/servers/Server_Zone/Player.cpp index 5ccd7e85..e7088eea 100644 --- a/src/servers/Server_Zone/Player.cpp +++ b/src/servers/Server_Zone/Player.cpp @@ -1499,3 +1499,62 @@ void Core::Entity::Player::autoAttack( ActorPtr pTarget ) pTarget->takeDamage(damage); } + +void Core::Entity::Player::handleScriptSkill( uint32_t type, uint32_t actionId, uint64_t param1, uint64_t param2, Entity::Actor& pTarget ) +{ + sendDebug( std::to_string( pTarget.getId() ) ); + sendDebug( "Handle script skill type: " + std::to_string( type ) ); + + switch( type ) + { + + case Core::Common::HandleSkillType::StdDamage: + { + sendDebug( "STD_DAMAGE" ); + GamePacketNew< FFXIVIpcEffect > effectPacket( getId() ); + effectPacket.data().targetId = pTarget.getId(); + effectPacket.data().actionAnimationId = actionId; + effectPacket.data().unknown_2 = 0; + // effectPacket.data().unknown_3 = 1; + effectPacket.data().actionTextId = actionId; + effectPacket.data().numEffects = 1; + effectPacket.data().rotation = Math::Util::floatToUInt16Rot( getRotation() ); + effectPacket.data().effectTarget = pTarget.getId(); + effectPacket.data().effects[0].param1 = param1; + effectPacket.data().effects[0].unknown_1 = 3; + effectPacket.data().effects[0].unknown_2 = 1; + effectPacket.data().effects[0].unknown_3 = 7; + + sendToInRangeSet( effectPacket, true ); + + pTarget.takeDamage( param1 ); + break; + } + + case Core::Common::HandleSkillType::StdHeal: + { + sendDebug( "STD_HEAL" ); + GamePacketNew< FFXIVIpcEffect > effectPacket( getId() ); + effectPacket.data().targetId = pTarget.getId(); + effectPacket.data().actionAnimationId = actionId; + effectPacket.data().unknown_2 = 0; + // effectPacket.data().unknown_3 = 1; + effectPacket.data().actionTextId = actionId; + effectPacket.data().numEffects = 1; + effectPacket.data().rotation = Math::Util::floatToUInt16Rot( getRotation() ); + effectPacket.data().effectTarget = pTarget.getId(); + effectPacket.data().effects[0].param1 = param1; + effectPacket.data().effects[0].unknown_1 = 4; + effectPacket.data().effects[0].unknown_2 = 1; + effectPacket.data().effects[0].unknown_3 = 7; + + sendToInRangeSet( effectPacket, true ); + + pTarget.heal( param1 ); + break; + } + + default: + break; + } +} diff --git a/src/servers/Server_Zone/Player.h b/src/servers/Server_Zone/Player.h index ae5af385..8b3ccb6b 100644 --- a/src/servers/Server_Zone/Player.h +++ b/src/servers/Server_Zone/Player.h @@ -482,6 +482,8 @@ public: void setAutoattack( bool mode ); bool isAutoattackOn() const; + void handleScriptSkill( uint32_t type, uint32_t actionId, uint64_t param1, uint64_t param2, Entity::Actor& target ); + private: uint32_t m_lastWrite; uint32_t m_lastPing; diff --git a/src/servers/Server_Zone/ScriptManagerInit.cpp b/src/servers/Server_Zone/ScriptManagerInit.cpp index f4e56ba9..66136e08 100644 --- a/src/servers/Server_Zone/ScriptManagerInit.cpp +++ b/src/servers/Server_Zone/ScriptManagerInit.cpp @@ -35,6 +35,7 @@ int Core::Scripting::ScriptManager::init() m_pChaiHandler->add( chaiscript::fun( &Entity::Actor::getTargetId ), "getTargetId" ); m_pChaiHandler->add( chaiscript::fun( &Entity::Actor::addStatusEffect ), "addStatusEffect" ); m_pChaiHandler->add( chaiscript::fun( &Entity::Actor::addStatusEffectById ), "addStatusEffectById" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Actor::takeDamage ), "takeDamage" ); m_pChaiHandler->add( chaiscript::fun( &Entity::Player::forceZoneing ), "setZone" ); m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getClassAsInt ), "getClass" ); @@ -65,6 +66,7 @@ int Core::Scripting::ScriptManager::init() m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getQuestSeq ), "questGetSeq" ); m_pChaiHandler->add( chaiscript::fun( &Entity::Player::hasQuest ), "hasQuest" ); m_pChaiHandler->add( chaiscript::fun( &Entity::Player::getZoneId ), "getZoneId" ); + m_pChaiHandler->add( chaiscript::fun( &Entity::Player::handleScriptSkill ), "handleScriptSkill" ); m_pChaiHandler->add( chaiscript::fun( &Core::Event::mapEventActorToRealActor ), "mapActor" );