From 32bfdefbc0cc1dd316d29ea51438cddc2f364862 Mon Sep 17 00:00:00 2001 From: JeidoUran Date: Sun, 6 Jan 2019 01:47:07 +0100 Subject: [PATCH] GM Jumping no longer crashes the server if used across instances, and works like GM Call --- src/world/Network/Handlers/GMCommandHandlers.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/world/Network/Handlers/GMCommandHandlers.cpp b/src/world/Network/Handlers/GMCommandHandlers.cpp index 3e135eb5..4e6e7f8e 100644 --- a/src/world/Network/Handlers/GMCommandHandlers.cpp +++ b/src/world/Network/Handlers/GMCommandHandlers.cpp @@ -624,12 +624,26 @@ void Sapphire::Network::GameConnection::gm2Handler( FrameworkPtr pFw, } case GmCommand::Jump: { + player.prepareZoning( targetPlayer->getZoneId(), true, 1, 0 ); + if( player.getCurrentInstance() ) + { + player.exitInstance(); + } + if( targetPlayer->getCurrentInstance() && player.getCurrentInstance() != targetPlayer->getCurrentInstance() ) + { + auto instance = targetPlayer->getCurrentInstance(); + auto pInstanceContent = instance->getAsInstanceContent(); + // Not sure if GMs actually get bound to an instance they jump to on retail. It's mostly here to avoid a crash for now. + pInstanceContent->bindPlayer( player.getId() ); + player.setInstance( targetPlayer->getCurrentInstance() ); + } if( targetPlayer->getZoneId() != player.getZoneId() ) { player.setZone( targetPlayer->getZoneId() ); } player.changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z, targetActor->getRot() ); + player.sendZoneInPackets( 0x00, 0x00, 0, 0, false ); player.sendNotice( "Jumping to " + targetPlayer->getName() ); break; } @@ -650,8 +664,8 @@ void Sapphire::Network::GameConnection::gm2Handler( FrameworkPtr pFw, { targetPlayer->setZone( player.getZoneId() ); } - targetPlayer->sendToInRangeSet( makeActorControl143( player.getId(), ZoneIn, 0, 0, 0, 0 ) ); targetPlayer->changePosition( player.getPos().x, player.getPos().y, player.getPos().z, player.getRot() ); + targetPlayer->sendZoneInPackets( 0x00, 0x00, 0, 0, false ); player.sendNotice( "Calling " + targetPlayer->getName() ); break; }