mirror of
https://github.com/OpenFusionProject/OpenFusion.git
synced 2024-11-05 06:50:04 +00:00
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:
parent
7c5d7a70cc
commit
c43a3d64fb
@ -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);
|
||||||
|
|
||||||
|
@ -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++) {
|
||||||
|
@ -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);
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user