From d3bef95a7f06eb0239f2edea4e060011a04c376f Mon Sep 17 00:00:00 2001 From: dongresource Date: Sun, 20 Aug 2023 05:01:38 +0200 Subject: [PATCH] Fix /npcr Also removed a redundant invocation of NPCManager::updateNPCPosition() and simplified the surrounding code. --- src/CustomCommands.cpp | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/CustomCommands.cpp b/src/CustomCommands.cpp index 06d9d69..d9164e3 100644 --- a/src/CustomCommands.cpp +++ b/src/CustomCommands.cpp @@ -358,23 +358,19 @@ static void npcRotateCommand(std::string full, std::vector& args, C int angle = (plr->angle + 180) % 360; NPCManager::updateNPCPosition(npc->appearanceData.iNPC_ID, npc->x, npc->y, npc->z, npc->instanceID, angle); - // if it's a gruntwork NPC, rotate in-place - if (TableData::RunningMobs.find(npc->appearanceData.iNPC_ID) != TableData::RunningMobs.end()) { - NPCManager::updateNPCPosition(npc->appearanceData.iNPC_ID, npc->x, npc->y, npc->z, npc->instanceID, angle); + bool isGruntworkNpc = true; - Chat::sendServerMessage(sock, "[NPCR] Successfully set angle to " + std::to_string(angle) + " for gruntwork NPC " - + std::to_string(npc->appearanceData.iNPC_ID)); - } else { + // add a rotation entry to the gruntwork file, unless it's already a gruntwork NPC + if (TableData::RunningMobs.find(npc->appearanceData.iNPC_ID) == TableData::RunningMobs.end()) { TableData::RunningNPCRotations[npc->appearanceData.iNPC_ID] = angle; - - Chat::sendServerMessage(sock, "[NPCR] Successfully set angle to " + std::to_string(angle) + " for NPC " - + std::to_string(npc->appearanceData.iNPC_ID)); + isGruntworkNpc = false; } - // update rotation clientside - INITSTRUCT(sP_FE2CL_NPC_ENTER, pkt); - pkt.NPCAppearanceData = npc->appearanceData; - sock->sendPacket(pkt, P_FE2CL_NPC_ENTER); + Chat::sendServerMessage(sock, "[NPCR] Successfully set angle to " + std::to_string(angle) + + " for " + (isGruntworkNpc ? "gruntwork " : "") + "NPC " + std::to_string(npc->appearanceData.iNPC_ID)); + + // update rotation clientside by refreshing the player's chunks (same as the /refresh command) + PlayerManager::updatePlayerPositionForWarp(sock, plr->x, plr->y, plr->z, plr->instanceID); } static void refreshCommand(std::string full, std::vector& args, CNSocket* sock) {