diff --git a/common/eq_packet_structs.h b/common/eq_packet_structs.h index c59780b09..ced99f573 100644 --- a/common/eq_packet_structs.h +++ b/common/eq_packet_structs.h @@ -3851,7 +3851,7 @@ struct TaskDescriptionData2_Struct { uint8 has_rewards; uint32 coin_reward; uint32 xp_reward; - uint32 unknown3; // don't see it affecting display, faction maybe + uint32 faction_reward; }; struct TaskDescriptionTrailer_Struct { diff --git a/utils/sql/git/required/tasks_revamp.sql b/utils/sql/git/required/tasks_revamp.sql index bd751e12c..216a8c071 100644 --- a/utils/sql/git/required/tasks_revamp.sql +++ b/utils/sql/git/required/tasks_revamp.sql @@ -17,3 +17,5 @@ ALTER TABLE `activities` DROP COLUMN `text1`; ALTER TABLE `activities` DROP COLUMN `text2`; ALTER TABLE `activities` DROP COLUMN `text3`; ALTER TABLE `activities` DROP COLUMN `zoneid`; +ALTER TABLE `tasks` DROP COLUMN `startzone`; +ALTER TABLE `tasks` ADD `faction_reward` INT(10) NOT NULL DEFAULT '0'; diff --git a/zone/tasks.cpp b/zone/tasks.cpp index faf07cb89..f31beb472 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -117,12 +117,12 @@ bool TaskManager::LoadTasks(int singleTask) Log(Logs::Detail, Logs::Tasks, "TaskManager::LoadTasks LoadTaskSets failed"); query = StringFormat("SELECT `id`, `type`, `duration`, `duration_code`, `title`, `description`, " - "`reward`, `rewardid`, `cashreward`, `xpreward`, `rewardmethod`, " + "`reward`, `rewardid`, `cashreward`, `xpreward`, `rewardmethod`, `faction_reward`," "`minlevel`, `maxlevel`, `repeatable` FROM `tasks` WHERE `id` < %i", MAXTASKS); } else query = StringFormat("SELECT `id`, `type`, `duration`, `duration_code`, `title`, `description`, " - "`reward`, `rewardid`, `cashreward`, `xpreward`, `rewardmethod`, " + "`reward`, `rewardid`, `cashreward`, `xpreward`, `rewardmethod`, `faction_reward`," "`minlevel`, `maxlevel`, `repeatable` FROM `tasks` WHERE `id` = %i", singleTask); @@ -155,9 +155,10 @@ bool TaskManager::LoadTasks(int singleTask) Tasks[taskID]->CashReward = atoi(row[8]); Tasks[taskID]->XPReward = atoi(row[9]); Tasks[taskID]->RewardMethod = (TaskMethodType)atoi(row[10]); - Tasks[taskID]->MinLevel = atoi(row[11]); - Tasks[taskID]->MaxLevel = atoi(row[12]); - Tasks[taskID]->Repeatable = atoi(row[13]); + Tasks[taskID]->faction_reward = atoi(row[11]); + Tasks[taskID]->MinLevel = atoi(row[12]); + Tasks[taskID]->MaxLevel = atoi(row[13]); + Tasks[taskID]->Repeatable = atoi(row[14]); Tasks[taskID]->ActivityCount = 0; Tasks[taskID]->SequenceMode = ActivitiesSequential; Tasks[taskID]->LastStep = 0; @@ -2015,6 +2016,11 @@ void ClientTaskState::RewardTask(Client *c, TaskInformation *Task) { break; } } + + // just use normal NPC faction ID stuff + if (Task->faction_reward) + c->SetFactionLevel(c->CharacterID(), Task->faction_reward, c->GetBaseClass(), c->GetBaseRace(), c->GetDeity()); + if(Task->CashReward) { int Plat, Gold, Silver, Copper; @@ -2975,7 +2981,7 @@ void TaskManager::SendActiveTaskDescription(Client *c, int TaskID, ClientTaskInf tdd2->coin_reward = Tasks[TaskID]->CashReward; tdd2->xp_reward = Tasks[TaskID]->XPReward ? 1 : 0; // just booled - tdd2->unknown3 = 0; // STRONGLY suspect this is faction reward, also just booled to hide details? + tdd2->faction_reward = Tasks[TaskID]->faction_reward ? 1 : 0; // faction booled Ptr = (char *) tdd2 + sizeof(TaskDescriptionData2_Struct); diff --git a/zone/tasks.h b/zone/tasks.h index 12e6e00c7..70053a939 100644 --- a/zone/tasks.h +++ b/zone/tasks.h @@ -145,6 +145,7 @@ struct TaskInformation { int RewardID; int CashReward; // Expressed in copper int XPReward; + int faction_reward; // just a npc_faction_id TaskMethodType RewardMethod; int ActivityCount; SequenceType SequenceMode;