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:
parent
a29cdf4dfd
commit
4ec86cdf81
8 changed files with 86 additions and 2 deletions
|
@ -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;
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -173,6 +173,8 @@ namespace Sapphire::Network
|
|||
|
||||
DECLARE_HANDLER( startUiEvent );
|
||||
|
||||
DECLARE_HANDLER( startEventSayHandler );
|
||||
|
||||
DECLARE_HANDLER( yieldEventString );
|
||||
DECLARE_HANDLER( yieldEventSceneIntAndString );
|
||||
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
|
|
Loading…
Add table
Reference in a new issue