Removed the Player pointer from CNSocket

It was a leak in the abstraction that we weren't even using that much.
This is technically a de-optimization, but it's okay since it's not a
hot code path.
This commit is contained in:
dongresource 2020-12-01 19:58:34 +01:00
parent 7c5d7a70cc
commit c43a3d64fb
4 changed files with 25 additions and 25 deletions

View File

@ -135,8 +135,6 @@ enum ACTIVEKEY {
SOCKETKEY_FE SOCKETKEY_FE
}; };
struct Player;
class CNSocket; class CNSocket;
typedef void (*PacketHandler)(CNSocket* sock, CNPacketData* data); typedef void (*PacketHandler)(CNSocket* sock, CNPacketData* data);
@ -158,7 +156,6 @@ private:
public: public:
SOCKET sock; SOCKET sock;
PacketHandler pHandler; PacketHandler pHandler;
Player *plr = nullptr;
CNSocket(SOCKET s, PacketHandler ph); CNSocket(SOCKET s, PacketHandler ph);

View File

@ -591,8 +591,8 @@ void MobManager::combatStep(Mob *mob, time_t currTime) {
if (mob->appearanceData.iConditionBitFlag & CSB_BIT_DN_MOVE_SPEED) if (mob->appearanceData.iConditionBitFlag & CSB_BIT_DN_MOVE_SPEED)
speed /= 2; speed /= 2;
int targetX = mob->target->plr->x; int targetX = plr->x;
int targetY = mob->target->plr->y; int targetY = plr->y;
if (mob->groupLeader != 0) { if (mob->groupLeader != 0) {
targetX += mob->offsetX*distance/(mob->idleRange + 1); targetX += mob->offsetX*distance/(mob->idleRange + 1);
targetY += mob->offsetY*distance/(mob->idleRange + 1); targetY += mob->offsetY*distance/(mob->idleRange + 1);
@ -608,7 +608,7 @@ void MobManager::combatStep(Mob *mob, time_t currTime) {
pkt.iSpeed = speed; pkt.iSpeed = speed;
pkt.iToX = mob->appearanceData.iX = targ.first; pkt.iToX = mob->appearanceData.iX = targ.first;
pkt.iToY = mob->appearanceData.iY = targ.second; pkt.iToY = mob->appearanceData.iY = targ.second;
pkt.iToZ = mob->target->plr->z; pkt.iToZ = plr->z;
pkt.iMoveStyle = 1; pkt.iMoveStyle = 1;
// notify all nearby players // notify all nearby players
@ -1192,7 +1192,7 @@ bool MobManager::aggroCheck(Mob *mob, time_t currTime) {
for (auto it = mob->viewableChunks->begin(); it != mob->viewableChunks->end(); it++) { for (auto it = mob->viewableChunks->begin(); it != mob->viewableChunks->end(); it++) {
Chunk* chunk = *it; Chunk* chunk = *it;
for (CNSocket *s : chunk->players) { for (CNSocket *s : chunk->players) {
Player *plr = s->plr; Player *plr = PlayerManager::getPlayer(s);
if (plr->HP <= 0) if (plr->HP <= 0)
continue; continue;
@ -1463,9 +1463,11 @@ void MobManager::followToCombat(Mob *mob) {
} }
void MobManager::useAbilities(Mob *mob, time_t currTime) { void MobManager::useAbilities(Mob *mob, time_t currTime) {
Player *plr = PlayerManager::getPlayer(mob->target);
if (mob->skillStyle >= 0) { // corruption hit if (mob->skillStyle >= 0) { // corruption hit
int skillID = (int)mob->data["m_iCorruptionType"]; int skillID = (int)mob->data["m_iCorruptionType"];
std::vector<int> targetData = {1, mob->target->plr->iID, 0, 0, 0}; std::vector<int> targetData = {1, plr->iID, 0, 0, 0};
int temp = mob->skillStyle; int temp = mob->skillStyle;
mob->skillStyle = -3; // corruption cooldown mob->skillStyle = -3; // corruption cooldown
mob->nextAttack = currTime + 1000; mob->nextAttack = currTime + 1000;
@ -1481,7 +1483,7 @@ void MobManager::useAbilities(Mob *mob, time_t currTime) {
for (auto it = mob->viewableChunks->begin(); it != mob->viewableChunks->end(); it++) { for (auto it = mob->viewableChunks->begin(); it != mob->viewableChunks->end(); it++) {
Chunk* chunk = *it; Chunk* chunk = *it;
for (CNSocket *s : chunk->players) { for (CNSocket *s : chunk->players) {
Player *plr = s->plr; Player *plr = PlayerManager::getPlayer(s);
if (plr->HP <= 0) if (plr->HP <= 0)
continue; continue;
@ -1516,7 +1518,7 @@ void MobManager::useAbilities(Mob *mob, time_t currTime) {
if (random < prob1) { // active skill hit if (random < prob1) { // active skill hit
int skillID = (int)mob->data["m_iActiveSkill1"]; int skillID = (int)mob->data["m_iActiveSkill1"];
std::vector<int> targetData = {1, mob->target->plr->iID, 0, 0, 0}; std::vector<int> targetData = {1, plr->iID, 0, 0, 0};
for (auto& pwr : MobPowers) for (auto& pwr : MobPowers)
if (pwr.skillType == NanoManager::SkillTable[skillID].skillType) if (pwr.skillType == NanoManager::SkillTable[skillID].skillType)
pwr.handle(mob, targetData, skillID, NanoManager::SkillTable[skillID].durationTime[0], NanoManager::SkillTable[skillID].powerIntensity[0]); pwr.handle(mob, targetData, skillID, NanoManager::SkillTable[skillID].durationTime[0], NanoManager::SkillTable[skillID].powerIntensity[0]);
@ -1529,10 +1531,10 @@ void MobManager::useAbilities(Mob *mob, time_t currTime) {
INITSTRUCT(sP_FE2CL_NPC_SKILL_CORRUPTION_READY, pkt); INITSTRUCT(sP_FE2CL_NPC_SKILL_CORRUPTION_READY, pkt);
pkt.iNPC_ID = mob->appearanceData.iNPC_ID; pkt.iNPC_ID = mob->appearanceData.iNPC_ID;
pkt.iSkillID = skillID; pkt.iSkillID = skillID;
pkt.iValue1 = mob->target->plr->x; pkt.iValue1 = plr->x;
pkt.iValue2 = mob->target->plr->y; pkt.iValue2 = plr->y;
pkt.iValue3 = mob->target->plr->z; pkt.iValue3 = plr->z;
mob->skillStyle = NanoManager::nanoStyle(mob->target->plr->activeNano) - 1; mob->skillStyle = NanoManager::nanoStyle(plr->activeNano) - 1;
if (mob->skillStyle == -1) if (mob->skillStyle == -1)
mob->skillStyle = 2; mob->skillStyle = 2;
if (mob->skillStyle == -2) if (mob->skillStyle == -2)
@ -1548,9 +1550,9 @@ void MobManager::useAbilities(Mob *mob, time_t currTime) {
INITSTRUCT(sP_FE2CL_NPC_SKILL_READY, pkt); INITSTRUCT(sP_FE2CL_NPC_SKILL_READY, pkt);
pkt.iNPC_ID = mob->appearanceData.iNPC_ID; pkt.iNPC_ID = mob->appearanceData.iNPC_ID;
pkt.iSkillID = skillID; pkt.iSkillID = skillID;
pkt.iValue1 = mob->hitX = mob->target->plr->x; pkt.iValue1 = mob->hitX = plr->x;
pkt.iValue2 = mob->hitY = mob->target->plr->y; pkt.iValue2 = mob->hitY = plr->y;
pkt.iValue3 = mob->hitZ = mob->target->plr->z; pkt.iValue3 = mob->hitZ = plr->z;
NPCManager::sendToViewable(mob, &pkt, P_FE2CL_NPC_SKILL_READY, sizeof(sP_FE2CL_NPC_SKILL_READY)); NPCManager::sendToViewable(mob, &pkt, P_FE2CL_NPC_SKILL_READY, sizeof(sP_FE2CL_NPC_SKILL_READY));
mob->nextAttack = currTime + 2500; mob->nextAttack = currTime + 2500;
mob->skillStyle = -2; mob->skillStyle = -2;
@ -1561,6 +1563,8 @@ void MobManager::useAbilities(Mob *mob, time_t currTime) {
} }
void MobManager::dealCorruption(Mob *mob, std::vector<int> targetData, int skillID, int style) { void MobManager::dealCorruption(Mob *mob, std::vector<int> targetData, int skillID, int style) {
Player *plr = PlayerManager::getPlayer(mob->target);
size_t resplen = sizeof(sP_FE2CL_NPC_SKILL_CORRUPTION_HIT) + targetData[0] * sizeof(sCAttackResult); size_t resplen = sizeof(sP_FE2CL_NPC_SKILL_CORRUPTION_HIT) + targetData[0] * sizeof(sCAttackResult);
// validate response packet // validate response packet
@ -1578,9 +1582,9 @@ void MobManager::dealCorruption(Mob *mob, std::vector<int> targetData, int skill
resp->iNPC_ID = mob->appearanceData.iNPC_ID; resp->iNPC_ID = mob->appearanceData.iNPC_ID;
resp->iSkillID = skillID; resp->iSkillID = skillID;
resp->iStyle = style; resp->iStyle = style;
resp->iValue1 = mob->target->plr->x; resp->iValue1 = plr->x;
resp->iValue2 = mob->target->plr->y; resp->iValue2 = plr->y;
resp->iValue3 = mob->target->plr->z; resp->iValue3 = plr->z;
resp->iTargetCnt = targetData[0]; resp->iTargetCnt = targetData[0];
for (int i = 0; i < targetData[0]; i++) { for (int i = 0; i < targetData[0]; i++) {

View File

@ -3,6 +3,7 @@
#include <set> #include <set>
#include <vector> #include <vector>
#include "Player.hpp"
#include "CNShardServer.hpp" #include "CNShardServer.hpp"
typedef void (*PowerHandler)(CNSocket*, std::vector<int>, int16_t, int16_t, int16_t, int16_t, int16_t, int32_t, int16_t); typedef void (*PowerHandler)(CNSocket*, std::vector<int>, int16_t, int16_t, int16_t, int16_t, int16_t, int32_t, int16_t);

View File

@ -57,8 +57,6 @@ void PlayerManager::addPlayer(CNSocket* key, Player plr) {
p->viewableChunks = new std::set<Chunk*>(); p->viewableChunks = new std::set<Chunk*>();
p->lastHeartbeat = 0; p->lastHeartbeat = 0;
key->plr = p;
std::cout << getPlayerName(p) << " has joined!" << std::endl; std::cout << getPlayerName(p) << " has joined!" << std::endl;
std::cout << players.size() << " players" << std::endl; std::cout << players.size() << " players" << std::endl;
} }
@ -79,10 +77,9 @@ void PlayerManager::removePlayer(CNSocket* key) {
ChunkManager::removePlayerFromChunks(ChunkManager::getViewableChunks(plr->chunkPos), key); ChunkManager::removePlayerFromChunks(ChunkManager::getViewableChunks(plr->chunkPos), key);
ChunkManager::untrackPlayer(plr->chunkPos, key); ChunkManager::untrackPlayer(plr->chunkPos, key);
std::cout << getPlayerName(key->plr) << " has left!" << std::endl; std::cout << getPlayerName(plr) << " has left!" << std::endl;
delete plr->viewableChunks; delete plr->viewableChunks;
key->plr = nullptr;
delete plr; delete plr;
players.erase(key); players.erase(key);
@ -872,7 +869,8 @@ Player *PlayerManager::getPlayer(CNSocket* key) {
if (players.find(key) != players.end()) if (players.find(key) != players.end())
return players[key]; return players[key];
return nullptr; // this should never happen
assert(false);
} }
std::string PlayerManager::getPlayerName(Player *plr, bool id) { std::string PlayerManager::getPlayerName(Player *plr, bool id) {