From ccb83bec5db7c94c202c3a4ea203f72d0bcbaf0c Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 2 Jun 2019 20:45:18 +1000 Subject: [PATCH] move itemaction to own class, perchbird's effect command --- src/world/Action/Action.cpp | 19 ++++--- src/world/Action/ItemAction.cpp | 73 +++++++++++++++++++++++++++ src/world/Action/ItemAction.h | 38 ++++++++++++++ src/world/ForwardsZone.h | 1 + src/world/Manager/ActionMgr.cpp | 37 ++------------ src/world/Manager/DebugCommandMgr.cpp | 24 +++++++++ 6 files changed, 150 insertions(+), 42 deletions(-) create mode 100644 src/world/Action/ItemAction.cpp create mode 100644 src/world/Action/ItemAction.h diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index 676c5e95..c1e071f5 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -34,19 +34,18 @@ Action::Action() = default; Action::~Action() = default; Action::Action( Entity::CharaPtr caster, uint32_t actionId, FrameworkPtr fw ) : - Action( std::move( caster ), actionId, nullptr, std::move( fw ) ) + Action( std::move( caster ), actionId, nullptr, std::move( fw ) ) { } -Action::Action( Entity::CharaPtr caster, uint32_t actionId, - Data::ActionPtr actionData, FrameworkPtr fw ) : - m_pSource( std::move( caster ) ), - m_pFw( std::move( fw ) ), - m_actionData( std::move( actionData ) ), - m_id( actionId ), - m_targetId( 0 ), - m_startTime( 0 ), - m_interruptType( Common::ActionInterruptType::None ) +Action::Action( Entity::CharaPtr caster, uint32_t actionId, Data::ActionPtr actionData, FrameworkPtr fw ) : + m_pSource( std::move( caster ) ), + m_pFw( std::move( fw ) ), + m_actionData( std::move( actionData ) ), + m_id( actionId ), + m_targetId( 0 ), + m_startTime( 0 ), + m_interruptType( Common::ActionInterruptType::None ) { } diff --git a/src/world/Action/ItemAction.cpp b/src/world/Action/ItemAction.cpp new file mode 100644 index 00000000..efbef2f4 --- /dev/null +++ b/src/world/Action/ItemAction.cpp @@ -0,0 +1,73 @@ +#include "ItemAction.h" + +#include + +#include +#include + +using namespace Sapphire; +using namespace Sapphire::World::Action; + +ItemAction::ItemAction( Sapphire::Entity::CharaPtr source, uint32_t itemId, + Sapphire::Data::ItemActionPtr itemActionData, uint16_t itemSourceSlot, + uint16_t itemSourceContainer, Sapphire::FrameworkPtr fw ) : + m_itemAction( std::move( itemActionData ) ), + m_itemSourceSlot( itemSourceSlot ), + m_itemSourceContainer( itemSourceContainer ) +{ + m_id = itemId; + m_pSource = std::move( source ); + m_pFw = std::move( fw ); +} + +void ItemAction::start() +{ + if( !m_pSource->isPlayer() ) + return; + + // todo: check inv slot for item + + // todo: can we just do this? + execute(); +} + +void ItemAction::execute() +{ + switch( m_itemAction->type ) + { + default: + { + getSourceChara()->getAsPlayer()->sendDebug( "ItemAction type {0} not supported.", m_itemAction->type ); + break; + } + + case Common::ItemActionType::ItemActionVFX: + case Common::ItemActionType::ItemActionVFX2: + { + handleVFXItem(); + + break; + } + } +} + +void ItemAction::interrupt() +{ + +} + +void ItemAction::handleVFXItem() +{ + Common::EffectEntry effect{}; + effect.effectType = Common::ActionEffectType::VFX; + effect.value = m_itemAction->data[ 0 ]; + + auto effectPacket = std::make_shared< Network::Packets::Server::EffectPacket >( getSourceChara()->getId(), + getSourceChara()->getId(), getId() ); + effectPacket->setTargetActor( getSourceChara()->getId() ); + effectPacket->setAnimationId( Common::ItemActionType::ItemActionVFX ); + effectPacket->setDisplayType( Common::ActionEffectDisplayType::ShowItemName ); + effectPacket->addEffect( effect ); + + m_pSource->sendToInRangeSet( effectPacket, true ); +} \ No newline at end of file diff --git a/src/world/Action/ItemAction.h b/src/world/Action/ItemAction.h new file mode 100644 index 00000000..f0f7c24f --- /dev/null +++ b/src/world/Action/ItemAction.h @@ -0,0 +1,38 @@ +#ifndef SAPPHIRE_ITEMACTION_H +#define SAPPHIRE_ITEMACTION_H + +#include "Action.h" + +namespace Sapphire::Data +{ + struct ItemAction; + using ItemActionPtr = std::shared_ptr< ItemAction >; +} + +namespace Sapphire::World::Action +{ + class ItemAction : public Action + { + public: + ItemAction( Entity::CharaPtr source, uint32_t itemId, Data::ItemActionPtr itemActionData, + uint16_t itemSourceSlot, uint16_t itemSourceContainer, FrameworkPtr fw ); + virtual ~ItemAction() = default; + + void start() override; + + void execute() override; + + void interrupt() override; + + private: + void handleVFXItem(); + + private: + Sapphire::Data::ItemActionPtr m_itemAction; + + uint16_t m_itemSourceSlot; + uint16_t m_itemSourceContainer; + }; +} + +#endif //SAPPHIRE_ITEMACTION_H diff --git a/src/world/ForwardsZone.h b/src/world/ForwardsZone.h index 08de6d59..fb584c7b 100644 --- a/src/world/ForwardsZone.h +++ b/src/world/ForwardsZone.h @@ -86,6 +86,7 @@ namespace World::Action { TYPE_FORWARD( Action ); TYPE_FORWARD( EventAction ); +TYPE_FORWARD( ItemAction ); using ActionCallback = std::function< void( Entity::Player&, uint32_t, uint64_t ) >; } diff --git a/src/world/Manager/ActionMgr.cpp b/src/world/Manager/ActionMgr.cpp index 84e8cfb2..feced875 100644 --- a/src/world/Manager/ActionMgr.cpp +++ b/src/world/Manager/ActionMgr.cpp @@ -1,6 +1,7 @@ #include "ActionMgr.h" #include "Action/Action.h" +#include "Action/ItemAction.h" #include "Script/ScriptMgr.h" #include "Actor/Player.h" @@ -66,24 +67,11 @@ void World::Manager::ActionMgr::handleItemAction( Sapphire::Entity::Player& play { player.sendDebug( "got item act: {0}, slot: {1}, container: {2}", itemId, itemSourceSlot, itemSourceContainer ); - // todo: check we have item & remove item from inventory + auto action = Action::make_ItemAction( player.getAsChara(), itemId, itemActionData, + itemSourceSlot, itemSourceContainer, framework() ); - switch( itemActionData->type ) - { - default: - { - player.sendDebug( "ItemAction type {0} not supported.", itemActionData->type ); - break; - } - - case Common::ItemActionType::ItemActionVFX: - case Common::ItemActionType::ItemActionVFX2: - { - handleItemActionVFX( player, itemId, itemActionData->data[ 0 ] ); - - break; - } - } + // todo: item actions don't have cast times? if so we can just start it and we're good + action->start(); } void World::Manager::ActionMgr::bootstrapAction( Entity::Player& player, @@ -105,19 +93,4 @@ void World::Manager::ActionMgr::bootstrapAction( Entity::Player& player, // todo: what do in cases of swiftcast/etc? script callback? currentAction->start(); -} - -void World::Manager::ActionMgr::handleItemActionVFX( Sapphire::Entity::Player& player, uint32_t itemId, uint16_t vfxId ) -{ - Common::EffectEntry effect{}; - effect.effectType = Common::ActionEffectType::VFX; - effect.value = vfxId; - - auto effectPacket = std::make_shared< Network::Packets::Server::EffectPacket >( player.getId(), player.getId(), itemId ); - effectPacket->setTargetActor( player.getId() ); - effectPacket->setAnimationId( Common::ItemActionType::ItemActionVFX ); - effectPacket->setDisplayType( Common::ActionEffectDisplayType::ShowItemName ); - effectPacket->addEffect( effect ); - - player.sendToInRangeSet( effectPacket, true ); } \ No newline at end of file diff --git a/src/world/Manager/DebugCommandMgr.cpp b/src/world/Manager/DebugCommandMgr.cpp index 933b7d94..796e254d 100644 --- a/src/world/Manager/DebugCommandMgr.cpp +++ b/src/world/Manager/DebugCommandMgr.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include "DebugCommand/DebugCommand.h" #include "DebugCommandMgr.h" @@ -522,6 +523,29 @@ void Sapphire::World::Manager::DebugCommandMgr::add( char* data, Entity::Player& sscanf( params.c_str(), "%d", &id ); player.learnAction( id ); } + else if ( subCommand == "effect") + { + uint16_t param1; + sscanf( params.c_str(), "%hu", ¶m1 ); + + auto effectPacket = std::make_shared< Server::EffectPacket >( player.getId(), player.getTargetId(), param1 ); + effectPacket->setRotation( Common::Util::floatToUInt16Rot( player.getRot() ) ); + + Common::EffectEntry entry{}; + entry.value = param1; + entry.effectType = Common::ActionEffectType::Damage; + entry.hitSeverity = Common::ActionHitSeverityType::NormalDamage; + + effectPacket->addEffect( entry ); + + auto sequence = player.getCurrentZone()->getNextEffectSequence(); + effectPacket->setSequence( sequence ); + +// effectPacket->setAnimationId( param1 ); +// effectPacket->setEffectFlags( 0 ); + + player.queuePacket( effectPacket ); + } else { player.sendUrgent( "{0} is not a valid ADD command.", subCommand );