/* EQ2Emulator: Everquest II Server Emulator Copyright (C) 2007 EQ2EMulator Development Team (http://www.eq2emulator.net) This file is part of EQ2Emulator. EQ2Emulator is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. EQ2Emulator is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with EQ2Emulator. If not, see . */ #include "AltAdvancement.h" #include "../../common/ConfigReader.h" #include "../../common/Log.h" #include "../Spells.h" #include "../classes.h" #include "../Rules/Rules.h" #include #include #include #include "../../common/DatabaseNew.h" #include "../WorldDatabase.h" extern ConfigReader configReader; extern MasterSpellList master_spell_list; extern Classes classes; extern RuleManager rule_manager; extern MasterAANodeList master_tree_nodes; MasterAAList::MasterAAList() { MMasterAAList.SetName("MasterAAList::AAList"); } MasterAAList::~MasterAAList() { DestroyAltAdvancements(); } void MasterAAList::AddAltAdvancement(AltAdvanceData* data) { MMasterAAList.writelock(__FUNCTION__, __LINE__); AAList.push_back(data); MMasterAAList.releasewritelock(__FUNCTION__, __LINE__); } int MasterAAList::Size() { return AAList.size(); } // Jabantiz: Probably a better way to do this but can't think of it right now AltAdvanceData* MasterAAList::GetAltAdvancement(int32 spellID) { vector::iterator itr; AltAdvanceData* data = NULL; MMasterAAList.readlock(__FUNCTION__, __LINE__); for (itr = AAList.begin(); itr != AAList.end(); itr++) { if ((*itr)->spellID == spellID) { data = (*itr); break; } } MMasterAAList.releasereadlock(__FUNCTION__, __LINE__); return data; } void MasterAAList::DestroyAltAdvancements() { MMasterAAList.writelock(__FUNCTION__, __LINE__); vector::iterator itr; for (itr = AAList.begin(); itr != AAList.end(); itr++) safe_delete(*itr); AAList.clear(); MMasterAAList.releasewritelock(__FUNCTION__, __LINE__); } MasterAANodeList::MasterAANodeList() { } MasterAANodeList::~MasterAANodeList() { DestroyTreeNodes(); } void MasterAANodeList::AddTreeNode(TreeNodeData* data) { TreeNodeList.push_back(data); } void MasterAANodeList::DestroyTreeNodes() { vector::iterator itr; for (itr = TreeNodeList.begin(); itr != TreeNodeList.end(); itr++) safe_delete(*itr); TreeNodeList.clear(); } int MasterAANodeList::Size() { return TreeNodeList.size(); } vector MasterAANodeList::GetTreeNodes() { return TreeNodeList; } EQ2Packet* MasterAAList::GetAAListPacket(Client* client) { /* -- OP_DispatchESMsg -- 5/24/2011 20:54:15 199.108.12.165 -> 192.168.0.197 0000: 00 38 3B 00 00 00 FF A3 02 FF FF FF FF 00 00 00 .8;............. 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0030: 00 00 00 00 00 00 00 00 FF FF FF FF 00 00 00 00 ................ 0040 00 . */ uchar blah[] = {0xFF,0xE8,0x01, 0x00, //unknown 0x07,0x00,0x00,0x00, //unknown2 0x07,0x00,0x57,0x61,0x72,0x72,0x69,0x6F,0x72, //class_title_tab 0x0C,0x00, //unknown3 0x64,0x00,0x00,0x00, //max_class_aa 0xFD,0x74,0xB6,0x73, //class_id 0x00, //kos_req 0x00,0x00,0x00,0x00, //num_class_items 0x0B,0x00,0x00,0x00, //unknown10 0x11,0x00,0x00,0x00, //class_points_spent 0x00,0x00,0x3B,0x81,0x01,0x00, //unknown11 0x00,0x00, //unknown12 0x00,0x00, //unknown13 0x00,0x00,0x00,0x00, //unknown14 0x00,0x00, //unknown15 0x00,0x00,0x00,0x00,0x00,0x00,0x00, //unknown16 0x09,0x00,0x42,0x65,0x72,0x73,0x65,0x72,0x6B,0x65,0x72, //subclass_title_tab 0x0E,0x00, //unknown17 0x64,0x00,0x00,0x00, //max_subclass_aa 0x5F,0xD6,0xAF,0x50, //subclass_id 0x00, //eof_req 0x00,0x00,0x00,0x00, //num_subclass_items 0x0C,0x00,0x00,0x00, //unknown20 0x08,0x00,0x00,0x00, //subclass_points_spent 0x00,0x00,0x3B,0x81,0x03,0x14, //unknown21 0x00,0x00,0x00, //unknown22 0x1D,0x00,0x3A,0x63,0x65,0x31,0x38,0x36,0x34,0x63,0x37,0x66,0x35,0x33,0x66,0x65,0x62,0x37,0x62,0x5F,0x31,0x3A,0x42,0x65,0x72,0x73,0x65,0x72,0x6B,0x65,0x72, //unknown23 0x01,0x00,0x00,0x00, //unknown24 0x1D,0x00,0x3A,0x63,0x65,0x31,0x38,0x36,0x34,0x63,0x37,0x35,0x66,0x39,0x34,0x61,0x32,0x64,0x37,0x5F,0x31,0x3A,0x45,0x78,0x70,0x65,0x72,0x74,0x69,0x73,0x65, //unknown25 0x00,0x00,0x00,0x00,0x00,0x00, //unknown26 0x07,0x00,0x53,0x68,0x61,0x64,0x6F,0x77,0x73, //shadows_tab_title 0x2C,0x00, //unknown27 0x46,0x00,0x00,0x00, //max_shadows_aa 0x53,0x88,0x59,0x62, //shadows_id 0x00, //rok_req 0x00,0x00,0x00,0x00, //num_shadow_items 0x0E,0x00,0x00,0x00, //unknown30 0x00,0x00,0x00,0x00, //shadows_points_spent 0x00,0x00,0x3B,0x81,0x03,0x00, //unknown31 0x00,0x00,0x00, //unknown32 0x00,0x00, //uknown33 0x00,0x00,0x00,0x00, //unknown34 0x00,0x00, //unknown35 0x00,0x00,0x00,0x00,0x00,0x00, //unknown36 0x06,0x00,0x48,0x65,0x72,0x6F,0x69,0x63, //heroic_tab_title 0x48,0x00, //unknown37 0x32,0x00,0x00,0x00, //max_heroic_aa 0xC0,0x6B,0xFC,0x3C, //heroic_id 0x01, //heroic_dov_req 0x00,0x00,0x00,0x00, //num_heroic_items 0x10,0x00,0x00,0x00, //unknown40 0x00,0x00,0x00,0x00, //heroic_points_spent 0x00,0x00,0x3B,0x81,0x03,0x00, //unknown41 0x00,0x00,0x00, //unknown42 0x00,0x00, //unknown43 0x00,0x00,0x00,0x00, //unknown44 0x00,0x00, //unknown45 0x00,0x00,0x00,0x00,0x00,0x00, //unknown46 0x0A,0x00,0x54,0x72,0x61,0x64,0x65,0x73,0x6B,0x69,0x6C,0x6C, //tradeskill_tab_title 0x49,0x00, //unknown47 0x28,0x00,0x00,0x00, //max_tradeskill_aa 0x1E,0xDB,0x41,0x2F, //tradeskill_id 0x00, //exp_req 0x00,0x00,0x00,0x00, //num_tradeskill_items 0x00,0x00,0x00,0x00, //unknown50 0x00,0x00,0x00,0x00, //tradeskill_points_spent 0x00,0x00,0x3B,0x81,0x03,0x00, //unknown51 0x00,0x00,0x00, //unknown52 0x00,0x00, //unknown53 0x00,0x00,0x00,0x00, //unknown54 0x00,0x00, //unknown55 0x03,0x00,0x00,0x00,0x00,0x00, //unknown56 0x08,0x00,0x50,0x72,0x65,0x73,0x74,0x69,0x67,0x65, //prestige_tab_title 0x67,0x00, //unknown57 0x19,0x00,0x00,0x00, //max_prestige_aa 0xC6,0xA8,0x83,0xBD, //prestige_id 0x01, //prestige_dov_req 0x00,0x00,0x00,0x00, //num_prestige_items 0x10,0x00,0x00,0x00, //unknown60 0x00,0x00,0x00,0x00, //prestige_points_spent 0x00,0x00,0x3B,0x81,0x03,0x06, //unknown61 0x00,0x00,0x00, //unknown62 0x1D,0x00,0x3A,0x34,0x39,0x33,0x64,0x65,0x62,0x62,0x33,0x65,0x36,0x37,0x38,0x62,0x39,0x37,0x37,0x5F,0x35,0x35,0x3A,0x50,0x72,0x65,0x73,0x74,0x69,0x67,0x65, //unknown63 0x01,0x00,0x00,0x00, //unknown64 0x27,0x00,0x3A,0x34,0x39,0x33,0x64,0x65,0x62,0x62,0x33,0x65,0x36,0x61,0x38,0x62,0x62,0x37,0x39,0x5F,0x31,0x32,0x3A,0x50,0x72,0x65,0x73,0x74,0x69,0x67,0x65,0x20,0x45,0x78,0x70,0x65,0x72,0x74,0x69,0x73,0x65, //unknown65 0x02,0x00,0x00,0x00,0x00,0x00, //unknown66 0x13,0x00,0x54,0x72,0x61,0x64,0x65,0x73,0x6B,0x69,0x6C,0x6C,0x20,0x50,0x72,0x65,0x73,0x74,0x69,0x67,0x65, //tradeskill_prestige_tab_title 0x79,0x00, //unknown67 0x19,0x00,0x00,0x00, //max_tradeskill_prestige_aa 0x18,0x2C,0x0B,0x74, //tradeskill_prestige_id 0x01, //coe_req 0x00,0x00,0x00,0x00, //num_tradeskill_prestige_items 0x12,0x00,0x00,0x00, //unknown70 0x00,0x00,0x00,0x00, //tradeskill_prestige_points_spent 0x00,0x00,0x3B,0x81,0x03,0x00, //unknown71 0x00,0x00,0x00, //unknown72 0x00,0x00, //unknown73 0x00,0x00,0x00,0x00, //unknown74 0x00,0x00, //unknown75 0x04,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00, //unknown76 0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //unknown77 0x01, //num_templates 0x64, //template_unknown1 0x03,0x00,0x4E,0x65,0x77, //template_name 0x00, //template_unknown2 0x00,0x00}; //num_tabs return (new EQ2Packet(OP_AdventureList, blah, sizeof(blah))); } struct AAEntry { int8 template_id; int8 tab_id; int32 aa_id; int16 order; int8 treeid; }; void MasterAAList::DisplayAA(Client* client,int8 newtemplate,int8 changemode) { map AAtree_id; map >::iterator itr_tree2; vector::iterator itr_tree3; map > Nodes; vector TreeNodeList = master_tree_nodes.GetTreeNodes(); if (TreeNodeList.size() == 0) return; vector > > AAEntryList ; Query query; MYSQL_ROW row; int32 Pid = client->GetCharacterID(); AAEntryList.resize(8); // max number of templates for (int i = 0; i < 8; i++) { AAEntryList[i].resize(5); // max number of tabs } // load templates 1-3 Personal MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT `template_id`,`tab_id`,`aa_id`,`order`,treeid FROM character_aa_defaults where class = %i order by `order`", client->GetPlayer()->GetAdventureClass()); while (result && (row = mysql_fetch_row(result))) { AAEntry newentry; newentry.template_id = strtoul(row[0], NULL, 0); newentry.tab_id = strtoul(row[1], NULL, 0); newentry.aa_id = strtoul(row[2], NULL, 0); newentry.order = strtoul(row[3], NULL, 0); newentry.treeid = strtoul(row[4], NULL, 0); AAEntryList[newentry.template_id][newentry.tab_id].push_back(newentry); } LogWrite(SPELL__INFO, 0, "AA", "Loaded %u AA Tree Nodes", AAEntryList.size()); // load tmplates 4-6 Server MYSQL_RES* result2 = query.RunQuery2(Q_SELECT, "SELECT `template_id`,`tab_id`,`aa_id`,`order`,treeid FROM character_aa where char_id = %i order by `order`", client->GetCharacterID()); while (result2 && (row = mysql_fetch_row(result2))) { AAEntry newentry; newentry.template_id = strtoul(row[0], NULL, 0); newentry.tab_id = strtoul(row[1], NULL, 0); newentry.aa_id = strtoul(row[2], NULL, 0); newentry.order = strtoul(row[3], NULL, 0); newentry.treeid = strtoul(row[4], NULL, 0); AAEntryList[newentry.template_id][newentry.tab_id].push_back(newentry); } LogWrite(SPELL__INFO, 0, "AA", "Loaded %u AA Tree Nodes", AAEntryList.size()); for (int x = 0; x < TreeNodeList.size(); x++) { int8 class_id = client->GetPlayer()->GetInfoStruct()->get_class3(); if (TreeNodeList[x]->classID == class_id) { itr_tree2 = Nodes.lower_bound(TreeNodeList[x]->classID); if (itr_tree2 != Nodes.end() && !(Nodes.key_comp()(TreeNodeList[x]->classID, itr_tree2->first))) { (itr_tree2->second).push_back(TreeNodeList[x]); LogWrite(SPELL__TRACE, 0, "AA", "Added AA Tree node ID: %u", TreeNodeList[x]->treeID); } else { vector tmpVec; tmpVec.push_back(TreeNodeList[x]); Nodes.insert(make_pair(TreeNodeList[x]->classID, tmpVec)); LogWrite(SPELL__TRACE, 0, "AA", "Added AA Tree node ID: %u", TreeNodeList[x]->treeID); } } } map >::iterator itr2; vector::iterator itr3; map > ClassTab; map > SubclassTab; map > ShadowsTab; map > HeroicTab; map > TradeskillTab; map > PrestigeTab; map > TradeskillPrestigeTab; map > DragonTab; map > DragonclassTab; map > FarseasTab; MMasterAAList.readlock(__FUNCTION__, __LINE__); // Get Tree Node ID's map node_id; map classid; for (itr_tree2 = Nodes.begin(); itr_tree2 != Nodes.end(); itr_tree2++) { int8 x = 0; for (itr_tree3 = itr_tree2->second.begin(); itr_tree3 != itr_tree2->second.end(); itr_tree3++, x++ ) { node_id[x] = (*itr_tree3)->treeID; classid[(*itr_tree3)->treeID] = (*itr_tree3)->AAtreeID; } } int rrr = 0; for (int i =0; i < Size(); i++) { if (AAList[i]->group == node_id[AA_CLASS]) { itr2 = ClassTab.lower_bound(AAList[i]->group); if (itr2 != ClassTab.end() && !(ClassTab.key_comp()(AAList[i]->group, itr2->first))) { (itr2->second).push_back(AAList[i]); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } else { vector tmpVec; tmpVec.push_back(AAList[i]); ClassTab.insert(make_pair(AAList[i]->group, tmpVec)); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } } // Sort for Subclass Tab if (AAList[i]->group == node_id[AA_SUBCLASS]) { itr2 = SubclassTab.lower_bound(AAList[i]->group); if (itr2 != SubclassTab.end() && !(SubclassTab.key_comp()(AAList[i]->group, itr2->first))) { (itr2->second).push_back(AAList[i]); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } else { vector tmpVec; tmpVec.push_back(AAList[i]); SubclassTab.insert(make_pair(AAList[i]->group, tmpVec)); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } } // Sort for Shadows Tab if (AAList[i]->group == node_id[AA_SHADOW]) { itr2 = ShadowsTab.lower_bound(AAList[i]->group); if (itr2 != ShadowsTab.end() && !(ShadowsTab.key_comp()(AAList[i]->group, itr2->first))) { (itr2->second).push_back(AAList[i]); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } else { vector tmpVec; tmpVec.push_back(AAList[i]); ShadowsTab.insert(make_pair(AAList[i]->group, tmpVec)); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } } // Sort for Heroic Tab if (AAList[i]->group == node_id[AA_HEROIC]) { itr2 = HeroicTab.lower_bound(AAList[i]->group); if (itr2 != HeroicTab.end() && !(HeroicTab.key_comp()(AAList[i]->group, itr2->first))) { (itr2->second).push_back(AAList[i]); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } else { vector tmpVec; tmpVec.push_back(AAList[i]); HeroicTab.insert(make_pair(AAList[i]->group, tmpVec)); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } } // Sort for Tradeskill Tab if (AAList[i]->group == node_id[AA_TRADESKILL]) { itr2 = TradeskillTab.lower_bound(AAList[i]->group); if (itr2 != TradeskillTab.end() && !(TradeskillTab.key_comp()(AAList[i]->group, itr2->first))) { (itr2->second).push_back(AAList[i]); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } else { vector tmpVec; tmpVec.push_back(AAList[i]); TradeskillTab.insert(make_pair(AAList[i]->group, tmpVec)); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } } // Sort for Prestige Tab if (AAList[i]->group == node_id[AA_PRESTIGE]) { itr2 = PrestigeTab.lower_bound(AAList[i]->group); if (itr2 != PrestigeTab.end() && !(PrestigeTab.key_comp()(AAList[i]->group, itr2->first))) { (itr2->second).push_back(AAList[i]); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } else { vector tmpVec; tmpVec.push_back(AAList[i]); PrestigeTab.insert(make_pair(AAList[i]->group, tmpVec)); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } } // Sort for TradeskillPrestige Tab if (AAList[i]->group == node_id[AA_TRADESKILL_PRESTIGE]) { itr2 = TradeskillPrestigeTab.lower_bound(AAList[i]->group); if (itr2 != TradeskillPrestigeTab.end() && !(TradeskillPrestigeTab.key_comp()(AAList[i]->group, itr2->first))) { (itr2->second).push_back(AAList[i]); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } else { vector tmpVec; tmpVec.push_back(AAList[i]); TradeskillPrestigeTab.insert(make_pair(AAList[i]->group, tmpVec)); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } } // Sort for Dragon Tab if (AAList[i]->group == node_id[AA_DRAGON]) { itr2 = DragonTab.lower_bound(AAList[i]->group); if (itr2 != DragonTab.end() && !(DragonTab.key_comp()(AAList[i]->group, itr2->first))) { (itr2->second).push_back(AAList[i]); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } else { vector tmpVec; tmpVec.push_back(AAList[i]); DragonTab.insert(make_pair(AAList[i]->group, tmpVec)); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } } // Sort for Dragon Class Tab if (AAList[i]->group == node_id[AA_DRAGONCLASS]) { itr2 = DragonclassTab.lower_bound(AAList[i]->group); if (itr2 != DragonclassTab.end() && !(DragonclassTab.key_comp()(AAList[i]->group, itr2->first))) { (itr2->second).push_back(AAList[i]); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } else { vector tmpVec; tmpVec.push_back(AAList[i]); DragonclassTab.insert(make_pair(AAList[i]->group, tmpVec)); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } } // Sort for Farseas Tab if (AAList[i]->group == node_id[AA_FARSEAS]) { itr2 = FarseasTab.lower_bound(AAList[i]->group); if (itr2 != FarseasTab.end() && !(FarseasTab.key_comp()(AAList[i]->group, itr2->first))) { (itr2->second).push_back(AAList[i]); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } else { vector tmpVec; tmpVec.push_back(AAList[i]); FarseasTab.insert(make_pair(AAList[i]->group, tmpVec)); LogWrite(SPELL__TRACE, 0, "AA", "Added...%u ", AAList[i]->spellID); } } } MMasterAAList.releasereadlock(__FUNCTION__, __LINE__); int16 version = 0; int8 class_num_items = 0; int8 subclass_num_items = 0; int8 shadows_num_items = 0; int8 heroic_num_items = 0; int8 tradeskill_num_items = 0; int8 prestige_num_items = 0; int8 tradeskillprestige_num_items = 0; int8 dragon_num_items = 0; int8 dragonclass_num_items = 0; int8 farseas_num_items = 0; int8 index = 0; Spell* spell = 0; int8 current_rank = 0; int32 class_node_id = 0; if (client) version = client->GetVersion(); PacketStruct* packet = configReader.getStruct("WS_AdventureList", version); if (version >= 58617) { packet->setDataByName("num_aa_trees", 10);// number of AA tabs } else if (version >= 1193) { packet->setDataByName("num_aa_trees", 7);// number of AA tabs } else if (version >= 1096) { packet->setDataByName("num_aa_trees", 4);// number of AA tabs } // since we do not have a proper way of supporting 3 levels of nested arrays the first array is manual here and not looped //__________________________________________________________START OF CLASS TREE____________________________________________________________________________________ // Get the value for num_class_items based on size of ClassTab vector for (itr2 = ClassTab.begin(); itr2 != ClassTab.end(); itr2++) { class_num_items += (itr2->second).size(); } LogWrite(SPELL__DEBUG, 0, "AA", "ClassTab Size...%i ", class_num_items); index = 0; packet->setDataByName("class_tab_title", classes.GetClassNameCase(classes.GetSecondaryBaseClass(client->GetPlayer()->GetAdventureClass())).c_str()); packet->setDataByName("class_tree_node_id", node_id[AA_CLASS]); packet->setDataByName("class_max_aa", rule_manager.GetGlobalRule(R_Player, MaxClassAA)->GetInt32()); int32 class_id = TreeNodeList[node_id[AA_CLASS]]->AAtreeID; class_id = classid[node_id[AA_CLASS]]; packet->setDataByName("class_id", classid[node_id[AA_CLASS]]); packet->setDataByName("class_kos_req", 0); packet->setArrayLengthByName("class_num_items", class_num_items,0); for (itr2 = ClassTab.begin(); itr2 != ClassTab.end(); itr2++) { for (itr3 = itr2->second.begin(); itr3 != itr2->second.end(); itr3++, index++) { spell = master_spell_list.GetSpell((*itr3)->spellID, (*itr3)->tier); current_rank = client->GetPlayer()->GetSpellTier((*itr3)->spellID); if (index == 0) class_node_id = (*itr3)->spellID; //if (spell) { packet->setArrayDataByName("class_parent_id", (*itr3)->rankPrereqID, index); packet->setArrayDataByName("class_req_tier", (*itr3)->rankPrereq, index); packet->setArrayDataByName("class_spell_id", (*itr3)->spellID, index); int myrank = (current_rank == 0 ? 0 : (current_rank >= (*itr3)->maxRank) ? 2 : 1); packet->setArrayDataByName("class_active", (current_rank == 0 ? 0 : (current_rank >= (*itr3)->maxRank) ? 2 : 1), index); //1= have tier >= 1; 3 = not available for selection; 0 available for selection packet->setArrayDataByName("class_spell_name", (*itr3)->name.c_str(), index); packet->setArrayDataByName("class_spell_description", (*itr3)->description.c_str(), index); packet->setArrayDataByName("class_icon", (*itr3)->icon, index); packet->setArrayDataByName("class_icon2",(*itr3)->icon2, index); packet->setArrayDataByName("class_current_rank", current_rank, index); // TODO: need to get this value from the DB packet->setArrayDataByName("class_max_rank", (*itr3)->maxRank , index); packet->setArrayDataByName("class_rank_cost", (*itr3)->rankCost, index); packet->setArrayDataByName("class_min_lev", (*itr3)->min_level, index); packet->setSubArrayLengthByName("class_unknown5_numitems", 0,index, 0); //packet->setSubArrayDataByName("class_unknown5", 308397057, index, 0); //packet->setSubArrayDataByName("class_unknown5", 3215564363, index, 1); //packet->setSubArrayDataByName("class_unknown5", 445192837, index, 2); //packet->setSubArrayDataByName("class_unknown5", 3345493294, index, 3); //packet->setSubArrayDataByName("class_unknown5", 696953971, index, 4); packet->setArrayDataByName("class_unknown6", 4294967295, index); packet->setArrayDataByName("class_unknown7", 1, index); packet->setArrayDataByName("class_classification1", (*itr3)->class_name.c_str(), index); packet->setArrayDataByName("class_points_req", (*itr3)->req_points, index); packet->setArrayDataByName("class_unknown8", 0, index); packet->setArrayDataByName("class_classification2", (*itr3)->subclass_name.c_str(), index); packet->setArrayDataByName("class_col", (*itr3)->col, index); packet->setArrayDataByName("class_row", (*itr3)->row, index); packet->setArrayDataByName("class_line_title", (*itr3)->line_title.c_str(), index); packet->setArrayDataByName("class_unknown9", ((*itr3)->title_level > 0 ? 258 : 0 ), index); packet->setArrayDataByName("class_points_to_unlock", (*itr3)->req_tree_points, index); packet->setArrayDataByName("class_unknown9b", current_rank, index);// aom //} //else //LogWrite(SPELL__ERROR, 0, "AltAdvancement","Could not find Spell ID %u and Tier %i in Master Spell List", (*itr3)->spellID, (*itr3)->tier); } } packet->setDataByName("class_points_spent", 11); if (version >= 58617) { packet->setDataByName("class_unknown10", 11); packet->setDataByName("class_unknown11a", 0); packet->setDataByName("class_unknown11b", 0); packet->setDataByName("class_unknown11c", 1); } else if (version >= 1193) { packet->setDataByName("class_unknown10", 11); packet->setDataByName("class_unknown11", 0, 0); packet->setDataByName("class_unknown11", 1, 1); packet->setDataByName("class_unknown11", 1, 2); } else if (version >= 1096) { packet->setDataByName("class_unknown10", 11); packet->setDataByName("class_unknown11", 0, 0); packet->setDataByName("class_unknown11", 0, 1); packet->setDataByName("class_unknown11", 1, 2); packet->setDataByName("class_unknown11", 0, 3); packet->setDataByName("class_unknown11", 1, 4); } else { // this will change if there is ever a lower client supported packet->setDataByName("class_unknown10", 11); packet->setDataByName("class_unknown11", 0, 0); packet->setDataByName("class_unknown11", 0, 1); packet->setDataByName("class_unknown11", 1, 2); packet->setDataByName("class_unknown11", 0, 3); packet->setDataByName("class_unknown11", 1, 4); } //__________________________________________________________START OF SUBCLASS TREE____________________________________________________________________________________ // Get the value for num_class_items based on size of SubclassTab vector for (itr2 = SubclassTab.begin(); itr2 != SubclassTab.end(); itr2++) { subclass_num_items += (itr2->second).size(); } LogWrite(SPELL__DEBUG, 0, "AA", "SubclassTab Size...%i ", subclass_num_items); index = 0; packet->setDataByName("subclass_tab_title", classes.GetClassNameCase(client->GetPlayer()->GetAdventureClass()).c_str()); packet->setDataByName("subclass_tree_node_id", node_id[AA_SUBCLASS]); packet->setDataByName("subclass_max_aa", rule_manager.GetGlobalRule(R_Player, MaxSubclassAA)->GetInt32()); int32 unknown3 = TreeNodeList[node_id[AA_SUBCLASS]]->AAtreeID; packet->setDataByName("subclass_id", classid[node_id[AA_SUBCLASS]]); packet->setDataByName("subclass_eof_req", 0); packet->setArrayLengthByName("subclass_num_items", subclass_num_items, 0); for (itr2 = SubclassTab.begin(); itr2 != SubclassTab.end(); itr2++) { for (itr3 = itr2->second.begin(); itr3 != itr2->second.end(); itr3++, index++) { //spell = master_spell_list.GetSpell((*itr3)->spellID, (*itr3)->tier); //current_rank = client->GetPlayer()->GetSpellTier((*itr3)->spellID); if (index == 0) class_node_id = (*itr3)->spellID; //if (spell) { packet->setArrayDataByName("subclass_parent_id", (*itr3)->rankPrereqID, index); packet->setArrayDataByName("subclass_req_tier", (*itr3)->rankPrereq, index); packet->setArrayDataByName("subclass_spell_id", (*itr3)->spellID, index); packet->setArrayDataByName("subclass_active", (current_rank == 0 ? 0 : (current_rank >= (*itr3)->maxRank) ? 2 : 1), index); packet->setArrayDataByName("subclass_spell_name", (*itr3)->name.c_str(), index); packet->setArrayDataByName("subclass_spell_description", (*itr3)->description.c_str(), index); packet->setArrayDataByName("subclass_icon", (*itr3)->icon, index); packet->setArrayDataByName("subclass_icon2", (*itr3)->icon2, index); packet->setArrayDataByName("subclass_current_rank", current_rank, index); // TODO: need to get this value from the DB packet->setArrayDataByName("subclass_max_rank", (*itr3)->maxRank, index); packet->setArrayDataByName("subclass_rank_cost", (*itr3)->rankCost, index); packet->setArrayDataByName("subclass_min_lev", (*itr3)->min_level, index); packet->setSubArrayLengthByName("subclass_unknown5_numitems", 0,index,0); //packet->setSubArrayDataByName("subclass_unknown5", 308397057, index, 0); //packet->setSubArrayDataByName("subclass_unknown5", 3215564363, index, 1); //packet->setSubArrayDataByName("subclass_unknown5", 445192837, index, 2); //packet->setSubArrayDataByName("subclass_unknown5", 3345493294, index, 3); //packet->setSubArrayDataByName("subclass_unknown5", 696953971, index, 4); packet->setArrayDataByName("subclass_unknown6", 4294967295, index); packet->setArrayDataByName("subclass_unknown7", 1, index); packet->setArrayDataByName("subclass_classification1", (*itr3)->class_name.c_str(), index); packet->setArrayDataByName("subclass_points_req", (*itr3)->req_points, index); packet->setArrayDataByName("subclass_unknown8", 0, index); packet->setArrayDataByName("subclass_classification2", (*itr3)->subclass_name.c_str(), index); packet->setArrayDataByName("subclass_col", (*itr3)->col, index); packet->setArrayDataByName("subclass_row", (*itr3)->row, index); packet->setArrayDataByName("subclass_line_title", (*itr3)->line_title.c_str(), index); packet->setArrayDataByName("subclass_unknown9", ((*itr3)->title_level > 0 ? 258 : 0), index); packet->setArrayDataByName("subclass_points_to_unlock", (*itr3)->req_tree_points, index); packet->setArrayDataByName("subclass_unknown9b", 0, index); //added with 68617 AOM something to do with points //} //else //LogWrite(SPELL__ERROR, 0, "AltAdvancement","Could not find Spell ID %u and Tier %i in Master Spell List", (*itr3)->spellID, (*itr3)->tier); } } packet->setDataByName("subclass_points_spent", 12); // to change the 34 to a track value if (version >= 58617) { packet->setDataByName("subclass_unknown10", 12); packet->setDataByName("subclass_unknown11a", 0); packet->setDataByName("subclass_unknown11b", 50386); packet->setDataByName("subclass_unknown11c", 5123); packet->setDataByName("subclass_unknown12", 0, 0); packet->setDataByName("subclass_unknown12", 0, 1); packet->setDataByName("subclass_unknown12", 0, 2); packet->setDataByName("subclass_unknown13",":493debb3e678b977_91:test_unknown13");// this is based on class packet->setDataByName("subclass_unknown14", 1); packet->setDataByName("subclass_unknown15", ":ce1864c75f94a2d7_14:Expertise"); packet->setDataByName("subclass_unknown16", 0, 0); packet->setDataByName("subclass_unknown16", 0, 1); packet->setDataByName("subclass_unknown16", 0, 2); packet->setDataByName("subclass_unknown16", 0, 3); packet->setDataByName("subclass_unknown16", 0, 4); packet->setDataByName("subclass_unknown16", 0, 5); } else if (version >= 1193) { packet->setDataByName("subclass_unknown10", 12); packet->setDataByName("subclass_unknown11", 0, 0); packet->setDataByName("subclass_unknown11", 1, 1); packet->setDataByName("subclass_unknown11", 5123, 2); packet->setDataByName("subclass_unknown12", 0, 0); packet->setDataByName("subclass_unknown12", 0, 1); packet->setDataByName("subclass_unknown12", 0, 2); packet->setDataByName("subclass_unknown13", ":493debb3e678b977_91:test_unknown13");// this is based on class packet->setDataByName("subclass_unknown14", 1); packet->setDataByName("subclass_unknown15", ":ce1864c75f94a2d7_14:Expertise"); packet->setDataByName("subclass_unknown16", 111, 0); packet->setDataByName("subclass_unknown16", 108, 1); packet->setDataByName("subclass_unknown16", 108, 2); packet->setDataByName("subclass_unknown16", 1101, 3); packet->setDataByName("subclass_unknown16", 121, 4); packet->setDataByName("subclass_unknown16", 129, 5); } else if (version >= 1096) { packet->setDataByName("subclass_unknown10", 12); packet->setDataByName("subclass_unknown11", 0, 0); packet->setDataByName("subclass_unknown11", 0, 1); packet->setDataByName("subclass_unknown11", 1, 2); packet->setDataByName("subclass_unknown11", 0, 3); packet->setDataByName("subclass_unknown11", 3, 4); } else { // this will change if there is ever a lower client supported packet->setDataByName("subclass_unknown10", 12); packet->setDataByName("subclass_unknown11", 0, 0); packet->setDataByName("subclass_unknown11", 0, 1); packet->setDataByName("subclass_unknown11", 1, 2); packet->setDataByName("subclass_unknown11", 0, 3); packet->setDataByName("subclass_unknown11", 3, 4); } //__________________________________________________________START OF SHADOWS TREE____________________________________________________________________________________ for (itr2 = ShadowsTab.begin(); itr2 != ShadowsTab.end(); itr2++) { shadows_num_items += (itr2->second).size(); } LogWrite(SPELL__DEBUG, 0, "AA", "ShadowsTab Size...%i ", shadows_num_items); index = 0; packet->setDataByName("shadows_tab_title", "Shadows"); packet->setDataByName("shadows_tree_node_id", node_id[AA_SHADOW]); packet->setDataByName("shadows_max_aa", rule_manager.GetGlobalRule(R_Player, MaxShadowsAA)->GetInt32()); packet->setDataByName("shadows_id", classid[node_id[AA_SHADOW]]); packet->setDataByName("shadows_eof_req", 0); packet->setArrayLengthByName("shadows_num_items", shadows_num_items, 0); //packet->PrintPacket(); for (itr2 = ShadowsTab.begin(); itr2 != ShadowsTab.end(); itr2++) { for (itr3 = itr2->second.begin(); itr3 != itr2->second.end(); itr3++, index++) { spell = master_spell_list.GetSpell((*itr3)->spellID, (*itr3)->tier); current_rank = client->GetPlayer()->GetSpellTier((*itr3)->spellID); if (index == 0) class_node_id = (*itr3)->spellID; //if (spell) { packet->setArrayDataByName("shadows_parent_id", (*itr3)->rankPrereqID, index); packet->setArrayDataByName("shadows_req_tier", (*itr3)->rankPrereq, index); packet->setArrayDataByName("shadows_spell_id", (*itr3)->spellID, index); packet->setArrayDataByName("shadows_active", (current_rank == 0 ? 0 : (current_rank >= (*itr3)->maxRank) ? 2 : 1), index); packet->setArrayDataByName("shadows_spell_name", (*itr3)->name.c_str(), index); packet->setArrayDataByName("shadows_spell_description", (*itr3)->description.c_str(), index); packet->setArrayDataByName("shadows_icon", (*itr3)->icon, index); packet->setArrayDataByName("shadows_icon2", (*itr3)->icon2, index); packet->setArrayDataByName("shadows_current_rank", current_rank, index); // TODO: need to get this value from the DB packet->setArrayDataByName("shadows_max_rank", (*itr3)->maxRank, index); packet->setArrayDataByName("shadows_rank_cost", (*itr3)->rankCost, index); packet->setArrayDataByName("shadows_min_lev", (*itr3)->min_level, index); packet->setSubArrayLengthByName("shadows_unknown5_num_items", 0, index, 0); //packet->setSubArrayDataByName("shadows_unknown5", 308397057, index, 0); //packet->setSubArrayDataByName("shadows_unknown5", 3215564363, index, 1); //packet->setSubArrayDataByName("shadows_unknown5", 445192837, index, 2); //packet->setSubArrayDataByName("shadows_unknown5", 3345493294, index, 3); //packet->setSubArrayDataByName("shadows_unknown5", 696953971, index, 4); packet->setArrayDataByName("shadows_unknown6", 4294967295, index); packet->setArrayDataByName("shadows_unknown7", 1, index); packet->setArrayDataByName("shadows_classification1", (*itr3)->class_name.c_str(), index); packet->setArrayDataByName("shadows_points_req", (*itr3)->req_points, index); packet->setArrayDataByName("shadows_unknown8", 0, index); packet->setArrayDataByName("shadows_classification2", (*itr3)->subclass_name.c_str(), index); packet->setArrayDataByName("shadows_col", (*itr3)->col, index); packet->setArrayDataByName("shadows_row", (*itr3)->row, index); packet->setArrayDataByName("shadows_line_title", (*itr3)->line_title.c_str(), index); packet->setArrayDataByName("shadows_unknown9", ((*itr3)->title_level > 0 ? 258 : 0), index); packet->setArrayDataByName("shadows_points_to_unlock", (*itr3)->req_tree_points, index); packet->setArrayDataByName("shadows_unknown9b", 0, index); //} //else //LogWrite(SPELL__ERROR, 0, "AltAdvancement","Could not find Spell ID %u and Tier %i in Master Spell List", (*itr3)->spellID, (*itr3)->tier); } } packet->setDataByName("shadows_points_spent", 14); if (version >= 58617) { packet->setDataByName("shadows_unknown10", 14); packet->setDataByName("shadows_unknown11a", 0); packet->setDataByName("shadows_unknown11b", 50386); packet->setDataByName("shadows_unknown11c", 3); packet->setDataByName("shadows_unknown12", 0, 0); packet->setDataByName("shadows_unknown12", 0, 1); packet->setDataByName("shadows_unknown12", 0, 2); } else if (version >= 1193) { packet->setDataByName("shadows_unknown10", 14); packet->setDataByName("shadows_unknown11", 0, 0); packet->setDataByName("shadows_unknown11", 1, 1); packet->setDataByName("shadows_unknown11", 3, 2); packet->setDataByName("shadows_unknown12", 0, 0); packet->setDataByName("shadows_unknown12", 0, 1); packet->setDataByName("shadows_unknown12", 0, 2); } else if (version >= 1096) { packet->setDataByName("shadows_unknown11", 0, 0); packet->setDataByName("shadows_unknown11", 0, 1); packet->setDataByName("shadows_unknown11", 1, 2); packet->setDataByName("shadows_unknown11", 0, 3); packet->setDataByName("shadows_unknown11", 3, 4); } else { // this will change if there is ever a lower client supported packet->setDataByName("shadows_unknown11", 0, 0); packet->setDataByName("shadows_unknown11", 0, 1); packet->setDataByName("shadows_unknown11", 1, 2); packet->setDataByName("shadows_unknown11", 0, 3); packet->setDataByName("shadows_unknown11", 3, 4); packet->setDataByName("shadows_unknown12", 103, 0); packet->setDataByName("shadows_unknown12", 101, 1); packet->setDataByName("shadows_unknown12", 114, 2); packet->setDataByName("shadows_unknown14", 1835365408); packet->setDataByName("shadows_unknown16", 114, 0); packet->setDataByName("shadows_unknown16", 97, 1); packet->setDataByName("shadows_unknown16", 114, 2); packet->setDataByName("shadows_unknown16", 121, 3); packet->setDataByName("shadows_unknown16", 32, 4); packet->setDataByName("shadows_unknown16", 98, 5); } //__________________________________________________________START OF HEROIC TREE____________________________________________________________________________________ for (itr2 = HeroicTab.begin(); itr2 != HeroicTab.end(); itr2++) { heroic_num_items += (itr2->second).size(); } LogWrite(SPELL__DEBUG, 0, "AA", "HeroicTab Size...%i ", heroic_num_items); index = 0; packet->setDataByName("heroic_tab_title", "Heroic"); packet->setDataByName("heroic_tree_node_id", node_id[AA_HEROIC]); packet->setDataByName("heroic_max_aa", rule_manager.GetGlobalRule(R_Player, MaxHeroicAA)->GetInt32()); packet->setDataByName("heroic_id", classid[node_id[AA_HEROIC]]); packet->setDataByName("heroic_eof_req", 0); packet->setArrayLengthByName("heroic_num_items", heroic_num_items, 0); for (itr2 = HeroicTab.begin(); itr2 != HeroicTab.end(); itr2++) { for (itr3 = itr2->second.begin(); itr3 != itr2->second.end(); itr3++, index++) { //spell = master_spell_list.GetSpell((*itr3)->spellID, (*itr3)->tier); //current_rank = client->GetPlayer()->GetSpellTier((*itr3)->spellID); if (index == 0) class_node_id = (*itr3)->spellID; //if (spell) { packet->setArrayDataByName("heroic_parent_id", (*itr3)->rankPrereqID, index); packet->setArrayDataByName("heroic_req_tier", (*itr3)->rankPrereq, index); packet->setArrayDataByName("heroic_spell_id", (*itr3)->spellID, index); packet->setArrayDataByName("heroic_active", (current_rank == 0 ? 0 : (current_rank >= (*itr3)->maxRank) ? 2 : 1), index); packet->setArrayDataByName("heroic_spell_name", (*itr3)->name.c_str(), index); packet->setArrayDataByName("heroic_spell_description", (*itr3)->description.c_str(), index); packet->setArrayDataByName("heroic_icon", (*itr3)->icon, index); packet->setArrayDataByName("heroic_icon2", (*itr3)->icon2, index); packet->setArrayDataByName("heroic_current_rank", current_rank, index); // TODO: need to get this value from the DB packet->setArrayDataByName("heroic_max_rank", (*itr3)->maxRank, index); packet->setArrayDataByName("heroic_rank_cost", (*itr3)->rankCost, index); packet->setArrayDataByName("heroic_min_lev", (*itr3)->min_level, index); packet->setSubArrayLengthByName("heroic_unknown5_num_items", 0, index, 0); //packet->setSubArrayDataByName("heroic_unknown5", 308397057, index, 0); //packet->setSubArrayDataByName("heroic_unknown5", 3215564363, index, 1); //packet->setSubArrayDataByName("heroic_unknown5", 445192837, index, 2); //packet->setSubArrayDataByName("heroic_unknown5", 3345493294, index, 3); //packet->setSubArrayDataByName("heroic_unknown5", 696953971, index, 4); packet->setArrayDataByName("heroic_unknown6", 4294967295, index); packet->setArrayDataByName("heroic_unknown7", 1, index); packet->setArrayDataByName("heroic_classification1", (*itr3)->class_name.c_str(), index); packet->setArrayDataByName("heroic_points_req", (*itr3)->req_points, index); packet->setArrayDataByName("heroic_unknown8", 0, index); packet->setArrayDataByName("heroic_classification2", (*itr3)->subclass_name.c_str(), index); packet->setArrayDataByName("heroic_col", (*itr3)->col, index); packet->setArrayDataByName("heroic_row", (*itr3)->row, index); packet->setArrayDataByName("heroic_line_title", (*itr3)->line_title.c_str(), index); packet->setArrayDataByName("heroic_unknown9", ((*itr3)->title_level > 0 ? 258 : 0), index); packet->setArrayDataByName("heroic_points_to_unlock", (*itr3)->req_tree_points, index); packet->setArrayDataByName("heroic_unknown9b", 0, index); //} //else //LogWrite(SPELL__ERROR, 0, "AltAdvancement","Could not find Spell ID %u and Tier %i in Master Spell List", (*itr3)->spellID, (*itr3)->tier); } } packet->setDataByName("heroic_points_spent", 16); if (version >= 58617) { packet->setDataByName("heroic_unknown10", 16); packet->setDataByName("heroic_unknown11a", 0); packet->setDataByName("heroic_unknown11b", 50386); packet->setDataByName("heroic_unknown11c", 3); packet->setDataByName("heroic_unknown12", 0, 0); packet->setDataByName("heroic_unknown12", 0, 1); packet->setDataByName("heroic_unknown12", 0, 2); packet->setDataByName("heroic_unknown14", 0); packet->setDataByName("heroic_unknown16", 39, 0); packet->setDataByName("heroic_unknown16", 115, 1); packet->setDataByName("heroic_unknown16", 32, 2); packet->setDataByName("heroic_unknown16", 115, 3); packet->setDataByName("heroic_unknown16", 101, 4); packet->setDataByName("heroic_unknown16", 108, 5); } else if (version >= 1193) { packet->setDataByName("heroic_unknown10", 16); packet->setDataByName("heroic_unknown11", 0, 0); packet->setDataByName("heroic_unknown11", 1, 1); packet->setDataByName("heroic_unknown11", 3, 2); packet->setDataByName("heroic_unknown12", 0, 0); packet->setDataByName("heroic_unknown12", 0, 1); packet->setDataByName("heroic_unknown12", 0, 2); packet->setDataByName("heroic_unknown14", 0); packet->setDataByName("heroic_unknown16", 0, 0); packet->setDataByName("heroic_unknown16", 0, 1); packet->setDataByName("heroic_unknown16", 0, 2); packet->setDataByName("heroic_unknown16", 0, 3); packet->setDataByName("heroic_unknown16", 0, 4); packet->setDataByName("heroic_unknown16", 0, 5); } else if (version >= 1096) { packet->setDataByName("heroic_unknown11", 0, 0); packet->setDataByName("heroic_unknown11", 0, 1); packet->setDataByName("heroic_unknown11", 1, 2); packet->setDataByName("heroic_unknown11", 0, 3); packet->setDataByName("heroic_unknown11", 3, 4); } else { // this will change if there is ever a lower client supported packet->setDataByName("heroic_unknown11", 0, 0); packet->setDataByName("heroic_unknown11", 0, 1); packet->setDataByName("heroic_unknown11", 1, 2); packet->setDataByName("heroic_unknown11", 0, 3); packet->setDataByName("heroic_unknown11", 3, 4); } if (version >= 1193) { //__________________________________________________________START OF TRADESKILL TREE____________________________________________________________________________________ for (itr2 = TradeskillTab.begin(); itr2 != TradeskillTab.end(); itr2++) { tradeskill_num_items += (itr2->second).size(); } LogWrite(SPELL__DEBUG, 0, "AA", "TradeskillTab Size...%i ", tradeskill_num_items); index = 0; packet->setDataByName("tradeskill_tab_title", "Tradeskill"); packet->setDataByName("tradeskill_tree_node_id", node_id[AA_TRADESKILL]); packet->setDataByName("tradeskill_max_aa", rule_manager.GetGlobalRule(R_Player, MaxTradeskillAA)->GetInt32()); packet->setDataByName("tradeskill_id", classid[node_id[AA_TRADESKILL]]); packet->setDataByName("tradeskill_eof_req", 0); packet->setArrayLengthByName("tradeskill_num_items", tradeskill_num_items, 0); for (itr2 = TradeskillTab.begin(); itr2 != TradeskillTab.end(); itr2++) { for (itr3 = itr2->second.begin(); itr3 != itr2->second.end(); itr3++, index++) { //spell = master_spell_list.GetSpell((*itr3)->spellID, (*itr3)->tier); //current_rank = client->GetPlayer()->GetSpellTier((*itr3)->spellID); if (index == 0) class_node_id = (*itr3)->spellID; //if (spell) { packet->setArrayDataByName("tradeskill_parent_id", (*itr3)->rankPrereqID, index); packet->setArrayDataByName("tradeskill_req_tier", (*itr3)->rankPrereq, index); packet->setArrayDataByName("tradeskill_spell_id", (*itr3)->spellID, index); packet->setArrayDataByName("tradeskill_active", (current_rank == 0 ? 0 : (current_rank >= (*itr3)->maxRank) ? 2 : 1), index); packet->setArrayDataByName("tradeskill_spell_name", (*itr3)->name.c_str(), index); packet->setArrayDataByName("tradeskill_spell_description", (*itr3)->description.c_str(), index); packet->setArrayDataByName("tradeskill_icon", (*itr3)->icon, index); packet->setArrayDataByName("tradeskill_icon2", (*itr3)->icon2, index); packet->setArrayDataByName("tradeskill_current_rank", current_rank, index); // TODO: need to get this value from the DB packet->setArrayDataByName("tradeskill_max_rank", (*itr3)->maxRank, index); packet->setArrayDataByName("tradeskill_rank_cost", (*itr3)->rankCost, index); packet->setArrayDataByName("tradeskill_min_lev", (*itr3)->min_level, index); packet->setSubArrayLengthByName("tradeskill_unknown5_num_items", 0, index, 0); //packet->setSubArrayDataByName("tradeskill_unknown5", 308397057, index, 0); //packet->setSubArrayDataByName("tradeskill_unknown5", 3215564363, index, 1); //packet->setSubArrayDataByName("tradeskill_unknown5", 445192837, index, 2); //packet->setSubArrayDataByName("tradeskill_unknown5", 3345493294, index, 3); //packet->setSubArrayDataByName("tradeskill_unknown5", 696953971, index, 4); packet->setArrayDataByName("tradeskill_unknown6", 4294967295, index); packet->setArrayDataByName("tradeskill_unknown7", 0, index); packet->setArrayDataByName("tradeskill_classification1", (*itr3)->class_name.c_str(), index); packet->setArrayDataByName("tradeskill_points_req", (*itr3)->req_points, index); packet->setArrayDataByName("tradeskill_unknown8", 0, index); packet->setArrayDataByName("tradeskill_classification2", (*itr3)->subclass_name.c_str(), index); packet->setArrayDataByName("tradeskill_col", (*itr3)->col, index); packet->setArrayDataByName("tradeskill_row", (*itr3)->row, index); packet->setArrayDataByName("tradeskill_line_title", (*itr3)->line_title.c_str(), index); packet->setArrayDataByName("tradeskill_unknown9", ((*itr3)->title_level > 0 ? 258 : 0), index); packet->setArrayDataByName("tradeskill_points_to_unlock", (*itr3)->req_tree_points, index); packet->setArrayDataByName("tradeskill_unknown9b", 0, index); //} //else //LogWrite(SPELL__ERROR, 0, "AltAdvancement","Could not find Spell ID %u and Tier %i in Master Spell List", (*itr3)->spellID, (*itr3)->tier); } } packet->setDataByName("tradeskill_unknown10", 0); packet->setDataByName("tradeskill_points_spent", 22); if (version >= 58617) { packet->setDataByName("tradeskill_unknown10", 11); packet->setDataByName("tradeskill_unknown11a", 0); packet->setDataByName("tradeskill_unknown11b", 50386); packet->setDataByName("tradeskill_unknown11c", 3); packet->setDataByName("tradeskill_unknown12", 0, 0); packet->setDataByName("tradeskill_unknown12", 0, 1); packet->setDataByName("tradeskill_unknown12", 0, 2); packet->setDataByName("tradeskill_unknown14", 0); packet->setDataByName("tradeskill_unknown16", 3, 0); packet->setDataByName("tradeskill_unknown16", 0, 1); packet->setDataByName("tradeskill_unknown16", 0, 2); packet->setDataByName("tradeskill_unknown16", 0, 3); packet->setDataByName("tradeskill_unknown16", 0, 4); packet->setDataByName("tradeskill_unknown16", 0, 5); } else if (version >= 1193) { packet->setDataByName("tradeskill_unknown10", 0); packet->setDataByName("tradeskill_unknown11", 0, 0); packet->setDataByName("tradeskill_unknown11", 1, 1); packet->setDataByName("tradeskill_unknown11", 3, 2); packet->setDataByName("tradeskill_unknown12", 0, 0); packet->setDataByName("tradeskill_unknown12", 0, 1); packet->setDataByName("tradeskill_unknown12", 0, 2); packet->setDataByName("tradeskill_unknown14", 0); packet->setDataByName("tradeskill_unknown16", 3, 0); packet->setDataByName("tradeskill_unknown16", 0, 1); packet->setDataByName("tradeskill_unknown16", 0, 2); packet->setDataByName("tradeskill_unknown16", 0, 3); packet->setDataByName("tradeskill_unknown16", 0, 4); packet->setDataByName("tradeskill_unknown16", 0, 5); } //__________________________________________________________START OF PRESTIGE TREE____________________________________________________________________________________ for (itr2 = PrestigeTab.begin(); itr2 != PrestigeTab.end(); itr2++) { prestige_num_items += (itr2->second).size(); } LogWrite(SPELL__DEBUG, 0, "AA", "PrestigeTab Size...%i ", prestige_num_items); index = 0; packet->setDataByName("prestige_tab_title", "Prestige"); packet->setDataByName("prestige_tree_node_id", node_id[AA_PRESTIGE]); packet->setDataByName("prestige_max_aa", rule_manager.GetGlobalRule(R_Player, MaxPrestigeAA)->GetInt32()); packet->setDataByName("prestige_id", classid[node_id[AA_PRESTIGE]]); packet->setDataByName("prestige_eof_req", 0); packet->setArrayLengthByName("prestige_num_items", prestige_num_items, 0); for (itr2 = PrestigeTab.begin(); itr2 != PrestigeTab.end(); itr2++) { for (itr3 = itr2->second.begin(); itr3 != itr2->second.end(); itr3++, index++) { //spell = master_spell_list.GetSpell((*itr3)->spellID, (*itr3)->tier); //current_rank = client->GetPlayer()->GetSpellTier((*itr3)->spellID); if (index == 0) class_node_id = (*itr3)->spellID; //if (spell) { packet->setArrayDataByName("prestige_parent_id", (*itr3)->rankPrereqID, index); packet->setArrayDataByName("prestige_req_tier", (*itr3)->rankPrereq, index); packet->setArrayDataByName("prestige_spell_id", (*itr3)->spellID, index); packet->setArrayDataByName("prestige_active", (current_rank == 0 ? 0 : (current_rank >= (*itr3)->maxRank) ? 2 : 1), index); packet->setArrayDataByName("prestige_spell_name", (*itr3)->name.c_str(), index); packet->setArrayDataByName("prestige_spell_description", (*itr3)->description.c_str(), index); packet->setArrayDataByName("prestige_icon", (*itr3)->icon, index); packet->setArrayDataByName("prestige_icon2", (*itr3)->icon2, index); packet->setArrayDataByName("prestige_current_rank", current_rank, index); // TODO: need to get this value from the DB packet->setArrayDataByName("prestige_max_rank", (*itr3)->maxRank, index); packet->setArrayDataByName("prestige_rank_cost", (*itr3)->rankCost, index); packet->setArrayDataByName("prestige_min_lev", (*itr3)->min_level, index); packet->setSubArrayLengthByName("prestige_unknown5_num_items", 0, index, 0); //packet->setSubArrayDataByName("prestige_unknown5", 308397057, index, 0); //packet->setSubArrayDataByName("prestige_unknown5", 3215564363, index, 1); //packet->setSubArrayDataByName("prestige_unknown5", 445192837, index, 2); //packet->setSubArrayDataByName("prestige_unknown5", 3345493294, index, 3); //packet->setSubArrayDataByName("prestige_unknown5", 696953971, index, 4); packet->setArrayDataByName("prestige_unknown6", 4294967295, index); packet->setArrayDataByName("prestige_unknown7", 1, index); packet->setArrayDataByName("prestige_classification1", (*itr3)->class_name.c_str(), index); packet->setArrayDataByName("prestige_points_req", (*itr3)->req_points, index); packet->setArrayDataByName("prestige_unknown8", 0, index); packet->setArrayDataByName("prestige_classification2", (*itr3)->subclass_name.c_str(), index); packet->setArrayDataByName("prestige_col", (*itr3)->col, index); packet->setArrayDataByName("prestige_row", (*itr3)->row, index); packet->setArrayDataByName("prestige_line_title", (*itr3)->line_title.c_str(), index); packet->setArrayDataByName("prestige_unknown9", ((*itr3)->title_level > 0 ? 258 : 0), index); packet->setArrayDataByName("prestige_points_to_unlock", (*itr3)->req_tree_points, index); packet->setArrayDataByName("prestige_unknown9b", 0, index); //} //else //LogWrite(SPELL__ERROR, 0, "AltAdvancement","Could not find Spell ID %u and Tier %i in Master Spell List", (*itr3)->spellID, (*itr3)->tier); } } packet->setDataByName("prestige_points_spent", 34); if (version >= 58617) { packet->setDataByName("prestige_unknown10", 16); packet->setDataByName("prestige_unknown11a", 0); packet->setDataByName("prestige_unknown11b", 50386); packet->setDataByName("prestige_unknown11c", 1539); packet->setDataByName("prestige_unknown12", 0, 0); packet->setDataByName("prestige_unknown12", 0, 1); packet->setDataByName("prestige_unknown12", 0, 2); packet->setDataByName("prestige_unknown13", ":493debb3e678b977_91:Prestige"); packet->setDataByName("prestige_unknown14", 1); packet->setDataByName("prestige_unknown15", ":493debb3e6a8bb79_20:Prestige Expertise"); packet->setDataByName("prestige_unknown16", 2, 0); packet->setDataByName("prestige_unknown16", 0, 1); packet->setDataByName("prestige_unknown16", 0, 2); packet->setDataByName("prestige_unknown16", 0, 3); packet->setDataByName("prestige_unknown16", 0, 4); packet->setDataByName("prestige_unknown16", 0, 5); } else if (version >= 1193) { packet->setDataByName("prestige_unknown10", 16); packet->setDataByName("prestige_unknown11", 0, 0); packet->setDataByName("prestige_unknown11", 1, 1); packet->setDataByName("prestige_unknown11", 1539, 2); packet->setDataByName("prestige_unknown12", 0, 0); packet->setDataByName("prestige_unknown12", 0, 1); packet->setDataByName("prestige_unknown12", 0, 2); packet->setDataByName("prestige_unknown13", ":493debb3e678b977_91:Prestige"); packet->setDataByName("prestige_unknown14", 1); packet->setDataByName("prestige_unknown15", ":493debb3e6a8bb79_20:Prestige Expertise"); packet->setDataByName("prestige_unknown16", 2, 0); packet->setDataByName("prestige_unknown16", 0, 1); packet->setDataByName("prestige_unknown16", 0, 2); packet->setDataByName("prestige_unknown16", 0, 3); packet->setDataByName("prestige_unknown16", 0, 4); packet->setDataByName("prestige_unknown16", 0, 5); } //__________________________________________________________START OF TRADESKILL PRESTIGE TREE____________________________________________________________________________________ for (itr2 = TradeskillPrestigeTab.begin(); itr2 != TradeskillPrestigeTab.end(); itr2++) { tradeskillprestige_num_items += (itr2->second).size(); } LogWrite(SPELL__DEBUG, 0, "AA", "TradeskillPrestigeTab Size...%i ", tradeskillprestige_num_items); index = 0; if (version >= 58617) { packet->setDataByName("tradeskillprestige_tab_title", "General"); } else { packet->setDataByName("tradeskillprestige_tab_title", "Tradeskill Prestige"); } packet->setDataByName("tradeskillprestige_tree_node_id", node_id[AA_TRADESKILL_PRESTIGE]); packet->setDataByName("tradeskillprestige_max_aa", rule_manager.GetGlobalRule(R_Player, MaxPrestigeAA)->GetInt32()); packet->setDataByName("tradeskillprestige_id", classid[node_id[AA_TRADESKILL_PRESTIGE]]); packet->setDataByName("tradeskillprestige_eof_req", 0); packet->setArrayLengthByName("tradeskillprestige_num_items", tradeskillprestige_num_items, 0); for (itr2 = PrestigeTab.begin(); itr2 != PrestigeTab.end(); itr2++) { for (itr3 = itr2->second.begin(); itr3 != itr2->second.end(); itr3++, index++) { //spell = master_spell_list.GetSpell((*itr3)->spellID, (*itr3)->tier); //current_rank = client->GetPlayer()->GetSpellTier((*itr3)->spellID); if (index == 0) class_node_id = (*itr3)->spellID; //if (spell) { packet->setArrayDataByName("tradeskillprestige_parent_id", (*itr3)->rankPrereqID, index); packet->setArrayDataByName("tradeskillprestige_req_tier", (*itr3)->rankPrereq, index); packet->setArrayDataByName("tradeskillprestige_spell_id", (*itr3)->spellID, index); packet->setArrayDataByName("tradeskillprestige_active", (current_rank == 0 ? 0 : (current_rank >= (*itr3)->maxRank) ? 2 : 1), index); packet->setArrayDataByName("tradeskillprestige_spell_name", (*itr3)->name.c_str(), index); packet->setArrayDataByName("tradeskillprestige_spell_description", (*itr3)->description.c_str(), index); packet->setArrayDataByName("tradeskillprestige_icon", (*itr3)->icon, index); packet->setArrayDataByName("tradeskillprestige_icon2", (*itr3)->icon2, index); packet->setArrayDataByName("tradeskillprestige_current_rank", current_rank, index); // TODO: need to get this value from the DB packet->setArrayDataByName("tradeskillprestige_max_rank", (*itr3)->maxRank, index); packet->setArrayDataByName("tradeskillprestige_rank_cost", (*itr3)->rankCost, index); packet->setArrayDataByName("tradeskillprestige_min_lev", (*itr3)->min_level, index); packet->setSubArrayLengthByName("tradeskillprestige_unknown5_num_items", 0, index, 0); //packet->setSubArrayDataByName("tradeskillprestige_unknown5", 308397057, index, 0); //packet->setSubArrayDataByName("tradeskillprestige_unknown5", 3215564363, index, 1); //packet->setSubArrayDataByName("tradeskillprestige_unknown5", 445192837, index, 2); //packet->setSubArrayDataByName("tradeskillprestige_unknown5", 3345493294, index, 3); //packet->setSubArrayDataByName("tradeskillprestige_unknown5", 696953971, index, 4); packet->setArrayDataByName("tradeskillprestige_unknown6", 4294967295, index); packet->setArrayDataByName("tradeskillprestige_unknown7", 1, index); packet->setArrayDataByName("tradeskillprestige_classification1", (*itr3)->class_name.c_str(), index); packet->setArrayDataByName("tradeskillprestige_points_req", (*itr3)->req_points, index); packet->setArrayDataByName("tradeskillprestige_unknown8", 0, index); packet->setArrayDataByName("tradeskillprestige_classification2", (*itr3)->subclass_name.c_str(), index); packet->setArrayDataByName("tradeskillprestige_col", (*itr3)->col, index); packet->setArrayDataByName("tradeskillprestige_row", (*itr3)->row, index); packet->setArrayDataByName("tradeskillprestige_line_title", (*itr3)->line_title.c_str(), index); packet->setArrayDataByName("tradeskillprestige_unknown9", ((*itr3)->title_level > 0 ? 258 : 0), index); packet->setArrayDataByName("tradeskillprestige_points_to_unlock", (*itr3)->req_tree_points, index); packet->setArrayDataByName("tradeskillprestige_unknown9b", 0, index); //} //else //LogWrite(SPELL__ERROR, 0, "AltAdvancement","Could not find Spell ID %u and Tier %i in Master Spell List", (*itr3)->spellID, (*itr3)->tier); } } packet->setDataByName("tradeskillprestige_points_spent", 18); if (version >= 58617) { packet->setDataByName("tradeskillprestige_unknown10", 18); packet->setDataByName("tradeskillprestige_unknown11a", 0); packet->setDataByName("tradeskillprestige_unknown11b", 50386); packet->setDataByName("tradeskillprestige_unknown11c", 3); packet->setDataByName("tradeskillprestige_unknown12", 0, 0); packet->setDataByName("tradeskillprestige_unknown12", 0, 1); packet->setDataByName("tradeskillprestige_unknown12", 0, 2); packet->setDataByName("tradeskillprestige_unknown14", 0); packet->setDataByName("tradeskillprestige_unknown16", 4, 0); packet->setDataByName("tradeskillprestige_unknown16", 0, 1); packet->setDataByName("tradeskillprestige_unknown16", 0, 2); packet->setDataByName("tradeskillprestige_unknown16", 0, 3); packet->setDataByName("tradeskillprestige_unknown16", 0, 4); packet->setDataByName("tradeskillprestige_unknown16", 0, 5); } else if (version >= 1193) { packet->setDataByName("tradeskillprestige_unknown10", 16); packet->setDataByName("tradeskillprestige_unknown11", 0, 0); packet->setDataByName("tradeskillprestige_unknown11", 1, 1); packet->setDataByName("tradeskillprestige_unknown11", 3, 2); packet->setDataByName("tradeskillprestige_unknown12", 0, 0); packet->setDataByName("tradeskillprestige_unknown12", 0, 1); packet->setDataByName("tradeskillprestige_unknown12", 0, 2); packet->setDataByName("tradeskillprestige_unknown16", 4, 0); packet->setDataByName("tradeskillprestige_unknown16", 0, 1); packet->setDataByName("tradeskillprestige_unknown16", 0, 2); packet->setDataByName("tradeskillprestige_unknown16", 0, 3); packet->setDataByName("tradeskillprestige_unknown16", 0, 4); packet->setDataByName("tradeskillprestige_unknown16", 0, 5); } } if (version >= 58617) { //__________________________________________________________START OF DRAGON TREE____________________________________________________________________________________ for (itr2 = DragonTab.begin(); itr2 != DragonTab.end(); itr2++) { dragon_num_items += (itr2->second).size(); } LogWrite(SPELL__DEBUG, 0, "AA", "DragonTab Size...%i ", dragon_num_items); index = 0; packet->setDataByName("dragon_tab_title", "Dragon"); packet->setDataByName("dragon_tree_node_id", node_id[AA_DRAGON]); packet->setDataByName("dragon_max_aa", rule_manager.GetGlobalRule(R_Player, MaxDragonAA)->GetInt32()); packet->setDataByName("dragon_id", classid[node_id[AA_DRAGON]]); packet->setDataByName("dragon_eof_req", 0); packet->setArrayLengthByName("dragon_num_items", dragon_num_items, 0); for (itr2 = DragonTab.begin(); itr2 != DragonTab.end(); itr2++) { for (itr3 = itr2->second.begin(); itr3 != itr2->second.end(); itr3++, index++) { //spell = master_spell_list.GetSpell((*itr3)->spellID, (*itr3)->tier); //current_rank = client->GetPlayer()->GetSpellTier((*itr3)->spellID); if (index == 0) class_node_id = (*itr3)->spellID; //if (spell) { packet->setArrayDataByName("dragon_parent_id", (*itr3)->rankPrereqID, index); packet->setArrayDataByName("dragon_req_tier", (*itr3)->rankPrereq, index); packet->setArrayDataByName("dragon_spell_id", (*itr3)->spellID, index); packet->setArrayDataByName("dragon_active", (current_rank == 0 ? 0 : (current_rank >= (*itr3)->maxRank) ? 2 : 1), index); packet->setArrayDataByName("dragon_spell_name", (*itr3)->name.c_str(), index); packet->setArrayDataByName("dragon_spell_description", (*itr3)->description.c_str(), index); packet->setArrayDataByName("dragon_icon", (*itr3)->icon, index); packet->setArrayDataByName("dragon_icon2", (*itr3)->icon2, index); packet->setArrayDataByName("dragon_current_rank", current_rank, index); // TODO: need to get this value from the DB packet->setArrayDataByName("dragon_max_rank", (*itr3)->maxRank, index); packet->setArrayDataByName("dragon_rank_cost", (*itr3)->rankCost, index); packet->setArrayDataByName("dragon_min_lev", (*itr3)->min_level, index); packet->setSubArrayLengthByName("dragon_unknown5_num_items", 0, index, 0); //packet->setSubArrayDataByName("dragon_unknown5", 308397057, index, 0); //packet->setSubArrayDataByName("dragon_unknown5", 3215564363, index, 1); //packet->setSubArrayDataByName("dragon_unknown5", 445192837, index, 2); //packet->setSubArrayDataByName("dragon_unknown5", 3345493294, index, 3); //packet->setSubArrayDataByName("dragon_unknown5", 696953971, index, 4); packet->setArrayDataByName("dragon_unknown6", 4294967295, index); packet->setArrayDataByName("dragon_unknown7", 1, index); packet->setArrayDataByName("dragon_classification1", (*itr3)->class_name.c_str(), index); packet->setArrayDataByName("dragon_points_req", (*itr3)->req_points, index); packet->setArrayDataByName("dragon_unknown8", 0, index); packet->setArrayDataByName("dragon_classification2", (*itr3)->subclass_name.c_str(), index); packet->setArrayDataByName("dragon_col", (*itr3)->col, index); packet->setArrayDataByName("dragon_row", (*itr3)->row, index); packet->setArrayDataByName("dragon_line_title", (*itr3)->line_title.c_str(), index); packet->setArrayDataByName("dragon_unknown9", ((*itr3)->title_level > 0 ? 258 : 0), index); packet->setArrayDataByName("dragon_points_to_unlock", (*itr3)->req_tree_points, index); packet->setArrayDataByName("dragon_unknown9b", 0, index); //} //else //LogWrite(SPELL__ERROR, 0, "AltAdvancement","Could not find Spell ID %u and Tier %i in Master Spell List", (*itr3)->spellID, (*itr3)->tier); } } packet->setDataByName("dragon_points_spent", 19); if (version >= 58617) { packet->setDataByName("dragon_unknown10", 19); packet->setDataByName("dragon_unknown11a", 0); packet->setDataByName("dragon_unknown11b", 50386); packet->setDataByName("dragon_unknown11c", 1); packet->setDataByName("dragon_unknown12", 0, 0); packet->setDataByName("dragon_unknown12", 0, 1); packet->setDataByName("dragon_unknown12", 0, 2); packet->setDataByName("dragon_unknown14", 0); packet->setDataByName("dragon_unknown16", 0, 0); packet->setDataByName("dragon_unknown16", 0, 1); packet->setDataByName("dragon_unknown16", 0, 2); packet->setDataByName("dragon_unknown16", 0, 3); packet->setDataByName("dragon_unknown16", 0, 4); packet->setDataByName("dragon_unknown16", 0, 5); } //__________________________________________________________START OF DRAGON CLASS TREE____________________________________________________________________________________ for (itr2 = DragonclassTab.begin(); itr2 != DragonclassTab.end(); itr2++) { dragonclass_num_items += (itr2->second).size(); } LogWrite(SPELL__DEBUG, 0, "AA", "DragonclassTab Size...%i ", dragonclass_num_items); index = 0; packet->setDataByName("dragonclass_tab_title", classes.GetClassNameCase(client->GetPlayer()->GetAdventureClass()).c_str()); packet->setDataByName("dragonclass_tree_node_id", node_id[AA_DRAGONCLASS]); packet->setDataByName("dragonclass_max_aa", rule_manager.GetGlobalRule(R_Player, MaxDragonAA)->GetInt32()); packet->setDataByName("dragonclass_id", classid[node_id[AA_DRAGONCLASS]]); packet->setDataByName("dragonclass_eof_req", 0); packet->setArrayLengthByName("dragonclass_num_items", dragonclass_num_items, 0); for (itr2 = DragonclassTab.begin(); itr2 != DragonclassTab.end(); itr2++) { for (itr3 = itr2->second.begin(); itr3 != itr2->second.end(); itr3++, index++) { //spell = master_spell_list.GetSpell((*itr3)->spellID, (*itr3)->tier); //current_rank = client->GetPlayer()->GetSpellTier((*itr3)->spellID); if (index == 0) class_node_id = (*itr3)->spellID; //if (spell) { packet->setArrayDataByName("dragonclass_parent_id", (*itr3)->rankPrereqID, index); packet->setArrayDataByName("dragonclass_req_tier", (*itr3)->rankPrereq, index); packet->setArrayDataByName("dragonclass_spell_id", (*itr3)->spellID, index); packet->setArrayDataByName("dragonclass_active", (current_rank == 0 ? 0 : (current_rank >= (*itr3)->maxRank) ? 2 : 1), index); packet->setArrayDataByName("dragonclass_spell_name", (*itr3)->name.c_str(), index); packet->setArrayDataByName("dragonclass_spell_description", (*itr3)->description.c_str(), index); packet->setArrayDataByName("dragonclass_icon", (*itr3)->icon, index); packet->setArrayDataByName("dragonclass_icon2", (*itr3)->icon2, index); packet->setArrayDataByName("dragonclass_current_rank", current_rank, index); // TODO: need to get this value from the DB packet->setArrayDataByName("dragonclass_max_rank", (*itr3)->maxRank, index); packet->setArrayDataByName("dragonclass_rank_cost", (*itr3)->rankCost, index); packet->setArrayDataByName("dragonclass_min_lev", (*itr3)->min_level, index); packet->setSubArrayLengthByName("dragonclass_unknown5_num_items", 0, index, 0); //packet->setSubArrayDataByName("dragonclass_unknown5", 308397057, index, 0); //packet->setSubArrayDataByName("dragonclass_unknown5", 3215564363, index, 1); //packet->setSubArrayDataByName("dragonclass_unknown5", 445192837, index, 2); //packet->setSubArrayDataByName("dragonclass_unknown5", 3345493294, index, 3); //packet->setSubArrayDataByName("dragonclass_unknown5", 696953971, index, 4); packet->setArrayDataByName("dragonclass_unknown6", 4294967295, index); packet->setArrayDataByName("dragonclass_unknown7", 1, index); packet->setArrayDataByName("dragonclass_classification1", (*itr3)->class_name.c_str(), index); packet->setArrayDataByName("dragonclass_points_req", (*itr3)->req_points, index); packet->setArrayDataByName("dragonclass_unknown8", 0, index); packet->setArrayDataByName("dragonclass_classification2", (*itr3)->subclass_name.c_str(), index); packet->setArrayDataByName("dragonclass_col", (*itr3)->col, index); packet->setArrayDataByName("dragonclass_row", (*itr3)->row, index); packet->setArrayDataByName("dragonclass_line_title", (*itr3)->line_title.c_str(), index); packet->setArrayDataByName("dragonclass_unknown9", ((*itr3)->title_level > 0 ? 258 : 0), index); packet->setArrayDataByName("dragonclass_points_to_unlock", (*itr3)->req_tree_points, index); packet->setArrayDataByName("dragonclass_unknown9b", 0, index); //} //else //LogWrite(SPELL__ERROR, 0, "AltAdvancement","Could not find Spell ID %u and Tier %i in Master Spell List", (*itr3)->spellID, (*itr3)->tier); } } packet->setDataByName("dragonclass_points_spent",20); if (version >= 58617) { packet->setDataByName("dragonclass_unknown10", 20); packet->setDataByName("dragonclass_unknown11a", 0); packet->setDataByName("dragonclass_unknown11b", 50386); packet->setDataByName("dragonclass_unknown11c", 3); packet->setDataByName("dragonclass_unknown12", 0, 0); packet->setDataByName("dragonclass_unknown12", 0, 1); packet->setDataByName("dragonclass_unknown12", 0, 2); packet->setDataByName("dragonclass_unknown14", 0); packet->setDataByName("dragonclass_unknown16", 2, 0); packet->setDataByName("dragonclass_unknown16", 0, 1); packet->setDataByName("dragonclass_unknown16", 0, 2); packet->setDataByName("dragonclass_unknown16", 0, 3); packet->setDataByName("dragonclass_unknown16", 0, 4); packet->setDataByName("dragonclass_unknown16", 0, 5); } //__________________________________________________________START OF FARSEAS TREE____________________________________________________________________________________ for (itr2 = FarseasTab.begin(); itr2 != FarseasTab.end(); itr2++) { farseas_num_items += (itr2->second).size(); } LogWrite(SPELL__DEBUG, 0, "AA", "FarseasTab Size...%i ", farseas_num_items); index = 0; packet->setDataByName("farseas_tab_title", "Farseas"); packet->setDataByName("farseas_tree_node_id", node_id[AA_FARSEAS]); packet->setDataByName("farseas_max_aa", rule_manager.GetGlobalRule(R_Player, MaxDragonAA)->GetInt32()); packet->setDataByName("farseas_id", classid[node_id[AA_FARSEAS]]); packet->setDataByName("farseas_eof_req", 0); packet->setArrayLengthByName("farseas_num_items", farseas_num_items, 0); for (itr2 = FarseasTab.begin(); itr2 != FarseasTab.end(); itr2++) { for (itr3 = itr2->second.begin(); itr3 != itr2->second.end(); itr3++, index++) { //spell = master_spell_list.GetSpell((*itr3)->spellID, (*itr3)->tier); //current_rank = client->GetPlayer()->GetSpellTier((*itr3)->spellID); if (index == 0) class_node_id = (*itr3)->spellID; //if (spell) { packet->setArrayDataByName("farseas_parent_id", (*itr3)->rankPrereqID, index); packet->setArrayDataByName("farseas_req_tier", (*itr3)->rankPrereq, index); packet->setArrayDataByName("farseas_spell_id", (*itr3)->spellID, index); packet->setArrayDataByName("farseas_active", (current_rank == 0 ? 0 : (current_rank >= (*itr3)->maxRank) ? 2 : 1), index); packet->setArrayDataByName("farseas_spell_name", (*itr3)->name.c_str(), index); packet->setArrayDataByName("farseas_spell_description", (*itr3)->description.c_str(), index); packet->setArrayDataByName("farseas_icon", (*itr3)->icon, index); packet->setArrayDataByName("farseas_icon2", (*itr3)->icon2, index); packet->setArrayDataByName("farseas_current_rank", current_rank, index); // TODO: need to get this value from the DB packet->setArrayDataByName("farseas_max_rank", (*itr3)->maxRank, index); packet->setArrayDataByName("farseas_rank_cost", (*itr3)->rankCost, index); packet->setArrayDataByName("farseas_min_lev", (*itr3)->min_level, index); packet->setSubArrayLengthByName("farseas_unknown5_num_items", 0, index, 0); //packet->setSubArrayDataByName("farseas_unknown5", 308397057, index, 0); //packet->setSubArrayDataByName("farseas_unknown5", 3215564363, index, 1); //packet->setSubArrayDataByName("farseas_unknown5", 445192837, index, 2); //packet->setSubArrayDataByName("farseas_unknown5", 3345493294, index, 3); //packet->setSubArrayDataByName("farseas_unknown5", 696953971, index, 4); packet->setArrayDataByName("farseas_unknown6", 4294967295, index); packet->setArrayDataByName("farseas_unknown7", 1, index); packet->setArrayDataByName("farseas_classification1", (*itr3)->class_name.c_str(), index); packet->setArrayDataByName("farseas_points_req", (*itr3)->req_points, index); packet->setArrayDataByName("farseas_unknown8", 0, index); packet->setArrayDataByName("farseas_classification2", (*itr3)->subclass_name.c_str(), index); packet->setArrayDataByName("farseas_col", (*itr3)->col, index); packet->setArrayDataByName("farseas_row", (*itr3)->row, index); packet->setArrayDataByName("farseas_line_title", (*itr3)->line_title.c_str(), index); packet->setArrayDataByName("farseas_unknown9", ((*itr3)->title_level > 0 ? 258 : 0), index); packet->setArrayDataByName("farseas_points_to_unlock", (*itr3)->req_tree_points, index); packet->setArrayDataByName("farseas_unknown9b", 0, index); //} //else //LogWrite(SPELL__ERROR, 0, "AltAdvancement","Could not find Spell ID %u and Tier %i in Master Spell List", (*itr3)->spellID, (*itr3)->tier); } } packet->setDataByName("farseas_points_spent",20); if (version >= 58617) { packet->setDataByName("farseas_unknown10", 20); packet->setDataByName("farseas_unknown11a", 0); packet->setDataByName("farseas_unknown11b", 50386); packet->setDataByName("farseas_unknown11c", 3); packet->setDataByName("farseas_unknown12", 0, 0); packet->setDataByName("farseas_unknown12", 0, 1); packet->setDataByName("farseas_unknown12", 0, 2); packet->setDataByName("farseas_unknown14", 0); packet->setDataByName("farseas_unknown16", 4, 0); packet->setDataByName("farseas_unknown16", 0, 1); packet->setDataByName("farseas_unknown16", 0, 2); packet->setDataByName("farseas_unknown16", 0, 3); packet->setDataByName("farseas_unknown16", 0, 4); packet->setDataByName("farseas_unknown16", 0, 5); } int8 tt = 0; int8 numtabs = 0; int xxx = 0; bool sendblanktabs = false; packet->setDataByName("template_unknown1", (changemode == 2 ? 255 : 25)); packet->setDataByName("template_unknown2a", 0); packet->setDataByName("template_unknown2b", 0); packet->setDataByName("template_unknown2c", (changemode == 3 ? 1 : 0)); packet->setDataByName("template_unknown2d", (changemode == 1 || changemode == 2 ? 1 :0)); packet->setDataByName("template_unknown3", (changemode == 2 ? 0 : 4294967295)); //4294967295); packet->setDataByName("template_unknown4", newtemplate);// active template ID packet->setDataByName("template_unknown5", 0); packet->setDataByName("num_templates", 7); packet->setDataByName("slot1_template_id", 0); packet->setDataByName("slot1_name", "Unused Slot 1"); packet->setDataByName("slot1_active", 0); //0 is server type ,1 = personal type tt = 1; // template # numtabs = 0; if (AAEntryList[tt][0].size() > 0) { numtabs++; } if (AAEntryList[tt][1].size() > 0) { numtabs++; } if (AAEntryList[tt][2].size() > 0) { numtabs++; } if (AAEntryList[tt][3].size() > 0) { numtabs++; } if (AAEntryList[tt][4].size() > 0) { numtabs++; } if (sendblanktabs == true) { numtabs = 4; } packet->setArrayLengthByName("slot1_num_tabs", numtabs); xxx = 0; for (int xx = 0; xx < AAEntryList[tt].size(); xx++) { if (sendblanktabs == false && AAEntryList[tt][xx].size() < 1 ) {continue;} packet->setArrayDataByName("slot1_tab_typenum", xx, xxx); packet->setArrayDataByName("slot1_tab_unknown2", 1, xxx); packet->setSubArrayLengthByName("slot1_num_items", AAEntryList[tt][xx].size(), xxx); for (int yy = 0; yy < AAEntryList[tt][xx].size(); yy++) { packet->setSubArrayDataByName("slot1_item_order", AAEntryList[tt][xx][yy].order, xxx, yy); packet->setSubArrayDataByName("slot1_item_treeid", AAEntryList[tt][xx][yy].treeid, xxx, yy); packet->setSubArrayDataByName("slot1_item_id", AAEntryList[tt][xx][yy].aa_id, xxx, yy); } xxx++; } packet->setDataByName("slot2_template_id", 1); packet->setDataByName("slot2_name", "Unused Slot 2"); packet->setDataByName("slot2_active", 0); tt = 2; // template # numtabs = 0; if (AAEntryList[tt][0].size() > 0) { numtabs++; } if (AAEntryList[tt][1].size() > 0) { numtabs++; } if (AAEntryList[tt][2].size() > 0) { numtabs++; } if (AAEntryList[tt][3].size() > 0) { numtabs++; } if (AAEntryList[tt][4].size() > 0) { numtabs++; } if (sendblanktabs == true) { numtabs = 4; } packet->setArrayLengthByName("slot2_num_tabs", numtabs); xxx = 0; for (int xx = 0; xx < AAEntryList[tt].size(); xx++) { if (sendblanktabs == false && AAEntryList[tt][xx].size() < 1) { continue; } packet->setArrayDataByName("slot2_tab_typenum", xx, xxx); packet->setArrayDataByName("slot2_tab_unknown2", 1, xxx); packet->setSubArrayLengthByName("slot2_num_items", AAEntryList[tt][xx].size(), xxx); for (int yy = 0; yy < AAEntryList[tt][xx].size(); yy++) { packet->setSubArrayDataByName("slot2_item_order", AAEntryList[tt][xx][yy].order, xxx, yy); packet->setSubArrayDataByName("slot2_item_treeid", AAEntryList[tt][xx][yy].treeid, xxx, yy); packet->setSubArrayDataByName("slot2_item_id", AAEntryList[tt][xx][yy].aa_id, xxx, yy); } xxx++; } packet->setDataByName("slot3_template_id", 2); packet->setDataByName("slot3_name", "Unused Slot 3"); packet->setDataByName("slot3_active", 0); tt = 3; // template # numtabs = 0; if (AAEntryList[tt][0].size() > 0) { numtabs++; } if (AAEntryList[tt][1].size() > 0) { numtabs++; } if (AAEntryList[tt][2].size() > 0) { numtabs++; } if (AAEntryList[tt][3].size() > 0) { numtabs++; } if (AAEntryList[tt][4].size() > 0) { numtabs++; } if (sendblanktabs == true) { numtabs = 4; } packet->setArrayLengthByName("slot3_num_tabs", numtabs); xxx = 0; for (int xx = 0; xx < AAEntryList[tt].size(); xx++) { if (sendblanktabs == false && AAEntryList[tt][xx].size() < 1) { continue; } packet->setArrayDataByName("slot3_tab_typenum", xx, xxx); packet->setArrayDataByName("slot3_tab_unknown2", 1, xxx); packet->setSubArrayLengthByName("slot3_num_items", AAEntryList[tt][xx].size(), xxx); for (int yy = 0; yy < AAEntryList[tt][xx].size(); yy++) { packet->setSubArrayDataByName("slot3_item_order", AAEntryList[tt][xx][yy].order, xxx, yy); packet->setSubArrayDataByName("slot3_item_treeid", AAEntryList[tt][xx][yy].treeid, xxx, yy); packet->setSubArrayDataByName("slot3_item_id", AAEntryList[tt][xx][yy].aa_id, xxx, yy); } xxx++; } packet->setDataByName("slot4_template_id", 20); packet->setDataByName("slot4_name", "Basic Leveling Profile - Solo"); packet->setDataByName("slot4_active", 1); tt = 4; // template # numtabs = 0; if (AAEntryList[tt][0].size() > 0) { numtabs++; } if (AAEntryList[tt][1].size() > 0) { numtabs++; } if (AAEntryList[tt][2].size() > 0) { numtabs++; } if (AAEntryList[tt][3].size() > 0) { numtabs++; } if (AAEntryList[tt][4].size() > 0) { numtabs++; } if (sendblanktabs == true) { numtabs = 4; } packet->setArrayLengthByName("slot4_num_tabs", numtabs); xxx = 0; for (int xx = 0; xx < AAEntryList[tt].size(); xx++) { if (sendblanktabs == false && AAEntryList[tt][xx].size() < 1) { continue; } packet->setArrayDataByName("slot4_tab_typenum", xx, xxx); packet->setArrayDataByName("slot4_tab_unknown2", 1, xxx); packet->setSubArrayLengthByName("slot4_num_items", AAEntryList[tt][xx].size(), xxx); for (int yy = 0; yy < AAEntryList[tt][xx].size(); yy++) { packet->setSubArrayDataByName("slot4_item_order", AAEntryList[tt][xx][yy].order, xxx, yy); packet->setSubArrayDataByName("slot4_item_treeid", AAEntryList[tt][xx][yy].treeid, xxx, yy); packet->setSubArrayDataByName("slot4_item_id", AAEntryList[tt][xx][yy].aa_id, xxx, yy); } xxx++; } packet->setDataByName("slot5_template_id", 21); packet->setDataByName("slot5_name", "Basic Leveling Profile - Group"); packet->setDataByName("slot5_active", 1); tt = 5; // template # numtabs = 0; if (AAEntryList[tt][0].size() > 0) { numtabs++; } if (AAEntryList[tt][1].size() > 0) { numtabs++; } if (AAEntryList[tt][2].size() > 0) { numtabs++; } if (AAEntryList[tt][3].size() > 0) { numtabs++; } if (AAEntryList[tt][4].size() > 0) { numtabs++; } if (sendblanktabs == true) { numtabs = 4; } packet->setArrayLengthByName("slot5_num_tabs", numtabs); xxx = 0; for (int xx = 0; xx < AAEntryList[tt].size(); xx++) { if (sendblanktabs == false && AAEntryList[tt][xx].size() < 1) { continue; } packet->setArrayDataByName("slot5_tab_typenum", xx, xxx); packet->setArrayDataByName("slot5_tab_unknown2", 1, xxx); packet->setSubArrayLengthByName("slot5_num_items", AAEntryList[tt][xx].size(), xxx); for (int yy = 0; yy < AAEntryList[tt][xx].size(); yy++) { packet->setSubArrayDataByName("slot5_item_order", AAEntryList[tt][xx][yy].order, xxx, yy); packet->setSubArrayDataByName("slot5_item_treeid", AAEntryList[tt][xx][yy].treeid, xxx, yy); packet->setSubArrayDataByName("slot5_item_id", AAEntryList[tt][xx][yy].aa_id, xxx, yy); } xxx++; } packet->setDataByName("slot6_template_id", 22); packet->setDataByName("slot6_name", "Basic Leveling Profile - PVP"); packet->setDataByName("slot6_active", 1); tt = 6; // template # numtabs = 0; if (AAEntryList[tt][0].size() > 0) { numtabs++; } if (AAEntryList[tt][1].size() > 0) { numtabs++; } if (AAEntryList[tt][2].size() > 0) { numtabs++; } if (AAEntryList[tt][3].size() > 0) { numtabs++; } if (AAEntryList[tt][4].size() > 0) { numtabs++; } if (sendblanktabs == true) { numtabs = 4; } packet->setArrayLengthByName("slot6_num_tabs", numtabs); xxx = 0; for (int xx = 0; xx < AAEntryList[tt].size(); xx++) { if (sendblanktabs == false && AAEntryList[tt][xx].size() < 1) { continue; } packet->setArrayDataByName("slot6_tab_typenum", xx, xxx); packet->setArrayDataByName("slot6_tab_unknown2", 1, xxx); packet->setSubArrayLengthByName("slot6_num_items", AAEntryList[tt][xx].size(), xxx); for (int yy = 0; yy < AAEntryList[tt][xx].size(); yy++) { packet->setSubArrayDataByName("slot6_item_order", AAEntryList[tt][xx][yy].order, xxx, yy); packet->setSubArrayDataByName("slot6_item_treeid", AAEntryList[tt][xx][yy].treeid, xxx, yy); packet->setSubArrayDataByName("slot6_item_id", AAEntryList[tt][xx][yy].aa_id, xxx, yy); } xxx++; } packet->setDataByName("slot7_template_id",100); packet->setDataByName("slot7_name", "New"); packet->setDataByName("slot7_active", 0); tt = 7; // template # numtabs = 0; if (AAEntryList[tt][0].size() > 0) { numtabs++; } if (AAEntryList[tt][1].size() > 0) { numtabs++; } if (AAEntryList[tt][2].size() > 0) { numtabs++; } if (AAEntryList[tt][3].size() > 0) { numtabs++; } if (AAEntryList[tt][4].size() > 0) { numtabs++; } if (sendblanktabs == true) { numtabs = 4; } packet->setArrayLengthByName("slot7_num_tabs", numtabs); xxx = 0; for (int xx = 0; xx < AAEntryList[tt].size(); xx++) { if (sendblanktabs == false && AAEntryList[tt][xx].size() < 1) { continue; } packet->setArrayDataByName("slot7_tab_typenum", xx, xxx); packet->setArrayDataByName("slot7_tab_unknown2", 1, xxx); packet->setSubArrayLengthByName("slot7_num_items", AAEntryList[tt][xx].size(), xxx); for (int yy = 0; yy < AAEntryList[tt][xx].size(); yy++) { packet->setSubArrayDataByName("slot7_item_order", AAEntryList[tt][xx][yy].order, xxx, yy); packet->setSubArrayDataByName("slot7_item_treeid", AAEntryList[tt][xx][yy].treeid, xxx, yy); packet->setSubArrayDataByName("slot7_item_id", AAEntryList[tt][xx][yy].aa_id, xxx, yy); } xxx++; } //packet->PrintPacket(); } //packet->PrintPacket(); EQ2Packet* data = packet->serialize(); EQ2Packet* app = new EQ2Packet(OP_AdventureList, data->pBuffer, data->size); //DumpPacket(app); client->QueuePacket(app); safe_delete(packet); safe_delete(data); }