From 240e06a63466f1fa153b3af145aeaaa4ac0448ff Mon Sep 17 00:00:00 2001 From: amibu Date: Wed, 18 Oct 2017 15:49:19 +0200 Subject: [PATCH] ActionMount; --- .../Network/PacketDef/Zone/ServerZoneDef.h | 3 +- src/servers/Server_Zone/Action/ActionCast.cpp | 2 +- .../Server_Zone/Action/ActionMount.cpp | 115 ++++++++++++++++++ src/servers/Server_Zone/Action/ActionMount.h | 28 +++++ src/servers/Server_Zone/Forwards.h | 1 + .../Network/Handlers/SkillHandler.cpp | 22 +--- 6 files changed, 152 insertions(+), 19 deletions(-) create mode 100644 src/servers/Server_Zone/Action/ActionMount.cpp create mode 100644 src/servers/Server_Zone/Action/ActionMount.h diff --git a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h index 66d4d54a..77ee9682 100644 --- a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h @@ -604,7 +604,8 @@ struct FFXIVIpcActorSetPos : FFXIVIpcBasePacket struct FFXIVIpcActorCast : FFXIVIpcBasePacket { uint16_t action_id; - uint16_t unknown; + Common::SkillType skillType; + uint8_t unknown; uint32_t unknown_1; // Also action id float cast_time; uint32_t target_id; diff --git a/src/servers/Server_Zone/Action/ActionCast.cpp b/src/servers/Server_Zone/Action/ActionCast.cpp index a28125c7..c27b9db2 100644 --- a/src/servers/Server_Zone/Action/ActionCast.cpp +++ b/src/servers/Server_Zone/Action/ActionCast.cpp @@ -53,7 +53,7 @@ void Core::Action::ActionCast::onStart() GamePacketNew< FFXIVIpcActorCast, ServerZoneIpcType > castPacket( m_pSource->getId() ); castPacket.data().action_id = m_id; - castPacket.data().unknown = 1; + castPacket.data().skillType = Common::SkillType::Normal; castPacket.data().unknown_1 = m_id; castPacket.data().cast_time = static_cast< float >( m_castTime / 1000 ); // This is used for the cast bar above the target bar of the caster. castPacket.data().target_id = m_pTarget->getId(); diff --git a/src/servers/Server_Zone/Action/ActionMount.cpp b/src/servers/Server_Zone/Action/ActionMount.cpp new file mode 100644 index 00000000..f42c1ae5 --- /dev/null +++ b/src/servers/Server_Zone/Action/ActionMount.cpp @@ -0,0 +1,115 @@ +#include "ActionMount.h" + +#include +#include +#include +#include +#include + +#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h" +#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h" +#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket144.h" +#include "src/servers/Server_Zone/Actor/Player.h" +#include "src/servers/Server_Zone/Script/ScriptManager.h" + +using namespace Core::Common; +using namespace Core::Network; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + +extern Core::Data::ExdData g_exdData; +extern Core::Logger g_log; +extern Core::Scripting::ScriptManager g_scriptMgr; + +Core::Action::ActionMount::ActionMount() +{ + m_handleActionType = Common::HandleActionType::Event; +} + +Core::Action::ActionMount::ActionMount( Entity::ActorPtr pActor, Entity::ActorPtr pTarget, uint32_t actionId ) +{ + m_startTime = 0; + m_id = actionId; + m_handleActionType = HandleActionType::Spell; + m_castTime = 1000; + m_pSource = pActor; + m_pTarget = pTarget; + m_bInterrupt = false; +} + +Core::Action::ActionMount::~ActionMount() +{ + +} + +void Core::Action::ActionMount::onStart() +{ + if( !m_pSource ) + return; + + m_pSource->getAsPlayer()->sendDebug( "ActionMount::onStart()" ); + m_startTime = Util::getTimeMs(); + + GamePacketNew< FFXIVIpcActorCast, ServerZoneIpcType > castPacket( m_pSource->getId() ); + + castPacket.data().action_id = m_id; + castPacket.data().skillType = Common::SkillType::MountSkill; + castPacket.data().unknown_1 = m_id; + castPacket.data().cast_time = static_cast< float >( m_castTime / 1000 ); // This is used for the cast bar above the target bar of the caster. + castPacket.data().target_id = m_pTarget->getId(); + + m_pSource->sendToInRangeSet( castPacket, true ); + m_pSource->getAsPlayer()->setStateFlag( PlayerStateFlag::Casting ); + m_pSource->getAsPlayer()->sendStateFlags(); + +} + +void Core::Action::ActionMount::onFinish() +{ + if( !m_pSource ) + return; + + auto pPlayer = m_pSource->getAsPlayer(); + pPlayer->sendDebug( "ActionMount::onFinish()" ); + + pPlayer->unsetStateFlag( PlayerStateFlag::Casting ); + pPlayer->sendStateFlags(); + + GamePacketNew< FFXIVIpcEffect, ServerZoneIpcType > effectPacket(pPlayer->getId()); + effectPacket.data().targetId = pPlayer->getId(); + effectPacket.data().actionAnimationId = m_id; + effectPacket.data().unknown_62 = 13; // Affects displaying action name next to number in floating text + effectPacket.data().actionTextId = 4; + effectPacket.data().numEffects = 1; + effectPacket.data().rotation = Math::Util::floatToUInt16Rot(pPlayer->getRotation()); + effectPacket.data().effectTarget = INVALID_GAME_OBJECT_ID; + effectPacket.data().effects[0].effectType = ActionEffectType::Mount; + effectPacket.data().effects[0].hitSeverity = ActionHitSeverityType::CritDamage; + effectPacket.data().effects[0].value = m_id; + + pPlayer->sendToInRangeSet(effectPacket, true); + + pPlayer->sendToInRangeSet(ActorControlPacket142(pPlayer->getId(), ActorControlType::SetStatus, 4), true); //? + pPlayer->sendToInRangeSet(ActorControlPacket143(pPlayer->getId(), 0x39e, 12), true); //? + + pPlayer->mount( m_id ); +} + +void Core::Action::ActionMount::onInterrupt() +{ + if( !m_pSource ) + return; + + m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Occupied1 ); + m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Casting ); + m_pSource->getAsPlayer()->sendStateFlags(); + + auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, + 0x219, 1, m_id, 0 ); + + // Note: When cast interrupt from taking too much damage, set the last value to 1. This enables the cast interrupt effect. Example: + // auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, 0x219, 1, m_id, 0 ); + + m_pSource->sendToInRangeSet( control, true ); + +} diff --git a/src/servers/Server_Zone/Action/ActionMount.h b/src/servers/Server_Zone/Action/ActionMount.h new file mode 100644 index 00000000..fe12bdd9 --- /dev/null +++ b/src/servers/Server_Zone/Action/ActionMount.h @@ -0,0 +1,28 @@ +#ifndef _ACTIONMOUNT_H_ +#define _ACTIONMOUNT_H_ + +#include "src/servers/Server_Zone/Forwards.h" +#include "Action.h" + +namespace Core { namespace Action { + + class ActionMount : public Action + { + private: + + public: + ActionMount(); + ~ActionMount(); + + ActionMount( Entity::ActorPtr pActor, Entity::ActorPtr pTarget, uint32_t actionId ); + + void onStart() override; + void onFinish() override; + void onInterrupt() override; + + }; + +} +} + +#endif \ No newline at end of file diff --git a/src/servers/Server_Zone/Forwards.h b/src/servers/Server_Zone/Forwards.h index c0f48782..2eaaa75e 100644 --- a/src/servers/Server_Zone/Forwards.h +++ b/src/servers/Server_Zone/Forwards.h @@ -44,6 +44,7 @@ namespace Core TYPE_FORWARD( Action ); TYPE_FORWARD( ActionTeleport ); TYPE_FORWARD( ActionCast ); + TYPE_FORWARD( ActionMount ); TYPE_FORWARD( EventAction ); } diff --git a/src/servers/Server_Zone/Network/Handlers/SkillHandler.cpp b/src/servers/Server_Zone/Network/Handlers/SkillHandler.cpp index e9405b02..e7a003ef 100644 --- a/src/servers/Server_Zone/Network/Handlers/SkillHandler.cpp +++ b/src/servers/Server_Zone/Network/Handlers/SkillHandler.cpp @@ -25,8 +25,8 @@ #include "src/servers/Server_Zone/Forwards.h" #include "src/servers/Server_Zone/Action/Action.h" -#include "src/servers/Server_Zone/Action/ActionTeleport.h" #include "src/servers/Server_Zone/Action/ActionCast.h" +#include "src/servers/Server_Zone/Action/ActionMount.h" #include "src/servers/Server_Zone/Script/ScriptManager.h" #include "Server_Zone/Network/PacketWrappers/MoveActorPacket.h" @@ -118,22 +118,10 @@ void Core::Network::GameConnection::skillHandler( const Packets::GamePacket& inP pPlayer->sendDebug( "Request mount " + std::to_string( action ) ); - GamePacketNew< FFXIVIpcEffect, ServerZoneIpcType > effectPacket(pPlayer->getId()); - effectPacket.data().targetId = pPlayer->getId(); - effectPacket.data().actionAnimationId = action; - effectPacket.data().unknown_62 = 13; // Affects displaying action name next to number in floating text - effectPacket.data().actionTextId = 4; - effectPacket.data().numEffects = 1; - effectPacket.data().rotation = Math::Util::floatToUInt16Rot(pPlayer->getRotation()); - effectPacket.data().effectTarget = INVALID_GAME_OBJECT_ID; - effectPacket.data().effects[0].effectType = ActionEffectType::Mount; - effectPacket.data().effects[0].hitSeverity = ActionHitSeverityType::CritDamage; - effectPacket.data().effects[0].value = action; - - pPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), ActorControlType::SetStatus, 4 ), true ); //? - pPlayer->sendToInRangeSet( ActorControlPacket143( pPlayer->getId(), 0x39e, 12 ), true ); //? - pPlayer->mount( action ); - pPlayer->sendToInRangeSet( effectPacket, true ); + Action::ActionMountPtr pActionMount(new Action::ActionMount(pPlayer, pPlayer, action)); + pPlayer->setCurrentAction(pActionMount); + pPlayer->sendDebug("setCurrentAction()"); + pPlayer->getCurrentAction()->onStart(); break;