mirror of
https://github.com/EQEmu/Server.git
synced 2026-03-06 02:02:25 +00:00
Flush out task verification steps
This commit is contained in:
parent
e1bb3301a5
commit
eb98eef1b9
@ -95,6 +95,7 @@ public:
|
|||||||
int GetTaskLockoutTimeLeft(int id) const;
|
int GetTaskLockoutTimeLeft(int id) const;
|
||||||
inline int GetCurrentSharedTaskID() const { return shared_task_id; }
|
inline int GetCurrentSharedTaskID() const { return shared_task_id; }
|
||||||
inline void SetCurrentSharedTaskID(int in) { shared_task_id = in; }
|
inline void SetCurrentSharedTaskID(int in) { shared_task_id = in; }
|
||||||
|
inline bool HasFreeSharedTaskSlot() const { return shared_task_id == 0; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void ClearVars(bool iAll = false);
|
void ClearVars(bool iAll = false);
|
||||||
|
|||||||
@ -29,6 +29,7 @@ void SharedTaskManager::HandleTaskRequest(ServerPacket *pack)
|
|||||||
if (it == task_information.end()) { // not loaded! bad id or not shared task
|
if (it == task_information.end()) { // not loaded! bad id or not shared task
|
||||||
auto pc = client_list.FindCharacter(leader_name.c_str());
|
auto pc = client_list.FindCharacter(leader_name.c_str());
|
||||||
if (pc) {
|
if (pc) {
|
||||||
|
// failure TODO: appropriate message
|
||||||
auto pack = new ServerPacket(ServerOP_TaskReject, leader_name.size() + 1 + 4);
|
auto pack = new ServerPacket(ServerOP_TaskReject, leader_name.size() + 1 + 4);
|
||||||
pack->WriteUInt32(0); // string ID or just generic fail message
|
pack->WriteUInt32(0); // string ID or just generic fail message
|
||||||
pack->WriteString(leader_name.c_str());
|
pack->WriteString(leader_name.c_str());
|
||||||
@ -43,6 +44,7 @@ void SharedTaskManager::HandleTaskRequest(ServerPacket *pack)
|
|||||||
if (!ret.second) {
|
if (!ret.second) {
|
||||||
auto pc = client_list.FindCharacter(leader_name.c_str());
|
auto pc = client_list.FindCharacter(leader_name.c_str());
|
||||||
if (pc) {
|
if (pc) {
|
||||||
|
// failure TODO: appropriate message
|
||||||
auto pack = new ServerPacket(ServerOP_TaskReject, leader_name.size() + 1 + 4);
|
auto pack = new ServerPacket(ServerOP_TaskReject, leader_name.size() + 1 + 4);
|
||||||
pack->WriteUInt32(0); // string ID or just generic fail message
|
pack->WriteUInt32(0); // string ID or just generic fail message
|
||||||
pack->WriteString(leader_name.c_str());
|
pack->WriteString(leader_name.c_str());
|
||||||
@ -52,14 +54,14 @@ void SharedTaskManager::HandleTaskRequest(ServerPacket *pack)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto cle = client_list.FindCharacter(leader_name.c_str());
|
auto cle_leader = client_list.FindCharacter(leader_name.c_str());
|
||||||
if (cle == nullptr) {// something went wrong
|
if (cle_leader == nullptr) {// something went wrong
|
||||||
tasks.erase(ret.first);
|
tasks.erase(ret.first);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto &task = ret.first->second;
|
auto &task = ret.first->second;
|
||||||
task.AddMember(leader_name, cle, true);
|
task.AddMember(leader_name, cle_leader, true);
|
||||||
|
|
||||||
if (players.empty()) {
|
if (players.empty()) {
|
||||||
// send instant success to leader
|
// send instant success to leader
|
||||||
@ -68,25 +70,58 @@ void SharedTaskManager::HandleTaskRequest(ServerPacket *pack)
|
|||||||
buf.WriteString(leader_name); // leader's name
|
buf.WriteString(leader_name); // leader's name
|
||||||
|
|
||||||
auto pack = new ServerPacket(ServerOP_TaskGrant, buf);
|
auto pack = new ServerPacket(ServerOP_TaskGrant, buf);
|
||||||
zoneserver_list.SendPacket(cle->zone(), cle->instance(), pack);
|
zoneserver_list.SendPacket(cle_leader->zone(), cle_leader->instance(), pack);
|
||||||
safe_delete(pack);
|
safe_delete(pack);
|
||||||
|
tasks.erase(ret.first);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto &&name : players) {
|
for (auto &&name : players) {
|
||||||
// look up CLEs by name, tell them we need to know if they can be added
|
// look up CLEs by name, tell them we need to know if they can be added
|
||||||
cle = client_list.FindCharacter(name.c_str());
|
auto cle = client_list.FindCharacter(name.c_str());
|
||||||
if (cle) {
|
if (cle) {
|
||||||
// make sure we don't have a shared task already
|
// make sure we don't have a shared task already
|
||||||
|
if (!cle->HasFreeSharedTaskSlot()) {
|
||||||
|
// failure TODO: appropriate message
|
||||||
|
auto pack = new ServerPacket(ServerOP_TaskReject, leader_name.size() + 1 + 4);
|
||||||
|
pack->WriteUInt32(0); // string ID or just generic fail message
|
||||||
|
pack->WriteString(leader_name.c_str());
|
||||||
|
zoneserver_list.SendPacket(cle_leader->zone(), cle_leader->instance(), pack);
|
||||||
|
safe_delete(pack);
|
||||||
|
tasks.erase(ret.first);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// make sure our level is right
|
// make sure our level is right
|
||||||
|
if (!AppropriateLevel(task_id, cle->level())) {
|
||||||
|
// failure TODO: appropriate message
|
||||||
|
auto pack = new ServerPacket(ServerOP_TaskReject, leader_name.size() + 1 + 4);
|
||||||
|
pack->WriteUInt32(0); // string ID or just generic fail message
|
||||||
|
pack->WriteString(leader_name.c_str());
|
||||||
|
zoneserver_list.SendPacket(cle_leader->zone(), cle_leader->instance(), pack);
|
||||||
|
safe_delete(pack);
|
||||||
|
tasks.erase(ret.first);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// check our lock out timer
|
// check our lock out timer
|
||||||
|
int expires = cle->GetTaskLockoutExpire(task_id);
|
||||||
|
if ((expires - Timer::GetCurrentTime()) >= 0) {
|
||||||
|
// failure TODO: appropriate message, we need to send the timestamp here
|
||||||
|
auto pack = new ServerPacket(ServerOP_TaskReject, leader_name.size() + 1 + 4);
|
||||||
|
pack->WriteUInt32(0); // string ID or just generic fail message
|
||||||
|
pack->WriteString(leader_name.c_str());
|
||||||
|
zoneserver_list.SendPacket(cle_leader->zone(), cle_leader->instance(), pack);
|
||||||
|
safe_delete(pack);
|
||||||
|
tasks.erase(ret.first);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// we're good, add to task
|
// we're good, add to task
|
||||||
task.AddMember(name, cle);
|
task.AddMember(name, cle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// TODO: what do now!
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -115,6 +150,27 @@ int SharedTaskManager::GetNextID()
|
|||||||
return next_id;
|
return next_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* returns true if the level fits in the task's defined range
|
||||||
|
*/
|
||||||
|
bool SharedTaskManager::AppropriateLevel(int id, int level) const
|
||||||
|
{
|
||||||
|
auto it = task_information.find(id);
|
||||||
|
// doesn't exist
|
||||||
|
if (it == task_information.end())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
auto &task = it->second;
|
||||||
|
|
||||||
|
if (task.MinLevel && level < task.MinLevel)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (task.MaxLevel && level > task.MaxLevel)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When a player leaves world they will tell us to clean up their pointer
|
* When a player leaves world they will tell us to clean up their pointer
|
||||||
* This is NOT leaving the shared task, just crashed or something
|
* This is NOT leaving the shared task, just crashed or something
|
||||||
|
|||||||
@ -47,6 +47,8 @@ public:
|
|||||||
bool LoadSharedTaskState();
|
bool LoadSharedTaskState();
|
||||||
bool LoadSharedTasks();
|
bool LoadSharedTasks();
|
||||||
|
|
||||||
|
bool AppropriateLevel(int id, int level) const;
|
||||||
|
|
||||||
// IPC packet processing
|
// IPC packet processing
|
||||||
void HandleTaskRequest(ServerPacket *pack);
|
void HandleTaskRequest(ServerPacket *pack);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user