Implemented the mob kill counter in missions and fixed a bug.

This commit is contained in:
dongresource 2020-09-09 21:08:31 +02:00
parent 8887c6349b
commit 3172724596

View File

@ -37,7 +37,7 @@ void CombatManager::pcAttackNpcs(CNSocket *sock, CNPacketData *data) {
// initialize response struct // initialize response struct
size_t resplen = sizeof(sP_FE2CL_PC_ATTACK_NPCs_SUCC) + pkt->iNPCCnt * sizeof(sAttackResult); size_t resplen = sizeof(sP_FE2CL_PC_ATTACK_NPCs_SUCC) + pkt->iNPCCnt * sizeof(sAttackResult);
uint8_t respbuf[4096]; uint8_t respbuf[CN_PACKET_BUFFER_SIZE];
memset(respbuf, 0, resplen); memset(respbuf, 0, resplen);
@ -56,32 +56,34 @@ void CombatManager::pcAttackNpcs(CNSocket *sock, CNPacketData *data) {
mob.appearanceData.iHP -= 100; mob.appearanceData.iHP -= 100;
if (mob.appearanceData.iHP <= 0) if (mob.appearanceData.iHP <= 0) {
giveReward(sock); giveReward(sock);
INITSTRUCT(sP_FE2CL_REP_PC_KILL_QUEST_NPCs_SUCC, kill);
kill.iNPCID = mob.appearanceData.iNPCType;
sock->sendPacket((void*)&kill, P_FE2CL_REP_PC_KILL_QUEST_NPCs_SUCC, sizeof(sP_FE2CL_REP_PC_KILL_QUEST_NPCs_SUCC));
// TODO: despawn mobs when they die // TODO: despawn mobs when they die
}
respdata[i].iID = mob.appearanceData.iNPC_ID; respdata[i].iID = mob.appearanceData.iNPC_ID;
respdata[i].iDamage = 100; respdata[i].iDamage = 100;
respdata[i].iHP = mob.appearanceData.iHP; respdata[i].iHP = mob.appearanceData.iHP;
respdata[i].iHitFlag = 2; respdata[i].iHitFlag = 2; // hitscan, not a rocket or a grenade
} }
sock->sendPacket((void*)respbuf, P_FE2CL_PC_ATTACK_NPCs_SUCC, resplen); sock->sendPacket((void*)respbuf, P_FE2CL_PC_ATTACK_NPCs_SUCC, resplen);
// a bit of a hack: these are the same size, so we can reuse the output packet // a bit of a hack: these are the same size, so we can reuse the response packet
assert(sizeof(sP_FE2CL_PC_ATTACK_NPCs_SUCC) == sizeof(sP_FE2CL_PC_ATTACK_NPCs)); assert(sizeof(sP_FE2CL_PC_ATTACK_NPCs_SUCC) == sizeof(sP_FE2CL_PC_ATTACK_NPCs));
sP_FE2CL_PC_ATTACK_NPCs *resp1 = (sP_FE2CL_PC_ATTACK_NPCs*)respbuf; sP_FE2CL_PC_ATTACK_NPCs *resp1 = (sP_FE2CL_PC_ATTACK_NPCs*)respbuf;
resp1->iPC_ID = plr->iID; resp1->iPC_ID = plr->iID;
// send to other players // send to other players
for (CNSocket *s : PlayerManager::players[sock].viewable) { for (CNSocket *s : PlayerManager::players[sock].viewable)
if (s == sock)
continue;
s->sendPacket((void*)respbuf, P_FE2CL_PC_ATTACK_NPCs, resplen); s->sendPacket((void*)respbuf, P_FE2CL_PC_ATTACK_NPCs, resplen);
} }
}
void CombatManager::combatBegin(CNSocket *sock, CNPacketData *data) {} // stub void CombatManager::combatBegin(CNSocket *sock, CNPacketData *data) {} // stub
void CombatManager::combatEnd(CNSocket *sock, CNPacketData *data) {} // stub void CombatManager::combatEnd(CNSocket *sock, CNPacketData *data) {} // stub
@ -115,6 +117,7 @@ void CombatManager::giveReward(CNSocket *sock) {
int slot = ItemManager::findFreeSlot(plr); int slot = ItemManager::findFreeSlot(plr);
if (slot == -1) { if (slot == -1) {
// no room for an item, but you still get FM and taros // no room for an item, but you still get FM and taros
reward->iItemCnt = 0;
sock->sendPacket((void*)respbuf, P_FE2CL_REP_REWARD_ITEM, sizeof(sP_FE2CL_REP_REWARD_ITEM)); sock->sendPacket((void*)respbuf, P_FE2CL_REP_REWARD_ITEM, sizeof(sP_FE2CL_REP_REWARD_ITEM));
} else { } else {
// item reward // item reward