mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-05-02 00:47:45 +00:00
Added dynamic event notice function which takes a vector for its params. Supports up to 32 params. Can be omitted.
This commit is contained in:
parent
9eaa423c23
commit
6e9d47b6a3
4 changed files with 186 additions and 35 deletions
|
@ -18,7 +18,7 @@
|
|||
#include "Network/PacketWrappers/EventPlayPacket.h"
|
||||
#include "Network/PacketWrappers/EventFinishPacket.h"
|
||||
#include "Network/PacketWrappers/EventResumePacket.h"
|
||||
#include "Network/PacketWrappers/Notice2Packet.h"
|
||||
#include "Network/PacketWrappers/EventNoticePacket.h"
|
||||
|
||||
#include "Territory/InstanceObjectCache.h"
|
||||
|
||||
|
@ -843,7 +843,31 @@ Sapphire::Event::EventHandlerPtr EventMgr::bootstrapSceneEvent( Entity::Player&
|
|||
|
||||
void EventMgr::sendEventNotice( Entity::Player& player, uint32_t questId, int8_t noticeId, uint8_t numOfArgs, uint32_t var1, uint32_t var2 )
|
||||
{
|
||||
auto noticePacket = std::make_shared< Notice2Packet >( player.getId(), questId, noticeId, numOfArgs, var1, var2 );
|
||||
std::vector< uint32_t > args{ var1, var2 };
|
||||
auto noticePacket = std::make_shared< EventNotice2Packet >( player, questId, noticeId, args );
|
||||
auto& server = Common::Service< World::WorldServer >::ref();
|
||||
server.queueForPlayer( player.getCharacterId(), noticePacket );
|
||||
}
|
||||
|
||||
void EventMgr::sendEventNotice( Entity::Player& player, uint32_t questId, int8_t noticeId, std::vector< uint32_t > args )
|
||||
{
|
||||
FFXIVPacketBasePtr pPacket = nullptr;
|
||||
size_t paramCount = args.size();
|
||||
|
||||
assert( paramCount <= 32 );
|
||||
|
||||
if( paramCount < 2 )
|
||||
pPacket = std::move( std::make_shared< EventNotice2Packet >( player, questId, noticeId, args ) );
|
||||
else if( paramCount < 4 )
|
||||
pPacket = std::move( std::make_shared< EventNotice4Packet >( player, questId, noticeId, args ) );
|
||||
else if( paramCount < 8 )
|
||||
pPacket = std::move( std::make_shared< EventNotice8Packet >( player, questId, noticeId, args ) );
|
||||
else if( paramCount < 16 )
|
||||
pPacket = std::move( std::make_shared< EventNotice16Packet >( player, questId, noticeId, args ) );
|
||||
else if( paramCount < 32 )
|
||||
pPacket = std::move( std::make_shared< EventNotice32Packet >( player, questId, noticeId, args ) );
|
||||
|
||||
auto& server = Common::Service< World::WorldServer >::ref();
|
||||
server.queueForPlayer( player.getCharacterId(), pPacket );
|
||||
|
||||
}
|
||||
|
|
|
@ -73,6 +73,7 @@ namespace Sapphire::World::Manager
|
|||
bool sendEventPlay( Entity::Player& player, uint32_t eventid, uint32_t scene, uint32_t flags );
|
||||
|
||||
void sendEventNotice( Entity::Player& player, uint32_t eventId, int8_t noticeId, uint8_t numOfArgs = 0, uint32_t var1 = 0, uint32_t var2 = 0 );
|
||||
void sendEventNotice( Entity::Player& player, uint32_t questId, int8_t noticeId, std::vector< uint32_t > args = {} );
|
||||
|
||||
/*! setup the event and return a ptr to it */
|
||||
Event::EventHandlerPtr bootstrapSceneEvent( Entity::Player& player, uint32_t eventId, uint32_t flags );
|
||||
|
|
159
src/world/Network/PacketWrappers/EventNoticePacket.h
Normal file
159
src/world/Network/PacketWrappers/EventNoticePacket.h
Normal file
|
@ -0,0 +1,159 @@
|
|||
#pragma once
|
||||
|
||||
#include <Network/GamePacket.h>
|
||||
#include <Actor/Player.h>
|
||||
#include <Event/EventHandler.h>
|
||||
#include <Network/PacketDef/Zone/ServerZoneDef.h>
|
||||
#include "Forwards.h"
|
||||
|
||||
namespace Sapphire::Network::Packets::WorldPackets::Server
|
||||
{
|
||||
|
||||
/**
|
||||
* @brief The packet sent to resume an event and fill it with additional data.
|
||||
*/
|
||||
class EventNoticePacketHeader : public ZoneChannelPacket< FFXIVIpcNoticeHeader >
|
||||
{
|
||||
public:
|
||||
EventNoticePacketHeader( const Entity::Player& player, uint32_t handlerId, uint8_t noticeId, std::vector< uint32_t > args = {} ) :
|
||||
ZoneChannelPacket< FFXIVIpcNoticeHeader >( player.getId(), player.getId() )
|
||||
{
|
||||
initialize( player, handlerId, noticeId, args );
|
||||
};
|
||||
|
||||
private:
|
||||
void initialize( const Entity::Player& player, uint32_t handlerId, uint8_t noticeId, std::vector< uint32_t > args )
|
||||
{
|
||||
m_data.handlerId = handlerId;
|
||||
m_data.noticeId = noticeId;
|
||||
m_data.numOfArgs = static_cast< uint8_t >( args.size() );
|
||||
if( !args.empty() )
|
||||
{
|
||||
int i = 0;
|
||||
for( auto& val : args )
|
||||
m_data.args[ i++ ] = val;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class EventNotice2Packet : public ZoneChannelPacket< FFXIVIpcNotice2 >
|
||||
{
|
||||
public:
|
||||
EventNotice2Packet( const Entity::Player& player, uint32_t handlerId, uint8_t noticeId, std::vector< uint32_t > args = {} ) :
|
||||
ZoneChannelPacket< FFXIVIpcNotice2 >( player.getId(), player.getId() )
|
||||
{
|
||||
initialize( player, handlerId, noticeId, args );
|
||||
};
|
||||
|
||||
private:
|
||||
void initialize( const Entity::Player& player, uint32_t handlerId, uint8_t noticeId, std::vector< uint32_t > args )
|
||||
{
|
||||
m_data.handlerId = handlerId;
|
||||
m_data.noticeId = noticeId;
|
||||
m_data.numOfArgs = static_cast< uint8_t >( args.size() );
|
||||
if( !args.empty() )
|
||||
{
|
||||
int i = 0;
|
||||
for( auto& val : args )
|
||||
m_data.args[ i++ ] = val;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class EventNotice4Packet : public ZoneChannelPacket< FFXIVIpcNotice4 >
|
||||
{
|
||||
public:
|
||||
EventNotice4Packet( const Entity::Player& player, uint32_t handlerId, uint8_t noticeId, std::vector< uint32_t > args = {} ) :
|
||||
ZoneChannelPacket< FFXIVIpcNotice4 >( player.getId(), player.getId() )
|
||||
{
|
||||
initialize( player, handlerId, noticeId, args );
|
||||
};
|
||||
|
||||
private:
|
||||
void initialize( const Entity::Player& player, uint32_t handlerId, uint8_t noticeId, std::vector< uint32_t > args )
|
||||
{
|
||||
m_data.handlerId = handlerId;
|
||||
m_data.noticeId = noticeId;
|
||||
m_data.numOfArgs = static_cast< uint8_t >( args.size() );
|
||||
if( !args.empty() )
|
||||
{
|
||||
int i = 0;
|
||||
for( auto& val : args )
|
||||
m_data.args[ i++ ] = val;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class EventNotice8Packet : public ZoneChannelPacket< FFXIVIpcNotice8 >
|
||||
{
|
||||
public:
|
||||
EventNotice8Packet( const Entity::Player& player, uint32_t handlerId, uint8_t noticeId, std::vector< uint32_t > args = {} ) :
|
||||
ZoneChannelPacket< FFXIVIpcNotice8 >( player.getId(), player.getId() )
|
||||
{
|
||||
initialize( player, handlerId, noticeId, args );
|
||||
};
|
||||
|
||||
private:
|
||||
void initialize( const Entity::Player& player, uint32_t handlerId, uint8_t noticeId, std::vector< uint32_t > args )
|
||||
{
|
||||
m_data.handlerId = handlerId;
|
||||
m_data.noticeId = noticeId;
|
||||
m_data.numOfArgs = static_cast< uint8_t >( args.size() );
|
||||
if( !args.empty() )
|
||||
{
|
||||
int i = 0;
|
||||
for( auto& val : args )
|
||||
m_data.args[ i++ ] = val;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class EventNotice16Packet : public ZoneChannelPacket< FFXIVIpcNotice16 >
|
||||
{
|
||||
public:
|
||||
EventNotice16Packet( const Entity::Player& player, uint32_t handlerId, uint8_t noticeId, std::vector< uint32_t > args = {} ) :
|
||||
ZoneChannelPacket< FFXIVIpcNotice16 >( player.getId(), player.getId() )
|
||||
{
|
||||
initialize( player, handlerId, noticeId, args );
|
||||
};
|
||||
|
||||
private:
|
||||
void initialize( const Entity::Player& player, uint32_t handlerId, uint8_t noticeId, std::vector< uint32_t > args )
|
||||
{
|
||||
m_data.handlerId = handlerId;
|
||||
m_data.noticeId = noticeId;
|
||||
m_data.numOfArgs = static_cast< uint8_t >( args.size() );
|
||||
if( !args.empty() )
|
||||
{
|
||||
int i = 0;
|
||||
for( auto& val : args )
|
||||
m_data.args[ i++ ] = val;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class EventNotice32Packet : public ZoneChannelPacket< FFXIVIpcNotice32 >
|
||||
{
|
||||
public:
|
||||
EventNotice32Packet( const Entity::Player& player, uint32_t handlerId, uint8_t noticeId, std::vector< uint32_t > args = {} ) :
|
||||
ZoneChannelPacket< FFXIVIpcNotice32 >( player.getId(), player.getId() )
|
||||
{
|
||||
initialize( player, handlerId, noticeId, args );
|
||||
};
|
||||
|
||||
private:
|
||||
void initialize( const Entity::Player& player, uint32_t handlerId, uint8_t noticeId, std::vector< uint32_t > args )
|
||||
{
|
||||
m_data.handlerId = handlerId;
|
||||
m_data.noticeId = noticeId;
|
||||
m_data.numOfArgs = static_cast< uint8_t >( args.size() );
|
||||
if( !args.empty() )
|
||||
{
|
||||
int i = 0;
|
||||
for( auto& val : args )
|
||||
m_data.args[ i++ ] = val;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
}
|
|
@ -1,33 +0,0 @@
|
|||
#pragma once
|
||||
|
||||
#include <Network/GamePacket.h>
|
||||
#include "Forwards.h"
|
||||
|
||||
namespace Sapphire::Network::Packets::WorldPackets::Server
|
||||
{
|
||||
|
||||
/**
|
||||
* @brief Packet to display a quest specific info message.
|
||||
*/
|
||||
class Notice2Packet : public ZoneChannelPacket< FFXIVIpcNotice2 >
|
||||
{
|
||||
public:
|
||||
Notice2Packet( uint32_t entityId, uint32_t questId, int8_t msgId, uint8_t numOfArgs = 0, uint32_t var1 = 0, uint32_t var2 = 0 ) :
|
||||
ZoneChannelPacket< FFXIVIpcNotice2 >( entityId, entityId )
|
||||
{
|
||||
initialize( questId, msgId, numOfArgs, var1, var2 );
|
||||
};
|
||||
|
||||
private:
|
||||
void initialize( uint32_t questId, int8_t msgId, uint8_t numOfArgs, uint32_t var1, uint32_t var2 )
|
||||
{
|
||||
m_data.handlerId = questId;
|
||||
m_data.noticeId = msgId;
|
||||
// todo: not correct
|
||||
m_data.numOfArgs = numOfArgs;
|
||||
m_data.args[0] = var1;
|
||||
m_data.args[1] = var2;
|
||||
};
|
||||
};
|
||||
|
||||
}
|
Loading…
Add table
Reference in a new issue