mirror of
https://github.com/OpenFusionProject/OpenFusion.git
synced 2024-11-26 23:10:05 +00:00
Compare commits
No commits in common. "d9ebb4e3ef46197624231da2c390107db6f08f94" and "cd265af8e021eab101e735ea702ea3a0c644a821" have entirely different histories.
d9ebb4e3ef
...
cd265af8e0
@ -94,49 +94,20 @@ 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;
|
||||||
|
|
||||||
int taskID = req->iMissionTaskID;
|
// get bark IDs from task data
|
||||||
// ignore req->iNPC_ID as it is often fixated on a single npc in the region
|
TaskData* td = Missions::Tasks[req->iMissionTaskID];
|
||||||
|
std::vector<int> barks;
|
||||||
if (Missions::Tasks.find(taskID) == Missions::Tasks.end()) {
|
for (int i = 0; i < 4; i++) {
|
||||||
std::cout << "mission task not found: " << taskID << std::endl;
|
if (td->task["m_iHBarkerTextID"][i] != 0) // non-zeroes only
|
||||||
return;
|
barks.push_back(td->task["m_iHBarkerTextID"][i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
TaskData* td = Missions::Tasks[taskID];
|
if (barks.empty())
|
||||||
auto& barks = td->task["m_iHBarkerTextID"];
|
return; // no barks
|
||||||
|
|
||||||
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::SIMPLE_NPC)
|
|
||||||
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 = npcID;
|
resp.iNPC_ID = req->iNPC_ID;
|
||||||
resp.iMissionStringID = missionStringID;
|
resp.iMissionStringID = barks[Rand::rand(barks.size())];
|
||||||
sock->sendPacket(resp, P_FE2CL_REP_BARKER);
|
sock->sendPacket(resp, P_FE2CL_REP_BARKER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user