aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/characters/2012_01_04_00_characters_character_queststatus_seasonal.sql8
-rw-r--r--sql/updates/world/2011_12_13_02_world_creature_template_addon.sql (renamed from sql/updates/world/2011_12_13_02_creature_template_addon.sql)0
-rw-r--r--sql/updates/world/2012_01_02_02_world_creature_template.sql2
-rw-r--r--sql/updates/world/2012_01_03_00_world_gossip_menu.sql17
-rw-r--r--sql/updates/world/2012_01_03_01_world_quest_template.sql1
-rw-r--r--sql/updates/world/2012_01_03_02_world_sai.sql27
-rw-r--r--sql/updates/world/2012_01_03_03_world_creature_template.sql2
-rw-r--r--sql/updates/world/2012_01_03_04_world_gameobject_questrelation.sql8
-rw-r--r--sql/updates/world/2012_01_03_05_world_creature.sql180
-rw-r--r--sql/updates/world/2012_01_03_06_world_sai.sql82
-rw-r--r--sql/updates/world/2012_01_03_07_world_creature.sql46
-rw-r--r--sql/updates/world/2012_01_04_00_world_gossip_menu.sql70
-rw-r--r--sql/updates/world/2012_01_04_01_world_game_event_seasonal_questrelation.sql386
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp128
-rwxr-xr-xsrc/server/game/Entities/Player/Player.h12
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp60
-rwxr-xr-xsrc/server/game/Events/GameEventMgr.cpp43
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.h5
-rwxr-xr-xsrc/server/game/Quests/QuestDef.cpp1
-rwxr-xr-xsrc/server/game/Quests/QuestDef.h5
-rw-r--r--[-rwxr-xr-x]src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp8
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp25
-rwxr-xr-xsrc/server/game/World/World.cpp11
-rwxr-xr-xsrc/server/game/World/World.h1
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp2
-rw-r--r--[-rwxr-xr-x]src/server/shared/Database/Implementation/CharacterDatabase.cpp10
-rw-r--r--[-rwxr-xr-x]src/server/shared/Database/Implementation/CharacterDatabase.h10
27 files changed, 1100 insertions, 50 deletions
diff --git a/sql/updates/characters/2012_01_04_00_characters_character_queststatus_seasonal.sql b/sql/updates/characters/2012_01_04_00_characters_character_queststatus_seasonal.sql
new file mode 100644
index 00000000000..f9ae71b65a7
--- /dev/null
+++ b/sql/updates/characters/2012_01_04_00_characters_character_queststatus_seasonal.sql
@@ -0,0 +1,8 @@
+DROP TABLE IF EXISTS `character_queststatus_seasonal`;
+CREATE TABLE `character_queststatus_seasonal` (
+ `guid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier',
+ `quest` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Quest Identifier',
+ `event` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Event Identifier',
+ PRIMARY KEY (`guid`,`quest`),
+ KEY `idx_guid` (`guid`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Player System';
diff --git a/sql/updates/world/2011_12_13_02_creature_template_addon.sql b/sql/updates/world/2011_12_13_02_world_creature_template_addon.sql
index f1dc473bdd7..f1dc473bdd7 100644
--- a/sql/updates/world/2011_12_13_02_creature_template_addon.sql
+++ b/sql/updates/world/2011_12_13_02_world_creature_template_addon.sql
diff --git a/sql/updates/world/2012_01_02_02_world_creature_template.sql b/sql/updates/world/2012_01_02_02_world_creature_template.sql
index 1f87f418dec..ed95c4450fd 100644
--- a/sql/updates/world/2012_01_02_02_world_creature_template.sql
+++ b/sql/updates/world/2012_01_02_02_world_creature_template.sql
@@ -17,5 +17,5 @@ UPDATE `creature_template` SET `flags_extra`= `flags_extra`|64 WHERE `entry` IN
31484, -- Azure Binder
31488, -- Azure Invader
31495, -- Azure Spellbreaker
-31498, -- Azure Mage Slayer
+31498 -- Azure Mage Slayer
);
diff --git a/sql/updates/world/2012_01_03_00_world_gossip_menu.sql b/sql/updates/world/2012_01_03_00_world_gossip_menu.sql
new file mode 100644
index 00000000000..9e9bba43b1a
--- /dev/null
+++ b/sql/updates/world/2012_01_03_00_world_gossip_menu.sql
@@ -0,0 +1,17 @@
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=9918 AND `text_id`=13792;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9918,13792);
+DELETE FROM `gossip_menu` WHERE `entry`=9859 AND `text_id`=13650;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9859,13650);
+DELETE FROM `gossip_menu` WHERE `entry`=9857 AND `text_id`=13651;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9857,13651);
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=10316 WHERE `entry`=33224;
+UPDATE `creature_template` SET `gossip_menu_id`=9918 WHERE `entry`=29430;
+UPDATE `creature_template` SET `gossip_menu_id`=9859 WHERE `entry`=29434;
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (10316,9857,9917) AND `id` IN (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
+(10316,0,0, 'Glad to help, my lady. I''m told you were once the guardian of a fabled sword. Do you know where I might find it?',1,1,10315,0,0,0, ''),
+(9857,0,0, 'I''m ready - lets get you out of here.',1,1,0,0,0,0, ''),
+(9917,0,0, 'I am ready to head further into Storm Peaks.',1,1,0,0,0,0, '');
diff --git a/sql/updates/world/2012_01_03_01_world_quest_template.sql b/sql/updates/world/2012_01_03_01_world_quest_template.sql
new file mode 100644
index 00000000000..f35ea3be65b
--- /dev/null
+++ b/sql/updates/world/2012_01_03_01_world_quest_template.sql
@@ -0,0 +1 @@
+UPDATE `quest_template` SET `OfferRewardText`='<Getry looks you over.>$B$BThis is all Ickoris could send?' WHERE `id`=11703;
diff --git a/sql/updates/world/2012_01_03_02_world_sai.sql b/sql/updates/world/2012_01_03_02_world_sai.sql
new file mode 100644
index 00000000000..61ae8aab575
--- /dev/null
+++ b/sql/updates/world/2012_01_03_02_world_sai.sql
@@ -0,0 +1,27 @@
+-- Add text for Lynn Hyal
+DELETE FROM `creature_text` WHERE `entry`=23768;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
+(23768, 1, 0, 'James? James... No, you\'re not James, but I know who you are...', 12, 0, 100, 0, 0, 0, 'Lynn Hyal'),
+(23768, 2, 0, 'You\'re the one who tracked down the brutes who did this to us.', 12, 0, 100, 0, 0, 0, 'Lynn Hyal'),
+(23768, 3, 0, 'I tried so hard to tell Jim... to tell anyone... who was behind this, but I couldn\'t find a way...', 12, 0, 100, 0, 0, 0, 'Lynn Hyal'),
+(23768, 4, 0, 'Thank you for helping us and for helping Jim. If you see him, tell him little Jimmy and I love him and that we\'re waiting for him.', 12, 0, 100, 0, 0, 0, 'Lynn Hyal'),
+(23768, 5, 0, 'I don\'t know when we\'ll see Daddy again, Jimmy, but I know he loves you and he misses you very much.', 12, 0, 100, 0, 0, 0, 'Lynn Hyal');
+-- Add text for Jimmy Hyal
+DELETE FROM `creature_text` WHERE `entry`=23769;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
+(23769, 1, 0, 'Mommy, when will we see Daddy again?', 12, 0, 100, 0, 0, 0, 'Jimmy Hyal');
+-- add smart ai dialog for Lynn Hyal and quest credit at end of dialog
+UPDATE `creature_template` SET AIName="SmartAI" WHERE `entry`=23768;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=23768;
+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
+(23768, 0, 0, 0, 1, 0, 100, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lynn Hyal - on spawn - talk 1'),
+(23768, 0, 1, 0, 1, 0, 100, 1, 2000, 2000, 0, 0, 84, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lynn Hyal - after 2 sec - talk 2'),
+(23768, 0, 2, 0, 1, 0, 100, 1, 5000, 5000, 0, 0, 84, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lynn Hyal - after 5 sec - talk 3'),
+(23768, 0, 3, 0, 1, 0, 100, 1, 8000, 8000, 0, 0, 84, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lynn Hyal - after 8 sec - talk 4'),
+(23768, 0, 4, 0, 1, 0, 100, 1, 12000, 12000, 0, 0, 84, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lynn Hyal - after 12 sec - reply to jimmy'),
+(23768, 0, 5, 0, 1, 0, 100, 1, 12000, 12000, 0, 0, 33, 23768, 0, 0, 0, 0, 0, 18, 5, 0, 0, 0, 0, 0, 0, 'Lynn Hyal - after 12 sec - kill credit quest complete');
+-- add smart ai dialog for Jimmy Hyal
+UPDATE `creature_template` SET AIName="SmartAI" WHERE `entry`=23769;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=23769;
+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
+(23769, 0, 0, 0, 1, 0, 100, 1, 10000, 10000, 0, 0, 84, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jimmy Hyal - after 10 sec - talk 1');
diff --git a/sql/updates/world/2012_01_03_03_world_creature_template.sql b/sql/updates/world/2012_01_03_03_world_creature_template.sql
new file mode 100644
index 00000000000..29d0e802abe
--- /dev/null
+++ b/sql/updates/world/2012_01_03_03_world_creature_template.sql
@@ -0,0 +1,2 @@
+-- Update faction for Frostmane Troll Whelp "From Sniff"
+UPDATE `creature_template` SET `faction_A`=7,`faction_H`=7 WHERE `entry`=706;
diff --git a/sql/updates/world/2012_01_03_04_world_gameobject_questrelation.sql b/sql/updates/world/2012_01_03_04_world_gameobject_questrelation.sql
new file mode 100644
index 00000000000..519fa99e2d5
--- /dev/null
+++ b/sql/updates/world/2012_01_03_04_world_gameobject_questrelation.sql
@@ -0,0 +1,8 @@
+DELETE FROM `gameobject_questrelation` WHERE `quest` IN (12345, 12377);
+INSERT INTO `gameobject_questrelation` VALUES
+(190035, 12345),
+(190079, 12377);
+DELETE FROM `gameobject_involvedrelation` WHERE `quest` IN (12345, 12377);
+INSERT INTO `gameobject_involvedrelation` VALUES
+(190035, 12345),
+(190079, 12377);
diff --git a/sql/updates/world/2012_01_03_05_world_creature.sql b/sql/updates/world/2012_01_03_05_world_creature.sql
new file mode 100644
index 00000000000..b30ca2d5ef4
--- /dev/null
+++ b/sql/updates/world/2012_01_03_05_world_creature.sql
@@ -0,0 +1,180 @@
+SET @GUID := 72707; -- need 62;
+SET @NPC_WILDSPAWN_SATYR = 11451;
+SET @NPC_WILDSPAWN_ROGUE := 11452;
+SET @NPC_WILDSPAWN_BETRAYER := 11454;
+SET @NPC_WILDSPAWN_FELSWORN := 11455;
+SET @NPC_WILDSPAWN_SHADOWSTALKER := 11456;
+SET @NPC_WILDSPAWN_HELLCALLER := 11457;
+SET @NPC_WARPWOOD_TREANT = 11462;
+SET @NPC_WARPWOOD_CRUSHER := 13021;
+SET @NPC_WHIP_LASHER := 13022;
+SET @NPC_PHASE_LASHER := 13196;
+SET @NPC_FEL_LASH := 13197;
+
+-- add movement
+SET @ENTRY := 56992; -- single Wildspawn Felsworn instance
+UPDATE creature SET `MovementType`=2 WHERE `guid`=@ENTRY;
+DELETE FROM `creature_addon` WHERE `guid`=@ENTRY;
+INSERT INTO `creature_addon`(`guid`,`path_id`) VALUES
+(@ENTRY,@ENTRY*10);
+
+-- Add waypoints to Wildspawn Felsworn instance
+DELETE FROM `waypoint_data` WHERE `id`=@ENTRY*10;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@ENTRY*10,1,57.4000,-737.329,-25.1524,0,0,0,100,0),
+(@ENTRY*10,2,26.45,-682.69,-24.98,0,0,0,100,0);
+
+-- Smart AI for Wildspawn Shadowstalker
+SET @ENTRY := @NPC_WILDSPAWN_SHADOWSTALKER;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+UPDATE creature SET `MovementType`=1,`spawndist`=3 WHERE `id`=@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,0,11,0,100,0,0,0,0,0,11,22766,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Shadowstalker - On Spawn - cast Sneak on self'),
+(@ENTRY,0,1,0,0,0,100,0,4000,8000,5000,8000,11,22416,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Shadowstalker - In Combat - Cast Backstab'),
+(@ENTRY,0,2,0,0,0,100,0,6000,7000,8000,9000,11,7992,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Shadowstalker - In Combat - Cast Slowing Posion');
+
+-- add movement
+SET @ENTRY := 56967; -- single Wildspawn Shadowstalker instance
+UPDATE creature SET `MovementType`=2 WHERE `guid`=@ENTRY;
+DELETE FROM `creature_addon` WHERE `guid`=@ENTRY;
+INSERT INTO `creature_addon`(`guid`,`path_id`) VALUES
+(@ENTRY,@ENTRY*10);
+
+-- Add waypoints to Wildspawn Shadowstalker instance
+DELETE FROM `waypoint_data` WHERE `id`=@ENTRY*10;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@ENTRY*10,1,45.4305,-675.9378,-25.1612,0,0,0,100,0),
+(@ENTRY*10,2,36.5939,-646.3212,-25.1506,0,0,0,100,0),
+(@ENTRY*10,3,58.3292,-605.7308,-25.0700,0,0,0,100,0),
+(@ENTRY*10,4,52.3244,-584.9519,-23.3673,0,0,0,100,0),
+(@ENTRY*10,5,52.1407,-565.7738,-19.4151,0,0,0,100,0),
+(@ENTRY*10,6,56.5794,-558.3062,-19.2307,0,0,0,100,0),
+(@ENTRY*10,7,76.8705,-545.9866,-15.2457,0,0,0,100,0),
+(@ENTRY*10,8,97.9787,-544.0214,-11.0777,0,0,0,100,0),
+(@ENTRY*10,9,76.8705,-545.9866,-15.2457,0,0,0,100,0),
+(@ENTRY*10,10,56.5794,-558.3062,-19.2307,0,0,0,100,0),
+(@ENTRY*10,11,52.1407,-565.7738,-19.4151,0,0,0,100,0),
+(@ENTRY*10,12,52.3244,-584.9519,-23.3673,0,0,0,100,0),
+(@ENTRY*10,13,58.3292,-605.7308,-25.0700,0,0,0,100,0),
+(@ENTRY*10,14,36.5939,-646.3212,-25.1506,0,0,0,100,0),
+(@ENTRY*10,15,45.4305,-675.9378,-25.1612,0,0,0,100,0),
+(@ENTRY*10,16,62.53,-681.04,-24.98,0,0,0,100,0);
+
+-- Spawn the mobs
+DELETE FROM `creature` WHERE `guid` BETWEEN @GUID AND @GUID+62;
+INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`) VALUES
+(@GUID+1,@NPC_WARPWOOD_TREANT,429,1,1,0,0,72.5524,-197.561,-4.14211,3.13356,7200,0,0,7842,0,2),
+(@GUID+2,@NPC_WARPWOOD_TREANT,429,1,1,0,0,20.3687,-203.068,-4.0968,3.10349,7200,0,0,7842,0,2),
+(@GUID+3,@NPC_WARPWOOD_TREANT,429,1,1,0,0,30.1582,-195.841,-4.12466,3.01317,7200,0,0,7599,0,2),
+(@GUID+4,@NPC_WARPWOOD_TREANT,429,1,1,0,0,25.8537,-206.521,-4.06996,3.01317,7200,0,0,7599,0,2),
+(@GUID+5,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-107.769,-200.032,-4.10429,0.153016,7200,0,0,7842,0,2),
+(@GUID+6,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-113.89,-195.466,-4.14424,0.0626954,7200,0,0,7842,0,2),
+(@GUID+7,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-117.388,-207.58,-4.06716,0.0476419,7200,0,0,7842,0,2),
+(@GUID+8,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-142.675,-350.105,-4.11237,1.70352,7200,0,0,7599,0,2),
+(@GUID+9,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-145.689,-356.994,-4.13712,1.66338,7200,0,0,7599,0,2),
+(@GUID+10,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-138.62,-360.106,-4.13313,1.66338,7200,0,0,7599,0,2),
+(@GUID+11,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-115.225,-347.295,-4.05097,6.26559,7200,0,0,7599,0,2),
+(@GUID+12,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-109.451,-350.449,-4.07628,6.28064,7200,0,0,7599,0,2),
+(@GUID+13,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-120.637,-353.502,-4.10136,6.26747,7200,0,0,7842,0,2),
+(@GUID+14,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-46.8699,-355.781,-4.11898,0.109725,7200,0,0,7599,0,2),
+(@GUID+15,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-57.5391,-352.691,-4.09353,0.121943,7200,0,0,7842,0,2),
+(@GUID+16,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-60.9243,-359.466,-4.14508,0.0617289,7200,0,0,7842,0,2),
+(@GUID+17,@NPC_WARPWOOD_TREANT,429,1,1,0,0,54.2367,-348.114,-4.05781,6.25459,7200,0,0,7599,0,2),
+(@GUID+18,@NPC_WARPWOOD_TREANT,429,1,1,0,0,43.279,-352.861,-4.0973,0.0633858,7200,0,0,7842,0,2),
+(@GUID+19,@NPC_WARPWOOD_TREANT,429,1,1,0,0,39.8267,-343.521,-4.02135,6.18098,7200,0,0,7842,0,2),
+(@GUID+20,@NPC_WARPWOOD_TREANT,429,1,1,0,0,111.859,-366.456,-4.14992,1.56459,7200,0,0,7842,0,2),
+(@GUID+21,@NPC_WARPWOOD_TREANT,429,1,1,0,0,116.012,-372.374,-4.09262,1.52947,7200,0,0,7842,0,2),
+(@GUID+22,@NPC_WARPWOOD_TREANT,429,1,1,0,0,107.625,-377.033,-4.07882,1.53449,7200,0,0,7842,0,2),
+(@GUID+23,@NPC_WARPWOOD_CRUSHER,429,1,1,0,0,141.391,-355.109,-4.15258,3.22692,7200,0,0,16194,0,0),
+(@GUID+24,@NPC_PHASE_LASHER,429,1,1,0,0,81.2447,-361.592,-4.14699,1.54781,7200,0,0,15684,0,0),
+(@GUID+25,@NPC_WHIP_LASHER,429,1,1,0,0,34.9898,-347.58,-4.05484,0.017372,7200,0,0,1900,0,0),
+(@GUID+26,@NPC_WHIP_LASHER,429,1,1,0,0,36.7793,-352.448,-4.09411,0.00231851,7200,0,0,1900,0,0),
+(@GUID+27,@NPC_WHIP_LASHER,429,1,1,0,0,41.2793,-352.437,-4.09411,0.00231851,7200,0,0,1900,0,0),
+(@GUID+28,@NPC_WHIP_LASHER,429,1,1,0,0,44.3212,-352.43,-4.09411,0.00231851,7200,0,0,1900,0,0),
+(@GUID+29,@NPC_WHIP_LASHER,429,1,1,0,0,44.315,-349.742,-4.07234,0.0588672,7200,0,0,1900,0,0),
+(@GUID+30,@NPC_WHIP_LASHER,429,1,1,0,0,39.4515,-350.029,-4.0749,0.063885,7200,0,0,1900,0,0),
+(@GUID+31,@NPC_WHIP_LASHER,429,1,1,0,0,39.2745,-347.262,-4.05348,0.063885,7200,0,0,1900,0,0),
+(@GUID+32,@NPC_WARPWOOD_CRUSHER,429,1,1,0,0,-20.953,-371.52,-4.05577,1.58638,7200,0,0,16194,0,0),
+(@GUID+33,@NPC_PHASE_LASHER,429,1,1,0,0,-52.0524,-361.703,-4.14598,1.7679,7200,0,0,15684,0,0),
+(@GUID+34,@NPC_WHIP_LASHER,429,1,1,0,0,-62.1186,-349.8,-4.07015,6.09414,7200,0,0,1900,0,0),
+(@GUID+35,@NPC_WHIP_LASHER,429,1,1,0,0,-69.5873,-354.282,-4.1069,6.17944,7200,0,0,1900,0,0),
+(@GUID+36,@NPC_WHIP_LASHER,429,1,1,0,0,-66.7331,-351.805,-4.08577,6.18948,7200,0,0,1900,0,0),
+(@GUID+37,@NPC_WHIP_LASHER,429,1,1,0,0,-73.9811,-351.124,-4.08116,6.18948,7200,0,0,1900,0,0),
+(@GUID+38,@NPC_WHIP_LASHER,429,1,1,0,0,-69.8854,-349.117,-4.06468,6.2798,7200,0,0,1900,0,0),
+(@GUID+39,@NPC_WHIP_LASHER,429,1,1,0,0,-65.6902,-346.108,-4.0402,6.2798,7200,0,0,1900,0,0),
+(@GUID+40,@NPC_WARPWOOD_CRUSHER,429,1,1,0,0,-73.7821,-346.08,-4.0402,6.2798,7200,0,0,1900,0,0),
+(@GUID+41,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-93.8011,-363.618,-4.14738,1.65316,7200,0,0,16194,0,0),
+(@GUID+42,@NPC_PHASE_LASHER,429,1,1,0,0,-131.311,-365.627,-4.15058,1.51265,7200,0,0,15198,0,0),
+(@GUID+43,@NPC_WHIP_LASHER,429,1,1,0,0,-143.839,-340.391,-4.12014,1.83881,7200,0,0,1900,0,0),
+(@GUID+44,@NPC_WHIP_LASHER,429,1,1,0,0,-142.296,-336.529,-4.10736,1.85386,7200,0,0,1900,0,0),
+(@GUID+45,@NPC_WHIP_LASHER,429,1,1,0,0,-138.49,-341.197,-4.07808,1.73845,7200,0,0,1900,0,0),
+(@GUID+46,@NPC_WHIP_LASHER,429,1,1,0,0,-134.462,-337.194,-4.04726,1.70944,7200,0,0,1900,0,0),
+(@GUID+47,@NPC_WHIP_LASHER,429,1,1,0,0,-135.424,-330.303,-4.0528,1.70944,7200,0,0,1900,0,0),
+(@GUID+48,@NPC_WHIP_LASHER,429,1,1,0,0,-142.163,-331.244,-4.1045,1.71445,7200,0,0,1900,0,0),
+(@GUID+49,@NPC_WHIP_LASHER,429,1,1,0,0,-138.62,-333.245,-4.07944,1.71947,7200,0,0,1900,0,0),
+(@GUID+50,@NPC_WARPWOOD_CRUSHER,429,1,1,0,0,-138.38,-275.724,-4.07674,3.17049,7200,0,0,16194,0,0),
+(@GUID+51,@NPC_PHASE_LASHER,429,1,1,0,0,-162.835,-275.863,-4.14791,6.27238,7200,0,0,15684,0,0),
+(@GUID+52,@NPC_WHIP_LASHER,429,1,1,0,0,-158.318,-204.325,-4.15232,0.0694766,7200,0,0,1900,0,0),
+(@GUID+53,@NPC_WHIP_LASHER,429,1,1,0,0,-154.646,-204.07,-4.15232,0.0694766,7200,0,0,1900,0,0),
+(@GUID+54,@NPC_WHIP_LASHER,429,1,1,0,0,-153.089,-196.695,-4.15243,0.0343519,7200,0,0,1900,0,0),
+(@GUID+55,@NPC_WHIP_LASHER,429,1,1,0,0,-160.393,-196.946,-4.15243,0.0343519,7200,0,0,1900,0,0),
+(@GUID+56,@NPC_WHIP_LASHER,429,1,1,0,0,-162.052,-201.486,-4.15243,0.0393697,7200,0,0,1900,0,0),
+(@GUID+57,@NPC_WHIP_LASHER,429,1,1,0,0,-152.686,-201.117,-4.15243,0.0393697,7200,0,0,1900,0,0),
+(@GUID+58,@NPC_WHIP_LASHER,429,1,1,0,0,-156.996,-199.83,-4.15243,0.059441,7200,0,0,1900,0,0),
+(@GUID+59,@NPC_PHASE_LASHER,429,1,1,0,0,-86.8965,-210.681,-4.03141,1.56479,7200,0,0,15198,0,0),
+(@GUID+60,@NPC_WARPWOOD_CRUSHER,429,1,1,0,0,-87.0174,-180.571,-2.71439,4.76202,7200,0,0,16194,0,0),
+(@GUID+61,@NPC_PHASE_LASHER,429,1,1,0,0,-27.3846,-207.58,-4.06107,0.888256,7200,0,0,15684,0,0),
+(@GUID+62,@NPC_WARPWOOD_CRUSHER,429,1,1,0,0,-15.3937,-177.684,-2.71439,4.81219,7200,0,0,16194,0,0);
+
+-- Add movement to some mobs
+DELETE FROM `creature_addon` WHERE `guid` BETWEEN @GUID+1 AND @GUID+22;
+INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES
+(@GUID+1,(@GUID+1)*10),
+(@GUID+2,(@GUID+2)*10),
+(@GUID+3,(@GUID+2)*10),
+(@GUID+4,(@GUID+2)*10),
+(@GUID+5,(@GUID+6)*10),
+(@GUID+6,(@GUID+6)*10),
+(@GUID+7,(@GUID+6)*10),
+(@GUID+8,(@GUID+8)*10),
+(@GUID+9,(@GUID+8)*10),
+(@GUID+10,(@GUID+8)*10),
+(@GUID+11,(@GUID+11)*10),
+(@GUID+12,(@GUID+11)*10),
+(@GUID+13,(@GUID+11)*10),
+(@GUID+14,(@GUID+14)*10),
+(@GUID+15,(@GUID+14)*10),
+(@GUID+16,(@GUID+14)*10),
+(@GUID+17,(@GUID+17)*10),
+(@GUID+18,(@GUID+17)*10),
+(@GUID+19,(@GUID+17)*10),
+(@GUID+20,(@GUID+20)*10),
+(@GUID+21,(@GUID+20)*10),
+(@GUID+22,(@GUID+20)*10);
+
+-- Add waypoints to mobs
+DELETE FROM `waypoint_data` WHERE `id` = (@GUID+1)*10;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+((@GUID+1)*10,1,70.6901,-197.173,-4.14434,0,1,0,100,0),
+((@GUID+1)*10,2,-104.169,-199.817,-4.12389,0,1,0,100,0),
+((@GUID+2)*10,1,-73.5443,-202.239,-4.10251,0,1,0,100,0),
+((@GUID+2)*10,2,35.4205,-201.467,-4.11061,0,1,0,100,0),
+((@GUID+6)*10,1,-20.2122,-201.982,-4.11082,0,1,0,100,0),
+((@GUID+6)*10,2,-130.665,-201.733,-4.10813,0,1,0,100,0),
+((@GUID+8)*10,1,-166.248,-199.501,-4.15228,0,1,0,100,0),
+((@GUID+8)*10,2,-131.595,-354.127,-4.10839,0,1,0,100,0),
+((@GUID+11)*10,1,-35.5988,-348.525,-4.06037,0,1,0,100,0),
+((@GUID+11)*10,2,-21.0353,-356.517,-4.12553,0,1,0,100,0),
+((@GUID+11)*10,3,4.10672,-354.436,-4.11233,0,1,0,100,0),
+((@GUID+11)*10,4,-62.8668,-351.204,-4.083,0,1,0,100,0),
+((@GUID+11)*10,5,-113.908,-346.958,-4.04887,0,1,0,100,0),
+((@GUID+14)*10,1,49.0152,-351.975,-4.09131,0,1,0,100,0),
+((@GUID+14)*10,2,-68.801,-355.361,-4.11568,0,1,0,100,0),
+((@GUID+17)*10,1,140.938,-354.573,-4.15133,0,1,0,100,0),
+((@GUID+17)*10,2, -17.9066,-352.038,-4.09042,0,1,0,100,0),
+((@GUID+20)*10,1,134.04,-337.362,-4.14977,0,1,0,100,0),
+((@GUID+20)*10,2,117.337,-367.835,-4.15199,0,1,0,100,0),
+((@GUID+20)*10,3,68.2814,-346.911,-4.04935,0,1,0,100,0),
+((@GUID+20)*10,4,111.089,-364.118,-4.14948,0,1,0,100,0);
diff --git a/sql/updates/world/2012_01_03_06_world_sai.sql b/sql/updates/world/2012_01_03_06_world_sai.sql
new file mode 100644
index 00000000000..858dc3f498d
--- /dev/null
+++ b/sql/updates/world/2012_01_03_06_world_sai.sql
@@ -0,0 +1,82 @@
+SET @NPC_WILDSPAWN_SATYR = 11451;
+SET @NPC_WILDSPAWN_ROGUE := 11452;
+SET @NPC_WILDSPAWN_BETRAYER := 11454;
+SET @NPC_WILDSPAWN_FELSWORN := 11455;
+SET @NPC_WILDSPAWN_SHADOWSTALKER := 11456;
+SET @NPC_WILDSPAWN_HELLCALLER := 11457;
+SET @NPC_WARPWOOD_TREANT = 11462;
+SET @NPC_WARPWOOD_CRUSHER := 13021;
+SET @NPC_WHIP_LASHER := 13022;
+SET @NPC_PHASE_LASHER := 13196;
+SET @NPC_FEL_LASH := 13197;
+
+-- SmartAI for Wildspawn Hellcaller
+SET @ENTRY := @NPC_WILDSPAWN_HELLCALLER;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+UPDATE creature SET `MovementType`=1,`spawndist`=3 WHERE `id`=@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,0,4,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - On Aggro - Prevent Combat Movement'),
+(@ENTRY,0,1,2,4,0,100,0,0,0,0,0,11,15228,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Hellcaller - On Aggro - Cast Fireball '),
+(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - On Aggro - Set Phase 1'),
+(@ENTRY,0,3,0,9,1,100,0,0,40,2400,3800,11,15228,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Hellcaller - Phase 1 - Cast Fireball'),
+(@ENTRY,0,4,5,3,1,100,0,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller -In Phase 1 - Start Combat Movement'),
+(@ENTRY,0,5,0,61,1,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - Mana at 15% (Phase 1) - Set Phase 2'),
+(@ENTRY,0,6,0,9,1,100,0,35,80,0,0,21,1,0,0,0,0,0,0,0,0,0,0,0,0,0,'Wildspawn Hellcaller - At 35 Yards (Phase 1) - Start Combat Movement'),
+(@ENTRY,0,7,0,9,1,100,0,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - at 15 Yards (Phase 1) - Prevent Combat Movement '),
+(@ENTRY,0,8,0,9,1,100,0,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - Below 5 Yards (Phase 1) - Start Combat Movement'),
+(@ENTRY,0,9,0,3,2,100,0,0,30,100,100,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - Mana is above 30% (Phase 2) - Set Phase 1'),
+(@ENTRY,0,10,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Wildspawn Hellcaller - Set Phase 1 when Mana is above 30% (Phase 2)'),
+(@ENTRY,0,11,0,0,0,100,0,8000,14000,18000,25000,11,20754,3,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Hellcaller - In Combat - Cast Rain of Fire'),
+(@ENTRY,0,12,0,2,0,100,1,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - At 15% HP - Start Combat Movement'),
+(@ENTRY,0,13,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Betrayer - At 15% HP - Flee'),
+(@ENTRY,0,14,0,7,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - On Evade - Set Phase to 0');
+
+-- SmartAI for Wildspawn Felsworn
+SET @ENTRY := @NPC_WILDSPAWN_FELSWORN;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+UPDATE creature SET `MovementType`=1,`spawndist`=3 WHERE `id`=@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,0,1,0,100,1,1000,1000,1800000,1800000,11,12542,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - Cast Chaotic Focus'),
+(@ENTRY,0,1,0,4,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - On Aggro - Prevent Combat Movement'),
+(@ENTRY,0,2,3,4,0,100,0,0,0,0,0,11,15537,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Felsworn - On Aggro - Cast Shadow Bolt'),
+(@ENTRY,0,3,0,61,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - On Aggro - Set Phase 1'),
+(@ENTRY,0,4,0,9,1,100,0,0,40,2400,3800,11,15537,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Felsworn - Phase 1 - Cast Shadow Bolt'),
+(@ENTRY,0,5,6,3,1,100,0,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn -In Phase 1 - Start Combat Movement'),
+(@ENTRY,0,6,0,61,1,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - Mana at 15% (Phase 1) - Set Phase 2'),
+(@ENTRY,0,7,0,9,1,100,0,35,80,0,0,21,1,0,0,0,0,0,0,0,0,0,0,0,0,0,'Wildspawn Felsworn - At 35 Yards (Phase 1) - Start Combat Movement'),
+(@ENTRY,0,8,0,9,1,100,0,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - at 15 Yards (Phase 1) - Prevent Combat Movement '),
+(@ENTRY,0,9,0,9,1,100,0,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - Below 5 Yards (Phase 1) - Start Combat Movement'),
+(@ENTRY,0,10,0,3,2,100,0,0,30,100,100,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - Mana is above 30% (Phase 2) - Set Phase 1'),
+(@ENTRY,0,11,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Wildspawn Felsworn - Set Phase 1 when Mana is above 30% (Phase 2)'),
+(@ENTRY,0,12,0,0,0,100,0,7000,12000,38000,45000,11,22417,1,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - In Phase 1 - Cast Shadow Shield'),
+(@ENTRY,0,13,0,0,1,100,0,11000,17000,23000,30000,11,15654,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Felsworn - In Phase 1 - Cast Shadow Word: Pain'),
+(@ENTRY,0,14,0,0,0,100,0,6000,10000,10000,15000,11,12542,1,0,0,0,0,5,0,0,0,0,0,0,0,'Wildspawn Felsworn - In Combat - Cast Fear (on random target)'),
+(@ENTRY,0,15,0,7,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - On Evade - Set Phase to 0');
+
+-- add movement
+SET @ENTRY := 56992; -- single Wildspawn Felsworn instance
+UPDATE creature SET `MovementType`=2 WHERE `guid`=@ENTRY;
+DELETE FROM `creature_addon` WHERE `guid`=@ENTRY;
+INSERT INTO `creature_addon`(`guid`,`path_id`) VALUES
+(@ENTRY,@ENTRY*10);
+
+-- Add waypoints to Wildspawn Felsworn instance
+DELETE FROM `waypoint_data` WHERE `id`=@ENTRY*10;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@ENTRY*10,1,57.4000,-737.329,-25.1524,0,0,0,100,0),
+(@ENTRY*10,2,26.45,-682.69,-24.98,0,0,0,100,0);
+
+-- Smart AI for Wildspawn Shadowstalker
+SET @ENTRY := @NPC_WILDSPAWN_SHADOWSTALKER;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+UPDATE creature SET `MovementType`=1,`spawndist`=3 WHERE `id`=@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,0,11,0,100,0,0,0,0,0,11,22766,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Shadowstalker - On Spawn - cast Sneak on self'),
+(@ENTRY,0,1,0,0,0,100,0,4000,8000,5000,8000,11,22416,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Shadowstalker - In Combat - Cast Backstab'),
+(@ENTRY,0,2,0,0,0,100,0,6000,7000,8000,9000,11,7992,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Shadowstalker - In Combat - Cast Slowing Posion');
diff --git a/sql/updates/world/2012_01_03_07_world_creature.sql b/sql/updates/world/2012_01_03_07_world_creature.sql
new file mode 100644
index 00000000000..5098901b564
--- /dev/null
+++ b/sql/updates/world/2012_01_03_07_world_creature.sql
@@ -0,0 +1,46 @@
+-- Spawn & Pathing for Horace Alder Entry: 27704 "Not Spawned"
+SET @NPC := 1846;
+DELETE FROM `creature` WHERE `guid` IN (@NPC);
+INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`) VALUES
+(@NPC,27704,1,1,1,0,0,-3738.565,-4442.265,56.23981,0.41887,300,0,0,1,0,2);
+SET @PATH := @NPC * 10;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-3740.015,-4437.762,56.23981,0,0,0,0,100,0),
+(@PATH,2,-3742.823,-4433.892,56.23981,0,0,0,0,100,0),
+(@PATH,3,-3746.757,-4431.049,56.23981,0,0,0,0,100,0),
+(@PATH,4,-3751.263,-4429.58,56.23981,0,0,0,0,100,0),
+(@PATH,5,-3756.035,-4429.627,56.23981,0,0,0,0,100,0),
+(@PATH,6,-3760.625,-4431.113,56.23981,0,0,0,0,100,0),
+(@PATH,7,-3764.42,-4433.888,56.22611,0,0,0,0,100,0),
+(@PATH,8,-3767.252,-4437.716,56.23981,0,0,0,0,100,0),
+(@PATH,9,-3768.719,-4442.307,56.23982,0,0,0,0,100,0),
+(@PATH,10,-3768.664,-4447.081,56.22474,0,0,0,0,100,0),
+(@PATH,11,-3767.221,-4451.627,56.23982,0,0,0,0,100,0),
+(@PATH,12,-3764.422,-4455.48,56.23981,0,0,0,0,100,0),
+(@PATH,13,-3767.221,-4451.627,56.23982,0,0,0,0,100,0),
+(@PATH,14,-3768.664,-4447.081,56.22474,0,0,0,0,100,0),
+(@PATH,15,-3768.719,-4442.307,56.23982,0,0,0,0,100,0),
+(@PATH,16,-3767.255,-4437.724,56.20177,0,0,0,0,100,0),
+(@PATH,17,-3764.42,-4433.888,56.22611,0,0,0,0,100,0),
+(@PATH,18,-3760.625,-4431.113,56.23981,0,0,0,0,100,0),
+(@PATH,19,-3756.035,-4429.627,56.23981,0,0,0,0,100,0),
+(@PATH,20,-3751.263,-4429.58,56.23981,0,0,0,0,100,0),
+(@PATH,21,-3746.757,-4431.049,56.23981,0,0,0,0,100,0),
+(@PATH,22,-3742.823,-4433.892,56.23981,0,0,0,0,100,0),
+(@PATH,23,-3740.015,-4437.762,56.23981,0,0,0,0,100,0),
+(@PATH,24,-3738.565,-4442.265,56.23981,0,0,0,0,100,0),
+(@PATH,25,-3738.577,-4447.063,56.23981,0,0,0,0,100,0),
+(@PATH,26,-3740.03,-4451.584,56.23981,0,0,0,0,100,0),
+(@PATH,27,-3742.872,-4455.448,56.23981,0,0,0,0,100,0),
+(@PATH,28,-3746.699,-4458.252,56.23982,0,0,0,0,100,0),
+(@PATH,29,-3751.217,-4459.749,56.26265,0,0,0,0,100,0),
+(@PATH,30,-3756.021,-4459.732,56.23981,0,0,0,0,100,0),
+(@PATH,31,-3751.217,-4459.749,56.26265,0,0,0,0,100,0),
+(@PATH,32,-3746.699,-4458.252,56.23982,0,0,0,0,100,0),
+(@PATH,33,-3742.872,-4455.448,56.23981,0,0,0,0,100,0),
+(@PATH,34,-3740.03,-4451.584,56.23981,0,0,0,0,100,0),
+(@PATH,35,-3738.577,-4447.063,56.23981,0,0,0,0,100,0),
+(@PATH,36,-3738.565,-4442.265,56.23981,0,0,0,0,100,0);
diff --git a/sql/updates/world/2012_01_04_00_world_gossip_menu.sql b/sql/updates/world/2012_01_04_00_world_gossip_menu.sql
new file mode 100644
index 00000000000..cf11ba74eb2
--- /dev/null
+++ b/sql/updates/world/2012_01_04_00_world_gossip_menu.sql
@@ -0,0 +1,70 @@
+-- Update npc_text from sniff
+UPDATE `npc_text` SET `prob0`=1,`text0_0`='I wandered for the rest of my natural life in search of knowledge, seeing more wonder and meeting more strange and mysterious races than any of my people before me. I travelled across the length and breadth of ancient Kalimdor until there was no more to see, no new lands across the horizon.$B$BYet... there was still so much I did not know as I felt my final journey approaching and I wept for the things I would never know.$B$BAs I fell, my life at an end, that is when they found me.',`WDBVerified`=14545 WHERE `ID`=14121;
+UPDATE `npc_text` SET `prob0`=1,`text0_0`='The bronze dragonflight. They snatched me from the brink of death and took me before their master, Nozdormu. He said they had been watching me and wanted me to continue my hunt. He granted me immortality as a watcher, tasked to bear witness to the history of Azeroth as one of his agents.$B$BI am Xarantaur the Witness, and it is my duty to preserve the true history of Azeroth lest it be forgotten.',`WDBVerified`=14545 WHERE `ID`=14122;
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=10217 AND `text_id`=14204;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (10217,14204);
+DELETE FROM `gossip_menu` WHERE `entry`=10174 AND `text_id`=14118;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (10174,14118);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=10217 WHERE `entry`=30824;
+UPDATE `creature_template` SET `gossip_menu_id`=10038 WHERE `entry`=31261;
+UPDATE `creature_template` SET `gossip_menu_id`=10174 WHERE `entry`=30825;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (10026,10174) AND `id` IN (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
+(10026,0,0, 'Take me to the ship.',1,1,0,0,0,0, ''),
+(10174,0,1, 'I want to browse your goods.',3,128,0,0,0,0, '');
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=9806 AND `text_id`=13525;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9806,13525);
+DELETE FROM `gossip_menu` WHERE `entry`=9807 AND `text_id`=13526;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9807,13526);
+DELETE FROM `gossip_menu` WHERE `entry`=9808 AND `text_id`=13527;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9808,13527);
+DELETE FROM `gossip_menu` WHERE `entry`=9809 AND `text_id`=13528;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9809,13528);
+DELETE FROM `gossip_menu` WHERE `entry`=9810 AND `text_id`=13529;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9810,13529);
+DELETE FROM `gossip_menu` WHERE `entry`=9811 AND `text_id`=13530;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9811,13530);
+DELETE FROM `gossip_menu` WHERE `entry`=9812 AND `text_id`=13531;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9812,13531);
+DELETE FROM `gossip_menu` WHERE `entry`=9813 AND `text_id`=13534;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9813,13534);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=9806 WHERE `entry`=29344;
+UPDATE `creature_template` SET `gossip_menu_id`=9813 WHERE `entry`=29396;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9806,9807,9808,9809,9810,9811,9812) AND `id` IN (0);
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9808,9809,9810,9811,9812) AND `id` IN (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
+(9806,0,0, 'Lord-Commander, I would hear your tale.',1,1,9807,0,0,0, ''),
+(9807,0,0, '<You nod slightly but do not complete the motion as the lord-commander narrows his eyes before he continues.>',1,1,9808,0,0,0, ''),
+(9808,0,0, 'I thought that they now called themselves the Scarlet Onslaught?',1,1,9809,0,0,0, ''),
+(9808,1,0, 'Lord-Commander, would you repeat what you said before?',1,1,9807,0,0,0, ''),
+(9809,0,0, 'Where did the grand admiral go?',1,1,9810,0,0,0, ''),
+(9809,1,0, 'Lord-Commander, would you repeat what you said before?',1,1,9808,0,0,0, ''),
+(9810,0,0, 'That''s fine. When do I start?',1,1,9811,0,0,0, ''),
+(9810,1,0, 'Lord-Commander, would you repeat what you said before?',1,1,9809,0,0,0, ''),
+(9811,0,0, 'Let''s finish this!',1,1,9812,0,0,0, ''),
+(9811,1,0, 'Lord-Commander, would you repeat what you said before?',1,1,9810,0,0,0, ''),
+(9812,0,0, 'That''s quite a tale, lord-commander.',1,1,0,0,0,0, ''),
+(9812,1,0, 'Lord-Commander, would you repeat what you said before?',1,1,9811,0,0,0, '');
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=9168 AND `text_id`=12427;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9168,12427);
+DELETE FROM `gossip_menu` WHERE `entry`=9184 AND `text_id`=12472;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9184,12472);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=9168 WHERE `entry`=25504;
+UPDATE `creature_template` SET `gossip_menu_id`=9184 WHERE `entry`=25379;
+UPDATE `creature_template` SET `gossip_menu_id`=348 WHERE `entry`=25278;
diff --git a/sql/updates/world/2012_01_04_01_world_game_event_seasonal_questrelation.sql b/sql/updates/world/2012_01_04_01_world_game_event_seasonal_questrelation.sql
new file mode 100644
index 00000000000..9746a358e8a
--- /dev/null
+++ b/sql/updates/world/2012_01_04_01_world_game_event_seasonal_questrelation.sql
@@ -0,0 +1,386 @@
+DROP TABLE IF EXISTS `game_event_seasonal_questrelation`;
+CREATE TABLE `game_event_seasonal_questrelation` (
+ `quest` mediumint(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier',
+ `event` mediumint(10) NOT NULL DEFAULT '0' COMMENT 'Quest Identifier',
+ PRIMARY KEY (`quest`,`event`),
+ KEY `idx_quest` (`quest`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Player System';
+
+INSERT INTO `game_event_seasonal_questrelation` (`quest`,`event`) VALUES
+ (1657, 12),
+ (1658, 12),
+ (6961, 2),
+ (6962, 2),
+ (6963, 2),
+ (6964, 2),
+ (6983, 3),
+ (6984, 3),
+ (7021, 2),
+ (7022, 2),
+ (7023, 2),
+ (7024, 2),
+ (7025, 2),
+ (7042, 2),
+ (7043, 2),
+ (7045, 2),
+ (7061, 2),
+ (7062, 2),
+ (7063, 2),
+ (8149, 11),
+ (8150, 11),
+ (8311, 12),
+ (8312, 12),
+ (8322, 12),
+ (8353, 12),
+ (8354, 12),
+ (8355, 12),
+ (8356, 12),
+ (8357, 12),
+ (8358, 12),
+ (8359, 12),
+ (8360, 12),
+ (8373, 12),
+ (8409, 12),
+ (8744, 52),
+ (8746, 2),
+ (8762, 2),
+ (8763, 2),
+ (8767, 52),
+ (8768, 52),
+ (8769, 52),
+ (8788, 52),
+ (8799, 2),
+ (8803, 52),
+ (8827, 2),
+ (8828, 2),
+ (8860, 6),
+ (8861, 6),
+ (8868, 7),
+ (8897, 8),
+ (8898, 8),
+ (8899, 8),
+ (8900, 8),
+ (8901, 8),
+ (8902, 8),
+ (8903, 8),
+ (8904, 8),
+ (8971, -1),
+ (8972, -1),
+ (8973, -1),
+ (8974, -1),
+ (8975, -1),
+ (8976, -1),
+ (8979, 8),
+ (8980, 8),
+ (8981, 8),
+ (8982, 8),
+ (8983, 8),
+ (8984, 8),
+ (8993, 8),
+ (9024, 8),
+ (9025, 8),
+ (9026, 8),
+ (9027, 8),
+ (9028, 8),
+ (11131, 12),
+ (11135, 12),
+ (11219, 12),
+ (11220, 12),
+ (11242, 12),
+ (11356, 12),
+ (11357, 12),
+ (11360, 12),
+ (11361, 12),
+ (11392, 12),
+ (11401, 12),
+ (11403, 12),
+ (11404, 12),
+ (11405, 12),
+ (11435, 12),
+ (11439, 12),
+ (11440, 12),
+ (11449, 12),
+ (11450, 12),
+ (11528, 52),
+ (11558, 8),
+ (11580, 1),
+ (11581, 1),
+ (11583, 1),
+ (11584, 1),
+ (11696, 1),
+ (11732, 1),
+ (11734, 1),
+ (11735, 1),
+ (11736, 1),
+ (11737, 1),
+ (11738, 1),
+ (11739, 1),
+ (11740, 1),
+ (11741, 1),
+ (11742, 1),
+ (11743, 1),
+ (11744, 1),
+ (11745, 1),
+ (11746, 1),
+ (11747, 1),
+ (11748, 1),
+ (11749, 1),
+ (11750, 1),
+ (11751, 1),
+ (11752, 1),
+ (11753, 1),
+ (11754, 1),
+ (11755, 1),
+ (11756, 1),
+ (11757, 1),
+ (11758, 1),
+ (11759, 1),
+ (11760, 1),
+ (11761, 1),
+ (11762, 1),
+ (11763, 1),
+ (11764, 1),
+ (11765, 1),
+ (11766, 1),
+ (11767, 1),
+ (11768, 1),
+ (11769, 1),
+ (11770, 1),
+ (11771, 1),
+ (11772, 1),
+ (11773, 1),
+ (11774, 1),
+ (11775, 1),
+ (11776, 1),
+ (11777, 1),
+ (11778, 1),
+ (11779, 1),
+ (11780, 1),
+ (11781, 1),
+ (11782, 1),
+ (11783, 1),
+ (11784, 1),
+ (11785, 1),
+ (11786, 1),
+ (11787, 1),
+ (11799, 1),
+ (11800, 1),
+ (11801, 1),
+ (11802, 1),
+ (11803, 1),
+ (11804, 1),
+ (11805, 1),
+ (11806, 1),
+ (11807, 1),
+ (11808, 1),
+ (11809, 1),
+ (11810, 1),
+ (11811, 1),
+ (11812, 1),
+ (11813, 1),
+ (11814, 1),
+ (11815, 1),
+ (11816, 1),
+ (11817, 1),
+ (11818, 1),
+ (11819, 1),
+ (11820, 1),
+ (11821, 1),
+ (11822, 1),
+ (11823, 1),
+ (11824, 1),
+ (11825, 1),
+ (11826, 1),
+ (11827, 1),
+ (11828, 1),
+ (11829, 1),
+ (11830, 1),
+ (11831, 1),
+ (11832, 1),
+ (11833, 1),
+ (11834, 1),
+ (11835, 1),
+ (11836, 1),
+ (11837, 1),
+ (11838, 1),
+ (11839, 1),
+ (11840, 1),
+ (11841, 1),
+ (11842, 1),
+ (11843, 1),
+ (11844, 1),
+ (11845, 1),
+ (11846, 1),
+ (11847, 1),
+ (11848, 1),
+ (11849, 1),
+ (11850, 1),
+ (11851, 1),
+ (11852, 1),
+ (11853, 1),
+ (11854, 1),
+ (11855, 1),
+ (11856, 1),
+ (11857, 1),
+ (11858, 1),
+ (11859, 1),
+ (11860, 1),
+ (11861, 1),
+ (11862, 1),
+ (11863, 1),
+ (11937, 1),
+ (11976, 1),
+ (12133, 12),
+ (12135, 12),
+ (12139, 12),
+ (12155, 12),
+ (12286, -1),
+ (12313, 24),
+ (12331, 12),
+ (12332, 12),
+ (12333, 12),
+ (12334, 12),
+ (12335, 12),
+ (12336, 12),
+ (12337, 12),
+ (12338, 12),
+ (12339, 12),
+ (12340, 12),
+ (12341, 12),
+ (12342, 12),
+ (12343, 12),
+ (12344, 12),
+ (12345, 12),
+ (12346, 12),
+ (12347, 12),
+ (12348, 12),
+ (12349, 12),
+ (12350, 12),
+ (12351, 12),
+ (12352, 12),
+ (12353, 12),
+ (12354, 12),
+ (12355, 12),
+ (12356, 12),
+ (12357, 12),
+ (12358, 12),
+ (12359, 12),
+ (12360, 12),
+ (12361, 12),
+ (12362, 12),
+ (12363, 12),
+ (12364, 12),
+ (12365, 12),
+ (12366, 12),
+ (12367, 12),
+ (12368, 12),
+ (12369, 12),
+ (12370, 12),
+ (12371, 12),
+ (12373, 12),
+ (12374, 12),
+ (12375, 12),
+ (12376, 12),
+ (12377, 12),
+ (12378, 12),
+ (12379, 12),
+ (12380, 12),
+ (12381, 12),
+ (12382, 12),
+ (12383, 12),
+ (12384, 12),
+ (12385, 12),
+ (12386, 12),
+ (12387, 12),
+ (12388, 12),
+ (12389, 12),
+ (12390, 12),
+ (12391, 12),
+ (12392, 12),
+ (12393, 12),
+ (12394, 12),
+ (12395, 12),
+ (12396, 12),
+ (12397, 12),
+ (12398, 12),
+ (12399, 12),
+ (12400, 12),
+ (12401, 12),
+ (12402, 12),
+ (12403, 12),
+ (12404, 12),
+ (12405, 12),
+ (12406, 12),
+ (12407, 12),
+ (12408, 12),
+ (12409, 12),
+ (12410, 12),
+ (12940, 12),
+ (12941, 12),
+ (12944, 12),
+ (12945, 12),
+ (12946, 12),
+ (12947, 12),
+ (12950, 12),
+ (13203, 52),
+ (13433, 12),
+ (13434, 12),
+ (13435, 12),
+ (13436, 12),
+ (13437, 12),
+ (13438, 12),
+ (13439, 12),
+ (13440, 12),
+ (13441, 12),
+ (13442, 12),
+ (13443, 12),
+ (13444, 12),
+ (13445, 12),
+ (13446, 12),
+ (13447, 12),
+ (13448, 12),
+ (13449, 12),
+ (13450, 12),
+ (13451, 12),
+ (13452, 12),
+ (13453, 12),
+ (13454, 12),
+ (13455, 12),
+ (13456, 12),
+ (13457, 12),
+ (13458, 12),
+ (13459, 12),
+ (13460, 12),
+ (13461, 12),
+ (13462, 12),
+ (13463, 12),
+ (13464, 12),
+ (13465, 12),
+ (13466, 12),
+ (13467, 12),
+ (13468, 12),
+ (13469, 12),
+ (13470, 12),
+ (13471, 12),
+ (13472, 12),
+ (13473, 12),
+ (13474, 12),
+ (13485, 1),
+ (13486, 1),
+ (13487, 1),
+ (13488, 1),
+ (13489, 1),
+ (13490, 1),
+ (13491, 1),
+ (13492, 1),
+ (13493, 1),
+ (13494, 1),
+ (13495, 1),
+ (13496, 1),
+ (13497, 1),
+ (13498, 1),
+ (13499, 1),
+ (13500, 1),
+ (13501, 12),
+ (13548, 12),
+ (13966, 52);
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 10ec8500923..6d6a8fd5071 100755
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -14529,7 +14529,7 @@ bool Player::CanSeeStartQuest(Quest const* quest)
SatisfyQuestExclusiveGroup(quest, false) && SatisfyQuestReputation(quest, false) &&
SatisfyQuestPreviousQuest(quest, false) && SatisfyQuestNextChain(quest, false) &&
SatisfyQuestPrevChain(quest, false) && SatisfyQuestDay(quest, false) && SatisfyQuestWeek(quest, false) &&
- !DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this))
+ SatisfyQuestSeasonal(quest, false) && !DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this))
{
return getLevel() + sWorld->getIntConfig(CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF) >= quest->GetMinLevel();
}
@@ -14545,7 +14545,7 @@ bool Player::CanTakeQuest(Quest const* quest, bool msg)
&& SatisfyQuestPreviousQuest(quest, msg) && SatisfyQuestTimed(quest, msg)
&& SatisfyQuestNextChain(quest, msg) && SatisfyQuestPrevChain(quest, msg)
&& SatisfyQuestDay(quest, msg) && SatisfyQuestWeek(quest, msg)
- && !DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this)
+ && SatisfyQuestSeasonal(quest,msg) && !DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this)
&& SatisfyQuestConditions(quest, msg);
}
@@ -14669,7 +14669,7 @@ bool Player::CanRewardQuest(Quest const* quest, bool msg)
return false;
// daily quest can't be rewarded (25 daily quest already completed)
- if (!SatisfyQuestDay(quest, true) || !SatisfyQuestWeek(quest, true))
+ if (!SatisfyQuestDay(quest, true) || !SatisfyQuestWeek(quest, true) || !SatisfyQuestSeasonal(quest,true))
return false;
// rewarded and not repeatable quest (only cheating case, then ignore without message)
@@ -14978,6 +14978,8 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
}
else if (quest->IsWeekly())
SetWeeklyQuestStatus(quest_id);
+ else if (quest->IsSeasonal())
+ SetSeasonalQuestStatus(quest_id);
RemoveActiveQuest(quest_id);
m_RewardedQuests.insert(quest_id);
@@ -15333,7 +15335,7 @@ bool Player::SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg)
// not allow have daily quest if daily quest from exclusive group already recently completed
Quest const* Nquest = sObjectMgr->GetQuestTemplate(exclude_Id);
- if (!SatisfyQuestDay(Nquest, false) || !SatisfyQuestWeek(Nquest, false))
+ if (!SatisfyQuestDay(Nquest, false) || !SatisfyQuestWeek(Nquest, false) || !SatisfyQuestSeasonal(Nquest,false))
{
if (msg)
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
@@ -15342,7 +15344,7 @@ bool Player::SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg)
}
// alternative quest already started or completed - but don't check rewarded states if both are repeatable
- if (GetQuestStatus(exclude_Id) != QUEST_STATUS_NONE || (!(qInfo->IsRepeatable() && Nquest->IsRepeatable()) && m_RewardedQuests.find(exclude_Id) != m_RewardedQuests.end()))
+ if (GetQuestStatus(exclude_Id) != QUEST_STATUS_NONE || (!(qInfo->IsRepeatable() && Nquest->IsRepeatable()) && (m_RewardedQuests.find(exclude_Id) != m_RewardedQuests.end())))
{
if (msg)
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
@@ -15443,6 +15445,15 @@ bool Player::SatisfyQuestWeek(Quest const* qInfo, bool /*msg*/)
return m_weeklyquests.find(qInfo->GetQuestId()) == m_weeklyquests.end();
}
+bool Player::SatisfyQuestSeasonal(Quest const* qInfo, bool /*msg*/)
+{
+ if (!qInfo->IsSeasonal() || m_seasonalquests.empty())
+ return true;
+ if (m_seasonalquests.find(qInfo->GetSeasonalQuestEvent()) == m_seasonalquests.end()) return false;
+ // if not found in cooldown list
+ return m_seasonalquests[qInfo->GetSeasonalQuestEvent()].find(qInfo->GetQuestId()) == m_seasonalquests[qInfo->GetSeasonalQuestEvent()].end();
+}
+
bool Player::GiveQuestSourceItem(Quest const* quest)
{
uint32 srcitem = quest->GetSrcItemId();
@@ -16980,7 +16991,8 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder)
_LoadQuestStatus(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADQUESTSTATUS));
_LoadQuestStatusRewarded(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADQUESTSTATUSREW));
_LoadDailyQuestStatus(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS));
- _LoadWeeklyQuestStatus(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADWEKLYQUESTSTATUS));
+ _LoadWeeklyQuestStatus(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADWEEKLYQUESTSTATUS));
+ _LoadSeasonalQuestStatus(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADSEASONALQUESTSTATUS));
_LoadRandomBGStatus(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADRANDOMBG));
// after spell and quest load
@@ -17846,6 +17858,29 @@ void Player::_LoadWeeklyQuestStatus(PreparedQueryResult result)
m_WeeklyQuestChanged = false;
}
+void Player::_LoadSeasonalQuestStatus(PreparedQueryResult result)
+{
+ m_seasonalquests.clear();
+
+ if (result)
+ {
+ do
+ {
+ uint32 quest_id = (*result)[0].GetUInt32();
+ uint16 event_id = (*result)[1].GetUInt16();
+ Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
+ if (!quest)
+ continue;
+
+ m_seasonalquests[event_id].insert(quest_id);
+ sLog->outDebug(LOG_FILTER_PLAYER_LOADING, "Seasonal quest {%u} cooldown for player (GUID: %u)", quest_id, GetGUIDLow());
+ }
+ while (result->NextRow());
+ }
+
+ m_SeasonalQuestChanged = false;
+}
+
void Player::_LoadSpells(PreparedQueryResult result)
{
//QueryResult* result = CharacterDatabase.PQuery("SELECT spell, active, disabled FROM character_spell WHERE guid = '%u'", GetGUIDLow());
@@ -18572,6 +18607,7 @@ void Player::SaveToDB(bool create /*=false*/)
_SaveQuestStatus(trans);
_SaveDailyQuestStatus(trans);
_SaveWeeklyQuestStatus(trans);
+ _SaveSeasonalQuestStatus(trans);
_SaveTalents(trans);
_SaveSpells(trans);
_SaveSpellCooldowns(trans);
@@ -18910,18 +18946,28 @@ void Player::_SaveDailyQuestStatus(SQLTransaction& trans)
// save last daily quest time for all quests: we need only mostly reset time for reset check anyway
// we don't need transactions here.
- trans->PAppend("DELETE FROM character_queststatus_daily WHERE guid = '%u'", GetGUIDLow());
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_DAILY_CHAR);
+ stmt->setUInt32(0, GetGUIDLow());
+ trans->Append(stmt);
for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
if (GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx))
- trans->PAppend("INSERT INTO character_queststatus_daily (guid, quest, time) VALUES ('%u', '%u', '" UI64FMTD "')",
- GetGUIDLow(), GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx), uint64(m_lastDailyQuestTime));
+ {
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
+ stmt->setUInt32(0, GetGUIDLow());
+ stmt->setUInt32(1, GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx));
+ stmt->setUInt64(2, uint64(m_lastDailyQuestTime));
+ trans->Append(stmt);
+ }
if (!m_DFQuests.empty())
{
for (DFQuestsDoneList::iterator itr = m_DFQuests.begin(); itr != m_DFQuests.end(); ++itr)
{
- trans->PAppend("INSERT INTO character_queststatus_daily (guid, quest, time) VALUES ('%u', '%u', '" UI64FMTD "')",
- GetGUIDLow(), (*itr), uint64(m_lastDailyQuestTime));
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
+ stmt->setUInt32(0, GetGUIDLow());
+ stmt->setUInt32(1, (*itr));
+ stmt->setUInt64(2, uint64(m_lastDailyQuestTime));
+ trans->Append(stmt);
}
}
}
@@ -18932,18 +18978,51 @@ void Player::_SaveWeeklyQuestStatus(SQLTransaction& trans)
return;
// we don't need transactions here.
- trans->PAppend("DELETE FROM character_queststatus_weekly WHERE guid = '%u'", GetGUIDLow());
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR);
+ stmt->setUInt32(0, GetGUIDLow());
+ trans->Append(stmt);
for (QuestSet::const_iterator iter = m_weeklyquests.begin(); iter != m_weeklyquests.end(); ++iter)
{
uint32 quest_id = *iter;
- trans->PAppend("INSERT INTO character_queststatus_weekly (guid, quest) VALUES ('%u', '%u')", GetGUIDLow(), quest_id);
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS);
+ stmt->setUInt32(0, GetGUIDLow());
+ stmt->setUInt32(1, quest_id);
+ trans->Append(stmt);
}
m_WeeklyQuestChanged = false;
}
+void Player::_SaveSeasonalQuestStatus(SQLTransaction& trans)
+{
+ if (!m_SeasonalQuestChanged || m_seasonalquests.empty())
+ return;
+
+ // we don't need transactions here.
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR);
+ stmt->setUInt32(0, GetGUIDLow());
+ trans->Append(stmt);
+
+ for (SeasonalEventQuestMap::const_iterator iter = m_seasonalquests.begin(); iter != m_seasonalquests.end(); ++iter)
+ {
+ uint16 event_id = iter->first;
+ for (SeasonalQuestSet::const_iterator itr = (iter->second).begin(); itr != (iter->second).end(); ++itr)
+ {
+ uint32 quest_id = (*itr);
+
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_SEASONALQUESTSTATUS);
+ stmt->setUInt32(0,GetGUIDLow());
+ stmt->setUInt32(1,quest_id);
+ stmt->setUInt16(1,event_id);
+ trans->Append(stmt);
+ }
+ }
+
+ m_SeasonalQuestChanged = false;
+}
+
void Player::_SaveSkills(SQLTransaction& trans)
{
// we don't need transactions here.
@@ -22036,6 +22115,16 @@ void Player::SetWeeklyQuestStatus(uint32 quest_id)
m_WeeklyQuestChanged = true;
}
+void Player::SetSeasonalQuestStatus(uint32 quest_id)
+{
+ Quest const* q = sObjectMgr->GetQuestTemplate(quest_id);
+ if (!q)
+ return;
+
+ m_seasonalquests[q->GetSeasonalQuestEvent()].insert(quest_id);
+ m_SeasonalQuestChanged = true;
+}
+
void Player::ResetDailyQuestStatus()
{
for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
@@ -22058,6 +22147,16 @@ void Player::ResetWeeklyQuestStatus()
m_WeeklyQuestChanged = false;
}
+void Player::ResetSeasonalQuestStatus(uint16 event_id)
+{
+ if (m_seasonalquests.empty() || m_seasonalquests[event_id].empty())
+ return;
+
+ m_seasonalquests.erase(event_id);
+ // DB data deleted in caller
+ m_SeasonalQuestChanged = false;
+}
+
Battleground* Player::GetBattleground() const
{
if (GetBattlegroundId() == 0)
@@ -23201,6 +23300,9 @@ void Player::RemoveRunesByAuraEffect(AuraEffect const* aura)
void Player::RestoreBaseRune(uint8 index)
{
AuraEffect const* aura = m_runes->runes[index].ConvertAura;
+ // If rune was converted by a non-pasive aura that still active we should keep it converted
+ if (aura && !(aura->GetSpellInfo()->Attributes & SPELL_ATTR0_PASSIVE))
+ return;
ConvertRune(index, GetBaseRune(index));
SetRuneConvertAura(index, NULL);
// Don't drop passive talents providing rune convertion
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 7da008d597b..21c87a993dc 100755
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -815,11 +815,12 @@ enum PlayerLoginQueryIndex
PLAYER_LOGIN_QUERY_LOADTALENTS = 23,
PLAYER_LOGIN_QUERY_LOADACCOUNTDATA = 24,
PLAYER_LOGIN_QUERY_LOADSKILLS = 25,
- PLAYER_LOGIN_QUERY_LOADWEKLYQUESTSTATUS = 26,
+ PLAYER_LOGIN_QUERY_LOADWEEKLYQUESTSTATUS = 26,
PLAYER_LOGIN_QUERY_LOADRANDOMBG = 27,
PLAYER_LOGIN_QUERY_LOADBANNED = 28,
PLAYER_LOGIN_QUERY_LOADQUESTSTATUSREW = 29,
PLAYER_LOGIN_QUERY_LOADINSTANCELOCKTIMES = 30,
+ PLAYER_LOGIN_QUERY_LOADSEASONALQUESTSTATUS = 31,
MAX_PLAYER_LOGIN_QUERY,
};
@@ -1422,6 +1423,7 @@ class Player : public Unit, public GridObject<Player>
bool SatisfyQuestPrevChain(Quest const* qInfo, bool msg);
bool SatisfyQuestDay(Quest const* qInfo, bool msg);
bool SatisfyQuestWeek(Quest const* qInfo, bool msg);
+ bool SatisfyQuestSeasonal(Quest const* qInfo, bool msg);
bool GiveQuestSourceItem(Quest const* quest);
bool TakeQuestSourceItem(uint32 questId, bool msg);
bool GetQuestRewardStatus(uint32 quest_id) const;
@@ -1432,8 +1434,10 @@ class Player : public Unit, public GridObject<Player>
void SetDailyQuestStatus(uint32 quest_id);
void SetWeeklyQuestStatus(uint32 quest_id);
+ void SetSeasonalQuestStatus(uint32 quest_id);
void ResetDailyQuestStatus();
void ResetWeeklyQuestStatus();
+ void ResetSeasonalQuestStatus(uint16 event_id);
uint16 FindQuestSlot(uint32 quest_id) const;
uint32 GetQuestSlotQuestId(uint16 slot) const { return GetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_ID_OFFSET); }
@@ -2558,8 +2562,11 @@ class Player : public Unit, public GridObject<Player>
//We allow only one timed quest active at the same time. Below can then be simple value instead of set.
typedef std::set<uint32> QuestSet;
+ typedef std::set<uint32> SeasonalQuestSet;
+ typedef UNORDERED_MAP<uint32,SeasonalQuestSet> SeasonalEventQuestMap;
QuestSet m_timedquests;
QuestSet m_weeklyquests;
+ SeasonalEventQuestMap m_seasonalquests;
uint64 m_divider;
uint32 m_ingametime;
@@ -2580,6 +2587,7 @@ class Player : public Unit, public GridObject<Player>
void _LoadQuestStatusRewarded(PreparedQueryResult result);
void _LoadDailyQuestStatus(PreparedQueryResult result);
void _LoadWeeklyQuestStatus(PreparedQueryResult result);
+ void _LoadSeasonalQuestStatus(PreparedQueryResult result);
void _LoadRandomBGStatus(PreparedQueryResult result);
void _LoadGroup(PreparedQueryResult result);
void _LoadSkills(PreparedQueryResult result);
@@ -2605,6 +2613,7 @@ class Player : public Unit, public GridObject<Player>
void _SaveQuestStatus(SQLTransaction& trans);
void _SaveDailyQuestStatus(SQLTransaction& trans);
void _SaveWeeklyQuestStatus(SQLTransaction& trans);
+ void _SaveSeasonalQuestStatus(SQLTransaction& trans);
void _SaveSkills(SQLTransaction& trans);
void _SaveSpells(SQLTransaction& trans);
void _SaveEquipmentSets(SQLTransaction& trans);
@@ -2716,6 +2725,7 @@ class Player : public Unit, public GridObject<Player>
bool m_DailyQuestChanged;
bool m_WeeklyQuestChanged;
+ bool m_SeasonalQuestChanged;
time_t m_lastDailyQuestTime;
uint32 m_drunkTimer;
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 7d470d663d2..4e9e273e628 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -1127,7 +1127,7 @@ void Unit::DealSpellDamage(SpellNonMeleeDamage* damageInfo, bool durabilityLoss)
SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(damageInfo->SpellID);
if (spellProto == NULL)
{
- sLog->outDebug(LOG_FILTER_UNITS, "Unit::DealSpellDamage have wrong damageInfo->SpellID: %u", damageInfo->SpellID);
+ sLog->outDebug(LOG_FILTER_UNITS, "Unit::DealSpellDamage has wrong damageInfo->SpellID: %u", damageInfo->SpellID);
return;
}
@@ -2397,7 +2397,7 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spell)
case MELEE_HIT_BLOCK: canBlock = false; break;
case MELEE_HIT_PARRY: canParry = false; break;
default:
- sLog->outStaticDebug("Spell %u SPELL_AURA_IGNORE_COMBAT_RESULT have unhandled state %d", (*i)->GetId(), (*i)->GetMiscValue());
+ sLog->outStaticDebug("Spell %u SPELL_AURA_IGNORE_COMBAT_RESULT has unhandled state %d", (*i)->GetId(), (*i)->GetMiscValue());
break;
}
}
@@ -4643,7 +4643,7 @@ void Unit::AddGameObject(GameObject* gameObj)
SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(gameObj->GetSpellId());
// Need disable spell use for owner
if (createBySpell && createBySpell->Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE)
- // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existed cases)
+ // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
ToPlayer()->AddSpellAndCategoryCooldowns(createBySpell, 0, NULL, true);
}
}
@@ -4673,7 +4673,7 @@ void Unit::RemoveGameObject(GameObject* gameObj, bool del)
SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(spellid);
// Need activate spell use for owner
if (createBySpell && createBySpell->Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE)
- // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existed cases)
+ // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
ToPlayer()->SendCooldownEvent(createBySpell);
}
}
@@ -4968,7 +4968,7 @@ bool Unit::HandleHasteAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
if (!triggerEntry)
{
- sLog->outError("Unit::HandleHasteAuraProc: Spell %u have not existed triggered spell %u", hasteSpell->Id, triggered_spell_id);
+ sLog->outError("Unit::HandleHasteAuraProc: Spell %u has non-existing triggered spell %u", hasteSpell->Id, triggered_spell_id);
return false;
}
@@ -5026,7 +5026,7 @@ bool Unit::HandleSpellCritChanceAuraProc(Unit* victim, uint32 /*damage*/, AuraEf
if (!triggerEntry)
{
- sLog->outError("Unit::HandleHasteAuraProc: Spell %u have not existed triggered spell %u", triggeredByAuraSpell->Id, triggered_spell_id);
+ sLog->outError("Unit::HandleHasteAuraProc: Spell %u has non-existing triggered spell %u", triggeredByAuraSpell->Id, triggered_spell_id);
return false;
}
@@ -5622,7 +5622,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
case SPELLFAMILY_MAGE:
{
// Magic Absorption
- if (dummySpell->SpellIconID == 459) // only this spell have SpellIconID == 459 and dummy aura
+ if (dummySpell->SpellIconID == 459) // only this spell has SpellIconID == 459 and dummy aura
{
if (getPowerType() != POWER_MANA)
return false;
@@ -7124,7 +7124,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
SpellInfo const* windfurySpellInfo = sSpellMgr->GetSpellInfo(spellId);
if (!windfurySpellInfo)
{
- sLog->outError("Unit::HandleDummyAuraProc: non existed spell id: %u (Windfury)", spellId);
+ sLog->outError("Unit::HandleDummyAuraProc: non-existing spell id: %u (Windfury)", spellId);
return false;
}
@@ -7431,7 +7431,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
return false;
}
// Lightning Overload
- if (dummySpell->SpellIconID == 2018) // only this spell have SpellFamily Shaman SpellIconID == 2018 and dummy aura
+ if (dummySpell->SpellIconID == 2018) // only this spell has SpellFamily Shaman SpellIconID == 2018 and dummy aura
{
if (!procSpell || GetTypeId() != TYPEID_PLAYER || !victim)
return false;
@@ -7483,7 +7483,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
if (!roll_chance_f(chance))
return false;
- // Remove cooldown (Chain Lightning - have Category Recovery time)
+ // Remove cooldown (Chain Lightning - has Category Recovery time)
ToPlayer()->RemoveSpellCooldown(spellId);
}
@@ -7794,7 +7794,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
if (!triggerEntry)
{
- sLog->outError("Unit::HandleDummyAuraProc: Spell %u have not existed triggered spell %u", dummySpell->Id, triggered_spell_id);
+ sLog->outError("Unit::HandleDummyAuraProc: Spell %u has non-existing triggered spell %u", dummySpell->Id, triggered_spell_id);
return false;
}
@@ -7852,7 +7852,7 @@ bool Unit::HandleObsModEnergyAuraProc(Unit* victim, uint32 /*damage*/, AuraEffec
// Try handle unknown trigger spells
if (!triggerEntry)
{
- sLog->outError("Unit::HandleObsModEnergyAuraProc: Spell %u have not existed triggered spell %u", dummySpell->Id, triggered_spell_id);
+ sLog->outError("Unit::HandleObsModEnergyAuraProc: Spell %u has non-existing triggered spell %u", dummySpell->Id, triggered_spell_id);
return false;
}
@@ -7905,7 +7905,7 @@ bool Unit::HandleModDamagePctTakenAuraProc(Unit* victim, uint32 /*damage*/, Aura
if (!triggerEntry)
{
- sLog->outError("Unit::HandleModDamagePctTakenAuraProc: Spell %u have not existed triggered spell %u", dummySpell->Id, triggered_spell_id);
+ sLog->outError("Unit::HandleModDamagePctTakenAuraProc: Spell %u has non-existing triggered spell %u", dummySpell->Id, triggered_spell_id);
return false;
}
@@ -8651,8 +8651,8 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(trigger_spell_id);
if (triggerEntry == NULL)
{
- // Not cast unknown spell
- // sLog->outError("Unit::HandleProcTriggerSpell: Spell %u have 0 in EffectTriggered[%d], not handled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex());
+ // Don't cast unknown spell
+ // sLog->outError("Unit::HandleProcTriggerSpell: Spell %u has 0 in EffectTriggered[%d]. Unhandled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex());
return false;
}
@@ -8739,7 +8739,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
if (!victim || !victim->isAlive())
return false;
- // Not give if target already have full health
+ // Doesn't proc if target already has full health
if (victim->IsFullHealth())
return false;
// If your Greater Heal brings the target to full health, you gain $37595s1 mana.
@@ -8950,7 +8950,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
if ((maelstrom->GetStackAmount() == maelstrom->GetSpellInfo()->StackAmount) && roll_chance_i(aurEff->GetAmount()))
CastSpell(this, 70831, true, castItem, triggeredByAura);
- // have rank dependent proc chance, ignore too often cases
+ // has rank dependant proc chance, ignore too often cases
// PPM = 2.5 * (rank of talent),
uint32 rank = auraSpellInfo->GetRank();
// 5 rank -> 100% 4 rank -> 80% and etc from full rate
@@ -9304,7 +9304,7 @@ ReputationRank Unit::GetReactionTo(Unit const* target) const
&& selfPlayerOwner->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_CONTESTED_PVP))
return REP_HOSTILE;
- // if faction have reputation then hostile state dependent only from at_war state
+ // if faction has reputation, hostile state depends only from AtWar state
if (selfPlayerOwner->GetReputationMgr().IsAtWar(targetFactionEntry))
return REP_HOSTILE;
return REP_FRIENDLY;
@@ -10450,7 +10450,7 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellInfo const* spellProto, uint32
{
if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
{
- // effect 0 have expected value but in negative state
+ // effect 0 has expected value but in negative state
int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
AddPctN(DoneTotalMod, bonus);
}
@@ -11708,7 +11708,7 @@ void Unit::MeleeDamageBonus(Unit* victim, uint32 *pdamage, WeaponAttackType attT
{
if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
{
- // effect 0 have expected value but in negative state
+ // effect 0 has expected value but in negative state
int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
AddPctN(DoneTotalMod, bonus);
}
@@ -12973,7 +12973,7 @@ Unit* Creature::SelectVictim()
// last case when creature must not go to evade mode:
// it in combat but attacker not make any damage and not enter to aggro radius to have record in threat list
// for example at owner command to pet attack some far away creature
- // Note: creature not have targeted movement generator but have attacker in this case
+ // Note: creature does not have targeted movement generator but has attacker in this case
for (AttackerSet::const_iterator itr = m_attackers.begin(); itr != m_attackers.end(); ++itr)
{
if ((*itr) && !canCreatureAttack(*itr) && (*itr)->GetTypeId() != TYPEID_PLAYER
@@ -13359,7 +13359,7 @@ bool Unit::HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, f
{
if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
{
- sLog->outError("ERROR in HandleStatModifier(): non existed UnitMods or wrong UnitModifierType!");
+ sLog->outError("ERROR in HandleStatModifier(): non-existing UnitMods or wrong UnitModifierType!");
return false;
}
@@ -13424,7 +13424,7 @@ float Unit::GetModifierValue(UnitMods unitMod, UnitModifierType modifierType) co
{
if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
{
- sLog->outError("trial to access non existed modifier value from UnitMods!");
+ sLog->outError("attempt to access non-existing modifier value from UnitMods!");
return 0.0f;
}
@@ -13454,7 +13454,7 @@ float Unit::GetTotalAuraModValue(UnitMods unitMod) const
{
if (unitMod >= UNIT_MOD_END)
{
- sLog->outError("trial to access non existed UnitMods in GetTotalAuraModValue()!");
+ sLog->outError("attempt to access non-existing UnitMods in GetTotalAuraModValue()!");
return 0.0f;
}
@@ -13683,7 +13683,7 @@ void Unit::SetMaxPower(Powers power, uint32 val)
uint32 Unit::GetCreatePowers(Powers power) const
{
- // POWER_FOCUS and POWER_HAPPINESS only have hunter pet
+ // Only hunter pets have POWER_FOCUS and POWER_HAPPINESS
switch (power)
{
case POWER_MANA: return GetCreateMana();
@@ -14111,12 +14111,12 @@ bool InitTriggerAuraData()
isTriggerAura[SPELL_AURA_DUMMY] = true;
isTriggerAura[SPELL_AURA_MOD_CONFUSE] = true;
isTriggerAura[SPELL_AURA_MOD_THREAT] = true;
- isTriggerAura[SPELL_AURA_MOD_STUN] = true; // Aura not have charges but need remove him on trigger
+ isTriggerAura[SPELL_AURA_MOD_STUN] = true; // Aura does not have charges but needs to be removed on trigger
isTriggerAura[SPELL_AURA_MOD_DAMAGE_DONE] = true;
isTriggerAura[SPELL_AURA_MOD_DAMAGE_TAKEN] = true;
isTriggerAura[SPELL_AURA_MOD_RESISTANCE] = true;
isTriggerAura[SPELL_AURA_MOD_STEALTH] = true;
- isTriggerAura[SPELL_AURA_MOD_FEAR] = true; // Aura not have charges but need remove him on trigger
+ isTriggerAura[SPELL_AURA_MOD_FEAR] = true; // Aura does not have charges but needs to be removed on trigger
isTriggerAura[SPELL_AURA_MOD_ROOT] = true;
isTriggerAura[SPELL_AURA_TRANSFORM] = true;
isTriggerAura[SPELL_AURA_REFLECT_SPELLS] = true;
@@ -15325,7 +15325,7 @@ bool Unit::HandleAuraRaidProcFromCharge(AuraEffect* triggeredByAura)
damageSpellId = 43594;
break;
default:
- sLog->outError("Unit::HandleAuraRaidProcFromCharge, received not handled spell: %u", spellProto->Id);
+ sLog->outError("Unit::HandleAuraRaidProcFromCharge, received unhandled spell: %u", spellProto->Id);
return false;
}
@@ -15738,7 +15738,7 @@ void Unit::SetStunned(bool apply)
if (!owner || (owner->GetTypeId() == TYPEID_PLAYER && !owner->ToPlayer()->IsMounted()))
RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
- if (!HasUnitState(UNIT_STAT_ROOT)) // prevent allow move if have also root effect
+ if (!HasUnitState(UNIT_STAT_ROOT)) // prevent moving if it also has root effect
{
WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 8+4);
data.append(GetPackGUID());
@@ -15780,7 +15780,7 @@ void Unit::SetRooted(bool apply)
}
else
{
- if (!HasUnitState(UNIT_STAT_STUNNED)) // prevent allow move if have also stun effect
+ if (!HasUnitState(UNIT_STAT_STUNNED)) // prevent moving if it also has stun effect
{
if (GetTypeId() == TYPEID_PLAYER)
{
diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp
index 8b9e2fe047b..e1900c6c994 100755
--- a/src/server/game/Events/GameEventMgr.cpp
+++ b/src/server/game/Events/GameEventMgr.cpp
@@ -759,6 +759,47 @@ void GameEventMgr::LoadFromDB()
}
}
+ sLog->outString("Loading Game Event Seasonal Quest Relations...");
+ {
+ uint32 oldMSTime = getMSTime();
+
+ // 0 1
+ QueryResult result = WorldDatabase.Query("SELECT quest, event FROM game_event_seasonal_questrelation");
+
+ if (!result)
+ {
+ sLog->outString(">> Loaded 0 seasonal quests additions in game events. DB table `game_event_seasonal_questrelation` is empty.");
+ sLog->outString();
+ }
+ else
+ {
+ uint32 count = 0;
+ do
+ {
+ Field* fields = result->Fetch();
+
+ uint32 quest = fields[0].GetUInt32();
+ uint16 event_id = fields[1].GetUInt16();
+
+ if (event_id >= mGameEvent.size())
+ {
+ sLog->outErrorDb("`game_event_seasonal_questrelation` event id (%u) is out of range compared to max event in `game_event`", event_id);
+ continue;
+ }
+
+ Quest * qInfo = sObjectMgr->GetQuestTemplate(quest);
+ if (qInfo)
+ qInfo->SetSeasonalQuestEvent(event_id);
+
+ ++count;
+ }
+ while (result->NextRow());
+
+ sLog->outString(">> Loaded %u quests additions in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
+ sLog->outString();
+ }
+ }
+
sLog->outString("Loading Game Event Vendor Additions Data...");
{
uint32 oldMSTime = getMSTime();
@@ -1079,6 +1120,8 @@ void GameEventMgr::UnApplyEvent(uint16 event_id)
UpdateEventNPCVendor(event_id, false);
// update bg holiday
UpdateBattlegroundSettings();
+ // check for seasonal quest reset.
+ sWorld->ResetEventSeasonalQuests(event_id);
}
void GameEventMgr::ApplyNewEvent(uint16 event_id)
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 57c6fe1ad2f..1b6d90da0a6 100755
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -687,6 +687,11 @@ class ObjectMgr
QuestMap::const_iterator itr = mQuestTemplates.find(quest_id);
return itr != mQuestTemplates.end() ? itr->second : NULL;
}
+ Quest * GetQuestTemplate(uint32 quest_id)
+ {
+ QuestMap::const_iterator itr = mQuestTemplates.find(quest_id);
+ return itr != mQuestTemplates.end() ? itr->second : NULL;
+ }
QuestMap const& GetQuestTemplates() const { return mQuestTemplates; }
uint32 GetQuestForAreaTrigger(uint32 Trigger_ID) const
diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp
index 14a6577b1b5..674f54d07a8 100755
--- a/src/server/game/Quests/QuestDef.cpp
+++ b/src/server/game/Quests/QuestDef.cpp
@@ -65,6 +65,7 @@ Quest::Quest(Field* questRecord)
RequiredPlayerKills = questRecord[40].GetUInt32();
RewardTalents = questRecord[41].GetUInt32();
RewardArenaPoints = questRecord[42].GetInt32();
+ SeasonalQuestEvent = 0;
for (int i = 0; i < QUEST_REWARDS_COUNT; ++i)
RewardItemId[i] = questRecord[43+i].GetUInt32();
diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h
index 90905f2fa34..4fbfcd176f4 100755
--- a/src/server/game/Quests/QuestDef.h
+++ b/src/server/game/Quests/QuestDef.h
@@ -187,6 +187,7 @@ class Quest
bool HasFlag(uint32 flag) const { return (Flags & flag) != 0; }
void SetFlag(uint32 flag) { Flags |= flag; }
+ void SetSeasonalQuestEvent(uint16 event_id) { SeasonalQuestEvent = event_id; }
// table data accessors:
uint32 GetQuestId() const { return Id; }
@@ -246,11 +247,13 @@ class Quest
uint32 GetCompleteEmote() const { return EmoteOnComplete; }
uint32 GetQuestStartScript() const { return StartScript; }
uint32 GetQuestCompleteScript() const { return CompleteScript; }
+ uint16 GetSeasonalQuestEvent() const {return SeasonalQuestEvent; }
bool IsRepeatable() const { return Flags & QUEST_TRINITY_FLAGS_REPEATABLE; }
bool IsAutoComplete() const;
uint32 GetFlags() const { return Flags; }
bool IsDaily() const { return Flags & QUEST_FLAGS_DAILY; }
bool IsWeekly() const { return Flags & QUEST_FLAGS_WEEKLY; }
+ bool IsSeasonal() const { return ZoneOrSort == -22; }
bool IsDailyOrWeekly() const { return Flags & (QUEST_FLAGS_DAILY | QUEST_FLAGS_WEEKLY); }
bool IsAutoAccept() const { return Flags & QUEST_FLAGS_AUTO_ACCEPT; }
bool IsRaidQuest() const { return Type == QUEST_TYPE_RAID || Type == QUEST_TYPE_RAID_10 || Type == QUEST_TYPE_RAID_25; }
@@ -295,6 +298,8 @@ class Quest
uint32 m_reqCreatureOrGOcount;
uint32 m_rewchoiceitemscount;
uint32 m_rewitemscount;
+ //additional data needed for seasonal quest events
+ uint16 SeasonalQuestEvent;
// table data
protected:
diff --git a/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp b/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp
index 11de2c68ca1..47af8c9bc1e 100755..100644
--- a/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp
@@ -93,9 +93,13 @@ bool LoginQueryHolder::Initialize()
stmt->setUInt32(0, lowGuid);
res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS, stmt);
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_WEKLYQUESTSTATUS);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_WEEKLYQUESTSTATUS);
stmt->setUInt32(0, lowGuid);
- res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOADWEKLYQUESTSTATUS, stmt);
+ res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOADWEEKLYQUESTSTATUS, stmt);
+
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_SEASONALQUESTSTATUS);
+ stmt->setUInt32(0, lowGuid);
+ res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOADSEASONALQUESTSTATUS, stmt);
stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_REPUTATION);
stmt->setUInt32(0, lowGuid);
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index c3c73598af7..5fd1c788c7f 100755
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -7003,10 +7003,35 @@ void Spell::EffectActivateRune(SpellEffIndex effIndex)
{
if (player->GetRuneCooldown(j) && player->GetCurrentRune(j) == RuneType(m_spellInfo->Effects[effIndex].MiscValue))
{
+ if (m_spellInfo->Id == 45529)
+ if (player->GetBaseRune(j) != RuneType(m_spellInfo->Effects[effIndex].MiscValueB))
+ continue;
player->SetRuneCooldown(j, 0);
--count;
}
}
+
+ // Blood Tap
+ if (m_spellInfo->Id == 45529 && count > 0)
+ {
+ for (uint32 l = 0; l < MAX_RUNES && count > 0; ++l)
+ {
+ // Check if both runes are on cd as that is the only time when this needs to come into effect
+ if ((player->GetRuneCooldown(l) && player->GetCurrentRune(l) == RuneType(m_spellInfo->Effects[effIndex].MiscValueB)) && (player->GetRuneCooldown(l+1) && player->GetCurrentRune(l+1) == RuneType(m_spellInfo->Effects[effIndex].MiscValueB)))
+ {
+ // Should always update the rune with the lowest cd
+ if (player->GetRuneCooldown(l) >= player->GetRuneCooldown(l+1))
+ l++;
+ player->SetRuneCooldown(l, 0);
+ --count;
+ // is needed to push through to the client that the rune is active
+ player->ResyncRunes(MAX_RUNES);
+ }
+ else
+ break;
+ }
+ }
+
// Empower rune weapon
if (m_spellInfo->Id == 47568)
{
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 388bafc503d..426a93fda57 100755
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -2748,6 +2748,17 @@ void World::ResetWeeklyQuests()
sPoolMgr->ChangeWeeklyQuests();
}
+void World::ResetEventSeasonalQuests(uint16 event_id)
+{
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_SEASONAL);
+ stmt->setUInt16(0,event_id);
+ CharacterDatabase.Execute(stmt);
+
+ for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
+ if (itr->second->GetPlayer())
+ itr->second->GetPlayer()->ResetSeasonalQuestStatus(event_id);
+}
+
void World::ResetRandomBG()
{
sLog->outDetail("Random BG status reset for all characters.");
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 02438375058..bedd8a87b20 100755
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -746,6 +746,7 @@ class World
uint32 GetCleaningFlags() const { return m_CleaningFlags; }
void SetCleaningFlags(uint32 flags) { m_CleaningFlags = flags; }
+ void ResetEventSeasonalQuests(uint16 event_id);
protected:
void _UpdateGameTime();
// callback for UpdateRealmCharacters
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
index 7c8121f475f..f62c2d6c596 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
@@ -436,7 +436,7 @@ class boss_freya : public CreatureScript
break;
case EVENT_WAVE:
SpawnWave();
- if (waveCount < 6)
+ if (waveCount <= 6) // If set to 6 The Bombs appear during the Final Add wave
events.ScheduleEvent(EVENT_WAVE, WAVE_TIME);
else
events.ScheduleEvent(EVENT_NATURE_BOMB, urand(10000, 20000));
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index b5b174a19eb..31fd5f66375 100755..100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -46,6 +46,10 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PREPARE_STATEMENT(CHAR_SEL_GUID_RACE_ACC_BY_NAME, "SELECT guid, race, account FROM characters WHERE name = ?", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_DAILY, "DELETE FROM character_queststatus_daily", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_WEEKLY, "DELETE FROM character_queststatus_weekly", CONNECTION_ASYNC);
+ PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_SEASONAL, "DELETE FROM character_queststatus_seasonal WHERE event = ?", CONNECTION_ASYNC);
+ PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_DAILY_CHAR, "DELETE FROM character_queststatus_daily WHERE guid = ?", CONNECTION_ASYNC);
+ PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR, "DELETE FROM character_queststatus_weekly WHERE guid = ?", CONNECTION_ASYNC);
+ PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR, "DELETE FROM character_queststatus_seasonal WHERE guid = ?", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_DEL_BATTLEGROUND_RANDOM, "DELETE FROM character_battleground_random", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_INS_BATTLEGROUND_RANDOM, "INSERT INTO character_battleground_random (guid) VALUES (?)", CONNECTION_ASYNC);
@@ -63,7 +67,11 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PREPARE_STATEMENT(CHAR_SEL_CHARACTER_QUESTSTATUS, "SELECT quest, status, explored, timer, mobcount1, mobcount2, mobcount3, mobcount4, "
"itemcount1, itemcount2, itemcount3, itemcount4, playercount FROM character_queststatus WHERE guid = ?", CONNECTION_ASYNC)
PREPARE_STATEMENT(CHAR_SEL_CHARACTER_DAILYQUESTSTATUS, "SELECT quest, time FROM character_queststatus_daily WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_WEKLYQUESTSTATUS, "SELECT quest FROM character_queststatus_weekly WHERE guid = ?", CONNECTION_ASYNC)
+ PREPARE_STATEMENT(CHAR_SEL_CHARACTER_WEEKLYQUESTSTATUS, "SELECT quest FROM character_queststatus_weekly WHERE guid = ?", CONNECTION_ASYNC)
+ PREPARE_STATEMENT(CHAR_SEL_CHARACTER_SEASONALQUESTSTATUS, "SELECT quest FROM character_queststatus_seasonal WHERE guid = ?", CONNECTION_ASYNC)
+ PREPARE_STATEMENT(CHAR_INS_CHARACTER_DAILYQUESTSTATUS, "INSERT INTO character_queststatus_daily (guid, quest, time) VALUES (?, ?, ?)", CONNECTION_ASYNC)
+ PREPARE_STATEMENT(CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS, "INSERT INTO character_queststatus_weekly (guid, quest) VALUES (?, ?)", CONNECTION_ASYNC)
+ PREPARE_STATEMENT(CHAR_INS_CHARACTER_SEASONALQUESTSTATUS, "INSERT INTO character_queststatus_seasonal (guid, quest, event) VALUES (?, ?, ?)", CONNECTION_ASYNC)
PREPARE_STATEMENT(CHAR_SEL_CHARACTER_REPUTATION, "SELECT faction, standing, flags FROM character_reputation WHERE guid = ?", CONNECTION_ASYNC)
PREPARE_STATEMENT(CHAR_SEL_CHARACTER_INVENTORY, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, bag, slot, "
"item, itemEntry FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot", CONNECTION_ASYNC)
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
index a0f5b9a9954..a239e274a54 100755..100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.h
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
@@ -66,6 +66,10 @@ enum CharacterDatabaseStatements
CHAR_SEL_GUID_RACE_ACC_BY_NAME,
CHAR_DEL_QUEST_STATUS_DAILY,
CHAR_DEL_QUEST_STATUS_WEEKLY,
+ CHAR_DEL_QUEST_STATUS_SEASONAL,
+ CHAR_DEL_QUEST_STATUS_DAILY_CHAR,
+ CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR,
+ CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR,
CHAR_DEL_BATTLEGROUND_RANDOM,
CHAR_INS_BATTLEGROUND_RANDOM,
@@ -76,7 +80,11 @@ enum CharacterDatabaseStatements
CHAR_SEL_CHARACTER_SPELL,
CHAR_SEL_CHARACTER_QUESTSTATUS,
CHAR_SEL_CHARACTER_DAILYQUESTSTATUS,
- CHAR_SEL_CHARACTER_WEKLYQUESTSTATUS,
+ CHAR_SEL_CHARACTER_WEEKLYQUESTSTATUS,
+ CHAR_SEL_CHARACTER_SEASONALQUESTSTATUS,
+ CHAR_INS_CHARACTER_DAILYQUESTSTATUS,
+ CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS,
+ CHAR_INS_CHARACTER_SEASONALQUESTSTATUS,
CHAR_SEL_CHARACTER_REPUTATION,
CHAR_SEL_CHARACTER_INVENTORY,
CHAR_SEL_CHARACTER_ACTIONS,