From 6002dbccf2abca1b8bc97d3d7250707b7e841b0b Mon Sep 17 00:00:00 2001 From: Rey Date: Fri, 11 Feb 2022 20:42:25 -0600 Subject: [PATCH] A mess, but can play the cutscenes for the wedding. Modified the Ipcs.h to remove the zonehandler that isn't clearly a zonehandler and causes crashes during events. --- src/common/Network/PacketDef/Ipcs.h | 2 +- .../instances/wedding/SanctumOfTheTwelve.cpp | 120 +++++++++++++++++- src/world/Manager/DebugCommandMgr.cpp | 58 +++++++-- 3 files changed, 163 insertions(+), 17 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index ae7e1606..615eb30e 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -373,7 +373,7 @@ namespace Sapphire::Network::Packets ReqCountdownInitiate = 0x02EC, // updated 5.58 hotfix ReqCountdownCancel = 0x0068, // updated 5.58 hotfix - ZoneLineHandler = 0x008D, // updated 5.58 hotfix + ZoneLineHandler = 0x00C3, // updated 5.58 hotfix ClientTrigger = 0x02F1, // updated 6.08 DiscoveryHandler = 0x038B, // updated 5.58 hotfix diff --git a/src/scripts/instances/wedding/SanctumOfTheTwelve.cpp b/src/scripts/instances/wedding/SanctumOfTheTwelve.cpp index cc13ad4d..3beedffe 100644 --- a/src/scripts/instances/wedding/SanctumOfTheTwelve.cpp +++ b/src/scripts/instances/wedding/SanctumOfTheTwelve.cpp @@ -697,12 +697,126 @@ public: void onDebug( Entity::Player& player, uint32_t param ) override { auto instance = player.getCurrentPublicContent(); + + auto p1 = instance->getPlayer(instance->getCustomVar(1)); + auto p2 = instance->getPlayer(instance->getCustomVar(2)); + if (!p1 || !p2) + { + instance->setSequence(1); + instance->foreachPlayer([](auto p) + { + p->sendUrgent("Failed to start the scene, missing main actors."); + }); + return; + } + FFXIVCeremonySetActorAppearance packetData = {}; + auto qBL = instance->getCustomVar(101); + packetData.questBL = qBL; + packetData.u1 = 1; + if (!(p1->getEquipDisplayFlags() & Sapphire::Common::EquipDisplayFlags::HideWeapon)) + { + packetData.actors[0].mainWeaponModel = p1->getModelMainWeapon(); + packetData.actors[0].secWeaponModel = p1->getModelSubWeapon(); + } + packetData.actors[0].charId = p1->getId(); + packetData.actors[0].guardianDeity = p1->getGuardianDeity(); + packetData.actors[0].models[Common::GearModelSlot::ModelHead] = p1->getModelForSlot(Common::GearModelSlot::ModelHead); + if ((p1->getModelForSlot(Common::GearModelSlot::ModelHead) & 0xFF) == 208) + { + instance->foreachPlayer([](auto p) + { + p->sendUrgent("Replacing p1 viel Model"); + }); + uint32_t gear = p1->getModelForSlot(Common::GearModelSlot::ModelHead) & 0xFFFFFF00; + packetData.actors[0].models[Common::GearModelSlot::ModelHead] = gear | 0xC7; + } + packetData.actors[0].models[Common::GearModelSlot::ModelBody] = p1->getModelForSlot(Common::GearModelSlot::ModelBody); + packetData.actors[0].models[Common::GearModelSlot::ModelHands] = p1->getModelForSlot(Common::GearModelSlot::ModelHands); + packetData.actors[0].models[Common::GearModelSlot::ModelLegs] = p1->getModelForSlot(Common::GearModelSlot::ModelLegs); + packetData.actors[0].models[Common::GearModelSlot::ModelFeet] = p1->getModelForSlot(Common::GearModelSlot::ModelFeet); + packetData.actors[0].models[Common::GearModelSlot::ModelNeck] = p1->getModelForSlot(Common::GearModelSlot::ModelNeck); + packetData.actors[0].models[Common::GearModelSlot::ModelEar] = p1->getModelForSlot(Common::GearModelSlot::ModelEar); + packetData.actors[0].models[Common::GearModelSlot::ModelRing1] = p1->getModelForSlot(Common::GearModelSlot::ModelRing1); + packetData.actors[0].models[Common::GearModelSlot::ModelRing2] = p1->getModelForSlot(Common::GearModelSlot::ModelRing2); + packetData.actors[0].models[Common::GearModelSlot::ModelWrist] = p1->getModelForSlot(Common::GearModelSlot::ModelWrist); + memcpy(packetData.actors[0].look, p1->getLookArray(), sizeof(packetData.actors[0].look)); + if (!(p2->getEquipDisplayFlags() & Sapphire::Common::EquipDisplayFlags::HideWeapon)) + { + packetData.actors[1].mainWeaponModel = p2->getModelMainWeapon(); + packetData.actors[1].secWeaponModel = p2->getModelSubWeapon(); + } + packetData.actors[1].charId = p2->getId(); + packetData.actors[1].guardianDeity = p2->getGuardianDeity(); + packetData.actors[1].models[Common::GearModelSlot::ModelHead] = p2->getModelForSlot(Common::GearModelSlot::ModelHead); + if ((p2->getModelForSlot(Common::GearModelSlot::ModelHead) & 0xFF) == 208) + { + instance->foreachPlayer([](auto p) + { + p->sendUrgent("Replacing p2 veil Model"); + }); + uint32_t gear = p2->getModelForSlot(Common::GearModelSlot::ModelHead) & 0xFFFFFF00; + packetData.actors[1].models[Common::GearModelSlot::ModelHead] = gear | 0xC7; + } + packetData.actors[1].models[Common::GearModelSlot::ModelBody] = p2->getModelForSlot(Common::GearModelSlot::ModelBody); + packetData.actors[1].models[Common::GearModelSlot::ModelHands] = p2->getModelForSlot(Common::GearModelSlot::ModelHands); + packetData.actors[1].models[Common::GearModelSlot::ModelLegs] = p2->getModelForSlot(Common::GearModelSlot::ModelLegs); + packetData.actors[1].models[Common::GearModelSlot::ModelFeet] = p2->getModelForSlot(Common::GearModelSlot::ModelFeet); + packetData.actors[1].models[Common::GearModelSlot::ModelNeck] = p2->getModelForSlot(Common::GearModelSlot::ModelNeck); + packetData.actors[1].models[Common::GearModelSlot::ModelEar] = p2->getModelForSlot(Common::GearModelSlot::ModelEar); + packetData.actors[1].models[Common::GearModelSlot::ModelRing1] = p2->getModelForSlot(Common::GearModelSlot::ModelRing1); + packetData.actors[1].models[Common::GearModelSlot::ModelRing2] = p2->getModelForSlot(Common::GearModelSlot::ModelRing2); + packetData.actors[1].models[Common::GearModelSlot::ModelWrist] = p2->getModelForSlot(Common::GearModelSlot::ModelWrist); + memcpy(packetData.actors[1].look, p2->getLookArray(), sizeof(packetData.actors[1].look)); + + instance->foreachPlayer([&instance, &packetData, qBL, param](auto p) + { + auto packet = makeZonePacket< FFXIVCeremonySetActorAppearance >(p->getId()); + memcpy(&packet->data(), &packetData, sizeof(packetData)); + p->queuePacket(packet); + p->eventStart(p->getId(), instance->getDirectorId(), Event::EventHandler::GameProgress, 1, 1); + std::vector< uint32_t > paramList; + paramList.push_back(param); + + auto seq3Callback = [&](Entity::Player& player, const Event::SceneResult& result) + { + //keep everyone in their room for now + /* + if( player.getId() == instance.getCustomVar( 1 ) ) + { + player.setPosAndNotifyClient( 1.454, 3.12581, -132.7992, -3.14 ); + } + else if( player.getId() == instance.getCustomVar( 2 ) ) + { + player.setPosAndNotifyClient( -1.454, 3.12581, -132.7992, -3.14 ); + } + else + { + player.setPosAndNotifyClient( 0, 2.64, -119, -3.14 ); + } + */ + auto v5 = instance->getCustomVar(5); + v5--; + instance->setCustomVar(5, v5); + if (v5 == 0) + { + instance->setCustomVar(3, 0); + instance->setCustomVar(4, 1); + } + }; + + p->playScene16(instance->getDirectorId(), 3, 139469827, 0, paramList, seq3Callback); + }); + instance->setCustomVar(3, 0); + instance->setCustomVar(4, 0); + instance->setCustomVar(5, instance->getPopCount()); + instance->setSequence(4); + if( !instance || instance->getDirectorId() != getId() ) return; - player.sendUrgent( "SanctumOfTheTwelve: debug {}", param ); + player.sendUrgent( "SanctumOfTheTwelve: onDebug() Playing cutscene: {}", param ); - player.eventStart( player.getId(), instance->getDirectorId(), Event::EventHandler::EnterTerritory, 1, player.getZoneId() ); - player.directorPlayScene( instance->getDirectorId(), 3, FADE_OUT | CONDITION_CUTSCENE | HIDE_UI, 0, 1, param ); + //player.eventStart( player.getId(), instance->getDirectorId(), Event::EventHandler::EnterTerritory, 1, player.getZoneId() ); + //player.directorPlayScene( instance->getDirectorId(), 3, FADE_OUT | CONDITION_CUTSCENE | HIDE_UI, 0, 1, param ); } }; diff --git a/src/world/Manager/DebugCommandMgr.cpp b/src/world/Manager/DebugCommandMgr.cpp index 3ae61122..ad3bff4c 100644 --- a/src/world/Manager/DebugCommandMgr.cpp +++ b/src/world/Manager/DebugCommandMgr.cpp @@ -547,31 +547,63 @@ void Sapphire::World::Manager::DebugCommandMgr::add( char* data, Entity::Player& } else if( subCommand == "bnpc" ) { - auto bNpcTemplate = serverMgr.getBNpcTemplate( params ); + auto bNpcTemplate = serverMgr.getBNpcTemplate(params); - if( !bNpcTemplate ) + if (!bNpcTemplate) { - player.sendNotice( "Template {0} not found in cache!", params ); + player.sendNotice("Template {0} not found in cache!", params); return; } auto playerZone = player.getCurrentTerritory(); - auto pBNpc = std::make_shared< Entity::BNpc >( playerZone->getNextActorId(), - bNpcTemplate, - player.getPos().x, - player.getPos().y, - player.getPos().z, - player.getRot(), - 1, 1000, playerZone ); + auto pBNpc = std::make_shared< Entity::BNpc >(playerZone->getNextActorId(), + bNpcTemplate, + player.getPos().x, + player.getPos().y, + player.getPos().z, + player.getRot(), + 1, 1000, playerZone); //pBNpc->setCurrentZone( playerZone ); //pBNpc->setPos( player.getPos().x, player.getPos().y, player.getPos().z ); - playerZone->pushActor( pBNpc ); - - + playerZone->pushActor(pBNpc); } + + else if (subCommand == "fakeplayer") + { + auto bNpcTemplate = serverMgr.getBNpcTemplate(params); + + if (!bNpcTemplate) + { + player.sendNotice("Template {0} not found in cache!", params); + return; + } + auto playerZone = player.getCurrentTerritory(); + auto pBNpc = std::make_shared< Entity::BNpc >(playerZone->getNextActorId(), + bNpcTemplate, + player.getPos().x, + player.getPos().y, + player.getPos().z, + player.getRot(), + 1, 1000, playerZone); + + + + //pBNpc->setCurrentZone( playerZone ); + //pBNpc->setPos( player.getPos().x, player.getPos().y, player.getPos().z ); + + playerZone->pushActor(pBNpc); + } + + else if (subCommand == "refreshplayer") + { + Sapphire::Entity::ActorPtr targetActor; + targetActor = player.getAsPlayer(); + targetActor->spawn(player.getAsPlayer()); + } + else if( subCommand == "op" ) { // temporary research packet