mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-11 16:51:29 +00:00
Add actual support for multi-zone task activities
This commit is contained in:
parent
060f8aadfe
commit
93749bc509
@ -249,7 +249,9 @@ bool TaskManager::LoadTasks(int singleTask)
|
|||||||
Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].GoalCount = atoi(row[11]);
|
Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].GoalCount = atoi(row[11]);
|
||||||
Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].DeliverToNPC = atoi(row[12]);
|
Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].DeliverToNPC = atoi(row[12]);
|
||||||
Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].zones = row[13];
|
Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].zones = row[13];
|
||||||
Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].ZoneID = atoi(row[13]); // for older clients
|
auto zones = SplitString(Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].zones, ';');
|
||||||
|
for (auto && e : zones)
|
||||||
|
Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].ZoneIDs.push_back(std::stoi(e));
|
||||||
Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].Optional = atoi(row[14]);
|
Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].Optional = atoi(row[14]);
|
||||||
|
|
||||||
Log(Logs::General, Logs::Tasks,
|
Log(Logs::General, Logs::Tasks,
|
||||||
@ -1144,7 +1146,7 @@ void TaskManager::SendTaskSelector(Client *c, Mob *mob, int TaskCount, int *Task
|
|||||||
|
|
||||||
buf.WriteInt32(activity.skill_id);
|
buf.WriteInt32(activity.skill_id);
|
||||||
buf.WriteInt32(activity.spell_id);
|
buf.WriteInt32(activity.spell_id);
|
||||||
buf.WriteInt32(activity.ZoneID);
|
buf.WriteInt32(activity.ZoneIDs.empty() ? 0 : activity.ZoneIDs.front());
|
||||||
buf.WriteString(activity.desc_override);
|
buf.WriteString(activity.desc_override);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1534,7 +1536,7 @@ bool ClientTaskState::UpdateTasksByNPC(Client *c, int ActivityType, int NPCTypeI
|
|||||||
if (Task->Activity[j].Type != ActivityType)
|
if (Task->Activity[j].Type != ActivityType)
|
||||||
continue;
|
continue;
|
||||||
// Is there a zone restriction on the activity ?
|
// Is there a zone restriction on the activity ?
|
||||||
if ((Task->Activity[j].ZoneID > 0) && (Task->Activity[j].ZoneID != (int)zone->GetZoneID())) {
|
if (!Task->Activity[j].CheckZone(zone->GetZoneID())) {
|
||||||
Log(Logs::General, Logs::Tasks,
|
Log(Logs::General, Logs::Tasks,
|
||||||
"[UPDATE] Char: %s Task: %i, Activity %i, Activity type %i for NPC %i failed zone "
|
"[UPDATE] Char: %s Task: %i, Activity %i, Activity type %i for NPC %i failed zone "
|
||||||
"check",
|
"check",
|
||||||
@ -1594,7 +1596,7 @@ int ClientTaskState::ActiveSpeakTask(int NPCTypeID) {
|
|||||||
if (Task->Activity[j].Type != ActivitySpeakWith)
|
if (Task->Activity[j].Type != ActivitySpeakWith)
|
||||||
continue;
|
continue;
|
||||||
// Is there a zone restriction on the activity ?
|
// Is there a zone restriction on the activity ?
|
||||||
if (Task->Activity[j].ZoneID > 0 && Task->Activity[j].ZoneID != (int)zone->GetZoneID())
|
if (!Task->Activity[j].CheckZone(zone->GetZoneID()))
|
||||||
continue;
|
continue;
|
||||||
// Is the activity to speak with this type of NPC ?
|
// Is the activity to speak with this type of NPC ?
|
||||||
if (Task->Activity[j].GoalMethod == METHODQUEST && Task->Activity[j].GoalID == NPCTypeID)
|
if (Task->Activity[j].GoalMethod == METHODQUEST && Task->Activity[j].GoalID == NPCTypeID)
|
||||||
@ -1632,7 +1634,7 @@ int ClientTaskState::ActiveSpeakActivity(int NPCTypeID, int TaskID) {
|
|||||||
if (Task->Activity[j].Type != ActivitySpeakWith)
|
if (Task->Activity[j].Type != ActivitySpeakWith)
|
||||||
continue;
|
continue;
|
||||||
// Is there a zone restriction on the activity ?
|
// Is there a zone restriction on the activity ?
|
||||||
if (Task->Activity[j].ZoneID > 0 && Task->Activity[j].ZoneID != (int)zone->GetZoneID())
|
if (!Task->Activity[j].CheckZone(zone->GetZoneID()))
|
||||||
continue;
|
continue;
|
||||||
// Is the activity to speak with this type of NPC ?
|
// Is the activity to speak with this type of NPC ?
|
||||||
if (Task->Activity[j].GoalMethod == METHODQUEST && Task->Activity[j].GoalID == NPCTypeID)
|
if (Task->Activity[j].GoalMethod == METHODQUEST && Task->Activity[j].GoalID == NPCTypeID)
|
||||||
@ -1678,7 +1680,7 @@ void ClientTaskState::UpdateTasksForItem(Client *c, ActivityType Type, int ItemI
|
|||||||
if (Task->Activity[j].Type != (int)Type)
|
if (Task->Activity[j].Type != (int)Type)
|
||||||
continue;
|
continue;
|
||||||
// Is there a zone restriction on the activity ?
|
// Is there a zone restriction on the activity ?
|
||||||
if (Task->Activity[j].ZoneID > 0 && Task->Activity[j].ZoneID != (int)zone->GetZoneID()) {
|
if (!Task->Activity[j].CheckZone(zone->GetZoneID())) {
|
||||||
Log(Logs::General, Logs::Tasks, "[UPDATE] Char: %s Activity type %i for Item %i failed zone check",
|
Log(Logs::General, Logs::Tasks, "[UPDATE] Char: %s Activity type %i for Item %i failed zone check",
|
||||||
c->GetName(), Type, ItemID);
|
c->GetName(), Type, ItemID);
|
||||||
continue;
|
continue;
|
||||||
@ -1737,7 +1739,7 @@ void ClientTaskState::UpdateTasksOnExplore(Client *c, int ExploreID)
|
|||||||
// We are only interested in explore activities
|
// We are only interested in explore activities
|
||||||
if (Task->Activity[j].Type != ActivityExplore)
|
if (Task->Activity[j].Type != ActivityExplore)
|
||||||
continue;
|
continue;
|
||||||
if (Task->Activity[j].ZoneID > 0 && Task->Activity[j].ZoneID != (int)zone->GetZoneID()) {
|
if (!Task->Activity[j].CheckZone(zone->GetZoneID())) {
|
||||||
Log(Logs::General, Logs::Tasks,
|
Log(Logs::General, Logs::Tasks,
|
||||||
"[UPDATE] Char: %s Explore exploreid %i failed zone check", c->GetName(),
|
"[UPDATE] Char: %s Explore exploreid %i failed zone check", c->GetName(),
|
||||||
ExploreID);
|
ExploreID);
|
||||||
@ -1801,11 +1803,11 @@ bool ClientTaskState::UpdateTasksOnDeliver(Client *c, std::list<EQEmu::ItemInsta
|
|||||||
if (Task->Activity[j].Type != ActivityDeliver && Task->Activity[j].Type != ActivityGiveCash)
|
if (Task->Activity[j].Type != ActivityDeliver && Task->Activity[j].Type != ActivityGiveCash)
|
||||||
continue;
|
continue;
|
||||||
// Is there a zone restriction on the activity ?
|
// Is there a zone restriction on the activity ?
|
||||||
if (Task->Activity[j].ZoneID > 0 && Task->Activity[j].ZoneID != (int)zone->GetZoneID()) {
|
if (!Task->Activity[j].CheckZone(zone->GetZoneID())) {
|
||||||
Log(Logs::General, Logs::Tasks,
|
Log(Logs::General, Logs::Tasks,
|
||||||
"[UPDATE] Char: %s Deliver activity failed zone check (current zone %i, need zone "
|
"[UPDATE] Char: %s Deliver activity failed zone check (current zone %i, need zone "
|
||||||
"%i",
|
"%s",
|
||||||
c->GetName(), zone->GetZoneID(), Task->Activity[j].ZoneID);
|
c->GetName(), zone->GetZoneID(), Task->Activity[j].zones.c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Is the activity to deliver to this NPCTypeID ?
|
// Is the activity to deliver to this NPCTypeID ?
|
||||||
@ -1878,7 +1880,7 @@ void ClientTaskState::UpdateTasksOnTouch(Client *c, int ZoneID)
|
|||||||
continue;
|
continue;
|
||||||
if (Task->Activity[j].GoalMethod != METHODSINGLEID)
|
if (Task->Activity[j].GoalMethod != METHODSINGLEID)
|
||||||
continue;
|
continue;
|
||||||
if (Task->Activity[j].ZoneID != ZoneID) {
|
if (!Task->Activity[j].CheckZone(ZoneID)) {
|
||||||
Log(Logs::General, Logs::Tasks, "[UPDATE] Char: %s Touch activity failed zone check",
|
Log(Logs::General, Logs::Tasks, "[UPDATE] Char: %s Touch activity failed zone check",
|
||||||
c->GetName());
|
c->GetName());
|
||||||
continue;
|
continue;
|
||||||
@ -2568,7 +2570,7 @@ void ClientTaskState::SendTaskHistory(Client *c, int TaskIndex) {
|
|||||||
thd2->GoalCount = Task->Activity[i].GoalCount;
|
thd2->GoalCount = Task->Activity[i].GoalCount;
|
||||||
thd2->unknown04 = 0xffffffff;
|
thd2->unknown04 = 0xffffffff;
|
||||||
thd2->unknown08 = 0xffffffff;
|
thd2->unknown08 = 0xffffffff;
|
||||||
thd2->ZoneID = Task->Activity[i].ZoneID;
|
thd2->ZoneID = Task->Activity[i].ZoneIDs.empty() ? 0 : Task->Activity[i].ZoneIDs.front();
|
||||||
thd2->unknown16 = 0x00000000;
|
thd2->unknown16 = 0x00000000;
|
||||||
Ptr = (char *)thd2 + sizeof(TaskHistoryReplyData2_Struct);
|
Ptr = (char *)thd2 + sizeof(TaskHistoryReplyData2_Struct);
|
||||||
VARSTRUCT_ENCODE_STRING(Ptr, Task->Activity[i].desc_override.c_str());
|
VARSTRUCT_ENCODE_STRING(Ptr, Task->Activity[i].desc_override.c_str());
|
||||||
@ -2772,7 +2774,7 @@ void TaskManager::SendTaskActivityLong(Client *c, int TaskID, int ActivityID, in
|
|||||||
|
|
||||||
buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].skill_id);
|
buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].skill_id);
|
||||||
buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].spell_id);
|
buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].spell_id);
|
||||||
buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].ZoneID);
|
buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].ZoneIDs.empty() ? 0 : Tasks[TaskID]->Activity[ActivityID].ZoneIDs.front());
|
||||||
buf.WriteUInt32(0);
|
buf.WriteUInt32(0);
|
||||||
|
|
||||||
buf.WriteString(Tasks[TaskID]->Activity[ActivityID].desc_override);
|
buf.WriteString(Tasks[TaskID]->Activity[ActivityID].desc_override);
|
||||||
|
|||||||
@ -25,6 +25,7 @@ Copyright (C) 2001-2004 EQEMu Development Team (http://eqemulator.net)
|
|||||||
#include <list>
|
#include <list>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
#define MAXTASKS 10000
|
#define MAXTASKS 10000
|
||||||
#define MAXTASKSETS 1000
|
#define MAXTASKSETS 1000
|
||||||
@ -113,9 +114,15 @@ struct ActivityInformation {
|
|||||||
TaskMethodType GoalMethod;
|
TaskMethodType GoalMethod;
|
||||||
int GoalCount;
|
int GoalCount;
|
||||||
int DeliverToNPC;
|
int DeliverToNPC;
|
||||||
int ZoneID;
|
std::vector<int> ZoneIDs;
|
||||||
std::string zones; // IDs ; searated, ZoneID is the first in this list for older clients -- default empty string
|
std::string zones; // IDs ; searated, ZoneID is the first in this list for older clients -- default empty string
|
||||||
bool Optional;
|
bool Optional;
|
||||||
|
|
||||||
|
inline bool CheckZone(int zone_id) {
|
||||||
|
if (ZoneIDs.empty())
|
||||||
|
return true;
|
||||||
|
return std::find(ZoneIDs.begin(), ZoneIDs.end(), zone_id) != ZoneIDs.end();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum { ActivitiesSequential = 0, ActivitiesStepped = 1 } SequenceType;
|
typedef enum { ActivitiesSequential = 0, ActivitiesStepped = 1 } SequenceType;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user