diff --git a/zone/tasks.cpp b/zone/tasks.cpp index e44fcb5a0..121ea130f 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -48,9 +48,6 @@ TaskManager::TaskManager() { TaskManager::~TaskManager() { for(int i=0; iTitle); - safe_delete_array(Tasks[i]->Description); - safe_delete_array(Tasks[i]->Reward); safe_delete(Tasks[i]); } } @@ -93,9 +90,6 @@ bool TaskManager::LoadSingleTask(int TaskID) { // If this task already exists in memory, free all the dynamically allocated strings. if(Tasks[TaskID]) { - safe_delete_array(Tasks[TaskID]->Title); - safe_delete_array(Tasks[TaskID]->Description); - safe_delete_array(Tasks[TaskID]->Reward); safe_delete(Tasks[TaskID]); } @@ -153,12 +147,9 @@ bool TaskManager::LoadTasks(int singleTask) Tasks[taskID] = new TaskInformation; Tasks[taskID]->Duration = atoi(row[1]); - Tasks[taskID]->Title = new char[strlen(row[2]) + 1]; - strcpy(Tasks[taskID]->Title, row[2]); - Tasks[taskID]->Description = new char[strlen(row[3]) + 1]; - strcpy(Tasks[taskID]->Description, row[3]); - Tasks[taskID]->Reward = new char[strlen(row[4]) + 1]; - strcpy(Tasks[taskID]->Reward, row[4]); + Tasks[taskID]->Title = row[2]; + Tasks[taskID]->Description = row[3]; + Tasks[taskID]->Reward = row[4]; Tasks[taskID]->RewardID = atoi(row[5]); Tasks[taskID]->CashReward = atoi(row[6]); Tasks[taskID]->XPReward = atoi(row[7]); @@ -174,9 +165,9 @@ bool TaskManager::LoadTasks(int singleTask) Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] TaskID: %5i, Duration: %8i, StartZone: %3i Reward: %s MinLevel %i MaxLevel %i " "Repeatable: %s", - taskID, Tasks[taskID]->Duration, Tasks[taskID]->StartZone, Tasks[taskID]->Reward, + taskID, Tasks[taskID]->Duration, Tasks[taskID]->StartZone, Tasks[taskID]->Reward.c_str(), Tasks[taskID]->MinLevel, Tasks[taskID]->MaxLevel, Tasks[taskID]->Repeatable ? "Yes" : "No"); - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Title: %s", Tasks[taskID]->Title); + Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Title: %s", Tasks[taskID]->Title.c_str()); } if (singleTask == 0) @@ -658,7 +649,7 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) { if(state->ActiveTasks[i].Activity[j].ActivityID != j) { c->Message(13, "Active Task %i, %s. Activity count does not match expected value." "Removing from memory. Contact a GM to resolve this.", - taskID, Tasks[taskID]->Title); + taskID, Tasks[taskID]->Title.c_str()); Log(Logs::General, Logs::Error, "[TASKS]Fatal error in character %i task state. Activity %i for " "Task %i either missing from client state or from task.", characterID, j, taskID); @@ -1043,8 +1034,8 @@ void TaskManager::SendTaskSelector(Client *c, Mob *mob, int TaskCount, int *Task ValidTasks++; - PacketLength = PacketLength + sizeof(AvailableTaskData1_Struct) + strlen(Tasks[TaskList[i]]->Title) + 1 + - strlen(Tasks[TaskList[i]]->Description) + 1 + sizeof(AvailableTaskData2_Struct) + 10 + + PacketLength = PacketLength + sizeof(AvailableTaskData1_Struct) + Tasks[TaskList[i]]->Title.size() + 1 + + Tasks[TaskList[i]]->Description.size() + 1 + sizeof(AvailableTaskData2_Struct) + 10 + sizeof(AvailableTaskTrailer_Struct) + 5; } @@ -1082,11 +1073,11 @@ void TaskManager::SendTaskSelector(Client *c, Mob *mob, int TaskCount, int *Task Ptr = (char *)AvailableTaskData1 + sizeof(AvailableTaskData1_Struct); - sprintf(Ptr, "%s", Tasks[TaskList[i]]->Title); + sprintf(Ptr, "%s", Tasks[TaskList[i]]->Title.c_str()); Ptr = Ptr + strlen(Ptr) + 1; - sprintf(Ptr, "%s", Tasks[TaskList[i]]->Description); + sprintf(Ptr, "%s", Tasks[TaskList[i]]->Description.c_str()); Ptr = Ptr + strlen(Ptr) + 1; @@ -1158,8 +1149,8 @@ void TaskManager::SendTaskSelectorNew(Client *c, Mob *mob, int TaskCount, int *T ValidTasks++; PacketLength += 21; // Task Data - strings - PacketLength += strlen(Tasks[TaskList[i]]->Title) + 1 + - strlen(Tasks[TaskList[i]]->Description) + 1; + PacketLength += Tasks[TaskList[i]]->Title.size() + 1 + + Tasks[TaskList[i]]->Description.size() + 1; sprintf(StartZone, "%i", Tasks[TaskList[i]]->StartZone); /* @@ -1196,8 +1187,8 @@ void TaskManager::SendTaskSelectorNew(Client *c, Mob *mob, int TaskCount, int *T outapp->WriteUInt32(Tasks[TaskList[i]]->Duration); outapp->WriteUInt32(0); // 1 = Short, 2 = Medium, 3 = Long, anything else Unlimited - outapp->WriteString(Tasks[TaskList[i]]->Title); // max 64 with null - outapp->WriteString(Tasks[TaskList[i]]->Description); // max 4000 with null + outapp->WriteString(Tasks[TaskList[i]]->Title.c_str()); // max 64 with null + outapp->WriteString(Tasks[TaskList[i]]->Description.c_str()); // max 4000 with null outapp->WriteUInt8(0); // Has reward set flag outapp->WriteUInt32(1); // ActivityCount - Hard set to 1 for now @@ -1269,7 +1260,7 @@ void TaskManager::ExplainTask(Client*c, int TaskID) { } char Explanation[1000], *ptr; - c->Message(0, "Task %4i: Title: %s", TaskID, Tasks[TaskID]->Description); + c->Message(0, "Task %4i: Title: %s", TaskID, Tasks[TaskID]->Description.c_str()); c->Message(0, "%3i Activities", Tasks[TaskID]->ActivityCount); ptr = Explanation; for(int i=0; iActivityCount; i++) { @@ -1851,7 +1842,7 @@ void ClientTaskState::IncrementDoneCount(Client *c, TaskInformation* Task, int T // Send the updated task/activity list to the client taskmanager->SendSingleActiveTaskToClient(c, TaskIndex, TaskComplete, false); // Inform the client the task has been updated, both by a chat message - c->Message(0, "Your task '%s' has been updated.", Task->Title); + c->Message(0, "Your task '%s' has been updated.", Task->Title.c_str()); if(Task->Activity[ActivityID].GoalMethod != METHODQUEST) { if (!ignore_quest_update){ @@ -2157,8 +2148,8 @@ void ClientTaskState::ShowClientTasks(Client *c) { if(ActiveTasks[i].TaskID==TASKSLOTEMPTY) continue; - c->Message(0, "Task: %i %s", ActiveTasks[i].TaskID, taskmanager->Tasks[ActiveTasks[i].TaskID]->Title); - c->Message(0, " Description: [%s]\n", taskmanager->Tasks[ActiveTasks[i].TaskID]->Description); + c->Message(0, "Task: %i %s", ActiveTasks[i].TaskID, taskmanager->Tasks[ActiveTasks[i].TaskID]->Title.c_str()); + c->Message(0, " Description: [%s]\n", taskmanager->Tasks[ActiveTasks[i].TaskID]->Description.c_str()); for(int j=0; jGetActivityCount(ActiveTasks[i].TaskID); j++) { c->Message(0, " Activity: %2d, DoneCount: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", ActiveTasks[i].Activity[j].ActivityID, @@ -2466,7 +2457,7 @@ void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *State) for(int i = FirstTaskToSend; iCompletedTasks[i].TaskID; if(Tasks[TaskID] == nullptr) continue; - PacketLength = PacketLength + 8 + strlen(Tasks[TaskID]->Title) + 1; + PacketLength = PacketLength + 8 + Tasks[TaskID]->Title.size() + 1; } auto outapp = new EQApplicationPacket(OP_CompletedTasks, PacketLength); @@ -2483,7 +2474,7 @@ void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *State) *(uint32 *)buf = TaskID; buf = buf + 4; - sprintf(buf, "%s", Tasks[TaskID]->Title); + sprintf(buf, "%s", Tasks[TaskID]->Title.c_str()); buf = buf + strlen(buf) + 1; //*(uint32 *)buf = (*iterator).CompletedTime; *(uint32 *)buf = State->CompletedTasks[i].CompletedTime; @@ -2774,8 +2765,8 @@ void TaskManager::SendActiveTaskDescription(Client *c, int TaskID, int SequenceN if ((TaskID < 1) || (TaskID >= MAXTASKS) || !Tasks[TaskID]) return; - int PacketLength = sizeof(TaskDescriptionHeader_Struct) + strlen(Tasks[TaskID]->Title) + 1 - + sizeof(TaskDescriptionData1_Struct) + strlen(Tasks[TaskID]->Description) + 1 + int PacketLength = sizeof(TaskDescriptionHeader_Struct) + Tasks[TaskID]->Title.size() + 1 + + sizeof(TaskDescriptionData1_Struct) + Tasks[TaskID]->Description.size() + 1 + sizeof(TaskDescriptionData2_Struct) + 1 + sizeof(TaskDescriptionTrailer_Struct); std::string reward_text; @@ -2802,8 +2793,8 @@ void TaskManager::SendActiveTaskDescription(Client *c, int TaskID, int SequenceN linker.SetLinkType(EQEmu::saylink::SayLinkItemData); linker.SetItemData(reward_item); linker.SetTaskUse(); - if (strlen(Tasks[TaskID]->Reward) != 0) - linker.SetProxyText(Tasks[TaskID]->Reward); + if (!Tasks[TaskID]->Reward.empty()) + linker.SetProxyText(Tasks[TaskID]->Reward.c_str()); reward_text.append(linker.GenerateLink()); } @@ -2841,7 +2832,7 @@ void TaskManager::SendActiveTaskDescription(Client *c, int TaskID, int SequenceN Ptr = (char *) tdh + sizeof(TaskDescriptionHeader_Struct); - sprintf(Ptr, "%s", Tasks[TaskID]->Title); + sprintf(Ptr, "%s", Tasks[TaskID]->Title.c_str()); Ptr = Ptr + strlen(Ptr) + 1; tdd1 = (TaskDescriptionData1_Struct*)Ptr; @@ -2853,7 +2844,7 @@ void TaskManager::SendActiveTaskDescription(Client *c, int TaskID, int SequenceN Ptr = (char *) tdd1 + sizeof(TaskDescriptionData1_Struct); - sprintf(Ptr, "%s", Tasks[TaskID]->Description); + sprintf(Ptr, "%s", Tasks[TaskID]->Description.c_str()); Ptr = Ptr + strlen(Ptr) + 1; tdd2 = (TaskDescriptionData2_Struct*)Ptr; @@ -3053,7 +3044,7 @@ void ClientTaskState::AcceptNewTask(Client *c, int TaskID, int NPCID, bool enfor UnlockActivities(c->CharacterID(), FreeSlot); ActiveTaskCount++; taskmanager->SendSingleActiveTaskToClient(c, FreeSlot, false, true); - c->Message(0, "You have been assigned the task '%s'.", taskmanager->Tasks[TaskID]->Title); + c->Message(0, "You have been assigned the task '%s'.", taskmanager->Tasks[TaskID]->Title.c_str()); char *buf = 0; MakeAnyLenString(&buf, "%d", TaskID); diff --git a/zone/tasks.h b/zone/tasks.h index 7b0bb2d4a..0142f32fd 100644 --- a/zone/tasks.h +++ b/zone/tasks.h @@ -117,9 +117,9 @@ typedef enum { ActivitiesSequential = 0, ActivitiesStepped = 1 } SequenceType; struct TaskInformation { int Duration; - char *Title; - char *Description; - char *Reward; + std::string Title; // max length 64 + std::string Description; // max length 4000 + std::string Reward; int RewardID; int CashReward; // Expressed in copper int XPReward;