1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-01 16:37:45 +00:00

Implemented onSay event

This commit is contained in:
Mordred 2022-02-08 12:46:18 +01:00
parent a29cdf4dfd
commit 4ec86cdf81
8 changed files with 86 additions and 2 deletions

View file

@ -476,6 +476,13 @@ struct FFXIVIpcShopEventHandler : FFXIVIpcBasePacket< StartUIEvent >
/* 0004 */ uint32_t param;
};
struct FFXIVIpcStartSayEventHandler : FFXIVIpcBasePacket< StartSayEvent >
{
uint64_t targetId;
uint32_t handlerId;
uint32_t sayId;
};
struct FFXIVIpcClientInventoryItemOperation : FFXIVIpcBasePacket< ClientItemOperation >
{
uint32_t ContextId;

View file

@ -27,8 +27,6 @@ using namespace Sapphire::Network::Packets::WorldPackets::Server;
void WarpMgr::requestMoveTerritory( Entity::Player& player, Common::WarpType warpType,
uint32_t targetTerritoryId, Common::FFXIVARR_POSITION3 targetPos, float targetRot )
{
m_entityIdToWarpInfoMap[ player.getId() ] = { targetTerritoryId, warpType, targetPos, targetRot };
auto& teriMgr = Common::Service< TerritoryMgr >::ref();
auto& server = Common::Service< WorldServer >::ref();
@ -36,6 +34,8 @@ void WarpMgr::requestMoveTerritory( Entity::Player& player, Common::WarpType war
if( !pTeri )
return;
m_entityIdToWarpInfoMap[ player.getId() ] = { targetTerritoryId, warpType, targetPos, targetRot };
player.updatePrevTerritory();
player.sendToInRangeSet( makeActorControl( player.getId(), WarpStart, warpType, 1, pTeri->getTerritoryTypeId() ), true );

View file

@ -173,6 +173,8 @@ namespace Sapphire::Network
DECLARE_HANDLER( startUiEvent );
DECLARE_HANDLER( startEventSayHandler );
DECLARE_HANDLER( yieldEventString );
DECLARE_HANDLER( yieldEventSceneIntAndString );

View file

@ -449,6 +449,33 @@ void Sapphire::Network::GameConnection::yieldEventSceneIntAndString( const Packe
eventMgr.handleReturnIntAndStringEventScene( player, data.handlerId, data.sceneId, inString, data.integer );
}
void Sapphire::Network::GameConnection::startEventSayHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
{
auto& eventMgr = Common::Service< World::Manager::EventMgr >::ref();
auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref();
const auto packet = ZoneChannelPacket< FFXIVIpcStartSayEventHandler >( inPacket );
const auto actorId = packet.data().targetId;
const auto eventId = packet.data().handlerId;
const auto sayId = packet.data().sayId;
auto eventType = static_cast< uint16_t >( eventId >> 16 );
std::string eventName = "onSay";
std::string objName = eventMgr.getEventName( eventId );
World::Manager::PlayerMgr::sendDebug( player, "Chara: {0} -> {1} \neventId: {2} ({3:08X})",
actorId, eventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ),
eventId, eventId );
World::Manager::PlayerMgr::sendDebug( player, "Calling: {0}.{1}", objName, eventName );
eventMgr.eventStart( player, actorId, eventId, Event::EventHandler::Say, 0, 0 );
scriptMgr.onSay( player, actorId, eventId, sayId );
eventMgr.checkEvent( player, eventId );
}
void Sapphire::Network::GameConnection::startUiEvent( const Packets::FFXIVARR_PACKET_RAW& inPacket,
Entity::Player& player )
{

View file

@ -142,6 +142,10 @@ namespace Sapphire::ScriptAPI
{
}
void QuestScript::onSay( World::Quest& quest, Entity::Player& player, uint64_t actorId, uint32_t sayId )
{
}
void QuestScript::onEventItem( World::Quest& quest, Entity::Player& player, uint64_t actorId )
{
}

View file

@ -217,6 +217,8 @@ namespace Sapphire::ScriptAPI
virtual void onTalk( World::Quest& quest, Sapphire::Entity::Player& player, uint64_t actorId );
virtual void onSay( World::Quest& quest, Sapphire::Entity::Player& player, uint64_t actorId, uint32_t sayId );
virtual void onEventItem( World::Quest& quest, Sapphire::Entity::Player& player, uint64_t actorId );
virtual void onBNpcKill( World::Quest& quest, uint16_t nameId, uint32_t entityId, Sapphire::Entity::Player& player );

View file

@ -725,3 +725,43 @@ Sapphire::Scripting::ScriptMgr::onDutyComplete( QuestBattle& instance, Sapphire:
return false;
}
bool Sapphire::Scripting::ScriptMgr::onSay( Sapphire::Entity::Player& player, uint64_t actorId, uint32_t eventId, uint32_t sayId )
{
auto eventType = static_cast< uint16_t >( eventId >> 16 );
auto& exdData = Common::Service< Data::ExdData >::ref();
if( eventType == Event::EventHandler::EventHandlerType::Quest )
{
auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::QuestScript >( eventId );
if( !script )
{
auto questInfo = exdData.getRow< Excel::Quest >( eventId );
if( questInfo )
{
World::Manager::PlayerMgr::sendUrgent( player, "Quest not implemented: {0} ({1})", questInfo->getString( questInfo->data().Text.Name ), eventId );
return false;
}
}
auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref();
auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) );
auto questId = static_cast< uint16_t >( eventId );
if( player.hasQuest( eventId ) )
{
World::Quest preQ;
auto questIdx = player.getQuestIndex( questId );
auto& quest = player.getQuestByIndex( questIdx );
preQ = quest;
script->onSay( quest, player, actor, sayId );
if( quest != preQ )
player.updateQuest( quest );
}
else
{
auto newQuest = World::Quest( questId, 0, 0 );
script->onSay( newQuest, player, actor, sayId );
}
return true;
}
}

View file

@ -56,6 +56,8 @@ namespace Sapphire::Scripting
bool onTalk( Entity::Player& player, uint64_t actorId, uint32_t eventId );
bool onSay( Entity::Player& player, uint64_t actorId, uint32_t eventId, uint32_t sayId );
bool onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 );
bool onWithinRange( Entity::Player& player, uint32_t eventId, uint32_t param1, float x, float y, float z );