mirror of
https://github.com/EQEmu/Server.git
synced 2026-03-27 14:42:25 +00:00
SaveClientState converted to QueryDatabase
This commit is contained in:
parent
48299b6024
commit
e3e2b266f2
211
zone/tasks.cpp
211
zone/tasks.cpp
@ -298,146 +298,127 @@ bool TaskManager::SaveClientState(Client *c, ClientTaskState *state) {
|
|||||||
// in that slot had more activities than the one now occupying it. Hopefully retaining the slot number for the
|
// in that slot had more activities than the one now occupying it. Hopefully retaining the slot number for the
|
||||||
// duration of a session will overcome this.
|
// duration of a session will overcome this.
|
||||||
//
|
//
|
||||||
const char *TaskQuery="REPLACE INTO character_tasks (charid, taskid, slot, acceptedtime) "
|
if(!c || !state)
|
||||||
"VALUES (%i, %i, %i, %i)";
|
return false;
|
||||||
|
|
||||||
const char *ActivityQuery="REPLACE INTO character_activities (charid, taskid, activityid, donecount, completed) "
|
|
||||||
"VALUES ";
|
|
||||||
|
|
||||||
const char *CompletedTaskQuery="REPLACE INTO completed_tasks (charid, completedtime, taskid, activityid) "
|
|
||||||
"VALUES (%i, %i, %i, %i)";
|
|
||||||
|
|
||||||
const char *ERR_MYSQLERROR = "[TASKS]Error in TaskManager::SaveClientState %s";
|
const char *ERR_MYSQLERROR = "[TASKS]Error in TaskManager::SaveClientState %s";
|
||||||
|
|
||||||
if(!c || !state) return false;
|
int characterID = c->CharacterID();
|
||||||
|
|
||||||
int CharacterID = c->CharacterID();
|
_log(TASKS__CLIENTSAVE,"TaskManager::SaveClientState for character ID %d", characterID);
|
||||||
|
|
||||||
_log(TASKS__CLIENTSAVE,"TaskManager::SaveClientState for character ID %d", CharacterID);
|
|
||||||
|
|
||||||
|
|
||||||
char errbuf[MYSQL_ERRMSG_SIZE];
|
|
||||||
char* query = 0;
|
|
||||||
|
|
||||||
if(state->ActiveTaskCount > 0) {
|
if(state->ActiveTaskCount > 0) {
|
||||||
for(int Task=0; Task<MAXACTIVETASKS; Task++) {
|
for(int task=0; task<MAXACTIVETASKS; task++) {
|
||||||
int TaskID = state->ActiveTasks[Task].TaskID;
|
int taskID = state->ActiveTasks[task].TaskID;
|
||||||
if(TaskID==TASKSLOTEMPTY) continue;
|
if(taskID==TASKSLOTEMPTY)
|
||||||
if(state->ActiveTasks[Task].Updated) {
|
continue;
|
||||||
|
|
||||||
_log(TASKS__CLIENTSAVE, "TaskManager::SaveClientState for character ID %d, Updating TaskIndex %i TaskID %i",
|
if(state->ActiveTasks[task].Updated) {
|
||||||
CharacterID, Task, TaskID);
|
|
||||||
|
|
||||||
if(!database.RunQuery(query,MakeAnyLenString(&query, TaskQuery,
|
_log(TASKS__CLIENTSAVE, "TaskManager::SaveClientState for character ID %d, Updating TaskIndex %i TaskID %i", characterID, task, taskID);
|
||||||
CharacterID,
|
|
||||||
TaskID,
|
|
||||||
Task,
|
|
||||||
state->ActiveTasks[Task].AcceptedTime), errbuf)) {
|
|
||||||
|
|
||||||
LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, errbuf);
|
std::string query = StringFormat("REPLACE INTO character_tasks (charid, taskid, slot, acceptedtime) "
|
||||||
}
|
"VALUES (%i, %i, %i, %i)",
|
||||||
|
characterID, taskID, task, state->ActiveTasks[task].AcceptedTime);
|
||||||
|
auto results = database.QueryDatabase(query);
|
||||||
|
if(!results.Success())
|
||||||
|
LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, results.ErrorMessage().c_str());
|
||||||
else
|
else
|
||||||
state->ActiveTasks[Task].Updated = false;
|
state->ActiveTasks[task].Updated = false;
|
||||||
|
|
||||||
safe_delete_array(query);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int UpdatedActivityCount = 0;
|
std::string query = "REPLACE INTO character_activities (charid, taskid, activityid, donecount, completed) "
|
||||||
std::string UpdateActivityQuery = ActivityQuery;
|
"VALUES ";
|
||||||
char *buf = 0;
|
|
||||||
|
|
||||||
for(int Activity=0; Activity<Tasks[TaskID]->ActivityCount; Activity++) {
|
int updatedActivityCount = 0;
|
||||||
|
for(int activityIndex = 0; activityIndex<Tasks[taskID]->ActivityCount; ++activityIndex) {
|
||||||
|
|
||||||
if(state->ActiveTasks[Task].Activity[Activity].Updated) {
|
if(!state->ActiveTasks[task].Activity[activityIndex].Updated)
|
||||||
|
continue;
|
||||||
|
|
||||||
_log(TASKS__CLIENTSAVE, "TaskManager::SaveClientSate for character ID %d, "
|
_log(TASKS__CLIENTSAVE, "TaskManager::SaveClientSate for character ID %d, Updating Activity %i, %i",
|
||||||
"Updating Activity %i, %i",
|
characterID, task, activityIndex);
|
||||||
CharacterID, Task, Activity);
|
|
||||||
|
|
||||||
if(UpdatedActivityCount==0) {
|
if(updatedActivityCount==0)
|
||||||
MakeAnyLenString(&buf, "(%i, %i, %i, %i, %i)", CharacterID, TaskID,
|
query += StringFormat("(%i, %i, %i, %i, %i)",
|
||||||
Activity,
|
characterID, taskID, activityIndex,
|
||||||
state->ActiveTasks[Task].Activity[Activity].DoneCount,
|
state->ActiveTasks[task].Activity[activityIndex].DoneCount,
|
||||||
state->ActiveTasks[Task].Activity[Activity].State ==
|
state->ActiveTasks[task].Activity[activityIndex].State == ActivityCompleted);
|
||||||
ActivityCompleted);
|
else
|
||||||
}
|
query += StringFormat(", (%i, %i, %i, %i, %i)",
|
||||||
else {
|
characterID, taskID, activityIndex,
|
||||||
MakeAnyLenString(&buf, ", (%i, %i, %i, %i, %i)", CharacterID, TaskID,
|
state->ActiveTasks[task].Activity[activityIndex].DoneCount,
|
||||||
Activity,
|
state->ActiveTasks[task].Activity[activityIndex].State == ActivityCompleted);
|
||||||
state->ActiveTasks[Task].Activity[Activity].DoneCount,
|
|
||||||
state->ActiveTasks[Task].Activity[Activity].State ==
|
updatedActivityCount++;
|
||||||
ActivityCompleted);
|
|
||||||
}
|
|
||||||
UpdateActivityQuery = UpdateActivityQuery + buf;
|
|
||||||
safe_delete_array(buf);
|
|
||||||
UpdatedActivityCount++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(UpdatedActivityCount > 0) {
|
if(updatedActivityCount == 0)
|
||||||
_log(TASKS__CLIENTSAVE, "Executing query %s", UpdateActivityQuery.c_str());
|
continue;
|
||||||
if(!database.RunQuery(query,MakeAnyLenString(&query, UpdateActivityQuery.c_str()),
|
|
||||||
errbuf)) {
|
|
||||||
|
|
||||||
LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, errbuf);
|
_log(TASKS__CLIENTSAVE, "Executing query %s", query.c_str());
|
||||||
}
|
auto results = database.QueryDatabase(query);
|
||||||
else {
|
|
||||||
state->ActiveTasks[Task].Updated=false;
|
|
||||||
for(int Activity=0; Activity<Tasks[TaskID]->ActivityCount; Activity++)
|
|
||||||
state->ActiveTasks[Task].Activity[Activity].Updated=false;
|
|
||||||
|
|
||||||
}
|
if(!results.Success()) {
|
||||||
|
LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, results.ErrorMessage().c_str());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
state->ActiveTasks[task].Updated=false;
|
||||||
|
for(int activityIndex=0; activityIndex<Tasks[taskID]->ActivityCount; ++activityIndex)
|
||||||
|
state->ActiveTasks[task].Activity[activityIndex].Updated=false;
|
||||||
|
|
||||||
safe_delete_array(query);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
if(RuleB(TaskSystem, RecordCompletedTasks) &&
|
|
||||||
(state->CompletedTasks.size() > (unsigned int)state->LastCompletedTaskLoaded)) {
|
|
||||||
|
|
||||||
for(unsigned int i=state->LastCompletedTaskLoaded; i<state->CompletedTasks.size(); i++) {
|
|
||||||
|
|
||||||
_log(TASKS__CLIENTSAVE, "TaskManager::SaveClientState Saving Completed Task at slot %i", i);
|
|
||||||
int TaskID = state->CompletedTasks[i].TaskID;
|
|
||||||
if((TaskID<=0) || (TaskID>=MAXTASKS) || (Tasks[TaskID]==nullptr)) continue;
|
|
||||||
|
|
||||||
// First we save a record with an ActivityID of -1.
|
|
||||||
// This indicates this task was completed at the given time. We infer that all
|
|
||||||
// none optional activities were completed.
|
|
||||||
//
|
|
||||||
if(!database.RunQuery(query,MakeAnyLenString(&query, CompletedTaskQuery,
|
|
||||||
CharacterID,
|
|
||||||
state->CompletedTasks[i].CompletedTime,
|
|
||||||
TaskID, -1), errbuf)) {
|
|
||||||
|
|
||||||
LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, errbuf);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
safe_delete_array(query);
|
|
||||||
|
|
||||||
// If the Rule to record non-optional task completion is not enabled, don't save it
|
|
||||||
if(!RuleB(TaskSystem, RecordCompletedOptionalActivities)) continue;
|
|
||||||
|
|
||||||
// Insert one record for each completed optional task.
|
|
||||||
|
|
||||||
for(int j=0; j<Tasks[TaskID]->ActivityCount; j++) {
|
|
||||||
if(Tasks[TaskID]->Activity[j].Optional && state->CompletedTasks[i].ActivityDone[j]) {
|
|
||||||
|
|
||||||
if(!database.RunQuery(query,MakeAnyLenString(&query, CompletedTaskQuery,
|
|
||||||
CharacterID,
|
|
||||||
state->CompletedTasks[i].CompletedTime,
|
|
||||||
TaskID, j), errbuf)) {
|
|
||||||
|
|
||||||
LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, errbuf);
|
|
||||||
}
|
|
||||||
safe_delete_array(query);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
state->LastCompletedTaskLoaded = state->CompletedTasks.size();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!RuleB(TaskSystem, RecordCompletedTasks) || (state->CompletedTasks.size() <= (unsigned int)state->LastCompletedTaskLoaded)) {
|
||||||
|
state->LastCompletedTaskLoaded = state->CompletedTasks.size();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* completedTaskQuery = "REPLACE INTO completed_tasks (charid, completedtime, taskid, activityid) "
|
||||||
|
"VALUES (%i, %i, %i, %i)";
|
||||||
|
|
||||||
|
for(unsigned int i=state->LastCompletedTaskLoaded; i<state->CompletedTasks.size(); i++) {
|
||||||
|
|
||||||
|
_log(TASKS__CLIENTSAVE, "TaskManager::SaveClientState Saving Completed Task at slot %i", i);
|
||||||
|
int taskID = state->CompletedTasks[i].TaskID;
|
||||||
|
|
||||||
|
if((taskID <= 0) || (taskID >= MAXTASKS) || (Tasks[taskID] == nullptr))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// First we save a record with an ActivityID of -1.
|
||||||
|
// This indicates this task was completed at the given time. We infer that all
|
||||||
|
// none optional activities were completed.
|
||||||
|
//
|
||||||
|
std::string query = StringFormat(completedTaskQuery, characterID, state->CompletedTasks[i].CompletedTime, taskID, -1);
|
||||||
|
auto results = database.QueryDatabase(query);
|
||||||
|
if(!results.Success()) {
|
||||||
|
LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, results.ErrorMessage().c_str());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the Rule to record non-optional task completion is not enabled, don't save it
|
||||||
|
if(!RuleB(TaskSystem, RecordCompletedOptionalActivities))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Insert one record for each completed optional task.
|
||||||
|
|
||||||
|
for(int j=0; j<Tasks[taskID]->ActivityCount; j++) {
|
||||||
|
if(!Tasks[taskID]->Activity[j].Optional || !state->CompletedTasks[i].ActivityDone[j])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
query = StringFormat(completedTaskQuery, characterID, state->CompletedTasks[i].CompletedTime, taskID, j);
|
||||||
|
results = database.QueryDatabase(query);
|
||||||
|
if(!results.Success())
|
||||||
|
LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, results.ErrorMessage().c_str());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
state->LastCompletedTaskLoaded = state->CompletedTasks.size();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user