This commit is contained in:
FinnHornhoover 2023-12-11 22:47:55 +00:00 committed by GitHub
commit cfce24e96b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -94,20 +94,49 @@ void NPCManager::sendToViewable(Entity *npc, void *buf, uint32_t type, size_t si
static void npcBarkHandler(CNSocket* sock, CNPacketData* data) { static void npcBarkHandler(CNSocket* sock, CNPacketData* data) {
sP_CL2FE_REQ_BARKER* req = (sP_CL2FE_REQ_BARKER*)data->buf; sP_CL2FE_REQ_BARKER* req = (sP_CL2FE_REQ_BARKER*)data->buf;
// get bark IDs from task data int taskID = req->iMissionTaskID;
TaskData* td = Missions::Tasks[req->iMissionTaskID]; // ignore req->iNPC_ID as it is often fixated on a single npc in the region
std::vector<int> barks;
for (int i = 0; i < 4; i++) { if (Missions::Tasks.find(taskID) == Missions::Tasks.end()) {
if (td->task["m_iHBarkerTextID"][i] != 0) // non-zeroes only std::cout << "mission task not found: " << taskID << std::endl;
barks.push_back(td->task["m_iHBarkerTextID"][i]); return;
} }
if (barks.empty()) TaskData* td = Missions::Tasks[taskID];
return; // no barks auto& barks = td->task["m_iHBarkerTextID"];
Player* plr = PlayerManager::getPlayer(sock);
std::vector<std::pair<int32_t, int32_t>> npcLines;
for (Chunk* chunk : plr->viewableChunks) {
for (auto ent = chunk->entities.begin(); ent != chunk->entities.end(); ent++) {
if (ent->kind == EntityKind::PLAYER)
continue;
BaseNPC* npc = (BaseNPC*)ent->getEntity();
if (npc->type < 0 || npc->type >= NPCData.size())
continue; // npc unknown ?!
int barkType = NPCData[npc->type]["m_iBarkerType"];
if (barkType < 1 || barkType > 4)
continue; // no barks
int barkID = barks[barkType - 1];
if (barkID == 0)
continue; // no barks
npcLines.push_back(std::make_pair(npc->id, barkID));
}
}
if (npcLines.size() == 0)
return; // totally no barks
auto& [npcID, missionStringID] = npcLines[Rand::rand(npcLines.size())];
INITSTRUCT(sP_FE2CL_REP_BARKER, resp); INITSTRUCT(sP_FE2CL_REP_BARKER, resp);
resp.iNPC_ID = req->iNPC_ID; resp.iNPC_ID = npcID;
resp.iMissionStringID = barks[Rand::rand(barks.size())]; resp.iMissionStringID = missionStringID;
sock->sendPacket(resp, P_FE2CL_REP_BARKER); sock->sendPacket(resp, P_FE2CL_REP_BARKER);
} }