diff --git a/src/CombatManager.cpp b/src/CombatManager.cpp index afeedcc..02c2312 100644 --- a/src/CombatManager.cpp +++ b/src/CombatManager.cpp @@ -37,7 +37,7 @@ void CombatManager::pcAttackNpcs(CNSocket *sock, CNPacketData *data) { // initialize response struct 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); @@ -56,31 +56,33 @@ void CombatManager::pcAttackNpcs(CNSocket *sock, CNPacketData *data) { mob.appearanceData.iHP -= 100; - if (mob.appearanceData.iHP <= 0) + if (mob.appearanceData.iHP <= 0) { giveReward(sock); - // TODO: despawn mobs when they die + 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 + } respdata[i].iID = mob.appearanceData.iNPC_ID; respdata[i].iDamage = 100; 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); - // 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)); sP_FE2CL_PC_ATTACK_NPCs *resp1 = (sP_FE2CL_PC_ATTACK_NPCs*)respbuf; resp1->iPC_ID = plr->iID; // send to other players - for (CNSocket *s : PlayerManager::players[sock].viewable) { - if (s == sock) - continue; - + for (CNSocket *s : PlayerManager::players[sock].viewable) s->sendPacket((void*)respbuf, P_FE2CL_PC_ATTACK_NPCs, resplen); - } } void CombatManager::combatBegin(CNSocket *sock, CNPacketData *data) {} // stub @@ -115,6 +117,7 @@ void CombatManager::giveReward(CNSocket *sock) { int slot = ItemManager::findFreeSlot(plr); if (slot == -1) { // 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)); } else { // item reward