1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-26 22:37:45 +00:00
sapphire/src/world/Action/ItemAction.cpp

75 lines
2 KiB
C++
Raw Normal View History

#include "ItemAction.h"
#include <Exd/ExdData.h>
#include <Exd/Structs.h>
#include <Actor/Player.h>
#include <Network/PacketWrappers/EffectPacket.h>
#include "Manager/PlayerMgr.h"
using namespace Sapphire;
using namespace Sapphire::World::Action;
using namespace Sapphire::Network::Packets::WorldPackets::Server;
ItemAction::ItemAction( Sapphire::Entity::CharaPtr source, uint32_t itemId,
std::shared_ptr< Component::Excel::ExcelStruct< Component::Excel::ItemAction > > itemActionData, uint16_t itemSourceSlot,
2020-03-01 01:00:57 +11:00
uint16_t itemSourceContainer ) :
m_itemAction( std::move( itemActionData ) ),
m_itemSourceSlot( itemSourceSlot ),
m_itemSourceContainer( itemSourceContainer )
{
m_id = itemId;
m_pSource = std::move( source );
}
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->data().Action )
{
default:
{
Manager::PlayerMgr::sendDebug( *getSourceChara()->getAsPlayer(), "ItemAction type {0} not supported.", m_itemAction->data().Action );
break;
}
case Common::ItemActionType::ItemActionVFX:
case Common::ItemActionType::ItemActionVFX2:
{
handleVFXItem();
break;
}
}
}
void ItemAction::interrupt()
{
}
void ItemAction::handleVFXItem()
{
Common::CalcResultParam effect{};
effect.Type = Common::ActionEffectType::CALC_RESULT_TYPE_CHECK_BARRIER;
effect.Value = m_itemAction->data().Calcu0Arg[ 0 ];
auto effectPacket = std::make_shared< EffectPacket >( getSourceChara()->getId(), getId() );
effectPacket->setTargetActor( getSourceChara()->getId() );
effectPacket->setAnimationId( Common::ItemActionType::ItemActionVFX );
effectPacket->setDisplayType( Common::ActionEffectDisplayType::ShowItemName );
effectPacket->addTargetEffect( effect, static_cast< uint64_t >( getSourceChara()->getId() ) );
m_pSource->sendToInRangeSet( effectPacket, true );
}