mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-27 14:57:44 +00:00
move itemaction to own class, perchbird's effect command
This commit is contained in:
parent
86517c53ea
commit
ccb83bec5d
6 changed files with 150 additions and 42 deletions
|
@ -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 )
|
||||
{
|
||||
}
|
||||
|
||||
|
|
73
src/world/Action/ItemAction.cpp
Normal file
73
src/world/Action/ItemAction.cpp
Normal file
|
@ -0,0 +1,73 @@
|
|||
#include "ItemAction.h"
|
||||
|
||||
#include <Exd/ExdDataGenerated.h>
|
||||
|
||||
#include <Actor/Player.h>
|
||||
#include <Network/PacketWrappers/EffectPacket.h>
|
||||
|
||||
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 );
|
||||
}
|
38
src/world/Action/ItemAction.h
Normal file
38
src/world/Action/ItemAction.h
Normal file
|
@ -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
|
|
@ -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 ) >;
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
}
|
|
@ -10,6 +10,7 @@
|
|||
#include <Exd/ExdDataGenerated.h>
|
||||
#include <Database/DatabaseDef.h>
|
||||
#include <cmath>
|
||||
#include <Network/PacketWrappers/EffectPacket.h>
|
||||
|
||||
#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 );
|
||||
|
|
Loading…
Add table
Reference in a new issue