From 6ea47ddb56f89a7f87393bed08003787968f08b1 Mon Sep 17 00:00:00 2001 From: dongresource Date: Sun, 27 Sep 2020 19:58:37 +0200 Subject: [PATCH] Fixes. * Mobs should account for height when aggroing on nearby players * We don't need to keep track of lastHealTime for each player separately * Warp attendants no longer steal the players weapon and money --- src/MobManager.cpp | 17 +++++++++++------ src/NPCManager.cpp | 2 ++ src/Player.hpp | 1 - 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/MobManager.cpp b/src/MobManager.cpp index 67fb38a..7e61146 100644 --- a/src/MobManager.cpp +++ b/src/MobManager.cpp @@ -329,7 +329,10 @@ void MobManager::roamingStep(Mob *mob, time_t currTime) { for (Chunk *chunk : mob->currentChunks) { for (CNSocket *s : chunk->players) { Player *plr = s->plr; - int distance = hypot(mob->appearanceData.iX - plr->x, mob->appearanceData.iY - plr->y); + + // height is relevant for aggro distance because of platforming + int xyDistance = hypot(mob->appearanceData.iX - plr->x, mob->appearanceData.iY - plr->y); + int distance = hypot(xyDistance, mob->appearanceData.iZ - plr->z); if (distance > mob->data["m_iSightRange"]) continue; @@ -509,6 +512,8 @@ void MobManager::dealGooDamage(CNSocket *sock, int amount) { } void MobManager::playerTick(CNServer *serv, time_t currTime) { + static time_t lastHealTime = 0; + for (auto& pair : PlayerManager::players) { CNSocket *sock = pair.first; Player *plr = pair.second.plr; @@ -519,10 +524,8 @@ void MobManager::playerTick(CNServer *serv, time_t currTime) { dealGooDamage(sock, 150); // a somewhat hacky way tick goo damage faster than heal, but eh - if (currTime - plr->lastHealTime < 4000) + if (currTime - lastHealTime < 4000) continue; - - plr->lastHealTime = currTime; // heal if (!plr->inCombat && plr->HP < PC_MAXHEALTH(plr->level)) { @@ -554,8 +557,6 @@ void MobManager::playerTick(CNServer *serv, time_t currTime) { if (transmit) { INITSTRUCT(sP_FE2CL_REP_PC_TICK, pkt); - std::cout << "sending sP_FE2CL_REP_PC_TICK" << std::endl; - pkt.iHP = plr->HP; pkt.iBatteryN = plr->batteryN; @@ -566,4 +567,8 @@ void MobManager::playerTick(CNServer *serv, time_t currTime) { sock->sendPacket((void*)&pkt, P_FE2CL_REP_PC_TICK, sizeof(sP_FE2CL_REP_PC_TICK)); } } + + // if this was a heal tick, update the counter outside of the loop + if (currTime - lastHealTime < 4000) + lastHealTime = currTime; } diff --git a/src/NPCManager.cpp b/src/NPCManager.cpp index 409817f..7a64517 100644 --- a/src/NPCManager.cpp +++ b/src/NPCManager.cpp @@ -560,6 +560,8 @@ void NPCManager::handleWarp(CNSocket* sock, int32_t warpId) { resp.iX = Warps[warpId].x; resp.iY = Warps[warpId].y; resp.iZ = Warps[warpId].z; + resp.iCandy = plrv.plr->money; + resp.eIL = 4; // do not take away any items // force player & NPC reload PlayerManager::removePlayerFromChunks(plrv.currentChunks, sock); diff --git a/src/Player.hpp b/src/Player.hpp index 3246b6c..57c24f0 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -46,7 +46,6 @@ struct Player { bool inCombat; bool dotDamage; - time_t lastHealTime; int64_t aQuestFlag[16]; int tasks[ACTIVE_MISSION_COUNT];