mirror of
https://github.com/EQEmu/Server.git
synced 2026-09-04 18:46:37 +00:00
[Shared Tasks] Implement Activity Locking (#2339)
* Add shared task element locking This adds the `lock_activity_id` field to the tasks table which will automatically lock a shared task when that element becomes active. A method was added to world analogous to zone's UnlockActivities to determine when an activity is active with respect to task steps. Also adds quest apis to manually lock or unlock a client's shared task * Add comment
This commit is contained in:
@@ -1302,6 +1302,7 @@ public:
|
||||
return (task_state ? task_state->CompletedTasksInSet(task_set_id) : 0);
|
||||
}
|
||||
void PurgeTaskTimers();
|
||||
void LockSharedTask(bool lock) { if (task_state) { task_state->LockSharedTask(this, lock); } }
|
||||
|
||||
// shared task shims / middleware
|
||||
// these variables are used as a shim to intercept normal localized task functionality
|
||||
|
||||
@@ -1430,6 +1430,11 @@ bool Lua_Client::IsTaskActivityActive(int task, int activity) {
|
||||
return self->IsTaskActivityActive(task, activity);
|
||||
}
|
||||
|
||||
void Lua_Client::LockSharedTask(bool lock) {
|
||||
Lua_Safe_Call_Void();
|
||||
return self->LockSharedTask(lock);
|
||||
}
|
||||
|
||||
int Lua_Client::GetCorpseCount() {
|
||||
Lua_Safe_Call_Int();
|
||||
return self->GetCorpseCount();
|
||||
@@ -2772,6 +2777,7 @@ luabind::scope lua_register_client() {
|
||||
.def("LeaveGroup", (void(Lua_Client::*)(void))&Lua_Client::LeaveGroup)
|
||||
.def("LoadPEQZoneFlags", (void(Lua_Client::*)(void))&Lua_Client::LoadPEQZoneFlags)
|
||||
.def("LoadZoneFlags", (void(Lua_Client::*)(void))&Lua_Client::LoadZoneFlags)
|
||||
.def("LockSharedTask", &Lua_Client::LockSharedTask)
|
||||
.def("MarkSingleCompassLoc", (void(Lua_Client::*)(float,float,float))&Lua_Client::MarkSingleCompassLoc)
|
||||
.def("MarkSingleCompassLoc", (void(Lua_Client::*)(float,float,float,int))&Lua_Client::MarkSingleCompassLoc)
|
||||
.def("MaxSkill", (int(Lua_Client::*)(int))&Lua_Client::MaxSkill)
|
||||
|
||||
@@ -333,6 +333,7 @@ public:
|
||||
bool IsTaskCompleted(int task);
|
||||
bool IsTaskActive(int task);
|
||||
bool IsTaskActivityActive(int task, int activity);
|
||||
void LockSharedTask(bool lock);
|
||||
int GetCorpseCount();
|
||||
int GetCorpseID(int corpse);
|
||||
int GetCorpseItemAt(int corpse, int slot);
|
||||
|
||||
@@ -1408,6 +1408,11 @@ bool Perl_Client_IsTaskActivityActive(Client* self, int task_id, int activity_id
|
||||
return self->IsTaskActivityActive(task_id, activity_id);
|
||||
}
|
||||
|
||||
void Perl_Client_LockSharedTask(Client* self, bool lock)
|
||||
{
|
||||
return self->LockSharedTask(lock);
|
||||
}
|
||||
|
||||
uint32_t Perl_Client_GetCorpseCount(Client* self) // @categories Account and Character, Corpse
|
||||
{
|
||||
return self->GetCorpseCount();
|
||||
@@ -2621,6 +2626,7 @@ void perl_register_client()
|
||||
package.add("LeaveGroup", &Perl_Client_LeaveGroup);
|
||||
package.add("LoadPEQZoneFlags", &Perl_Client_LoadPEQZoneFlags);
|
||||
package.add("LoadZoneFlags", &Perl_Client_LoadZoneFlags);
|
||||
package.add("LockSharedTask", &Perl_Client_LockSharedTask);
|
||||
package.add("MarkCompassLoc", &Perl_Client_MarkCompassLoc);
|
||||
package.add("MaxSkill", (int(*)(Client*, uint16))&Perl_Client_MaxSkill);
|
||||
package.add("MaxSkill", (int(*)(Client*, uint16, uint16))&Perl_Client_MaxSkill);
|
||||
|
||||
@@ -2727,3 +2727,17 @@ bool ClientTaskState::HasActiveTasks()
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void ClientTaskState::LockSharedTask(Client* client, bool lock)
|
||||
{
|
||||
if (m_active_shared_task.task_id != TASKSLOTEMPTY)
|
||||
{
|
||||
ServerPacket pack(ServerOP_SharedTaskLock, sizeof(ServerSharedTaskLock_Struct));
|
||||
auto buf = reinterpret_cast<ServerSharedTaskLock_Struct*>(pack.pBuffer);
|
||||
buf->source_character_id = client->CharacterID();
|
||||
buf->task_id = m_active_shared_task.task_id;
|
||||
buf->lock = lock;
|
||||
|
||||
worldserver.SendPacket(&pack);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,6 +56,7 @@ public:
|
||||
void CreateTaskDynamicZone(Client* client, int task_id, DynamicZone& dz);
|
||||
void ListTaskTimers(Client* client);
|
||||
void KickPlayersSharedTask(Client* client);
|
||||
void LockSharedTask(Client* client, bool lock);
|
||||
|
||||
inline bool HasFreeTaskSlot() { return m_active_task.task_id == TASKSLOTEMPTY; }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user