diff options
68 files changed, 6133 insertions, 4289 deletions
diff --git a/sql/updates/world/2012_07_22_00_world_spelldifficulty_dbc.sql b/sql/updates/world/2012_07_22_00_world_spelldifficulty_dbc.sql new file mode 100644 index 00000000000..c90c42692b9 --- /dev/null +++ b/sql/updates/world/2012_07_22_00_world_spelldifficulty_dbc.sql @@ -0,0 +1 @@ +UPDATE `spelldifficulty_dbc` SET `spellid0`= 61890 WHERE `id`= 3251 AND `spellid1`= 63498; diff --git a/sql/updates/world/2012_07_22_01_world_conditions.sql b/sql/updates/world/2012_07_22_01_world_conditions.sql new file mode 100644 index 00000000000..333ae7f997f --- /dev/null +++ b/sql/updates/world/2012_07_22_01_world_conditions.sql @@ -0,0 +1,10 @@ +-- Saronite Mine Slave conditions +SET @QUEST_A := 13300; +SET @QUEST_H := 13302; +SET @GOSSIP := 10137; + +-- Only show gossip if player is on quest Slaves to Saronite +DELETE FROM `conditions` WHERE `SourceGroup`=@GOSSIP AND `ConditionValue1` IN (@QUEST_A,@QUEST_H); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15,@GOSSIP,0,0,0,9,0,@QUEST_A,0,0,0,0,'',"Only show first gossip if player is on quest Slaves to Saronite Alliance"), +(15,@GOSSIP,0,0,1,9,0,@QUEST_H,0,0,0,0,'',"Only show first gossip if player is on quest Slaves to Saronite Horde"); diff --git a/sql/updates/world/2012_07_22_02_world_creature_loot_template.sql b/sql/updates/world/2012_07_22_02_world_creature_loot_template.sql new file mode 100644 index 00000000000..e4bc61b6fa4 --- /dev/null +++ b/sql/updates/world/2012_07_22_02_world_creature_loot_template.sql @@ -0,0 +1,5 @@ +-- Item was added to the wrong NPC +-- Source: http://old.wowhead.com/item=19364 +DELETE FROM `creature_loot_template` WHERE `entry` IN (1853, 11583) AND `item`=19364; +INSERT INTO `creature_loot_template` (`entry`, `item`, `ChanceOrQuestChance`, `lootmode`, `groupid`, `mincountOrRef`, `maxcount`) VALUES +(11583, 19364, 10, 1, 0, 1, 1); diff --git a/sql/updates/world/2012_07_22_03_world_gossip.sql b/sql/updates/world/2012_07_22_03_world_gossip.sql new file mode 100644 index 00000000000..d1aa7e50747 --- /dev/null +++ b/sql/updates/world/2012_07_22_03_world_gossip.sql @@ -0,0 +1,18 @@ +-- Keristrasza (26206) +UPDATE `creature_template` SET `gossip_menu_id` = 9262 WHERE `entry` = 26206; + +DELETE FROM `gossip_menu` WHERE `entry`=9262 AND `text_id`=12576; +INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES (9262, 12576); + +-- from sniff +DELETE FROM `gossip_menu_option` WHERE `menu_id`=9262 AND `id`=0; +DELETE FROM `gossip_menu_option` WHERE `menu_id`=9262 AND `id`=1; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`) VALUES +(9262, 0, 0, 'I am prepared to face Saragosa!', 1, 3, 0, 0, 0, 0, NULL), +(9262, 1, 0, 'Keristrasa, I am finished here. Please return me to the Transitus Shield.', 1, 3, 0, 0, 0, 0, NULL); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=9262 AND `SourceEntry`=0; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=9262 AND `SourceEntry`=1; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15, 9262, 0, 0, 0, 9, 0, 11957, 0, 0, 0, 0, '', "Only show gossip if player has quest Saragosa's End"), +(15, 9262, 1, 0, 0, 9, 0, 11967, 0, 0, 0, 0, '', "Only show gossip if player has quest Mustering the Reds"); diff --git a/sql/updates/world/2012_07_22_04_world_gossip.sql b/sql/updates/world/2012_07_22_04_world_gossip.sql new file mode 100644 index 00000000000..0fbf2e7508f --- /dev/null +++ b/sql/updates/world/2012_07_22_04_world_gossip.sql @@ -0,0 +1,20 @@ +-- NPC Cowlen - Missing Gossip Options +SET @NPC := 17311; +DELETE FROM `creature_addon` WHERE `guid`=84415; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(84415,0,0,1,0,0,NULL); +UPDATE `creature_template` SET `gossip_menu_id`=7403, `AIName`='SmartAI' WHERE `entry`=@NPC; +DELETE FROM `gossip_menu` WHERE `entry` IN (7403,7402,7401); +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES +(7403,8870), +(7402,8871), +(7401,8872); +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7403,7402,7401) AND `id`=0; +INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES +(7403,0,0, 'I have not come to kill you, night elf. And the gods did not do this...',1,1,7402,0,0,0, ''), +(7402,0,0, 'I fear that my people are somewhat responsible for this destruction. We are refugees, displaced from our homes by the Burning Legion. This tragedy is a result of our latest evacuation. Our vessel crashed - this debris is a part of that vessel.',1,1,7401,0,0,0, ''), +(7401,0,0, 'We have much in common, night elf. I can''t help but feel that perhaps it was fate that brought us together. Let me help you, Cowlen. Let my people help. We will right the wrongs. This I vow.',1,1,0,0,0,0, ''); +DELETE FROM `smart_scripts` WHERE `entryorguid`=@NPC AND `source_type`=0 AND `id` IN (0,1); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@NPC,0,0,1,62,0,100,0,7401,0,0,0,5,18,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Cowlen - On gossip option play emote'), +(@NPC,0,1,0,61,0,100,0,7401,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Cowlen - On gossip option Close Gossip'); diff --git a/sql/updates/world/2012_07_22_05_world_script_texts.sql b/sql/updates/world/2012_07_22_05_world_script_texts.sql new file mode 100644 index 00000000000..2ecb1b8f130 --- /dev/null +++ b/sql/updates/world/2012_07_22_05_world_script_texts.sql @@ -0,0 +1,2 @@ +-- Fixing wrong text in Trial of the Crusader, Twin Valkyrs +UPDATE `script_texts` SET `content_default`='%s begins to read the spell Twin''s Pact!' WHERE `entry`=-1649043; diff --git a/sql/updates/world/2012_07_22_06_world_gossip.sql b/sql/updates/world/2012_07_22_06_world_gossip.sql new file mode 100644 index 00000000000..0cb41937d3c --- /dev/null +++ b/sql/updates/world/2012_07_22_06_world_gossip.sql @@ -0,0 +1,85 @@ +-- gossip assignation from sniff +UPDATE `creature_template` SET `gossip_menu_id`=4182 WHERE `entry`=1466; -- Gretta Finespindle <Apprentice Leatherworker> +UPDATE `creature_template` SET `gossip_menu_id`=201 WHERE `entry`=3678; -- Muyoh <Disciple of Naralex> +UPDATE `creature_template` SET `gossip_menu_id`=7406 WHERE `entry`=3848; -- Kayneth Stillwind +UPDATE `creature_template` SET `gossip_menu_id`=8851 WHERE `entry`=4979; -- Theramore Guard +UPDATE `creature_template` SET `gossip_menu_id`=4862 WHERE `entry`=6771; -- Ravenholdt Assassin <Assassin's League> +UPDATE `creature_template` SET `gossip_menu_id`=3130 WHERE `entry`=10618; -- Rivern Frostwind <Wintersaber Trainer> +UPDATE `creature_template` SET `gossip_menu_id`=3441 WHERE `entry`=10857; -- Argent Quartermaster Lightspark <The Argent Crusade> +UPDATE `creature_template` SET `gossip_menu_id`=3074 WHERE `entry`=10922; -- Greta Mosshoof <Emerald Circle> +UPDATE `creature_template` SET `gossip_menu_id`=3128 WHERE `entry`=11019; -- Jessir Moonbow +UPDATE `creature_template` SET `gossip_menu_id`=3622 WHERE `entry`=11554; -- Grazle +UPDATE `creature_template` SET `gossip_menu_id`=3602 WHERE `entry`=11609; -- Alexia Ironknife +UPDATE `creature_template` SET `gossip_menu_id`=3963 WHERE `entry`=11626; -- Rigger Gizelton +UPDATE `creature_template` SET `gossip_menu_id`=4003 WHERE `entry`=12245; -- Vendor-Tron 1000 +UPDATE `creature_template` SET `gossip_menu_id`=4002 WHERE `entry`=12246; -- Super-Seller 680 +UPDATE `creature_template` SET `gossip_menu_id`=4922 WHERE `entry`=13085; -- Myrokos Silentform +UPDATE `creature_template` SET `gossip_menu_id`=6531 WHERE `entry`=15182; -- Vish Kozus <Captain of the Guard> +UPDATE `creature_template` SET `gossip_menu_id`=7326 WHERE `entry`=16817; -- Festival Loremaster +UPDATE `creature_template` SET `gossip_menu_id`=7405 WHERE `entry`=17287; -- Sentinel Luciel Starwhisper <Silverwing Sentinels> +UPDATE `creature_template` SET `gossip_menu_id`=7404 WHERE `entry`=17291; -- Architect Nemos +UPDATE `creature_template` SET `gossip_menu_id`=7407 WHERE `entry`=17303; -- Vindicator Vedaar <Hand of Argus> +UPDATE `creature_template` SET `gossip_menu_id`=8080 WHERE `entry`=17310; -- Gnarl <Ancient of War> +UPDATE `creature_template` SET `gossip_menu_id`=7382 WHERE `entry`=17406; -- Artificer +UPDATE `creature_template` SET `gossip_menu_id`=7735 WHERE `entry`=18538; -- Ishanah <High Priestess of the Aldor> +UPDATE `creature_template` SET `gossip_menu_id`=7734 WHERE `entry`=18596; -- Arcanist Adyria <The Scryers> +UPDATE `creature_template` SET `gossip_menu_id`=7747 WHERE `entry`=18653; -- Seth +UPDATE `creature_template` SET `gossip_menu_id`=10459 WHERE `entry`=33746; -- Silvermoon Champion +UPDATE `creature_template` SET `gossip_menu_id`=10461 WHERE `entry`=33748; -- Thunder Bluff Champion +UPDATE `creature_template` SET `gossip_menu_id`=10462 WHERE `entry`=33749; -- Undercity Champion + +-- gossip from sniff +DELETE FROM `gossip_menu` WHERE (`entry`=201 AND `text_id`=698) OR (`entry`=3074 AND `text_id`=3807) OR (`entry`=3128 AND `text_id`=3864) OR (`entry`=3130 AND `text_id`=3854) OR (`entry`=3441 AND `text_id`=4193) OR (`entry`=3602 AND `text_id`=4354) OR (`entry`=3621 AND `text_id`=4394) OR (`entry`=3622 AND `text_id`=4393) OR (`entry`=3961 AND `text_id`=4813) OR (`entry`=3963 AND `text_id`=4815) OR (`entry`=4002 AND `text_id`=4856) OR (`entry`=4003 AND `text_id`=4857) OR (`entry`=4182 AND `text_id`=5276) OR (`entry`=4862 AND `text_id`=5938) OR (`entry`=4922 AND `text_id`=5981) OR (`entry`=6531 AND `text_id`=7733) OR (`entry`=6588 AND `text_id`=7801) OR (`entry`=6587 AND `text_id`=7802) OR (`entry`=6586 AND `text_id`=7803) OR (`entry`=6585 AND `text_id`=7804) OR (`entry`=7326 AND `text_id`=8703) OR (`entry`=7382 AND `text_id`=8838) OR (`entry`=7404 AND `text_id`=8873) OR (`entry`=7405 AND `text_id`=8874) OR (`entry`=7406 AND `text_id`=8875) OR (`entry`=7407 AND `text_id`=8876) OR (`entry`=7735 AND `text_id`=9457) OR (`entry`=7734 AND `text_id`=9452) OR (`entry`=7747 AND `text_id`=9486) OR (`entry`=8080 AND `text_id`=9986) OR (`entry`=8464 AND `text_id`=10573) OR (`entry`=8851 AND `text_id`=11492) OR (`entry`=10933 AND `text_id`=15194); +INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES +(201, 698), -- 3678 +(3074, 3807), -- 10922 +(3128, 3864), -- 11019 +(3130, 3854), -- 10618 +(3441, 4193), -- 10857 +(3602, 4354), -- 11609 +(3621, 4394), -- 11554 +(3622, 4393), -- 11554 +(3961, 4813), -- 11625 +(3963, 4815), -- 11626 +(4002, 4856), -- 12246 +(4003, 4857), -- 12245 +(4182, 5276), -- 1466 +(4862, 5938), -- 6771 +(4922, 5981), -- 13085 +(6531, 7733), -- 15182 +(6588, 7801), -- 15169 +(6587, 7802), -- 15169 +(6586, 7803), -- 15169 +(6585, 7804), -- 15169 +(7326, 8703), -- 16817 +(7382, 8838), -- 17406 +(7404, 8873), -- 17291 +(7405, 8874), -- 17287 +(7406, 8875), -- 3848 +(7407, 8876), -- 17303 +(7735, 9457), -- 18538 +(7734, 9452), -- 18596 +(7747, 9486), -- 18653 +(8080, 9986), -- 17310 +(8464, 10573), -- 185126 +(8851, 11492), -- 4979 +(10933, 15194); -- 37200 + +-- correct npc_flags for npc from sniff +UPDATE `creature_template` SET `npcflag`=0 WHERE `entry`=8151; -- Nijel's Point Guard +UPDATE `creature_template` SET `npcflag`=2 WHERE `entry`=24393; -- The Rokk <Master of Cooking> +UPDATE `creature_template` SET `npcflag`=1 WHERE `entry`=37119; -- Highlord Tirion Fordring + +-- missing gossip from sniff +DELETE FROM `gossip_menu_option` WHERE (`menu_id`=3622 AND `id`=0) OR (`menu_id`=4002 AND `id`=0) OR (`menu_id`=4003 AND `id`=0) OR (`menu_id`=6586 AND `id`=0) OR (`menu_id`=6587 AND `id`=0) OR (`menu_id`=6588 AND `id`=0) OR (`menu_id`=10456 AND `id`=0) OR (`menu_id`=10457 AND `id`=0) OR (`menu_id`=10461 AND `id`=0) OR (`menu_id`=10462 AND `id`=0); +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`) VALUES +(3622, 0, 0, 'How can I prove myself to the Timbermaw furbolg?', 1, 3, 3621, 0, 0, 0, ''), -- 11554 +(4002, 0, 1, 'Let me take a look at what you have to offer.', 3, 387, 0, 0, 0, 0, ''), -- 12246 +(4003, 0, 1, 'I am curious to see what a bucket of bolts has to offer.', 3, 131, 0, 0, 0, 0, ''), -- 12245 +(6586, 0, 0, 'And what do you say?', 1, 1, 6585, 0, 0, 0, ''), -- 15169 +(6587, 0, 0, 'What do they say?', 1, 1, 6586, 0, 0, 0, ''), -- 15169 +(6588, 0, 0, 'How do you know?', 1, 1, 6587, 0, 0, 0, ''), -- 15169 +(10456, 0, 0, 'I am ready to fight!', 1, 1, 0, 0, 0, 0, ''), -- 33743 +(10457, 0, 0, 'I am ready to fight!', 1, 1, 0, 0, 0, 0, ''), -- 33744 +(10461, 0, 0, 'I am ready to fight!', 1, 1, 0, 0, 0, 0, ''), -- 33748 +(10462, 0, 0, 'I am ready to fight!', 1, 1, 0, 0, 0, 0, ''); -- 33749 diff --git a/sql/updates/world/2012_07_22_07_world_sai.sql b/sql/updates/world/2012_07_22_07_world_sai.sql new file mode 100644 index 00000000000..f8f42ef07da --- /dev/null +++ b/sql/updates/world/2012_07_22_07_world_sai.sql @@ -0,0 +1,7 @@ +-- Add SAI for Liquid Pyrite ID: 33189 - remove auras to prevent exploit after used, also despawn +SET @Pyrite := 33189; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@Pyrite; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@Pyrite; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@Pyrite,0,0,1,8,0,100,0,67390,0,0,0,28,62494,0,0,0,0,0,1,0,0,0,0,0,0,0,'Pyrite - On hit by spell Ride Vehicle - Remove auras from Liquid Pyrite'), +(@Pyrite,0,1,0,61,0,100,0,0,0,0,0,41,15000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Pyrite - Linked with previous event - Despawn in 15 sec'); diff --git a/sql/updates/world/2012_07_22_08_world_sai.sql b/sql/updates/world/2012_07_22_08_world_sai.sql new file mode 100644 index 00000000000..62b5a95f532 --- /dev/null +++ b/sql/updates/world/2012_07_22_08_world_sai.sql @@ -0,0 +1,16 @@ +-- Remove disables (instances scripts) for 10 and 25 version of achievement Dwarfageddon +DELETE FROM `achievement_criteria_data` WHERE `criteria_id`=10858 AND `type`=18; +DELETE FROM `achievement_criteria_data` WHERE `criteria_id`=10860 AND `type`=18; +-- Insert the required spell credit markers for Dwarfageddon (10/25 player) achievements +DELETE FROM `spell_dbc` WHERE `Id`=65387; +INSERT INTO `spell_dbc` (`Id`, `Dispel`, `Mechanic`, `Attributes`, `AttributesEx`, `AttributesEx2`, `AttributesEx3`, `AttributesEx4`, `AttributesEx5`, `AttributesEx6`, `AttributesEx7`, `Stances`, `StancesNot`, `Targets`, `CastingTimeIndex`, `AuraInterruptFlags`, `ProcFlags`, `ProcChance`, `ProcCharges`, `MaxLevel`, `BaseLevel`, `SpellLevel`, `DurationIndex`, `RangeIndex`, `StackAmount`, `EquippedItemClass`, `EquippedItemSubClassMask`, `EquippedItemInventoryTypeMask`, `Effect1`, `Effect2`, `Effect3`, `EffectDieSides1`, `EffectDieSides2`, `EffectDieSides3`, `EffectRealPointsPerLevel1`, `EffectRealPointsPerLevel2`, `EffectRealPointsPerLevel3`, `EffectBasePoints1`, `EffectBasePoints2`, `EffectBasePoints3`, `EffectMechanic1`, `EffectMechanic2`, `EffectMechanic3`, `EffectImplicitTargetA1`, `EffectImplicitTargetA2`, `EffectImplicitTargetA3`, `EffectImplicitTargetB1`, `EffectImplicitTargetB2`, `EffectImplicitTargetB3`, `EffectRadiusIndex1`, `EffectRadiusIndex2`, `EffectRadiusIndex3`, `EffectApplyAuraName1`, `EffectApplyAuraName2`, `EffectApplyAuraName3`, `EffectAmplitude1`, `EffectAmplitude2`, `EffectAmplitude3`, `EffectMultipleValue1`, `EffectMultipleValue2`, `EffectMultipleValue3`, `EffectMiscValue1`, `EffectMiscValue2`, `EffectMiscValue3`, `EffectMiscValueB1`, `EffectMiscValueB2`, `EffectMiscValueB3`, `EffectTriggerSpell1`, `EffectTriggerSpell2`, `EffectTriggerSpell3`, `EffectSpellClassMaskA1`, `EffectSpellClassMaskA2`, `EffectSpellClassMaskA3`, `EffectSpellClassMaskB1`, `EffectSpellClassMaskB2`, `EffectSpellClassMaskB3`, `EffectSpellClassMaskC1`, `EffectSpellClassMaskC2`, `EffectSpellClassMaskC3`, `MaxTargetLevel`, `SpellFamilyName`, `SpellFamilyFlags1`, `SpellFamilyFlags2`, `SpellFamilyFlags3`, `MaxAffectedTargets`, `DmgClass`, `PreventionType`, `DmgMultiplier1`, `DmgMultiplier2`, `DmgMultiplier3`, `AreaGroupId`, `SchoolMask`, `Comment`) VALUES +(65387, 0, 0, 545259776, 0, 5, 268697600, 128, 0, 16777216, 0, 0, 0, 0, 1, 0, 0, 101, 0, 0, 0, 0, 0, 13, 0, -1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 7, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 'Steelforged Defender - Credit marker'); +-- Add SAI support for Dwarfageddon (10 and 25 player) achievement/also SAI for the NPC connected +SET @Defender := 33236; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@Defender; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@Defender; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@Defender,0,0,0,6,0,100,0,0,0,0,0,11,65387,0,0,0,0,0,16,0,0,0,0,0,0,0,'Steelforged Defender - On death - Cast achievement credit'), +(@Defender,0,1,0,0,0,100,0,0,2500,9000,12000,11,62845,0,0,0,0,0,2,0,0,0,0,0,0,0,'Steelforged Defender - IC - Hamstring'), +(@Defender,0,2,0,0,0,100,0,0,2600,13000,14000,11,50370,0,0,0,0,0,2,0,0,0,0,0,0,0,'Steelforged Defender - IC - Cast Sunder armor'), +(@Defender,0,3,0,0,0,100,0,500,4000,4500,9000,11,57780,0,0,0,0,0,2,0,0,0,0,0,0,0,'Steelforged Defender - IC - Cast Lightening Bolt'); diff --git a/sql/updates/world/2012_07_22_09_world_creature_template.sql b/sql/updates/world/2012_07_22_09_world_creature_template.sql new file mode 100644 index 00000000000..909b4cc238b --- /dev/null +++ b/sql/updates/world/2012_07_22_09_world_creature_template.sql @@ -0,0 +1,2 @@ +-- Add spells to Salvaged Chopper - 25 version +UPDATE `creature_template` SET `spell1`=62974,`spell2`=62286,`spell3`=62299,`spell4`=64660, `mechanic_immune_mask`=344276858 WHERE `entry`=34045; diff --git a/sql/updates/world/2012_07_22_10_world_creature_onkill_rep.sql b/sql/updates/world/2012_07_22_10_world_creature_onkill_rep.sql new file mode 100644 index 00000000000..22d81bca548 --- /dev/null +++ b/sql/updates/world/2012_07_22_10_world_creature_onkill_rep.sql @@ -0,0 +1,2 @@ +-- Critter Fire Beetle should not give reputation with Honor Hold when killed +DELETE FROM `creature_onkill_reputation` WHERE `creature_id` = 9699; diff --git a/sql/updates/world/2012_07_22_11_world_conditions.sql b/sql/updates/world/2012_07_22_11_world_conditions.sql new file mode 100644 index 00000000000..9ecb28307ba --- /dev/null +++ b/sql/updates/world/2012_07_22_11_world_conditions.sql @@ -0,0 +1,4 @@ +-- Exarch Menelaous - Missing condition for gossip 7370 +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=7370 AND `SourceEntry`=0; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(15,7370,0,0,0,9,9456,0,0,0,0,'','Exarch Menelaous - Show gossip option if player has quest 9456'); diff --git a/sql/updates/world/2012_07_22_12_world_creature_template.sql b/sql/updates/world/2012_07_22_12_world_creature_template.sql new file mode 100644 index 00000000000..51e2b36d15d --- /dev/null +++ b/sql/updates/world/2012_07_22_12_world_creature_template.sql @@ -0,0 +1,2 @@ +-- Fix Night Elf Corpse (16804) so it can't be attacked +UPDATE `creature_template` SET `unit_flags`=768, `dynamicflags`=40 WHERE `entry` = 16804; diff --git a/sql/updates/world/2012_07_22_13_world_conditions.sql b/sql/updates/world/2012_07_22_13_world_conditions.sql new file mode 100644 index 00000000000..896257d3f92 --- /dev/null +++ b/sql/updates/world/2012_07_22_13_world_conditions.sql @@ -0,0 +1,3 @@ +DELETE FROM conditions WHERE SourceTypeOrReferenceId=22 AND SourceEntry=160445; +INSERT INTO conditions (SourceTypeOrReferenceId, SourceGroup, SourceEntry, SourceId, ElseGroup, ConditionTypeOrReference, ConditionTarget, ConditionValue1, ConditionValue2, ConditionValue3, NegativeCondition, ErrorTextId, ScriptName, Comment) VALUES +(22, 1, 160445, 1, 0, 28, 0, 3821, 0, 0, 0, 0, '', 'Execute SmartAI for gameobject 160445 only if player has complete quest 3821'); diff --git a/sql/updates/world/2012_07_22_14_world_gameobject.sql b/sql/updates/world/2012_07_22_14_world_gameobject.sql new file mode 100644 index 00000000000..bf77d1a625f --- /dev/null +++ b/sql/updates/world/2012_07_22_14_world_gameobject.sql @@ -0,0 +1,21 @@ +-- GO missing spawn +-- Zone: Tanaris, Area: Land's End Beach or Finisterrae Beach +SET @GO_ENTRY := 142189; -- GO Inconspicuous Landmark entry +SET @GO_GUID := 329; -- Need one guid +SET @POOL := 355; -- Need one entry + +DELETE FROM `gameobject` WHERE `id`=@GO_ENTRY; +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +(17499,@GO_ENTRY,1,1,1,-10249.2,-3981.8,1.66783,-0.750491,0,0,0.366501,-0.930418,900,100,1), -- Already in TDB +(17498,@GO_ENTRY,1,1,1,-10119.7,-4052.46,5.33005,-0.366519,0,0,0.182236,-0.983255,900,100,1), -- Already in TDB +(@GO_GUID,@GO_ENTRY,1,1,1,-10154.2,-3948.635,7.744733,2.652894,0,0,0.970295,0.241925,900,100,1); + +DELETE FROM `pool_template` WHERE `entry`=@POOL; +INSERT INTO `pool_template` (`entry`,`max_limit`,`description`) VALUES +(@POOL,1 , 'GO Inconspicuous Landmark (142189)'); + +DELETE FROM `pool_gameobject` WHERE `guid` IN (17498,17499,@GO_GUID); +INSERT INTO `pool_gameobject` (`guid`,`pool_entry`,`chance`,`description`) VALUES +(17498,@POOL,0, 'Inconspicuous Landmark'), +(17499,@POOL,0, 'Inconspicuous Landmark'), +(@GO_GUID,@POOL,0, 'Inconspicuous Landmark'); diff --git a/sql/updates/world/2012_07_22_15_world_sai.sql b/sql/updates/world/2012_07_22_15_world_sai.sql new file mode 100644 index 00000000000..218eb9a3399 --- /dev/null +++ b/sql/updates/world/2012_07_22_15_world_sai.sql @@ -0,0 +1,27 @@ +-- SAI for quest 12150 "Reclusive Runemaster" +SET @Dregmar := 27003; +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@Dregmar; +UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry`=@Dregmar; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@Dregmar AND `source_type`=0 AND `id` BETWEEN 0 AND 2; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@Dregmar*100 AND `source_type`=9 AND `id` BETWEEN 0 AND 8; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@Dregmar,0,0,0,4,0,100,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Dregmar Runebrand - on aggro - yell text 0'), +(@Dregmar,0,1,0,2,0,100,1,0,50,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Dregmar Runebrand - at 50% HP - yell text 1'), +(@Dregmar,0,2,0,2,0,100,0,0,20,0,0,80,@Dregmar*100,2,0,0,0,0,1,0,0,0,0,0,0,0, 'Dregmar Runebrand - at 20% HP - run script'), +(@Dregmar*100,9,0,0,0,0,100,0,0,0,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Dregmar Runebrand - set phase 1'), +(@Dregmar*100,9,1,0,0,0,100,0,0,0,0,0,24,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Dregmar Runebrand - evade'), +(@Dregmar*100,9,2,0,0,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Dregmar Runebrand - Stop combat'), +(@Dregmar*100,9,3,0,0,0,100,0,0,0,0,0,18,33346,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Dregmar Runebrand - unitflags OutOfCombat'), +(@Dregmar*100,9,4,0,0,0,100,0,0,0,0,0,75,48325,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Dregmar Runebrand - apply aura RUNE SHIELD'), +(@Dregmar*100,9,5,0,0,0,100,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Dregmar Runebrand - yell text 2'), +(@Dregmar*100,9,6,0,0,0,100,0,0,14000,0,0,11,48028,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Dregmar Runebrand - Complete quest on player range'), +(@Dregmar*100,9,7,0,0,0,100,0,0,14000,0,0,19,514,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Dregmar Runebrand - unitflags reseted'), +(@Dregmar*100,9,8,0,0,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Dregmar Runebrand - force despawn'); + +-- creature_text +DELETE FROM `creature_ai_texts` WHERE `entry` BETWEEN -894 AND -892; +DELETE FROM `creature_text` WHERE `entry`=@Dregmar AND `groupid` BETWEEN 0 AND 2; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(@Dregmar,0,0, 'I know why you''ve come - one of those foolish Magnataur on the plains meddled and managed to get the dragons involved. Do you enjoy serving them like a dog?',14,0,100,0,0,0, 'Dregmar Runebrand - yell'), +(@Dregmar,1,0, 'You seek their leader... little thing, you wage war against the clans of Grom''thar the Thunderbringer himself. Don''t be so eager to rush to your death.',14,0,100,0,0,0, 'Dregmar Runebrand yell'), +(@Dregmar,2,0, 'Hah! So be it. Blow the horn of a magnataur leader at the ring of torches south of the Azure Dragonshrine. Make peace with your gods... Grom''thar will come.',14,0,100,0,0,0, 'Dregmar Runebrand yell'); diff --git a/sql/updates/world/2012_07_29_00_world_factionchange.sql b/sql/updates/world/2012_07_29_00_world_factionchange.sql new file mode 100644 index 00000000000..ca6c36630bc --- /dev/null +++ b/sql/updates/world/2012_07_29_00_world_factionchange.sql @@ -0,0 +1,9 @@ +-- Faction change item conversion for Reins of the Traveler's Tundra Mammoth +DELETE FROM `player_factionchange_items` WHERE `alliance_id`=44235; +INSERT INTO `player_factionchange_items` (`race_A`, `alliance_id`, `commentA`, `race_H`, `horde_id`, `commentH`) VALUES +(0,44235,'Reins of the Traveler''s Tundra Mammoth',0,44234,'Reins of the Traveler''s Tundra Mammoth'); + +-- Faction change spell conversion for Reins of the Traveler's Tundra Mammoth +DELETE FROM `player_factionchange_spells` WHERE `alliance_id`=61425; +INSERT INTO `player_factionchange_spells` (`alliance_id`,`horde_id`) VALUES +(61425,61447); diff --git a/sql/updates/world/2012_07_29_01_world_pool_quest.sql b/sql/updates/world/2012_07_29_01_world_pool_quest.sql new file mode 100644 index 00000000000..0e0f192c8d7 --- /dev/null +++ b/sql/updates/world/2012_07_29_01_world_pool_quest.sql @@ -0,0 +1,34 @@ +SET @pool_id := 356; + +DELETE FROM `pool_template` WHERE `entry` IN (@pool_id, @pool_id+1); +INSERT INTO `pool_template` (`entry`,`max_limit`,`description`) VALUES +(@pool_id,1,'Wind Trader Zhareem - Daily Quests'), +(@pool_id+1,1,'Nether-Stalker Mah''duun - Daily Quests'); + +DELETE FROM `pool_quest` WHERE `entry` IN (11369,11384,11382,11363,11362,11375,11354,11386,11373,11378,11374,11372,11368,11388,11499,11370) AND `pool_entry` = @pool_id; +DELETE FROM `pool_quest` WHERE `entry` IN (11389,11371,11376,11383,11364,11500,11385,11387) AND `pool_entry` = @pool_id+1; +INSERT INTO `pool_quest` (`entry`,`pool_entry`,`description`) VALUES +(11369,@pool_id,'Wanted: A Black Stalker Egg'), +(11384,@pool_id,'Wanted: A Warp Splinter Clipping'), +(11382,@pool_id,'Wanted: Aeonus''s Hourglass'), +(11363,@pool_id,'Wanted: Bladefist''s Seal'), +(11362,@pool_id,'Wanted: Keli''dan''s Feathered Stave'), +(11375,@pool_id,'Wanted: Murmur''s Whisper'), +(11354,@pool_id,'Wanted: Nazan''s Riding Crop'), +(11386,@pool_id,'Wanted: Pathaleon''s Projector'), +(11373,@pool_id,'Wanted: Shaffar''s Wondrous Pendant'), +(11378,@pool_id,'Wanted: The Epoch Hunter''s Head'), +(11374,@pool_id,'Wanted: The Exarch''s Soul Gem'), +(11372,@pool_id,'Wanted: The Headfeathers of Ikiss'), +(11368,@pool_id,'Wanted: The Heart of Quagmirran'), +(11388,@pool_id,'Wanted: The Scroll of Skyriss'), +(11499,@pool_id,'Wanted: The Signet Ring of Prince Kael''thas'), +(11370,@pool_id,'Wanted: The Warlord''s Treatise'), +(11389,@pool_id+1,'Wanted: Arcatraz Sentinels'), +(11371,@pool_id+1,'Wanted: Coilfang Myrmidons'), +(11376,@pool_id+1,'Wanted: Malicious Instructors'), +(11383,@pool_id+1,'Wanted: Rift Lords'), +(11364,@pool_id+1,'Wanted: Shattered Hand Centurions'), +(11500,@pool_id+1,'Wanted: Sisters of Torment'), +(11385,@pool_id+1,'Wanted: Sunseeker Channelers'), +(11387,@pool_id+1,'Wanted: Tempest-Forge Destroyers'); diff --git a/sql/updates/world/2012_07_29_02_world_sai.sql b/sql/updates/world/2012_07_29_02_world_sai.sql new file mode 100644 index 00000000000..1a452576139 --- /dev/null +++ b/sql/updates/world/2012_07_29_02_world_sai.sql @@ -0,0 +1,28 @@ +SET @Gossip :=9640; +SET @NPCText :=13047; + +DELETE FROM `gossip_menu` WHERE `entry` = @Gossip; +INSERT INTO `gossip_menu` VALUES +(@Gossip,@NPCText); + +DELETE FROM `gossip_menu_option` WHERE `menu_id` = @Gossip; +INSERT INTO `gossip_menu_option` VALUES +(@Gossip,0,0,"Soldier, you have new orders. You're to pull back and report to the sergeant!",1,1,0,0,0,0,NULL); + +UPDATE `creature_template` SET `gossip_menu_id` = @Gossip, AIName = 'SmartAI', `npcflag` = `npcflag`|1 WHERE `entry` = 28041; + +DELETE FROM `creature_ai_scripts` WHERE `creature_id` = 28041; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 28041 AND `source_type` = 0; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 28041*100 AND `source_type` = 9; +INSERT INTO `smart_scripts` VALUES +(28041,0,0,0,0,0,100,0,8000,10000,8000,12000,11,50370,0,0,0,0,0,2,0,0,0,0,0,0,0,'Argent Soldier - Combat - Cast Sunder Armor'), +(28041,0,1,2,62,0,100,0,@Gossip,0,0,0,33,28041,0,0,0,0,0,7,0,0,0,0,0,0,0,'Argent Soldier - On Gossip - Credit'), +(28041,0,2,3,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Argent Soldier - Event Linked - Close Gossip'), +(28041,0,3,4,61,0,100,0,0,0,0,0,81,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Argent Soldier - Event Linked - NpcFlag Remove'), +(28041,0,4,0,61,0,100,0,0,0,0,0,80,2804100,0,2,0,0,0,1,0,0,0,0,0,0,0,'Argent Soldier - Event Linked - Run Script'), +(28041*100,9,0,0,0,0,100,0,6000,6000,0,0,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Argent Soldier - Script 6 Seconds - Unseen'), +(28041*100,9,1,0,0,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Argent Soldier - Script - Despawn'); + +DELETE FROM `conditions` WHERE SourceTypeOrReferenceId= 15 AND SourceGroup=@Gossip; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15, @Gossip, 0, 0, 0, 9, 0, 12504, 0, 0, 0, 0, '', NULL); diff --git a/sql/updates/world/2012_07_29_03_world_sai.sql b/sql/updates/world/2012_07_29_03_world_sai.sql new file mode 100644 index 00000000000..d8ca1b12390 --- /dev/null +++ b/sql/updates/world/2012_07_29_03_world_sai.sql @@ -0,0 +1,7 @@ +-- [Q] Truce (11989) +SET @ENTRY := 26423; -- Drakuru +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ENTRY, 0, 0, 1, 62, 0, 100, 0, 9615, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Drakuru - On Gossip Select - Close Gossip'), +(@ENTRY, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 85, 50016, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Drakuru - On Gossip Select - Give kill credit'); diff --git a/sql/updates/world/2012_07_29_04_world_sai.sql b/sql/updates/world/2012_07_29_04_world_sai.sql new file mode 100644 index 00000000000..ef46c72f42c --- /dev/null +++ b/sql/updates/world/2012_07_29_04_world_sai.sql @@ -0,0 +1,17 @@ +UPDATE `creature` SET `spawntimesecs`=180 WHERE `id`=23689; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (23689,24170); + +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=23689; + +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (23689,24170) AND `source_type`=0; +insert into `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) values +(23689,0,1,2,65,0,100,0,0,0,0,0,11,36809,2,0,0,0,0,1,0,0,0,0,0,0,0,'Proto-Drake - Reach Target - Cast Spell (36809)'), +(23689,0,2,0,61,0,100,0,0,0,0,0,33,24170,0,0,0,0,0,18,35,0,0,0,0,0,0,'Draconis Gastritis Bunny - On Death - Quest Reward'), +(23689,0,3,5,1,0,100,0,10000,10000,10000,10000,29,0,0,24170,1,1,0,19,24170,75,0,0,0,0,0,'Proto-Drake - Find Target - Follow'), +(23689,0,4,0,65,0,100,0,0,0,0,0,51,0,0,0,0,0,0,19,24170,5,0,0,0,0,0,'Proto-Drake - Reach Target - Kill Dummy'), +(23689,0,5,3,61,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Proto-Drake - On Find Target - Set Phase 1'), +(23689,0,6,0,1,1,100,0,45000,45000,45000,45000,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Proto-Drake - Idle on Ground(Phase 1) - Despawn'), +(24170,0,0,0,54,0,100,0,0,0,0,0,50,186598,60000,0,0,0,0,1,0,0,0,0,0,0,0,'Draconis Gastritis Bunny - On Create - Spawn GO'), +(24170,0,1,0,6,0,100,0,0,0,0,0,33,24170,0,0,0,0,0,18,20,0,0,0,0,0,0,'Draconis Gastritis Bunny - On Death - Quest Reward'), +(24170,0,2,0,54,0,100,0,0,0,0,0,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Draconis Gastritis Bunny - On Create - Hide'), +(24170,0,3,0,6,0,100,0,0,0,0,0,41,0,0,0,0,0,0,15,186598,5,0,0,0,0,0,'Draconis Gastritis Bunny - On Death - Remove Gobjects'); diff --git a/sql/updates/world/2012_07_29_05_world_sai.sql b/sql/updates/world/2012_07_29_05_world_sai.sql new file mode 100644 index 00000000000..e1fd032eaca --- /dev/null +++ b/sql/updates/world/2012_07_29_05_world_sai.sql @@ -0,0 +1,34 @@ +-- Life or Death (12296) + +SET @ENTRY := 27482; -- Wounded Westfall Infantry npc +SET @SOURCETYPE := 0; +SET @CREDIT := 27466; -- Kill Credit Bunny - Wounded Skirmishers npc +SET @ITEM := 37576; -- Renewing Bandage item + +DELETE FROM `conditions` WHERE `SourceEntry`=@ITEM; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(18,0,@ITEM,0,24,1,@ENTRY,0,0,'', "Item Renewing Bandage target Wounded Westfall Infantry"); + +-- Wounded Westfall Infantry SAI +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,@SOURCETYPE,0,0,8,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,"On creature spellhit - Set phasemask 1 - self"), +(@ENTRY,@SOURCETYPE,1,0,1,1,100,0,0,0,3000,3000,1,0,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,"On OOC - Talk - Self"), +(@ENTRY,@SOURCETYPE,2,3,1,1,100,0,2000,2000,2000,2000,53,1,@ENTRY,0,12296,0,0,1,0,0,0,0.0,0.0,0.0,0.0,"On OOC Update 2 sec - Start WP 1 - Self"), +(@ENTRY,@SOURCETYPE,3,4,61,1,100,0,0,0,0,0,18,128,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,"Link - Set unit_flag 128 - Self"), +(@ENTRY,@SOURCETYPE,4,5,61,1,100,0,0,0,0,0,33,@CREDIT,0,0,0,0,0,7,0,0,0,0.0,0.0,0.0,0.0,"Link - Give credit - Invoker"), +(@ENTRY,@SOURCETYPE,5,0,61,1,100,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,"Link - Set phasemask 2 - Self"), +(@ENTRY,@SOURCETYPE,6,0,40,2,100,0,2,@ENTRY,0,0,41,0,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,"On WP 2 - Force despawn - Self"); + +DELETE FROM `creature_text` WHERE `entry`=@ENTRY; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(@ENTRY,0,0,"I'd nearly given up.You've given me new life!",12,0,50,0,0,0,"Wounded Westfall Infantry say text"), +(@ENTRY,0,1,"Bless you, friend.I nearly expired....",12,0,50,0,0,0,"Wounded Westfall Infantry say text"), +(@ENTRY,0,2,"Without your help, I surely would have died....",12,0,50,0,0,0,"Wounded Westfall Infantry say text"), +(@ENTRY,0,3,"Thank you $r.",12,0,50,0,0,0,"Wounded Westfall Infantry say text"); + +DELETE FROM `waypoints` WHERE `entry`=@ENTRY; +INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES +(@ENTRY,1,4105.278809,-2917.963867,280.320129,'Wounded Westfall Infantry'), +(@ENTRY,2,4048.682861,-2936.736572,275.191681,'Wounded Westfall Infantry'); diff --git a/sql/updates/world/2012_07_29_06_world_sai.sql b/sql/updates/world/2012_07_29_06_world_sai.sql new file mode 100644 index 00000000000..03ebdfc6d0a --- /dev/null +++ b/sql/updates/world/2012_07_29_06_world_sai.sql @@ -0,0 +1,43 @@ +-- Remove previous fix +DELETE FROM `gossip_menu` WHERE `entry` = 9640; +DELETE FROM `gossip_menu_option` WHERE `menu_id` = 9640; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 28041 AND `source_type` = 0; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 28041*100 AND `source_type` = 9; +DELETE FROM `conditions` WHERE SourceTypeOrReferenceId= 15 AND SourceGroup = 9640; + +-- Argent Crusade, We Are Leaving! (12504) + +SET @ENTRY := 28041; -- Argent Soldier +SET @SOURCETYPE := 0; +SET @CREDIT := 50289; -- Argent Crusade, We Are Leaving!: Argent Soldier Quest Credit +SET @MENUID := 9640; +SET @OPTION := 0; + +UPDATE `creature_template` SET `gossip_menu_id`=@MENUID,`npcflag`=1,`AIName`='SmartAI' WHERE `entry`=@ENTRY; + +DELETE FROM `gossip_menu_option` WHERE `menu_id`=@MENUID AND `id`=@OPTION; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`) VALUES +(@MENUID,@OPTION,0,"Soldier, you have new orders. You're to pull back and report to the sergeant!",1,1,0,0,0,0,''); + +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=@SOURCETYPE; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ENTRY,@SOURCETYPE,0,0,0,0,100,0,8000,10000,8000,12000,11,50370,0,0,0,0,0,2,0,0,0,0,0,0,0,"IC - Cast Sunder Armor - Victim"), +(@ENTRY,@SOURCETYPE,1,2,62,0,100,0,@MENUID,@OPTION,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"On gossip select - Close Gossip - Invoker"), +(@ENTRY,@SOURCETYPE,2,3,61,0,100,0,0,0,0,0,11,@CREDIT,0,0,0,0,0,7,0,0,0,0,0,0,0,"On link - Cast credit spell - Invoker"), +(@ENTRY,@SOURCETYPE,3,4,61,0,100,0,0,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0.0,0.0,0.0,0.0,"On link - Whisper - Invoker"), +(@ENTRY,@SOURCETYPE,4,0,61,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"On link - Despawn - Self"); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=@MENUID AND `SourceEntry`=@OPTION; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(15,@MENUID,@OPTION,2,9,12504,0,0,0,'',"Show gossip option 0 if player has quest 12504 marked as taken"); + +DELETE FROM `creature_text` WHERE `entry`=@ENTRY; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(@ENTRY,0,0,"Careful here, $C. These trolls killed their own snake god!",15,0,50,0,0,0,"Argent Soldier whisper text"), +(@ENTRY,0,1,"Watch your back. These Drakkari are a nasty lot.",15,0,50,0,0,0,"Argent Soldier whisper text"), +(@ENTRY,0,2,"These Drakkari are just bad news. We need to leave and head back to Justice Keep!",15,0,50,0,0,0,"Argent Soldier whisper text"), +(@ENTRY,0,3,"See you around.",15,0,50,0,0,0,"Argent Soldier whisper text"), +(@ENTRY,0,4,"I wonder where we're headed to. And who's going to deal with these guys?",15,0,50,0,0,0,"Argent Soldier whisper text"), +(@ENTRY,0,5,"Right. I'd better get back to the sergeant then.",15,0,50,0,0,0,"Argent Soldier whisper text"), +(@ENTRY,0,6,"Are you $N? I heard you were dead.",15,0,50,0,0,0,"Argent Soldier whisper text"); diff --git a/sql/updates/world/2012_07_29_07_world_sai.sql b/sql/updates/world/2012_07_29_07_world_sai.sql new file mode 100644 index 00000000000..18de6d15c0a --- /dev/null +++ b/sql/updates/world/2012_07_29_07_world_sai.sql @@ -0,0 +1,4 @@ +DELETE FROM `smart_scripts` WHERE `entryorguid`=181758 AND `source_type`=1; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(181758, 1, 0, 0, 20, 0, 100, 0, 9561, 0, 0, 0, 56, 23846, 1, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Add Nolkais Box after finishing quest: Nolkais Words'); +UPDATE `gameobject_template` SET `AIName`= 'SmartGameObjectAI' WHERE `entry`=181758; diff --git a/sql/updates/world/2012_07_29_08_world_sai.sql b/sql/updates/world/2012_07_29_08_world_sai.sql new file mode 100644 index 00000000000..796578d3f00 --- /dev/null +++ b/sql/updates/world/2012_07_29_08_world_sai.sql @@ -0,0 +1,36 @@ +-- Meeting at the Blackwing Coven quest fix + +-- Variables +SET @QUEST := 10722; +SET @ENTRY := 22019; +SET @SPELL1:= 37704; -- Whirlwind +SET @SPELL2:= 8599; -- Enrage + +-- Add SmartAI for Kolphis Darkscale +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,62,0,100,0,8439,0,0,0,15,@QUEST,0,0,0,0,0,7,0,0,0,0,0,0,0,'Kolphis Darkscale - On Gossip Select - Quest Credit'), +(@ENTRY,0,1,0,0,0,50,0,3000,3000,8000,8000,11,@SPELL1,0,0,0,0,0,2,0,0,0,0,0,0,0,'Kolphis Darkscale - Combat - Whirlwind'), +(@ENTRY,0,2,3,2,0,100,1,0,25,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kolphis Darkscale - On Health level - Emote when below 25% HP'), +(@ENTRY,0,3,0,61,0,100,1,0,0,0,0,11,@SPELL2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Kolphis Darkscale - On Health level - Cast Enrage when below 25% HP'); + +-- add missing text to Kolphis Darkscale from sniff +DELETE FROM `npc_text` WHERE `ID`=10540; +INSERT INTO `npc_text` (`ID`,`prob0`,`text0_0`,`text0_1`,`WDBVerified`) VALUES +(10540,1,"Begone, overseer! We've already spoken.$B$BStop dragging your feet and execute your orders at Ruuan Weald!",'',1); + +-- Kolphis Darkscale emote +DELETE FROM `creature_text` WHERE `entry`=@ENTRY; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(@ENTRY,0,0,'%s becomes enraged!',16,0,100,0,0,0,'Kolphis Darkscale'); + +-- Gossip menu insert from sniff +DELETE FROM `gossip_menu` WHERE `entry`=8436 AND `text_id`=10540; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8436,10540); + +-- Add gossip_menu conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=8436; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15,8436,0,0,0,9,0,@QUEST,0,0,0,0,'','Kolphis Darkscale - Show Gossip Option 0 - If on Quest Meeting at the Blackwing Coven'), +(14,8436,10540,0,0,28,0,@QUEST,0,0,0,0,'','Kolphis Darkscale - Show Gossip Menu - If Quest Meeting at the Blackwing Coven is Completed'); diff --git a/sql/updates/world/2012_07_29_09_world_gossip_menu_option.sql b/sql/updates/world/2012_07_29_09_world_gossip_menu_option.sql new file mode 100644 index 00000000000..66474bdb5e4 --- /dev/null +++ b/sql/updates/world/2012_07_29_09_world_gossip_menu_option.sql @@ -0,0 +1,12 @@ +UPDATE `gossip_menu_option` SET + `npc_option_npcflag` = 65536, + `option_icon` = 5 +WHERE + `menu_id` = 1293 AND + `id` = 1; + +UPDATE `gossip_menu_option` SET + `npc_option_npcflag` = 128 +WHERE + `menu_id` = 1293 AND + `id` = 2; diff --git a/sql/updates/world/2012_07_29_10_world_sai.sql b/sql/updates/world/2012_07_29_10_world_sai.sql new file mode 100644 index 00000000000..c5513bf2f25 --- /dev/null +++ b/sql/updates/world/2012_07_29_10_world_sai.sql @@ -0,0 +1,23 @@ +-- [Q] Measuring Warp Energies + +DELETE FROM `creature_ai_scripts` WHERE `creature_id` IN(20333,20336,20337,20338); +UPDATE `creature_template` SET AIName='SmartAI' WHERE `entry` IN (20333,20336,20337,20338); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (20333,20336,20337,20338); +INSERT INTO `smart_scripts` VALUES +(20333,0,0,0,8,0,100,0,35113,0,0,0,33,20333,0,0,0,0,0,7,0,0,0,0,0,0,0,"Northern Pipe Credit Marker - Spellhit - Credit"), +(20336,0,0,0,8,0,100,0,35113,0,0,0,33,20336,0,0,0,0,0,7,0,0,0,0,0,0,0,"Eastern Pipe Credit Marker - Spellhit - Credit"), +(20337,0,0,0,8,0,100,0,35113,0,0,0,33,20337,0,0,0,0,0,7,0,0,0,0,0,0,0,"Southern Pipe Credit Marker - Spellhit - Credit"), +(20338,0,0,0,8,0,100,0,35113,0,0,0,33,20338,0,0,0,0,0,7,0,0,0,0,0,0,0,"Western Pipe Credit Marker - Spellhit - Credit"); + +-- Conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=35113; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 35113, 0, 0, 31, 0, 3, 20333, 0, 0, 0, '', "Spell Search NPC 20333"), +(13, 1, 35113, 0, 1, 31, 0, 3, 20336, 0, 0, 0, '', "Spell Search NPC 20336"), +(13, 1, 35113, 0, 2, 31, 0, 3, 20337, 0, 0, 0, '', "Spell Search NPC 20337"), +(13, 1, 35113, 0, 3, 31, 0, 3, 20338, 0, 0, 0, '', "Spell Search NPC 20338"); + +UPDATE `creature` SET `position_x`=3214.92, `position_y`=4065.25, `position_z`=106.16 WHERE `id`=20333; +UPDATE `creature` SET `position_x`=2755.55, `position_y`=3863.32, `position_z`=142.27 WHERE `id`=20336; +UPDATE `creature` SET `position_x`=2819.01, `position_y`=4351.10, `position_z`=144.97 WHERE `id`=20337; +UPDATE `creature` SET `position_x`=2947.31, `position_y`=4327.47, `position_z`=154.02 WHERE `id`=20338; diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 103cde80f43..82d0945874c 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1782,7 +1782,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u break; for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) if (IsUnit(*itr)) - (*itr)->ToUnit()->SetByteFlag(UNIT_FIELD_BYTES_1, 0, e.action.setunitByte.byte1); + (*itr)->ToUnit()->SetByteFlag(UNIT_FIELD_BYTES_1, e.action.setunitByte.type, e.action.setunitByte.byte1); delete targets; break; @@ -1795,7 +1795,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) if (IsUnit(*itr)) - (*itr)->ToUnit()->RemoveByteFlag(UNIT_FIELD_BYTES_1, 0, e.action.delunitByte.byte1); + (*itr)->ToUnit()->RemoveByteFlag(UNIT_FIELD_BYTES_1, e.action.delunitByte.type, e.action.delunitByte.byte1); delete targets; break; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index cdb662edbaf..bc390441e04 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -827,11 +827,13 @@ struct SmartAction struct { uint32 byte1; + uint32 type; } setunitByte; struct { uint32 byte1; + uint32 type; } delunitByte; struct diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index 683a269f508..889f9d6fb75 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -134,15 +134,6 @@ void AuctionHouseMgr::SendAuctionWonMail(AuctionEntry* auction, SQLTransaction& // receiver exist if (bidder || bidder_accId) { - std::ostringstream msgAuctionWonSubject; - msgAuctionWonSubject << auction->item_template << ":0:" << AUCTION_WON; - - std::ostringstream msgAuctionWonBody; - msgAuctionWonBody.width(16); - msgAuctionWonBody << std::right << std::hex << auction->owner; - msgAuctionWonBody << std::dec << ':' << auction->bid << ':' << auction->buyout; - sLog->outDebug(LOG_FILTER_AUCTIONHOUSE, "AuctionWon body string : %s", msgAuctionWonBody.str().c_str()); - // set owner to bidder (to prevent delete item with sender char deleting) // owner in `data` will set at mail receive and item extracting PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ITEM_OWNER); @@ -157,7 +148,7 @@ void AuctionHouseMgr::SendAuctionWonMail(AuctionEntry* auction, SQLTransaction& bidder->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS, 1); } - MailDraft(msgAuctionWonSubject.str(), msgAuctionWonBody.str()) + MailDraft(auction->BuildAuctionMailSubject(AUCTION_WON), AuctionEntry::BuildAuctionMailBody(auction->owner, auction->bid, auction->buyout, 0, 0)) .AddItem(pItem) .SendMailTo(trans, MailReceiver(bidder, auction->bidder), auction, MAIL_CHECK_MASK_COPIED); } @@ -170,26 +161,8 @@ void AuctionHouseMgr::SendAuctionSalePendingMail(AuctionEntry* auction, SQLTrans uint32 owner_accId = sObjectMgr->GetPlayerAccountIdByGUID(owner_guid); // owner exist (online or offline) if (owner || owner_accId) - { - std::ostringstream msgAuctionSalePendingSubject; - msgAuctionSalePendingSubject << auction->item_template << ":0:" << AUCTION_SALE_PENDING; - - std::ostringstream msgAuctionSalePendingBody; - uint32 auctionCut = auction->GetAuctionCut(); - - time_t distrTime = time(NULL) + sWorld->getIntConfig(CONFIG_MAIL_DELIVERY_DELAY); - - msgAuctionSalePendingBody.width(16); - msgAuctionSalePendingBody << std::right << std::hex << auction->bidder; - msgAuctionSalePendingBody << std::dec << ':' << auction->bid << ':' << auction->buyout; - msgAuctionSalePendingBody << ':' << auction->deposit << ':' << auctionCut << ":0:"; - msgAuctionSalePendingBody << secsToTimeBitFields(distrTime); - - sLog->outDebug(LOG_FILTER_AUCTIONHOUSE, "AuctionSalePending body string : %s", msgAuctionSalePendingBody.str().c_str()); - - MailDraft(msgAuctionSalePendingSubject.str(), msgAuctionSalePendingBody.str()) + MailDraft(auction->BuildAuctionMailSubject(AUCTION_SALE_PENDING), AuctionEntry::BuildAuctionMailBody(auction->bidder, auction->bid, auction->buyout, auction->deposit, auction->GetAuctionCut())) .SendMailTo(trans, MailReceiver(owner, auction->owner), auction, MAIL_CHECK_MASK_COPIED); - } } //call this method to send mail to auction owner, when auction is successful, it does not clear ram @@ -201,20 +174,7 @@ void AuctionHouseMgr::SendAuctionSuccessfulMail(AuctionEntry* auction, SQLTransa // owner exist if (owner || owner_accId) { - std::ostringstream msgAuctionSuccessfulSubject; - msgAuctionSuccessfulSubject << auction->item_template << ":0:" << AUCTION_SUCCESSFUL; - - std::ostringstream auctionSuccessfulBody; - uint32 auctionCut = auction->GetAuctionCut(); - - auctionSuccessfulBody.width(16); - auctionSuccessfulBody << std::right << std::hex << auction->bidder; - auctionSuccessfulBody << std::dec << ':' << auction->bid << ':' << auction->buyout; - auctionSuccessfulBody << ':' << auction->deposit << ':' << auctionCut; - - sLog->outDebug(LOG_FILTER_AUCTIONHOUSE, "AuctionSuccessful body string : %s", auctionSuccessfulBody.str().c_str()); - - uint32 profit = auction->bid + auction->deposit - auctionCut; + uint32 profit = auction->bid + auction->deposit - auction->GetAuctionCut(); //FIXME: what do if owner offline if (owner) @@ -224,7 +184,8 @@ void AuctionHouseMgr::SendAuctionSuccessfulMail(AuctionEntry* auction, SQLTransa //send auction owner notification, bidder must be current! owner->GetSession()->SendAuctionOwnerNotification(auction); } - MailDraft(msgAuctionSuccessfulSubject.str(), auctionSuccessfulBody.str()) + + MailDraft(auction->BuildAuctionMailSubject(AUCTION_SUCCESSFUL), AuctionEntry::BuildAuctionMailBody(auction->bidder, auction->bid, auction->buyout, auction->deposit, auction->GetAuctionCut())) .AddMoney(profit) .SendMailTo(trans, MailReceiver(owner, auction->owner), auction, MAIL_CHECK_MASK_COPIED, sWorld->getIntConfig(CONFIG_MAIL_DELIVERY_DELAY)); } @@ -244,13 +205,10 @@ void AuctionHouseMgr::SendAuctionExpiredMail(AuctionEntry* auction, SQLTransacti // owner exist if (owner || owner_accId) { - std::ostringstream subject; - subject << auction->item_template << ":0:" << AUCTION_EXPIRED << ":0:0"; - if (owner) owner->GetSession()->SendAuctionOwnerNotification(auction); - MailDraft(subject.str(), "") // TODO: fix body + MailDraft(auction->BuildAuctionMailSubject(AUCTION_EXPIRED), AuctionEntry::BuildAuctionMailBody(0, 0, auction->buyout, auction->deposit, 0)) .AddItem(pItem) .SendMailTo(trans, MailReceiver(owner, auction->owner), auction, MAIL_CHECK_MASK_COPIED, 0); } @@ -269,13 +227,10 @@ void AuctionHouseMgr::SendAuctionOutbiddedMail(AuctionEntry* auction, uint32 new // old bidder exist if (oldBidder || oldBidder_accId) { - std::ostringstream msgAuctionOutbiddedSubject; - msgAuctionOutbiddedSubject << auction->item_template << ":0:" << AUCTION_OUTBIDDED << ":0:0"; - if (oldBidder && newBidder) oldBidder->GetSession()->SendAuctionBidderNotification(auction->GetHouseId(), auction->Id, newBidder->GetGUID(), newPrice, auction->GetAuctionOutBid(), auction->item_template); - MailDraft(msgAuctionOutbiddedSubject.str(), "") // TODO: fix body + MailDraft(auction->BuildAuctionMailSubject(AUCTION_OUTBIDDED), AuctionEntry::BuildAuctionMailBody(auction->owner, auction->bid, auction->buyout, auction->deposit, auction->GetAuctionCut())) .AddMoney(auction->bid) .SendMailTo(trans, MailReceiver(oldBidder, auction->bidder), auction, MAIL_CHECK_MASK_COPIED); } @@ -293,14 +248,9 @@ void AuctionHouseMgr::SendAuctionCancelledToBidderMail(AuctionEntry* auction, SQ // bidder exist if (bidder || bidder_accId) - { - std::ostringstream msgAuctionCancelledSubject; - msgAuctionCancelledSubject << auction->item_template << ":0:" << AUCTION_CANCELLED_TO_BIDDER << ":0:0"; - - MailDraft(msgAuctionCancelledSubject.str(), "") // TODO: fix body + MailDraft(auction->BuildAuctionMailSubject(AUCTION_CANCELLED_TO_BIDDER), AuctionEntry::BuildAuctionMailBody(auction->owner, auction->bid, auction->buyout, auction->deposit, 0)) .AddMoney(auction->bid) .SendMailTo(trans, MailReceiver(bidder, auction->bidder), auction, MAIL_CHECK_MASK_COPIED); - } } void AuctionHouseMgr::LoadAuctionItems() @@ -726,13 +676,14 @@ bool AuctionEntry::LoadFromDB(Field* fields) auctioneer = fields[1].GetUInt32(); item_guidlow = fields[2].GetUInt32(); item_template = fields[3].GetUInt32(); - owner = fields[4].GetUInt32(); - buyout = fields[5].GetUInt32(); - expire_time = fields[6].GetUInt32(); - bidder = fields[7].GetUInt32(); - bid = fields[8].GetUInt32(); - startbid = fields[9].GetUInt32(); - deposit = fields[10].GetUInt32(); + itemCount = fields[4].GetUInt32(); + owner = fields[5].GetUInt32(); + buyout = fields[6].GetUInt32(); + expire_time = fields[7].GetUInt32(); + bidder = fields[8].GetUInt32(); + bid = fields[9].GetUInt32(); + startbid = fields[10].GetUInt32(); + deposit = fields[11].GetUInt32(); CreatureData const* auctioneerData = sObjectMgr->GetCreatureData(auctioneer); if (!auctioneerData) @@ -847,13 +798,14 @@ bool AuctionEntry::LoadFromFieldList(Field* fields) auctioneer = fields[1].GetUInt32(); item_guidlow = fields[2].GetUInt32(); item_template = fields[3].GetUInt32(); - owner = fields[4].GetUInt32(); - buyout = fields[5].GetUInt32(); - expire_time = fields[6].GetUInt32(); - bidder = fields[7].GetUInt32(); - bid = fields[8].GetUInt32(); - startbid = fields[9].GetUInt32(); - deposit = fields[10].GetUInt32(); + itemCount = fields[4].GetUInt32(); + owner = fields[5].GetUInt32(); + buyout = fields[6].GetUInt32(); + expire_time = fields[7].GetUInt32(); + bidder = fields[8].GetUInt32(); + bid = fields[9].GetUInt32(); + startbid = fields[10].GetUInt32(); + deposit = fields[11].GetUInt32(); CreatureData const* auctioneerData = sObjectMgr->GetCreatureData(auctioneer); if (!auctioneerData) @@ -880,3 +832,20 @@ bool AuctionEntry::LoadFromFieldList(Field* fields) return true; } + +std::string AuctionEntry::BuildAuctionMailSubject(MailAuctionAnswers response) const +{ + std::ostringstream strm; + strm << item_template << ":0:" << response << ':' << Id << ':' << itemCount; + return strm.str(); +} + +std::string AuctionEntry::BuildAuctionMailBody(uint32 lowGuid, uint32 bid, uint32 buyout, uint32 deposit, uint32 cut) +{ + std::ostringstream strm; + strm.width(16); + strm << std::right << std::hex << MAKE_NEW_GUID(lowGuid, 0, HIGHGUID_PLAYER); // HIGHGUID_PLAYER always present, even for empty guids + strm << std::dec << ':' << bid << ':' << buyout; + strm << ':' << deposit << ':' << cut; + return strm.str(); +} diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h index 190fbcc5107..049440f99d0 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.h +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h @@ -48,12 +48,24 @@ enum AuctionAction AUCTION_PLACE_BID = 2 }; +enum MailAuctionAnswers +{ + AUCTION_OUTBIDDED = 0, + AUCTION_WON = 1, + AUCTION_SUCCESSFUL = 2, + AUCTION_EXPIRED = 3, + AUCTION_CANCELLED_TO_BIDDER = 4, + AUCTION_CANCELED = 5, + AUCTION_SALE_PENDING = 6 +}; + struct AuctionEntry { uint32 Id; uint32 auctioneer; // creature low guid uint32 item_guidlow; uint32 item_template; + uint32 itemCount; uint32 owner; uint32 startbid; //maybe useless uint32 bid; @@ -74,6 +86,8 @@ struct AuctionEntry void SaveToDB(SQLTransaction& trans) const; bool LoadFromDB(Field* fields); bool LoadFromFieldList(Field* fields); + std::string BuildAuctionMailSubject(MailAuctionAnswers response) const; + static std::string BuildAuctionMailBody(uint32 lowGuid, uint32 bid, uint32 buyout, uint32 deposit, uint32 cut); }; diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 110be872b9a..32a6273abd4 100755 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -38,13 +38,6 @@ bool ChatHandler::load_command_table = true; -// wrapper for old-style handlers -template<bool (ChatHandler::*F)(const char*)> -bool OldHandler(ChatHandler* chatHandler, const char* args) -{ - return (chatHandler->*F)(args); -} - // get number of commands in table static size_t getCommandTableSize(const ChatCommand* commands) { @@ -67,153 +60,6 @@ static size_t appendCommandTable(ChatCommand* target, const ChatCommand* source) ChatCommand* ChatHandler::getCommandTable() { - static ChatCommand channelSetCommandTable[] = - { - { "ownership", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleChannelSetOwnership>, "", NULL }, - { NULL, 0, false, NULL, "", NULL } - }; - - static ChatCommand channelCommandTable[] = - { - { "set", SEC_ADMINISTRATOR, true, NULL, "", channelSetCommandTable }, - { NULL, 0, false, NULL, "", NULL } - }; - - static ChatCommand groupCommandTable[] = - { - { "leader", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleGroupLeaderCommand>, "", NULL }, - { "disband", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleGroupDisbandCommand>, "", NULL }, - { "remove", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleGroupRemoveCommand>, "", NULL }, - { NULL, 0, false, NULL, "", NULL } - }; - - static ChatCommand petCommandTable[] = - { - { "create", SEC_GAMEMASTER, false, OldHandler<&ChatHandler::HandleCreatePetCommand>, "", NULL }, - { "learn", SEC_GAMEMASTER, false, OldHandler<&ChatHandler::HandlePetLearnCommand>, "", NULL }, - { "unlearn", SEC_GAMEMASTER, false, OldHandler<&ChatHandler::HandlePetUnlearnCommand>, "", NULL }, - { NULL, 0, false, NULL, "", NULL } - }; - - static ChatCommand pdumpCommandTable[] = - { - { "load", SEC_ADMINISTRATOR, true, OldHandler<&ChatHandler::HandlePDumpLoadCommand>, "", NULL }, - { "write", SEC_ADMINISTRATOR, true, OldHandler<&ChatHandler::HandlePDumpWriteCommand>, "", NULL }, - { NULL, 0, false, NULL, "", NULL } - }; - - static ChatCommand sendCommandTable[] = - { - { "items", SEC_ADMINISTRATOR, true, OldHandler<&ChatHandler::HandleSendItemsCommand>, "", NULL }, - { "mail", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleSendMailCommand>, "", NULL }, - { "message", SEC_ADMINISTRATOR, true, OldHandler<&ChatHandler::HandleSendMessageCommand>, "", NULL }, - { "money", SEC_ADMINISTRATOR, true, OldHandler<&ChatHandler::HandleSendMoneyCommand>, "", NULL }, - { NULL, 0, false, NULL, "", NULL } - }; - - static ChatCommand ticketResponseCommandTable[] = - { - { "append", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketResponseAppendCommand>, "", NULL }, - { "appendln", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketResponseAppendLnCommand>, "", NULL }, - { NULL, 0, false, NULL, "", NULL } - }; - - static ChatCommand ticketCommandTable[] = - { - { "list", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketListCommand>, "", NULL }, - { "onlinelist", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketListOnlineCommand>, "", NULL }, - { "viewname", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketGetByNameCommand>, "", NULL }, - { "viewid", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketGetByIdCommand>, "", NULL }, - { "close", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketCloseByIdCommand>, "", NULL }, - { "closedlist", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketListClosedCommand>, "", NULL }, - { "escalatedlist", SEC_GAMEMASTER, true, OldHandler<&ChatHandler::HandleGMTicketListEscalatedCommand>, "", NULL }, - { "delete", SEC_ADMINISTRATOR, true, OldHandler<&ChatHandler::HandleGMTicketDeleteByIdCommand>, "", NULL }, - { "reset", SEC_ADMINISTRATOR, true, OldHandler<&ChatHandler::HandleGMTicketResetCommand>, "", NULL }, - { "assign", SEC_GAMEMASTER, true, OldHandler<&ChatHandler::HandleGMTicketAssignToCommand>, "", NULL }, - { "unassign", SEC_GAMEMASTER, true, OldHandler<&ChatHandler::HandleGMTicketUnAssignCommand>, "", NULL }, - { "comment", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketCommentCommand>, "", NULL }, - { "togglesystem", SEC_ADMINISTRATOR, true, OldHandler<&ChatHandler::HandleToggleGMTicketSystem>, "", NULL }, - { "escalate", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketEscalateCommand>, "", NULL }, - { "response", SEC_MODERATOR, true, NULL, "", ticketResponseCommandTable }, - { "complete", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketCompleteCommand>, "", NULL }, - { NULL, 0, false, NULL, "", NULL } - }; - - static ChatCommand commandTable[] = - { - { "pdump", SEC_ADMINISTRATOR, true, NULL, "", pdumpCommandTable }, - { "group", SEC_ADMINISTRATOR, false, NULL, "", groupCommandTable }, - - { "channel", SEC_ADMINISTRATOR, true, NULL, "", channelCommandTable }, - - { "pet", SEC_GAMEMASTER, false, NULL, "", petCommandTable }, - { "ticket", SEC_MODERATOR, false, NULL, "", ticketCommandTable }, - - { "aura", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleAuraCommand>, "", NULL }, - { "unaura", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleUnAuraCommand>, "", NULL }, - { "nameannounce", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleNameAnnounceCommand>, "", NULL }, - { "gmnameannounce", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMNameAnnounceCommand>, "", NULL }, - { "announce", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleAnnounceCommand>, "", NULL }, - { "gmannounce", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMAnnounceCommand>, "", NULL }, - { "notify", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleNotifyCommand>, "", NULL }, - { "gmnotify", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMNotifyCommand>, "", NULL }, - { "appear", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleAppearCommand>, "", NULL }, - { "summon", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleSummonCommand>, "", NULL }, - { "groupsummon", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleGroupSummonCommand>, "", NULL }, - { "commands", SEC_PLAYER, true, OldHandler<&ChatHandler::HandleCommandsCommand>, "", NULL }, - { "die", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleDieCommand>, "", NULL }, - { "revive", SEC_ADMINISTRATOR, true, OldHandler<&ChatHandler::HandleReviveCommand>, "", NULL }, - { "dismount", SEC_PLAYER, false, OldHandler<&ChatHandler::HandleDismountCommand>, "", NULL }, - { "guid", SEC_GAMEMASTER, false, OldHandler<&ChatHandler::HandleGUIDCommand>, "", NULL }, - { "help", SEC_PLAYER, true, OldHandler<&ChatHandler::HandleHelpCommand>, "", NULL }, - { "itemmove", SEC_GAMEMASTER, false, OldHandler<&ChatHandler::HandleItemMoveCommand>, "", NULL }, - { "cooldown", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleCooldownCommand>, "", NULL }, - { "unlearn", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleUnLearnCommand>, "", NULL }, - { "distance", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleGetDistanceCommand>, "", NULL }, - { "recall", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleRecallCommand>, "", NULL }, - { "save", SEC_PLAYER, false, OldHandler<&ChatHandler::HandleSaveCommand>, "", NULL }, - { "saveall", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleSaveAllCommand>, "", NULL }, - { "kick", SEC_GAMEMASTER, true, OldHandler<&ChatHandler::HandleKickPlayerCommand>, "", NULL }, - { "start", SEC_PLAYER, false, OldHandler<&ChatHandler::HandleStartCommand>, "", NULL }, - { "taxicheat", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleTaxiCheatCommand>, "", NULL }, - { "linkgrave", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleLinkGraveCommand>, "", NULL }, - { "neargrave", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleNearGraveCommand>, "", NULL }, - { "explorecheat", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleExploreCheatCommand>, "", NULL }, - { "levelup", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleLevelUpCommand>, "", NULL }, - { "showarea", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleShowAreaCommand>, "", NULL }, - { "hidearea", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleHideAreaCommand>, "", NULL }, - { "additem", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleAddItemCommand>, "", NULL }, - { "additemset", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleAddItemSetCommand>, "", NULL }, - { "bank", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleBankCommand>, "", NULL }, - { "wchange", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleChangeWeather>, "", NULL }, - { "maxskill", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleMaxSkillCommand>, "", NULL }, - { "setskill", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleSetSkillCommand>, "", NULL }, - { "whispers", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleWhispersCommand>, "", NULL }, - { "pinfo", SEC_GAMEMASTER, true, OldHandler<&ChatHandler::HandlePInfoCommand>, "", NULL }, - { "respawn", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleRespawnCommand>, "", NULL }, - { "send", SEC_MODERATOR, true, NULL, "", sendCommandTable }, - { "mute", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleMuteCommand>, "", NULL }, - { "unmute", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleUnmuteCommand>, "", NULL }, - { "movegens", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleMovegensCommand>, "", NULL }, - { "cometome", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleComeToMeCommand>, "", NULL }, - { "damage", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleDamageCommand>, "", NULL }, - { "combatstop", SEC_GAMEMASTER, true, OldHandler<&ChatHandler::HandleCombatStopCommand>, "", NULL }, - { "flusharenapoints", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleFlushArenaPointsCommand>, "", NULL }, - { "repairitems", SEC_GAMEMASTER, true, OldHandler<&ChatHandler::HandleRepairitemsCommand>, "", NULL }, - { "waterwalk", SEC_GAMEMASTER, false, OldHandler<&ChatHandler::HandleWaterwalkCommand>, "", NULL }, - - { "freeze", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleFreezeCommand>, "", NULL }, - { "unfreeze", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleUnFreezeCommand>, "", NULL }, - { "listfreeze", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleListFreezeCommand>, "", NULL }, - - { "possess", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandlePossessCommand>, "", NULL }, - { "unpossess", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleUnPossessCommand>, "", NULL }, - { "bindsight", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleBindSightCommand>, "", NULL }, - { "unbindsight", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleUnbindSightCommand>, "", NULL }, - { "playall", SEC_GAMEMASTER, false, OldHandler<&ChatHandler::HandlePlayAllCommand>, "", NULL }, - { NULL, 0, false, NULL, "", NULL } - }; - // cache for commands, needed because some commands are loaded dynamically through ScriptMgr // cache is never freed and will show as a memory leak in diagnostic tools // can't use vector as vector storage is implementation-dependent, eg, there can be alignment gaps between elements @@ -225,25 +71,23 @@ ChatCommand* ChatHandler::getCommandTable() { // count total number of top-level commands - size_t total = getCommandTableSize(commandTable); + size_t total = 0; std::vector<ChatCommand*> const& dynamic = sScriptMgr->GetChatCommands(); for (std::vector<ChatCommand*>::const_iterator it = dynamic.begin(); it != dynamic.end(); ++it) total += getCommandTableSize(*it); total += 1; // ending zero // cache top-level commands + size_t added = 0; commandTableCache = (ChatCommand*)malloc(sizeof(ChatCommand) * total); memset(commandTableCache, 0, sizeof(ChatCommand) * total); ACE_ASSERT(commandTableCache); - size_t added = appendCommandTable(commandTableCache, commandTable); for (std::vector<ChatCommand*>::const_iterator it = dynamic.begin(); it != dynamic.end(); ++it) added += appendCommandTable(commandTableCache + added, *it); } PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_COMMANDS); - PreparedQueryResult result = WorldDatabase.Query(stmt); - if (result) { do @@ -253,7 +97,8 @@ ChatCommand* ChatHandler::getCommandTable() SetDataForCommandInTable(commandTableCache, name.c_str(), fields[1].GetUInt8(), fields[2].GetString(), name); - } while (result->NextRow()); + } + while (result->NextRow()); } } diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index 47734036071..269ebdd1d2f 100755 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -123,144 +123,15 @@ class ChatHandler void SetSentErrorMessage(bool val){ sentErrorMessage = val; } static bool LoadCommandTable() { return load_command_table; } static void SetLoadCommandTable(bool val) { load_command_table = val; } - - // cs_character - void HandleCharacterLevel(Player* player, uint64 playerGuid, uint32 oldLevel, uint32 newLevel); + bool ShowHelpForCommand(ChatCommand* table, const char* cmd); protected: explicit ChatHandler() : m_session(NULL) {} // for CLI subclass static bool SetDataForCommandInTable(ChatCommand* table, const char* text, uint32 security, std::string const& help, std::string const& fullcommand); bool ExecuteCommandInTable(ChatCommand* table, const char* text, const std::string& fullcmd); - bool ShowHelpForCommand(ChatCommand* table, const char* cmd); bool ShowHelpForSubCommands(ChatCommand* table, char const* cmd, char const* subcmd); - bool HandleNameAnnounceCommand(const char* args); - bool HandleGMNameAnnounceCommand(const char* args); - bool HandleGMAnnounceCommand(const char* args); - bool HandleGMNotifyCommand(const char* args); - - bool HandleChannelSetOwnership(const char *args); - - bool HandlePossessCommand(const char* args); - bool HandleUnPossessCommand(const char* args); - bool HandleBindSightCommand(const char* args); - bool HandleUnbindSightCommand(const char* args); - - bool HandlePDumpLoadCommand(const char *args); - bool HandlePDumpWriteCommand(const char *args); - - bool HandleSendItemsCommand(const char* args); - bool HandleSendMailCommand(const char* args); - bool HandleSendMessageCommand(const char * args); - bool HandleSendMoneyCommand(const char* args); - - bool HandleHelpCommand(const char* args); - bool HandleCommandsCommand(const char* args); - bool HandleStartCommand(const char* args); - bool HandleDismountCommand(const char* args); - bool HandleSaveCommand(const char* args); - - bool HandleSummonCommand(const char* args); - bool HandleAppearCommand(const char* args); - bool HandleGroupSummonCommand(const char* args); - bool HandleRecallCommand(const char* args); - bool HandleAnnounceCommand(const char* args); - bool HandleNotifyCommand(const char* args); - bool HandleTaxiCheatCommand(const char* args); - bool HandleWhispersCommand(const char* args); - - bool HandleGUIDCommand(const char* args); - bool HandleItemMoveCommand(const char* args); - bool HandleDeMorphCommand(const char* args); - bool HandlePInfoCommand(const char* args); - bool HandleMuteCommand(const char* args); - bool HandleUnmuteCommand(const char* args); - bool HandleMovegensCommand(const char* args); - bool HandleFreezeCommand(const char *args); - bool HandleUnFreezeCommand(const char *args); - bool HandleListFreezeCommand(const char* args); - - bool HandleCooldownCommand(const char* args); - bool HandleUnLearnCommand(const char* args); - bool HandleGetDistanceCommand(const char* args); - bool HandleDieCommand(const char* args); - bool HandleDamageCommand(const char *args); - bool HandleReviveCommand(const char* args); - bool HandleAuraCommand(const char* args); - bool HandleUnAuraCommand(const char* args); - bool HandleLinkGraveCommand(const char* args); - bool HandleNearGraveCommand(const char* args); - bool HandleActivateObjectCommand(const char* args); - bool HandleSpawnTransportCommand(const char* args); - bool HandleExploreCheatCommand(const char* args); - bool HandleWaterwalkCommand(const char* args); - bool HandleLevelUpCommand(const char* args); - bool HandleShowAreaCommand(const char* args); - bool HandleHideAreaCommand(const char* args); - bool HandleAddItemCommand(const char* args); - bool HandleAddItemSetCommand(const char* args); - bool HandlePetUnlearnCommand(const char* args); - bool HandlePetLearnCommand(const char* args); - bool HandleCreatePetCommand(const char* args); - - bool HandleGroupLeaderCommand(const char* args); - bool HandleGroupDisbandCommand(const char* args); - bool HandleGroupRemoveCommand(const char* args); - - bool HandleBankCommand(const char* args); - bool HandleChangeWeather(const char* args); - bool HandleKickPlayerCommand(const char * args); - - // GM ticket command handlers - bool HandleGMTicketListCommand(const char* args); - bool HandleGMTicketListOnlineCommand(const char* args); - bool HandleGMTicketListClosedCommand(const char* args); - bool HandleGMTicketListEscalatedCommand(const char* args); - bool HandleGMTicketGetByIdCommand(const char* args); - bool HandleGMTicketGetByNameCommand(const char* args); - bool HandleGMTicketCloseByIdCommand(const char* args); - bool HandleGMTicketAssignToCommand(const char* args); - bool HandleGMTicketUnAssignCommand(const char* args); - bool HandleGMTicketCommentCommand(const char* args); - bool HandleGMTicketDeleteByIdCommand(const char* args); - bool HandleGMTicketResetCommand(const char* /* args */); - bool HandleGMTicketReloadCommand(const char*); - bool HandleToggleGMTicketSystem(const char* args); - bool HandleGMTicketEscalateCommand(const char* args); - bool HandleGMTicketCompleteCommand(const char* args); - bool HandleGMTicketResponseAppendCommand(const char* args); - bool HandleGMTicketResponseAppendLnCommand(const char* args); - - bool HandleMaxSkillCommand(const char* args); - bool HandleSetSkillCommand(const char* args); - bool HandleRespawnCommand(const char* args); - bool HandleComeToMeCommand(const char *args); - bool HandleCombatStopCommand(const char *args); - - /*bool HandleCharDeleteCommand(const char *args); - bool HandleSendMessageCommand(const char * args);*/ - - bool HandleFlushArenaPointsCommand(const char *args); - bool HandlePlayAllCommand(const char* args); - bool HandleRepairitemsCommand(const char* args); - - bool HandleTempGameObjectCommand(const char* args); - - //! Development Commands - - /*bool HandleQuestAdd(const char * args); - bool HandleQuestRemove(const char * args); - bool HandleQuestComplete(const char * args);*/ - - //bool HandleSet32Bit(const char* args); - bool HandleSaveAllCommand(const char* args); - - // Utility methods for commands - void HandleLearnSkillRecipesHelper(Player* player, uint32 skill_id); - private: - bool _HandleGMTicketResponseAppendCommand(const char* args, bool newLine); - WorldSession* m_session; // != NULL for chat command call and NULL for CLI command // common global flag diff --git a/src/server/game/Chat/Commands/Level0.cpp b/src/server/game/Chat/Commands/Level0.cpp deleted file mode 100755 index b05ba9b4194..00000000000 --- a/src/server/game/Chat/Commands/Level0.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program 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 2 of the License, or (at your - * option) any later version. - * - * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "Common.h" -#include "World.h" -#include "Player.h" -#include "Chat.h" -#include "ObjectAccessor.h" -#include "Language.h" -#include "AccountMgr.h" -#include "SystemConfig.h" -#include "revision.h" -#include "Util.h" - -bool ChatHandler::HandleHelpCommand(const char* args) -{ - char* cmd = strtok((char*)args, " "); - if (!cmd) - { - ShowHelpForCommand(getCommandTable(), "help"); - ShowHelpForCommand(getCommandTable(), ""); - } - else - { - if (!ShowHelpForCommand(getCommandTable(), cmd)) - SendSysMessage(LANG_NO_HELP_CMD); - } - - return true; -} - -bool ChatHandler::HandleCommandsCommand(const char* /*args*/) -{ - ShowHelpForCommand(getCommandTable(), ""); - return true; -} - -bool ChatHandler::HandleStartCommand(const char* /*args*/) -{ - Player* player = m_session->GetPlayer(); - - if (player->isInFlight()) - { - SendSysMessage(LANG_YOU_IN_FLIGHT); - SetSentErrorMessage(true); - return false; - } - - if (player->isInCombat()) - { - SendSysMessage(LANG_YOU_IN_COMBAT); - SetSentErrorMessage(true); - return false; - } - - if (player->isDead() || player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) - { - // if player is dead and stuck, send ghost to graveyard - player->RepopAtGraveyard(); - return true; - } - - // cast spell Stuck - player->CastSpell(player, 7355, false); - return true; -} - -bool ChatHandler::HandleDismountCommand(const char* /*args*/) -{ - Player* player = m_session->GetPlayer(); - - //If player is not mounted, so go out :) - if (!player->IsMounted()) - { - SendSysMessage(LANG_CHAR_NON_MOUNTED); - SetSentErrorMessage(true); - return false; - } - - if (player->isInFlight()) - { - SendSysMessage(LANG_YOU_IN_FLIGHT); - SetSentErrorMessage(true); - return false; - } - - player->Dismount(); - player->RemoveAurasByType(SPELL_AURA_MOUNTED); - return true; -} - -bool ChatHandler::HandleSaveCommand(const char* /*args*/) -{ - Player* player = m_session->GetPlayer(); - - // save GM account without delay and output message - if (!AccountMgr::IsPlayerAccount(m_session->GetSecurity())) - { - if (Player* target = getSelectedPlayer()) - target->SaveToDB(); - else - player->SaveToDB(); - SendSysMessage(LANG_PLAYER_SAVED); - return true; - } - - // save if the player has last been saved over 20 seconds ago - uint32 save_interval = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE); - if (save_interval == 0 || (save_interval > 20 * IN_MILLISECONDS && player->GetSaveTimer() <= save_interval - 20 * IN_MILLISECONDS)) - player->SaveToDB(); - - return true; -} - diff --git a/src/server/game/Chat/Commands/Level1.cpp b/src/server/game/Chat/Commands/Level1.cpp deleted file mode 100755 index 1cf3d5c9b4e..00000000000 --- a/src/server/game/Chat/Commands/Level1.cpp +++ /dev/null @@ -1,629 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program 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 2 of the License, or (at your - * option) any later version. - * - * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "Common.h" -#include "DatabaseEnv.h" -#include "WorldPacket.h" -#include "WorldSession.h" -#include "World.h" -#include "ObjectMgr.h" -#include "TicketMgr.h" -#include "Player.h" -#include "AccountMgr.h" -#include "Opcodes.h" -#include "Chat.h" -#include "Log.h" -#include "MapManager.h" -#include "ObjectAccessor.h" -#include "Language.h" -#include "CellImpl.h" -#include "InstanceSaveMgr.h" -#include "Util.h" -#include "Group.h" - -#ifdef _DEBUG_VMAPS -#include "VMapFactory.h" -#endif - -bool ChatHandler::HandleNameAnnounceCommand(const char* args) -{ - if (!*args) - return false; - - std::string name("Console"); - if (WorldSession* session = GetSession()) - name = session->GetPlayer()->GetName(); - - sWorld->SendWorldText(LANG_ANNOUNCE_COLOR, name.c_str(), args); - return true; -} - -bool ChatHandler::HandleGMNameAnnounceCommand(const char* args) -{ - if (!*args) - return false; - - std::string name("Console"); - if (WorldSession* session = GetSession()) - name = session->GetPlayer()->GetName(); - - sWorld->SendGMText(LANG_GM_ANNOUNCE_COLOR, name.c_str(), args); - return true; -} - -// global announce -bool ChatHandler::HandleAnnounceCommand(const char* args) -{ - if (!*args) - return false; - - char buff[2048]; - sprintf(buff, GetTrinityString(LANG_SYSTEMMESSAGE), args); - sWorld->SendServerMessage(SERVER_MSG_STRING, buff); - return true; -} - -// announce to logged in GMs -bool ChatHandler::HandleGMAnnounceCommand(const char* args) -{ - if (!*args) - return false; - - sWorld->SendGMText(LANG_GM_BROADCAST, args); - return true; -} - -//notification player at the screen -bool ChatHandler::HandleNotifyCommand(const char* args) -{ - if (!*args) - return false; - - std::string str = GetTrinityString(LANG_GLOBAL_NOTIFY); - str += args; - - WorldPacket data(SMSG_NOTIFICATION, (str.size()+1)); - data << str; - sWorld->SendGlobalMessage(&data); - - return true; -} - -//notification GM at the screen -bool ChatHandler::HandleGMNotifyCommand(const char* args) -{ - if (!*args) - return false; - - std::string str = GetTrinityString(LANG_GM_NOTIFY); - str += args; - - WorldPacket data(SMSG_NOTIFICATION, (str.size()+1)); - data << str; - sWorld->SendGlobalGMMessage(&data); - - return true; -} - -//Summon Player -bool ChatHandler::HandleSummonCommand(const char* args) -{ - Player* target; - uint64 target_guid; - std::string target_name; - if (!extractPlayerTarget((char*)args, &target, &target_guid, &target_name)) - return false; - - Player* _player = m_session->GetPlayer(); - if (target == _player || target_guid == _player->GetGUID()) - { - PSendSysMessage(LANG_CANT_TELEPORT_SELF); - SetSentErrorMessage(true); - return false; - } - - if (target) - { - std::string nameLink = playerLink(target_name); - // check online security - if (HasLowerSecurity(target, 0)) - return false; - - if (target->IsBeingTeleported()) - { - PSendSysMessage(LANG_IS_TELEPORTED, nameLink.c_str()); - SetSentErrorMessage(true); - return false; - } - - Map* map = m_session->GetPlayer()->GetMap(); - - if (map->IsBattlegroundOrArena()) - { - // only allow if gm mode is on - if (!_player->isGameMaster()) - { - PSendSysMessage(LANG_CANNOT_GO_TO_BG_GM, nameLink.c_str()); - SetSentErrorMessage(true); - return false; - } - // if both players are in different bgs - else if (target->GetBattlegroundId() && m_session->GetPlayer()->GetBattlegroundId() != target->GetBattlegroundId()) - target->LeaveBattleground(false); // Note: should be changed so target gets no Deserter debuff - - // all's well, set bg id - // when porting out from the bg, it will be reset to 0 - target->SetBattlegroundId(m_session->GetPlayer()->GetBattlegroundId(), m_session->GetPlayer()->GetBattlegroundTypeId()); - // remember current position as entry point for return at bg end teleportation - if (!target->GetMap()->IsBattlegroundOrArena()) - target->SetBattlegroundEntryPoint(); - } - else if (map->IsDungeon()) - { - Map* cMap = target->GetMap(); - - if (cMap->Instanceable() && cMap->GetInstanceId() != map->GetInstanceId()) - target->UnbindInstance(map->GetInstanceId(), target->GetDungeonDifficulty(), true); - - // we are in instance, and can summon only player in our group with us as lead - if (!m_session->GetPlayer()->GetGroup() || !target->GetGroup() || - (target->GetGroup()->GetLeaderGUID() != m_session->GetPlayer()->GetGUID()) || - (m_session->GetPlayer()->GetGroup()->GetLeaderGUID() != m_session->GetPlayer()->GetGUID())) - // the last check is a bit excessive, but let it be, just in case - { - PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST, nameLink.c_str()); - SetSentErrorMessage(true); - return false; - } - } - - PSendSysMessage(LANG_SUMMONING, nameLink.c_str(), ""); - if (needReportToTarget(target)) - ChatHandler(target).PSendSysMessage(LANG_SUMMONED_BY, playerLink(_player->GetName()).c_str()); - - // stop flight if need - if (target->isInFlight()) - { - target->GetMotionMaster()->MovementExpired(); - target->CleanupAfterTaxiFlight(); - } - // save only in non-flight case - else - target->SaveRecallPosition(); - - // before GM - float x, y, z; - m_session->GetPlayer()->GetClosePoint(x, y, z, target->GetObjectSize()); - target->TeleportTo(m_session->GetPlayer()->GetMapId(), x, y, z, target->GetOrientation()); - target->SetPhaseMask(m_session->GetPlayer()->GetPhaseMask(), true); - } - else - { - // check offline security - if (HasLowerSecurity(NULL, target_guid)) - return false; - - std::string nameLink = playerLink(target_name); - - PSendSysMessage(LANG_SUMMONING, nameLink.c_str(), GetTrinityString(LANG_OFFLINE)); - - // in point where GM stay - Player::SavePositionInDB(m_session->GetPlayer()->GetMapId(), - m_session->GetPlayer()->GetPositionX(), - m_session->GetPlayer()->GetPositionY(), - m_session->GetPlayer()->GetPositionZ(), - m_session->GetPlayer()->GetOrientation(), - m_session->GetPlayer()->GetZoneId(), - target_guid); - } - - return true; -} - -//Teleport to Player -bool ChatHandler::HandleAppearCommand(const char* args) -{ - Player* target; - uint64 target_guid; - std::string target_name; - if (!extractPlayerTarget((char*)args, &target, &target_guid, &target_name)) - return false; - - Player* _player = m_session->GetPlayer(); - if (target == _player || target_guid == _player->GetGUID()) - { - SendSysMessage(LANG_CANT_TELEPORT_SELF); - SetSentErrorMessage(true); - return false; - } - - if (target) - { - // check online security - if (HasLowerSecurity(target, 0)) - return false; - - std::string chrNameLink = playerLink(target_name); - - Map* cMap = target->GetMap(); - if (cMap->IsBattlegroundOrArena()) - { - // only allow if gm mode is on - if (!_player->isGameMaster()) - { - PSendSysMessage(LANG_CANNOT_GO_TO_BG_GM, chrNameLink.c_str()); - SetSentErrorMessage(true); - return false; - } - // if both players are in different bgs - else if (_player->GetBattlegroundId() && _player->GetBattlegroundId() != target->GetBattlegroundId()) - _player->LeaveBattleground(false); // Note: should be changed so _player gets no Deserter debuff - - // all's well, set bg id - // when porting out from the bg, it will be reset to 0 - _player->SetBattlegroundId(target->GetBattlegroundId(), target->GetBattlegroundTypeId()); - // remember current position as entry point for return at bg end teleportation - if (!_player->GetMap()->IsBattlegroundOrArena()) - _player->SetBattlegroundEntryPoint(); - } - else if (cMap->IsDungeon()) - { - // we have to go to instance, and can go to player only if: - // 1) we are in his group (either as leader or as member) - // 2) we are not bound to any group and have GM mode on - if (_player->GetGroup()) - { - // we are in group, we can go only if we are in the player group - if (_player->GetGroup() != target->GetGroup()) - { - PSendSysMessage(LANG_CANNOT_GO_TO_INST_PARTY, chrNameLink.c_str()); - SetSentErrorMessage(true); - return false; - } - } - else - { - // we are not in group, let's verify our GM mode - if (!_player->isGameMaster()) - { - PSendSysMessage(LANG_CANNOT_GO_TO_INST_GM, chrNameLink.c_str()); - SetSentErrorMessage(true); - return false; - } - } - - // if the player or the player's group is bound to another instance - // the player will not be bound to another one - InstancePlayerBind* pBind = _player->GetBoundInstance(target->GetMapId(), target->GetDifficulty(cMap->IsRaid())); - if (!pBind) - { - Group* group = _player->GetGroup(); - // if no bind exists, create a solo bind - InstanceGroupBind* gBind = group ? group->GetBoundInstance(target) : NULL; // if no bind exists, create a solo bind - if (!gBind) - if (InstanceSave* save = sInstanceSaveMgr->GetInstanceSave(target->GetInstanceId())) - _player->BindToInstance(save, !save->CanReset()); - } - - if (cMap->IsRaid()) - _player->SetRaidDifficulty(target->GetRaidDifficulty()); - else - _player->SetDungeonDifficulty(target->GetDungeonDifficulty()); - } - - PSendSysMessage(LANG_APPEARING_AT, chrNameLink.c_str()); - - // stop flight if need - if (_player->isInFlight()) - { - _player->GetMotionMaster()->MovementExpired(); - _player->CleanupAfterTaxiFlight(); - } - // save only in non-flight case - else - _player->SaveRecallPosition(); - - // to point to see at target with same orientation - float x, y, z; - target->GetContactPoint(_player, x, y, z); - - _player->TeleportTo(target->GetMapId(), x, y, z, _player->GetAngle(target), TELE_TO_GM_MODE); - _player->SetPhaseMask(target->GetPhaseMask(), true); - } - else - { - // check offline security - if (HasLowerSecurity(NULL, target_guid)) - return false; - - std::string nameLink = playerLink(target_name); - - PSendSysMessage(LANG_APPEARING_AT, nameLink.c_str()); - - // to point where player stay (if loaded) - float x, y, z, o; - uint32 map; - bool in_flight; - if (!Player::LoadPositionFromDB(map, x, y, z, o, in_flight, target_guid)) - return false; - - // stop flight if need - if (_player->isInFlight()) - { - _player->GetMotionMaster()->MovementExpired(); - _player->CleanupAfterTaxiFlight(); - } - // save only in non-flight case - else - _player->SaveRecallPosition(); - - _player->TeleportTo(map, x, y, z, _player->GetOrientation()); - } - - return true; -} - -// Teleport player to last position -bool ChatHandler::HandleRecallCommand(const char* args) -{ - Player* target; - if (!extractPlayerTarget((char*)args, &target)) - return false; - - // check online security - if (HasLowerSecurity(target, 0)) - return false; - - if (target->IsBeingTeleported()) - { - PSendSysMessage(LANG_IS_TELEPORTED, GetNameLink(target).c_str()); - SetSentErrorMessage(true); - return false; - } - - // stop flight if need - if (target->isInFlight()) - { - target->GetMotionMaster()->MovementExpired(); - target->CleanupAfterTaxiFlight(); - } - - target->TeleportTo(target->m_recallMap, target->m_recallX, target->m_recallY, target->m_recallZ, target->m_recallO); - return true; -} - -//Enable On\OFF all taxi paths -bool ChatHandler::HandleTaxiCheatCommand(const char* args) -{ - if (!*args) - { - SendSysMessage(LANG_USE_BOL); - SetSentErrorMessage(true); - return false; - } - - std::string argstr = (char*)args; - - Player* chr = getSelectedPlayer(); - - if (!chr) - chr = m_session->GetPlayer(); - else if (HasLowerSecurity(chr, 0)) // check online security - return false; - - if (argstr == "on") - { - chr->SetTaxiCheater(true); - PSendSysMessage(LANG_YOU_GIVE_TAXIS, GetNameLink(chr).c_str()); - if (needReportToTarget(chr)) - ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_ADDED, GetNameLink().c_str()); - return true; - } - - if (argstr == "off") - { - chr->SetTaxiCheater(false); - PSendSysMessage(LANG_YOU_REMOVE_TAXIS, GetNameLink(chr).c_str()); - if (needReportToTarget(chr)) - ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_REMOVED, GetNameLink().c_str()); - - return true; - } - - SendSysMessage(LANG_USE_BOL); - SetSentErrorMessage(true); - return false; -} - -//Enable\Dissable accept whispers (for GM) -bool ChatHandler::HandleWhispersCommand(const char* args) -{ - if (!*args) - { - PSendSysMessage(LANG_COMMAND_WHISPERACCEPTING, m_session->GetPlayer()->isAcceptWhispers() ? GetTrinityString(LANG_ON) : GetTrinityString(LANG_OFF)); - return true; - } - - std::string argstr = (char*)args; - // whisper on - if (argstr == "on") - { - m_session->GetPlayer()->SetAcceptWhispers(true); - SendSysMessage(LANG_COMMAND_WHISPERON); - return true; - } - - // whisper off - if (argstr == "off") - { - // Remove all players from the Gamemaster's whisper whitelist - m_session->GetPlayer()->ClearWhisperWhiteList(); - m_session->GetPlayer()->SetAcceptWhispers(false); - SendSysMessage(LANG_COMMAND_WHISPEROFF); - return true; - } - - SendSysMessage(LANG_USE_BOL); - SetSentErrorMessage(true); - return false; -} - -//Save all players in the world -bool ChatHandler::HandleSaveAllCommand(const char* /*args*/) -{ - sObjectAccessor->SaveAllPlayers(); - SendSysMessage(LANG_PLAYERS_SAVED); - return true; -} - -//Send mail by command -bool ChatHandler::HandleSendMailCommand(const char* args) -{ - // format: name "subject text" "mail text" - Player* target; - uint64 target_guid; - std::string target_name; - if (!extractPlayerTarget((char*)args, &target, &target_guid, &target_name)) - return false; - - char* tail1 = strtok(NULL, ""); - if (!tail1) - return false; - - char* msgSubject = extractQuotedArg(tail1); - if (!msgSubject) - return false; - - char* tail2 = strtok(NULL, ""); - if (!tail2) - return false; - - char* msgText = extractQuotedArg(tail2); - if (!msgText) - return false; - - // msgSubject, msgText isn't NUL after prev. check - std::string subject = msgSubject; - std::string text = msgText; - - // from console show not existed sender - MailSender sender(MAIL_NORMAL, m_session ? m_session->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM); - - //- TODO: Fix poor design - SQLTransaction trans = CharacterDatabase.BeginTransaction(); - MailDraft(subject, text) - .SendMailTo(trans, MailReceiver(target, GUID_LOPART(target_guid)), sender); - - CharacterDatabase.CommitTransaction(trans); - - std::string nameLink = playerLink(target_name); - PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str()); - return true; -} - -//Summon group of player -bool ChatHandler::HandleGroupSummonCommand(const char* args) -{ - Player* target; - if (!extractPlayerTarget((char*)args, &target)) - return false; - - // check online security - if (HasLowerSecurity(target, 0)) - return false; - - Group* grp = target->GetGroup(); - - std::string nameLink = GetNameLink(target); - - if (!grp) - { - PSendSysMessage(LANG_NOT_IN_GROUP, nameLink.c_str()); - SetSentErrorMessage(true); - return false; - } - - Map* gmMap = m_session->GetPlayer()->GetMap(); - bool to_instance = gmMap->Instanceable(); - - // we are in instance, and can summon only player in our group with us as lead - if (to_instance && ( - !m_session->GetPlayer()->GetGroup() || (grp->GetLeaderGUID() != m_session->GetPlayer()->GetGUID()) || - (m_session->GetPlayer()->GetGroup()->GetLeaderGUID() != m_session->GetPlayer()->GetGUID()))) - // the last check is a bit excessive, but let it be, just in case - { - SendSysMessage(LANG_CANNOT_SUMMON_TO_INST); - SetSentErrorMessage(true); - return false; - } - - for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) - { - Player* player = itr->getSource(); - - if (!player || player == m_session->GetPlayer() || !player->GetSession()) - continue; - - // check online security - if (HasLowerSecurity(player, 0)) - return false; - - std::string plNameLink = GetNameLink(player); - - if (player->IsBeingTeleported() == true) - { - PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str()); - SetSentErrorMessage(true); - return false; - } - - if (to_instance) - { - Map* plMap = player->GetMap(); - - if (plMap->Instanceable() && plMap->GetInstanceId() != gmMap->GetInstanceId()) - { - // cannot summon from instance to instance - PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST, plNameLink.c_str()); - SetSentErrorMessage(true); - return false; - } - } - - PSendSysMessage(LANG_SUMMONING, plNameLink.c_str(), ""); - if (needReportToTarget(player)) - ChatHandler(player).PSendSysMessage(LANG_SUMMONED_BY, GetNameLink().c_str()); - - // stop flight if need - if (player->isInFlight()) - { - player->GetMotionMaster()->MovementExpired(); - player->CleanupAfterTaxiFlight(); - } - // save only in non-flight case - else - player->SaveRecallPosition(); - - // before GM - float x, y, z; - m_session->GetPlayer()->GetClosePoint(x, y, z, player->GetObjectSize()); - player->TeleportTo(m_session->GetPlayer()->GetMapId(), x, y, z, player->GetOrientation()); - } - - return true; -} diff --git a/src/server/game/Chat/Commands/Level2.cpp b/src/server/game/Chat/Commands/Level2.cpp deleted file mode 100755 index a44ee515c02..00000000000 --- a/src/server/game/Chat/Commands/Level2.cpp +++ /dev/null @@ -1,679 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program 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 2 of the License, or (at your - * option) any later version. - * - * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "Common.h" -#include "DatabaseEnv.h" -#include "DBCStores.h" -#include "ObjectMgr.h" -#include "Player.h" -#include "Item.h" -#include "GameObject.h" -#include "Opcodes.h" -#include "Chat.h" -#include "MapManager.h" -#include "Language.h" -#include "World.h" -#include "GameEventMgr.h" -#include "SpellMgr.h" -#include "PoolMgr.h" -#include "AccountMgr.h" -#include "WaypointManager.h" -#include "Util.h" -#include <cctype> -#include <iostream> -#include <fstream> -#include <map> -#include "OutdoorPvPMgr.h" -#include "Transport.h" -#include "TargetedMovementGenerator.h" // for HandleNpcUnFollowCommand -#include "CreatureGroups.h" -#include "ace/INET_Addr.h" - -//mute player for some times -bool ChatHandler::HandleMuteCommand(const char* args) -{ - char* nameStr; - char* delayStr; - extractOptFirstArg((char*)args, &nameStr, &delayStr); - if (!delayStr) - return false; - - char *mutereason = strtok(NULL, "\r"); - std::string mutereasonstr = "No reason"; - if (mutereason != NULL) - mutereasonstr = mutereason; - - Player* target; - uint64 target_guid; - std::string target_name; - if (!extractPlayerTarget(nameStr, &target, &target_guid, &target_name)) - return false; - - uint32 accountId = target ? target->GetSession()->GetAccountId() : sObjectMgr->GetPlayerAccountIdByGUID(target_guid); - - // find only player from same account if any - if (!target) - if (WorldSession* session = sWorld->FindSession(accountId)) - target = session->GetPlayer(); - - uint32 notspeaktime = (uint32) atoi(delayStr); - - // must have strong lesser security level - if (HasLowerSecurity (target, target_guid, true)) - return false; - - PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME); - - if (target) - { - // Target is online, mute will be in effect right away. - int64 muteTime = time(NULL) + notspeaktime * MINUTE; - target->GetSession()->m_muteTime = muteTime; - - stmt->setInt64(0, muteTime); - - ChatHandler(target).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notspeaktime, mutereasonstr.c_str()); - } - else - { - // Target is offline, mute will be in effect starting from the next login. - int32 muteTime = -int32(notspeaktime * MINUTE); - - stmt->setInt64(0, muteTime); - } - - stmt->setUInt32(1, accountId); - - LoginDatabase.Execute(stmt); - - std::string nameLink = playerLink(target_name); - - PSendSysMessage(target ? LANG_YOU_DISABLE_CHAT : LANG_COMMAND_DISABLE_CHAT_DELAYED, nameLink.c_str(), notspeaktime, mutereasonstr.c_str()); - - return true; -} - -//unmute player -bool ChatHandler::HandleUnmuteCommand(const char* args) -{ - Player* target; - uint64 target_guid; - std::string target_name; - if (!extractPlayerTarget((char*)args, &target, &target_guid, &target_name)) - return false; - - uint32 accountId = target ? target->GetSession()->GetAccountId() : sObjectMgr->GetPlayerAccountIdByGUID(target_guid); - - // find only player from same account if any - if (!target) - if (WorldSession* session = sWorld->FindSession(accountId)) - target = session->GetPlayer(); - - // must have strong lesser security level - if (HasLowerSecurity (target, target_guid, true)) - return false; - - if (target) - { - if (target->CanSpeak()) - { - SendSysMessage(LANG_CHAT_ALREADY_ENABLED); - SetSentErrorMessage(true); - return false; - } - - target->GetSession()->m_muteTime = 0; - } - - PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME); - - stmt->setInt64(0, 0); - stmt->setUInt32(1, accountId); - - LoginDatabase.Execute(stmt); - - if (target) - ChatHandler(target).PSendSysMessage(LANG_YOUR_CHAT_ENABLED); - - std::string nameLink = playerLink(target_name); - - PSendSysMessage(LANG_YOU_ENABLE_CHAT, nameLink.c_str()); - return true; -} - -bool ChatHandler::HandleGUIDCommand(const char* /*args*/) -{ - uint64 guid = m_session->GetPlayer()->GetSelection(); - - if (guid == 0) - { - SendSysMessage(LANG_NO_SELECTION); - SetSentErrorMessage(true); - return false; - } - - PSendSysMessage(LANG_OBJECT_GUID, GUID_LOPART(guid), GUID_HIPART(guid)); - return true; -} - - //move item to other slot -bool ChatHandler::HandleItemMoveCommand(const char* args) -{ - if (!*args) - return false; - - char* pParam1 = strtok((char*)args, " "); - if (!pParam1) - return false; - - char* pParam2 = strtok(NULL, " "); - if (!pParam2) - return false; - - uint8 srcslot = (uint8)atoi(pParam1); - uint8 dstslot = (uint8)atoi(pParam2); - - if (srcslot == dstslot) - return true; - - if (!m_session->GetPlayer()->IsValidPos(INVENTORY_SLOT_BAG_0, srcslot, true)) - return false; - - if (!m_session->GetPlayer()->IsValidPos(INVENTORY_SLOT_BAG_0, dstslot, false)) - return false; - - uint16 src = ((INVENTORY_SLOT_BAG_0 << 8) | srcslot); - uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | dstslot); - - m_session->GetPlayer()->SwapItem(src, dst); - - return true; -} - -//kick player -bool ChatHandler::HandleKickPlayerCommand(const char *args) -{ - Player* target = NULL; - std::string playerName; - if (!extractPlayerTarget((char*)args, &target, NULL, &playerName)) - return false; - - if (m_session && target == m_session->GetPlayer()) - { - SendSysMessage(LANG_COMMAND_KICKSELF); - SetSentErrorMessage(true); - return false; - } - - // check online security - if (HasLowerSecurity(target, 0)) - return false; - - if (sWorld->getBoolConfig(CONFIG_SHOW_KICK_IN_WORLD)) - sWorld->SendWorldText(LANG_COMMAND_KICKMESSAGE, playerName.c_str()); - else - PSendSysMessage(LANG_COMMAND_KICKMESSAGE, playerName.c_str()); - - target->GetSession()->KickPlayer(); - return true; -} - -//show info of player -bool ChatHandler::HandlePInfoCommand(const char* args) -{ - Player* target; - uint64 target_guid; - std::string target_name; - - uint32 parseGUID = MAKE_NEW_GUID(atol((char*)args), 0, HIGHGUID_PLAYER); - - if (sObjectMgr->GetPlayerNameByGUID(parseGUID, target_name)) - { - target = sObjectMgr->GetPlayerByLowGUID(parseGUID); - target_guid = parseGUID; - } - else if (!extractPlayerTarget((char*)args, &target, &target_guid, &target_name)) - return false; - - uint32 accId = 0; - uint32 money = 0; - uint32 total_player_time = 0; - uint8 level = 0; - uint32 latency = 0; - uint8 race; - uint8 Class; - int64 muteTime = 0; - int64 banTime = -1; - uint32 mapId; - uint32 areaId; - uint32 phase = 0; - - // get additional information from Player object - if (target) - { - // check online security - if (HasLowerSecurity(target, 0)) - return false; - - accId = target->GetSession()->GetAccountId(); - money = target->GetMoney(); - total_player_time = target->GetTotalPlayedTime(); - level = target->getLevel(); - latency = target->GetSession()->GetLatency(); - race = target->getRace(); - Class = target->getClass(); - muteTime = target->GetSession()->m_muteTime; - mapId = target->GetMapId(); - areaId = target->GetAreaId(); - phase = target->GetPhaseMask(); - } - // get additional information from DB - else - { - // check offline security - if (HasLowerSecurity(NULL, target_guid)) - return false; - - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PINFO); - stmt->setUInt32(0, GUID_LOPART(target_guid)); - PreparedQueryResult result = CharacterDatabase.Query(stmt); - - if (!result) - return false; - - Field* fields = result->Fetch(); - total_player_time = fields[0].GetUInt32(); - level = fields[1].GetUInt8(); - money = fields[2].GetUInt32(); - accId = fields[3].GetUInt32(); - race = fields[4].GetUInt8(); - Class = fields[5].GetUInt8(); - mapId = fields[6].GetUInt16(); - areaId = fields[7].GetUInt16(); - } - - std::string username = GetTrinityString(LANG_ERROR); - std::string email = GetTrinityString(LANG_ERROR); - std::string last_ip = GetTrinityString(LANG_ERROR); - uint32 security = 0; - std::string last_login = GetTrinityString(LANG_ERROR); - - PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PINFO); - stmt->setInt32(0, int32(realmID)); - stmt->setUInt32(1, accId); - PreparedQueryResult result = LoginDatabase.Query(stmt); - - if (result) - { - Field* fields = result->Fetch(); - username = fields[0].GetString(); - security = fields[1].GetUInt8(); - email = fields[2].GetString(); - muteTime = fields[5].GetUInt64(); - - if (email.empty()) - email = "-"; - - if (!m_session || m_session->GetSecurity() >= AccountTypes(security)) - { - last_ip = fields[3].GetString(); - last_login = fields[4].GetString(); - - uint32 ip = inet_addr(last_ip.c_str()); -#if TRINITY_ENDIAN == BIGENDIAN - EndianConvertReverse(ip); -#endif - - PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_IP2NATION_COUNTRY); - - stmt->setUInt32(0, ip); - - PreparedQueryResult result2 = WorldDatabase.Query(stmt); - - if (result2) - { - Field* fields2 = result2->Fetch(); - last_ip.append(" ("); - last_ip.append(fields2[0].GetString()); - last_ip.append(")"); - } - } - else - { - last_ip = "-"; - last_login = "-"; - } - } - - std::string nameLink = playerLink(target_name); - - PSendSysMessage(LANG_PINFO_ACCOUNT, (target?"":GetTrinityString(LANG_OFFLINE)), nameLink.c_str(), GUID_LOPART(target_guid), username.c_str(), accId, email.c_str(), security, last_ip.c_str(), last_login.c_str(), latency); - - std::string bannedby = "unknown"; - std::string banreason = ""; - - stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PINFO_BANS); - stmt->setUInt32(0, accId); - PreparedQueryResult result2 = LoginDatabase.Query(stmt); - if (!result2) - { - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_BANS); - stmt->setUInt32(0, GUID_LOPART(target_guid)); - result2 = CharacterDatabase.Query(stmt); - } - - if (result2) - { - Field* fields = result2->Fetch(); - banTime = int64(fields[1].GetBool() ? 0 : fields[0].GetUInt32()); - bannedby = fields[2].GetString(); - banreason = fields[3].GetString(); - } - - if (muteTime > 0) - PSendSysMessage(LANG_PINFO_MUTE, secsToTimeString(muteTime - time(NULL), true).c_str()); - - if (banTime >= 0) - PSendSysMessage(LANG_PINFO_BAN, banTime > 0 ? secsToTimeString(banTime - time(NULL), true).c_str() : "permanently", bannedby.c_str(), banreason.c_str()); - - std::string race_s, Class_s; - switch (race) - { - case RACE_HUMAN: race_s = "Human"; break; - case RACE_ORC: race_s = "Orc"; break; - case RACE_DWARF: race_s = "Dwarf"; break; - case RACE_NIGHTELF: race_s = "Night Elf"; break; - case RACE_UNDEAD_PLAYER: race_s = "Undead"; break; - case RACE_TAUREN: race_s = "Tauren"; break; - case RACE_GNOME: race_s = "Gnome"; break; - case RACE_TROLL: race_s = "Troll"; break; - case RACE_BLOODELF: race_s = "Blood Elf"; break; - case RACE_DRAENEI: race_s = "Draenei"; break; - } - switch (Class) - { - case CLASS_WARRIOR: Class_s = "Warrior"; break; - case CLASS_PALADIN: Class_s = "Paladin"; break; - case CLASS_HUNTER: Class_s = "Hunter"; break; - case CLASS_ROGUE: Class_s = "Rogue"; break; - case CLASS_PRIEST: Class_s = "Priest"; break; - case CLASS_DEATH_KNIGHT: Class_s = "Death Knight"; break; - case CLASS_SHAMAN: Class_s = "Shaman"; break; - case CLASS_MAGE: Class_s = "Mage"; break; - case CLASS_WARLOCK: Class_s = "Warlock"; break; - case CLASS_DRUID: Class_s = "Druid"; break; - } - - std::string timeStr = secsToTimeString(total_player_time, true, true); - uint32 gold = money /GOLD; - uint32 silv = (money % GOLD) / SILVER; - uint32 copp = (money % GOLD) % SILVER; - PSendSysMessage(LANG_PINFO_LEVEL, race_s.c_str(), Class_s.c_str(), timeStr.c_str(), level, gold, silv, copp); - - // Add map, zone, subzone and phase to output - int locale = GetSessionDbcLocale(); - std::string areaName = "<unknown>"; - std::string zoneName = ""; - - MapEntry const* map = sMapStore.LookupEntry(mapId); - - AreaTableEntry const* area = GetAreaEntryByAreaID(areaId); - if (area) - { - areaName = area->area_name[locale]; - - AreaTableEntry const* zone = GetAreaEntryByAreaID(area->zone); - - if (zone) - zoneName = zone->area_name[locale]; - } - - if (target) - { - if (!zoneName.empty()) - PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name[locale], zoneName.c_str(), areaName.c_str(), phase); - else - PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name[locale], areaName.c_str(), "<unknown>", phase); - } - else - PSendSysMessage(LANG_PINFO_MAP_OFFLINE, map->name[locale], areaName.c_str()); - - return true; -} - -bool ChatHandler::HandleCombatStopCommand(const char* args) -{ - Player* target = NULL; - - if (args && strlen(args) > 0) - { - target = sObjectAccessor->FindPlayerByName(args); - if (!target) - { - SendSysMessage(LANG_PLAYER_NOT_FOUND); - SetSentErrorMessage(true); - return false; - } - } - - if (!target) - if (!extractPlayerTarget((char*)args, &target)) - return false; - - // check online security - if (HasLowerSecurity(target, 0)) - return false; - - target->CombatStop(); - target->getHostileRefManager().deleteReferences(); - return true; -} - - -bool ChatHandler::HandleRepairitemsCommand(const char* args) -{ - Player* target; - if (!extractPlayerTarget((char*)args, &target)) - return false; - - // check online security - if (HasLowerSecurity(target, 0)) - return false; - - // Repair items - target->DurabilityRepairAll(false, 0, false); - - PSendSysMessage(LANG_YOU_REPAIR_ITEMS, GetNameLink(target).c_str()); - if (needReportToTarget(target)) - ChatHandler(target).PSendSysMessage(LANG_YOUR_ITEMS_REPAIRED, GetNameLink().c_str()); - return true; -} - -bool ChatHandler::HandleWaterwalkCommand(const char* args) -{ - if (!*args) - return false; - - Player* player = getSelectedPlayer(); - - if (!player) - { - PSendSysMessage(LANG_NO_CHAR_SELECTED); - SetSentErrorMessage(true); - return false; - } - - // check online security - if (HasLowerSecurity(player, 0)) - return false; - - if (strncmp(args, "on", 3) == 0) - player->SetMovement(MOVE_WATER_WALK); // ON - else if (strncmp(args, "off", 4) == 0) - player->SetMovement(MOVE_LAND_WALK); // OFF - else - { - SendSysMessage(LANG_USE_BOL); - return false; - } - - PSendSysMessage(LANG_YOU_SET_WATERWALK, args, GetNameLink(player).c_str()); - if (needReportToTarget(player)) - ChatHandler(player).PSendSysMessage(LANG_YOUR_WATERWALK_SET, args, GetNameLink().c_str()); - return true; -} - -bool ChatHandler::HandleCreatePetCommand(const char* /*args*/) -{ - Player* player = m_session->GetPlayer(); - Creature* creatureTarget = getSelectedCreature(); - - if (!creatureTarget || creatureTarget->isPet() || creatureTarget->GetTypeId() == TYPEID_PLAYER) - { - PSendSysMessage(LANG_SELECT_CREATURE); - SetSentErrorMessage(true); - return false; - } - - CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(creatureTarget->GetEntry()); - // Creatures with family 0 crashes the server - if (cInfo->family == 0) - { - PSendSysMessage("This creature cannot be tamed. (family id: 0)."); - SetSentErrorMessage(true); - return false; - } - - if (player->GetPetGUID()) - { - PSendSysMessage("You already have a pet"); - SetSentErrorMessage(true); - return false; - } - - // Everything looks OK, create new pet - Pet* pet = new Pet(player, HUNTER_PET); - if (!pet->CreateBaseAtCreature(creatureTarget)) - { - delete pet; - PSendSysMessage("Error 1"); - return false; - } - - creatureTarget->setDeathState(JUST_DIED); - creatureTarget->RemoveCorpse(); - creatureTarget->SetHealth(0); // just for nice GM-mode view - - pet->SetUInt64Value(UNIT_FIELD_CREATEDBY, player->GetGUID()); - pet->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, player->getFaction()); - - if (!pet->InitStatsForLevel(creatureTarget->getLevel())) - { - sLog->outError("InitStatsForLevel() in EffectTameCreature failed! Pet deleted."); - PSendSysMessage("Error 2"); - delete pet; - return false; - } - - // prepare visual effect for levelup - pet->SetUInt32Value(UNIT_FIELD_LEVEL, creatureTarget->getLevel()-1); - - pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true); - // this enables pet details window (Shift+P) - pet->InitPetCreateSpells(); - pet->SetFullHealth(); - - pet->GetMap()->AddToMap(pet->ToCreature()); - - // visual effect for levelup - pet->SetUInt32Value(UNIT_FIELD_LEVEL, creatureTarget->getLevel()); - - player->SetMinion(pet, true); - pet->SavePetToDB(PET_SAVE_AS_CURRENT); - player->PetSpellInitialize(); - - return true; -} - -bool ChatHandler::HandlePetLearnCommand(const char* args) -{ - if (!*args) - return false; - - Player* player = m_session->GetPlayer(); - Pet* pet = player->GetPet(); - - if (!pet) - { - PSendSysMessage("You have no pet"); - SetSentErrorMessage(true); - return false; - } - - uint32 spellId = extractSpellIdFromLink((char*)args); - - if (!spellId || !sSpellMgr->GetSpellInfo(spellId)) - return false; - - // Check if pet already has it - if (pet->HasSpell(spellId)) - { - PSendSysMessage("Pet already has spell: %u", spellId); - SetSentErrorMessage(true); - return false; - } - - // Check if spell is valid - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo)) - { - PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId); - SetSentErrorMessage(true); - return false; - } - - pet->learnSpell(spellId); - - PSendSysMessage("Pet has learned spell %u", spellId); - return true; -} - -bool ChatHandler::HandlePetUnlearnCommand(const char *args) -{ - if (!*args) - return false; - - Player* player = m_session->GetPlayer(); - Pet* pet = player->GetPet(); - - if (!pet) - { - PSendSysMessage("You have no pet"); - SetSentErrorMessage(true); - return false; - } - - uint32 spellId = extractSpellIdFromLink((char*)args); - - if (pet->HasSpell(spellId)) - pet->removeSpell(spellId, false); - else - PSendSysMessage("Pet doesn't have that spell"); - - return true; -} diff --git a/src/server/game/Chat/Commands/Level3.cpp b/src/server/game/Chat/Commands/Level3.cpp deleted file mode 100755 index 5b93b899898..00000000000 --- a/src/server/game/Chat/Commands/Level3.cpp +++ /dev/null @@ -1,1763 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program 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 2 of the License, or (at your - * option) any later version. - * - * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "Common.h" -#include "DatabaseEnv.h" -#include "WorldPacket.h" -#include "WorldSession.h" -#include "World.h" -#include "ObjectMgr.h" -#include "ArenaTeamMgr.h" -#include "GuildMgr.h" -#include "AuctionHouseMgr.h" -#include "AccountMgr.h" -#include "PlayerDump.h" -#include "SpellMgr.h" -#include "Player.h" -#include "Opcodes.h" -#include "GameObject.h" -#include "Chat.h" -#include "Log.h" -#include "Guild.h" -#include "ObjectAccessor.h" -#include "MapManager.h" -#include "Language.h" -#include "GridNotifiersImpl.h" -#include "CellImpl.h" -#include "Weather.h" -#include "PointMovementGenerator.h" -#include "TargetedMovementGenerator.h" -#include "SkillDiscovery.h" -#include "SkillExtraItems.h" -#include "SystemConfig.h" -#include "Config.h" -#include "Util.h" -#include "ItemEnchantmentMgr.h" -#include "BattlegroundMgr.h" -#include "InstanceSaveMgr.h" -#include "InstanceScript.h" -#include "CreatureEventAIMgr.h" -#include "SpellAuraEffects.h" -#include "DBCEnums.h" -#include "ConditionMgr.h" -#include "DisableMgr.h" -#include "Transport.h" -#include "WeatherMgr.h" -#include "ScriptMgr.h" -#include "CreatureTextMgr.h" -#include "SmartAI.h" -#include "Group.h" -#include "ChannelMgr.h" - -bool ChatHandler::HandleMaxSkillCommand(const char* /*args*/) -{ - Player* SelectedPlayer = getSelectedPlayer(); - if (!SelectedPlayer) - { - SendSysMessage(LANG_NO_CHAR_SELECTED); - SetSentErrorMessage(true); - return false; - } - - // each skills that have max skill value dependent from level seted to current level max skill value - SelectedPlayer->UpdateSkillsToMaxSkillsForLevel(); - return true; -} - -bool ChatHandler::HandleSetSkillCommand(const char *args) -{ - // number or [name] Shift-click form |color|Hskill:skill_id|h[name]|h|r - char* skill_p = extractKeyFromLink((char*)args, "Hskill"); - if (!skill_p) - return false; - - char *level_p = strtok (NULL, " "); - if (!level_p) - return false; - - char *max_p = strtok (NULL, " "); - - int32 skill = atoi(skill_p); - if (skill <= 0) - { - PSendSysMessage(LANG_INVALID_SKILL_ID, skill); - SetSentErrorMessage(true); - return false; - } - - int32 level = atol(level_p); - - Player* target = getSelectedPlayer(); - if (!target) - { - SendSysMessage(LANG_NO_CHAR_SELECTED); - SetSentErrorMessage(true); - return false; - } - - SkillLineEntry const* sl = sSkillLineStore.LookupEntry(skill); - if (!sl) - { - PSendSysMessage(LANG_INVALID_SKILL_ID, skill); - SetSentErrorMessage(true); - return false; - } - - std::string tNameLink = GetNameLink(target); - - if (!target->GetSkillValue(skill)) - { - PSendSysMessage(LANG_SET_SKILL_ERROR, tNameLink.c_str(), skill, sl->name[GetSessionDbcLocale()]); - SetSentErrorMessage(true); - return false; - } - - int32 max = max_p ? atol (max_p) : target->GetPureMaxSkillValue(skill); - - if (level <= 0 || level > max || max <= 0) - return false; - - target->SetSkill(skill, target->GetSkillStep(skill), level, max); - PSendSysMessage(LANG_SET_SKILL, skill, sl->name[GetSessionDbcLocale()], tNameLink.c_str(), level, max); - - return true; -} - -bool ChatHandler::HandleUnLearnCommand(const char *args) -{ - if (!*args) - return false; - - // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r - uint32 spell_id = extractSpellIdFromLink((char*)args); - if (!spell_id) - return false; - - char const* allStr = strtok(NULL, " "); - bool allRanks = allStr ? (strncmp(allStr, "all", strlen(allStr)) == 0) : false; - - Player* target = getSelectedPlayer(); - if (!target) - { - SendSysMessage(LANG_NO_CHAR_SELECTED); - SetSentErrorMessage(true); - return false; - } - - if (allRanks) - spell_id = sSpellMgr->GetFirstSpellInChain (spell_id); - - if (target->HasSpell(spell_id)) - target->removeSpell(spell_id, false, !allRanks); - else - SendSysMessage(LANG_FORGET_SPELL); - - if (GetTalentSpellCost(spell_id)) - target->SendTalentsInfoData(false); - - return true; -} - -bool ChatHandler::HandleCooldownCommand(const char *args) -{ - Player* target = getSelectedPlayer(); - if (!target) - { - SendSysMessage(LANG_PLAYER_NOT_FOUND); - SetSentErrorMessage(true); - return false; - } - - std::string tNameLink = GetNameLink(target); - - if (!*args) - { - target->RemoveAllSpellCooldown(); - PSendSysMessage(LANG_REMOVEALL_COOLDOWN, tNameLink.c_str()); - } - else - { - // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spell_id = extractSpellIdFromLink((char*)args); - if (!spell_id) - return false; - - if (!sSpellMgr->GetSpellInfo(spell_id)) - { - PSendSysMessage(LANG_UNKNOWN_SPELL, target == m_session->GetPlayer() ? GetTrinityString(LANG_YOU) : tNameLink.c_str()); - SetSentErrorMessage(true); - return false; - } - - target->RemoveSpellCooldown(spell_id, true); - PSendSysMessage(LANG_REMOVE_COOLDOWN, spell_id, target == m_session->GetPlayer() ? GetTrinityString(LANG_YOU) : tNameLink.c_str()); - } - return true; -} - -bool ChatHandler::HandleAddItemCommand(const char *args) -{ - if (!*args) - return false; - - uint32 itemId = 0; - - if (args[0] == '[') // [name] manual form - { - char* citemName = strtok((char*)args, "]"); - - if (citemName && citemName[0]) - { - std::string itemName = citemName+1; - WorldDatabase.EscapeString(itemName); - - PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_ITEM_TEMPLATE_BY_NAME); - stmt->setString(0, itemName); - PreparedQueryResult result = WorldDatabase.Query(stmt); - - if (!result) - { - PSendSysMessage(LANG_COMMAND_COULDNOTFIND, citemName+1); - SetSentErrorMessage(true); - return false; - } - itemId = result->Fetch()->GetUInt16(); - } - else - return false; - } - else // item_id or [name] Shift-click form |color|Hitem:item_id:0:0:0|h[name]|h|r - { - char* cId = extractKeyFromLink((char*)args, "Hitem"); - if (!cId) - return false; - itemId = atol(cId); - } - - char* ccount = strtok(NULL, " "); - - int32 count = 1; - - if (ccount) - count = strtol(ccount, NULL, 10); - - if (count == 0) - count = 1; - - Player* player = m_session->GetPlayer(); - Player* plTarget = getSelectedPlayer(); - if (!plTarget) - plTarget = player; - - sLog->outDetail(GetTrinityString(LANG_ADDITEM), itemId, count); - - ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(itemId); - if (!pProto) - { - PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId); - SetSentErrorMessage(true); - return false; - } - - //Subtract - if (count < 0) - { - plTarget->DestroyItemCount(itemId, -count, true, false); - PSendSysMessage(LANG_REMOVEITEM, itemId, -count, GetNameLink(plTarget).c_str()); - return true; - } - - //Adding items - uint32 noSpaceForCount = 0; - - // check space and find places - ItemPosCountVec dest; - InventoryResult msg = plTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, count, &noSpaceForCount); - if (msg != EQUIP_ERR_OK) // convert to possible store amount - count -= noSpaceForCount; - - if (count == 0 || dest.empty()) // can't add any - { - PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemId, noSpaceForCount); - SetSentErrorMessage(true); - return false; - } - - Item* item = plTarget->StoreNewItem(dest, itemId, true, Item::GenerateItemRandomPropertyId(itemId)); - - // remove binding (let GM give it to another player later) - if (player == plTarget) - for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end(); ++itr) - if (Item* item1 = player->GetItemByPos(itr->pos)) - item1->SetBinding(false); - - if (count > 0 && item) - { - player->SendNewItem(item, count, false, true); - if (player != plTarget) - plTarget->SendNewItem(item, count, true, false); - } - - if (noSpaceForCount > 0) - PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemId, noSpaceForCount); - - return true; -} - -bool ChatHandler::HandleAddItemSetCommand(const char *args) -{ - if (!*args) - return false; - - char* cId = extractKeyFromLink((char*)args, "Hitemset"); // number or [name] Shift-click form |color|Hitemset:itemset_id|h[name]|h|r - if (!cId) - return false; - - uint32 itemsetId = atol(cId); - - // prevent generation all items with itemset field value '0' - if (itemsetId == 0) - { - PSendSysMessage(LANG_NO_ITEMS_FROM_ITEMSET_FOUND, itemsetId); - SetSentErrorMessage(true); - return false; - } - - Player* player = m_session->GetPlayer(); - Player* playerTarget = getSelectedPlayer(); - if (!playerTarget) - playerTarget = player; - - sLog->outDetail(GetTrinityString(LANG_ADDITEMSET), itemsetId); - - bool found = false; - ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore(); - for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr) - { - if (itr->second.ItemSet == itemsetId) - { - found = true; - ItemPosCountVec dest; - InventoryResult msg = playerTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itr->second.ItemId, 1); - if (msg == EQUIP_ERR_OK) - { - Item* item = playerTarget->StoreNewItem(dest, itr->second.ItemId, true); - - // remove binding (let GM give it to another player later) - if (player == playerTarget) - item->SetBinding(false); - - player->SendNewItem(item, 1, false, true); - if (player != playerTarget) - playerTarget->SendNewItem(item, 1, true, false); - } - else - { - player->SendEquipError(msg, NULL, NULL, itr->second.ItemId); - PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itr->second.ItemId, 1); - } - } - } - - if (!found) - { - PSendSysMessage(LANG_NO_ITEMS_FROM_ITEMSET_FOUND, itemsetId); - - SetSentErrorMessage(true); - return false; - } - - return true; -} - -bool ChatHandler::HandleGetDistanceCommand(const char *args) -{ - WorldObject* obj = NULL; - - if (*args) - { - uint64 guid = extractGuidFromLink((char*)args); - if (guid) - obj = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*m_session->GetPlayer(), guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); - - if (!obj) - { - SendSysMessage(LANG_PLAYER_NOT_FOUND); - SetSentErrorMessage(true); - return false; - } - } - else - { - obj = getSelectedUnit(); - - if (!obj) - { - SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); - SetSentErrorMessage(true); - return false; - } - } - - PSendSysMessage(LANG_DISTANCE, m_session->GetPlayer()->GetDistance(obj), m_session->GetPlayer()->GetDistance2d(obj), m_session->GetPlayer()->GetExactDist(obj), m_session->GetPlayer()->GetExactDist2d(obj)); - return true; -} - -bool ChatHandler::HandleDieCommand(const char* /*args*/) -{ - Unit* target = getSelectedUnit(); - - if (!target || !m_session->GetPlayer()->GetSelection()) - { - SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); - SetSentErrorMessage(true); - return false; - } - - if (target->GetTypeId() == TYPEID_PLAYER) - { - if (HasLowerSecurity((Player*)target, 0, false)) - return false; - } - - if (target->isAlive()) - { - if (sWorld->getBoolConfig(CONFIG_DIE_COMMAND_MODE)) - m_session->GetPlayer()->Kill(target); - else - m_session->GetPlayer()->DealDamage(target, target->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - } - - return true; -} - -bool ChatHandler::HandleDamageCommand(const char * args) -{ - if (!*args) - return false; - - Unit* target = getSelectedUnit(); - - if (!target || !m_session->GetPlayer()->GetSelection()) - { - SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); - SetSentErrorMessage(true); - return false; - } - - if (target->GetTypeId() == TYPEID_PLAYER) - { - if (HasLowerSecurity((Player*)target, 0, false)) - return false; - } - - if (!target->isAlive()) - return true; - - char* damageStr = strtok((char*)args, " "); - if (!damageStr) - return false; - - int32 damage_int = atoi((char*)damageStr); - if (damage_int <= 0) - return true; - - uint32 damage = damage_int; - - char* schoolStr = strtok((char*)NULL, " "); - - // flat melee damage without resistence/etc reduction - if (!schoolStr) - { - m_session->GetPlayer()->DealDamage(target, damage, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - if (target != m_session->GetPlayer()) - m_session->GetPlayer()->SendAttackStateUpdate (HITINFO_AFFECTS_VICTIM, target, 1, SPELL_SCHOOL_MASK_NORMAL, damage, 0, 0, VICTIMSTATE_HIT, 0); - return true; - } - - uint32 school = schoolStr ? atoi((char*)schoolStr) : SPELL_SCHOOL_NORMAL; - if (school >= MAX_SPELL_SCHOOL) - return false; - - SpellSchoolMask schoolmask = SpellSchoolMask(1 << school); - - if (Unit::IsDamageReducedByArmor(schoolmask)) - damage = m_session->GetPlayer()->CalcArmorReducedDamage(target, damage, NULL, BASE_ATTACK); - - char* spellStr = strtok((char*)NULL, " "); - - // melee damage by specific school - if (!spellStr) - { - uint32 absorb = 0; - uint32 resist = 0; - - m_session->GetPlayer()->CalcAbsorbResist(target, schoolmask, SPELL_DIRECT_DAMAGE, damage, &absorb, &resist); - - if (damage <= absorb + resist) - return true; - - damage -= absorb + resist; - - m_session->GetPlayer()->DealDamageMods(target, damage, &absorb); - m_session->GetPlayer()->DealDamage(target, damage, NULL, DIRECT_DAMAGE, schoolmask, NULL, false); - m_session->GetPlayer()->SendAttackStateUpdate (HITINFO_AFFECTS_VICTIM, target, 1, schoolmask, damage, absorb, resist, VICTIMSTATE_HIT, 0); - return true; - } - - // non-melee damage - - // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spellid = extractSpellIdFromLink((char*)args); - if (!spellid || !sSpellMgr->GetSpellInfo(spellid)) - return false; - - m_session->GetPlayer()->SpellNonMeleeDamageLog(target, spellid, damage); - return true; -} - -bool ChatHandler::HandleReviveCommand(const char *args) -{ - Player* target; - uint64 target_guid; - if (!extractPlayerTarget((char*)args, &target, &target_guid)) - return false; - - if (target) - { - target->ResurrectPlayer(!AccountMgr::IsPlayerAccount(target->GetSession()->GetSecurity()) ? 1.0f : 0.5f); - target->SpawnCorpseBones(); - target->SaveToDB(); - } - else - // will resurrected at login without corpse - sObjectAccessor->ConvertCorpseForPlayer(target_guid); - - return true; -} - -bool ChatHandler::HandleAuraCommand(const char *args) -{ - Unit* target = getSelectedUnit(); - if (!target) - { - SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); - SetSentErrorMessage(true); - return false; - } - - // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spellID = extractSpellIdFromLink((char*)args); - - if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID)) - Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, target, target); - - return true; -} - -bool ChatHandler::HandleUnAuraCommand(const char *args) -{ - Unit* target = getSelectedUnit(); - if (!target) - { - SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); - SetSentErrorMessage(true); - return false; - } - - std::string argstr = args; - if (argstr == "all") - { - target->RemoveAllAuras(); - return true; - } - - // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spellID = extractSpellIdFromLink((char*)args); - if (!spellID) - return false; - - target->RemoveAurasDueToSpell(spellID); - - return true; -} - -bool ChatHandler::HandleLinkGraveCommand(const char *args) -{ - if (!*args) - return false; - - char* px = strtok((char*)args, " "); - if (!px) - return false; - - uint32 g_id = (uint32)atoi(px); - - uint32 g_team; - - char* px2 = strtok(NULL, " "); - - if (!px2) - g_team = 0; - else if (strncmp(px2, "horde", 6) == 0) - g_team = HORDE; - else if (strncmp(px2, "alliance", 9) == 0) - g_team = ALLIANCE; - else - return false; - - WorldSafeLocsEntry const* graveyard = sWorldSafeLocsStore.LookupEntry(g_id); - - if (!graveyard) - { - PSendSysMessage(LANG_COMMAND_GRAVEYARDNOEXIST, g_id); - SetSentErrorMessage(true); - return false; - } - - Player* player = m_session->GetPlayer(); - - uint32 zoneId = player->GetZoneId(); - - AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(zoneId); - if (!areaEntry || areaEntry->zone !=0) - { - PSendSysMessage(LANG_COMMAND_GRAVEYARDWRONGZONE, g_id, zoneId); - SetSentErrorMessage(true); - return false; - } - - if (sObjectMgr->AddGraveYardLink(g_id, zoneId, g_team)) - PSendSysMessage(LANG_COMMAND_GRAVEYARDLINKED, g_id, zoneId); - else - PSendSysMessage(LANG_COMMAND_GRAVEYARDALRLINKED, g_id, zoneId); - - return true; -} - -bool ChatHandler::HandleNearGraveCommand(const char *args) -{ - uint32 g_team; - - size_t argslen = strlen(args); - - if (!*args) - g_team = 0; - else if (strncmp((char*)args, "horde", argslen) == 0) - g_team = HORDE; - else if (strncmp((char*)args, "alliance", argslen) == 0) - g_team = ALLIANCE; - else - return false; - - Player* player = m_session->GetPlayer(); - uint32 zone_id = player->GetZoneId(); - - WorldSafeLocsEntry const* graveyard = sObjectMgr->GetClosestGraveYard( - player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), g_team); - - if (graveyard) - { - uint32 g_id = graveyard->ID; - - GraveYardData const* data = sObjectMgr->FindGraveYardData(g_id, zone_id); - if (!data) - { - PSendSysMessage(LANG_COMMAND_GRAVEYARDERROR, g_id); - SetSentErrorMessage(true); - return false; - } - - g_team = data->team; - - std::string team_name = GetTrinityString(LANG_COMMAND_GRAVEYARD_NOTEAM); - - if (g_team == 0) - team_name = GetTrinityString(LANG_COMMAND_GRAVEYARD_ANY); - else if (g_team == HORDE) - team_name = GetTrinityString(LANG_COMMAND_GRAVEYARD_HORDE); - else if (g_team == ALLIANCE) - team_name = GetTrinityString(LANG_COMMAND_GRAVEYARD_ALLIANCE); - - PSendSysMessage(LANG_COMMAND_GRAVEYARDNEAREST, g_id, team_name.c_str(), zone_id); - } - else - { - std::string team_name; - - if (g_team == 0) - team_name = GetTrinityString(LANG_COMMAND_GRAVEYARD_ANY); - else if (g_team == HORDE) - team_name = GetTrinityString(LANG_COMMAND_GRAVEYARD_HORDE); - else if (g_team == ALLIANCE) - team_name = GetTrinityString(LANG_COMMAND_GRAVEYARD_ALLIANCE); - - if (g_team == ~uint32(0)) - PSendSysMessage(LANG_COMMAND_ZONENOGRAVEYARDS, zone_id); - else - PSendSysMessage(LANG_COMMAND_ZONENOGRAFACTION, zone_id, team_name.c_str()); - } - - return true; -} - -bool ChatHandler::HandleExploreCheatCommand(const char *args) -{ - if (!*args) - return false; - - int flag = atoi((char*)args); - - Player* chr = getSelectedPlayer(); - if (chr == NULL) - { - SendSysMessage(LANG_NO_CHAR_SELECTED); - SetSentErrorMessage(true); - return false; - } - - if (flag != 0) - { - PSendSysMessage(LANG_YOU_SET_EXPLORE_ALL, GetNameLink(chr).c_str()); - if (needReportToTarget(chr)) - ChatHandler(chr).PSendSysMessage(LANG_YOURS_EXPLORE_SET_ALL, GetNameLink().c_str()); - } - else - { - PSendSysMessage(LANG_YOU_SET_EXPLORE_NOTHING, GetNameLink(chr).c_str()); - if (needReportToTarget(chr)) - ChatHandler(chr).PSendSysMessage(LANG_YOURS_EXPLORE_SET_NOTHING, GetNameLink().c_str()); - } - - for (uint8 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i) - { - if (flag != 0) - m_session->GetPlayer()->SetFlag(PLAYER_EXPLORED_ZONES_1+i, 0xFFFFFFFF); - else - m_session->GetPlayer()->SetFlag(PLAYER_EXPLORED_ZONES_1+i, 0); - } - - return true; -} - -void ChatHandler::HandleCharacterLevel(Player* player, uint64 playerGuid, uint32 oldLevel, uint32 newLevel) -{ - if (player) - { - player->GiveLevel(newLevel); - player->InitTalentForLevel(); - player->SetUInt32Value(PLAYER_XP, 0); - - if (needReportToTarget(player)) - { - if (oldLevel == newLevel) - ChatHandler(player).PSendSysMessage(LANG_YOURS_LEVEL_PROGRESS_RESET, GetNameLink().c_str()); - else if (oldLevel < newLevel) - ChatHandler(player).PSendSysMessage(LANG_YOURS_LEVEL_UP, GetNameLink().c_str(), newLevel); - else // if (oldlevel > newlevel) - ChatHandler(player).PSendSysMessage(LANG_YOURS_LEVEL_DOWN, GetNameLink().c_str(), newLevel); - } - } - else - { - // Update level and reset XP, everything else will be updated at login - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_LEVEL); - - stmt->setUInt8(0, uint8(newLevel)); - stmt->setUInt32(1, GUID_LOPART(playerGuid)); - - CharacterDatabase.Execute(stmt); - } -} - -bool ChatHandler::HandleLevelUpCommand(const char *args) -{ - char* nameStr; - char* levelStr; - extractOptFirstArg((char*)args, &nameStr, &levelStr); - - // exception opt second arg: .character level $name - if (levelStr && isalpha(levelStr[0])) - { - nameStr = levelStr; - levelStr = NULL; // current level will used - } - - Player* target; - uint64 target_guid; - std::string target_name; - if (!extractPlayerTarget(nameStr, &target, &target_guid, &target_name)) - return false; - - int32 oldlevel = target ? target->getLevel() : Player::GetLevelFromDB(target_guid); - int32 addlevel = levelStr ? atoi(levelStr) : 1; - int32 newlevel = oldlevel + addlevel; - - if (newlevel < 1) - newlevel = 1; - - if (newlevel > STRONG_MAX_LEVEL) // hardcoded maximum level - newlevel = STRONG_MAX_LEVEL; - - HandleCharacterLevel(target, target_guid, oldlevel, newlevel); - - if (!m_session || m_session->GetPlayer() != target) // including chr == NULL - { - std::string nameLink = playerLink(target_name); - PSendSysMessage(LANG_YOU_CHANGE_LVL, nameLink.c_str(), newlevel); - } - - return true; -} - -bool ChatHandler::HandleShowAreaCommand(const char *args) -{ - if (!*args) - return false; - - Player* chr = getSelectedPlayer(); - if (chr == NULL) - { - SendSysMessage(LANG_NO_CHAR_SELECTED); - SetSentErrorMessage(true); - return false; - } - - int area = GetAreaFlagByAreaID(atoi((char*)args)); - int offset = area / 32; - uint32 val = (uint32)(1 << (area % 32)); - - if (area<0 || offset >= PLAYER_EXPLORED_ZONES_SIZE) - { - SendSysMessage(LANG_BAD_VALUE); - SetSentErrorMessage(true); - return false; - } - - uint32 currFields = chr->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset); - chr->SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, (uint32)(currFields | val)); - - SendSysMessage(LANG_EXPLORE_AREA); - return true; -} - -bool ChatHandler::HandleHideAreaCommand(const char *args) -{ - if (!*args) - return false; - - Player* chr = getSelectedPlayer(); - if (chr == NULL) - { - SendSysMessage(LANG_NO_CHAR_SELECTED); - SetSentErrorMessage(true); - return false; - } - - int area = GetAreaFlagByAreaID(atoi((char*)args)); - int offset = area / 32; - uint32 val = (uint32)(1 << (area % 32)); - - if (area<0 || offset >= PLAYER_EXPLORED_ZONES_SIZE) - { - SendSysMessage(LANG_BAD_VALUE); - SetSentErrorMessage(true); - return false; - } - - uint32 currFields = chr->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset); - chr->SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, (uint32)(currFields ^ val)); - - SendSysMessage(LANG_UNEXPLORE_AREA); - return true; -} - -bool ChatHandler::HandleBankCommand(const char* /*args*/) -{ - m_session->SendShowBank(m_session->GetPlayer()->GetGUID()); - - return true; -} - -bool ChatHandler::HandleChangeWeather(const char *args) -{ - if (!*args) - return false; - - //Weather is OFF - if (!sWorld->getBoolConfig(CONFIG_WEATHER)) - { - SendSysMessage(LANG_WEATHER_DISABLED); - SetSentErrorMessage(true); - return false; - } - - // *Change the weather of a cell - char* px = strtok((char*)args, " "); - char* py = strtok(NULL, " "); - - if (!px || !py) - return false; - - uint32 type = (uint32)atoi(px); //0 to 3, 0: fine, 1: rain, 2: snow, 3: sand - float grade = (float)atof(py); //0 to 1, sending -1 is instand good weather - - Player* player = m_session->GetPlayer(); - uint32 zoneid = player->GetZoneId(); - - Weather* wth = WeatherMgr::FindWeather(zoneid); - - if (!wth) - wth = WeatherMgr::AddWeather(zoneid); - if (!wth) - { - SendSysMessage(LANG_NO_WEATHER); - SetSentErrorMessage(true); - return false; - } - - wth->SetWeather(WeatherType(type), grade); - - return true; -} - -bool ChatHandler::HandleRespawnCommand(const char* /*args*/) -{ - Player* player = m_session->GetPlayer(); - - // accept only explicitly selected target (not implicitly self targeting case) - Unit* target = getSelectedUnit(); - if (player->GetSelection() && target) - { - if (target->GetTypeId() != TYPEID_UNIT || target->isPet()) - { - SendSysMessage(LANG_SELECT_CREATURE); - SetSentErrorMessage(true); - return false; - } - - if (target->isDead()) - target->ToCreature()->Respawn(); - return true; - } - - CellCoord p(Trinity::ComputeCellCoord(player->GetPositionX(), player->GetPositionY())); - Cell cell(p); - cell.SetNoCreate(); - - Trinity::RespawnDo u_do; - Trinity::WorldObjectWorker<Trinity::RespawnDo> worker(player, u_do); - - TypeContainerVisitor<Trinity::WorldObjectWorker<Trinity::RespawnDo>, GridTypeMapContainer > obj_worker(worker); - cell.Visit(p, obj_worker, *player->GetMap(), *player, player->GetGridActivationRange()); - - return true; -} - -bool ChatHandler::HandlePDumpLoadCommand(const char *args) -{ - if (!*args) - return false; - - char * file = strtok((char*)args, " "); - if (!file) - return false; - - char * account = strtok(NULL, " "); - if (!account) - return false; - - std::string account_name = account; - if (!AccountMgr::normalizeString(account_name)) - { - PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, account_name.c_str()); - SetSentErrorMessage(true); - return false; - } - - uint32 account_id = AccountMgr::GetId(account_name); - if (!account_id) - { - account_id = atoi(account); // use original string - if (!account_id) - { - PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, account_name.c_str()); - SetSentErrorMessage(true); - return false; - } - } - - if (!AccountMgr::GetName(account_id, account_name)) - { - PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, account_name.c_str()); - SetSentErrorMessage(true); - return false; - } - - char* guid_str = NULL; - char* name_str = strtok(NULL, " "); - - std::string name; - if (name_str) - { - name = name_str; - // normalize the name if specified and check if it exists - if (!normalizePlayerName(name)) - { - PSendSysMessage(LANG_INVALID_CHARACTER_NAME); - SetSentErrorMessage(true); - return false; - } - - if (ObjectMgr::CheckPlayerName(name, true) != CHAR_NAME_SUCCESS) - { - PSendSysMessage(LANG_INVALID_CHARACTER_NAME); - SetSentErrorMessage(true); - return false; - } - - guid_str = strtok(NULL, " "); - } - - uint32 guid = 0; - - if (guid_str) - { - guid = atoi(guid_str); - if (!guid) - { - PSendSysMessage(LANG_INVALID_CHARACTER_GUID); - SetSentErrorMessage(true); - return false; - } - - if (sObjectMgr->GetPlayerAccountIdByGUID(guid)) - { - PSendSysMessage(LANG_CHARACTER_GUID_IN_USE, guid); - SetSentErrorMessage(true); - return false; - } - } - - switch (PlayerDumpReader().LoadDump(file, account_id, name, guid)) - { - case DUMP_SUCCESS: - PSendSysMessage(LANG_COMMAND_IMPORT_SUCCESS); - break; - case DUMP_FILE_OPEN_ERROR: - PSendSysMessage(LANG_FILE_OPEN_FAIL, file); - SetSentErrorMessage(true); - return false; - case DUMP_FILE_BROKEN: - PSendSysMessage(LANG_DUMP_BROKEN, file); - SetSentErrorMessage(true); - return false; - case DUMP_TOO_MANY_CHARS: - PSendSysMessage(LANG_ACCOUNT_CHARACTER_LIST_FULL, account_name.c_str(), account_id); - SetSentErrorMessage(true); - return false; - default: - PSendSysMessage(LANG_COMMAND_IMPORT_FAILED); - SetSentErrorMessage(true); - return false; - } - - return true; -} - -bool ChatHandler::HandlePDumpWriteCommand(const char *args) -{ - if (!*args) - return false; - - char* file = strtok((char*)args, " "); - char* p2 = strtok(NULL, " "); - - if (!file || !p2) - return false; - - uint64 guid; - // character name can't start from number - if (isNumeric(p2)) - guid = MAKE_NEW_GUID(atoi(p2), 0, HIGHGUID_PLAYER); - else - { - std::string name = extractPlayerNameFromLink(p2); - if (name.empty()) - { - SendSysMessage(LANG_PLAYER_NOT_FOUND); - SetSentErrorMessage(true); - return false; - } - - guid = sObjectMgr->GetPlayerGUIDByName(name); - } - - if (!sObjectMgr->GetPlayerAccountIdByGUID(guid)) - { - PSendSysMessage(LANG_PLAYER_NOT_FOUND); - SetSentErrorMessage(true); - return false; - } - - switch (PlayerDumpWriter().WriteDump(file, uint32(guid))) - { - case DUMP_SUCCESS: - PSendSysMessage(LANG_COMMAND_EXPORT_SUCCESS); - break; - case DUMP_FILE_OPEN_ERROR: - PSendSysMessage(LANG_FILE_OPEN_FAIL, file); - SetSentErrorMessage(true); - return false; - case DUMP_CHARACTER_DELETED: - PSendSysMessage(LANG_COMMAND_EXPORT_DELETED_CHAR); - SetSentErrorMessage(true); - return false; - default: - PSendSysMessage(LANG_COMMAND_EXPORT_FAILED); - SetSentErrorMessage(true); - return false; - } - - return true; -} - -bool ChatHandler::HandleMovegensCommand(const char* /*args*/) -{ - Unit* unit = getSelectedUnit(); - if (!unit) - { - SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); - SetSentErrorMessage(true); - return false; - } - - PSendSysMessage(LANG_MOVEGENS_LIST, (unit->GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature"), unit->GetGUIDLow()); - - MotionMaster* mm = unit->GetMotionMaster(); - float x,y,z; - mm->GetDestination(x,y,z); - - for (uint8 i = 0; i < MAX_MOTION_SLOT; ++i) - { - MovementGenerator* mg = mm->GetMotionSlot(i); - if (!mg) - { - SendSysMessage("Empty"); - continue; - } - switch (mg->GetMovementGeneratorType()) - { - case IDLE_MOTION_TYPE: SendSysMessage(LANG_MOVEGENS_IDLE); break; - case RANDOM_MOTION_TYPE: SendSysMessage(LANG_MOVEGENS_RANDOM); break; - case WAYPOINT_MOTION_TYPE: SendSysMessage(LANG_MOVEGENS_WAYPOINT); break; - case ANIMAL_RANDOM_MOTION_TYPE: SendSysMessage(LANG_MOVEGENS_ANIMAL_RANDOM); break; - case CONFUSED_MOTION_TYPE: SendSysMessage(LANG_MOVEGENS_CONFUSED); break; - case CHASE_MOTION_TYPE: - { - Unit* target = NULL; - if (unit->GetTypeId() == TYPEID_PLAYER) - target = static_cast<ChaseMovementGenerator<Player> const*>(mg)->GetTarget(); - else - target = static_cast<ChaseMovementGenerator<Creature> const*>(mg)->GetTarget(); - - if (!target) - SendSysMessage(LANG_MOVEGENS_CHASE_NULL); - else if (target->GetTypeId() == TYPEID_PLAYER) - PSendSysMessage(LANG_MOVEGENS_CHASE_PLAYER, target->GetName(), target->GetGUIDLow()); - else - PSendSysMessage(LANG_MOVEGENS_CHASE_CREATURE, target->GetName(), target->GetGUIDLow()); - break; - } - case FOLLOW_MOTION_TYPE: - { - Unit* target = NULL; - if (unit->GetTypeId() == TYPEID_PLAYER) - target = static_cast<FollowMovementGenerator<Player> const*>(mg)->GetTarget(); - else - target = static_cast<FollowMovementGenerator<Creature> const*>(mg)->GetTarget(); - - if (!target) - SendSysMessage(LANG_MOVEGENS_FOLLOW_NULL); - else if (target->GetTypeId() == TYPEID_PLAYER) - PSendSysMessage(LANG_MOVEGENS_FOLLOW_PLAYER, target->GetName(), target->GetGUIDLow()); - else - PSendSysMessage(LANG_MOVEGENS_FOLLOW_CREATURE, target->GetName(), target->GetGUIDLow()); - break; - } - case HOME_MOTION_TYPE: - { - if (unit->GetTypeId() == TYPEID_UNIT) - PSendSysMessage(LANG_MOVEGENS_HOME_CREATURE, x, y, z); - else - SendSysMessage(LANG_MOVEGENS_HOME_PLAYER); - break; - } - case FLIGHT_MOTION_TYPE: SendSysMessage(LANG_MOVEGENS_FLIGHT); break; - case POINT_MOTION_TYPE: - { - PSendSysMessage(LANG_MOVEGENS_POINT, x, y, z); - break; - } - case FLEEING_MOTION_TYPE: SendSysMessage(LANG_MOVEGENS_FEAR); break; - case DISTRACT_MOTION_TYPE: SendSysMessage(LANG_MOVEGENS_DISTRACT); break; - case EFFECT_MOTION_TYPE: SendSysMessage(LANG_MOVEGENS_EFFECT); break; - default: - PSendSysMessage(LANG_MOVEGENS_UNKNOWN, mg->GetMovementGeneratorType()); - break; - } - } - return true; -} - -/* -ComeToMe command REQUIRED for 3rd party scripting library to have access to PointMovementGenerator -Without this function 3rd party scripting library will get linking errors (unresolved external) -when attempting to use the PointMovementGenerator -*/ -bool ChatHandler::HandleComeToMeCommand(const char *args) -{ - char* newFlagStr = strtok((char*)args, " "); - - if (!newFlagStr) - return false; - - Creature* caster = getSelectedCreature(); - if (!caster) - { - SendSysMessage(LANG_SELECT_CREATURE); - SetSentErrorMessage(true); - return false; - } - - Player* player = m_session->GetPlayer(); - - caster->GetMotionMaster()->MovePoint(0, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()); - return true; -} - -//Send items by mail -bool ChatHandler::HandleSendItemsCommand(const char *args) -{ - // format: name "subject text" "mail text" item1[:count1] item2[:count2] ... item12[:count12] - Player* receiver; - uint64 receiver_guid; - std::string receiver_name; - if (!extractPlayerTarget((char*)args, &receiver, &receiver_guid, &receiver_name)) - return false; - - char* tail1 = strtok(NULL, ""); - if (!tail1) - return false; - - char* msgSubject = extractQuotedArg(tail1); - if (!msgSubject) - return false; - - char* tail2 = strtok(NULL, ""); - if (!tail2) - return false; - - char* msgText = extractQuotedArg(tail2); - if (!msgText) - return false; - - // msgSubject, msgText isn't NUL after prev. check - std::string subject = msgSubject; - std::string text = msgText; - - // extract items - typedef std::pair<uint32, uint32> ItemPair; - typedef std::list< ItemPair > ItemPairs; - ItemPairs items; - - // get all tail string - char* tail = strtok(NULL, ""); - - // get from tail next item str - while (char* itemStr = strtok(tail, " ")) - { - // and get new tail - tail = strtok(NULL, ""); - - // parse item str - char* itemIdStr = strtok(itemStr, ":"); - char* itemCountStr = strtok(NULL, " "); - - uint32 item_id = atoi(itemIdStr); - if (!item_id) - return false; - - ItemTemplate const* item_proto = sObjectMgr->GetItemTemplate(item_id); - if (!item_proto) - { - PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, item_id); - SetSentErrorMessage(true); - return false; - } - - uint32 item_count = itemCountStr ? atoi(itemCountStr) : 1; - if (item_count < 1 || (item_proto->MaxCount > 0 && item_count > uint32(item_proto->MaxCount))) - { - PSendSysMessage(LANG_COMMAND_INVALID_ITEM_COUNT, item_count, item_id); - SetSentErrorMessage(true); - return false; - } - - while (item_count > item_proto->GetMaxStackSize()) - { - items.push_back(ItemPair(item_id, item_proto->GetMaxStackSize())); - item_count -= item_proto->GetMaxStackSize(); - } - - items.push_back(ItemPair(item_id, item_count)); - - if (items.size() > MAX_MAIL_ITEMS) - { - PSendSysMessage(LANG_COMMAND_MAIL_ITEMS_LIMIT, MAX_MAIL_ITEMS); - SetSentErrorMessage(true); - return false; - } - } - - // from console show not existed sender - MailSender sender(MAIL_NORMAL, m_session ? m_session->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM); - - // fill mail - MailDraft draft(subject, text); - - SQLTransaction trans = CharacterDatabase.BeginTransaction(); - - for (ItemPairs::const_iterator itr = items.begin(); itr != items.end(); ++itr) - { - if (Item* item = Item::CreateItem(itr->first, itr->second, m_session ? m_session->GetPlayer() : 0)) - { - item->SaveToDB(trans); // save for prevent lost at next mail load, if send fail then item will deleted - draft.AddItem(item); - } - } - - draft.SendMailTo(trans, MailReceiver(receiver, GUID_LOPART(receiver_guid)), sender); - CharacterDatabase.CommitTransaction(trans); - - std::string nameLink = playerLink(receiver_name); - PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str()); - return true; -} - -///Send money by mail -bool ChatHandler::HandleSendMoneyCommand(const char *args) -{ - /// format: name "subject text" "mail text" money - - Player* receiver; - uint64 receiver_guid; - std::string receiver_name; - if (!extractPlayerTarget((char*)args, &receiver, &receiver_guid, &receiver_name)) - return false; - - char* tail1 = strtok(NULL, ""); - if (!tail1) - return false; - - char* msgSubject = extractQuotedArg(tail1); - if (!msgSubject) - return false; - - char* tail2 = strtok(NULL, ""); - if (!tail2) - return false; - - char* msgText = extractQuotedArg(tail2); - if (!msgText) - return false; - - char* money_str = strtok(NULL, ""); - int32 money = money_str ? atoi(money_str) : 0; - if (money <= 0) - return false; - - // msgSubject, msgText isn't NUL after prev. check - std::string subject = msgSubject; - std::string text = msgText; - - // from console show not existed sender - MailSender sender(MAIL_NORMAL, m_session ? m_session->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM); - - SQLTransaction trans = CharacterDatabase.BeginTransaction(); - - MailDraft(subject, text) - .AddMoney(money) - .SendMailTo(trans, MailReceiver(receiver, GUID_LOPART(receiver_guid)), sender); - - CharacterDatabase.CommitTransaction(trans); - - std::string nameLink = playerLink(receiver_name); - PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str()); - return true; -} - -/// Send a message to a player in game -bool ChatHandler::HandleSendMessageCommand(const char *args) -{ - ///- Find the player - Player* rPlayer; - if (!extractPlayerTarget((char*)args, &rPlayer)) - return false; - - char* msg_str = strtok(NULL, ""); - if (!msg_str) - return false; - - ///- Check that he is not logging out. - if (rPlayer->GetSession()->isLogingOut()) - { - SendSysMessage(LANG_PLAYER_NOT_FOUND); - SetSentErrorMessage(true); - return false; - } - - ///- Send the message - //Use SendAreaTriggerMessage for fastest delivery. - rPlayer->GetSession()->SendAreaTriggerMessage("%s", msg_str); - rPlayer->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r"); - - //Confirmation message - std::string nameLink = GetNameLink(rPlayer); - PSendSysMessage(LANG_SENDMESSAGE, nameLink.c_str(), msg_str); - return true; -} - -bool ChatHandler::HandleFlushArenaPointsCommand(const char * /*args*/) -{ - sArenaTeamMgr->DistributeArenaPoints(); - return true; -} - -bool ChatHandler::HandleChannelSetOwnership(const char *args) -{ - if (!*args) - return false; - char *channel = strtok((char*)args, " "); - char *argstr = strtok(NULL, ""); - - if (!channel || !argstr) - return false; - - Player* player = m_session->GetPlayer(); - Channel* chn = NULL; - - if (ChannelMgr* cMgr = channelMgr(player->GetTeam())) - chn = cMgr->GetChannel(channel, player); - - if (strcmp(argstr, "on") == 0) - { - if (chn) - chn->SetOwnership(true); - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHANNEL_OWNERSHIP); - stmt->setUInt8 (0, 1); - stmt->setString(1, channel); - CharacterDatabase.Execute(stmt); - PSendSysMessage(LANG_CHANNEL_ENABLE_OWNERSHIP, channel); - } - else if (strcmp(argstr, "off") == 0) - { - if (chn) - chn->SetOwnership(false); - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHANNEL_OWNERSHIP); - stmt->setUInt8 (0, 0); - stmt->setString(1, channel); - CharacterDatabase.Execute(stmt); - PSendSysMessage(LANG_CHANNEL_DISABLE_OWNERSHIP, channel); - } - else - return false; - - return true; -} - -bool ChatHandler::HandlePlayAllCommand(const char *args) -{ - if (!*args) - return false; - - uint32 soundId = atoi((char*)args); - - if (!sSoundEntriesStore.LookupEntry(soundId)) - { - PSendSysMessage(LANG_SOUND_NOT_EXIST, soundId); - SetSentErrorMessage(true); - return false; - } - - WorldPacket data(SMSG_PLAY_SOUND, 4); - data << uint32(soundId) << m_session->GetPlayer()->GetGUID(); - sWorld->SendGlobalMessage(&data); - - PSendSysMessage(LANG_COMMAND_PLAYED_TO_ALL, soundId); - return true; -} - -bool ChatHandler::HandleFreezeCommand(const char *args) -{ - std::string name; - Player* player; - char *TargetName = strtok((char*)args, " "); //get entered name - if (!TargetName) //if no name entered use target - { - player = getSelectedPlayer(); - if (player) //prevent crash with creature as target - { - name = player->GetName(); - normalizePlayerName(name); - } - } - else // if name entered - { - name = TargetName; - normalizePlayerName(name); - player = sObjectAccessor->FindPlayerByName(name.c_str()); - } - - if (!player) - { - SendSysMessage(LANG_COMMAND_FREEZE_WRONG); - return true; - } - - if (player == m_session->GetPlayer()) - { - SendSysMessage(LANG_COMMAND_FREEZE_ERROR); - return true; - } - - //effect - if (player && player != m_session->GetPlayer()) - { - PSendSysMessage(LANG_COMMAND_FREEZE, name.c_str()); - - //stop combat + make player unattackable + duel stop + stop some spells - player->setFaction(35); - player->CombatStop(); - if (player->IsNonMeleeSpellCasted(true)) - player->InterruptNonMeleeSpells(true); - player->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - - //if player class = hunter || warlock remove pet if alive - if ((player->getClass() == CLASS_HUNTER) || (player->getClass() == CLASS_WARLOCK)) - { - if (Pet* pet = player->GetPet()) - { - pet->SavePetToDB(PET_SAVE_AS_CURRENT); - // not let dismiss dead pet - if (pet && pet->isAlive()) - player->RemovePet(pet, PET_SAVE_NOT_IN_SLOT); - } - } - - //m_session->GetPlayer()->CastSpell(player, spellID, false); - if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(9454)) - Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, player, player); - - //save player - player->SaveToDB(); - } - return true; -} - -bool ChatHandler::HandleUnFreezeCommand(const char *args) -{ - std::string name; - Player* player; - char* targetName = strtok((char*)args, " "); // Get entered name - - if (targetName) - { - name = targetName; - normalizePlayerName(name); - player = sObjectAccessor->FindPlayerByName(name.c_str()); - } - else // If no name was entered - use target - { - player = getSelectedPlayer(); - if (player) - name = player->GetName(); - } - - if (player) - { - PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str()); - - // Reset player faction + allow combat + allow duels - player->setFactionForRace(player->getRace()); - player->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - - // Remove Freeze spell (allowing movement and spells) - player->RemoveAurasDueToSpell(9454); - - // Save player - player->SaveToDB(); - } - else - { - if (targetName) - { - // Check for offline players - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_GUID_BY_NAME); - stmt->setString(0, name); - PreparedQueryResult result = CharacterDatabase.Query(stmt); - - if (!result) - { - SendSysMessage(LANG_COMMAND_FREEZE_WRONG); - return true; - } - - // If player found: delete his freeze aura - Field* fields = result->Fetch(); - uint32 lowGuid = fields[0].GetUInt32(); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA_FROZEN); - stmt->setUInt32(0, lowGuid); - CharacterDatabase.Execute(stmt); - - PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str()); - return true; - } - else - { - SendSysMessage(LANG_COMMAND_FREEZE_WRONG); - return true; - } - } - - return true; -} - -bool ChatHandler::HandleListFreezeCommand(const char * /*args*/) -{ - // Get names from DB - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_AURA_FROZEN); - - PreparedQueryResult result = CharacterDatabase.Query(stmt); - - if (!result) - { - SendSysMessage(LANG_COMMAND_NO_FROZEN_PLAYERS); - return true; - } - //Header of the names - PSendSysMessage(LANG_COMMAND_LIST_FREEZE); - - //Output of the results - do - { - Field* fields = result->Fetch(); - std::string fplayers = fields[0].GetString(); - PSendSysMessage(LANG_COMMAND_FROZEN_PLAYERS, fplayers.c_str()); - } while (result->NextRow()); - - return true; -} - -bool ChatHandler::HandleGroupLeaderCommand(const char *args) -{ - Player* player = NULL; - Group* group = NULL; - uint64 guid = 0; - char* cname = strtok((char*)args, " "); - - if (GetPlayerGroupAndGUIDByName(cname, player, group, guid)) - if (group && group->GetLeaderGUID() != guid) - { - group->ChangeLeader(guid); - group->SendUpdate(); - } - - return true; -} - -bool ChatHandler::HandleGroupDisbandCommand(const char *args) -{ - Player* player = NULL; - Group* group = NULL; - uint64 guid = 0; - char* cname = strtok((char*)args, " "); - - if (GetPlayerGroupAndGUIDByName(cname, player, group, guid)) - if (group) - group->Disband(); - - return true; -} - -bool ChatHandler::HandleGroupRemoveCommand(const char *args) -{ - Player* player = NULL; - Group* group = NULL; - uint64 guid = 0; - char* cname = strtok((char*)args, " "); - - if (GetPlayerGroupAndGUIDByName(cname, player, group, guid, true)) - if (group) - group->RemoveMember(guid); - - return true; -} - -bool ChatHandler::HandlePossessCommand(const char * /*args*/) -{ - Unit* unit = getSelectedUnit(); - if (!unit) - return false; - - m_session->GetPlayer()->CastSpell(unit, 530, true); - return true; -} - -bool ChatHandler::HandleUnPossessCommand(const char * /*args*/) -{ - Unit* unit = getSelectedUnit(); - if (!unit) - unit = m_session->GetPlayer(); - - unit->RemoveCharmAuras(); - - return true; -} - -bool ChatHandler::HandleBindSightCommand(const char * /*args*/) -{ - Unit* unit = getSelectedUnit(); - if (!unit) - return false; - - m_session->GetPlayer()->CastSpell(unit, 6277, true); - return true; -} - -bool ChatHandler::HandleUnbindSightCommand(const char * /*args*/) -{ - Player* player = m_session->GetPlayer(); - - if (player->isPossessing()) - return false; - - player->StopCastingBindSight(); - return true; -} diff --git a/src/server/game/Chat/Commands/TicketCommands.cpp b/src/server/game/Chat/Commands/TicketCommands.cpp deleted file mode 100755 index 177899efbf0..00000000000 --- a/src/server/game/Chat/Commands/TicketCommands.cpp +++ /dev/null @@ -1,457 +0,0 @@ -/* - * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/> - * - * This program 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 2 of the License, or (at your - * option) any later version. - * - * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "Common.h" -#include "DatabaseEnv.h" -#include "WorldPacket.h" -#include "WorldSession.h" -#include "ObjectMgr.h" -#include "TicketMgr.h" -#include "AccountMgr.h" -#include "Chat.h" -#include "Player.h" - -bool ChatHandler::HandleGMTicketListCommand(const char* /*args*/) -{ - sTicketMgr->ShowList(*this, false); - return true; -} - -bool ChatHandler::HandleGMTicketListOnlineCommand(const char* /*args*/) -{ - sTicketMgr->ShowList(*this, true); - return true; -} - -bool ChatHandler::HandleGMTicketListClosedCommand(const char* /*args*/) -{ - sTicketMgr->ShowClosedList(*this); - return true; -} - -bool ChatHandler::HandleGMTicketListEscalatedCommand(const char* /*args*/) -{ - sTicketMgr->ShowEscalatedList(*this); - return true; -} - -bool ChatHandler::HandleGMTicketGetByIdCommand(const char* args) -{ - if (!*args) - return false; - - uint32 ticketId = atoi(args); - GmTicket *ticket = sTicketMgr->GetTicket(ticketId); - if (!ticket || ticket->IsClosed() || ticket->IsCompleted()) - { - SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - - SQLTransaction trans = SQLTransaction(NULL); - ticket->SetViewed(); - ticket->SaveToDB(trans); - - SendSysMessage(ticket->FormatMessageString(*this, true).c_str()); - return true; -} - -bool ChatHandler::HandleGMTicketGetByNameCommand(const char* args) -{ - if (!*args) - return false; - - std::string name(args); - if (!normalizePlayerName(name)) - return false; - - // Detect target's GUID - uint64 guid = 0; - if (Player* player = sObjectAccessor->FindPlayerByName(name.c_str())) - guid = player->GetGUID(); - else - guid = sObjectMgr->GetPlayerGUIDByName(name); - - // Target must exist - if (!guid) - { - SendSysMessage(LANG_NO_PLAYERS_FOUND); - return true; - } - - // Ticket must exist - GmTicket *ticket = sTicketMgr->GetTicketByPlayer(guid); - if (!ticket) - { - SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - - SQLTransaction trans = SQLTransaction(NULL); - ticket->SetViewed(); - ticket->SaveToDB(trans); - - SendSysMessage(ticket->FormatMessageString(*this, true).c_str()); - return true; -} - -bool ChatHandler::HandleGMTicketCloseByIdCommand(const char* args) -{ - if (!*args) - return false; - - uint32 ticketId = atoi(args); - GmTicket* ticket = sTicketMgr->GetTicket(ticketId); - if (!ticket || ticket->IsClosed() || ticket->IsCompleted()) - { - SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - - // Ticket should be assigned to the player who tries to close it. - // Console can override though - Player* player = m_session ? m_session->GetPlayer() : NULL; - if (player && ticket->IsAssignedNotTo(player->GetGUID())) - { - PSendSysMessage(LANG_COMMAND_TICKETCANNOTCLOSE, ticket->GetId()); - return true; - } - - sTicketMgr->CloseTicket(ticket->GetId(), player ? player->GetGUID() : -1); - sTicketMgr->UpdateLastChange(); - - std::string msg = ticket->FormatMessageString(*this, player ? player->GetName() : "Console", NULL, NULL, NULL); - SendGlobalGMSysMessage(msg.c_str()); - - // Inform player, who submitted this ticket, that it is closed - if (Player* submitter = ticket->GetPlayer()) - { - if (submitter->IsInWorld()) - { - WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4); - data << uint32(GMTICKET_RESPONSE_TICKET_DELETED); - submitter->GetSession()->SendPacket(&data); - } - } - return true; -} - -bool ChatHandler::HandleGMTicketAssignToCommand(const char* args) -{ - if (!*args) - return false; - - char* sTicketId = strtok((char*)args, " "); - uint32 ticketId = atoi(sTicketId); - - char* sTarget = strtok(NULL, " "); - if (!sTarget) - return false; - - std::string target(sTarget); - if (!normalizePlayerName(target)) - return false; - - GmTicket* ticket = sTicketMgr->GetTicket(ticketId); - if (!ticket || ticket->IsClosed()) - { - SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - - // Get target information - uint64 targetGuid = sObjectMgr->GetPlayerGUIDByName(target.c_str()); - uint64 targetAccId = sObjectMgr->GetPlayerAccountIdByGUID(targetGuid); - uint32 targetGmLevel = AccountMgr::GetSecurity(targetAccId, realmID); - - // Target must exist and have administrative rights - if (!targetGuid || AccountMgr::IsPlayerAccount(targetGmLevel)) - { - SendSysMessage(LANG_COMMAND_TICKETASSIGNERROR_A); - return true; - } - - // If already assigned, leave - if (ticket->IsAssignedTo(targetGuid)) - { - PSendSysMessage(LANG_COMMAND_TICKETASSIGNERROR_B, ticket->GetId()); - return true; - } - - // If assigned to different player other than current, leave - //! Console can override though - Player* player = m_session ? m_session->GetPlayer() : NULL; - if (player && ticket->IsAssignedNotTo(player->GetGUID())) - { - PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->GetId(), target.c_str()); - return true; - } - - // Assign ticket - SQLTransaction trans = SQLTransaction(NULL); - ticket->SetAssignedTo(targetGuid, AccountMgr::IsAdminAccount(targetGmLevel)); - ticket->SaveToDB(trans); - sTicketMgr->UpdateLastChange(); - - std::string msg = ticket->FormatMessageString(*this, NULL, target.c_str(), NULL, NULL); - SendGlobalGMSysMessage(msg.c_str()); - return true; -} - -bool ChatHandler::HandleGMTicketUnAssignCommand(const char* args) -{ - if (!*args) - return false; - - uint32 ticketId = atoi(args); - GmTicket *ticket = sTicketMgr->GetTicket(ticketId); - if (!ticket || ticket->IsClosed()) - { - SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - // Ticket must be assigned - if (!ticket->IsAssigned()) - { - PSendSysMessage(LANG_COMMAND_TICKETNOTASSIGNED, ticket->GetId()); - return true; - } - - // Get security level of player, whom this ticket is assigned to - uint32 security = SEC_PLAYER; - Player* assignedPlayer = ticket->GetAssignedPlayer(); - if (assignedPlayer && assignedPlayer->IsInWorld()) - security = assignedPlayer->GetSession()->GetSecurity(); - else - { - uint64 guid = ticket->GetAssignedToGUID(); - uint32 accountId = sObjectMgr->GetPlayerAccountIdByGUID(guid); - security = AccountMgr::GetSecurity(accountId, realmID); - } - - // Check security - //! If no m_session present it means we're issuing this command from the console - uint32 mySecurity = m_session ? m_session->GetSecurity() : SEC_CONSOLE; - if (security > mySecurity) - { - SendSysMessage(LANG_COMMAND_TICKETUNASSIGNSECURITY); - return true; - } - - SQLTransaction trans = SQLTransaction(NULL); - ticket->SetUnassigned(); - ticket->SaveToDB(trans); - sTicketMgr->UpdateLastChange(); - - std::string msg = ticket->FormatMessageString(*this, NULL, ticket->GetAssignedToName().c_str(), - m_session ? m_session->GetPlayer()->GetName() : "Console", NULL); - SendGlobalGMSysMessage(msg.c_str()); - return true; -} - -bool ChatHandler::HandleGMTicketCommentCommand(const char* args) -{ - if (!*args) - return false; - - char* tguid = strtok((char*)args, " "); - uint32 ticketId = atoi(tguid); - - char* comment = strtok(NULL, "\n"); - if (!comment) - return false; - - GmTicket *ticket = sTicketMgr->GetTicket(ticketId); - if (!ticket || ticket->IsClosed()) - { - PSendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - - // Cannot comment ticket assigned to someone else - //! Console excluded - Player* player = m_session ? m_session->GetPlayer() : NULL; - if (player && ticket->IsAssignedNotTo(player->GetGUID())) - { - PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->GetId()); - return true; - } - - SQLTransaction trans = SQLTransaction(NULL); - ticket->SetComment(comment); - ticket->SaveToDB(trans); - sTicketMgr->UpdateLastChange(); - - std::string msg = ticket->FormatMessageString(*this, NULL, ticket->GetAssignedToName().c_str(), NULL, NULL); - msg += PGetParseString(LANG_COMMAND_TICKETLISTADDCOMMENT, player ? player->GetName() : "Console", comment); - SendGlobalGMSysMessage(msg.c_str()); - - return true; -} - -bool ChatHandler::HandleGMTicketDeleteByIdCommand(const char* args) -{ - if (!*args) - return false; - - uint32 ticketId = atoi(args); - GmTicket* ticket = sTicketMgr->GetTicket(ticketId); - if (!ticket) - { - SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - - if (!ticket->IsClosed()) - { - SendSysMessage(LANG_COMMAND_TICKETCLOSEFIRST); - return true; - } - - std::string msg = ticket->FormatMessageString(*this, NULL, NULL, NULL, m_session ? m_session->GetPlayer()->GetName() : "Console"); - SendGlobalGMSysMessage(msg.c_str()); - - sTicketMgr->RemoveTicket(ticket->GetId()); - sTicketMgr->UpdateLastChange(); - - if (Player* player = ticket->GetPlayer()) - { - if (player->IsInWorld()) - { - // Force abandon ticket - WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4); - data << uint32(GMTICKET_RESPONSE_TICKET_DELETED); - player->GetSession()->SendPacket(&data); - } - } - return true; -} - -bool ChatHandler::HandleGMTicketResetCommand(const char* /* args */) -{ - if (sTicketMgr->GetOpenTicketCount() > 0) - { - SendSysMessage(LANG_COMMAND_TICKETPENDING); - return true; - } - else - { - sTicketMgr->ResetTickets(); - SendSysMessage(LANG_COMMAND_TICKETRESET); - } - - return true; -} - -bool ChatHandler::HandleToggleGMTicketSystem(const char* /* args */) -{ - bool status = !sTicketMgr->GetStatus(); - sTicketMgr->SetStatus(status); - PSendSysMessage(status ? LANG_ALLOW_TICKETS : LANG_DISALLOW_TICKETS); - return true; -} - -bool ChatHandler::HandleGMTicketEscalateCommand(const char *args) -{ - if (!*args) - return false; - - uint32 ticketId = atoi(args); - GmTicket* ticket = sTicketMgr->GetTicket(ticketId); - if (!ticket || !ticket->IsClosed() || ticket->IsCompleted() || ticket->GetEscalatedStatus() != TICKET_UNASSIGNED) - { - SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - - ticket->SetEscalatedStatus(TICKET_IN_ESCALATION_QUEUE); - - if (Player* player = ticket->GetPlayer()) - if (player->IsInWorld()) - sTicketMgr->SendTicket(player->GetSession(), ticket); - - sTicketMgr->UpdateLastChange(); - return true; -} - -bool ChatHandler::HandleGMTicketCompleteCommand(const char* args) -{ - if (!*args) - return false; - - uint32 ticketId = atoi(args); - GmTicket* ticket = sTicketMgr->GetTicket(ticketId); - if (!ticket || !ticket->IsClosed() || ticket->IsCompleted()) - { - SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - - if (Player* player = ticket->GetPlayer()) - if (player->IsInWorld()) - ticket->SendResponse(player->GetSession()); - - sTicketMgr->UpdateLastChange(); - return true; -} - -inline bool ChatHandler::_HandleGMTicketResponseAppendCommand(const char* args, bool newLine) -{ - if (!*args) - return false; - - char* sTicketId = strtok((char*)args, " "); - uint32 ticketId = atoi(sTicketId); - - char* response = strtok(NULL, "\n"); - if (!response) - return false; - - GmTicket* ticket = sTicketMgr->GetTicket(ticketId); - if (!ticket || !ticket->IsClosed()) - { - PSendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - - // Cannot add response to ticket, assigned to someone else - //! Console excluded - Player* player = m_session ? m_session->GetPlayer() : NULL; - if (player && ticket->IsAssignedNotTo(player->GetGUID())) - { - PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->GetId()); - return true; - } - - SQLTransaction trans = SQLTransaction(NULL); - ticket->AppendResponse(response); - if (newLine) - ticket->AppendResponse("\n"); - ticket->SaveToDB(trans); - - return true; -} - -bool ChatHandler::HandleGMTicketResponseAppendCommand(const char* args) -{ - return _HandleGMTicketResponseAppendCommand(args, false); -} - -bool ChatHandler::HandleGMTicketResponseAppendLnCommand(const char* args) -{ - return _HandleGMTicketResponseAppendCommand(args, true); -} diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index fc1b56c4b8c..7a4c42027dc 100755 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -41,12 +41,13 @@ #include "GridNotifiers.h" #include "GridNotifiersImpl.h" #include "SpellAuraEffects.h" - +#include "UpdateFieldFlags.h" #include "TemporarySummon.h" #include "Totem.h" #include "OutdoorPvPMgr.h" #include "MovementPacketBuilder.h" #include "DynamicTree.h" +#include "Group.h" uint32 GuidHigh2TypeId(uint32 guid_hi) { @@ -74,6 +75,7 @@ Object::Object() : m_PackGUID(sizeof(uint64)+1) m_uint32Values = NULL; _changedFields = NULL; m_valuesCount = 0; + _fieldNotifyFlags = UF_FLAG_DYNAMIC; m_inWorld = false; m_objectUpdated = false; @@ -463,17 +465,13 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask* if (((GameObject*)this)->ActivateToQuest(target) || target->isGameMaster()) IsActivateToQuest = true; - updateMask->SetBit(GAMEOBJECT_DYNAMIC); - if (((GameObject*)this)->GetGoArtKit()) updateMask->SetBit(GAMEOBJECT_BYTES_1); } else if (isType(TYPEMASK_UNIT)) { if (((Unit*)this)->HasFlag(UNIT_FIELD_AURASTATE, PER_CASTER_AURA_STATE_MASK)) - { updateMask->SetBit(UNIT_FIELD_AURASTATE); - } } } else // case UPDATETYPE_VALUES @@ -481,10 +479,8 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask* if (isType(TYPEMASK_GAMEOBJECT) && !((GameObject*)this)->IsTransport()) { if (((GameObject*)this)->ActivateToQuest(target) || target->isGameMaster()) - { IsActivateToQuest = true; - } - updateMask->SetBit(GAMEOBJECT_DYNAMIC); + updateMask->SetBit(GAMEOBJECT_BYTES_1); if (ToGameObject()->GetGoType() == GAMEOBJECT_TYPE_CHEST && ToGameObject()->GetGOInfo()->chest.groupLootRules && @@ -494,9 +490,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask* else if (isType(TYPEMASK_UNIT)) { if (((Unit*)this)->HasFlag(UNIT_FIELD_AURASTATE, PER_CASTER_AURA_STATE_MASK)) - { updateMask->SetBit(UNIT_FIELD_AURASTATE); - } } } @@ -788,26 +782,96 @@ void Object::_LoadIntoDataField(char const* data, uint32 startOffset, uint32 cou } } -void Object::_SetUpdateBits(UpdateMask* updateMask, Player* /*target*/) const +void Object::GetUpdateFieldData(Player const* target, uint32*& flags, bool& isOwner, bool& isItemOwner, bool& hasSpecialInfo, bool& isPartyMember) const +{ + // This function assumes updatefield index is always valid + switch (GetTypeId()) + { + case TYPEID_ITEM: + case TYPEID_CONTAINER: + flags = ItemUpdateFieldFlags; + isOwner = isItemOwner = ((Item*)this)->GetOwnerGUID() == target->GetGUID(); + break; + case TYPEID_UNIT: + case TYPEID_PLAYER: + { + Player* plr = ToUnit()->GetCharmerOrOwnerPlayerOrPlayerItself(); + flags = UnitUpdateFieldFlags; + isOwner = ToUnit()->GetOwnerGUID() == target->GetGUID(); + hasSpecialInfo = ToUnit()->HasAuraTypeWithCaster(SPELL_AURA_EMPATHY, target->GetGUID()); + isPartyMember = plr && plr->IsInSameGroupWith(target); + break; + } + case TYPEID_GAMEOBJECT: + flags = GameObjectUpdateFieldFlags; + isOwner = ToGameObject()->GetOwnerGUID() == target->GetGUID(); + break; + case TYPEID_DYNAMICOBJECT: + flags = DynamicObjectUpdateFieldFlags; + isOwner = ((DynamicObject*)this)->GetCasterGUID() == target->GetGUID(); + break; + case TYPEID_CORPSE: + flags = CorpseUpdateFieldFlags; + isOwner = ToCorpse()->GetOwnerGUID() == target->GetGUID(); + break; + } +} + +bool Object::IsUpdateFieldVisible(uint32 flags, bool isSelf, bool isOwner, bool isItemOwner, bool isPartyMember) const +{ + if (flags == UF_FLAG_NONE) + return false; + + if (flags & UF_FLAG_PUBLIC) + return true; + + if (flags & UF_FLAG_PRIVATE && isSelf) + return true; + + if (flags & UF_FLAG_OWNER && isOwner) + return true; + + if (flags & UF_FLAG_ITEM_OWNER && isItemOwner) + return true; + + if (flags & UF_FLAG_PARTY_MEMBER && isPartyMember) + return true; + + return false; +} + +void Object::_SetUpdateBits(UpdateMask* updateMask, Player* target) const { bool* indexes = _changedFields; + uint32* flags = NULL; + bool isSelf = target == this; + bool isOwner = false; + bool isItemOwner = false; + bool hasSpecialInfo = false; + bool isPartyMember = false; + + GetUpdateFieldData(target, flags, isOwner, isItemOwner, hasSpecialInfo, isPartyMember); for (uint16 index = 0; index < m_valuesCount; ++index, ++indexes) - { - if (*indexes) + if (_fieldNotifyFlags & flags[index] || (flags[index] & UF_FLAG_SPECIAL_INFO && hasSpecialInfo) || (*indexes && IsUpdateFieldVisible(flags[index], isSelf, isOwner, isItemOwner, isPartyMember))) updateMask->SetBit(index); - } } -void Object::_SetCreateBits(UpdateMask* updateMask, Player* /*target*/) const +void Object::_SetCreateBits(UpdateMask* updateMask, Player* target) const { uint32* value = m_uint32Values; + uint32* flags = NULL; + bool isSelf = target == this; + bool isOwner = false; + bool isItemOwner = false; + bool hasSpecialInfo = false; + bool isPartyMember = false; + + GetUpdateFieldData(target, flags, isOwner, isItemOwner, hasSpecialInfo, isPartyMember); for (uint16 index = 0; index < m_valuesCount; ++index, ++value) - { - if (*value) + if (_fieldNotifyFlags & flags[index] || (flags[index] & UF_FLAG_SPECIAL_INFO && hasSpecialInfo) || (*value && IsUpdateFieldVisible(flags[index], isSelf, isOwner, isItemOwner, isPartyMember))) updateMask->SetBit(index); - } } void Object::SetInt32Value(uint16 index, int32 value) diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 7a91289a95d..ab9ea2daea9 100755 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -300,6 +300,9 @@ class Object virtual void BuildUpdate(UpdateDataMapType&) {} void BuildFieldsUpdate(Player*, UpdateDataMapType &) const; + void SetFieldNotifyFlag(uint16 flag) { _fieldNotifyFlags |= flag; } + void RemoveFieldNotifyFlag(uint16 flag) { _fieldNotifyFlags &= ~flag; } + // FG: some hacky helpers void ForceValuesUpdateAtIndex(uint32); @@ -320,13 +323,16 @@ class Object Object(); void _InitValues(); - void _Create (uint32 guidlow, uint32 entry, HighGuid guidhigh); + void _Create(uint32 guidlow, uint32 entry, HighGuid guidhigh); std::string _ConcatFields(uint16 startIndex, uint16 size) const; void _LoadIntoDataField(const char* data, uint32 startOffset, uint32 count); - virtual void _SetUpdateBits(UpdateMask* updateMask, Player* target) const; + void GetUpdateFieldData(Player const* target, uint32*& flags, bool& isOwner, bool& isItemOwner, bool& hasSpecialInfo, bool& isPartyMember) const; + + bool IsUpdateFieldVisible(uint32 flags, bool isSelf, bool isOwner, bool isItemOwner, bool isPartyMember) const; - virtual void _SetCreateBits(UpdateMask* updateMask, Player* target) const; + void _SetUpdateBits(UpdateMask* updateMask, Player* target) const; + void _SetCreateBits(UpdateMask* updateMask, Player* target) const; void _BuildMovementUpdate(ByteBuffer * data, uint16 flags) const; void _BuildValuesUpdate(uint8 updatetype, ByteBuffer *data, UpdateMask* updateMask, Player* target) const; @@ -346,6 +352,8 @@ class Object uint16 m_valuesCount; + uint16 _fieldNotifyFlags; + bool m_objectUpdated; private: diff --git a/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp new file mode 100644 index 00000000000..95bdaef221b --- /dev/null +++ b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp @@ -0,0 +1,1568 @@ +/* + * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/> + * + * This program 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 2 of the License, or (at your + * option) any later version. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "UpdateFieldFlags.h" + +uint32 ItemUpdateFieldFlags[CONTAINER_END] = +{ + UF_FLAG_PUBLIC, // OBJECT_FIELD_GUID + UF_FLAG_PUBLIC, // OBJECT_FIELD_GUID+1 + UF_FLAG_PUBLIC, // OBJECT_FIELD_TYPE + UF_FLAG_PUBLIC, // OBJECT_FIELD_ENTRY + UF_FLAG_PUBLIC, // OBJECT_FIELD_SCALE_X + UF_FLAG_NONE, // OBJECT_FIELD_PADDING + UF_FLAG_PUBLIC, // ITEM_FIELD_OWNER + UF_FLAG_PUBLIC, // ITEM_FIELD_OWNER+1 + UF_FLAG_PUBLIC, // ITEM_FIELD_CONTAINED + UF_FLAG_PUBLIC, // ITEM_FIELD_CONTAINED+1 + UF_FLAG_PUBLIC, // ITEM_FIELD_CREATOR + UF_FLAG_PUBLIC, // ITEM_FIELD_CREATOR+1 + UF_FLAG_PUBLIC, // ITEM_FIELD_GIFTCREATOR + UF_FLAG_PUBLIC, // ITEM_FIELD_GIFTCREATOR+1 + UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER, // ITEM_FIELD_STACK_COUNT + UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER, // ITEM_FIELD_DURATION + UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER, // ITEM_FIELD_SPELL_CHARGES + UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER, // ITEM_FIELD_SPELL_CHARGES+1 + UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER, // ITEM_FIELD_SPELL_CHARGES+2 + UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER, // ITEM_FIELD_SPELL_CHARGES+3 + UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER, // ITEM_FIELD_SPELL_CHARGES+4 + UF_FLAG_PUBLIC, // ITEM_FIELD_FLAGS + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_1_1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_1_1+1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_1_3 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_2_1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_2_1+1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_2_3 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_3_1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_3_1+1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_3_3 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_4_1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_4_1+1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_4_3 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_5_1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_5_1+1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_5_3 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_6_1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_6_1+1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_6_3 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_7_1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_7_1+1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_7_3 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_8_1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_8_1+1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_8_3 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_9_1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_9_1+1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_9_3 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_10_1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_10_1+1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_10_3 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_11_1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_11_1+1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_11_3 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_12_1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_12_1+1 + UF_FLAG_PUBLIC, // ITEM_FIELD_ENCHANTMENT_12_3 + UF_FLAG_PUBLIC, // ITEM_FIELD_PROPERTY_SEED + UF_FLAG_PUBLIC, // ITEM_FIELD_RANDOM_PROPERTIES_ID + UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER, // ITEM_FIELD_DURABILITY + UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER, // ITEM_FIELD_MAXDURABILITY + UF_FLAG_PUBLIC, // ITEM_FIELD_CREATE_PLAYED_TIME + UF_FLAG_NONE, // ITEM_FIELD_PAD + UF_FLAG_PUBLIC, // CONTAINER_FIELD_NUM_SLOTS + UF_FLAG_NONE, // CONTAINER_ALIGN_PAD + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+1 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+2 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+3 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+4 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+5 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+6 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+7 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+8 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+9 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+10 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+11 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+12 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+13 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+14 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+15 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+16 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+17 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+18 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+19 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+20 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+21 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+22 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+23 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+24 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+25 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+26 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+27 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+28 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+29 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+30 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+31 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+32 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+33 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+34 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+35 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+36 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+37 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+38 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+39 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+40 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+41 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+42 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+43 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+44 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+45 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+46 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+47 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+48 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+49 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+50 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+51 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+52 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+53 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+54 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+55 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+56 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+57 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+58 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+59 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+60 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+61 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+62 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+63 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+64 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+65 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+66 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+67 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+68 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+69 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+70 + UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+71 +}; + +uint32 UnitUpdateFieldFlags[PLAYER_END] = +{ + UF_FLAG_PUBLIC, // OBJECT_FIELD_GUID + UF_FLAG_PUBLIC, // OBJECT_FIELD_GUID+1 + UF_FLAG_PUBLIC, // OBJECT_FIELD_TYPE + UF_FLAG_PUBLIC, // OBJECT_FIELD_ENTRY + UF_FLAG_PUBLIC, // OBJECT_FIELD_SCALE_X + UF_FLAG_NONE, // OBJECT_FIELD_PADDING + UF_FLAG_PUBLIC, // UNIT_FIELD_CHARM + UF_FLAG_PUBLIC, // UNIT_FIELD_CHARM+1 + UF_FLAG_PUBLIC, // UNIT_FIELD_SUMMON + UF_FLAG_PUBLIC, // UNIT_FIELD_SUMMON+1 + UF_FLAG_PRIVATE, // UNIT_FIELD_CRITTER + UF_FLAG_PRIVATE, // UNIT_FIELD_CRITTER+1 + UF_FLAG_PUBLIC, // UNIT_FIELD_CHARMEDBY + UF_FLAG_PUBLIC, // UNIT_FIELD_CHARMEDBY+1 + UF_FLAG_PUBLIC, // UNIT_FIELD_SUMMONEDBY + UF_FLAG_PUBLIC, // UNIT_FIELD_SUMMONEDBY+1 + UF_FLAG_PUBLIC, // UNIT_FIELD_CREATEDBY + UF_FLAG_PUBLIC, // UNIT_FIELD_CREATEDBY+1 + UF_FLAG_PUBLIC, // UNIT_FIELD_TARGET + UF_FLAG_PUBLIC, // UNIT_FIELD_TARGET+1 + UF_FLAG_PUBLIC, // UNIT_FIELD_CHANNEL_OBJECT + UF_FLAG_PUBLIC, // UNIT_FIELD_CHANNEL_OBJECT+1 + UF_FLAG_PUBLIC, // UNIT_CHANNEL_SPELL + UF_FLAG_PUBLIC, // UNIT_FIELD_BYTES_0 + UF_FLAG_PUBLIC, // UNIT_FIELD_HEALTH + UF_FLAG_PUBLIC, // UNIT_FIELD_POWER1 + UF_FLAG_PUBLIC, // UNIT_FIELD_POWER2 + UF_FLAG_PUBLIC, // UNIT_FIELD_POWER3 + UF_FLAG_PUBLIC, // UNIT_FIELD_POWER4 + UF_FLAG_PUBLIC, // UNIT_FIELD_POWER5 + UF_FLAG_PUBLIC, // UNIT_FIELD_POWER6 + UF_FLAG_PUBLIC, // UNIT_FIELD_POWER7 + UF_FLAG_PUBLIC, // UNIT_FIELD_MAXHEALTH + UF_FLAG_PUBLIC, // UNIT_FIELD_MAXPOWER1 + UF_FLAG_PUBLIC, // UNIT_FIELD_MAXPOWER2 + UF_FLAG_PUBLIC, // UNIT_FIELD_MAXPOWER3 + UF_FLAG_PUBLIC, // UNIT_FIELD_MAXPOWER4 + UF_FLAG_PUBLIC, // UNIT_FIELD_MAXPOWER5 + UF_FLAG_PUBLIC, // UNIT_FIELD_MAXPOWER6 + UF_FLAG_PUBLIC, // UNIT_FIELD_MAXPOWER7 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER+1 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER+2 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER+3 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER+4 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER+5 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER+6 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER+1 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER+2 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER+3 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER+4 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER+5 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER+6 + UF_FLAG_PUBLIC, // UNIT_FIELD_LEVEL + UF_FLAG_PUBLIC, // UNIT_FIELD_FACTIONTEMPLATE + UF_FLAG_PUBLIC, // UNIT_VIRTUAL_ITEM_SLOT_ID + UF_FLAG_PUBLIC, // UNIT_VIRTUAL_ITEM_SLOT_ID+1 + UF_FLAG_PUBLIC, // UNIT_VIRTUAL_ITEM_SLOT_ID+2 + UF_FLAG_PUBLIC, // UNIT_FIELD_FLAGS + UF_FLAG_PUBLIC, // UNIT_FIELD_FLAGS_2 + UF_FLAG_PUBLIC, // UNIT_FIELD_AURASTATE + UF_FLAG_PUBLIC, // UNIT_FIELD_BASEATTACKTIME + UF_FLAG_PUBLIC, // UNIT_FIELD_BASEATTACKTIME+1 + UF_FLAG_PRIVATE, // UNIT_FIELD_RANGEDATTACKTIME + UF_FLAG_PUBLIC, // UNIT_FIELD_BOUNDINGRADIUS + UF_FLAG_PUBLIC, // UNIT_FIELD_COMBATREACH + UF_FLAG_PUBLIC, // UNIT_FIELD_DISPLAYID + UF_FLAG_PUBLIC, // UNIT_FIELD_NATIVEDISPLAYID + UF_FLAG_PUBLIC, // UNIT_FIELD_MOUNTDISPLAYID + UF_FLAG_PRIVATE | UF_FLAG_OWNER | UF_FLAG_SPECIAL_INFO, // UNIT_FIELD_MINDAMAGE + UF_FLAG_PRIVATE | UF_FLAG_OWNER | UF_FLAG_SPECIAL_INFO, // UNIT_FIELD_MAXDAMAGE + UF_FLAG_PRIVATE | UF_FLAG_OWNER | UF_FLAG_SPECIAL_INFO, // UNIT_FIELD_MINOFFHANDDAMAGE + UF_FLAG_PRIVATE | UF_FLAG_OWNER | UF_FLAG_SPECIAL_INFO, // UNIT_FIELD_MAXOFFHANDDAMAGE + UF_FLAG_PUBLIC, // UNIT_FIELD_BYTES_1 + UF_FLAG_PUBLIC, // UNIT_FIELD_PETNUMBER + UF_FLAG_PUBLIC, // UNIT_FIELD_PET_NAME_TIMESTAMP + UF_FLAG_OWNER, // UNIT_FIELD_PETEXPERIENCE + UF_FLAG_OWNER, // UNIT_FIELD_PETNEXTLEVELEXP + UF_FLAG_DYNAMIC, // UNIT_DYNAMIC_FLAGS + UF_FLAG_PUBLIC, // UNIT_MOD_CAST_SPEED + UF_FLAG_PUBLIC, // UNIT_CREATED_BY_SPELL + UF_FLAG_DYNAMIC, // UNIT_NPC_FLAGS + UF_FLAG_PUBLIC, // UNIT_NPC_EMOTESTATE + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_STAT0 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_STAT1 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_STAT2 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_STAT3 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_STAT4 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POSSTAT0 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POSSTAT1 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POSSTAT2 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POSSTAT3 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POSSTAT4 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_NEGSTAT0 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_NEGSTAT1 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_NEGSTAT2 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_NEGSTAT3 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_NEGSTAT4 + UF_FLAG_PRIVATE | UF_FLAG_OWNER | UF_FLAG_SPECIAL_INFO, // UNIT_FIELD_RESISTANCES + UF_FLAG_PRIVATE | UF_FLAG_OWNER | UF_FLAG_SPECIAL_INFO, // UNIT_FIELD_RESISTANCES+1 + UF_FLAG_PRIVATE | UF_FLAG_OWNER | UF_FLAG_SPECIAL_INFO, // UNIT_FIELD_RESISTANCES+2 + UF_FLAG_PRIVATE | UF_FLAG_OWNER | UF_FLAG_SPECIAL_INFO, // UNIT_FIELD_RESISTANCES+3 + UF_FLAG_PRIVATE | UF_FLAG_OWNER | UF_FLAG_SPECIAL_INFO, // UNIT_FIELD_RESISTANCES+4 + UF_FLAG_PRIVATE | UF_FLAG_OWNER | UF_FLAG_SPECIAL_INFO, // UNIT_FIELD_RESISTANCES+5 + UF_FLAG_PRIVATE | UF_FLAG_OWNER | UF_FLAG_SPECIAL_INFO, // UNIT_FIELD_RESISTANCES+6 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE+1 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE+2 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE+3 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE+4 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE+5 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE+6 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE+1 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE+2 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE+3 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE+4 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE+5 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE+6 + UF_FLAG_PUBLIC, // UNIT_FIELD_BASE_MANA + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_BASE_HEALTH + UF_FLAG_PUBLIC, // UNIT_FIELD_BYTES_2 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_ATTACK_POWER + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_ATTACK_POWER_MODS + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_ATTACK_POWER_MULTIPLIER + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RANGED_ATTACK_POWER + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RANGED_ATTACK_POWER_MODS + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_MINRANGEDDAMAGE + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_MAXRANGEDDAMAGE + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_COST_MODIFIER + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_COST_MODIFIER+1 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_COST_MODIFIER+2 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_COST_MODIFIER+3 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_COST_MODIFIER+4 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_COST_MODIFIER+5 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_COST_MODIFIER+6 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_COST_MULTIPLIER + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_COST_MULTIPLIER+1 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_COST_MULTIPLIER+2 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_COST_MULTIPLIER+3 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_COST_MULTIPLIER+4 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_COST_MULTIPLIER+5 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_POWER_COST_MULTIPLIER+6 + UF_FLAG_PRIVATE | UF_FLAG_OWNER, // UNIT_FIELD_MAXHEALTHMODIFIER + UF_FLAG_PUBLIC, // UNIT_FIELD_HOVERHEIGHT + UF_FLAG_NONE, // UNIT_FIELD_PADDING + UF_FLAG_PUBLIC, // PLAYER_DUEL_ARBITER + UF_FLAG_PUBLIC, // PLAYER_DUEL_ARBITER+1 + UF_FLAG_PUBLIC, // PLAYER_FLAGS + UF_FLAG_PUBLIC, // PLAYER_GUILDID + UF_FLAG_PUBLIC, // PLAYER_GUILDRANK + UF_FLAG_PUBLIC, // PLAYER_BYTES + UF_FLAG_PUBLIC, // PLAYER_BYTES_2 + UF_FLAG_PUBLIC, // PLAYER_BYTES_3 + UF_FLAG_PUBLIC, // PLAYER_DUEL_TEAM + UF_FLAG_PUBLIC, // PLAYER_GUILD_TIMESTAMP + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_1_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_1_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_1_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_1_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_1_4 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_2_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_2_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_2_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_2_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_2_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_3_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_3_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_3_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_3_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_3_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_4_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_4_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_4_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_4_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_4_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_5_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_5_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_5_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_5_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_5_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_6_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_6_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_6_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_6_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_6_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_7_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_7_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_7_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_7_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_7_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_8_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_8_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_8_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_8_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_8_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_9_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_9_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_9_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_9_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_9_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_10_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_10_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_10_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_10_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_10_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_11_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_11_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_11_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_11_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_11_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_12_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_12_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_12_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_12_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_12_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_13_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_13_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_13_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_13_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_13_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_14_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_14_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_14_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_14_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_14_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_15_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_15_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_15_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_15_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_15_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_16_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_16_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_16_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_16_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_16_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_17_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_17_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_17_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_17_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_17_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_18_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_18_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_18_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_18_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_18_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_19_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_19_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_19_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_19_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_19_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_20_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_20_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_20_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_20_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_20_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_21_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_21_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_21_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_21_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_21_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_22_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_22_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_22_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_22_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_22_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_23_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_23_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_23_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_23_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_23_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_24_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_24_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_24_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_24_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_24_5 + UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG_25_1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_25_2 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_25_3 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_25_3+1 + UF_FLAG_PRIVATE, // PLAYER_QUEST_LOG_25_5 + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_1_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_2_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_2_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_3_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_3_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_4_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_4_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_5_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_5_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_6_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_6_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_7_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_7_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_8_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_8_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_9_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_9_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_10_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_10_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_11_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_11_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_12_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_12_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_13_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_13_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_14_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_14_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_15_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_15_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_16_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_16_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_17_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_17_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_18_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_18_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_19_ENTRYID + UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM_19_ENCHANTMENT + UF_FLAG_PUBLIC, // PLAYER_CHOSEN_TITLE + UF_FLAG_PUBLIC, // PLAYER_FAKE_INEBRIATION + UF_FLAG_NONE, // PLAYER_FIELD_PAD_0 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+4 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+5 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+6 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+7 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+8 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+9 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+10 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+11 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+12 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+13 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+14 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+15 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+16 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+17 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+18 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+19 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+20 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+21 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+22 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+23 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+24 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+25 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+26 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+27 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+28 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+29 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+30 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+31 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+32 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+33 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+34 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+35 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+36 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+37 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+38 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+39 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+40 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+41 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+42 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+43 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+44 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+45 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+4 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+5 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+6 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+7 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+8 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+9 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+10 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+11 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+12 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+13 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+14 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+15 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+16 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+17 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+18 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+19 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+20 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+21 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+22 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+23 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+24 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+25 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+26 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+27 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+28 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+29 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+30 + UF_FLAG_PRIVATE, // PLAYER_FIELD_PACK_SLOT_1+31 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+4 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+5 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+6 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+7 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+8 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+9 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+10 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+11 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+12 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+13 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+14 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+15 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+16 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+17 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+18 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+19 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+20 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+21 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+22 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+23 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+24 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+25 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+26 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+27 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+28 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+29 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+30 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+31 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+32 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+33 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+34 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+35 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+36 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+37 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+38 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+39 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+40 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+41 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+42 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+43 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+44 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+45 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+46 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+47 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+48 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+49 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+50 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+51 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+52 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+53 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+54 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANK_SLOT_1+55 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANKBAG_SLOT_1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANKBAG_SLOT_1+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANKBAG_SLOT_1+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANKBAG_SLOT_1+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANKBAG_SLOT_1+4 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANKBAG_SLOT_1+5 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANKBAG_SLOT_1+6 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANKBAG_SLOT_1+7 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANKBAG_SLOT_1+8 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANKBAG_SLOT_1+9 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANKBAG_SLOT_1+10 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANKBAG_SLOT_1+11 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANKBAG_SLOT_1+12 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BANKBAG_SLOT_1+13 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+4 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+5 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+6 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+7 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+8 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+9 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+10 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+11 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+12 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+13 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+14 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+15 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+16 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+17 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+18 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+19 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+20 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+21 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+22 + UF_FLAG_PRIVATE, // PLAYER_FIELD_VENDORBUYBACK_SLOT_1+23 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+4 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+5 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+6 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+7 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+8 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+9 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+10 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+11 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+12 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+13 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+14 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+15 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+16 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+17 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+18 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+19 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+20 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+21 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+22 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+23 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+24 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+25 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+26 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+27 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+28 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+29 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+30 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+31 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+32 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+33 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+34 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+35 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+36 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+37 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+38 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+39 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+40 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+41 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+42 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+43 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+44 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+45 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+46 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+47 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+48 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+49 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+50 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+51 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+52 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+53 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+54 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+55 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+56 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+57 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+58 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+59 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+60 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+61 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+62 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KEYRING_SLOT_1+63 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+4 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+5 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+6 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+7 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+8 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+9 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+10 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+11 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+12 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+13 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+14 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+15 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+16 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+17 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+18 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+19 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+20 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+21 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+22 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+23 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+24 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+25 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+26 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+27 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+28 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+29 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+30 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+31 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+32 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+33 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+34 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+35 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+36 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+37 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+38 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+39 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+40 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+41 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+42 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+43 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+44 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+45 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+46 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+47 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+48 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+49 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+50 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+51 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+52 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+53 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+54 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+55 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+56 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+57 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+58 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+59 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+60 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+61 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+62 + UF_FLAG_PRIVATE, // PLAYER_FIELD_CURRENCYTOKEN_SLOT_1+63 + UF_FLAG_PRIVATE, // PLAYER_FARSIGHT + UF_FLAG_PRIVATE, // PLAYER_FARSIGHT+1 + UF_FLAG_PRIVATE, // PLAYER__FIELD_KNOWN_TITLES + UF_FLAG_PRIVATE, // PLAYER__FIELD_KNOWN_TITLES+1 + UF_FLAG_PRIVATE, // PLAYER__FIELD_KNOWN_TITLES1 + UF_FLAG_PRIVATE, // PLAYER__FIELD_KNOWN_TITLES1+1 + UF_FLAG_PRIVATE, // PLAYER__FIELD_KNOWN_TITLES2 + UF_FLAG_PRIVATE, // PLAYER__FIELD_KNOWN_TITLES2+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KNOWN_CURRENCIES + UF_FLAG_PRIVATE, // PLAYER_FIELD_KNOWN_CURRENCIES+1 + UF_FLAG_PRIVATE, // PLAYER_XP + UF_FLAG_PRIVATE, // PLAYER_NEXT_LEVEL_XP + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+1 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+2 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+3 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+4 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+5 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+6 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+7 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+8 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+9 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+10 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+11 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+12 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+13 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+14 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+15 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+16 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+17 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+18 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+19 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+20 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+21 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+22 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+23 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+24 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+25 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+26 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+27 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+28 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+29 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+30 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+31 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+32 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+33 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+34 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+35 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+36 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+37 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+38 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+39 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+40 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+41 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+42 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+43 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+44 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+45 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+46 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+47 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+48 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+49 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+50 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+51 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+52 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+53 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+54 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+55 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+56 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+57 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+58 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+59 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+60 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+61 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+62 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+63 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+64 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+65 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+66 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+67 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+68 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+69 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+70 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+71 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+72 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+73 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+74 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+75 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+76 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+77 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+78 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+79 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+80 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+81 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+82 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+83 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+84 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+85 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+86 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+87 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+88 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+89 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+90 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+91 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+92 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+93 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+94 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+95 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+96 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+97 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+98 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+99 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+100 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+101 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+102 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+103 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+104 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+105 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+106 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+107 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+108 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+109 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+110 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+111 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+112 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+113 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+114 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+115 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+116 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+117 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+118 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+119 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+120 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+121 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+122 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+123 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+124 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+125 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+126 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+127 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+128 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+129 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+130 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+131 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+132 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+133 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+134 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+135 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+136 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+137 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+138 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+139 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+140 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+141 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+142 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+143 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+144 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+145 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+146 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+147 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+148 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+149 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+150 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+151 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+152 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+153 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+154 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+155 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+156 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+157 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+158 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+159 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+160 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+161 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+162 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+163 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+164 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+165 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+166 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+167 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+168 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+169 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+170 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+171 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+172 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+173 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+174 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+175 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+176 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+177 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+178 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+179 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+180 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+181 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+182 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+183 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+184 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+185 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+186 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+187 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+188 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+189 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+190 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+191 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+192 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+193 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+194 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+195 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+196 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+197 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+198 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+199 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+200 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+201 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+202 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+203 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+204 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+205 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+206 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+207 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+208 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+209 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+210 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+211 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+212 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+213 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+214 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+215 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+216 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+217 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+218 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+219 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+220 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+221 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+222 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+223 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+224 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+225 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+226 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+227 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+228 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+229 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+230 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+231 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+232 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+233 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+234 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+235 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+236 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+237 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+238 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+239 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+240 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+241 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+242 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+243 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+244 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+245 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+246 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+247 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+248 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+249 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+250 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+251 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+252 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+253 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+254 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+255 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+256 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+257 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+258 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+259 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+260 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+261 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+262 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+263 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+264 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+265 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+266 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+267 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+268 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+269 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+270 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+271 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+272 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+273 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+274 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+275 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+276 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+277 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+278 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+279 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+280 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+281 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+282 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+283 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+284 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+285 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+286 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+287 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+288 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+289 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+290 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+291 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+292 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+293 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+294 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+295 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+296 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+297 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+298 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+299 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+300 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+301 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+302 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+303 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+304 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+305 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+306 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+307 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+308 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+309 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+310 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+311 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+312 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+313 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+314 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+315 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+316 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+317 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+318 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+319 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+320 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+321 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+322 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+323 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+324 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+325 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+326 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+327 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+328 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+329 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+330 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+331 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+332 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+333 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+334 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+335 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+336 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+337 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+338 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+339 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+340 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+341 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+342 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+343 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+344 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+345 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+346 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+347 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+348 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+349 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+350 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+351 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+352 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+353 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+354 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+355 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+356 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+357 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+358 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+359 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+360 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+361 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+362 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+363 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+364 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+365 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+366 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+367 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+368 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+369 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+370 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+371 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+372 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+373 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+374 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+375 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+376 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+377 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+378 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+379 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+380 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+381 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+382 + UF_FLAG_PRIVATE, // PLAYER_SKILL_INFO_1_1+383 + UF_FLAG_PRIVATE, // PLAYER_CHARACTER_POINTS1 + UF_FLAG_PRIVATE, // PLAYER_CHARACTER_POINTS2 + UF_FLAG_PRIVATE, // PLAYER_TRACK_CREATURES + UF_FLAG_PRIVATE, // PLAYER_TRACK_RESOURCES + UF_FLAG_PRIVATE, // PLAYER_BLOCK_PERCENTAGE + UF_FLAG_PRIVATE, // PLAYER_DODGE_PERCENTAGE + UF_FLAG_PRIVATE, // PLAYER_PARRY_PERCENTAGE + UF_FLAG_PRIVATE, // PLAYER_EXPERTISE + UF_FLAG_PRIVATE, // PLAYER_OFFHAND_EXPERTISE + UF_FLAG_PRIVATE, // PLAYER_CRIT_PERCENTAGE + UF_FLAG_PRIVATE, // PLAYER_RANGED_CRIT_PERCENTAGE + UF_FLAG_PRIVATE, // PLAYER_OFFHAND_CRIT_PERCENTAGE + UF_FLAG_PRIVATE, // PLAYER_SPELL_CRIT_PERCENTAGE1 + UF_FLAG_PRIVATE, // PLAYER_SPELL_CRIT_PERCENTAGE1+1 + UF_FLAG_PRIVATE, // PLAYER_SPELL_CRIT_PERCENTAGE1+2 + UF_FLAG_PRIVATE, // PLAYER_SPELL_CRIT_PERCENTAGE1+3 + UF_FLAG_PRIVATE, // PLAYER_SPELL_CRIT_PERCENTAGE1+4 + UF_FLAG_PRIVATE, // PLAYER_SPELL_CRIT_PERCENTAGE1+5 + UF_FLAG_PRIVATE, // PLAYER_SPELL_CRIT_PERCENTAGE1+6 + UF_FLAG_PRIVATE, // PLAYER_SHIELD_BLOCK + UF_FLAG_PRIVATE, // PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+1 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+2 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+3 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+4 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+5 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+6 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+7 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+8 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+9 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+10 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+11 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+12 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+13 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+14 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+15 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+16 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+17 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+18 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+19 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+20 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+21 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+22 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+23 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+24 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+25 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+26 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+27 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+28 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+29 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+30 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+31 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+32 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+33 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+34 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+35 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+36 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+37 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+38 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+39 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+40 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+41 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+42 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+43 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+44 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+45 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+46 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+47 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+48 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+49 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+50 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+51 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+52 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+53 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+54 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+55 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+56 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+57 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+58 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+59 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+60 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+61 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+62 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+63 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+64 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+65 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+66 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+67 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+68 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+69 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+70 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+71 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+72 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+73 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+74 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+75 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+76 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+77 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+78 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+79 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+80 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+81 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+82 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+83 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+84 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+85 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+86 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+87 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+88 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+89 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+90 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+91 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+92 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+93 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+94 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+95 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+96 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+97 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+98 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+99 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+100 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+101 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+102 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+103 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+104 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+105 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+106 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+107 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+108 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+109 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+110 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+111 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+112 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+113 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+114 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+115 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+116 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+117 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+118 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+119 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+120 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+121 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+122 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+123 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+124 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+125 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+126 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+127 + UF_FLAG_PRIVATE, // PLAYER_REST_STATE_EXPERIENCE + UF_FLAG_PRIVATE, // PLAYER_FIELD_COINAGE + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_POS + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_POS+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_POS+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_POS+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_POS+4 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_POS+5 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_POS+6 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_NEG+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_NEG+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_NEG+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_NEG+4 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_NEG+5 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_NEG+6 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_PCT + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_PCT+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_PCT+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_PCT+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_PCT+4 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_PCT+5 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_PCT+6 + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_HEALING_DONE_POS + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_HEALING_PCT + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_HEALING_DONE_PCT + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_TARGET_RESISTANCE + UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE + UF_FLAG_PRIVATE, // PLAYER_FIELD_BYTES + UF_FLAG_PRIVATE, // PLAYER_AMMO_ID + UF_FLAG_PRIVATE, // PLAYER_SELF_RES_SPELL + UF_FLAG_PRIVATE, // PLAYER_FIELD_PVP_MEDALS + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_PRICE_1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_PRICE_1+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_PRICE_1+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_PRICE_1+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_PRICE_1+4 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_PRICE_1+5 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_PRICE_1+6 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_PRICE_1+7 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_PRICE_1+8 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_PRICE_1+9 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_PRICE_1+10 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_PRICE_1+11 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_TIMESTAMP_1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_TIMESTAMP_1+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_TIMESTAMP_1+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_TIMESTAMP_1+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_TIMESTAMP_1+4 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_TIMESTAMP_1+5 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_TIMESTAMP_1+6 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_TIMESTAMP_1+7 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_TIMESTAMP_1+8 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_TIMESTAMP_1+9 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_TIMESTAMP_1+10 + UF_FLAG_PRIVATE, // PLAYER_FIELD_BUYBACK_TIMESTAMP_1+11 + UF_FLAG_PRIVATE, // PLAYER_FIELD_KILLS + UF_FLAG_PRIVATE, // PLAYER_FIELD_TODAY_CONTRIBUTION + UF_FLAG_PRIVATE, // PLAYER_FIELD_YESTERDAY_CONTRIBUTION + UF_FLAG_PRIVATE, // PLAYER_FIELD_LIFETIME_HONORBALE_KILLS + UF_FLAG_PRIVATE, // PLAYER_FIELD_BYTES2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_WATCHED_FACTION_INDEX + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+4 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+5 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+6 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+7 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+8 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+9 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+10 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+11 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+12 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+13 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+14 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+15 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+16 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+17 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+18 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+19 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+20 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+21 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+22 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+23 + UF_FLAG_PRIVATE, // PLAYER_FIELD_COMBAT_RATING_1+24 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+4 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+5 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+6 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+7 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+8 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+9 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+10 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+11 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+12 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+13 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+14 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+15 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+16 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+17 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+18 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+19 + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+20 + UF_FLAG_PRIVATE, // PLAYER_FIELD_HONOR_CURRENCY + UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_CURRENCY + UF_FLAG_PRIVATE, // PLAYER_FIELD_MAX_LEVEL + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+4 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+5 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+6 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+7 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+8 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+9 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+10 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+11 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+12 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+13 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+14 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+15 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+16 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+17 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+18 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+19 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+20 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+21 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+22 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+23 + UF_FLAG_PRIVATE, // PLAYER_FIELD_DAILY_QUESTS_1+24 + UF_FLAG_PRIVATE, // PLAYER_RUNE_REGEN_1 + UF_FLAG_PRIVATE, // PLAYER_RUNE_REGEN_1+1 + UF_FLAG_PRIVATE, // PLAYER_RUNE_REGEN_1+2 + UF_FLAG_PRIVATE, // PLAYER_RUNE_REGEN_1+3 + UF_FLAG_PRIVATE, // PLAYER_NO_REAGENT_COST_1 + UF_FLAG_PRIVATE, // PLAYER_NO_REAGENT_COST_1+1 + UF_FLAG_PRIVATE, // PLAYER_NO_REAGENT_COST_1+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPH_SLOTS_1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPH_SLOTS_1+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPH_SLOTS_1+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPH_SLOTS_1+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPH_SLOTS_1+4 + UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPH_SLOTS_1+5 + UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPHS_1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPHS_1+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPHS_1+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPHS_1+3 + UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPHS_1+4 + UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPHS_1+5 + UF_FLAG_PRIVATE, // PLAYER_GLYPHS_ENABLED + UF_FLAG_PRIVATE, // PLAYER_PET_SPELL_POWER +}; + +uint32 GameObjectUpdateFieldFlags[GAMEOBJECT_END] = +{ + UF_FLAG_PUBLIC, // OBJECT_FIELD_GUID + UF_FLAG_PUBLIC, // OBJECT_FIELD_GUID+1 + UF_FLAG_PUBLIC, // OBJECT_FIELD_TYPE + UF_FLAG_PUBLIC, // OBJECT_FIELD_ENTRY + UF_FLAG_PUBLIC, // OBJECT_FIELD_SCALE_X + UF_FLAG_NONE, // OBJECT_FIELD_PADDING + UF_FLAG_PUBLIC, // OBJECT_FIELD_CREATED_BY + UF_FLAG_PUBLIC, // OBJECT_FIELD_CREATED_BY+1 + UF_FLAG_PUBLIC, // GAMEOBJECT_DISPLAYID + UF_FLAG_PUBLIC, // GAMEOBJECT_FLAGS + UF_FLAG_PUBLIC, // GAMEOBJECT_PARENTROTATION + UF_FLAG_PUBLIC, // GAMEOBJECT_PARENTROTATION+1 + UF_FLAG_PUBLIC, // GAMEOBJECT_PARENTROTATION+2 + UF_FLAG_PUBLIC, // GAMEOBJECT_PARENTROTATION+3 + UF_FLAG_DYNAMIC, // GAMEOBJECT_DYNAMIC + UF_FLAG_PUBLIC, // GAMEOBJECT_FACTION + UF_FLAG_PUBLIC, // GAMEOBJECT_LEVEL + UF_FLAG_PUBLIC, // GAMEOBJECT_BYTES_1 +}; + +uint32 DynamicObjectUpdateFieldFlags[DYNAMICOBJECT_END] = +{ + UF_FLAG_PUBLIC, // OBJECT_FIELD_GUID + UF_FLAG_PUBLIC, // OBJECT_FIELD_GUID+1 + UF_FLAG_PUBLIC, // OBJECT_FIELD_TYPE + UF_FLAG_PUBLIC, // OBJECT_FIELD_ENTRY + UF_FLAG_PUBLIC, // OBJECT_FIELD_SCALE_X + UF_FLAG_NONE, // OBJECT_FIELD_PADDING + UF_FLAG_PUBLIC, // DYNAMICOBJECT_CASTER + UF_FLAG_PUBLIC, // DYNAMICOBJECT_CASTER+1 + UF_FLAG_PUBLIC, // DYNAMICOBJECT_BYTES + UF_FLAG_PUBLIC, // DYNAMICOBJECT_SPELLID + UF_FLAG_PUBLIC, // DYNAMICOBJECT_RADIUS + UF_FLAG_PUBLIC, // DYNAMICOBJECT_CASTTIME +}; + +uint32 CorpseUpdateFieldFlags[CORPSE_END] = +{ + UF_FLAG_PUBLIC, // OBJECT_FIELD_GUID + UF_FLAG_PUBLIC, // OBJECT_FIELD_GUID+1 + UF_FLAG_PUBLIC, // OBJECT_FIELD_TYPE + UF_FLAG_PUBLIC, // OBJECT_FIELD_ENTRY + UF_FLAG_PUBLIC, // OBJECT_FIELD_SCALE_X + UF_FLAG_NONE, // OBJECT_FIELD_PADDING + UF_FLAG_PUBLIC, // CORPSE_FIELD_OWNER + UF_FLAG_PUBLIC, // CORPSE_FIELD_OWNER+1 + UF_FLAG_PUBLIC, // CORPSE_FIELD_PARTY + UF_FLAG_PUBLIC, // CORPSE_FIELD_PARTY+1 + UF_FLAG_PUBLIC, // CORPSE_FIELD_DISPLAY_ID + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+1 + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+2 + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+3 + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+4 + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+5 + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+6 + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+7 + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+8 + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+9 + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+10 + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+11 + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+12 + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+13 + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+14 + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+15 + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+16 + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+17 + UF_FLAG_PUBLIC, // CORPSE_FIELD_ITEM+18 + UF_FLAG_PUBLIC, // CORPSE_FIELD_BYTES_1 + UF_FLAG_PUBLIC, // CORPSE_FIELD_BYTES_2 + UF_FLAG_PUBLIC, // CORPSE_FIELD_GUILD + UF_FLAG_PUBLIC, // CORPSE_FIELD_FLAGS + UF_FLAG_DYNAMIC, // CORPSE_FIELD_DYNAMIC_FLAGS + UF_FLAG_NONE, // CORPSE_FIELD_PAD +}; diff --git a/src/server/game/Entities/Object/Updates/UpdateFieldFlags.h b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.h new file mode 100644 index 00000000000..71b3f0cd4aa --- /dev/null +++ b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/> + * + * This program 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 2 of the License, or (at your + * option) any later version. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef _UPDATEFIELDFLAGS_H +#define _UPDATEFIELDFLAGS_H + +#include "UpdateFields.h" +#include "Define.h" + +enum UpdatefieldFlags +{ + UF_FLAG_NONE = 0x000, + UF_FLAG_PUBLIC = 0x001, + UF_FLAG_PRIVATE = 0x002, + UF_FLAG_OWNER = 0x004, + UF_FLAG_UNUSED1 = 0x008, + UF_FLAG_ITEM_OWNER = 0x010, + UF_FLAG_SPECIAL_INFO = 0x020, + UF_FLAG_PARTY_MEMBER = 0x040, + UF_FLAG_UNUSED2 = 0x080, + UF_FLAG_DYNAMIC = 0x100, +}; + +extern uint32 ItemUpdateFieldFlags[CONTAINER_END]; +extern uint32 UnitUpdateFieldFlags[PLAYER_END]; +extern uint32 GameObjectUpdateFieldFlags[GAMEOBJECT_END]; +extern uint32 DynamicObjectUpdateFieldFlags[DYNAMICOBJECT_END]; +extern uint32 CorpseUpdateFieldFlags[CORPSE_END]; + +#endif // _UPDATEFIELDFLAGS_H diff --git a/src/server/game/Entities/Object/Updates/UpdateMask.h b/src/server/game/Entities/Object/Updates/UpdateMask.h index d4ecd42819c..ad70936b81d 100755 --- a/src/server/game/Entities/Object/Updates/UpdateMask.h +++ b/src/server/game/Entities/Object/Updates/UpdateMask.h @@ -26,26 +26,26 @@ class UpdateMask { public: UpdateMask() : mCount(0), mBlocks(0), mUpdateMask(0) { } - UpdateMask(const UpdateMask& mask) : mUpdateMask(0) { *this = mask; } + UpdateMask(UpdateMask const& mask) : mUpdateMask(0) { *this = mask; } ~UpdateMask() { - delete [] mUpdateMask; + delete[] mUpdateMask; } - void SetBit (uint32 index) + void SetBit(uint32 index) { - ((uint8 *)mUpdateMask)[ index >> 3 ] |= 1 << (index & 0x7); + ((uint8*)mUpdateMask)[index >> 3] |= 1 << (index & 0x7); } - void UnsetBit (uint32 index) + void UnsetBit(uint32 index) { - ((uint8 *)mUpdateMask)[ index >> 3 ] &= (0xff ^ (1 << (index & 0x7))); + ((uint8*)mUpdateMask)[index >> 3] &= (0xff ^ (1 << (index & 0x7))); } - bool GetBit (uint32 index) const + bool GetBit(uint32 index) const { - return (((uint8 *)mUpdateMask)[ index >> 3 ] & (1 << (index & 0x7))) != 0; + return (((uint8*)mUpdateMask)[index >> 3] & (1 << (index & 0x7))) != 0; } uint32 GetBlockCount() const { return mBlocks; } @@ -70,7 +70,7 @@ class UpdateMask memset(mUpdateMask, 0, mBlocks << 2); } - UpdateMask& operator = (const UpdateMask& mask) + UpdateMask& operator=(UpdateMask const& mask) { if (this == &mask) return *this; @@ -81,21 +81,21 @@ class UpdateMask return *this; } - void operator &= (const UpdateMask& mask) + void operator&=(UpdateMask const& mask) { ASSERT(mask.mCount <= mCount); for (uint32 i = 0; i < mBlocks; ++i) mUpdateMask[i] &= mask.mUpdateMask[i]; } - void operator |= (const UpdateMask& mask) + void operator|=(UpdateMask const& mask) { ASSERT(mask.mCount <= mCount); for (uint32 i = 0; i < mBlocks; ++i) mUpdateMask[i] |= mask.mUpdateMask[i]; } - UpdateMask operator & (const UpdateMask& mask) const + UpdateMask operator&(UpdateMask const& mask) const { ASSERT(mask.mCount <= mCount); @@ -106,7 +106,7 @@ class UpdateMask return newmask; } - UpdateMask operator | (const UpdateMask& mask) const + UpdateMask operator|(UpdateMask const& mask) const { ASSERT(mask.mCount <= mCount); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 5e227e43a42..3b51411b168 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -630,8 +630,6 @@ void KillRewarder::Reward() // == Player ==================================================== -UpdateMask Player::updateVisualBits; - // we can disable this warning for this since it only // causes undefined behavior when passed to the base class constructor #ifdef _MSC_VER @@ -4492,119 +4490,6 @@ Mail* Player::GetMail(uint32 id) return NULL; } -void Player::_SetCreateBits(UpdateMask* updateMask, Player* target) const -{ - if (target == this) - Object::_SetCreateBits(updateMask, target); - else - { - for (uint16 index = 0; index < m_valuesCount; index++) - if (GetUInt32Value(index) != 0 && updateVisualBits.GetBit(index)) - updateMask->SetBit(index); - } -} - -void Player::_SetUpdateBits(UpdateMask* updateMask, Player* target) const -{ - if (target == this) - Object::_SetUpdateBits(updateMask, target); - else - { - Object::_SetUpdateBits(updateMask, target); - *updateMask &= updateVisualBits; - } -} - -void Player::InitVisibleBits() -{ - updateVisualBits.SetCount(PLAYER_END); - - updateVisualBits.SetBit(OBJECT_FIELD_GUID); - updateVisualBits.SetBit(OBJECT_FIELD_TYPE); - updateVisualBits.SetBit(OBJECT_FIELD_ENTRY); - updateVisualBits.SetBit(OBJECT_FIELD_SCALE_X); - updateVisualBits.SetBit(UNIT_FIELD_CHARM + 0); - updateVisualBits.SetBit(UNIT_FIELD_CHARM + 1); - updateVisualBits.SetBit(UNIT_FIELD_SUMMON + 0); - updateVisualBits.SetBit(UNIT_FIELD_SUMMON + 1); - updateVisualBits.SetBit(UNIT_FIELD_CHARMEDBY + 0); - updateVisualBits.SetBit(UNIT_FIELD_CHARMEDBY + 1); - updateVisualBits.SetBit(UNIT_FIELD_TARGET + 0); - updateVisualBits.SetBit(UNIT_FIELD_TARGET + 1); - updateVisualBits.SetBit(UNIT_FIELD_CHANNEL_OBJECT + 0); - updateVisualBits.SetBit(UNIT_FIELD_CHANNEL_OBJECT + 1); - updateVisualBits.SetBit(UNIT_FIELD_BYTES_0); - updateVisualBits.SetBit(UNIT_FIELD_HEALTH); - updateVisualBits.SetBit(UNIT_FIELD_POWER1); - updateVisualBits.SetBit(UNIT_FIELD_POWER2); - updateVisualBits.SetBit(UNIT_FIELD_POWER3); - updateVisualBits.SetBit(UNIT_FIELD_POWER4); - updateVisualBits.SetBit(UNIT_FIELD_POWER5); - updateVisualBits.SetBit(UNIT_FIELD_POWER6); - updateVisualBits.SetBit(UNIT_FIELD_POWER7); - updateVisualBits.SetBit(UNIT_FIELD_MAXHEALTH); - updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER1); - updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER2); - updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER3); - updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER4); - updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER5); - updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER6); - updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER7); - updateVisualBits.SetBit(UNIT_FIELD_LEVEL); - updateVisualBits.SetBit(UNIT_FIELD_FACTIONTEMPLATE); - updateVisualBits.SetBit(UNIT_VIRTUAL_ITEM_SLOT_ID + 0); - updateVisualBits.SetBit(UNIT_VIRTUAL_ITEM_SLOT_ID + 1); - updateVisualBits.SetBit(UNIT_VIRTUAL_ITEM_SLOT_ID + 2); - updateVisualBits.SetBit(UNIT_FIELD_FLAGS); - updateVisualBits.SetBit(UNIT_FIELD_FLAGS_2); - updateVisualBits.SetBit(UNIT_FIELD_AURASTATE); - updateVisualBits.SetBit(UNIT_FIELD_BASEATTACKTIME + 0); - updateVisualBits.SetBit(UNIT_FIELD_BASEATTACKTIME + 1); - updateVisualBits.SetBit(UNIT_FIELD_BOUNDINGRADIUS); - updateVisualBits.SetBit(UNIT_FIELD_COMBATREACH); - updateVisualBits.SetBit(UNIT_FIELD_DISPLAYID); - updateVisualBits.SetBit(UNIT_FIELD_NATIVEDISPLAYID); - updateVisualBits.SetBit(UNIT_FIELD_MOUNTDISPLAYID); - updateVisualBits.SetBit(UNIT_FIELD_BYTES_1); - updateVisualBits.SetBit(UNIT_FIELD_PETNUMBER); - updateVisualBits.SetBit(UNIT_FIELD_PET_NAME_TIMESTAMP); - updateVisualBits.SetBit(UNIT_DYNAMIC_FLAGS); - updateVisualBits.SetBit(UNIT_CHANNEL_SPELL); - updateVisualBits.SetBit(UNIT_MOD_CAST_SPEED); - updateVisualBits.SetBit(UNIT_FIELD_BASE_MANA); - updateVisualBits.SetBit(UNIT_FIELD_BYTES_2); - updateVisualBits.SetBit(UNIT_FIELD_HOVERHEIGHT); - - updateVisualBits.SetBit(PLAYER_DUEL_ARBITER + 0); - updateVisualBits.SetBit(PLAYER_DUEL_ARBITER + 1); - updateVisualBits.SetBit(PLAYER_FLAGS); - updateVisualBits.SetBit(PLAYER_GUILDID); - updateVisualBits.SetBit(PLAYER_GUILDRANK); - updateVisualBits.SetBit(PLAYER_BYTES); - updateVisualBits.SetBit(PLAYER_BYTES_2); - updateVisualBits.SetBit(PLAYER_BYTES_3); - updateVisualBits.SetBit(PLAYER_DUEL_TEAM); - updateVisualBits.SetBit(PLAYER_GUILD_TIMESTAMP); - updateVisualBits.SetBit(UNIT_NPC_FLAGS); - - // PLAYER_QUEST_LOG_x also visible bit on official (but only on party/raid)... - for (uint16 i = PLAYER_QUEST_LOG_1_1; i < PLAYER_QUEST_LOG_25_2; i += MAX_QUEST_OFFSET) - updateVisualBits.SetBit(i); - - // Players visible items are not inventory stuff - for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) - { - uint16 offset = i * 2; - - // item entry - updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_ENTRYID + offset); - // enchant - updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + offset); - } - - updateVisualBits.SetBit(PLAYER_CHOSEN_TITLE); -} - void Player::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const { for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) @@ -9259,6 +9144,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid) case 1519: // Stormwind City case 1537: // Ironforge case 2257: // Deeprun Tram + case 3703: // Shattrath City break; case 139: // Eastern Plaguelands if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_EP) @@ -9665,7 +9551,6 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid) data << uint32(3610) << uint32(0x0); // 9 show } break; - case 3703: // Shattrath City case 4384: // Strand of the Ancients if (bg && bg->GetTypeID(true) == BATTLEGROUND_SA) bg->FillInitialWorldStates(data); @@ -17217,7 +17102,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) SetUInt32Value(UNIT_CHANNEL_SPELL, 0); // clear charm/summon related fields - SetUInt64Value(UNIT_FIELD_SUMMONEDBY, 0); + SetOwnerGUID(0); SetUInt64Value(UNIT_FIELD_CHARMEDBY, 0); SetUInt64Value(UNIT_FIELD_CHARM, 0); SetUInt64Value(UNIT_FIELD_SUMMON, 0); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index b1e4e81900d..774e75104b1 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1069,9 +1069,6 @@ class Player : public Unit, public GridObject<Player> void CleanupsBeforeDelete(bool finalCleanup = true); - static UpdateMask updateVisualBits; - static void InitVisibleBits(); - void AddToWorld(); void RemoveFromWorld(); @@ -2620,9 +2617,6 @@ class Player : public Unit, public GridObject<Player> void _SaveStats(SQLTransaction& trans); void _SaveInstanceTimeRestrictions(SQLTransaction& trans); - void _SetCreateBits(UpdateMask* updateMask, Player* target) const; - void _SetUpdateBits(UpdateMask* updateMask, Player* target) const; - /*********************************************************/ /*** ENVIRONMENTAL SYSTEM ***/ /*********************************************************/ diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index c68f55c87af..6158e08b859 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -56,6 +56,7 @@ #include "MoveSplineInit.h" #include "MoveSpline.h" #include "ConditionMgr.h" +#include "UpdateFieldFlags.h" #include <math.h> @@ -6423,7 +6424,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Effect 0 - mod damage while having Enrage if (effIndex == 0) { - if (!(procSpell->SpellFamilyFlags[0] & 0x00080000) || procSpell->SpellIconID != 916) + if (!(procSpell->SpellFamilyFlags[0] & 0x00080000) || procSpell->SpellIconID != 961) return false; triggered_spell_id = 51185; basepoints0 = triggerAmount; @@ -9658,6 +9659,31 @@ bool Unit::HasAuraState(AuraStateType flag, SpellInfo const* spellProto, Unit co return HasFlag(UNIT_FIELD_AURASTATE, 1<<(flag-1)); } +void Unit::SetOwnerGUID(uint64 owner) +{ + if (GetOwnerGUID() == owner) + return; + + SetUInt64Value(UNIT_FIELD_SUMMONEDBY, owner); + if (!owner) + return; + + // Update owner dependent fields + Player* player = ObjectAccessor::GetPlayer(*this, owner); + if (!player || !player->HaveAtClient(this)) // if player cannot see this unit yet, he will receive needed data with create object + return; + + SetFieldNotifyFlag(UF_FLAG_OWNER); + + UpdateData udata; + WorldPacket packet; + BuildValuesUpdateBlockForPlayer(&udata, player); + udata.BuildPacket(&packet); + player->SendDirectMessage(&packet); + + RemoveFieldNotifyFlag(UF_FLAG_OWNER); +} + Unit* Unit::GetOwner() const { if (uint64 ownerid = GetOwnerGUID()) @@ -9743,12 +9769,14 @@ void Unit::SetMinion(Minion *minion, bool apply) if (apply) { - if (!minion->AddUInt64Value(UNIT_FIELD_SUMMONEDBY, GetGUID())) + if (minion->GetOwnerGUID()) { sLog->outCrash("SetMinion: Minion %u is not the minion of owner %u", minion->GetEntry(), GetEntry()); return; } + minion->SetOwnerGUID(GetGUID()); + m_Controlled.insert(minion); if (GetTypeId() == TYPEID_PLAYER) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 2855b93b0d7..46dbf4829a6 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -963,24 +963,6 @@ struct SpellPeriodicAuraLogInfo uint32 createProcExtendMask(SpellNonMeleeDamage* damageInfo, SpellMissInfo missCondition); -enum UnitAnimationState -{ - ANIMATION_ON_GROUND = 0, - ANIMATION_SWIMMING = 1, - ANIMATION_HOVER = 2, - ANIMATION_FLYING = 3, -}; - -struct MonsterMoveData -{ - MonsterMoveData() : SplineFlag(0), AnimationState(ANIMATION_ON_GROUND), Time(0), SpeedZ(0.0f) {} - Position DestLocation; - uint32 SplineFlag; - UnitAnimationState AnimationState; // Only used with SPLINEFLAG_ANIMATIONTIER - uint32 Time; - float SpeedZ; // Only used with SPLINEFLAG_TRAJECTORY -}; - #define MAX_DECLINED_NAME_CASES 5 struct DeclinedName @@ -1656,6 +1638,7 @@ class Unit : public WorldObject virtual void setDeathState(DeathState s); // overwrited in Creature/Player/Pet uint64 GetOwnerGUID() const { return GetUInt64Value(UNIT_FIELD_SUMMONEDBY); } + void SetOwnerGUID(uint64 owner); uint64 GetCreatorGUID() const { return GetUInt64Value(UNIT_FIELD_CREATEDBY); } void SetCreatorGUID(uint64 creator) { SetUInt64Value(UNIT_FIELD_CREATEDBY, creator); } uint64 GetMinionGUID() const { return GetUInt64Value(UNIT_FIELD_SUMMON); } diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index f9d609150ef..428f0d25a8b 100755 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -34,6 +34,7 @@ #include "MapInstanced.h" #include "Util.h" #include "LFGMgr.h" +#include "UpdateFieldFlags.h" Roll::Roll(uint64 _guid, LootItem const& li) : itemGUID(_guid), itemid(li.itemid), itemRandomPropId(li.randomPropertyId), itemRandomSuffix(li.randomSuffix), itemCount(li.count), @@ -437,6 +438,47 @@ bool Group::AddMember(Player* player) if (isRaidGroup()) player->UpdateForQuestWorldObjects(); + { + // Broadcast new player group member fields to rest of the group + player->SetFieldNotifyFlag(UF_FLAG_PARTY_MEMBER); + + UpdateData groupData; + WorldPacket groupDataPacket; + + // Broadcast group members' fields to player + for (GroupReference* itr = GetFirstMember(); itr != NULL; itr = itr->next()) + { + if (itr->getSource() == player) + continue; + + if (Player* member = itr->getSource()) + { + if (player->HaveAtClient(member)) + { + member->SetFieldNotifyFlag(UF_FLAG_PARTY_MEMBER); + member->BuildValuesUpdateBlockForPlayer(&groupData, player); + member->RemoveFieldNotifyFlag(UF_FLAG_PARTY_MEMBER); + } + + if (member->HaveAtClient(player)) + { + UpdateData newData; + WorldPacket newDataPacket; + player->BuildValuesUpdateBlockForPlayer(&newData, member); + member->SendDirectMessage(&newDataPacket); + } + } + } + + if (groupData.HasData()) + { + groupData.BuildPacket(&groupDataPacket); + player->SendDirectMessage(&groupDataPacket); + } + + player->RemoveFieldNotifyFlag(UF_FLAG_PARTY_MEMBER); + } + if (m_maxEnchantingLevel < player->GetSkillValue(SKILL_ENCHANTING)) m_maxEnchantingLevel = player->GetSkillValue(SKILL_ENCHANTING); } diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index 3aee9ff0b00..7585af7eb60 100755 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -252,6 +252,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recv_data) AH->item_guidlow = item->GetGUIDLow(); AH->item_template = item->GetEntry(); + AH->itemCount = item->GetCount(); AH->owner = _player->GetGUIDLow(); AH->startbid = bid; AH->bidder = 0; @@ -297,6 +298,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recv_data) AH->item_guidlow = newItem->GetGUIDLow(); AH->item_template = newItem->GetEntry(); + AH->itemCount = newItem->GetCount(); AH->owner = _player->GetGUIDLow(); AH->startbid = bid; AH->bidder = 0; @@ -520,12 +522,9 @@ void WorldSession::HandleAuctionRemoveItem(WorldPacket & recv_data) sAuctionMgr->SendAuctionCancelledToBidderMail(auction, trans); player->ModifyMoney(-int32(auctionCut)); } - // Return the item by mail - std::ostringstream msgAuctionCanceledOwner; - msgAuctionCanceledOwner << auction->item_template << ":0:" << AUCTION_CANCELED << ":0:0"; // item will deleted or added to received mail list - MailDraft(msgAuctionCanceledOwner.str(), "") // TODO: fix body + MailDraft(auction->BuildAuctionMailSubject(AUCTION_CANCELED), AuctionEntry::BuildAuctionMailBody(0, 0, auction->buyout, auction->deposit, 0)) .AddItem(pItem) .SendMailTo(trans, player, auction, MAIL_CHECK_MASK_COPIED); } diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 18435263b2e..e6473d0e7d9 100755 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -84,7 +84,10 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket & recv_data) // restrict invite to GMs if (!sWorld->getBoolConfig(CONFIG_ALLOW_GM_GROUP) && !GetPlayer()->isGameMaster() && player->isGameMaster()) + { + SendPartyResult(PARTY_OP_INVITE, membername, ERR_BAD_PLAYER_NAME_S); return; + } // can't group with if (!GetPlayer()->isGameMaster() && !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && GetPlayer()->GetTeam() != player->GetTeam()) diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 4fb0ab2e9c1..69a84892e76 100755 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -573,8 +573,8 @@ void WorldSession::HandleGetMailList(WorldPacket & recv_data) for (PlayerMails::iterator itr = player->GetMailBegin(); itr != player->GetMailEnd(); ++itr) { - // packet send mail count as uint8, prevent overflow - if (mailsCount >= 254) + // Only first 50 mails are displayed + if (mailsCount >= 50) { realCount += 1; continue; @@ -586,7 +586,7 @@ void WorldSession::HandleGetMailList(WorldPacket & recv_data) uint8 item_count = (*itr)->items.size(); // max count is MAX_MAIL_ITEMS (12) - size_t next_mail_size = 2+4+1+((*itr)->messageType == MAIL_NORMAL ? 8 : 4)+4*8+((*itr)->subject.size()+1)+((*itr)->body.size()+1)+1+item_count*(1+4+4+7*3*4+4+4+4+4+4+4+1); + size_t next_mail_size = 2+4+1+((*itr)->messageType == MAIL_NORMAL ? 8 : 4)+4*8+((*itr)->subject.size()+1)+((*itr)->body.size()+1)+1+item_count*(1+4+4+MAX_INSPECTED_ENCHANTMENT_SLOT*3*4+4+4+4+4+4+4+1); if (data.wpos()+next_mail_size > maxPacketSize) { @@ -655,8 +655,8 @@ void WorldSession::HandleGetMailList(WorldPacket & recv_data) data << uint8(0); } - realCount += 1; - mailsCount += 1; + ++realCount; + ++mailsCount; } data.put<uint32>(0, realCount); // this will display warning about undelivered mail to player if realCount > mailsCount @@ -743,11 +743,12 @@ void WorldSession::HandleQueryNextMailTime(WorldPacket & /*recv_data*/) if (_player->unReadMails > 0) { - data << uint32(0); // float + data << float(0); // float data << uint32(0); // count uint32 count = 0; time_t now = time(NULL); + std::set<uint32> sentSenders; for (PlayerMails::iterator itr = _player->GetMailBegin(); itr != _player->GetMailEnd(); ++itr) { Mail* m = (*itr); @@ -759,36 +760,29 @@ void WorldSession::HandleQueryNextMailTime(WorldPacket & /*recv_data*/) if (now < m->deliver_time) continue; - if (m->messageType) - data << uint64(m->sender); // player guid - else - data << uint32(m->sender); // creature entry + // only send each mail sender once + if (sentSenders.count(m->sender)) + continue; - switch (m->messageType) - { - case MAIL_AUCTION: - data << uint32(2); - data << uint32(2); - data << uint32(m->stationery); - break; - default: - data << uint32(0); - data << uint32(0); - data << uint32(m->stationery); - break; - } - data << uint32(0xC6000000); // float unk, time or something + data << uint64(m->messageType == MAIL_NORMAL ? m->sender : 0); // player guid + data << uint32(m->messageType != MAIL_NORMAL ? m->sender : 0); // non-player entries + data << uint32(m->messageType); + data << uint32(m->stationery); + data << float(m->deliver_time - now); + sentSenders.insert(m->sender); ++count; if (count == 2) // do not display more than 2 mails break; } + data.put<uint32>(4, count); } else { - data << uint32(0xC7A8C000); - data << uint32(0x00000000); + data << float(-DAY); + data << uint32(0); } + SendPacket(&data); } diff --git a/src/server/game/Mails/Mail.h b/src/server/game/Mails/Mail.h index dbd03bd96ee..ea319c731d0 100755 --- a/src/server/game/Mails/Mail.h +++ b/src/server/game/Mails/Mail.h @@ -67,17 +67,6 @@ enum MailState MAIL_STATE_DELETED = 3 }; -enum MailAuctionAnswers -{ - AUCTION_OUTBIDDED = 0, - AUCTION_WON = 1, - AUCTION_SUCCESSFUL = 2, - AUCTION_EXPIRED = 3, - AUCTION_CANCELLED_TO_BIDDER = 4, - AUCTION_CANCELED = 5, - AUCTION_SALE_PENDING = 6 -}; - enum MailShowFlags { MAIL_SHOW_UNK0 = 0x0001, diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index bc0570bb73b..cde176443f0 100755 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -335,9 +335,17 @@ void MotionMaster::MoveKnockbackFrom(float srcX, float srcY, float speedXY, floa float x, y, z; float moveTimeHalf = speedZ / Movement::gravity; float dist = 2 * moveTimeHalf * speedXY; + float max_height = -Movement::computeFallElevation(moveTimeHalf,false,-speedZ); _owner->GetNearPoint(_owner, x, y, z, _owner->GetObjectSize(), dist, _owner->GetAngle(srcX, srcY) + M_PI); - MoveJump(x, y, z, speedXY, speedZ); + + Movement::MoveSplineInit init(*_owner); + init.MoveTo(x,y,z); + init.SetParabolic(max_height,0); + init.SetOrientationFixed(true); + init.SetVelocity(speedXY); + init.Launch(); + Mutate(new EffectMovementGenerator(0), MOTION_SLOT_CONTROLLED); } void MotionMaster::MoveJumpTo(float angle, float speedXY, float speedZ) diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index c95a1aa60d1..ed5b5638b4d 100755 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -60,6 +60,7 @@ void AddSC_instance_commandscript(); void AddSC_learn_commandscript(); void AddSC_list_commandscript(); void AddSC_lookup_commandscript(); +void AddSC_message_commandscript(); void AddSC_misc_commandscript(); void AddSC_modify_commandscript(); void AddSC_npc_commandscript(); @@ -68,6 +69,7 @@ void AddSC_reload_commandscript(); void AddSC_reset_commandscript(); void AddSC_server_commandscript(); void AddSC_tele_commandscript(); +void AddSC_ticket_commandscript(); void AddSC_titles_commandscript(); void AddSC_wp_commandscript(); @@ -671,6 +673,7 @@ void AddCommandScripts() AddSC_learn_commandscript(); AddSC_lookup_commandscript(); AddSC_list_commandscript(); + AddSC_message_commandscript(); AddSC_misc_commandscript(); AddSC_modify_commandscript(); AddSC_npc_commandscript(); @@ -679,6 +682,7 @@ void AddCommandScripts() AddSC_reset_commandscript(); AddSC_server_commandscript(); AddSC_tele_commandscript(); + AddSC_ticket_commandscript(); AddSC_titles_commandscript(); AddSC_wp_commandscript(); } diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 025ebb7275f..ed8c0324aac 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -3374,7 +3374,6 @@ void AuraEffect::HandleModStateImmunityMask(AuraApplication const* aurApp, uint8 target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_FREEZE, apply); target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_TURN, apply); aura_immunity_list.push_back(SPELL_AURA_MOD_STUN); - aura_immunity_list.push_back(SPELL_AURA_TRANSFORM); aura_immunity_list.push_back(SPELL_AURA_MOD_DECREASE_SPEED); aura_immunity_list.push_back(SPELL_AURA_MOD_ROOT); aura_immunity_list.push_back(SPELL_AURA_MOD_CONFUSE); @@ -3406,7 +3405,6 @@ void AuraEffect::HandleModStateImmunityMask(AuraApplication const* aurApp, uint8 target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_FREEZE, apply); target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_TURN, apply); aura_immunity_list.push_back(SPELL_AURA_MOD_STUN); - aura_immunity_list.push_back(SPELL_AURA_TRANSFORM); aura_immunity_list.push_back(SPELL_AURA_MOD_DECREASE_SPEED); aura_immunity_list.push_back(SPELL_AURA_MOD_ROOT); aura_immunity_list.push_back(SPELL_AURA_MOD_CONFUSE); @@ -3444,7 +3442,6 @@ void AuraEffect::HandleModStateImmunityMask(AuraApplication const* aurApp, uint8 target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_FREEZE, apply); target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_TURN, apply); aura_immunity_list.push_back(SPELL_AURA_MOD_STUN); - aura_immunity_list.push_back(SPELL_AURA_TRANSFORM); aura_immunity_list.push_back(SPELL_AURA_MOD_DECREASE_SPEED); aura_immunity_list.push_back(SPELL_AURA_MOD_ROOT); aura_immunity_list.push_back(SPELL_AURA_MOD_CONFUSE); @@ -3488,7 +3485,6 @@ void AuraEffect::HandleModStateImmunityMask(AuraApplication const* aurApp, uint8 target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_FREEZE, apply); target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_TURN, apply); aura_immunity_list.push_back(SPELL_AURA_MOD_STUN); - aura_immunity_list.push_back(SPELL_AURA_TRANSFORM); aura_immunity_list.push_back(SPELL_AURA_MOD_DECREASE_SPEED); aura_immunity_list.push_back(SPELL_AURA_MOD_ROOT); aura_immunity_list.push_back(SPELL_AURA_MOD_CONFUSE); @@ -3523,7 +3519,6 @@ void AuraEffect::HandleModStateImmunityMask(AuraApplication const* aurApp, uint8 target->ApplySpellImmune(GetId(), IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, apply); target->ApplySpellImmune(GetId(), IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, apply); aura_immunity_list.push_back(SPELL_AURA_MOD_STUN); - aura_immunity_list.push_back(SPELL_AURA_TRANSFORM); aura_immunity_list.push_back(SPELL_AURA_MOD_DECREASE_SPEED); aura_immunity_list.push_back(SPELL_AURA_MOD_ROOT); aura_immunity_list.push_back(SPELL_AURA_MOD_CONFUSE); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index dd674672935..c2d031a3a01 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2405,7 +2405,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex) if (properties->Category == SUMMON_CATEGORY_ALLY) { - summon->SetUInt64Value(UNIT_FIELD_SUMMONEDBY, m_originalCaster->GetGUID()); + summon->SetOwnerGUID(m_originalCaster->GetGUID()); summon->setFaction(m_originalCaster->getFaction()); summon->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id); } diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 3aee1dc429e..94e42f26dbd 100755 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1693,7 +1693,6 @@ void World::SetInitialWorldSettings() ///- Initilize static helper structures AIRegistry::Initialize(); - Player::InitVisibleBits(); ///- Initialize MapManager sLog->outString("Starting Map System"); diff --git a/src/server/scripts/Commands/CMakeLists.txt b/src/server/scripts/Commands/CMakeLists.txt index 915d94c420c..ca4a964ffb3 100644 --- a/src/server/scripts/Commands/CMakeLists.txt +++ b/src/server/scripts/Commands/CMakeLists.txt @@ -26,6 +26,7 @@ set(scripts_STAT_SRCS Commands/cs_learn.cpp Commands/cs_list.cpp Commands/cs_lookup.cpp + Commands/cs_message.cpp Commands/cs_misc.cpp Commands/cs_modify.cpp Commands/cs_npc.cpp @@ -33,13 +34,13 @@ set(scripts_STAT_SRCS Commands/cs_reload.cpp Commands/cs_reset.cpp Commands/cs_tele.cpp + Commands/cs_ticket.cpp Commands/cs_server.cpp Commands/cs_titles.cpp Commands/cs_wp.cpp # Commands/cs_pdump.cpp # Commands/cs_channel.cpp # Commands/cs_pet.cpp -# Commands/cs_ticket.cpp # Commands/cs_aura.cpp # Commands/cs_unaura.cpp # Commands/cs_nameannounce.cpp diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index a40b586f8c8..0aeee8f96fc 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -26,6 +26,7 @@ EndScriptData */ #include "Chat.h" #include "AccountMgr.h" #include "ObjectMgr.h" +#include "PlayerDump.h" class character_commandscript : public CommandScript { @@ -34,6 +35,12 @@ public: ChatCommand* GetCommands() const { + static ChatCommand pdumpCommandTable[] = + { + { "load", SEC_ADMINISTRATOR, true, &HandlePDumpLoadCommand, "", NULL }, + { "write", SEC_ADMINISTRATOR, true, &HandlePDumpWriteCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; static ChatCommand characterDeletedCommandTable[] = { { "delete", SEC_CONSOLE, true, &HandleCharacterDeletedDeleteCommand, "", NULL }, @@ -48,7 +55,7 @@ public: { "customize", SEC_GAMEMASTER, true, &HandleCharacterCustomizeCommand, "", NULL }, { "changefaction", SEC_GAMEMASTER, true, &HandleCharacterChangeFactionCommand, "", NULL }, { "changerace", SEC_GAMEMASTER, true, &HandleCharacterChangeRaceCommand, "", NULL }, - { "deleted", SEC_GAMEMASTER, true, NULL, "", characterDeletedCommandTable}, + { "deleted", SEC_GAMEMASTER, true, NULL, "", characterDeletedCommandTable }, { "erase", SEC_CONSOLE, true, &HandleCharacterEraseCommand, "", NULL }, { "level", SEC_ADMINISTRATOR, true, &HandleCharacterLevelCommand, "", NULL }, { "rename", SEC_GAMEMASTER, true, &HandleCharacterRenameCommand, "", NULL }, @@ -59,7 +66,9 @@ public: static ChatCommand commandTable[] = { - { "character", SEC_GAMEMASTER, true, NULL, "", characterCommandTable}, + { "character", SEC_GAMEMASTER, true, NULL, "", characterCommandTable }, + { "levelup", SEC_ADMINISTRATOR, false, &HandleLevelUpCommand, "", NULL }, + { "pdump", SEC_ADMINISTRATOR, true, NULL, "", pdumpCommandTable }, { NULL, 0, false, NULL, "", NULL } }; return commandTable; @@ -218,6 +227,34 @@ public: sWorld->AddCharacterNameData(delInfo.lowGuid, delInfo.name, (*result)[2].GetUInt8(), (*result)[0].GetUInt8(), (*result)[1].GetUInt8()); } + static void HandleCharacterLevel(Player* player, uint64 playerGuid, uint32 oldLevel, uint32 newLevel, ChatHandler* handler) + { + if (player) + { + player->GiveLevel(newLevel); + player->InitTalentForLevel(); + player->SetUInt32Value(PLAYER_XP, 0); + + if (handler->needReportToTarget(player)) + { + if (oldLevel == newLevel) + ChatHandler(player).PSendSysMessage(LANG_YOURS_LEVEL_PROGRESS_RESET, handler->GetNameLink().c_str()); + else if (oldLevel < newLevel) + ChatHandler(player).PSendSysMessage(LANG_YOURS_LEVEL_UP, handler->GetNameLink().c_str(), newLevel); + else // if (oldlevel > newlevel) + ChatHandler(player).PSendSysMessage(LANG_YOURS_LEVEL_DOWN, handler->GetNameLink().c_str(), newLevel); + } + } + else + { + // Update level and reset XP, everything else will be updated at login + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_LEVEL); + stmt->setUInt8(0, uint8(newLevel)); + stmt->setUInt32(1, GUID_LOPART(playerGuid)); + CharacterDatabase.Execute(stmt); + } + } + static bool HandleCharacterTitlesCommand(ChatHandler* handler, char const* args) { if (!*args) @@ -326,7 +363,7 @@ public: if (newlevel > STRONG_MAX_LEVEL) // hardcoded maximum level newlevel = STRONG_MAX_LEVEL; - handler->HandleCharacterLevel(target, targetGuid, oldlevel, newlevel); + HandleCharacterLevel(target, targetGuid, oldlevel, newlevel, handler); if (!handler->GetSession() || handler->GetSession()->GetPlayer() != target) // including player == NULL { std::string nameLink = handler->playerLink(targetName); @@ -671,6 +708,214 @@ public: return true; } + + static bool HandleLevelUpCommand(ChatHandler* handler, char const* args) + { + char* nameStr; + char* levelStr; + handler->extractOptFirstArg((char*)args, &nameStr, &levelStr); + + // exception opt second arg: .character level $name + if (levelStr && isalpha(levelStr[0])) + { + nameStr = levelStr; + levelStr = NULL; // current level will used + } + + Player* target; + uint64 targetGuid; + std::string targetName; + if (!handler->extractPlayerTarget(nameStr, &target, &targetGuid, &targetName)) + return false; + + int32 oldlevel = target ? target->getLevel() : Player::GetLevelFromDB(targetGuid); + int32 addlevel = levelStr ? atoi(levelStr) : 1; + int32 newlevel = oldlevel + addlevel; + + if (newlevel < 1) + newlevel = 1; + + if (newlevel > STRONG_MAX_LEVEL) // hardcoded maximum level + newlevel = STRONG_MAX_LEVEL; + + HandleCharacterLevel(target, targetGuid, oldlevel, newlevel, handler); + + if (!handler->GetSession() || handler->GetSession()->GetPlayer() != target) // including chr == NULL + { + std::string nameLink = handler->playerLink(targetName); + handler->PSendSysMessage(LANG_YOU_CHANGE_LVL, nameLink.c_str(), newlevel); + } + + return true; + } + + static bool HandlePDumpLoadCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + char* fileStr = strtok((char*)args, " "); + if (!fileStr) + return false; + + char* accountStr = strtok(NULL, " "); + if (!accountStr) + return false; + + std::string accountName = accountStr; + if (!AccountMgr::normalizeString(accountName)) + { + handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + + uint32 accountId = AccountMgr::GetId(accountName); + if (!accountId) + { + accountId = atoi(accountStr); // use original string + if (!accountId) + { + handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + } + + if (!AccountMgr::GetName(accountId, accountName)) + { + handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + + char* guidStr = NULL; + char* nameStr = strtok(NULL, " "); + + std::string name; + if (nameStr) + { + name = nameStr; + // normalize the name if specified and check if it exists + if (!normalizePlayerName(name)) + { + handler->PSendSysMessage(LANG_INVALID_CHARACTER_NAME); + handler->SetSentErrorMessage(true); + return false; + } + + if (ObjectMgr::CheckPlayerName(name, true) != CHAR_NAME_SUCCESS) + { + handler->PSendSysMessage(LANG_INVALID_CHARACTER_NAME); + handler->SetSentErrorMessage(true); + return false; + } + + guidStr = strtok(NULL, " "); + } + + uint32 guid = 0; + + if (guidStr) + { + guid = uint32(atoi(guidStr)); + if (!guid) + { + handler->PSendSysMessage(LANG_INVALID_CHARACTER_GUID); + handler->SetSentErrorMessage(true); + return false; + } + + if (sObjectMgr->GetPlayerAccountIdByGUID(guid)) + { + handler->PSendSysMessage(LANG_CHARACTER_GUID_IN_USE, guid); + handler->SetSentErrorMessage(true); + return false; + } + } + + switch (PlayerDumpReader().LoadDump(fileStr, accountId, name, guid)) + { + case DUMP_SUCCESS: + handler->PSendSysMessage(LANG_COMMAND_IMPORT_SUCCESS); + break; + case DUMP_FILE_OPEN_ERROR: + handler->PSendSysMessage(LANG_FILE_OPEN_FAIL, fileStr); + handler->SetSentErrorMessage(true); + return false; + case DUMP_FILE_BROKEN: + handler->PSendSysMessage(LANG_DUMP_BROKEN, fileStr); + handler->SetSentErrorMessage(true); + return false; + case DUMP_TOO_MANY_CHARS: + handler->PSendSysMessage(LANG_ACCOUNT_CHARACTER_LIST_FULL, accountName.c_str(), accountId); + handler->SetSentErrorMessage(true); + return false; + default: + handler->PSendSysMessage(LANG_COMMAND_IMPORT_FAILED); + handler->SetSentErrorMessage(true); + return false; + } + + return true; + } + + static bool HandlePDumpWriteCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + char* fileStr = strtok((char*)args, " "); + char* playerStr = strtok(NULL, " "); + + if (!fileStr || !playerStr) + return false; + + uint64 guid; + // character name can't start from number + if (isNumeric(playerStr)) + guid = MAKE_NEW_GUID(atoi(playerStr), 0, HIGHGUID_PLAYER); + else + { + std::string name = handler->extractPlayerNameFromLink(playerStr); + if (name.empty()) + { + handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); + handler->SetSentErrorMessage(true); + return false; + } + + guid = sObjectMgr->GetPlayerGUIDByName(name); + } + + if (!sObjectMgr->GetPlayerAccountIdByGUID(guid)) + { + handler->PSendSysMessage(LANG_PLAYER_NOT_FOUND); + handler->SetSentErrorMessage(true); + return false; + } + + switch (PlayerDumpWriter().WriteDump(fileStr, uint32(guid))) + { + case DUMP_SUCCESS: + handler->PSendSysMessage(LANG_COMMAND_EXPORT_SUCCESS); + break; + case DUMP_FILE_OPEN_ERROR: + handler->PSendSysMessage(LANG_FILE_OPEN_FAIL, fileStr); + handler->SetSentErrorMessage(true); + return false; + case DUMP_CHARACTER_DELETED: + handler->PSendSysMessage(LANG_COMMAND_EXPORT_DELETED_CHAR); + handler->SetSentErrorMessage(true); + return false; + default: + handler->PSendSysMessage(LANG_COMMAND_EXPORT_FAILED); + handler->SetSentErrorMessage(true); + return false; + } + + return true; + } }; void AddSC_character_commandscript() diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp index ae573577d7e..cfdfc66f991 100644 --- a/src/server/scripts/Commands/cs_learn.cpp +++ b/src/server/scripts/Commands/cs_learn.cpp @@ -22,10 +22,10 @@ Comment: All learn related commands Category: commandscripts EndScriptData */ +#include "Chat.h" #include "ScriptMgr.h" #include "ObjectMgr.h" #include "SpellMgr.h" -#include "Chat.h" #include "SpellInfo.h" class learn_commandscript : public CommandScript @@ -37,35 +37,36 @@ public: { static ChatCommand learnAllMyCommandTable[] = { - { "class", SEC_ADMINISTRATOR, false, &HandleLearnAllMyClassCommand, "", NULL }, - { "pettalents", SEC_ADMINISTRATOR, false, &HandleLearnAllMyPetTalentsCommand, "", NULL }, - { "spells", SEC_ADMINISTRATOR, false, &HandleLearnAllMySpellsCommand, "", NULL }, - { "talents", SEC_ADMINISTRATOR, false, &HandleLearnAllMyTalentsCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "class", SEC_ADMINISTRATOR, false, &HandleLearnAllMyClassCommand, "", NULL }, + { "pettalents", SEC_ADMINISTRATOR, false, &HandleLearnAllMyPetTalentsCommand, "", NULL }, + { "spells", SEC_ADMINISTRATOR, false, &HandleLearnAllMySpellsCommand, "", NULL }, + { "talents", SEC_ADMINISTRATOR, false, &HandleLearnAllMyTalentsCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand learnAllCommandTable[] = { - { "my", SEC_ADMINISTRATOR, false, NULL, "", learnAllMyCommandTable }, - { "gm", SEC_GAMEMASTER, false, &HandleLearnAllGMCommand, "", NULL }, - { "crafts", SEC_GAMEMASTER, false, &HandleLearnAllCraftsCommand, "", NULL }, - { "default", SEC_MODERATOR, false, &HandleLearnAllDefaultCommand, "", NULL }, - { "lang", SEC_MODERATOR, false, &HandleLearnAllLangCommand, "", NULL }, - { "recipes", SEC_GAMEMASTER, false, &HandleLearnAllRecipesCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "my", SEC_ADMINISTRATOR, false, NULL, "", learnAllMyCommandTable }, + { "gm", SEC_GAMEMASTER, false, &HandleLearnAllGMCommand, "", NULL }, + { "crafts", SEC_GAMEMASTER, false, &HandleLearnAllCraftsCommand, "", NULL }, + { "default", SEC_MODERATOR, false, &HandleLearnAllDefaultCommand, "", NULL }, + { "lang", SEC_MODERATOR, false, &HandleLearnAllLangCommand, "", NULL }, + { "recipes", SEC_GAMEMASTER, false, &HandleLearnAllRecipesCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand learnCommandTable[] = { - { "all", SEC_ADMINISTRATOR, false, NULL, "", learnAllCommandTable }, - { "", SEC_ADMINISTRATOR, false, &HandleLearnCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } + { "all", SEC_ADMINISTRATOR, false, NULL, "", learnAllCommandTable }, + { "", SEC_ADMINISTRATOR, false, &HandleLearnCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "learn", SEC_MODERATOR, false, NULL, "", learnCommandTable }, - { NULL, 0, false, NULL, "", NULL } + { "learn", SEC_MODERATOR, false, NULL, "", learnCommandTable }, + { "unlearn", SEC_ADMINISTRATOR, false, &HandleUnLearnCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; return commandTable; } @@ -466,6 +467,41 @@ public: player->learnSpell(skillLine->spellId, false); } } + + static bool HandleUnLearnCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r + uint32 spellId = handler->extractSpellIdFromLink((char*)args); + if (!spellId) + return false; + + char const* allStr = strtok(NULL, " "); + bool allRanks = allStr ? (strncmp(allStr, "all", strlen(allStr)) == 0) : false; + + Player* target = handler->getSelectedPlayer(); + if (!target) + { + handler->SendSysMessage(LANG_NO_CHAR_SELECTED); + handler->SetSentErrorMessage(true); + return false; + } + + if (allRanks) + spellId = sSpellMgr->GetFirstSpellInChain (spellId); + + if (target->HasSpell(spellId)) + target->removeSpell(spellId, false, !allRanks); + else + handler->SendSysMessage(LANG_FORGET_SPELL); + + if (GetTalentSpellCost(spellId)) + target->SendTalentsInfoData(false); + + return true; + } }; void AddSC_learn_commandscript() diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index 0e814034434..e7dba97ac45 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -1156,7 +1156,7 @@ public: return true; } - static bool HandleLookupMapCommand(ChatHandler* handler, char const* args) + static bool HandleLookupMapCommand(ChatHandler* /*handler*/, char const* args) { if (!*args) return false; diff --git a/src/server/scripts/Commands/cs_message.cpp b/src/server/scripts/Commands/cs_message.cpp new file mode 100644 index 00000000000..d61abf34e2f --- /dev/null +++ b/src/server/scripts/Commands/cs_message.cpp @@ -0,0 +1,215 @@ +/* + * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/> + * + * This program 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 2 of the License, or (at your + * option) any later version. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* ScriptData +Name: message_commandscript +%Complete: 100 +Comment: All message related commands +Category: commandscripts +EndScriptData */ + +#include "ScriptMgr.h" +#include "Chat.h" +#include "ChannelMgr.h" + +class message_commandscript : public CommandScript +{ +public: + message_commandscript() : CommandScript("message_commandscript") { } + + ChatCommand* GetCommands() const + { + static ChatCommand channelSetCommandTable[] = + { + { "ownership", SEC_ADMINISTRATOR, false, &HandleChannelSetOwnership, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; + static ChatCommand channelCommandTable[] = + { + { "set", SEC_ADMINISTRATOR, true, NULL, "", channelSetCommandTable }, + { NULL, 0, false, NULL, "", NULL } + }; + static ChatCommand commandTable[] = + { + { "channel", SEC_ADMINISTRATOR, true, NULL, "", channelCommandTable }, + { "nameannounce", SEC_MODERATOR, true, &HandleNameAnnounceCommand, "", NULL }, + { "gmnameannounce", SEC_MODERATOR, true, &HandleGMNameAnnounceCommand, "", NULL }, + { "announce", SEC_MODERATOR, true, &HandleAnnounceCommand, "", NULL }, + { "gmannounce", SEC_MODERATOR, true, &HandleGMAnnounceCommand, "", NULL }, + { "notify", SEC_MODERATOR, true, &HandleNotifyCommand, "", NULL }, + { "gmnotify", SEC_MODERATOR, true, &HandleGMNotifyCommand, "", NULL }, + { "whispers", SEC_MODERATOR, false, &HandleWhispersCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; + return commandTable; + } + + static bool HandleChannelSetOwnership(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + char const* channelStr = strtok((char*)args, " "); + char const* argStr = strtok(NULL, ""); + + if (!channelStr || !argStr) + return false; + + Player* player = handler->GetSession()->GetPlayer(); + Channel* channcel = NULL; + + if (ChannelMgr* cMgr = channelMgr(player->GetTeam())) + channcel = cMgr->GetChannel(channelStr, player); + + if (strcmp(argStr, "on") == 0) + { + if (channcel) + channcel->SetOwnership(true); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHANNEL_OWNERSHIP); + stmt->setUInt8 (0, 1); + stmt->setString(1, channelStr); + CharacterDatabase.Execute(stmt); + handler->PSendSysMessage(LANG_CHANNEL_ENABLE_OWNERSHIP, channelStr); + } + else if (strcmp(argStr, "off") == 0) + { + if (channcel) + channcel->SetOwnership(false); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHANNEL_OWNERSHIP); + stmt->setUInt8 (0, 0); + stmt->setString(1, channelStr); + CharacterDatabase.Execute(stmt); + handler->PSendSysMessage(LANG_CHANNEL_DISABLE_OWNERSHIP, channelStr); + } + else + return false; + + return true; + } + + static bool HandleNameAnnounceCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + std::string name("Console"); + if (WorldSession* session = handler->GetSession()) + name = session->GetPlayer()->GetName(); + + sWorld->SendWorldText(LANG_ANNOUNCE_COLOR, name.c_str(), args); + return true; + } + + static bool HandleGMNameAnnounceCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + std::string name("Console"); + if (WorldSession* session = handler->GetSession()) + name = session->GetPlayer()->GetName(); + + sWorld->SendGMText(LANG_GM_ANNOUNCE_COLOR, name.c_str(), args); + return true; + } + // global announce + static bool HandleAnnounceCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + char buff[2048]; + sprintf(buff, handler->GetTrinityString(LANG_SYSTEMMESSAGE), args); + sWorld->SendServerMessage(SERVER_MSG_STRING, buff); + return true; + } + // announce to logged in GMs + static bool HandleGMAnnounceCommand(ChatHandler* /*handler*/, char const* args) + { + if (!*args) + return false; + + sWorld->SendGMText(LANG_GM_BROADCAST, args); + return true; + } + // notification player at the screen + static bool HandleNotifyCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + std::string str = handler->GetTrinityString(LANG_GLOBAL_NOTIFY); + str += args; + + WorldPacket data(SMSG_NOTIFICATION, (str.size()+1)); + data << str; + sWorld->SendGlobalMessage(&data); + + return true; + } + // notification GM at the screen + static bool HandleGMNotifyCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + std::string str = handler->GetTrinityString(LANG_GM_NOTIFY); + str += args; + + WorldPacket data(SMSG_NOTIFICATION, (str.size()+1)); + data << str; + sWorld->SendGlobalGMMessage(&data); + + return true; + } + // Enable\Dissable accept whispers (for GM) + static bool HandleWhispersCommand(ChatHandler* handler, char const* args) + { + if (!*args) + { + handler->PSendSysMessage(LANG_COMMAND_WHISPERACCEPTING, handler->GetSession()->GetPlayer()->isAcceptWhispers() ? handler->GetTrinityString(LANG_ON) : handler->GetTrinityString(LANG_OFF)); + return true; + } + + std::string argStr = (char*)args; + // whisper on + if (argStr == "on") + { + handler->GetSession()->GetPlayer()->SetAcceptWhispers(true); + handler->SendSysMessage(LANG_COMMAND_WHISPERON); + return true; + } + + // whisper off + if (argStr == "off") + { + // Remove all players from the Gamemaster's whisper whitelist + handler->GetSession()->GetPlayer()->ClearWhisperWhiteList(); + handler->GetSession()->GetPlayer()->SetAcceptWhispers(false); + handler->SendSysMessage(LANG_COMMAND_WHISPEROFF); + return true; + } + + handler->SendSysMessage(LANG_USE_BOL); + handler->SetSentErrorMessage(true); + return false; + } +}; + +void AddSC_message_commandscript() +{ + new message_commandscript(); +} diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 7c431566f52..f8ad3f7c37e 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -15,11 +15,20 @@ * with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "ScriptPCH.h"
#include "Chat.h"
-#include "ObjectAccessor.h"
#include "ScriptMgr.h"
+#include "AccountMgr.h"
+#include "ArenaTeamMgr.h"
#include "CellImpl.h"
+#include "GridNotifiers.h"
+#include "Group.h"
+#include "InstanceSaveMgr.h"
+#include "MovementGenerator.h"
+#include "ObjectAccessor.h"
+#include "SpellAuras.h"
+#include "TargetedMovementGenerator.h"
+#include "WeatherMgr.h"
+#include "ace/INET_Addr.h"
class misc_commandscript : public CommandScript
{
@@ -28,11 +37,86 @@ public: ChatCommand* GetCommands() const
{
+ static ChatCommand groupCommandTable[] =
+ {
+ { "leader", SEC_ADMINISTRATOR, false, &HandleGroupLeaderCommand, "", NULL },
+ { "disband", SEC_ADMINISTRATOR, false, &HandleGroupDisbandCommand, "", NULL },
+ { "remove", SEC_ADMINISTRATOR, false, &HandleGroupRemoveCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+ static ChatCommand petCommandTable[] =
+ {
+ { "create", SEC_GAMEMASTER, false, &HandleCreatePetCommand, "", NULL },
+ { "learn", SEC_GAMEMASTER, false, &HandlePetLearnCommand, "", NULL },
+ { "unlearn", SEC_GAMEMASTER, false, &HandlePetUnlearnCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+ static ChatCommand sendCommandTable[] =
+ {
+ { "items", SEC_ADMINISTRATOR, true, &HandleSendItemsCommand, "", NULL },
+ { "mail", SEC_MODERATOR, true, &HandleSendMailCommand, "", NULL },
+ { "message", SEC_ADMINISTRATOR, true, &HandleSendMessageCommand, "", NULL },
+ { "money", SEC_ADMINISTRATOR, true, &HandleSendMoneyCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
static ChatCommand commandTable[] =
{
- { "dev", SEC_ADMINISTRATOR, false, &HandleDevCommand, "", NULL },
- { "gps", SEC_ADMINISTRATOR, false, &HandleGPSCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "dev", SEC_ADMINISTRATOR, false, &HandleDevCommand, "", NULL },
+ { "gps", SEC_ADMINISTRATOR, false, &HandleGPSCommand, "", NULL },
+ { "aura", SEC_ADMINISTRATOR, false, &HandleAuraCommand, "", NULL },
+ { "unaura", SEC_ADMINISTRATOR, false, &HandleUnAuraCommand, "", NULL },
+ { "appear", SEC_MODERATOR, false, &HandleAppearCommand, "", NULL },
+ { "summon", SEC_MODERATOR, false, &HandleSummonCommand, "", NULL },
+ { "groupsummon", SEC_MODERATOR, false, &HandleGroupSummonCommand, "", NULL },
+ { "commands", SEC_PLAYER, true, &HandleCommandsCommand, "", NULL },
+ { "die", SEC_ADMINISTRATOR, false, &HandleDieCommand, "", NULL },
+ { "revive", SEC_ADMINISTRATOR, true, &HandleReviveCommand, "", NULL },
+ { "dismount", SEC_PLAYER, false, &HandleDismountCommand, "", NULL },
+ { "guid", SEC_GAMEMASTER, false, &HandleGUIDCommand, "", NULL },
+ { "help", SEC_PLAYER, true, &HandleHelpCommand, "", NULL },
+ { "itemmove", SEC_GAMEMASTER, false, &HandleItemMoveCommand, "", NULL },
+ { "cooldown", SEC_ADMINISTRATOR, false, &HandleCooldownCommand, "", NULL },
+ { "distance", SEC_ADMINISTRATOR, false, &HandleGetDistanceCommand, "", NULL },
+ { "recall", SEC_MODERATOR, false, &HandleRecallCommand, "", NULL },
+ { "save", SEC_PLAYER, false, &HandleSaveCommand, "", NULL },
+ { "saveall", SEC_MODERATOR, true, &HandleSaveAllCommand, "", NULL },
+ { "kick", SEC_GAMEMASTER, true, &HandleKickPlayerCommand, "", NULL },
+ { "start", SEC_PLAYER, false, &HandleStartCommand, "", NULL },
+ { "taxicheat", SEC_MODERATOR, false, &HandleTaxiCheatCommand, "", NULL },
+ { "linkgrave", SEC_ADMINISTRATOR, false, &HandleLinkGraveCommand, "", NULL },
+ { "neargrave", SEC_ADMINISTRATOR, false, &HandleNearGraveCommand, "", NULL },
+ { "explorecheat", SEC_ADMINISTRATOR, false, &HandleExploreCheatCommand, "", NULL },
+ { "showarea", SEC_ADMINISTRATOR, false, &HandleShowAreaCommand, "", NULL },
+ { "hidearea", SEC_ADMINISTRATOR, false, &HandleHideAreaCommand, "", NULL },
+ { "additem", SEC_ADMINISTRATOR, false, &HandleAddItemCommand, "", NULL },
+ { "additemset", SEC_ADMINISTRATOR, false, &HandleAddItemSetCommand, "", NULL },
+ { "bank", SEC_ADMINISTRATOR, false, &HandleBankCommand, "", NULL },
+ { "wchange", SEC_ADMINISTRATOR, false, &HandleChangeWeather, "", NULL },
+ { "maxskill", SEC_ADMINISTRATOR, false, &HandleMaxSkillCommand, "", NULL },
+ { "setskill", SEC_ADMINISTRATOR, false, &HandleSetSkillCommand, "", NULL },
+ { "pinfo", SEC_GAMEMASTER, true, &HandlePInfoCommand, "", NULL },
+ { "respawn", SEC_ADMINISTRATOR, false, &HandleRespawnCommand, "", NULL },
+ { "send", SEC_MODERATOR, true, NULL, "", sendCommandTable },
+ { "pet", SEC_GAMEMASTER, false, NULL, "", petCommandTable },
+ { "mute", SEC_MODERATOR, true, &HandleMuteCommand, "", NULL },
+ { "unmute", SEC_MODERATOR, true, &HandleUnmuteCommand, "", NULL },
+ { "movegens", SEC_ADMINISTRATOR, false, &HandleMovegensCommand, "", NULL },
+ { "cometome", SEC_ADMINISTRATOR, false, &HandleComeToMeCommand, "", NULL },
+ { "damage", SEC_ADMINISTRATOR, false, &HandleDamageCommand, "", NULL },
+ { "combatstop", SEC_GAMEMASTER, true, &HandleCombatStopCommand, "", NULL },
+ { "flusharenapoints", SEC_ADMINISTRATOR, false, &HandleFlushArenaPointsCommand, "", NULL },
+ { "repairitems", SEC_GAMEMASTER, true, &HandleRepairitemsCommand, "", NULL },
+ { "waterwalk", SEC_GAMEMASTER, false, &HandleWaterwalkCommand, "", NULL },
+ { "freeze", SEC_MODERATOR, false, &HandleFreezeCommand, "", NULL },
+ { "unfreeze", SEC_MODERATOR, false, &HandleUnFreezeCommand, "", NULL },
+ { "listfreeze", SEC_MODERATOR, false, &HandleListFreezeCommand, "", NULL },
+ { "group", SEC_ADMINISTRATOR, false, NULL, "", groupCommandTable },
+ { "possess", SEC_ADMINISTRATOR, false, HandlePossessCommand, "", NULL },
+ { "unpossess", SEC_ADMINISTRATOR, false, HandleUnPossessCommand, "", NULL },
+ { "bindsight", SEC_ADMINISTRATOR, false, HandleBindSightCommand, "", NULL },
+ { "unbindsight", SEC_ADMINISTRATOR, false, HandleUnbindSightCommand, "", NULL },
+ { "playall", SEC_GAMEMASTER, false, HandlePlayAllCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
@@ -152,6 +236,2641 @@ public: return true;
}
+
+ static bool HandleAuraCommand(ChatHandler* handler, char const* args)
+ {
+ Unit* target = handler->getSelectedUnit();
+ if (!target)
+ {
+ handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form
+ uint32 spellId = handler->extractSpellIdFromLink((char*)args);
+
+ if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId))
+ Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, target, target);
+
+ return true;
+ }
+
+ static bool HandleUnAuraCommand(ChatHandler* handler, char const* args)
+ {
+ Unit* target = handler->getSelectedUnit();
+ if (!target)
+ {
+ handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ std::string argstr = args;
+ if (argstr == "all")
+ {
+ target->RemoveAllAuras();
+ return true;
+ }
+
+ // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form
+ uint32 spellId = handler->extractSpellIdFromLink((char*)args);
+ if (!spellId)
+ return false;
+
+ target->RemoveAurasDueToSpell(spellId);
+
+ return true;
+ }
+ // Teleport to Player
+ static bool HandleAppearCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target;
+ uint64 targetGuid;
+ std::string targetName;
+ if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName))
+ return false;
+
+ Player* _player = handler->GetSession()->GetPlayer();
+ if (target == _player || targetGuid == _player->GetGUID())
+ {
+ handler->SendSysMessage(LANG_CANT_TELEPORT_SELF);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (target)
+ {
+ // check online security
+ if (handler->HasLowerSecurity(target, 0))
+ return false;
+
+ std::string chrNameLink = handler->playerLink(targetName);
+
+ Map* map = target->GetMap();
+ if (map->IsBattlegroundOrArena())
+ {
+ // only allow if gm mode is on
+ if (!_player->isGameMaster())
+ {
+ handler->PSendSysMessage(LANG_CANNOT_GO_TO_BG_GM, chrNameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ // if both players are in different bgs
+ else if (_player->GetBattlegroundId() && _player->GetBattlegroundId() != target->GetBattlegroundId())
+ _player->LeaveBattleground(false); // Note: should be changed so _player gets no Deserter debuff
+
+ // all's well, set bg id
+ // when porting out from the bg, it will be reset to 0
+ _player->SetBattlegroundId(target->GetBattlegroundId(), target->GetBattlegroundTypeId());
+ // remember current position as entry point for return at bg end teleportation
+ if (!_player->GetMap()->IsBattlegroundOrArena())
+ _player->SetBattlegroundEntryPoint();
+ }
+ else if (map->IsDungeon())
+ {
+ // we have to go to instance, and can go to player only if:
+ // 1) we are in his group (either as leader or as member)
+ // 2) we are not bound to any group and have GM mode on
+ if (_player->GetGroup())
+ {
+ // we are in group, we can go only if we are in the player group
+ if (_player->GetGroup() != target->GetGroup())
+ {
+ handler->PSendSysMessage(LANG_CANNOT_GO_TO_INST_PARTY, chrNameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ }
+ else
+ {
+ // we are not in group, let's verify our GM mode
+ if (!_player->isGameMaster())
+ {
+ handler->PSendSysMessage(LANG_CANNOT_GO_TO_INST_GM, chrNameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ }
+
+ // if the player or the player's group is bound to another instance
+ // the player will not be bound to another one
+ InstancePlayerBind* bind = _player->GetBoundInstance(target->GetMapId(), target->GetDifficulty(map->IsRaid()));
+ if (!bind)
+ {
+ Group* group = _player->GetGroup();
+ // if no bind exists, create a solo bind
+ InstanceGroupBind* gBind = group ? group->GetBoundInstance(target) : NULL; // if no bind exists, create a solo bind
+ if (!gBind)
+ if (InstanceSave* save = sInstanceSaveMgr->GetInstanceSave(target->GetInstanceId()))
+ _player->BindToInstance(save, !save->CanReset());
+ }
+
+ if (map->IsRaid())
+ _player->SetRaidDifficulty(target->GetRaidDifficulty());
+ else
+ _player->SetDungeonDifficulty(target->GetDungeonDifficulty());
+ }
+
+ handler->PSendSysMessage(LANG_APPEARING_AT, chrNameLink.c_str());
+
+ // stop flight if need
+ if (_player->isInFlight())
+ {
+ _player->GetMotionMaster()->MovementExpired();
+ _player->CleanupAfterTaxiFlight();
+ }
+ // save only in non-flight case
+ else
+ _player->SaveRecallPosition();
+
+ // to point to see at target with same orientation
+ float x, y, z;
+ target->GetContactPoint(_player, x, y, z);
+
+ _player->TeleportTo(target->GetMapId(), x, y, z, _player->GetAngle(target), TELE_TO_GM_MODE);
+ _player->SetPhaseMask(target->GetPhaseMask(), true);
+ }
+ else
+ {
+ // check offline security
+ if (handler->HasLowerSecurity(NULL, targetGuid))
+ return false;
+
+ std::string nameLink = handler->playerLink(targetName);
+
+ handler->PSendSysMessage(LANG_APPEARING_AT, nameLink.c_str());
+
+ // to point where player stay (if loaded)
+ float x, y, z, o;
+ uint32 map;
+ bool in_flight;
+ if (!Player::LoadPositionFromDB(map, x, y, z, o, in_flight, targetGuid))
+ return false;
+
+ // stop flight if need
+ if (_player->isInFlight())
+ {
+ _player->GetMotionMaster()->MovementExpired();
+ _player->CleanupAfterTaxiFlight();
+ }
+ // save only in non-flight case
+ else
+ _player->SaveRecallPosition();
+
+ _player->TeleportTo(map, x, y, z, _player->GetOrientation());
+ }
+
+ return true;
+ }
+ // Summon Player
+ static bool HandleSummonCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target;
+ uint64 targetGuid;
+ std::string targetName;
+ if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName))
+ return false;
+
+ Player* _player = handler->GetSession()->GetPlayer();
+ if (target == _player || targetGuid == _player->GetGUID())
+ {
+ handler->PSendSysMessage(LANG_CANT_TELEPORT_SELF);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (target)
+ {
+ std::string nameLink = handler->playerLink(targetName);
+ // check online security
+ if (handler->HasLowerSecurity(target, 0))
+ return false;
+
+ if (target->IsBeingTeleported())
+ {
+ handler->PSendSysMessage(LANG_IS_TELEPORTED, nameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ Map* map = handler->GetSession()->GetPlayer()->GetMap();
+
+ if (map->IsBattlegroundOrArena())
+ {
+ // only allow if gm mode is on
+ if (!_player->isGameMaster())
+ {
+ handler->PSendSysMessage(LANG_CANNOT_GO_TO_BG_GM, nameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ // if both players are in different bgs
+ else if (target->GetBattlegroundId() && handler->GetSession()->GetPlayer()->GetBattlegroundId() != target->GetBattlegroundId())
+ target->LeaveBattleground(false); // Note: should be changed so target gets no Deserter debuff
+
+ // all's well, set bg id
+ // when porting out from the bg, it will be reset to 0
+ target->SetBattlegroundId(handler->GetSession()->GetPlayer()->GetBattlegroundId(), handler->GetSession()->GetPlayer()->GetBattlegroundTypeId());
+ // remember current position as entry point for return at bg end teleportation
+ if (!target->GetMap()->IsBattlegroundOrArena())
+ target->SetBattlegroundEntryPoint();
+ }
+ else if (map->IsDungeon())
+ {
+ Map* map = target->GetMap();
+
+ if (map->Instanceable() && map->GetInstanceId() != map->GetInstanceId())
+ target->UnbindInstance(map->GetInstanceId(), target->GetDungeonDifficulty(), true);
+
+ // we are in instance, and can summon only player in our group with us as lead
+ if (!handler->GetSession()->GetPlayer()->GetGroup() || !target->GetGroup() ||
+ (target->GetGroup()->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID()) ||
+ (handler->GetSession()->GetPlayer()->GetGroup()->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID()))
+ // the last check is a bit excessive, but let it be, just in case
+ {
+ handler->PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST, nameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ }
+
+ handler->PSendSysMessage(LANG_SUMMONING, nameLink.c_str(), "");
+ if (handler->needReportToTarget(target))
+ ChatHandler(target).PSendSysMessage(LANG_SUMMONED_BY, handler->playerLink(_player->GetName()).c_str());
+
+ // stop flight if need
+ if (target->isInFlight())
+ {
+ target->GetMotionMaster()->MovementExpired();
+ target->CleanupAfterTaxiFlight();
+ }
+ // save only in non-flight case
+ else
+ target->SaveRecallPosition();
+
+ // before GM
+ float x, y, z;
+ handler->GetSession()->GetPlayer()->GetClosePoint(x, y, z, target->GetObjectSize());
+ target->TeleportTo(handler->GetSession()->GetPlayer()->GetMapId(), x, y, z, target->GetOrientation());
+ target->SetPhaseMask(handler->GetSession()->GetPlayer()->GetPhaseMask(), true);
+ }
+ else
+ {
+ // check offline security
+ if (handler->HasLowerSecurity(NULL, targetGuid))
+ return false;
+
+ std::string nameLink = handler->playerLink(targetName);
+
+ handler->PSendSysMessage(LANG_SUMMONING, nameLink.c_str(), handler->GetTrinityString(LANG_OFFLINE));
+
+ // in point where GM stay
+ Player::SavePositionInDB(handler->GetSession()->GetPlayer()->GetMapId(),
+ handler->GetSession()->GetPlayer()->GetPositionX(),
+ handler->GetSession()->GetPlayer()->GetPositionY(),
+ handler->GetSession()->GetPlayer()->GetPositionZ(),
+ handler->GetSession()->GetPlayer()->GetOrientation(),
+ handler->GetSession()->GetPlayer()->GetZoneId(),
+ targetGuid);
+ }
+
+ return true;
+ }
+ // Summon group of player
+ static bool HandleGroupSummonCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target;
+ if (!handler->extractPlayerTarget((char*)args, &target))
+ return false;
+
+ // check online security
+ if (handler->HasLowerSecurity(target, 0))
+ return false;
+
+ Group* group = target->GetGroup();
+
+ std::string nameLink = handler->GetNameLink(target);
+
+ if (!group)
+ {
+ handler->PSendSysMessage(LANG_NOT_IN_GROUP, nameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ Map* gmMap = handler->GetSession()->GetPlayer()->GetMap();
+ bool toInstance = gmMap->Instanceable();
+
+ // we are in instance, and can summon only player in our group with us as lead
+ if (toInstance && (
+ !handler->GetSession()->GetPlayer()->GetGroup() || (group->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID()) ||
+ (handler->GetSession()->GetPlayer()->GetGroup()->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID())))
+ // the last check is a bit excessive, but let it be, just in case
+ {
+ handler->SendSysMessage(LANG_CANNOT_SUMMON_TO_INST);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
+ {
+ Player* player = itr->getSource();
+
+ if (!player || player == handler->GetSession()->GetPlayer() || !player->GetSession())
+ continue;
+
+ // check online security
+ if (handler->HasLowerSecurity(player, 0))
+ return false;
+
+ std::string plNameLink = handler->GetNameLink(player);
+
+ if (player->IsBeingTeleported() == true)
+ {
+ handler->PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (toInstance)
+ {
+ Map* playerMap = player->GetMap();
+
+ if (playerMap->Instanceable() && playerMap->GetInstanceId() != gmMap->GetInstanceId())
+ {
+ // cannot summon from instance to instance
+ handler->PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST, plNameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ }
+
+ handler->PSendSysMessage(LANG_SUMMONING, plNameLink.c_str(), "");
+ if (handler->needReportToTarget(player))
+ ChatHandler(player).PSendSysMessage(LANG_SUMMONED_BY, handler->GetNameLink().c_str());
+
+ // stop flight if need
+ if (player->isInFlight())
+ {
+ player->GetMotionMaster()->MovementExpired();
+ player->CleanupAfterTaxiFlight();
+ }
+ // save only in non-flight case
+ else
+ player->SaveRecallPosition();
+
+ // before GM
+ float x, y, z;
+ handler->GetSession()->GetPlayer()->GetClosePoint(x, y, z, player->GetObjectSize());
+ player->TeleportTo(handler->GetSession()->GetPlayer()->GetMapId(), x, y, z, player->GetOrientation());
+ }
+
+ return true;
+ }
+
+ static bool HandleCommandsCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ handler->ShowHelpForCommand(handler->getCommandTable(), "");
+ return true;
+ }
+
+ static bool HandleDieCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ Unit* target = handler->getSelectedUnit();
+
+ if (!target || !handler->GetSession()->GetPlayer()->GetSelection())
+ {
+ handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (target->GetTypeId() == TYPEID_PLAYER)
+ {
+ if (handler->HasLowerSecurity((Player*)target, 0, false))
+ return false;
+ }
+
+ if (target->isAlive())
+ {
+ if (sWorld->getBoolConfig(CONFIG_DIE_COMMAND_MODE))
+ handler->GetSession()->GetPlayer()->Kill(target);
+ else
+ handler->GetSession()->GetPlayer()->DealDamage(target, target->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ }
+
+ return true;
+ }
+
+ static bool HandleReviveCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target;
+ uint64 targetGuid;
+ if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid))
+ return false;
+
+ if (target)
+ {
+ target->ResurrectPlayer(!AccountMgr::IsPlayerAccount(target->GetSession()->GetSecurity()) ? 1.0f : 0.5f);
+ target->SpawnCorpseBones();
+ target->SaveToDB();
+ }
+ else
+ // will resurrected at login without corpse
+ sObjectAccessor->ConvertCorpseForPlayer(targetGuid);
+
+ return true;
+ }
+
+ static bool HandleDismountCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ Player* player = handler->GetSession()->GetPlayer();
+
+ // If player is not mounted, so go out :)
+ if (!player->IsMounted())
+ {
+ handler->SendSysMessage(LANG_CHAR_NON_MOUNTED);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (player->isInFlight())
+ {
+ handler->SendSysMessage(LANG_YOU_IN_FLIGHT);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ player->Dismount();
+ player->RemoveAurasByType(SPELL_AURA_MOUNTED);
+ return true;
+ }
+
+ static bool HandleGUIDCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ uint64 guid = handler->GetSession()->GetPlayer()->GetSelection();
+
+ if (guid == 0)
+ {
+ handler->SendSysMessage(LANG_NO_SELECTION);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage(LANG_OBJECT_GUID, GUID_LOPART(guid), GUID_HIPART(guid));
+ return true;
+ }
+
+ static bool HandleHelpCommand(ChatHandler* handler, char const* args)
+ {
+ char const* cmd = strtok((char*)args, " ");
+ if (!cmd)
+ {
+ handler->ShowHelpForCommand(handler->getCommandTable(), "help");
+ handler->ShowHelpForCommand(handler->getCommandTable(), "");
+ }
+ else
+ {
+ if (!handler->ShowHelpForCommand(handler->getCommandTable(), cmd))
+ handler->SendSysMessage(LANG_NO_HELP_CMD);
+ }
+
+ return true;
+ }
+ // move item to other slot
+ static bool HandleItemMoveCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ char const* param1 = strtok((char*)args, " ");
+ if (!param1)
+ return false;
+
+ char const* param2 = strtok(NULL, " ");
+ if (!param2)
+ return false;
+
+ uint8 srcSlot = uint8(atoi(param1));
+ uint8 dstSlot = uint8(atoi(param2));
+
+ if (srcSlot == dstSlot)
+ return true;
+
+ if (!handler->GetSession()->GetPlayer()->IsValidPos(INVENTORY_SLOT_BAG_0, srcSlot, true))
+ return false;
+
+ if (!handler->GetSession()->GetPlayer()->IsValidPos(INVENTORY_SLOT_BAG_0, dstSlot, false))
+ return false;
+
+ uint16 src = ((INVENTORY_SLOT_BAG_0 << 8) | srcSlot);
+ uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | dstSlot);
+
+ handler->GetSession()->GetPlayer()->SwapItem(src, dst);
+
+ return true;
+ }
+
+ static bool HandleCooldownCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target = handler->getSelectedPlayer();
+ if (!target)
+ {
+ handler->SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ std::string nameLink = handler->GetNameLink(target);
+
+ if (!*args)
+ {
+ target->RemoveAllSpellCooldown();
+ handler->PSendSysMessage(LANG_REMOVEALL_COOLDOWN, nameLink.c_str());
+ }
+ else
+ {
+ // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form
+ uint32 spellIid = handler->extractSpellIdFromLink((char*)args);
+ if (!spellIid)
+ return false;
+
+ if (!sSpellMgr->GetSpellInfo(spellIid))
+ {
+ handler->PSendSysMessage(LANG_UNKNOWN_SPELL, target == handler->GetSession()->GetPlayer() ? handler->GetTrinityString(LANG_YOU) : nameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ target->RemoveSpellCooldown(spellIid, true);
+ handler->PSendSysMessage(LANG_REMOVE_COOLDOWN, spellIid, target == handler->GetSession()->GetPlayer() ? handler->GetTrinityString(LANG_YOU) : nameLink.c_str());
+ }
+ return true;
+ }
+
+ static bool HandleGetDistanceCommand(ChatHandler* handler, char const* args)
+ {
+ WorldObject* obj = NULL;
+
+ if (*args)
+ {
+ uint64 guid = handler->extractGuidFromLink((char*)args);
+ if (guid)
+ obj = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*handler->GetSession()->GetPlayer(), guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT);
+
+ if (!obj)
+ {
+ handler->SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ }
+ else
+ {
+ obj = handler->getSelectedUnit();
+
+ if (!obj)
+ {
+ handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ }
+
+ handler->PSendSysMessage(LANG_DISTANCE, handler->GetSession()->GetPlayer()->GetDistance(obj), handler->GetSession()->GetPlayer()->GetDistance2d(obj), handler->GetSession()->GetPlayer()->GetExactDist(obj), handler->GetSession()->GetPlayer()->GetExactDist2d(obj));
+ return true;
+ }
+ // Teleport player to last position
+ static bool HandleRecallCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target;
+ if (!handler->extractPlayerTarget((char*)args, &target))
+ return false;
+
+ // check online security
+ if (handler->HasLowerSecurity(target, 0))
+ return false;
+
+ if (target->IsBeingTeleported())
+ {
+ handler->PSendSysMessage(LANG_IS_TELEPORTED, handler->GetNameLink(target).c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ // stop flight if need
+ if (target->isInFlight())
+ {
+ target->GetMotionMaster()->MovementExpired();
+ target->CleanupAfterTaxiFlight();
+ }
+
+ target->TeleportTo(target->m_recallMap, target->m_recallX, target->m_recallY, target->m_recallZ, target->m_recallO);
+ return true;
+ }
+
+ static bool HandleSaveCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ Player* player = handler->GetSession()->GetPlayer();
+
+ // save GM account without delay and output message
+ if (!AccountMgr::IsPlayerAccount(handler->GetSession()->GetSecurity()))
+ {
+ if (Player* target = handler->getSelectedPlayer())
+ target->SaveToDB();
+ else
+ player->SaveToDB();
+ handler->SendSysMessage(LANG_PLAYER_SAVED);
+ return true;
+ }
+
+ // save if the player has last been saved over 20 seconds ago
+ uint32 saveInterval = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE);
+ if (saveInterval == 0 || (saveInterval > 20 * IN_MILLISECONDS && player->GetSaveTimer() <= saveInterval - 20 * IN_MILLISECONDS))
+ player->SaveToDB();
+
+ return true;
+ }
+
+ // Save all players in the world
+ static bool HandleSaveAllCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ sObjectAccessor->SaveAllPlayers();
+ handler->SendSysMessage(LANG_PLAYERS_SAVED);
+ return true;
+ }
+
+ // kick player
+ static bool HandleKickPlayerCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target = NULL;
+ std::string playerName;
+ if (!handler->extractPlayerTarget((char*)args, &target, NULL, &playerName))
+ return false;
+
+ if (handler->GetSession() && target == handler->GetSession()->GetPlayer())
+ {
+ handler->SendSysMessage(LANG_COMMAND_KICKSELF);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ // check online security
+ if (handler->HasLowerSecurity(target, 0))
+ return false;
+
+ if (sWorld->getBoolConfig(CONFIG_SHOW_KICK_IN_WORLD))
+ sWorld->SendWorldText(LANG_COMMAND_KICKMESSAGE, playerName.c_str());
+ else
+ handler->PSendSysMessage(LANG_COMMAND_KICKMESSAGE, playerName.c_str());
+
+ target->GetSession()->KickPlayer();
+
+ return true;
+ }
+
+ static bool HandleStartCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ Player* player = handler->GetSession()->GetPlayer();
+
+ if (player->isInFlight())
+ {
+ handler->SendSysMessage(LANG_YOU_IN_FLIGHT);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (player->isInCombat())
+ {
+ handler->SendSysMessage(LANG_YOU_IN_COMBAT);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (player->isDead() || player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))
+ {
+ // if player is dead and stuck, send ghost to graveyard
+ player->RepopAtGraveyard();
+ return true;
+ }
+
+ // cast spell Stuck
+ player->CastSpell(player, 7355, false);
+ return true;
+ }
+ // Enable on\off all taxi paths
+ static bool HandleTaxiCheatCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ {
+ handler->SendSysMessage(LANG_USE_BOL);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ std::string argStr = (char*)args;
+
+ Player* chr = handler->getSelectedPlayer();
+
+ if (!chr)
+ chr = handler->GetSession()->GetPlayer();
+ else if (handler->HasLowerSecurity(chr, 0)) // check online security
+ return false;
+
+ if (argStr == "on")
+ {
+ chr->SetTaxiCheater(true);
+ handler->PSendSysMessage(LANG_YOU_GIVE_TAXIS, handler->GetNameLink(chr).c_str());
+ if (handler->needReportToTarget(chr))
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_ADDED, handler->GetNameLink().c_str());
+ return true;
+ }
+
+ if (argStr == "off")
+ {
+ chr->SetTaxiCheater(false);
+ handler->PSendSysMessage(LANG_YOU_REMOVE_TAXIS, handler->GetNameLink(chr).c_str());
+ if (handler->needReportToTarget(chr))
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_REMOVED, handler->GetNameLink().c_str());
+
+ return true;
+ }
+
+ handler->SendSysMessage(LANG_USE_BOL);
+ handler->SetSentErrorMessage(true);
+
+ return false;
+ }
+
+ static bool HandleLinkGraveCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ char* px = strtok((char*)args, " ");
+ if (!px)
+ return false;
+
+ uint32 graveyardId = uint32(atoi(px));
+
+ uint32 team;
+
+ char* px2 = strtok(NULL, " ");
+
+ if (!px2)
+ team = 0;
+ else if (strncmp(px2, "horde", 6) == 0)
+ team = HORDE;
+ else if (strncmp(px2, "alliance", 9) == 0)
+ team = ALLIANCE;
+ else
+ return false;
+
+ WorldSafeLocsEntry const* graveyard = sWorldSafeLocsStore.LookupEntry(graveyardId);
+
+ if (!graveyard)
+ {
+ handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDNOEXIST, graveyardId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ Player* player = handler->GetSession()->GetPlayer();
+
+ uint32 zoneId = player->GetZoneId();
+
+ AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(zoneId);
+ if (!areaEntry || areaEntry->zone !=0)
+ {
+ handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDWRONGZONE, graveyardId, zoneId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (sObjectMgr->AddGraveYardLink(graveyardId, zoneId, team))
+ handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDLINKED, graveyardId, zoneId);
+ else
+ handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDALRLINKED, graveyardId, zoneId);
+
+ return true;
+ }
+
+ static bool HandleNearGraveCommand(ChatHandler* handler, char const* args)
+ {
+ uint32 team;
+
+ size_t argStr = strlen(args);
+
+ if (!*args)
+ team = 0;
+ else if (strncmp((char*)args, "horde", argStr) == 0)
+ team = HORDE;
+ else if (strncmp((char*)args, "alliance", argStr) == 0)
+ team = ALLIANCE;
+ else
+ return false;
+
+ Player* player = handler->GetSession()->GetPlayer();
+ uint32 zone_id = player->GetZoneId();
+
+ WorldSafeLocsEntry const* graveyard = sObjectMgr->GetClosestGraveYard(
+ player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), team);
+
+ if (graveyard)
+ {
+ uint32 graveyardId = graveyard->ID;
+
+ GraveYardData const* data = sObjectMgr->FindGraveYardData(graveyardId, zone_id);
+ if (!data)
+ {
+ handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDERROR, graveyardId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ team = data->team;
+
+ std::string team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_NOTEAM);
+
+ if (team == 0)
+ team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_ANY);
+ else if (team == HORDE)
+ team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_HORDE);
+ else if (team == ALLIANCE)
+ team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_ALLIANCE);
+
+ handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDNEAREST, graveyardId, team_name.c_str(), zone_id);
+ }
+ else
+ {
+ std::string team_name;
+
+ if (team == 0)
+ team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_ANY);
+ else if (team == HORDE)
+ team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_HORDE);
+ else if (team == ALLIANCE)
+ team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_ALLIANCE);
+
+ if (team == ~uint32(0))
+ handler->PSendSysMessage(LANG_COMMAND_ZONENOGRAVEYARDS, zone_id);
+ else
+ handler->PSendSysMessage(LANG_COMMAND_ZONENOGRAFACTION, zone_id, team_name.c_str());
+ }
+
+ return true;
+ }
+
+ static bool HandleExploreCheatCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ int32 flag = int32(atoi((char*)args));
+
+ Player* playerTarget = handler->getSelectedPlayer();
+ if (!playerTarget)
+ {
+ handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (flag != 0)
+ {
+ handler->PSendSysMessage(LANG_YOU_SET_EXPLORE_ALL, handler->GetNameLink(playerTarget).c_str());
+ if (handler->needReportToTarget(playerTarget))
+ ChatHandler(playerTarget).PSendSysMessage(LANG_YOURS_EXPLORE_SET_ALL, handler->GetNameLink().c_str());
+ }
+ else
+ {
+ handler->PSendSysMessage(LANG_YOU_SET_EXPLORE_NOTHING, handler->GetNameLink(playerTarget).c_str());
+ if (handler->needReportToTarget(playerTarget))
+ ChatHandler(playerTarget).PSendSysMessage(LANG_YOURS_EXPLORE_SET_NOTHING, handler->GetNameLink().c_str());
+ }
+
+ for (uint8 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i)
+ {
+ if (flag != 0)
+ handler->GetSession()->GetPlayer()->SetFlag(PLAYER_EXPLORED_ZONES_1+i, 0xFFFFFFFF);
+ else
+ handler->GetSession()->GetPlayer()->SetFlag(PLAYER_EXPLORED_ZONES_1+i, 0);
+ }
+
+ return true;
+ }
+
+ static bool HandleShowAreaCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ Player* playerTarget = handler->getSelectedPlayer();
+ if (!playerTarget)
+ {
+ handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ int32 area = GetAreaFlagByAreaID(atoi((char*)args));
+ int32 offset = area / 32;
+ uint32 val = uint32((1 << (area % 32)));
+
+ if (area<0 || offset >= PLAYER_EXPLORED_ZONES_SIZE)
+ {
+ handler->SendSysMessage(LANG_BAD_VALUE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ uint32 currFields = playerTarget->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset);
+ playerTarget->SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, uint32((currFields | val)));
+
+ handler->SendSysMessage(LANG_EXPLORE_AREA);
+ return true;
+ }
+
+ static bool HandleHideAreaCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ Player* playerTarget = handler->getSelectedPlayer();
+ if (!playerTarget)
+ {
+ handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ int32 area = GetAreaFlagByAreaID(atoi((char*)args));
+ int32 offset = area / 32;
+ uint32 val = uint32((1 << (area % 32)));
+
+ if (area < 0 || offset >= PLAYER_EXPLORED_ZONES_SIZE)
+ {
+ handler->SendSysMessage(LANG_BAD_VALUE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ uint32 currFields = playerTarget->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset);
+ playerTarget->SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, uint32((currFields ^ val)));
+
+ handler->SendSysMessage(LANG_UNEXPLORE_AREA);
+ return true;
+ }
+
+ static bool HandleAddItemCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ uint32 itemId = 0;
+
+ if (args[0] == '[') // [name] manual form
+ {
+ char const* itemNameStr = strtok((char*)args, "]");
+
+ if (itemNameStr && itemNameStr[0])
+ {
+ std::string itemName = itemNameStr+1;
+ WorldDatabase.EscapeString(itemName);
+
+ PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_ITEM_TEMPLATE_BY_NAME);
+ stmt->setString(0, itemName);
+ PreparedQueryResult result = WorldDatabase.Query(stmt);
+
+ if (!result)
+ {
+ handler->PSendSysMessage(LANG_COMMAND_COULDNOTFIND, itemNameStr+1);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ itemId = result->Fetch()->GetUInt32();
+ }
+ else
+ return false;
+ }
+ else // item_id or [name] Shift-click form |color|Hitem:item_id:0:0:0|h[name]|h|r
+ {
+ char const* id = handler->extractKeyFromLink((char*)args, "Hitem");
+ if (!id)
+ return false;
+ itemId = uint32(atol(id));
+ }
+
+ char const* ccount = strtok(NULL, " ");
+
+ int32 count = 1;
+
+ if (ccount)
+ count = strtol(ccount, NULL, 10);
+
+ if (count == 0)
+ count = 1;
+
+ Player* player = handler->GetSession()->GetPlayer();
+ Player* playerTarget = handler->getSelectedPlayer();
+ if (!playerTarget)
+ playerTarget = player;
+
+ sLog->outDetail(handler->GetTrinityString(LANG_ADDITEM), itemId, count);
+
+ ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId);
+ if (!itemTemplate)
+ {
+ handler->PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ // Subtract
+ if (count < 0)
+ {
+ playerTarget->DestroyItemCount(itemId, -count, true, false);
+ handler->PSendSysMessage(LANG_REMOVEITEM, itemId, -count, handler->GetNameLink(playerTarget).c_str());
+ return true;
+ }
+
+ // Adding items
+ uint32 noSpaceForCount = 0;
+
+ // check space and find places
+ ItemPosCountVec dest;
+ InventoryResult msg = playerTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, count, &noSpaceForCount);
+ if (msg != EQUIP_ERR_OK) // convert to possible store amount
+ count -= noSpaceForCount;
+
+ if (count == 0 || dest.empty()) // can't add any
+ {
+ handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemId, noSpaceForCount);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ Item* item = playerTarget->StoreNewItem(dest, itemId, true, Item::GenerateItemRandomPropertyId(itemId));
+
+ // remove binding (let GM give it to another player later)
+ if (player == playerTarget)
+ for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end(); ++itr)
+ if (Item* item1 = player->GetItemByPos(itr->pos))
+ item1->SetBinding(false);
+
+ if (count > 0 && item)
+ {
+ player->SendNewItem(item, count, false, true);
+ if (player != playerTarget)
+ playerTarget->SendNewItem(item, count, true, false);
+ }
+
+ if (noSpaceForCount > 0)
+ handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemId, noSpaceForCount);
+
+ return true;
+ }
+
+ static bool HandleAddItemSetCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ char const* id = handler->extractKeyFromLink((char*)args, "Hitemset"); // number or [name] Shift-click form |color|Hitemset:itemset_id|h[name]|h|r
+ if (!id)
+ return false;
+
+ uint32 itemSetId = atol(id);
+
+ // prevent generation all items with itemset field value '0'
+ if (itemSetId == 0)
+ {
+ handler->PSendSysMessage(LANG_NO_ITEMS_FROM_ITEMSET_FOUND, itemSetId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ Player* player = handler->GetSession()->GetPlayer();
+ Player* playerTarget = handler->getSelectedPlayer();
+ if (!playerTarget)
+ playerTarget = player;
+
+ sLog->outDetail(handler->GetTrinityString(LANG_ADDITEMSET), itemSetId);
+
+ bool found = false;
+ ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore();
+ for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr)
+ {
+ if (itr->second.ItemSet == itemSetId)
+ {
+ found = true;
+ ItemPosCountVec dest;
+ InventoryResult msg = playerTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itr->second.ItemId, 1);
+ if (msg == EQUIP_ERR_OK)
+ {
+ Item* item = playerTarget->StoreNewItem(dest, itr->second.ItemId, true);
+
+ // remove binding (let GM give it to another player later)
+ if (player == playerTarget)
+ item->SetBinding(false);
+
+ player->SendNewItem(item, 1, false, true);
+ if (player != playerTarget)
+ playerTarget->SendNewItem(item, 1, true, false);
+ }
+ else
+ {
+ player->SendEquipError(msg, NULL, NULL, itr->second.ItemId);
+ handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itr->second.ItemId, 1);
+ }
+ }
+ }
+
+ if (!found)
+ {
+ handler->PSendSysMessage(LANG_NO_ITEMS_FROM_ITEMSET_FOUND, itemSetId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ return true;
+ }
+
+ static bool HandleBankCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ handler->GetSession()->SendShowBank(handler->GetSession()->GetPlayer()->GetGUID());
+ return true;
+ }
+
+ static bool HandleChangeWeather(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ // Weather is OFF
+ if (!sWorld->getBoolConfig(CONFIG_WEATHER))
+ {
+ handler->SendSysMessage(LANG_WEATHER_DISABLED);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ // *Change the weather of a cell
+ char const* px = strtok((char*)args, " ");
+ char const* py = strtok(NULL, " ");
+
+ if (!px || !py)
+ return false;
+
+ uint32 type = uint32(atoi(px)); //0 to 3, 0: fine, 1: rain, 2: snow, 3: sand
+ float grade = float(atof(py)); //0 to 1, sending -1 is instand good weather
+
+ Player* player = handler->GetSession()->GetPlayer();
+ uint32 zoneid = player->GetZoneId();
+
+ Weather* weather = WeatherMgr::FindWeather(zoneid);
+
+ if (!weather)
+ weather = WeatherMgr::AddWeather(zoneid);
+ if (!weather)
+ {
+ handler->SendSysMessage(LANG_NO_WEATHER);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ weather->SetWeather(WeatherType(type), grade);
+
+ return true;
+ }
+
+
+ static bool HandleMaxSkillCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ Player* SelectedPlayer = handler->getSelectedPlayer();
+ if (!SelectedPlayer)
+ {
+ handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ // each skills that have max skill value dependent from level seted to current level max skill value
+ SelectedPlayer->UpdateSkillsToMaxSkillsForLevel();
+ return true;
+ }
+
+ static bool HandleSetSkillCommand(ChatHandler* handler, char const* args)
+ {
+ // number or [name] Shift-click form |color|Hskill:skill_id|h[name]|h|r
+ char const* skillStr = handler->extractKeyFromLink((char*)args, "Hskill");
+ if (!skillStr)
+ return false;
+
+ char const* levelStr = strtok(NULL, " ");
+ if (!levelStr)
+ return false;
+
+ char const* maxPureSkill = strtok(NULL, " ");
+
+ int32 skill = atoi(skillStr);
+ if (skill <= 0)
+ {
+ handler->PSendSysMessage(LANG_INVALID_SKILL_ID, skill);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ int32 level = uint32(atol(levelStr));
+
+ Player* target = handler->getSelectedPlayer();
+ if (!target)
+ {
+ handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ SkillLineEntry const* skillLine = sSkillLineStore.LookupEntry(skill);
+ if (!skillLine)
+ {
+ handler->PSendSysMessage(LANG_INVALID_SKILL_ID, skill);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ std::string tNameLink = handler->GetNameLink(target);
+
+ if (!target->GetSkillValue(skill))
+ {
+ handler->PSendSysMessage(LANG_SET_SKILL_ERROR, tNameLink.c_str(), skill, skillLine->name[handler->GetSessionDbcLocale()]);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ uint16 max = maxPureSkill ? atol (maxPureSkill) : target->GetPureMaxSkillValue(skill);
+
+ if (level <= 0 || level > max || max <= 0)
+ return false;
+
+ target->SetSkill(skill, target->GetSkillStep(skill), level, max);
+ handler->PSendSysMessage(LANG_SET_SKILL, skill, skillLine->name[handler->GetSessionDbcLocale()], tNameLink.c_str(), level, max);
+
+ return true;
+ }
+ // show info of player
+ static bool HandlePInfoCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target;
+ uint64 targetGuid;
+ std::string targetName;
+
+ uint32 parseGUID = MAKE_NEW_GUID(atol((char*)args), 0, HIGHGUID_PLAYER);
+
+ if (sObjectMgr->GetPlayerNameByGUID(parseGUID, targetName))
+ {
+ target = sObjectMgr->GetPlayerByLowGUID(parseGUID);
+ targetGuid = parseGUID;
+ }
+ else if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName))
+ return false;
+
+ uint32 accId = 0;
+ uint32 money = 0;
+ uint32 totalPlayerTime = 0;
+ uint8 level = 0;
+ uint32 latency = 0;
+ uint8 race;
+ uint8 Class;
+ int64 muteTime = 0;
+ int64 banTime = -1;
+ uint32 mapId;
+ uint32 areaId;
+ uint32 phase = 0;
+
+ // get additional information from Player object
+ if (target)
+ {
+ // check online security
+ if (handler->HasLowerSecurity(target, 0))
+ return false;
+
+ accId = target->GetSession()->GetAccountId();
+ money = target->GetMoney();
+ totalPlayerTime = target->GetTotalPlayedTime();
+ level = target->getLevel();
+ latency = target->GetSession()->GetLatency();
+ race = target->getRace();
+ Class = target->getClass();
+ muteTime = target->GetSession()->m_muteTime;
+ mapId = target->GetMapId();
+ areaId = target->GetAreaId();
+ phase = target->GetPhaseMask();
+ }
+ // get additional information from DB
+ else
+ {
+ // check offline security
+ if (handler->HasLowerSecurity(NULL, targetGuid))
+ return false;
+
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PINFO);
+ stmt->setUInt32(0, GUID_LOPART(targetGuid));
+ PreparedQueryResult result = CharacterDatabase.Query(stmt);
+
+ if (!result)
+ return false;
+
+ Field* fields = result->Fetch();
+ totalPlayerTime = fields[0].GetUInt32();
+ level = fields[1].GetUInt8();
+ money = fields[2].GetUInt32();
+ accId = fields[3].GetUInt32();
+ race = fields[4].GetUInt8();
+ Class = fields[5].GetUInt8();
+ mapId = fields[6].GetUInt16();
+ areaId = fields[7].GetUInt16();
+ }
+
+ std::string userName = handler->GetTrinityString(LANG_ERROR);
+ std::string eMail = handler->GetTrinityString(LANG_ERROR);
+ std::string lastIp = handler->GetTrinityString(LANG_ERROR);
+ uint32 security = 0;
+ std::string lastLogin = handler->GetTrinityString(LANG_ERROR);
+
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PINFO);
+ stmt->setInt32(0, int32(realmID));
+ stmt->setUInt32(1, accId);
+ PreparedQueryResult result = LoginDatabase.Query(stmt);
+
+ if (result)
+ {
+ Field* fields = result->Fetch();
+ userName = fields[0].GetString();
+ security = fields[1].GetUInt8();
+ eMail = fields[2].GetString();
+ muteTime = fields[5].GetUInt64();
+
+ if (eMail.empty())
+ eMail = "-";
+
+ if (!handler->GetSession() || handler->GetSession()->GetSecurity() >= AccountTypes(security))
+ {
+ lastIp = fields[3].GetString();
+ lastLogin = fields[4].GetString();
+
+ uint32 ip = inet_addr(lastIp.c_str());
+#if TRINITY_ENDIAN == BIGENDIAN
+ EndianConvertReverse(ip);
+#endif
+
+ PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_IP2NATION_COUNTRY);
+
+ stmt->setUInt32(0, ip);
+
+ PreparedQueryResult result2 = WorldDatabase.Query(stmt);
+
+ if (result2)
+ {
+ Field* fields2 = result2->Fetch();
+ lastIp.append(" (");
+ lastIp.append(fields2[0].GetString());
+ lastIp.append(")");
+ }
+ }
+ else
+ {
+ lastIp = "-";
+ lastLogin = "-";
+ }
+ }
+
+ std::string nameLink = handler->playerLink(targetName);
+
+ handler->PSendSysMessage(LANG_PINFO_ACCOUNT, (target ? "" : handler->GetTrinityString(LANG_OFFLINE)), nameLink.c_str(), GUID_LOPART(targetGuid), userName.c_str(), accId, eMail.c_str(), security, lastIp.c_str(), lastLogin.c_str(), latency);
+
+ std::string bannedby = "unknown";
+ std::string banreason = "";
+
+ stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PINFO_BANS);
+ stmt->setUInt32(0, accId);
+ PreparedQueryResult result2 = LoginDatabase.Query(stmt);
+ if (!result2)
+ {
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_BANS);
+ stmt->setUInt32(0, GUID_LOPART(targetGuid));
+ result2 = CharacterDatabase.Query(stmt);
+ }
+
+ if (result2)
+ {
+ Field* fields = result2->Fetch();
+ banTime = int64(fields[1].GetBool() ? 0 : fields[0].GetUInt32());
+ bannedby = fields[2].GetString();
+ banreason = fields[3].GetString();
+ }
+
+ if (muteTime > 0)
+ handler->PSendSysMessage(LANG_PINFO_MUTE, secsToTimeString(muteTime - time(NULL), true).c_str());
+
+ if (banTime >= 0)
+ handler->PSendSysMessage(LANG_PINFO_BAN, banTime > 0 ? secsToTimeString(banTime - time(NULL), true).c_str() : "permanently", bannedby.c_str(), banreason.c_str());
+
+ std::string raceStr, ClassStr;
+ switch (race)
+ {
+ case RACE_HUMAN:
+ raceStr = "Human";
+ break;
+ case RACE_ORC:
+ raceStr = "Orc";
+ break;
+ case RACE_DWARF:
+ raceStr = "Dwarf";
+ break;
+ case RACE_NIGHTELF:
+ raceStr = "Night Elf";
+ break;
+ case RACE_UNDEAD_PLAYER:
+ raceStr = "Undead";
+ break;
+ case RACE_TAUREN:
+ raceStr = "Tauren";
+ break;
+ case RACE_GNOME:
+ raceStr = "Gnome";
+ break;
+ case RACE_TROLL:
+ raceStr = "Troll";
+ break;
+ case RACE_BLOODELF:
+ raceStr = "Blood Elf";
+ break;
+ case RACE_DRAENEI:
+ raceStr = "Draenei";
+ break;
+ }
+
+ switch (Class)
+ {
+ case CLASS_WARRIOR:
+ ClassStr = "Warrior";
+ break;
+ case CLASS_PALADIN:
+ ClassStr = "Paladin";
+ break;
+ case CLASS_HUNTER:
+ ClassStr = "Hunter";
+ break;
+ case CLASS_ROGUE:
+ ClassStr = "Rogue";
+ break;
+ case CLASS_PRIEST:
+ ClassStr = "Priest";
+ break;
+ case CLASS_DEATH_KNIGHT:
+ ClassStr = "Death Knight";
+ break;
+ case CLASS_SHAMAN:
+ ClassStr = "Shaman";
+ break;
+ case CLASS_MAGE:
+ ClassStr = "Mage";
+ break;
+ case CLASS_WARLOCK:
+ ClassStr = "Warlock";
+ break;
+ case CLASS_DRUID:
+ ClassStr = "Druid";
+ break;
+ }
+
+ std::string timeStr = secsToTimeString(totalPlayerTime, true, true);
+ uint32 gold = money /GOLD;
+ uint32 silv = (money % GOLD) / SILVER;
+ uint32 copp = (money % GOLD) % SILVER;
+ handler->PSendSysMessage(LANG_PINFO_LEVEL, raceStr.c_str(), ClassStr.c_str(), timeStr.c_str(), level, gold, silv, copp);
+
+ // Add map, zone, subzone and phase to output
+ int locale = handler->GetSessionDbcLocale();
+ std::string areaName = "<unknown>";
+ std::string zoneName = "";
+
+ MapEntry const* map = sMapStore.LookupEntry(mapId);
+
+ AreaTableEntry const* area = GetAreaEntryByAreaID(areaId);
+ if (area)
+ {
+ areaName = area->area_name[locale];
+
+ AreaTableEntry const* zone = GetAreaEntryByAreaID(area->zone);
+ if (zone)
+ zoneName = zone->area_name[locale];
+ }
+
+ if (target)
+ {
+ if (!zoneName.empty())
+ handler->PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name[locale], zoneName.c_str(), areaName.c_str(), phase);
+ else
+ handler->PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name[locale], areaName.c_str(), "<unknown>", phase);
+ }
+ else
+ handler->PSendSysMessage(LANG_PINFO_MAP_OFFLINE, map->name[locale], areaName.c_str());
+
+ return true;
+ }
+
+ static bool HandleRespawnCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ Player* player = handler->GetSession()->GetPlayer();
+
+ // accept only explicitly selected target (not implicitly self targeting case)
+ Unit* target = handler->getSelectedUnit();
+ if (player->GetSelection() && target)
+ {
+ if (target->GetTypeId() != TYPEID_UNIT || target->isPet())
+ {
+ handler->SendSysMessage(LANG_SELECT_CREATURE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (target->isDead())
+ target->ToCreature()->Respawn();
+ return true;
+ }
+
+ CellCoord p(Trinity::ComputeCellCoord(player->GetPositionX(), player->GetPositionY()));
+ Cell cell(p);
+ cell.SetNoCreate();
+
+ Trinity::RespawnDo u_do;
+ Trinity::WorldObjectWorker<Trinity::RespawnDo> worker(player, u_do);
+
+ TypeContainerVisitor<Trinity::WorldObjectWorker<Trinity::RespawnDo>, GridTypeMapContainer > obj_worker(worker);
+ cell.Visit(p, obj_worker, *player->GetMap(), *player, player->GetGridActivationRange());
+
+ return true;
+ }
+ // mute player for some times
+ static bool HandleMuteCommand(ChatHandler* handler, char const* args)
+ {
+ char* nameStr;
+ char* delayStr;
+ handler->extractOptFirstArg((char*)args, &nameStr, &delayStr);
+ if (!delayStr)
+ return false;
+
+ char const* muteReason = strtok(NULL, "\r");
+ std::string muteReasonStr = "No reason";
+ if (muteReason != NULL)
+ muteReasonStr = muteReason;
+
+ Player* target;
+ uint64 targetGuid;
+ std::string targetName;
+ if (!handler->extractPlayerTarget(nameStr, &target, &targetGuid, &targetName))
+ return false;
+
+ uint32 accountId = target ? target->GetSession()->GetAccountId() : sObjectMgr->GetPlayerAccountIdByGUID(targetGuid);
+
+ // find only player from same account if any
+ if (!target)
+ if (WorldSession* session = sWorld->FindSession(accountId))
+ target = session->GetPlayer();
+
+ uint32 notSpeakTime = uint32(atoi(delayStr));
+
+ // must have strong lesser security level
+ if (handler->HasLowerSecurity (target, targetGuid, true))
+ return false;
+
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME);
+
+ if (target)
+ {
+ // Target is online, mute will be in effect right away.
+ int64 muteTime = time(NULL) + notSpeakTime * MINUTE;
+ target->GetSession()->m_muteTime = muteTime;
+ stmt->setInt64(0, muteTime);
+ ChatHandler(target).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notSpeakTime, muteReasonStr.c_str());
+ }
+ else
+ {
+ // Target is offline, mute will be in effect starting from the next login.
+ int32 muteTime = -int32(notSpeakTime * MINUTE);
+ stmt->setInt64(0, muteTime);
+ }
+
+ stmt->setUInt32(1, accountId);
+ LoginDatabase.Execute(stmt);
+ std::string nameLink = handler->playerLink(targetName);
+
+ handler->PSendSysMessage(target ? LANG_YOU_DISABLE_CHAT : LANG_COMMAND_DISABLE_CHAT_DELAYED, nameLink.c_str(), notSpeakTime, muteReasonStr.c_str());
+
+ return true;
+ }
+
+ // unmute player
+ static bool HandleUnmuteCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target;
+ uint64 targetGuid;
+ std::string targetName;
+ if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName))
+ return false;
+
+ uint32 accountId = target ? target->GetSession()->GetAccountId() : sObjectMgr->GetPlayerAccountIdByGUID(targetGuid);
+
+ // find only player from same account if any
+ if (!target)
+ if (WorldSession* session = sWorld->FindSession(accountId))
+ target = session->GetPlayer();
+
+ // must have strong lesser security level
+ if (handler->HasLowerSecurity (target, targetGuid, true))
+ return false;
+
+ if (target)
+ {
+ if (target->CanSpeak())
+ {
+ handler->SendSysMessage(LANG_CHAT_ALREADY_ENABLED);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ target->GetSession()->m_muteTime = 0;
+ }
+
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME);
+ stmt->setInt64(0, 0);
+ stmt->setUInt32(1, accountId);
+ LoginDatabase.Execute(stmt);
+
+ if (target)
+ ChatHandler(target).PSendSysMessage(LANG_YOUR_CHAT_ENABLED);
+
+ std::string nameLink = handler->playerLink(targetName);
+
+ handler->PSendSysMessage(LANG_YOU_ENABLE_CHAT, nameLink.c_str());
+
+ return true;
+ }
+
+
+ static bool HandleMovegensCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ Unit* unit = handler->getSelectedUnit();
+ if (!unit)
+ {
+ handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage(LANG_MOVEGENS_LIST, (unit->GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature"), unit->GetGUIDLow());
+
+ MotionMaster* motionMaster = unit->GetMotionMaster();
+ float x, y, z;
+ motionMaster->GetDestination(x, y, z);
+
+ for (uint8 i = 0; i < MAX_MOTION_SLOT; ++i)
+ {
+ MovementGenerator* movementGenerator = motionMaster->GetMotionSlot(i);
+ if (!movementGenerator)
+ {
+ handler->SendSysMessage("Empty");
+ continue;
+ }
+
+ switch (movementGenerator->GetMovementGeneratorType())
+ {
+ case IDLE_MOTION_TYPE:
+ handler->SendSysMessage(LANG_MOVEGENS_IDLE);
+ break;
+ case RANDOM_MOTION_TYPE:
+ handler->SendSysMessage(LANG_MOVEGENS_RANDOM);
+ break;
+ case WAYPOINT_MOTION_TYPE:
+ handler->SendSysMessage(LANG_MOVEGENS_WAYPOINT);
+ break;
+ case ANIMAL_RANDOM_MOTION_TYPE:
+ handler->SendSysMessage(LANG_MOVEGENS_ANIMAL_RANDOM);
+ break;
+ case CONFUSED_MOTION_TYPE:
+ handler->SendSysMessage(LANG_MOVEGENS_CONFUSED);
+ break;
+ case CHASE_MOTION_TYPE:
+ {
+ Unit* target = NULL;
+ if (unit->GetTypeId() == TYPEID_PLAYER)
+ target = static_cast<ChaseMovementGenerator<Player> const*>(movementGenerator)->GetTarget();
+ else
+ target = static_cast<ChaseMovementGenerator<Creature> const*>(movementGenerator)->GetTarget();
+
+ if (!target)
+ handler->SendSysMessage(LANG_MOVEGENS_CHASE_NULL);
+ else if (target->GetTypeId() == TYPEID_PLAYER)
+ handler->PSendSysMessage(LANG_MOVEGENS_CHASE_PLAYER, target->GetName(), target->GetGUIDLow());
+ else
+ handler->PSendSysMessage(LANG_MOVEGENS_CHASE_CREATURE, target->GetName(), target->GetGUIDLow());
+ break;
+ }
+ case FOLLOW_MOTION_TYPE:
+ {
+ Unit* target = NULL;
+ if (unit->GetTypeId() == TYPEID_PLAYER)
+ target = static_cast<FollowMovementGenerator<Player> const*>(movementGenerator)->GetTarget();
+ else
+ target = static_cast<FollowMovementGenerator<Creature> const*>(movementGenerator)->GetTarget();
+
+ if (!target)
+ handler->SendSysMessage(LANG_MOVEGENS_FOLLOW_NULL);
+ else if (target->GetTypeId() == TYPEID_PLAYER)
+ handler->PSendSysMessage(LANG_MOVEGENS_FOLLOW_PLAYER, target->GetName(), target->GetGUIDLow());
+ else
+ handler->PSendSysMessage(LANG_MOVEGENS_FOLLOW_CREATURE, target->GetName(), target->GetGUIDLow());
+ break;
+ }
+ case HOME_MOTION_TYPE:
+ {
+ if (unit->GetTypeId() == TYPEID_UNIT)
+ handler->PSendSysMessage(LANG_MOVEGENS_HOME_CREATURE, x, y, z);
+ else
+ handler->SendSysMessage(LANG_MOVEGENS_HOME_PLAYER);
+ break;
+ }
+ case FLIGHT_MOTION_TYPE:
+ handler->SendSysMessage(LANG_MOVEGENS_FLIGHT);
+ break;
+ case POINT_MOTION_TYPE:
+ {
+ handler->PSendSysMessage(LANG_MOVEGENS_POINT, x, y, z);
+ break;
+ }
+ case FLEEING_MOTION_TYPE:
+ handler->SendSysMessage(LANG_MOVEGENS_FEAR);
+ break;
+ case DISTRACT_MOTION_TYPE:
+ handler->SendSysMessage(LANG_MOVEGENS_DISTRACT);
+ break;
+ case EFFECT_MOTION_TYPE:
+ handler->SendSysMessage(LANG_MOVEGENS_EFFECT);
+ break;
+ default:
+ handler->PSendSysMessage(LANG_MOVEGENS_UNKNOWN, movementGenerator->GetMovementGeneratorType());
+ break;
+ }
+ }
+ return true;
+ }
+ /*
+ ComeToMe command REQUIRED for 3rd party scripting library to have access to PointMovementGenerator
+ Without this function 3rd party scripting library will get linking errors (unresolved external)
+ when attempting to use the PointMovementGenerator
+ */
+ static bool HandleComeToMeCommand(ChatHandler* handler, char const* args)
+ {
+ char const* newFlagStr = strtok((char*)args, " ");
+ if (!newFlagStr)
+ return false;
+
+ Creature* caster = handler->getSelectedCreature();
+ if (!caster)
+ {
+ handler->SendSysMessage(LANG_SELECT_CREATURE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ Player* player = handler->GetSession()->GetPlayer();
+
+ caster->GetMotionMaster()->MovePoint(0, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ());
+
+ return true;
+ }
+
+ static bool HandleDamageCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ Unit* target = handler->getSelectedUnit();
+ if (!target || !handler->GetSession()->GetPlayer()->GetSelection())
+ {
+ handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (target->GetTypeId() == TYPEID_PLAYER)
+ {
+ if (handler->HasLowerSecurity((Player*)target, 0, false))
+ return false;
+ }
+
+ if (!target->isAlive())
+ return true;
+
+ char* damageStr = strtok((char*)args, " ");
+ if (!damageStr)
+ return false;
+
+ int32 damage_int = atoi((char*)damageStr);
+ if (damage_int <= 0)
+ return true;
+
+ uint32 damage = damage_int;
+
+ char* schoolStr = strtok((char*)NULL, " ");
+
+ // flat melee damage without resistence/etc reduction
+ if (!schoolStr)
+ {
+ handler->GetSession()->GetPlayer()->DealDamage(target, damage, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ if (target != handler->GetSession()->GetPlayer())
+ handler->GetSession()->GetPlayer()->SendAttackStateUpdate (HITINFO_AFFECTS_VICTIM, target, 1, SPELL_SCHOOL_MASK_NORMAL, damage, 0, 0, VICTIMSTATE_HIT, 0);
+ return true;
+ }
+
+ uint32 school = schoolStr ? atoi((char*)schoolStr) : SPELL_SCHOOL_NORMAL;
+ if (school >= MAX_SPELL_SCHOOL)
+ return false;
+
+ SpellSchoolMask schoolmask = SpellSchoolMask(1 << school);
+
+ if (Unit::IsDamageReducedByArmor(schoolmask))
+ damage = handler->GetSession()->GetPlayer()->CalcArmorReducedDamage(target, damage, NULL, BASE_ATTACK);
+
+ char* spellStr = strtok((char*)NULL, " ");
+
+ // melee damage by specific school
+ if (!spellStr)
+ {
+ uint32 absorb = 0;
+ uint32 resist = 0;
+
+ handler->GetSession()->GetPlayer()->CalcAbsorbResist(target, schoolmask, SPELL_DIRECT_DAMAGE, damage, &absorb, &resist);
+
+ if (damage <= absorb + resist)
+ return true;
+
+ damage -= absorb + resist;
+
+ handler->GetSession()->GetPlayer()->DealDamageMods(target, damage, &absorb);
+ handler->GetSession()->GetPlayer()->DealDamage(target, damage, NULL, DIRECT_DAMAGE, schoolmask, NULL, false);
+ handler->GetSession()->GetPlayer()->SendAttackStateUpdate (HITINFO_AFFECTS_VICTIM, target, 1, schoolmask, damage, absorb, resist, VICTIMSTATE_HIT, 0);
+ return true;
+ }
+
+ // non-melee damage
+
+ // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form
+ uint32 spellid = handler->extractSpellIdFromLink((char*)args);
+ if (!spellid || !sSpellMgr->GetSpellInfo(spellid))
+ return false;
+
+ handler->GetSession()->GetPlayer()->SpellNonMeleeDamageLog(target, spellid, damage);
+ return true;
+ }
+
+ static bool HandleCombatStopCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target = NULL;
+
+ if (args && strlen(args) > 0)
+ {
+ target = sObjectAccessor->FindPlayerByName(args);
+ if (!target)
+ {
+ handler->SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ }
+
+ if (!target)
+ {
+ if (!handler->extractPlayerTarget((char*)args, &target))
+ return false;
+ }
+
+ // check online security
+ if (handler->HasLowerSecurity(target, 0))
+ return false;
+
+ target->CombatStop();
+ target->getHostileRefManager().deleteReferences();
+ return true;
+ }
+
+ static bool HandleFlushArenaPointsCommand(ChatHandler* /*handler*/, char const* /*args*/)
+ {
+ sArenaTeamMgr->DistributeArenaPoints();
+ return true;
+ }
+
+ static bool HandleRepairitemsCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target;
+ if (!handler->extractPlayerTarget((char*)args, &target))
+ return false;
+
+ // check online security
+ if (handler->HasLowerSecurity(target, 0))
+ return false;
+
+ // Repair items
+ target->DurabilityRepairAll(false, 0, false);
+
+ handler->PSendSysMessage(LANG_YOU_REPAIR_ITEMS, handler->GetNameLink(target).c_str());
+ if (handler->needReportToTarget(target))
+ ChatHandler(target).PSendSysMessage(LANG_YOUR_ITEMS_REPAIRED, handler->GetNameLink().c_str());
+
+ return true;
+ }
+
+ static bool HandleWaterwalkCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ Player* player = handler->getSelectedPlayer();
+ if (!player)
+ {
+ handler->PSendSysMessage(LANG_NO_CHAR_SELECTED);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ // check online security
+ if (handler->HasLowerSecurity(player, 0))
+ return false;
+
+ if (strncmp(args, "on", 3) == 0)
+ player->SetMovement(MOVE_WATER_WALK); // ON
+ else if (strncmp(args, "off", 4) == 0)
+ player->SetMovement(MOVE_LAND_WALK); // OFF
+ else
+ {
+ handler->SendSysMessage(LANG_USE_BOL);
+ return false;
+ }
+
+ handler->PSendSysMessage(LANG_YOU_SET_WATERWALK, args, handler->GetNameLink(player).c_str());
+ if (handler->needReportToTarget(player))
+ ChatHandler(player).PSendSysMessage(LANG_YOUR_WATERWALK_SET, args, handler->GetNameLink().c_str());
+ return true;
+ }
+
+ // Send mail by command
+ static bool HandleSendMailCommand(ChatHandler* handler, char const* args)
+ {
+ // format: name "subject text" "mail text"
+ Player* target;
+ uint64 targetGuid;
+ std::string targetName;
+ if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName))
+ return false;
+
+ char* tail1 = strtok(NULL, "");
+ if (!tail1)
+ return false;
+
+ char const* msgSubject = handler->extractQuotedArg(tail1);
+ if (!msgSubject)
+ return false;
+
+ char* tail2 = strtok(NULL, "");
+ if (!tail2)
+ return false;
+
+ char const* msgText = handler->extractQuotedArg(tail2);
+ if (!msgText)
+ return false;
+
+ // msgSubject, msgText isn't NUL after prev. check
+ std::string subject = msgSubject;
+ std::string text = msgText;
+
+ // from console show not existed sender
+ MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
+
+ //- TODO: Fix poor design
+ SQLTransaction trans = CharacterDatabase.BeginTransaction();
+ MailDraft(subject, text)
+ .SendMailTo(trans, MailReceiver(target, GUID_LOPART(targetGuid)), sender);
+
+ CharacterDatabase.CommitTransaction(trans);
+
+ std::string nameLink = handler->playerLink(targetName);
+ handler->PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str());
+ return true;
+ }
+ // Send items by mail
+ static bool HandleSendItemsCommand(ChatHandler* handler, char const* args)
+ {
+ // format: name "subject text" "mail text" item1[:count1] item2[:count2] ... item12[:count12]
+ Player* receiver;
+ uint64 receiverGuid;
+ std::string receiverName;
+ if (!handler->extractPlayerTarget((char*)args, &receiver, &receiverGuid, &receiverName))
+ return false;
+
+ char* tail1 = strtok(NULL, "");
+ if (!tail1)
+ return false;
+
+ char const* msgSubject = handler->extractQuotedArg(tail1);
+ if (!msgSubject)
+ return false;
+
+ char* tail2 = strtok(NULL, "");
+ if (!tail2)
+ return false;
+
+ char const* msgText = handler->extractQuotedArg(tail2);
+ if (!msgText)
+ return false;
+
+ // msgSubject, msgText isn't NUL after prev. check
+ std::string subject = msgSubject;
+ std::string text = msgText;
+
+ // extract items
+ typedef std::pair<uint32, uint32> ItemPair;
+ typedef std::list< ItemPair > ItemPairs;
+ ItemPairs items;
+
+ // get all tail string
+ char* tail = strtok(NULL, "");
+
+ // get from tail next item str
+ while (char* itemStr = strtok(tail, " "))
+ {
+ // and get new tail
+ tail = strtok(NULL, "");
+
+ // parse item str
+ char const* itemIdStr = strtok(itemStr, ":");
+ char const* itemCountStr = strtok(NULL, " ");
+
+ uint32 itemId = atoi(itemIdStr);
+ if (!itemId)
+ return false;
+
+ ItemTemplate const* item_proto = sObjectMgr->GetItemTemplate(itemId);
+ if (!item_proto)
+ {
+ handler->PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ uint32 itemCount = itemCountStr ? atoi(itemCountStr) : 1;
+ if (itemCount < 1 || (item_proto->MaxCount > 0 && itemCount > uint32(item_proto->MaxCount)))
+ {
+ handler->PSendSysMessage(LANG_COMMAND_INVALID_ITEM_COUNT, itemCount, itemId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ while (itemCount > item_proto->GetMaxStackSize())
+ {
+ items.push_back(ItemPair(itemId, item_proto->GetMaxStackSize()));
+ itemCount -= item_proto->GetMaxStackSize();
+ }
+
+ items.push_back(ItemPair(itemId, itemCount));
+
+ if (items.size() > MAX_MAIL_ITEMS)
+ {
+ handler->PSendSysMessage(LANG_COMMAND_MAIL_ITEMS_LIMIT, MAX_MAIL_ITEMS);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ }
+
+ // from console show not existed sender
+ MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
+
+ // fill mail
+ MailDraft draft(subject, text);
+
+ SQLTransaction trans = CharacterDatabase.BeginTransaction();
+
+ for (ItemPairs::const_iterator itr = items.begin(); itr != items.end(); ++itr)
+ {
+ if (Item* item = Item::CreateItem(itr->first, itr->second, handler->GetSession() ? handler->GetSession()->GetPlayer() : 0))
+ {
+ item->SaveToDB(trans); // save for prevent lost at next mail load, if send fail then item will deleted
+ draft.AddItem(item);
+ }
+ }
+
+ draft.SendMailTo(trans, MailReceiver(receiver, GUID_LOPART(receiverGuid)), sender);
+ CharacterDatabase.CommitTransaction(trans);
+
+ std::string nameLink = handler->playerLink(receiverName);
+ handler->PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str());
+ return true;
+ }
+ /// Send money by mail
+ static bool HandleSendMoneyCommand(ChatHandler* handler, char const* args)
+ {
+ /// format: name "subject text" "mail text" money
+
+ Player* receiver;
+ uint64 receiverGuid;
+ std::string receiverName;
+ if (!handler->extractPlayerTarget((char*)args, &receiver, &receiverGuid, &receiverName))
+ return false;
+
+ char* tail1 = strtok(NULL, "");
+ if (!tail1)
+ return false;
+
+ char* msgSubject = handler->extractQuotedArg(tail1);
+ if (!msgSubject)
+ return false;
+
+ char* tail2 = strtok(NULL, "");
+ if (!tail2)
+ return false;
+
+ char* msgText = handler->extractQuotedArg(tail2);
+ if (!msgText)
+ return false;
+
+ char* moneyStr = strtok(NULL, "");
+ int32 money = moneyStr ? atoi(moneyStr) : 0;
+ if (money <= 0)
+ return false;
+
+ // msgSubject, msgText isn't NUL after prev. check
+ std::string subject = msgSubject;
+ std::string text = msgText;
+
+ // from console show not existed sender
+ MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
+
+ SQLTransaction trans = CharacterDatabase.BeginTransaction();
+
+ MailDraft(subject, text)
+ .AddMoney(money)
+ .SendMailTo(trans, MailReceiver(receiver, GUID_LOPART(receiverGuid)), sender);
+
+ CharacterDatabase.CommitTransaction(trans);
+
+ std::string nameLink = handler->playerLink(receiverName);
+ handler->PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str());
+ return true;
+ }
+ /// Send a message to a player in game
+ static bool HandleSendMessageCommand(ChatHandler* handler, char const* args)
+ {
+ /// - Find the player
+ Player* player;
+ if (!handler->extractPlayerTarget((char*)args, &player))
+ return false;
+
+ char* msgStr = strtok(NULL, "");
+ if (!msgStr)
+ return false;
+
+ ///- Check that he is not logging out.
+ if (player->GetSession()->isLogingOut())
+ {
+ handler->SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ /// - Send the message
+ // Use SendAreaTriggerMessage for fastest delivery.
+ player->GetSession()->SendAreaTriggerMessage("%s", msgStr);
+ player->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r");
+
+ // Confirmation message
+ std::string nameLink = handler->GetNameLink(player);
+ handler->PSendSysMessage(LANG_SENDMESSAGE, nameLink.c_str(), msgStr);
+
+ return true;
+ }
+
+ static bool HandleCreatePetCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ Player* player = handler->GetSession()->GetPlayer();
+ Creature* creatureTarget = handler->getSelectedCreature();
+
+ if (!creatureTarget || creatureTarget->isPet() || creatureTarget->GetTypeId() == TYPEID_PLAYER)
+ {
+ handler->PSendSysMessage(LANG_SELECT_CREATURE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ CreatureTemplate const* creatrueTemplate = sObjectMgr->GetCreatureTemplate(creatureTarget->GetEntry());
+ // Creatures with family 0 crashes the server
+ if (!creatrueTemplate->family)
+ {
+ handler->PSendSysMessage("This creature cannot be tamed. (family id: 0).");
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (player->GetPetGUID())
+ {
+ handler->PSendSysMessage("You already have a pet");
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ // Everything looks OK, create new pet
+ Pet* pet = new Pet(player, HUNTER_PET);
+ if (!pet->CreateBaseAtCreature(creatureTarget))
+ {
+ delete pet;
+ handler->PSendSysMessage("Error 1");
+ return false;
+ }
+
+ creatureTarget->setDeathState(JUST_DIED);
+ creatureTarget->RemoveCorpse();
+ creatureTarget->SetHealth(0); // just for nice GM-mode view
+
+ pet->SetUInt64Value(UNIT_FIELD_CREATEDBY, player->GetGUID());
+ pet->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, player->getFaction());
+
+ if (!pet->InitStatsForLevel(creatureTarget->getLevel()))
+ {
+ sLog->outError("InitStatsForLevel() in EffectTameCreature failed! Pet deleted.");
+ handler->PSendSysMessage("Error 2");
+ delete pet;
+ return false;
+ }
+
+ // prepare visual effect for levelup
+ pet->SetUInt32Value(UNIT_FIELD_LEVEL, creatureTarget->getLevel()-1);
+
+ pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
+ // this enables pet details window (Shift+P)
+ pet->InitPetCreateSpells();
+ pet->SetFullHealth();
+
+ pet->GetMap()->AddToMap(pet->ToCreature());
+
+ // visual effect for levelup
+ pet->SetUInt32Value(UNIT_FIELD_LEVEL, creatureTarget->getLevel());
+
+ player->SetMinion(pet, true);
+ pet->SavePetToDB(PET_SAVE_AS_CURRENT);
+ player->PetSpellInitialize();
+
+ return true;
+ }
+
+ static bool HandlePetLearnCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ Player* player = handler->GetSession()->GetPlayer();
+ Pet* pet = player->GetPet();
+
+ if (!pet)
+ {
+ handler->PSendSysMessage("You have no pet");
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ uint32 spellId = handler->extractSpellIdFromLink((char*)args);
+
+ if (!spellId || !sSpellMgr->GetSpellInfo(spellId))
+ return false;
+
+ // Check if pet already has it
+ if (pet->HasSpell(spellId))
+ {
+ handler->PSendSysMessage("Pet already has spell: %u", spellId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ // Check if spell is valid
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
+ if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo))
+ {
+ handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ pet->learnSpell(spellId);
+
+ handler->PSendSysMessage("Pet has learned spell %u", spellId);
+ return true;
+ }
+
+ static bool HandlePetUnlearnCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ Player* player = handler->GetSession()->GetPlayer();
+ Pet* pet = player->GetPet();
+ if (!pet)
+ {
+ handler->PSendSysMessage("You have no pet");
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ uint32 spellId = handler->extractSpellIdFromLink((char*)args);
+
+ if (pet->HasSpell(spellId))
+ pet->removeSpell(spellId, false);
+ else
+ handler->PSendSysMessage("Pet doesn't have that spell");
+
+ return true;
+ }
+
+ static bool HandleFreezeCommand(ChatHandler* handler, char const* args)
+ {
+ std::string name;
+ Player* player;
+ char const* TargetName = strtok((char*)args, " "); // get entered name
+ if (!TargetName) // if no name entered use target
+ {
+ player = handler->getSelectedPlayer();
+ if (player) //prevent crash with creature as target
+ {
+ name = player->GetName();
+ normalizePlayerName(name);
+ }
+ }
+ else // if name entered
+ {
+ name = TargetName;
+ normalizePlayerName(name);
+ player = sObjectAccessor->FindPlayerByName(name.c_str());
+ }
+
+ if (!player)
+ {
+ handler->SendSysMessage(LANG_COMMAND_FREEZE_WRONG);
+ return true;
+ }
+
+ if (player == handler->GetSession()->GetPlayer())
+ {
+ handler->SendSysMessage(LANG_COMMAND_FREEZE_ERROR);
+ return true;
+ }
+
+ // effect
+ if (player && (player != handler->GetSession()->GetPlayer()))
+ {
+ handler->PSendSysMessage(LANG_COMMAND_FREEZE, name.c_str());
+
+ // stop combat + make player unattackable + duel stop + stop some spells
+ player->setFaction(35);
+ player->CombatStop();
+ if (player->IsNonMeleeSpellCasted(true))
+ player->InterruptNonMeleeSpells(true);
+ player->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+
+ // if player class = hunter || warlock remove pet if alive
+ if ((player->getClass() == CLASS_HUNTER) || (player->getClass() == CLASS_WARLOCK))
+ {
+ if (Pet* pet = player->GetPet())
+ {
+ pet->SavePetToDB(PET_SAVE_AS_CURRENT);
+ // not let dismiss dead pet
+ if (pet && pet->isAlive())
+ player->RemovePet(pet, PET_SAVE_NOT_IN_SLOT);
+ }
+ }
+
+ if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(9454))
+ Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, player, player);
+
+ // save player
+ player->SaveToDB();
+ }
+
+ return true;
+ }
+
+ static bool HandleUnFreezeCommand(ChatHandler* handler, char const*args)
+ {
+ std::string name;
+ Player* player;
+ char* targetName = strtok((char*)args, " "); // Get entered name
+
+ if (targetName)
+ {
+ name = targetName;
+ normalizePlayerName(name);
+ player = sObjectAccessor->FindPlayerByName(name.c_str());
+ }
+ else // If no name was entered - use target
+ {
+ player = handler->getSelectedPlayer();
+ if (player)
+ name = player->GetName();
+ }
+
+ if (player)
+ {
+ handler->PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str());
+
+ // Reset player faction + allow combat + allow duels
+ player->setFactionForRace(player->getRace());
+ player->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+
+ // Remove Freeze spell (allowing movement and spells)
+ player->RemoveAurasDueToSpell(9454);
+
+ // Save player
+ player->SaveToDB();
+ }
+ else
+ {
+ if (targetName)
+ {
+ // Check for offline players
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_GUID_BY_NAME);
+ stmt->setString(0, name);
+ PreparedQueryResult result = CharacterDatabase.Query(stmt);
+
+ if (!result)
+ {
+ handler->SendSysMessage(LANG_COMMAND_FREEZE_WRONG);
+ return true;
+ }
+
+ // If player found: delete his freeze aura
+ Field* fields = result->Fetch();
+ uint32 lowGuid = fields[0].GetUInt32();
+
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA_FROZEN);
+ stmt->setUInt32(0, lowGuid);
+ CharacterDatabase.Execute(stmt);
+
+ handler->PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str());
+ return true;
+ }
+ else
+ {
+ handler->SendSysMessage(LANG_COMMAND_FREEZE_WRONG);
+ return true;
+ }
+ }
+
+ return true;
+ }
+
+ static bool HandleListFreezeCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ // Get names from DB
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_AURA_FROZEN);
+ PreparedQueryResult result = CharacterDatabase.Query(stmt);
+ if (!result)
+ {
+ handler->SendSysMessage(LANG_COMMAND_NO_FROZEN_PLAYERS);
+ return true;
+ }
+
+ // Header of the names
+ handler->PSendSysMessage(LANG_COMMAND_LIST_FREEZE);
+
+ // Output of the results
+ do
+ {
+ Field* fields = result->Fetch();
+ std::string player = fields[0].GetString();
+ handler->PSendSysMessage(LANG_COMMAND_FROZEN_PLAYERS, player.c_str());
+ }
+ while (result->NextRow());
+
+ return true;
+ }
+
+ static bool HandleGroupLeaderCommand(ChatHandler* handler, char const* args)
+ {
+ Player* player = NULL;
+ Group* group = NULL;
+ uint64 guid = 0;
+ char* nameStr = strtok((char*)args, " ");
+
+ if (handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid))
+ if (group && group->GetLeaderGUID() != guid)
+ {
+ group->ChangeLeader(guid);
+ group->SendUpdate();
+ }
+
+ return true;
+ }
+
+ static bool HandleGroupDisbandCommand(ChatHandler* handler, char const* args)
+ {
+ Player* player = NULL;
+ Group* group = NULL;
+ uint64 guid = 0;
+ char* nameStr = strtok((char*)args, " ");
+
+ if (handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid))
+ if (group)
+ group->Disband();
+
+ return true;
+ }
+
+ static bool HandleGroupRemoveCommand(ChatHandler* handler, char const* args)
+ {
+ Player* player = NULL;
+ Group* group = NULL;
+ uint64 guid = 0;
+ char* nameStr = strtok((char*)args, " ");
+
+ if (handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid, true))
+ if (group)
+ group->RemoveMember(guid);
+
+ return true;
+ }
+
+ static bool HandlePlayAllCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ uint32 soundId = atoi((char*)args);
+
+ if (!sSoundEntriesStore.LookupEntry(soundId))
+ {
+ handler->PSendSysMessage(LANG_SOUND_NOT_EXIST, soundId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ WorldPacket data(SMSG_PLAY_SOUND, 4);
+ data << uint32(soundId) << handler->GetSession()->GetPlayer()->GetGUID();
+ sWorld->SendGlobalMessage(&data);
+
+ handler->PSendSysMessage(LANG_COMMAND_PLAYED_TO_ALL, soundId);
+ return true;
+ }
+
+ static bool HandlePossessCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ Unit* unit = handler->getSelectedUnit();
+ if (!unit)
+ return false;
+
+ handler->GetSession()->GetPlayer()->CastSpell(unit, 530, true);
+ return true;
+ }
+
+ static bool HandleUnPossessCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ Unit* unit = handler->getSelectedUnit();
+ if (!unit)
+ unit = handler->GetSession()->GetPlayer();
+
+ unit->RemoveCharmAuras();
+
+ return true;
+ }
+
+ static bool HandleBindSightCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ Unit* unit = handler->getSelectedUnit();
+ if (!unit)
+ return false;
+
+ handler->GetSession()->GetPlayer()->CastSpell(unit, 6277, true);
+ return true;
+ }
+
+ static bool HandleUnbindSightCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ Player* player = handler->GetSession()->GetPlayer();
+
+ if (player->isPossessing())
+ return false;
+
+ player->StopCastingBindSight();
+ return true;
+ }
};
void AddSC_misc_commandscript()
diff --git a/src/server/scripts/Commands/cs_ticket.cpp b/src/server/scripts/Commands/cs_ticket.cpp new file mode 100644 index 00000000000..baaa5d2bd43 --- /dev/null +++ b/src/server/scripts/Commands/cs_ticket.cpp @@ -0,0 +1,509 @@ +/* + * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/> + * + * This program 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 2 of the License, or (at your + * option) any later version. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* ScriptData +Name: ticket_commandscript +%Complete: 100 +Comment: All ticket related commands +Category: commandscripts +EndScriptData */ + +#include "ScriptMgr.h" +#include "Chat.h" +#include "AccountMgr.h" +#include "ObjectMgr.h" +#include "TicketMgr.h" + +class ticket_commandscript : public CommandScript +{ +public: + ticket_commandscript() : CommandScript("ticket_commandscript") { } + + ChatCommand* GetCommands() const + { + static ChatCommand ticketResponseCommandTable[] = + { + { "append", SEC_MODERATOR, true, &HandleGMTicketResponseAppendCommand, "", NULL }, + { "appendln", SEC_MODERATOR, true, &HandleGMTicketResponseAppendLnCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; + static ChatCommand ticketCommandTable[] = + { + { "assign", SEC_GAMEMASTER, true, &HandleGMTicketAssignToCommand, "", NULL }, + { "close", SEC_MODERATOR, true, &HandleGMTicketCloseByIdCommand, "", NULL }, + { "closedlist", SEC_MODERATOR, true, &HandleGMTicketListClosedCommand, "", NULL }, + { "comment", SEC_MODERATOR, true, &HandleGMTicketCommentCommand, "", NULL }, + { "complete", SEC_MODERATOR, true, &HandleGMTicketCompleteCommand, "", NULL }, + { "delete", SEC_ADMINISTRATOR, true, &HandleGMTicketDeleteByIdCommand, "", NULL }, + { "escalate", SEC_MODERATOR, true, &HandleGMTicketEscalateCommand, "", NULL }, + { "escalatedlist", SEC_GAMEMASTER, true, &HandleGMTicketListEscalatedCommand, "", NULL }, + { "list", SEC_MODERATOR, true, &HandleGMTicketListCommand, "", NULL }, + { "onlinelist", SEC_MODERATOR, true, &HandleGMTicketListOnlineCommand, "", NULL }, + { "reset", SEC_ADMINISTRATOR, true, &HandleGMTicketResetCommand, "", NULL }, + { "response", SEC_MODERATOR, true, NULL, "", ticketResponseCommandTable }, + { "togglesystem", SEC_ADMINISTRATOR, true, &HandleToggleGMTicketSystem, "", NULL }, + { "unassign", SEC_GAMEMASTER, true, &HandleGMTicketUnAssignCommand, "", NULL }, + { "viewid", SEC_MODERATOR, true, &HandleGMTicketGetByIdCommand, "", NULL }, + { "viewname", SEC_MODERATOR, true, &HandleGMTicketGetByNameCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; + static ChatCommand commandTable[] = + { + { "ticket", SEC_MODERATOR, false, NULL, "", ticketCommandTable }, + { NULL, 0, false, NULL, "", NULL } + }; + return commandTable; + } + + static bool HandleGMTicketAssignToCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + char* ticketIdStr = strtok((char*)args, " "); + uint32 ticketId = atoi(ticketIdStr); + + char* targetStr = strtok(NULL, " "); + if (!targetStr) + return false; + + std::string target(targetStr); + if (!normalizePlayerName(target)) + return false; + + GmTicket* ticket = sTicketMgr->GetTicket(ticketId); + if (!ticket || ticket->IsClosed()) + { + handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); + return true; + } + + // Get target information + uint64 targetGuid = sObjectMgr->GetPlayerGUIDByName(target.c_str()); + uint64 targetAccountId = sObjectMgr->GetPlayerAccountIdByGUID(targetGuid); + uint32 targetGmLevel = AccountMgr::GetSecurity(targetAccountId, realmID); + + // Target must exist and have administrative rights + if (!targetGuid || AccountMgr::IsPlayerAccount(targetGmLevel)) + { + handler->SendSysMessage(LANG_COMMAND_TICKETASSIGNERROR_A); + return true; + } + + // If already assigned, leave + if (ticket->IsAssignedTo(targetGuid)) + { + handler->PSendSysMessage(LANG_COMMAND_TICKETASSIGNERROR_B, ticket->GetId()); + return true; + } + + // If assigned to different player other than current, leave + //! Console can override though + Player* player = handler->GetSession() ? handler->GetSession()->GetPlayer() : NULL; + if (player && ticket->IsAssignedNotTo(player->GetGUID())) + { + handler->PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->GetId(), target.c_str()); + return true; + } + + // Assign ticket + SQLTransaction trans = SQLTransaction(NULL); + ticket->SetAssignedTo(targetGuid, AccountMgr::IsAdminAccount(targetGmLevel)); + ticket->SaveToDB(trans); + sTicketMgr->UpdateLastChange(); + + std::string msg = ticket->FormatMessageString(*handler, NULL, target.c_str(), NULL, NULL); + handler->SendGlobalGMSysMessage(msg.c_str()); + return true; + } + + static bool HandleGMTicketCloseByIdCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + uint32 ticketId = atoi(args); + GmTicket* ticket = sTicketMgr->GetTicket(ticketId); + if (!ticket || ticket->IsClosed() || ticket->IsCompleted()) + { + handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); + return true; + } + + // Ticket should be assigned to the player who tries to close it. + // Console can override though + Player* player = handler->GetSession() ? handler->GetSession()->GetPlayer() : NULL; + if (player && ticket->IsAssignedNotTo(player->GetGUID())) + { + handler->PSendSysMessage(LANG_COMMAND_TICKETCANNOTCLOSE, ticket->GetId()); + return true; + } + + sTicketMgr->CloseTicket(ticket->GetId(), player ? player->GetGUID() : -1); + sTicketMgr->UpdateLastChange(); + + std::string msg = ticket->FormatMessageString(*handler, player ? player->GetName() : "Console", NULL, NULL, NULL); + handler->SendGlobalGMSysMessage(msg.c_str()); + + // Inform player, who submitted this ticket, that it is closed + if (Player* submitter = ticket->GetPlayer()) + { + if (submitter->IsInWorld()) + { + WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4); + data << uint32(GMTICKET_RESPONSE_TICKET_DELETED); + submitter->GetSession()->SendPacket(&data); + } + } + return true; + } + + static bool HandleGMTicketCommentCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + char* ticketIdStr = strtok((char*)args, " "); + uint32 ticketId = atoi(ticketIdStr); + + char* comment = strtok(NULL, "\n"); + if (!comment) + return false; + + GmTicket* ticket = sTicketMgr->GetTicket(ticketId); + if (!ticket || ticket->IsClosed()) + { + handler->PSendSysMessage(LANG_COMMAND_TICKETNOTEXIST); + return true; + } + + // Cannot comment ticket assigned to someone else + //! Console excluded + Player* player = handler->GetSession() ? handler->GetSession()->GetPlayer() : NULL; + if (player && ticket->IsAssignedNotTo(player->GetGUID())) + { + handler->PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->GetId()); + return true; + } + + SQLTransaction trans = SQLTransaction(NULL); + ticket->SetComment(comment); + ticket->SaveToDB(trans); + sTicketMgr->UpdateLastChange(); + + std::string msg = ticket->FormatMessageString(*handler, NULL, ticket->GetAssignedToName().c_str(), NULL, NULL); + msg += handler->PGetParseString(LANG_COMMAND_TICKETLISTADDCOMMENT, player ? player->GetName() : "Console", comment); + handler->SendGlobalGMSysMessage(msg.c_str()); + + return true; + } + + static bool HandleGMTicketListClosedCommand(ChatHandler* handler, char const* /*args*/) + { + sTicketMgr->ShowClosedList(*handler); + return true; + } + + static bool HandleGMTicketCompleteCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + uint32 ticketId = atoi(args); + GmTicket* ticket = sTicketMgr->GetTicket(ticketId); + if (!ticket || ticket->IsClosed() || ticket->IsCompleted()) + { + handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); + return true; + } + + if (Player* player = ticket->GetPlayer()) + if (player->IsInWorld()) + ticket->SendResponse(player->GetSession()); + + sTicketMgr->UpdateLastChange(); + return true; + } + + static bool HandleGMTicketDeleteByIdCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + uint32 ticketId = atoi(args); + GmTicket* ticket = sTicketMgr->GetTicket(ticketId); + if (!ticket) + { + handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); + return true; + } + + if (!ticket->IsClosed()) + { + handler->SendSysMessage(LANG_COMMAND_TICKETCLOSEFIRST); + return true; + } + + std::string msg = ticket->FormatMessageString(*handler, NULL, NULL, NULL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName() : "Console"); + handler->SendGlobalGMSysMessage(msg.c_str()); + + sTicketMgr->RemoveTicket(ticket->GetId()); + sTicketMgr->UpdateLastChange(); + + if (Player* player = ticket->GetPlayer()) + { + if (player->IsInWorld()) + { + // Force abandon ticket + WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4); + data << uint32(GMTICKET_RESPONSE_TICKET_DELETED); + player->GetSession()->SendPacket(&data); + } + } + + return true; + } + + static bool HandleGMTicketEscalateCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + uint32 ticketId = atoi(args); + GmTicket* ticket = sTicketMgr->GetTicket(ticketId); + if (!ticket || ticket->IsClosed() || ticket->IsCompleted() || ticket->GetEscalatedStatus() != TICKET_UNASSIGNED) + { + handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); + return true; + } + + ticket->SetEscalatedStatus(TICKET_IN_ESCALATION_QUEUE); + + if (Player* player = ticket->GetPlayer()) + if (player->IsInWorld()) + sTicketMgr->SendTicket(player->GetSession(), ticket); + + sTicketMgr->UpdateLastChange(); + return true; + } + + static bool HandleGMTicketListEscalatedCommand(ChatHandler* handler, char const* /*args*/) + { + sTicketMgr->ShowEscalatedList(*handler); + return true; + } + + static bool HandleGMTicketListCommand(ChatHandler* handler, char const* /*args*/) + { + sTicketMgr->ShowList(*handler, false); + return true; + } + + static bool HandleGMTicketListOnlineCommand(ChatHandler* handler, char const* /*args*/) + { + sTicketMgr->ShowList(*handler, true); + return true; + } + + static bool HandleGMTicketResetCommand(ChatHandler* handler, char const* /*args*/) + { + if (sTicketMgr->GetOpenTicketCount()) + { + handler->SendSysMessage(LANG_COMMAND_TICKETPENDING); + return true; + } + else + { + sTicketMgr->ResetTickets(); + handler->SendSysMessage(LANG_COMMAND_TICKETRESET); + } + + return true; + } + + static bool HandleToggleGMTicketSystem(ChatHandler* handler, char const* /*args*/) + { + bool status = !sTicketMgr->GetStatus(); + sTicketMgr->SetStatus(status); + handler->PSendSysMessage(status ? LANG_ALLOW_TICKETS : LANG_DISALLOW_TICKETS); + return true; + } + + static bool HandleGMTicketUnAssignCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + uint32 ticketId = atoi(args); + GmTicket* ticket = sTicketMgr->GetTicket(ticketId); + if (!ticket || ticket->IsClosed()) + { + handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); + return true; + } + // Ticket must be assigned + if (!ticket->IsAssigned()) + { + handler->PSendSysMessage(LANG_COMMAND_TICKETNOTASSIGNED, ticket->GetId()); + return true; + } + + // Get security level of player, whom this ticket is assigned to + uint32 security = SEC_PLAYER; + Player* assignedPlayer = ticket->GetAssignedPlayer(); + if (assignedPlayer && assignedPlayer->IsInWorld()) + security = assignedPlayer->GetSession()->GetSecurity(); + else + { + uint64 guid = ticket->GetAssignedToGUID(); + uint32 accountId = sObjectMgr->GetPlayerAccountIdByGUID(guid); + security = AccountMgr::GetSecurity(accountId, realmID); + } + + // Check security + //! If no m_session present it means we're issuing this command from the console + uint32 mySecurity = handler->GetSession() ? handler->GetSession()->GetSecurity() : SEC_CONSOLE; + if (security > mySecurity) + { + handler->SendSysMessage(LANG_COMMAND_TICKETUNASSIGNSECURITY); + return true; + } + + SQLTransaction trans = SQLTransaction(NULL); + ticket->SetUnassigned(); + ticket->SaveToDB(trans); + sTicketMgr->UpdateLastChange(); + + std::string msg = ticket->FormatMessageString(*handler, NULL, ticket->GetAssignedToName().c_str(), + handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName() : "Console", NULL); + handler->SendGlobalGMSysMessage(msg.c_str()); + + return true; + } + + static bool HandleGMTicketGetByIdCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + uint32 ticketId = atoi(args); + GmTicket* ticket = sTicketMgr->GetTicket(ticketId); + if (!ticket || ticket->IsClosed() || ticket->IsCompleted()) + { + handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); + return true; + } + + SQLTransaction trans = SQLTransaction(NULL); + ticket->SetViewed(); + ticket->SaveToDB(trans); + + handler->SendSysMessage(ticket->FormatMessageString(*handler, true).c_str()); + return true; + } + + static bool HandleGMTicketGetByNameCommand(ChatHandler* handler, char const* args) + { + if (!*args) + return false; + + std::string name(args); + if (!normalizePlayerName(name)) + return false; + + // Detect target's GUID + uint64 guid = 0; + if (Player* player = sObjectAccessor->FindPlayerByName(name.c_str())) + guid = player->GetGUID(); + else + guid = sObjectMgr->GetPlayerGUIDByName(name); + + // Target must exist + if (!guid) + { + handler->SendSysMessage(LANG_NO_PLAYERS_FOUND); + return true; + } + + // Ticket must exist + GmTicket* ticket = sTicketMgr->GetTicketByPlayer(guid); + if (!ticket) + { + handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); + return true; + } + + SQLTransaction trans = SQLTransaction(NULL); + ticket->SetViewed(); + ticket->SaveToDB(trans); + + handler->SendSysMessage(ticket->FormatMessageString(*handler, true).c_str()); + return true; + } + + static bool _HandleGMTicketResponseAppendCommand(char const* args, bool newLine, ChatHandler* handler) + { + if (!*args) + return false; + + char* ticketIdStr = strtok((char*)args, " "); + uint32 ticketId = atoi(ticketIdStr); + + char* response = strtok(NULL, "\n"); + if (!response) + return false; + + GmTicket* ticket = sTicketMgr->GetTicket(ticketId); + if (!ticket || ticket->IsClosed()) + { + handler->PSendSysMessage(LANG_COMMAND_TICKETNOTEXIST); + return true; + } + + // Cannot add response to ticket, assigned to someone else + //! Console excluded + Player* player = handler->GetSession() ? handler->GetSession()->GetPlayer() : NULL; + if (player && ticket->IsAssignedNotTo(player->GetGUID())) + { + handler->PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->GetId()); + return true; + } + + SQLTransaction trans = SQLTransaction(NULL); + ticket->AppendResponse(response); + if (newLine) + ticket->AppendResponse("\n"); + ticket->SaveToDB(trans); + + return true; + } + + static bool HandleGMTicketResponseAppendCommand(ChatHandler* handler, char const* args) + { + return _HandleGMTicketResponseAppendCommand(args, false, handler); + } + + static bool HandleGMTicketResponseAppendLnCommand(ChatHandler* handler, char const* args) + { + return _HandleGMTicketResponseAppendCommand(args, true, handler); + } +}; + +void AddSC_ticket_commandscript() +{ + new ticket_commandscript(); +} diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp index a3b8c5df4e7..114bc69741c 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp @@ -157,15 +157,19 @@ class boss_garfrost : public CreatureScript void MovementInform(uint32 type, uint32 id) { - if (type != POINT_MOTION_TYPE || id != POINT_FORGE) + if (type != EFFECT_MOTION_TYPE || id != POINT_FORGE) return; if (events.GetPhaseMask() & PHASE_TWO_MASK) + { DoCast(me, SPELL_FORGE_BLADE); + SetEquipmentSlots(false, EQUIP_ID_SWORD); + } if (events.GetPhaseMask() & PHASE_THREE_MASK) { me->RemoveAurasDueToSpell(SPELL_FORGE_BLADE_HELPER); DoCast(me, SPELL_FORGE_MACE); + SetEquipmentSlots(false, EQUIP_ID_MACE); } events.ScheduleEvent(EVENT_RESUME_ATTACK, 5000); } @@ -177,10 +181,6 @@ class boss_garfrost : public CreatureScript if (Aura* aura = target->GetAura(SPELL_PERMAFROST_HELPER)) _permafrostStack = std::max<uint32>(_permafrostStack, aura->GetStackAmount()); } - else if (spell->Id == SPELL_FORGE_BLADE) - SetEquipmentSlots(false, EQUIP_ID_SWORD); - else if (spell->Id == SPELL_FORGE_MACE) - SetEquipmentSlots(false, EQUIP_ID_MACE); } uint32 GetData(uint32 /*type*/) @@ -205,7 +205,7 @@ class boss_garfrost : public CreatureScript case EVENT_THROW_SARONITE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { - Talk(SAY_THROW_SARONITE); + Talk(SAY_THROW_SARONITE, target->GetGUID()); DoCast(target, SPELL_THROW_SARONITE); } events.ScheduleEvent(EVENT_THROW_SARONITE, urand(12500, 20000)); @@ -217,7 +217,7 @@ class boss_garfrost : public CreatureScript case EVENT_DEEP_FREEZE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { - Talk(SAY_CAST_DEEP_FREEZE); + Talk(SAY_CAST_DEEP_FREEZE, target->GetGUID()); DoCast(target, SPELL_DEEP_FREEZE); } events.ScheduleEvent(EVENT_DEEP_FREEZE, 35000, 0, PHASE_THREE); diff --git a/src/server/scripts/Northrend/icecrown.cpp b/src/server/scripts/Northrend/icecrown.cpp index fb2e0f6c389..85b34523893 100644 --- a/src/server/scripts/Northrend/icecrown.cpp +++ b/src/server/scripts/Northrend/icecrown.cpp @@ -169,8 +169,7 @@ enum eArgentValiant { SPELL_CHARGE = 63010, SPELL_SHIELD_BREAKER = 65147, - - NPC_ARGENT_VALIANT_CREDIT = 24108 + SPELL_KILL_CREDIT = 63049 }; class npc_argent_valiant : public CreatureScript @@ -208,7 +207,7 @@ public: if (uiDamage > me->GetHealth() && pDoneBy->GetTypeId() == TYPEID_PLAYER) { uiDamage = 0; - CAST_PLR(pDoneBy)->KilledMonsterCredit(NPC_ARGENT_VALIANT_CREDIT, 0); + pDoneBy->CastSpell(pDoneBy, SPELL_KILL_CREDIT, true); me->setFaction(35); me->DespawnOrUnsummon(5000); me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 74118599b9f..9701418e02e 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -561,9 +561,6 @@ class spell_warl_haunt : public SpellScriptLoader void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) - return; - if (Unit* caster = GetCaster()) { int32 amount = aurEff->GetAmount(); diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 3bb6783f8cf..c7a283c94d7 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -109,7 +109,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_SEL_CHARACTER_ACTIONS_SPEC, "SELECT button, action, type FROM character_action WHERE guid = ? AND spec = ? ORDER BY button", CONNECTION_SYNCH) PREPARE_STATEMENT(CHAR_SEL_MAILITEMS, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, item_guid, itemEntry, owner_guid FROM mail_items mi JOIN item_instance ii ON mi.item_guid = ii.guid WHERE mail_id = ?", CONNECTION_SYNCH) PREPARE_STATEMENT(CHAR_SEL_AUCTION_ITEMS, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, itemguid, itemEntry FROM auctionhouse ah JOIN item_instance ii ON ah.itemguid = ii.guid", CONNECTION_SYNCH) - PREPARE_STATEMENT(CHAR_SEL_AUCTIONS, "SELECT id, auctioneerguid, itemguid, itemEntry, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid", CONNECTION_SYNCH) + PREPARE_STATEMENT(CHAR_SEL_AUCTIONS, "SELECT id, auctioneerguid, itemguid, itemEntry, count, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid", CONNECTION_SYNCH) PREPARE_STATEMENT(CHAR_INS_AUCTION, "INSERT INTO auctionhouse (id, auctioneerguid, itemguid, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_DEL_AUCTION, "DELETE FROM auctionhouse WHERE id = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_SEL_AUCTION_BY_TIME, "SELECT id FROM auctionhouse WHERE time <= ? ORDER BY TIME ASC", CONNECTION_SYNCH); @@ -338,7 +338,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_INS_LAG_REPORT, "INSERT INTO lag_reports (guid, lagType, mapId, posX, posY, posZ, latency, createTime) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC) // For loading and deleting expired auctions at startup - PREPARE_STATEMENT(CHAR_SEL_EXPIRED_AUCTIONS, "SELECT id, auctioneerguid, itemguid, itemEntry, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid WHERE ah.time <= ?", CONNECTION_SYNCH) + PREPARE_STATEMENT(CHAR_SEL_EXPIRED_AUCTIONS, "SELECT id, auctioneerguid, itemguid, itemEntry, count, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid WHERE ah.time <= ?", CONNECTION_SYNCH) // LFG Data PREPARE_STATEMENT(CHAR_INS_LFG_DATA, "INSERT INTO lfg_data (guid, dungeon, state) VALUES (?, ?, ?)", CONNECTION_ASYNC) |