From 1c19aa7b71ffc6782c94a64ce4aa3d178994e6a7 Mon Sep 17 00:00:00 2001 From: Keader Date: Tue, 24 Apr 2018 21:18:07 -0300 Subject: [PATCH 01/35] Core/Handlers: Fixed equipament manager with empty slots. Yes kids, dont use drugs ! Followup: 42be04898c6fd001160ee4fdf00fc2ba5c5c1ee3 --- src/server/game/Handlers/CharacterHandler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 5ad626e5d62..bf892dc798a 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1707,7 +1707,7 @@ void WorldSession::HandleEquipmentSetUse(WorldPacket& recvData) InventoryResult msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, sDest, uItem, false); if (msg == EQUIP_ERR_OK) { - if (_player->CanEquipItem(NULL_SLOT, dstpos, uItem, false) != EQUIP_ERR_OK) + if (_player->CanUnequipItem(dstpos, true) != EQUIP_ERR_OK) continue; _player->RemoveItem(INVENTORY_SLOT_BAG_0, i, true); @@ -1722,7 +1722,7 @@ void WorldSession::HandleEquipmentSetUse(WorldPacket& recvData) if (item->GetPos() == dstpos) continue; - if (_player->CanUnequipItem(dstpos, true) != EQUIP_ERR_OK) + if (_player->CanEquipItem(NULL_SLOT, dstpos, item, false) != EQUIP_ERR_OK) continue; _player->SwapItem(item->GetPos(), dstpos); From e27ee9fcea13b21aaa96b35e16309c2fcee6ad96 Mon Sep 17 00:00:00 2001 From: Keader Date: Wed, 25 Apr 2018 18:21:16 -0300 Subject: [PATCH 02/35] Core/Handlers: Fixed a Equipament Manager typo --- src/server/game/Handlers/CharacterHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index bf892dc798a..70d8b2e1d1c 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1722,7 +1722,7 @@ void WorldSession::HandleEquipmentSetUse(WorldPacket& recvData) if (item->GetPos() == dstpos) continue; - if (_player->CanEquipItem(NULL_SLOT, dstpos, item, false) != EQUIP_ERR_OK) + if (_player->CanEquipItem(NULL_SLOT, dstpos, item, true) != EQUIP_ERR_OK) continue; _player->SwapItem(item->GetPos(), dstpos); From f423264e29d250574f9006f7997b4565ed1f1b22 Mon Sep 17 00:00:00 2001 From: Killyana Date: Thu, 26 Apr 2018 16:23:49 +0200 Subject: [PATCH 03/35] DB/SAI: Coilfang Sorceress and Coilfang Siren Closes #21886 --- sql/updates/world/3.3.5/2018_04_26_00_world.sql | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 sql/updates/world/3.3.5/2018_04_26_00_world.sql diff --git a/sql/updates/world/3.3.5/2018_04_26_00_world.sql b/sql/updates/world/3.3.5/2018_04_26_00_world.sql new file mode 100644 index 00000000000..afa97a5c7af --- /dev/null +++ b/sql/updates/world/3.3.5/2018_04_26_00_world.sql @@ -0,0 +1,14 @@ +-- +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (17722,17801) 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`,`event_param5`,`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 +(17722, 0, 0, 0, 0, 0, 100, 2, 1000, 1000, 2400, 3800, 0, 11, 12675, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "Coilfang Sorceress - IC CMC - Cast 'Frostbolt' (Normal Dungeon)"), +(17722, 0, 1, 0, 0, 0, 100, 4, 1000, 1000, 2400, 3800, 0, 11, 37930, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "Coilfang Sorceress - IC CMC - Cast 'Frostbolt' (Heroic Dungeon)"), +(17722, 0, 2, 0, 0, 0, 100, 2, 18000, 20000, 25000, 27000, 0, 11, 31581, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, "Coilfang Sorceress - In Combat - Cast 'Blizzard' (No Repeat) (Normal Dungeon)"), +(17722, 0, 3, 0, 0, 0, 100, 4, 18000, 20000, 25000, 27000, 0, 11, 39416, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, "Coilfang Sorceress - In Combat - Cast 'Blizzard' (Heroic Dungeon)"), +(17722, 0, 4, 0, 0, 0, 100, 2, 6000, 8000, 15000, 15000, 0, 11, 15063, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Coilfang Sorceress - In Combat - Cast 'Frost Nova' (Normal Dungeon)"), +(17722, 0, 5, 0, 0, 0, 100, 4, 6000, 8000, 15000, 15000, 0, 11, 15531, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Coilfang Sorceress - In Combat - Cast 'Frost Nova' (Heroic Dungeon)"), +(17801, 0, 0, 0, 0, 0, 100, 2, 1000, 1000, 4400, 5800, 0, 11, 15234, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "Coilfang Siren - IC CMC - Cast 'Lightning Bolt' (Normal Dungeon)"), +(17801, 0, 1, 0, 0, 0, 100, 4, 1000, 1000, 3400, 4800, 0, 11, 37664, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "Coilfang Siren - IC CMC - Cast 'Lightning Bolt' (Heroic Dungeon)"), +(17801, 0, 2, 0, 0, 0, 100, 2, 12000, 15000, 15000, 19000, 0, 11, 35106, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, "Coilfang Siren - In Combat - Cast 'Arcane Flare'(NormalDungeon)"), +(17801, 0, 3, 0, 0, 0, 100, 4, 9000, 12000, 15000, 17000, 0, 11, 37856, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, "Coilfang Siren - In Combat - Cast 'Arcane Flare' (HeroicDungeon)"), +(17801, 0, 4, 0, 0, 0, 100, 6, 9000, 13000, 10000, 14000, 0, 11, 38660, 1, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, "Coilfang Siren - In Combat - Cast 'Fear' (Dungeon)"); From e6d8b0842be624ddf8aee554ba22c5f557790663 Mon Sep 17 00:00:00 2001 From: Gooyeth Date: Fri, 27 Apr 2018 01:41:50 -0600 Subject: [PATCH 04/35] Core/Player: Skip the cinematic of the first login if the character is teleported before. (#21776) --- .../database/Database/Implementation/CharacterDatabase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 48b3ea94a89..ade729424c0 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -430,7 +430,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_INS_CHARACTER_SOCIAL, "INSERT INTO character_social (guid, friend, flags) VALUES (?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHARACTER_SOCIAL, "DELETE FROM character_social WHERE guid = ? AND friend = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHARACTER_SOCIAL_NOTE, "UPDATE character_social SET note = ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_CHARACTER_POSITION, "UPDATE characters SET position_x = ?, position_y = ?, position_z = ?, orientation = ?, map = ?, zone = ?, trans_x = 0, trans_y = 0, trans_z = 0, transguid = 0, taxi_path = '' WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_CHARACTER_POSITION, "UPDATE characters SET position_x = ?, position_y = ?, position_z = ?, orientation = ?, map = ?, zone = ?, trans_x = 0, trans_y = 0, trans_z = 0, transguid = 0, taxi_path = '', cinematic = 1 WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_AURA_FROZEN, "SELECT characters.name, character_aura.remainTime FROM characters LEFT JOIN character_aura ON (characters.guid = character_aura.guid) WHERE character_aura.spell = 9454", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHARACTER_ONLINE, "SELECT name, account, map, zone FROM characters WHERE online > 0", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_DEL_INFO_BY_GUID, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND guid = ?", CONNECTION_SYNCH); From 7df6a6bbcbc2844f6671c6022a9eef0dfa868543 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Fri, 27 Apr 2018 21:25:14 +0200 Subject: [PATCH 05/35] Dep/Boost: Fix crash in Boost Work around a NULL dereference exception happening in boost::asio::ip::tcp::resolver::results_type, resulting in a crash when trying to bind on an address that cannot be resolved. Fixes #21884 --- src/common/Asio/Resolver.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/Asio/Resolver.h b/src/common/Asio/Resolver.h index 5106421ee5e..953913442c8 100644 --- a/src/common/Asio/Resolver.h +++ b/src/common/Asio/Resolver.h @@ -32,7 +32,7 @@ namespace Trinity boost::system::error_code ec; #if BOOST_VERSION >= 106600 boost::asio::ip::tcp::resolver::results_type results = resolver.resolve(protocol, host, service, ec); - if (results.empty() || ec) + if (results.begin() == results.end() || ec) return {}; return results.begin()->endpoint(); From dcc1cfe44d7c5456ce66801b817bcaf1226a6580 Mon Sep 17 00:00:00 2001 From: Keader Date: Sun, 29 Apr 2018 11:25:18 -0300 Subject: [PATCH 06/35] Core/Handlers: Fixed Equipament Manager (for real this time) --- src/server/game/Handlers/CharacterHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 70d8b2e1d1c..b34b3d295f1 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1722,7 +1722,7 @@ void WorldSession::HandleEquipmentSetUse(WorldPacket& recvData) if (item->GetPos() == dstpos) continue; - if (_player->CanEquipItem(NULL_SLOT, dstpos, item, true) != EQUIP_ERR_OK) + if (_player->CanEquipItem(i, dstpos, item, true) != EQUIP_ERR_OK) continue; _player->SwapItem(item->GetPos(), dstpos); From fb25fd29d2c63f6cc9490359c572eeb3142ae049 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Sun, 29 Apr 2018 17:48:28 +0200 Subject: [PATCH 07/35] rename files --- .../2018_04_29_00_world_from_335_was_2018_04_26_00_world.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sql/updates/world/{3.3.5/2018_04_26_00_world.sql => 4.3.4/2018_04_29_00_world_from_335_was_2018_04_26_00_world.sql} (100%) diff --git a/sql/updates/world/3.3.5/2018_04_26_00_world.sql b/sql/updates/world/4.3.4/2018_04_29_00_world_from_335_was_2018_04_26_00_world.sql similarity index 100% rename from sql/updates/world/3.3.5/2018_04_26_00_world.sql rename to sql/updates/world/4.3.4/2018_04_29_00_world_from_335_was_2018_04_26_00_world.sql From 82ced5db6e136c3f347461de135e9ce35e68e1f8 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Thu, 3 May 2018 14:45:56 +0200 Subject: [PATCH 08/35] DB/Spell: Fix Inner Fire By Keader --- sql/updates/world/4.3.4/2018_05_03_00_world.sql | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 sql/updates/world/4.3.4/2018_05_03_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_05_03_00_world.sql b/sql/updates/world/4.3.4/2018_05_03_00_world.sql new file mode 100644 index 00000000000..021bd16ace9 --- /dev/null +++ b/sql/updates/world/4.3.4/2018_05_03_00_world.sql @@ -0,0 +1,9 @@ +-- +DELETE FROM `spell_group` WHERE `id`=1122; +INSERT INTO `spell_group` (`id`, `spell_id`) VALUES +(1122,588), +(1122,73413); + +DELETE FROM `spell_group_stack_rules` WHERE `group_id`=1122; +INSERT INTO `spell_group_stack_rules` (`group_id`, `stack_rule`) VALUES +(1122,1); From a8262881f968793df2f8f88bb44a51011a717dbe Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero <36899226+JorTurFer@users.noreply.github.com> Date: Wed, 2 May 2018 01:11:40 +0200 Subject: [PATCH 09/35] Scripts/Ulduar: Fixed Vehicles when flame leviathan die(#21897) --- .../Ulduar/Ulduar/instance_ulduar.cpp | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp index 5d1e43a7289..a975c8f912c 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp @@ -281,7 +281,10 @@ class instance_ulduar : public InstanceMapScript case NPC_SALVAGED_DEMOLISHER: case NPC_SALVAGED_SIEGE_ENGINE: case NPC_SALVAGED_CHOPPER: - LeviathanVehicleGUIDs.push_back(creature->GetGUID()); + if (GetBossState(BOSS_LEVIATHAN) == DONE) + DespawnLeviatanVehicle(creature); + else + LeviathanVehicleGUIDs.push_back(creature->GetGUID()); break; // XT-002 Deconstructor @@ -1043,17 +1046,8 @@ class instance_ulduar : public InstanceMapScript // Eject all players from vehicles and make them untargetable. // They will be despawned after a while for (auto const& vehicleGuid : LeviathanVehicleGUIDs) - { if (Creature* vehicleCreature = instance->GetCreature(vehicleGuid)) - { - if (Vehicle* vehicle = vehicleCreature->GetVehicleKit()) - { - vehicle->RemoveAllPassengers(); - vehicleCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - vehicleCreature->DespawnOrUnsummon(5 * MINUTE * IN_MILLISECONDS); - } - } - } + DespawnLeviatanVehicle(vehicleCreature); break; case EVENT_LEVIATHAN_BREAK_DOOR: if (Creature* leviathan = GetCreature(BOSS_LEVIATHAN)) @@ -1065,6 +1059,16 @@ class instance_ulduar : public InstanceMapScript } } + void DespawnLeviatanVehicle(Creature* vehicleCreature) + { + if (Vehicle* vehicle = vehicleCreature->GetVehicleKit()) + { + vehicle->RemoveAllPassengers(); + vehicleCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + vehicleCreature->DespawnOrUnsummon(5 * MINUTE * IN_MILLISECONDS); + } + } + void UpdateDoorState(GameObject* door) override { // Leviathan doors are set to DOOR_TYPE_ROOM except the one it uses to enter the room From 76261ca5a7d231fe222fe2ae968139034c35c8ca Mon Sep 17 00:00:00 2001 From: Killyana Date: Sat, 12 May 2018 11:54:51 +0200 Subject: [PATCH 10/35] DB: Throne of the Tides Spawns --- .../world/4.3.4/2018_05_12_00_world.sql | 2075 +++++++++++++++++ 1 file changed, 2075 insertions(+) create mode 100644 sql/updates/world/4.3.4/2018_05_12_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_05_12_00_world.sql b/sql/updates/world/4.3.4/2018_05_12_00_world.sql new file mode 100644 index 00000000000..1a12c20abc3 --- /dev/null +++ b/sql/updates/world/4.3.4/2018_05_12_00_world.sql @@ -0,0 +1,2075 @@ +-- +DELETE FROM `quest_poi` WHERE (`QuestID`=28834 AND `id`=2) OR (`QuestID`=28834 AND `id`=1) OR (`QuestID`=28834 AND `id`=0) OR (`QuestID`=28836 AND `id`=2) OR (`QuestID`=28836 AND `id`=1) OR (`QuestID`=28836 AND `id`=0); +INSERT INTO `quest_poi` (`QuestID`, `id`, `ObjectiveIndex`, `MapID`, `WorldMapAreaId`, `Floor`, `Priority`, `Flags`, `VerifiedBuild`) VALUES +(28834, 2, 32, 643, 767, 1, 0, 0, 26365), -- Rescue the Earthspeaker! +(28834, 1, 0, 643, 767, 1, 0, 7, 26365), -- Rescue the Earthspeaker! +(28834, 0, -1, 643, 767, 1, 0, 1, 26365), -- Rescue the Earthspeaker! +(28836, 2, 32, 643, 767, 1, 0, 0, 26365), -- Sins of the Sea Witch +(28836, 1, 0, 643, 767, 2, 0, 7, 26365), -- Sins of the Sea Witch +(28836, 0, -1, 643, 767, 1, 0, 1, 26365); -- Sins of the Sea Witch + +DELETE FROM `quest_poi_points` WHERE (`QuestID`=28834 AND `Idx1`=2 AND `Idx2`=0) OR (`QuestID`=28836 AND `Idx1`=2 AND `Idx2`=0) OR (`QuestID`=28836 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=28836 AND `Idx1`=0 AND `Idx2`=0); +INSERT INTO `quest_poi_points` (`QuestID`, `Idx1`, `Idx2`, `X`, `Y`, `VerifiedBuild`) VALUES +(28834, 2, 0, -617, 809, 26365), -- Rescue the Earthspeaker! +(28836, 2, 0, -617, 809, 26365), -- Sins of the Sea Witch +(28836, 1, 0, 193, 803, 26365), -- Sins of the Sea Witch +(28836, 0, 0, -617, 809, 26365); -- Sins of the Sea Witch + +UPDATE `quest_poi_points` SET `VerifiedBuild`=26365 WHERE (`QuestID`=28834 AND `Idx1`=1 AND `Idx2`=0); -- Rescue the Earthspeaker! +UPDATE `quest_poi_points` SET `VerifiedBuild`=26365 WHERE (`QuestID`=28834 AND `Idx1`=0 AND `Idx2`=0); -- Rescue the Earthspeaker! + +SET @CGUID:=254836; +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+577; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `PhaseId`, `PhaseGroup`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES +(@CGUID+0, 53488, 643, 5004, 5004, 3, 169, 0, 0, 0, -628.6702, 804.8403, 247.681, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Summon Enabler Stalker (Area: Throne of the Tides - Difficulty: 2) (Auras: 99201 - Summon Enabler) +(@CGUID+1, 50276, 643, 5004, 5004, 3, 169, 0, 0, 0, -616.7604, 803.3108, 245.253, 4.747295, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (Auras: 29266 - Permanent Feign Death) +(@CGUID+2, 50278, 643, 5004, 5004, 3, 169, 0, 0, 0, -618.2656, 819.7743, 245.4425, 1.134464, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (Auras: 29266 - Permanent Feign Death) +(@CGUID+3, 53488, 643, 5004, 5004, 3, 169, 0, 0, 0, -598.9757, 823.3489, 244.8928, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Summon Enabler Stalker (Area: Throne of the Tides - Difficulty: 2) (Auras: 99201 - Summon Enabler) +(@CGUID+4, 50276, 643, 5004, 5004, 3, 169, 0, 0, 0, -611.7274, 815.2101, 245.1277, 0.541052, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (Auras: 29266 - Permanent Feign Death) +(@CGUID+5, 50278, 643, 5004, 5004, 3, 169, 0, 0, 0, -610.4809, 796.3316, 245.1174, 4.153883, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (Auras: 29266 - Permanent Feign Death) +(@CGUID+6, 53488, 643, 5004, 5004, 3, 169, 0, 0, 0, -595.5052, 795.4861, 244.8928, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Summon Enabler Stalker (Area: Throne of the Tides - Difficulty: 2) (Auras: 99201 - Summon Enabler) +(@CGUID+7, 50278, 643, 5004, 5004, 3, 169, 0, 0, 0, -609.007, 807.0625, 244.6244, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (Auras: 29266 - Permanent Feign Death) +(@CGUID+8, 53488, 643, 5004, 5004, 3, 169, 0, 0, 0, -567.1198, 810.2656, 244.9734, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Summon Enabler Stalker (Area: Throne of the Tides - Difficulty: 2) (Auras: 99201 - Summon Enabler) +(@CGUID+9, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -603.6129, 827.2743, 245.388, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+10, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -524.0555, 805.6702, 256.9915, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+11, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -438.9139, 769.7037, 270.5711, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) (Auras: 85211 - Water Bolt) +(@CGUID+12, 45620, 643, 5004, 5004, 3, 169, 0, 0, 0, -421.722, 830.59, 262.0083, 3.473205, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) (possible waypoints or random movement) +(@CGUID+13, 51391, 643, 5004, 5004, 3, 169, 0, 0, 0, -560.2465, 819.1996, 245.3967, 4.904375, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Throne of Tides Teleporter (Area: Throne of the Tides - Difficulty: 2) (Auras: 95293 - Teleporter Base Visual) +(@CGUID+14, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -500.5903, 804.8386, 257.168, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+15, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -479.9549, 803.1893, 253.4132, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+16, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -457.8351, 802.7327, 249.7082, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+17, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -548.1771, 807.5104, 246.4562, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+18, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -425.698, 829.125, 261.8723, 0.5934119, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) (possible waypoints or random movement) +(@CGUID+19, 45620, 643, 5004, 5004, 3, 169, 0, 0, 0, -405.825, 769.054, 261.0923, 3.089233, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) (possible waypoints or random movement) +(@CGUID+20, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.3368, 802.3281, 248.7223, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+21, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -408.694, 838.417, 260.4864, 0.2094395, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) (possible waypoints or random movement) +(@CGUID+22, 45620, 643, 5004, 5004, 3, 169, 0, 0, 0, -383.538, 768.479, 267.6173, 3.089233, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) (possible waypoints or random movement) +(@CGUID+23, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -423.0002, 767.6939, 267.9297, 6.179363, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+24, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -586.0226, 808.3559, 245.4128, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+25, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -625.9271, 810.1198, 246.8475, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+26, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -399.1267, 806.4028, 248.1572, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+27, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -387.75, 768.861, 267.4823, 0.2094395, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) (possible waypoints or random movement) +(@CGUID+28, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -609.2257, 790.7344, 245.3671, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+29, 45620, 643, 5004, 5004, 3, 169, 0, 0, 0, -404.481, 838.036, 260.6223, 3.089233, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) (possible waypoints or random movement) +(@CGUID+30, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -581.4739, 784.1632, 245.3917, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+31, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -580.9375, 826.7518, 245.4122, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+32, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -410.036, 769.436, 260.9573, 0.2094395, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) (possible waypoints or random movement) +(@CGUID+33, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -361.9618, 808.1545, 257.7555, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+34, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -219.061, 774.641, 295.1404, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+35, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -320.656, 719.738, 281.1503, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+36, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.368, 723.863, 281.7914, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+37, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -318.366, 888.009, 253.0233, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+38, 22517, 643, 5004, 5004, 3, 169, 0, 0, 0, -293.375, 981.314, 242.2833, 4.502949, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Large AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 76345 - Water Leak) +(@CGUID+39, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -219.151, 835.866, 295.1404, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+40, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -311.526, 782.5868, 261.0339, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+41, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -249.599, 805.063, 384.9963, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+42, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -253.316, 801.79, 263.7803, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+43, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -252.236, 813.972, 263.7803, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+44, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -317.2448, 809.434, 261.2558, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+45, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -317.957, 928.161, 248.3153, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+46, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -310.0642, 832.566, 259.9967, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+47, 22517, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.8594, 974.8472, 246.7041, 5.427974, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Large AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 76345 - Water Leak) +(@CGUID+48, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -249.599, 805.063, 295.1404, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+49, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -285.714, 799.069, 263.7803, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+50, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -285.38, 818.372, 263.7803, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+51, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -342.7049, 809.5555, 259.3411, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+52, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.109, 887.832, 251.6793, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+53, 22517, 643, 5004, 5004, 3, 169, 0, 0, 0, -312.4514, 957.0226, 243.4756, 5.393067, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Large AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 76345 - Water Leak) +(@CGUID+54, 44581, 643, 5004, 5004, 3, 169, 0, 0, 0, -111.391, 933.094, 273.8753, 5.480334, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Ozumat Vehicle (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+55, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -219.151, 835.866, 384.9963, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+56, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -188.321, 805.252, 295.1404, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+57, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -134.991, 940.849, 293.6703, 0.03490658, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+58, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -157.358, 954.346, 302.8073, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+59, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -219.061, 774.641, 384.9963, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+60, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -168.613, 980.859, 310.3224, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+61, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -168.722, 966.649, 306.3033, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+62, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -144.283, 983.316, 230.4773, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+63, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -171.681, 998.184, 304.9164, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+64, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -146.606, 1002.71, 310.8013, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+65, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -153.927, 1012.31, 304.4124, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+66, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -249.599, 805.063, 476.5523, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+67, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -188.321, 805.252, 476.5523, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+68, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -146.576, 987.587, 314.3933, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+69, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -143.552, 963.455, 310.5244, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+70, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -146.424, 955.934, 306.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+71, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -159.903, 996.75, 310.6373, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+72, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -219.151, 835.866, 476.5523, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+73, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -152.712, 982.807, 313.7444, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+74, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -188.321, 805.252, 384.9963, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+75, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -154.003, 964.913, 310.2063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+76, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -219.061, 774.641, 476.5523, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+77, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -105.349, 1015.8, 285.8954, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+78, 48983, 643, 5004, 5004, 3, 169, 0, 0, 0, 245.5052, 749.3125, 807.6003, 2.391101, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Geyser (Area: Throne of the Tides - Difficulty: 2) (Auras: 91347 - Geyser) +(@CGUID+79, 48983, 643, 5004, 5004, 3, 169, 0, 0, 0, 244.849, 855.1302, 807.5911, 3.909538, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Geyser (Area: Throne of the Tides - Difficulty: 2) (Auras: 91347 - Geyser) +(@CGUID+80, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, 51.1059, 802.1563, 846.4826, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +-- (@CGUID+81, 40655, UNKNOWN, 5004, 5004, 3, 169, 0, 0, 0, 0, 0, 0, 3.141593, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Ozumat (Area: Throne of the Tides - Difficulty: 2) (Auras: ) - !!! on transport - transport template not found !!! +(@CGUID+82, 48983, 643, 5004, 5004, 3, 169, 0, 0, 0, 138.0781, 749.1441, 807.5905, 0.7504916, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Geyser (Area: Throne of the Tides - Difficulty: 2) (Auras: 91347 - Geyser) +(@CGUID+83, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -118.108, 954.753, 298.8474, 5.794493, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+84, 48983, 643, 5004, 5004, 3, 169, 0, 0, 0, 115.4983, 802.7986, 808.3495, 6.230825, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Geyser (Area: Throne of the Tides - Difficulty: 2) (Auras: 91347 - Geyser) +(@CGUID+85, 45030, 643, 5004, 5004, 3, 169, 0, 0, 0, -74.125, 852.818, 340.5083, 0.2792527, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Ozumat Vehicle, Big (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+86, 48983, 643, 5004, 5004, 3, 169, 0, 0, 0, 137.7569, 855.8611, 807.7711, 5.51524, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Geyser (Area: Throne of the Tides - Difficulty: 2) (Auras: 91347 - Geyser) +(@CGUID+87, 50270, 643, 5004, 5004, 3, 169, 0, 0, 0, -616.7604, 808.7518, 245.6328, 3.263766, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Captain Taylor (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+88, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4493, 770.1429, 270.0137, 6.043383, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+89, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.54, 770.0549, 271.3423, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+90, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0471, 770.7629, 270.6171, 6.251368, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+91, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+92, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.1181, 808.9722, 260.9349, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+93, 21252, 643, 5004, 5004, 3, 169, 0, 0, 0, -309.347, 719.599, 276.0583, 1.53589, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Not Immune PC) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+94, 40577, 643, 5004, 5004, 3, 169, 0, 0, 0, -285.9392, 808.0417, 260.1373, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Sentinel (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+95, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -272.7153, 807.8299, 258.9762, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+96, 21252, 643, 5004, 5004, 3, 169, 0, 0, 0, -310.635, 922.342, 238.8223, 4.677482, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Not Immune PC) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+97, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -256.5955, 808.0364, 259.165, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +-- (@CGUID+98, 40788, UNKNOWN, 5004, 5004, 3, 169, 0, 0, 0, 0.3978609, 0, 2.68787, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Mindbender Ghur'sha (Area: Throne of the Tides - Difficulty: 2) (Auras: 76339 - Unrelenting Agony) - !!! on transport - transport template not found !!! +(@CGUID+99, 39616, 643, 5004, 5004, 3, 169, 0, 0, 0, -421.6042, 839.7882, 263.3889, 4.842506, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) +(@CGUID+100, 39616, 643, 5004, 5004, 3, 169, 0, 0, 0, -411.3646, 778.8055, 262.9503, 1.528872, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) +(@CGUID+101, 41096, 643, 5004, 5004, 3, 169, 0, 0, 0, -409.0035, 839.2552, 262.0498, 5.119945, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) +(@CGUID+102, 41096, 643, 5004, 5004, 3, 169, 0, 0, 0, -396.9653, 779.9288, 265.7069, 1.55391, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) +(@CGUID+103, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0165, 770.7618, 270.6118, 6.247449, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+104, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+105, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+106, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0471, 770.7629, 270.6171, 6.251368, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+107, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0395, 770.7627, 270.6158, 6.250383, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+108, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) (Auras: 85211 - Water Bolt) +(@CGUID+109, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0012, 770.7614, 270.6093, 6.245494, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+110, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+111, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+112, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0165, 770.7618, 270.6118, 6.247449, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+113, 44656, 643, 5004, 5004, 3, 169, 0, 0, 0, -103.066, 910.313, 263.1674, 2.164208, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Ozumat Add Spawner (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+114, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -439.9966, 769.9376, 271.0846, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+115, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.6906, 769.0088, 269.2955, 6.077271, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+116, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0623, 770.7634, 270.6196, 6.253349, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+117, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+118, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.6494, 769.0002, 269.2897, 6.077984, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+119, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.002, 769.9387, 271.0871, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+120, 44656, 643, 5004, 5004, 3, 169, 0, 0, 0, -65.9722, 1031.8, 257.2863, 3.926991, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Ozumat Add Spawner (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+121, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+122, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0165, 770.7618, 270.6118, 6.247449, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+123, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.7867, 769.029, 269.309, 6.075617, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+124, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.006, 769.9396, 271.089, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+125, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0241, 770.7621, 270.6132, 6.248422, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+126, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+127, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.7592, 769.0231, 269.3051, 6.076094, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+128, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.0046, 769.9393, 271.0884, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+129, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.7455, 769.0203, 269.3032, 6.076324, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+130, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.006, 769.9396, 271.089, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+131, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -34.05556, 810.4774, 801.454, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+132, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.79167, 809.467, 805.1479, 3.176499, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+133, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -32.35243, 798.1597, 801.7277, 3.124139, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+134, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.83854, 796.2708, 805.673, 3.124139, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+135, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -27.95139, 805.7361, 804.0556, 3.159046, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+136, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.75174, 799.0087, 805.7594, 3.141593, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+137, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -31.125, 807.9219, 802.3655, 3.176499, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+138, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -29.20486, 799.5851, 803.6364, 3.141593, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+139, 39959, 643, 5004, 5004, 3, 169, 0, 0, 0, -20.19097, 802.0608, 807.5371, 3.141593, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Lady Naz'jar (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+140, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -29.51736, 810.2552, 803.2809, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+141, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -30.29688, 794.8941, 803.2464, 3.106686, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+142, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 69.88738, 814.4952, 806.3171, 1.334788, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+143, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 65.4325, 817.1699, 806.3171, 1.551777, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+144, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -103.4774, 802.0746, 796.6592, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+145, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 71.21053, 815.938, 806.3171, 1.361175, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+146, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -54.44445, 803.0816, 797.1558, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+147, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -128.7379, 802.4809, 796.9691, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+148, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 66.10126, 815.2298, 806.3171, 1.459526, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+149, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -178.8802, 801.9913, 797.0841, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+150, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 71.26827, 818.0963, 806.3171, 1.426958, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+151, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -153.5156, 803.0816, 796.5791, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+152, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 61.37276, 823.2509, 806.3171, 2.426346, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+153, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 69.97628, 819.6906, 806.3171, 1.505136, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+154, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -81.20834, 801.6094, 797.083, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+155, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 67.80486, 813.8999, 806.3171, 1.369688, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+156, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 66.16724, 819.086, 806.3171, 1.59144, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+157, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 67.96173, 820.0815, 806.3171, 1.568952, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+158, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.61806, 802.1458, 805.629, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+159, 51395, 643, 5004, 5004, 3, 169, 0, 0, 0, -14.53993, 796.316, 808.2356, 1.58825, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Throne of Tides Teleporter (Area: Throne of the Tides - Difficulty: 2) (Auras: 95296 - Teleporter Active Visual) +(@CGUID+160, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 38.71181, 801.5816, 805.5076, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+161, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 37.33333, 779.8646, 806.4003, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+162, 39616, 643, 5004, 5004, 3, 169, 0, 0, 0, 33.43056, 801.8403, 806.4003, 3.228859, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+163, 39616, 643, 5004, 5004, 3, 169, 0, 0, 0, 33.64236, 797.8368, 806.4003, 3.228859, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+164, 41096, 643, 5004, 5004, 3, 169, 0, 0, 0, 36.59722, 810.2656, 806.4003, 3.228859, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+165, 40634, 643, 5004, 5004, 3, 169, 0, 0, 0, 36.03993, 794.0677, 806.4003, 3.228859, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Tempest Witch (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+166, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 36.8507, 825.9358, 806.4003, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+167, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 8.27257, 802.8143, 807.0149, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+168, 39616, 643, 5004, 5004, 3, 169, 0, 0, 0, 33.52778, 806.1667, 806.4003, 3.228859, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+169, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 52.02951, 753.0799, 806.193, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+170, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 65.63021, 820.4844, 806.4003, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+171, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 52.17708, 854.7934, 806.0573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+172, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 60.61632, 781.7604, 806.4003, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+173, 40577, 643, 5004, 5004, 3, 169, 0, 0, 0, 53.11364, 824.3899, 806.3169, 0.01476906, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Sentinel (Area: Throne of the Tides - Difficulty: 2) (Auras: ) (possible waypoints or random movement) +(@CGUID+174, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 84.90799, 801.6302, 806.4003, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+175, 40584, 643, 5004, 5004, 3, 169, 0, 0, 0, -135.0625, 772.4739, 810.089, 1.448623, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) (possible waypoints or random movement) +(@CGUID+176, 40584, 643, 5004, 5004, 3, 169, 0, 0, 0, -135.5764, 831.9948, 808.1715, 4.39823, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) (possible waypoints or random movement) +(@CGUID+177, 41139, 643, 5004, 5004, 3, 169, 0, 0, 0, -103.3125, 775.8559, 810.9689, 1.448623, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) +(@CGUID+178, 40584, 643, 5004, 5004, 3, 169, 0, 0, 0, -103.8837, 832.8108, 808.739, 4.572762, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) +(@CGUID+179, 41139, 643, 5004, 5004, 3, 169, 0, 0, 0, -70.23785, 774.9618, 810.3751, 1.712018, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) +(@CGUID+180, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 128.2726, 802.2448, 808.4679, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+181, 40586, 643, 5004, 5004, 3, 169, 0, 0, 0, 191.8125, 802.4305, 807.7212, 3.036873, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Lady Naz'jar (Area: Throne of the Tides - Difficulty: 2) (Auras: 90495 - Waterspout) +(@CGUID+182, 41139, 643, 5004, 5004, 3, 169, 0, 0, 0, -72.86459, 831.441, 809.7106, 4.86808, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) +(@CGUID+183, 39616, 643, 5004, 5004, 3, 169, 0, 0, 0, 136.4965, 797.0886, 808.4933, 3.228859, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (possible waypoints or random movement) +(@CGUID+184, 39616, 643, 5004, 5004, 3, 169, 0, 0, 0, 136.4896, 806.0139, 808.4933, 3.228859, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+185, 41096, 643, 5004, 5004, 3, 169, 0, 0, 0, 136.809, 810.0139, 808.4933, 3.228859, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (possible waypoints or random movement) +(@CGUID+186, 40634, 643, 5004, 5004, 3, 169, 0, 0, 0, 136.6007, 801.75, 808.4933, 3.228859, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Tempest Witch (Area: Throne of the Tides - Difficulty: 2) (possible waypoints or random movement) +(@CGUID+187, 41096, 643, 5004, 5004, 3, 169, 0, 0, 0, 136.6458, 792.5677, 808.4933, 3.228859, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (possible waypoints or random movement) +(@CGUID+188, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 145.1441, 845.1511, 807.6957, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+189, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 148.4271, 757.5121, 807.6461, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+190, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.83854, 796.2708, 805.673, 3.124139, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+191, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -31.125, 807.9219, 802.3655, 3.176499, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+192, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -32.35243, 798.1597, 801.7277, 3.124139, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+193, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.75174, 799.0087, 805.7594, 3.141593, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+194, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -34.05556, 810.4774, 801.454, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+195, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -29.51736, 810.2552, 803.2809, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+196, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -29.20486, 799.5851, 803.6364, 3.141593, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+197, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.79167, 809.467, 805.1479, 3.176499, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+198, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -30.29688, 794.8941, 803.2464, 3.106686, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+199, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -27.95139, 805.7361, 804.0556, 3.159046, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+200, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 168.658, 802.467, 808.0177, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+201, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -29.51736, 810.2552, 803.2809, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+202, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -34.05556, 810.4774, 801.454, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+203, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.79167, 809.467, 805.1479, 3.176499, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+204, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -27.95139, 805.7361, 804.0556, 3.159046, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+205, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -31.125, 807.9219, 802.3655, 3.176499, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+206, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 193.908, 774.3281, 807.8459, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+207, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 190.8542, 830.8698, 807.873, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+208, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.75174, 799.0087, 805.7594, 3.141593, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+209, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -29.20486, 799.5851, 803.6364, 3.141593, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+210, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -30.29688, 794.8941, 803.2464, 3.106686, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+211, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.83854, 796.2708, 805.673, 3.124139, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+212, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -32.35243, 798.1597, 801.7277, 3.124139, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+213, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 196.4497, 802.3195, 807.7212, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+214, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 223.1389, 802.7222, 808.0499, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+215, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.79167, 809.467, 805.1479, 3.176499, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+216, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -27.95139, 805.7361, 804.0556, 3.159046, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+217, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -31.125, 807.9219, 802.3655, 3.176499, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+218, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -29.51736, 810.2552, 803.2809, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+219, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -34.05556, 810.4774, 801.454, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+220, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 231.8177, 843.3507, 807.885, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+221, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 236.5851, 757.8958, 807.5884, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+222, 44404, 643, 5004, 5004, 3, 169, 0, 0, 0, 191.1979, 745.6007, 830.6442, 1.532863, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Tempest Witch (Area: Throne of the Tides - Difficulty: 2) (Auras: 75808 - Water Window Break Visual) +(@CGUID+223, 44404, 643, 5004, 5004, 3, 169, 0, 0, 0, 191.8733, 859.5452, 831.4933, 4.705678, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Tempest Witch (Area: Throne of the Tides - Difficulty: 2) (Auras: 75808 - Water Window Break Visual) +(@CGUID+224, 40633, 643, 5004, 5004, 3, 169, 0, 0, 0, 249.9375, 802.25, 828.8116, 3.147335, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Honor Guard (Area: Throne of the Tides - Difficulty: 2) (Auras: 75808 - Water Window Break Visual) +(@CGUID+225, 40633, 643, 5004, 5004, 3, 169, 0, 0, 0, 249.9375, 802.25, 828.8116, 3.147335, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Honor Guard (Area: Throne of the Tides - Difficulty: 2) (Auras: 75808 - Water Window Break Visual) +(@CGUID+226, 44404, 643, 5004, 5004, 3, 169, 0, 0, 0, 191.8733, 859.5452, 831.4933, 4.705678, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Tempest Witch (Area: Throne of the Tides - Difficulty: 2) (Auras: 75808 - Water Window Break Visual) +(@CGUID+227, 44404, 643, 5004, 5004, 3, 169, 0, 0, 0, 191.1979, 745.6007, 830.6442, 1.532863, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Tempest Witch (Area: Throne of the Tides - Difficulty: 2) (Auras: 75808 - Water Window Break Visual) +(@CGUID+228, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -296.477, 661.01, 281.4153, 2.23188, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+229, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.7917, 671.1694, 280.5178, 2.186387, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+230, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -296.0759, 668.8297, 280.8867, 2.188809, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+231, 40936, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.3462, 664.1631, 281.7034, 2.1634, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Faceless Watcher (Area: Throne of the Tides - Difficulty: 2) (Auras: 76604 - Void Rip) (possible waypoints or random movement) +(@CGUID+232, 40792, 643, 5004, 5004, 3, 169, 0, 0, 0, -146.8663, 981.5313, 230.4787, 2.949606, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Neptulon (Area: Throne of the Tides - Difficulty: 2) (Auras: 76952 - Purify) +(@CGUID+233, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -288.911, 667.142, 282.2543, 2.14487, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+234, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -296.523, 665.198, 281.0583, 2.25458, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+235, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.146, 662.971, 281.3593, 2.202956, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+236, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.938, 659.363, 281.7794, 2.262644, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+237, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.068, 665.408, 281.9814, 2.15424, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+238, 40936, 643, 5004, 5004, 3, 169, 0, 0, 0, -224.863, 642.969, 287.3143, 3.490659, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Faceless Watcher (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+239, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+240, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -251.5156, 643.8108, 285.8642, 5.270895, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) (Auras: 76410 - Water Jet) +(@CGUID+241, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -252.4879, 646.2882, 285.6189, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+242, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+243, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.8264, 669.691, 279.9994, 2.753881, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+244, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -246.6615, 643.033, 286.2367, 3.735005, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) (Auras: 76410 - Water Jet) +(@CGUID+245, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -256.1823, 637.0452, 285.7028, 2.530727, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+246, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+247, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.9045, 667.1632, 280.3178, 1.095781, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+248, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+249, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -246.9601, 638.0521, 286.1168, 2.373648, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) (Auras: 76410 - Water Jet) +(@CGUID+250, 40936, 643, 5004, 5004, 3, 169, 0, 0, 0, -294.703, 676.158, 280.9214, 3.804818, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Faceless Watcher (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+251, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.7465, 672.2882, 279.8831, 3.661204, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+252, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.983, 951.62, 235.2573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+253, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+254, 40936, 643, 5004, 5004, 3, 169, 0, 0, 0, -224.618, 634.016, 287.2314, 2.879793, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Faceless Watcher (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+255, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.5799, 675.059, 279.8106, 2.304396, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+256, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -252.1979, 638.9879, 285.7877, 0.715585, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) (Auras: 76410 - Water Jet) +(@CGUID+257, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -254.9913, 641.8264, 285.6591, 2.897247, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+258, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+259, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -248.967, 640.9132, 286.041, 2.844887, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) (Auras: 76406 - Water Jet) +(@CGUID+260, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.705, 969.608, 235.7383, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+261, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+262, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+263, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.55, 957.932, 236.0663, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+264, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+265, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+266, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+267, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.573, 959.401, 235.4883, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+268, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.203, 961.87, 235.8903, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+269, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+270, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+271, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+272, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+273, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -282.672, 973.602, 236.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+274, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+275, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+276, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -358.7208, 764.5826, 275.9673, 6.031887, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+277, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+278, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.75, 956.075, 253.9413, 5.707227, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: 82953 - Ozumat Ink) +(@CGUID+279, 40925, 643, 5004, 5004, 3, 169, 0, 0, 0, -309.1018, 915.3441, 239.4511, 4.570662, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Tainted Sentry (Area: Throne of the Tides - Difficulty: 2) (Auras: 76625 - Summon Unstable Corruptions) (possible waypoints or random movement) +(@CGUID+280, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.8, 973.512, 252.4223, 5.707227, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: 82953 - Ozumat Ink) +(@CGUID+281, 40925, 643, 5004, 5004, 3, 169, 0, 0, 0, -228.2951, 977.4132, 231.7018, 3.124139, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Tainted Sentry (Area: Throne of the Tides - Difficulty: 2) (Auras: 76625 - Summon Unstable Corruptions) +(@CGUID+282, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -280.476, 986.049, 251.8123, 5.078908, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: 82953 - Ozumat Ink) +(@CGUID+283, 40925, 643, 5004, 5004, 3, 169, 0, 0, 0, -228.2483, 985.9496, 231.6591, 3.071779, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Tainted Sentry (Area: Throne of the Tides - Difficulty: 2) (Auras: 76625 - Summon Unstable Corruptions) +(@CGUID+284, 40925, 643, 5004, 5004, 3, 169, 0, 0, 0, -285.6053, 964.0278, 236.4931, 3.838374, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Tainted Sentry (Area: Throne of the Tides - Difficulty: 2) (Auras: 76625 - Summon Unstable Corruptions) (possible waypoints or random movement) +(@CGUID+285, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.9781, 770.7604, 270.6053, 6.242595, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+286, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+287, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0395, 770.7627, 270.6158, 6.250383, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+288, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+289, 40765, 643, 5004, 5004, 3, 169, 0, 0, 0, 51.9911, 802.6801, 888.0374, 6.198466, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Commander Ulthok (Area: Throne of the Tides - Difficulty: 2) (Auras: 76017 - Ulthok Intro Visual State) +(@CGUID+290, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+291, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -309.7928, 912.5019, 239.8704, 1.335766, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+292, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+293, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -310.2863, 909.6929, 240.4176, 4.069224, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+294, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+295, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+296, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -310.0808, 909.6741, 240.412, 3.994689, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+297, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+298, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.8094, 952.9477, 236.2822, 5.890752, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+299, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+300, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+301, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.983, 951.62, 235.2573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+302, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -378.2955, 767.4971, 270.2835, 0.01471755, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+303, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -270.484, 975.3795, 236.8476, 3.852387, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+304, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -272.441, 973.3168, 236.8856, 0.4456027, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+305, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+306, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -298.1781, 954.262, 235.8903, 1.001435, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+307, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+308, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+309, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -270.9366, 977.1397, 236.8224, 2.280367, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+310, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -436.6898, 769.2233, 269.5162, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) (Auras: 85211 - Water Bolt) +(@CGUID+311, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+312, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+313, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+314, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4797, 770.1504, 270.0186, 6.043761, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+315, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.54, 770.0549, 271.3423, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+316, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+317, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+318, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+319, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0241, 770.7621, 270.6132, 6.248422, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+320, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.55, 957.932, 236.0663, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +-- (@CGUID+321, 92870, 643, 5004, 5004, 3, 169, 0, 0, 0, -508.3617, 804.9224, 266.9508, 0.02312139, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Sindragosa's Fury (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+322, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+323, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0471, 770.7629, 270.6171, 6.251368, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+324, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+325, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.705, 969.608, 235.7383, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+326, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0395, 770.7627, 270.6158, 6.250383, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+327, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+328, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+329, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -282.672, 973.602, 236.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+330, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+331, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.203, 961.87, 235.8903, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+332, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+333, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+334, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+335, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.573, 959.401, 235.4883, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+336, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+337, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+338, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+339, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+340, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -439.9966, 769.9376, 271.0846, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+341, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.6769, 769.006, 269.2936, 6.077507, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+342, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+343, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.983, 951.62, 235.2573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+344, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+345, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+346, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0471, 770.7629, 270.6171, 6.251368, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+347, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+348, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+349, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+350, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+351, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.7455, 769.0203, 269.3032, 6.076324, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+352, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.0073, 769.9399, 271.0896, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+353, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+354, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+355, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+356, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.7181, 769.0146, 269.2993, 6.076792, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+357, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.002, 769.9387, 271.0871, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+358, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.55, 957.932, 236.0663, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+359, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.7592, 769.0231, 269.3051, 6.076094, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+360, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+361, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.0087, 769.9402, 271.0903, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+362, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.203, 961.87, 235.8903, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+363, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.705, 969.608, 235.7383, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+364, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+365, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+366, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+367, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+368, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+369, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -282.672, 973.602, 236.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+370, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+371, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+372, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+373, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4998, 770.1552, 270.0219, 6.044028, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+374, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.548, 770.0566, 271.3461, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+375, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.983, 951.62, 235.2573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+376, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+377, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+378, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+379, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.573, 959.401, 235.4883, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+380, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+381, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.6906, 769.0088, 269.2955, 6.077271, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+382, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.0046, 769.9393, 271.0884, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+383, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+384, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+385, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+386, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+387, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4897, 770.1528, 270.0203, 6.043887, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+388, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.5413, 770.0552, 271.3429, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+389, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+390, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.55, 957.932, 236.0663, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+391, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0241, 770.7621, 270.6132, 6.248422, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+392, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+393, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+394, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.705, 969.608, 235.7383, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+395, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+396, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -282.672, 973.602, 236.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+397, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4695, 770.1479, 270.017, 6.043641, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+398, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.544, 770.0558, 271.3442, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+399, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+400, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+401, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+402, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+403, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.203, 961.87, 235.8903, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+404, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.573, 959.401, 235.4883, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+405, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+406, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.6906, 769.0088, 269.2955, 6.077271, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+407, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+408, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -439.9993, 769.9382, 271.0858, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) (Auras: 85211 - Water Bolt) +(@CGUID+409, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+410, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+411, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.983, 951.62, 235.2573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+412, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+413, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+414, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -439.994, 769.937, 271.0833, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+415, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.6355, 768.9974, 269.2878, 6.078218, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+416, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+417, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+418, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+419, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4695, 770.1479, 270.017, 6.043641, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+420, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.5387, 770.0546, 271.3416, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+421, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+422, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+423, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+424, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.55, 957.932, 236.0663, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+425, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.52, 770.1602, 270.0252, 6.044287, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+426, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.5438, 770.0559, 271.3448, 6.070781, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+427, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+428, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+429, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -282.672, 973.602, 236.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+430, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+431, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0088, 770.7616, 270.6106, 6.246471, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+432, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.705, 969.608, 235.7383, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+433, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+434, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+435, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+436, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+437, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+438, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.573, 959.401, 235.4883, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+439, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.7181, 769.0146, 269.2993, 6.076792, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+440, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -419.548, 767.3745, 268.4773, 6.166172, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+441, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+442, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.983, 951.62, 235.2573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+443, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+444, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.203, 961.87, 235.8903, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+445, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+446, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -422.8674, 767.6801, 267.9077, 6.179697, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+447, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+448, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+449, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -406.9185, 767.0944, 269.2914, 6.261036, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+450, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+451, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+452, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+453, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+454, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -402.6722, 766.2968, 265.8526, 6.264995, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+455, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+456, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -398.8545, 767.8329, 271.7672, 0.0006884783, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+457, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+458, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -397.9276, 766.3483, 266.2505, 0.03699381, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+459, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -398.9358, 767.6356, 273.8051, 6.220333, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+460, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+461, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+462, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.55, 957.932, 236.0663, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+463, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -418.0725, 767.2133, 267.123, 6.193002, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+464, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -282.672, 973.602, 236.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+465, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -406.2899, 767.5161, 269.9694, 6.276873, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+466, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+467, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+468, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+469, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+470, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+471, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.705, 969.608, 235.7383, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+472, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -402.6597, 766.2965, 265.853, 6.265087, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+473, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+474, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -386.3977, 767.2345, 274.6118, 6.202915, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+475, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+476, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -397.9276, 766.3483, 266.2505, 0.03699381, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+477, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+478, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.573, 959.401, 235.4883, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+479, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -392.8012, 767.4155, 274.3909, 6.214547, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+480, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+481, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+482, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -402.7597, 766.2983, 265.8493, 6.264351, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+483, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+484, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -398.8349, 767.8334, 273.5405, 6.223954, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+485, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+486, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.203, 961.87, 235.8903, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+487, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.983, 951.62, 235.2573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+488, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+489, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+490, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+491, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+492, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -397.9156, 766.3488, 266.2519, 0.03709382, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+493, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -398.8584, 767.6307, 273.8154, 6.220333, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+494, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+495, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -413.1039, 766.8049, 266.4181, 6.210011, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+496, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -411.4561, 768.2091, 270.4888, 0.004991191, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+497, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+498, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -282.672, 973.602, 236.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+499, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.55, 957.932, 236.0663, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+500, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -422.8785, 767.6812, 267.9095, 6.179667, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+501, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+502, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -425.83, 768.1109, 269.0852, 6.165987, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+503, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+504, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+505, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.705, 969.608, 235.7383, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+506, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+507, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+508, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+509, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.536, 770.0541, 271.3404, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+510, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.429, 770.138, 270.0104, 6.043131, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+511, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.573, 959.401, 235.4883, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+512, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+513, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+514, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+515, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -439.998, 769.9379, 271.0852, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+516, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+517, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.6769, 769.006, 269.2936, 6.077507, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+518, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+519, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+520, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+521, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.983, 951.62, 235.2573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+522, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.203, 961.87, 235.8903, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+523, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0395, 770.7627, 270.6158, 6.250383, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+524, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+525, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+526, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+527, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+528, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+529, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4797, 770.1504, 270.0186, 6.043761, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+530, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.54, 770.0549, 271.3423, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+531, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+532, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+533, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0241, 770.7621, 270.6132, 6.248422, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+534, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+535, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -282.672, 973.602, 236.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+536, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+537, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+538, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.55, 957.932, 236.0663, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+539, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.573, 959.401, 235.4883, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+540, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+541, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4998, 770.1552, 270.0219, 6.044028, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+542, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.5427, 770.0555, 271.3435, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+543, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.705, 969.608, 235.7383, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+544, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+545, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+546, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+547, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+548, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.203, 961.87, 235.8903, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+549, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.5387, 770.0546, 271.3416, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+550, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4594, 770.1454, 270.0154, 6.043514, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+551, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+552, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+553, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+554, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+555, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+556, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+557, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+558, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+559, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+560, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.7455, 769.0203, 269.3032, 6.076324, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+561, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.0046, 769.9393, 271.0884, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+562, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+563, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+564, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+565, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0241, 770.7621, 270.6132, 6.248422, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+566, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+567, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -387.9229, 766.9808, 268.0077, 0.07349079, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+568, 44864, 643, 5004, 5004, 3, 169, 0, 0, 0, -153.333, 982.807, 229.5483, 2.792527, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Ozumat Combat Trigger (Area: Throne of the Tides - Difficulty: 2) +-- (@CGUID+569, 44950, UNKNOWN, 5004, 5004, 3, 169, 0, 0, 0, -0.6934912, -3.64126, 1.543307, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unyielding Behemoth (Hand Visual) (Area: Throne of the Tides - Difficulty: 2) (Auras: 46598 - Ride Vehicle Hardcoded, 83976 - Shrink) - !!! on transport - transport template not found !!! +(@CGUID+570, 44566, 643, 5004, 5004, 3, 169, 0, 0, 0, -64.0677, 845.455, 310.6913, 2.181662, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Ozumat (Area: Throne of the Tides - Difficulty: 2) (Auras: 83126 - Ozumat Globe Impact Periodic) +(@CGUID+571, 44656, 643, 5004, 5004, 3, 169, 0, 0, 0, -103.066, 910.313, 263.1674, 2.164208, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Ozumat Add Spawner (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+572, 44752, 643, 5004, 5004, 3, 169, 0, 0, 0, -165.0469, 1002.967, 230.5902, 5.393067, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Faceless Sapper (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+573, 44752, 643, 5004, 5004, 3, 169, 0, 0, 0, -125.7309, 1004.01, 230.3206, 3.892084, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Faceless Sapper (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+574, 44752, 643, 5004, 5004, 3, 169, 0, 0, 0, -168.4375, 962.1979, 230.2837, 0.4886922, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Faceless Sapper (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+575, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -368.6192, 766.7662, 272.7951, 6.119343, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+576, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -354.9971, 763.6516, 277.2143, 6.063018, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+577, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -358.6903, 764.5749, 275.9777, 6.031822, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365); -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) + +DELETE FROM `creature_addon` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+577; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(@CGUID+0, 0, 0, 0, 1, 0, '99201'), -- Summon Enabler Stalker - 99201 - Summon Enabler +(@CGUID+1, 0, 0, 0, 1, 0, '29266'), -- Naz'jar Spiritmender - 29266 - Permanent Feign Death +(@CGUID+2, 0, 0, 0, 1, 0, '29266'), -- Naz'jar Invader - 29266 - Permanent Feign Death +(@CGUID+3, 0, 0, 0, 1, 0, '99201'), -- Summon Enabler Stalker - 99201 - Summon Enabler +(@CGUID+4, 0, 0, 0, 1, 0, '29266'), -- Naz'jar Spiritmender - 29266 - Permanent Feign Death +(@CGUID+5, 0, 0, 0, 1, 0, '29266'), -- Naz'jar Invader - 29266 - Permanent Feign Death +(@CGUID+6, 0, 0, 0, 1, 0, '99201'), -- Summon Enabler Stalker - 99201 - Summon Enabler +(@CGUID+7, 0, 0, 0, 1, 0, '29266'), -- Naz'jar Invader - 29266 - Permanent Feign Death +(@CGUID+8, 0, 0, 0, 1, 0, '99201'), -- Summon Enabler Stalker - 99201 - Summon Enabler +(@CGUID+9, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+10, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+11, 0, 0, 50331648, 1, 0, '85211'), -- Elemental Guard - 85211 - Water Bolt +(@CGUID+12, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+13, 0, 0, 50331648, 1, 0, '95293'), -- Throne of Tides Teleporter - 95293 - Teleporter Base Visual +(@CGUID+14, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+15, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+16, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+17, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+18, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+19, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+20, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+21, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+22, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+23, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+24, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+25, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+26, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+27, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+28, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+29, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+30, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+31, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+32, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+33, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+34, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+35, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+36, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+37, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+38, 0, 0, 0, 1, 0, '76345'), -- World Trigger (Large AOI) - 76345 - Water Leak +(@CGUID+39, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+40, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+41, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+42, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+43, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+44, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+45, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+46, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+47, 0, 0, 0, 1, 0, '76345'), -- World Trigger (Large AOI) - 76345 - Water Leak +(@CGUID+48, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+49, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+50, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+51, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+52, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+53, 0, 0, 0, 1, 0, '76345'), -- World Trigger (Large AOI) - 76345 - Water Leak +(@CGUID+54, 0, 0, 50331648, 1, 0, ''), -- Ozumat Vehicle +(@CGUID+55, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+56, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+57, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+58, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+59, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+60, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+61, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+62, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+63, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+64, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+65, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+66, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+67, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+68, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+69, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+70, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+71, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+72, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+73, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+74, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+75, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+76, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+77, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+78, 0, 0, 0, 1, 0, '91347'), -- Geyser - 91347 - Geyser +(@CGUID+79, 0, 0, 0, 1, 0, '91347'), -- Geyser - 91347 - Geyser +(@CGUID+80, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +-- (@CGUID+81, 0, 0, 50331648, 1, 0, ''), -- Ozumat +(@CGUID+82, 0, 0, 0, 1, 0, '91347'), -- Geyser - 91347 - Geyser +(@CGUID+83, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+84, 0, 0, 0, 1, 0, '91347'), -- Geyser - 91347 - Geyser +(@CGUID+85, 0, 0, 50331648, 1, 0, ''), -- Ozumat Vehicle, Big +(@CGUID+86, 0, 0, 0, 1, 0, '91347'), -- Geyser - 91347 - Geyser +(@CGUID+87, 0, 0, 0, 1, 0, ''), -- Captain Taylor +(@CGUID+88, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+89, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+90, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+91, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+92, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+93, 0, 0, 0, 1, 0, ''), -- World Trigger (Not Immune PC) +(@CGUID+94, 0, 0, 0, 1, 0, ''), -- Naz'jar Sentinel +(@CGUID+95, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+96, 0, 0, 0, 1, 0, ''), -- World Trigger (Not Immune PC) +(@CGUID+97, 0, 0, 0, 1, 0, ''), -- World Trigger +-- (@CGUID+98, 0, 0, 0, 1, 0, '76339'), -- Mindbender Ghur'sha - 76339 - Unrelenting Agony +(@CGUID+99, 0, 0, 50331648, 1, 0, '74048'), -- Naz'jar Invader - 74048 - Water Window Jump Through Visual +(@CGUID+100, 0, 0, 50331648, 1, 0, '74048'), -- Naz'jar Invader - 74048 - Water Window Jump Through Visual +(@CGUID+101, 0, 0, 50331648, 1, 0, '74048'), -- Naz'jar Spiritmender - 74048 - Water Window Jump Through Visual +(@CGUID+102, 0, 0, 50331648, 1, 0, '74048'), -- Naz'jar Spiritmender - 74048 - Water Window Jump Through Visual +(@CGUID+103, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+104, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+105, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+106, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+107, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+108, 0, 0, 50331648, 1, 0, '85211'), -- Elemental Guard - 85211 - Water Bolt +(@CGUID+109, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+110, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+111, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+112, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+113, 0, 0, 0, 1, 0, ''), -- Ozumat Add Spawner +(@CGUID+114, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+115, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+116, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+117, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+118, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+119, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+120, 0, 0, 0, 1, 0, ''), -- Ozumat Add Spawner +(@CGUID+121, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+122, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+123, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+124, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+125, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+126, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+127, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+128, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+129, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+130, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+131, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+132, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+133, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+134, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+135, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+136, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+137, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+138, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+139, 0, 0, 0, 1, 0, ''), -- Lady Naz'jar +(@CGUID+140, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+141, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+142, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+143, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+144, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+145, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+146, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+147, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+148, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+149, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+150, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+151, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+152, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+153, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+154, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+155, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+156, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+157, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+158, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+159, 0, 0, 50331648, 1, 0, '95296'), -- Throne of Tides Teleporter - 95296 - Teleporter Active Visual +(@CGUID+160, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+161, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+162, 0, 0, 0, 1, 0, ''), -- Naz'jar Invader +(@CGUID+163, 0, 0, 0, 1, 0, ''), -- Naz'jar Invader +(@CGUID+164, 0, 0, 0, 1, 0, ''), -- Naz'jar Spiritmender +(@CGUID+165, 0, 0, 0, 1, 0, ''), -- Naz'jar Tempest Witch +(@CGUID+166, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+167, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+168, 0, 0, 0, 1, 0, ''), -- Naz'jar Invader +(@CGUID+169, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+170, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+171, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+172, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+173, 0, 0, 0, 1, 0, ''), -- Naz'jar Sentinel +(@CGUID+174, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+175, 0, 0, 50331648, 1, 0, '74048'), -- Naz'jar Invader - 74048 - Water Window Jump Through Visual +(@CGUID+176, 0, 0, 50331648, 1, 0, '74048'), -- Naz'jar Invader - 74048 - Water Window Jump Through Visual +(@CGUID+177, 0, 0, 0, 1, 0, '74048'), -- Naz'jar Spiritmender - 74048 - Water Window Jump Through Visual +(@CGUID+178, 0, 0, 50331648, 1, 0, '74048'), -- Naz'jar Invader - 74048 - Water Window Jump Through Visual +(@CGUID+179, 0, 0, 0, 1, 0, '74048'), -- Naz'jar Spiritmender - 74048 - Water Window Jump Through Visual +(@CGUID+180, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+181, 0, 0, 0, 1, 0, '90495'), -- Lady Naz'jar - 90495 - Waterspout +(@CGUID+182, 0, 0, 0, 1, 0, '74048'), -- Naz'jar Spiritmender - 74048 - Water Window Jump Through Visual +(@CGUID+183, 0, 0, 0, 1, 0, ''), -- Naz'jar Invader +(@CGUID+184, 0, 0, 0, 1, 0, ''), -- Naz'jar Invader +(@CGUID+185, 0, 0, 0, 1, 0, ''), -- Naz'jar Spiritmender +(@CGUID+186, 0, 0, 0, 1, 0, ''), -- Naz'jar Tempest Witch +(@CGUID+187, 0, 0, 0, 1, 0, ''), -- Naz'jar Spiritmender +(@CGUID+188, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+189, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+190, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+191, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+192, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+193, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+194, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+195, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+196, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+197, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+198, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+199, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+200, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+201, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+202, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+203, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+204, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+205, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+206, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+207, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+208, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+209, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+210, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+211, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+212, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+213, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+214, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+215, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+216, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+217, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+218, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+219, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+220, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+221, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+222, 0, 0, 0, 1, 0, '75808'), -- Naz'jar Tempest Witch - 75808 - Water Window Break Visual +(@CGUID+223, 0, 0, 0, 1, 0, '75808'), -- Naz'jar Tempest Witch - 75808 - Water Window Break Visual +(@CGUID+224, 0, 0, 50331648, 1, 0, '75808'), -- Naz'jar Honor Guard - 75808 - Water Window Break Visual +(@CGUID+225, 0, 0, 50331648, 1, 0, '75808'), -- Naz'jar Honor Guard - 75808 - Water Window Break Visual +(@CGUID+226, 0, 0, 0, 1, 0, '75808'), -- Naz'jar Tempest Witch - 75808 - Water Window Break Visual +(@CGUID+227, 0, 0, 0, 1, 0, '75808'), -- Naz'jar Tempest Witch - 75808 - Water Window Break Visual +(@CGUID+228, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+229, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+230, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+231, 0, 0, 0, 1, 0, '76604'), -- Faceless Watcher - 76604 - Void Rip +(@CGUID+232, 0, 0, 0, 1, 0, '76952'), -- Neptulon - 76952 - Purify +(@CGUID+233, 0, 0, 0, 1, 0, ''), -- Gilgoblin Aquamage +(@CGUID+234, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+235, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+236, 0, 0, 0, 1, 0, ''), -- Gilgoblin Aquamage +(@CGUID+237, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+238, 0, 0, 0, 1, 0, ''), -- Faceless Watcher +(@CGUID+239, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+240, 0, 0, 0, 0, 0, '76410'), -- Gilgoblin Aquamage - 76410 - Water Jet +(@CGUID+241, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+242, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+243, 0, 0, 0, 1, 0, ''), -- Gilgoblin Aquamage +(@CGUID+244, 0, 0, 0, 0, 0, '76410'), -- Gilgoblin Aquamage - 76410 - Water Jet +(@CGUID+245, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+246, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+247, 0, 0, 0, 1, 0, ''), -- Gilgoblin Aquamage +(@CGUID+248, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+249, 0, 0, 0, 0, 0, '76410'), -- Gilgoblin Aquamage - 76410 - Water Jet +(@CGUID+250, 0, 0, 0, 1, 0, ''), -- Faceless Watcher +(@CGUID+251, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+252, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+253, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+254, 0, 0, 0, 1, 0, ''), -- Faceless Watcher +(@CGUID+255, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+256, 0, 0, 0, 0, 0, '76410'), -- Gilgoblin Aquamage - 76410 - Water Jet +(@CGUID+257, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+258, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+259, 0, 0, 0, 1, 0, '76406'), -- Gilgoblin Aquamage - 76406 - Water Jet +(@CGUID+260, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+261, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+262, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+263, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+264, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+265, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+266, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+267, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+268, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+269, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+270, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+271, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+272, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+273, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+274, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+275, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+276, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+277, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+278, 0, 0, 0, 1, 0, '82953'), -- World Trigger - 82953 - Ozumat Ink +(@CGUID+279, 0, 0, 0, 1, 0, '76625'), -- Tainted Sentry - 76625 - Summon Unstable Corruptions +(@CGUID+280, 0, 0, 0, 1, 0, '82953'), -- World Trigger - 82953 - Ozumat Ink +(@CGUID+281, 0, 0, 0, 1, 0, '76625'), -- Tainted Sentry - 76625 - Summon Unstable Corruptions +(@CGUID+282, 0, 0, 0, 1, 0, '82953'), -- World Trigger - 82953 - Ozumat Ink +(@CGUID+283, 0, 0, 0, 1, 0, '76625'), -- Tainted Sentry - 76625 - Summon Unstable Corruptions +(@CGUID+284, 0, 0, 0, 1, 0, '76625'), -- Tainted Sentry - 76625 - Summon Unstable Corruptions +(@CGUID+285, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+286, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+287, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+288, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+289, 0, 0, 0, 1, 0, '76017'), -- Commander Ulthok - 76017 - Ulthok Intro Visual State +(@CGUID+290, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+291, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+292, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+293, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+294, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+295, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+296, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+297, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+298, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+299, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+300, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+301, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+302, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+303, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+304, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+305, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+306, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+307, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+308, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+309, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+310, 0, 0, 50331648, 1, 0, '85211'), -- Elemental Guard - 85211 - Water Bolt +(@CGUID+311, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+312, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+313, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+314, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+315, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+316, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+317, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+318, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+319, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+320, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +-- (@CGUID+321, 0, 0, 50331648, 1, 0, ''), -- Sindragosa's Fury +(@CGUID+322, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+323, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+324, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+325, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+326, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+327, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+328, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+329, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+330, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+331, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+332, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+333, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+334, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+335, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+336, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+337, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+338, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+339, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+340, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+341, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+342, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+343, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+344, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+345, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+346, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+347, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+348, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+349, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+350, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+351, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+352, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+353, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+354, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+355, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+356, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+357, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+358, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+359, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+360, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+361, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+362, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+363, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+364, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+365, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+366, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+367, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+368, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+369, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+370, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+371, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+372, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+373, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+374, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+375, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+376, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+377, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+378, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+379, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+380, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+381, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+382, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+383, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+384, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+385, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+386, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+387, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+388, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+389, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+390, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+391, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+392, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+393, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+394, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+395, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+396, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+397, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+398, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+399, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+400, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+401, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+402, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+403, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+404, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+405, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+406, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+407, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+408, 0, 0, 50331648, 1, 0, '85211'), -- Elemental Guard - 85211 - Water Bolt +(@CGUID+409, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+410, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+411, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+412, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+413, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+414, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+415, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+416, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+417, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+418, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+419, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+420, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+421, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+422, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+423, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+424, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+425, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+426, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+427, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+428, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+429, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+430, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+431, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+432, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+433, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+434, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+435, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+436, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+437, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+438, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+439, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+440, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+441, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+442, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+443, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+444, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+445, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+446, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+447, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+448, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+449, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+450, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+451, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+452, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+453, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+454, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+455, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+456, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+457, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+458, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+459, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+460, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+461, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+462, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+463, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+464, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+465, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+466, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+467, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+468, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+469, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+470, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+471, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+472, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+473, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+474, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+475, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+476, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+477, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+478, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+479, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+480, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+481, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+482, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+483, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+484, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+485, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+486, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+487, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+488, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+489, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+490, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+491, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+492, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+493, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+494, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+495, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+496, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+497, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+498, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+499, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+500, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+501, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+502, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+503, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+504, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+505, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+506, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+507, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+508, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+509, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+510, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+511, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+512, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+513, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+514, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+515, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+516, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+517, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+518, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+519, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+520, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+521, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+522, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+523, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+524, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+525, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+526, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+527, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+528, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+529, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+530, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+531, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+532, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+533, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+534, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+535, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+536, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+537, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+538, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+539, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+540, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+541, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+542, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+543, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+544, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+545, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+546, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+547, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+548, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+549, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+550, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+551, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+552, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+553, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+554, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+555, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+556, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+557, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+558, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+559, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+560, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+561, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+562, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+563, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+564, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+565, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+566, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+567, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+568, 0, 0, 0, 1, 0, ''), -- Ozumat Combat Trigger +-- (@CGUID+569, 0, 0, 50331648, 1, 0, '83976'), -- Unyielding Behemoth (Hand Visual) - 46598 - Ride Vehicle Hardcoded, 83976 - Shrink +(@CGUID+570, 0, 0, 50331648, 1, 0, '83126'), -- Ozumat - 83126 - Ozumat Globe Impact Periodic +(@CGUID+571, 0, 0, 0, 1, 0, ''), -- Ozumat Add Spawner +(@CGUID+572, 0, 0, 0, 1, 0, ''), -- Faceless Sapper +(@CGUID+573, 0, 0, 0, 1, 0, ''), -- Faceless Sapper +(@CGUID+574, 0, 0, 0, 1, 0, ''), -- Faceless Sapper +(@CGUID+575, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+576, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+577, 0, 0, 50331648, 1, 0, ''); -- Naz'jar Soldier + +SET @OGUID:=235567; +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+776; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `PhaseId`, `PhaseGroup`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `VerifiedBuild`) VALUES +(@OGUID+0, 204963, 643, 5004, 5004, 3, 169, 0, -647.283, 806.7465, 249.3488, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Instance Portal (Party + Heroic) (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+1, 207998, 643, 5004, 5004, 3, 169, 0, -319.7966, 857.6629, 271.2394, 1.570796, 0, 0, 0.7071066, 0.7071069, 7200, 255, 1, 26365), -- Doodad_WG_Invisible_Door02 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+2, 208301, 643, 5004, 5004, 3, 169, 0, -311.465, 932.8975, 247.9267, 4.71239, 0, 0, -0.7071066, 0.7071069, 7200, 255, 1, 26365), -- Doodad_Abyssal_Leviathan_Tentacle_fromBelow01 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+3, 208302, 643, 5004, 5004, 3, 169, 0, -309.7529, 685.5665, 286.1978, 1.570796, 0, 0, 0.7071066, 0.7071069, 7200, 255, 1, 26365), -- Doodad_Abyssal_Leviathan_Tentacle01 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+4, 207997, 643, 5004, 5004, 3, 169, 0, -315.5558, 758.4044, 275.6646, 4.71239, 0, 0, -0.7071066, 0.7071069, 7200, 255, 1, 26365), -- Doodad_WG_Invisible_Door01 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+5, 204341, 643, 5004, 5004, 3, 169, 0, -211.6087, 981.8606, 229.7631, 3.141593, 0, 0, -1, 0, 7200, 255, 1, 26365), -- Doodad_Abyssal_Maw_Door_04 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+6, 204340, 643, 5004, 5004, 3, 169, 0, -211.5925, 637.4172, 286.1444, 3.141593, 0, 0, -1, 0, 7200, 255, 0, 26365), -- Doodad_Abyssal_Maw_Door_03 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+7, 207209, 643, 5004, 5004, 3, 169, 0, -215.2937, 806.2046, 253.7109, 3.141593, 0, 0, -1, 0, 7200, 255, 24, 26365), -- 0 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+8, 204339, 643, 5004, 5004, 3, 169, 0, 108.324, 802.3706, 807.5527, 3.141593, 0, 0, -1, 0, 7200, 255, 0, 26365), -- Doodad_Abyssal_Maw_Door_02 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+9, 204338, 643, 5004, 5004, 3, 169, 0, -9.41391, 802.3706, 807.5527, 3.141593, 0, 0, -1, 0, 7200, 255, 1, 26365), -- Doodad_Abyssal_Maw_Door_01 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+10, 207406, 643, 5004, 5004, 3, 169, 0, -297.9132, 795.2726, 261.6193, 2.44346, 0, 0, 0.9396925, 0.3420205, 7200, 255, 1, 26365), -- Strange Fountain (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+11, 202742, 643, 5004, 5004, 3, 169, 0, -603.6129, 827.2743, 245.388, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+12, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+13, 202742, 643, 5004, 5004, 3, 169, 0, -586.0226, 808.3559, 245.4128, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+14, 202742, 643, 5004, 5004, 3, 169, 0, -581.4739, 784.1632, 245.3917, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+15, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+16, 202742, 643, 5004, 5004, 3, 169, 0, -617.3641, 836.2683, 248.1258, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+17, 202742, 643, 5004, 5004, 3, 169, 0, -284.7762, 807.5505, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+18, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+19, 202742, 643, 5004, 5004, 3, 169, 0, -591.2202, 799.9266, 245.4122, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+20, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+21, 202742, 643, 5004, 5004, 3, 169, 0, -479.9549, 803.1893, 253.4132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+22, 202742, 643, 5004, 5004, 3, 169, 0, -548.1771, 807.5104, 246.4562, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+23, 202742, 643, 5004, 5004, 3, 169, 0, -361.9618, 808.1545, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+24, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+25, 202742, 643, 5004, 5004, 3, 169, 0, -358.9077, 815.5439, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+26, 202742, 643, 5004, 5004, 3, 169, 0, -496.4043, 799.0345, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+27, 202742, 643, 5004, 5004, 3, 169, 0, -444.9424, 808.0842, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+28, 202742, 643, 5004, 5004, 3, 169, 0, -240.7071, 817.6274, 260.4027, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+29, 202742, 643, 5004, 5004, 3, 169, 0, -272.7153, 807.8299, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+30, 202742, 643, 5004, 5004, 3, 169, 0, -609.2257, 790.7344, 245.3671, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+31, 202742, 643, 5004, 5004, 3, 169, 0, -524.0555, 805.6702, 256.9915, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+32, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+33, 202742, 643, 5004, 5004, 3, 169, 0, -544.8745, 815.712, 256.9915, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+34, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+35, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+36, 202742, 643, 5004, 5004, 3, 169, 0, -235.1476, 800.8314, 261.5132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+37, 202742, 643, 5004, 5004, 3, 169, 0, -299.1781, 793.9689, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+38, 202742, 643, 5004, 5004, 3, 169, 0, -493.1612, 811.2871, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+39, 202742, 643, 5004, 5004, 3, 169, 0, -603.3486, 795.0095, 246.8475, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+40, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+41, 202742, 643, 5004, 5004, 3, 169, 0, -598.3884, 848.5992, 248.4784, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+42, 202742, 643, 5004, 5004, 3, 169, 0, -548.1771, 807.5104, 246.4562, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+43, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+44, 202742, 643, 5004, 5004, 3, 169, 0, -307.4474, 795.1099, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+45, 202742, 643, 5004, 5004, 3, 169, 0, -581.4739, 784.1632, 245.3917, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+46, 202742, 643, 5004, 5004, 3, 169, 0, -609.2257, 790.7344, 245.3671, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+47, 202742, 643, 5004, 5004, 3, 169, 0, -459.9038, 818.2845, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+48, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+49, 202742, 643, 5004, 5004, 3, 169, 0, -594.227, 818.4092, 245.388, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+50, 202742, 643, 5004, 5004, 3, 169, 0, -586.0226, 808.3559, 245.4128, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+51, 202742, 643, 5004, 5004, 3, 169, 0, -479.9549, 803.1893, 253.4132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+52, 202742, 643, 5004, 5004, 3, 169, 0, -369.568, 818.5821, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+53, 202742, 643, 5004, 5004, 3, 169, 0, -361.9618, 808.1545, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+54, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+55, 202742, 643, 5004, 5004, 3, 169, 0, -466.2964, 818.5667, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+56, 202742, 643, 5004, 5004, 3, 169, 0, -603.8947, 798.4953, 246.8475, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+57, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+58, 202742, 643, 5004, 5004, 3, 169, 0, -358.3351, 817.1099, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+59, 202742, 643, 5004, 5004, 3, 169, 0, -548.1771, 807.5104, 246.4562, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+60, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+61, 202742, 643, 5004, 5004, 3, 169, 0, -290.175, 814.1153, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+62, 202742, 643, 5004, 5004, 3, 169, 0, -556.7227, 821.95, 256.9915, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+63, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+64, 202742, 643, 5004, 5004, 3, 169, 0, -448.101, 799.924, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+65, 202742, 643, 5004, 5004, 3, 169, 0, -586.0226, 808.3559, 245.4128, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+66, 202742, 643, 5004, 5004, 3, 169, 0, -229.6048, 790.1569, 261.3102, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+67, 202742, 643, 5004, 5004, 3, 169, 0, -479.9549, 803.1893, 253.4132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+68, 202742, 643, 5004, 5004, 3, 169, 0, -368.801, 818.1627, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+69, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+70, 202742, 643, 5004, 5004, 3, 169, 0, -609.2257, 790.7344, 245.3671, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+71, 202742, 643, 5004, 5004, 3, 169, 0, -572.4982, 788.6063, 245.4122, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+72, 202742, 643, 5004, 5004, 3, 169, 0, -290.5056, 806.1481, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+73, 202742, 643, 5004, 5004, 3, 169, 0, -581.4739, 784.1632, 245.3917, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+74, 202742, 643, 5004, 5004, 3, 169, 0, -585.6165, 824.773, 245.388, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+75, 202742, 643, 5004, 5004, 3, 169, 0, -488.4996, 791.0689, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+76, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+77, 202742, 643, 5004, 5004, 3, 169, 0, -524.0555, 805.6702, 256.9915, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+78, 202742, 643, 5004, 5004, 3, 169, 0, -587.3433, 821.478, 245.388, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+79, 202742, 643, 5004, 5004, 3, 169, 0, -425.3569, 800.3156, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+80, 202742, 643, 5004, 5004, 3, 169, 0, -609.2257, 790.7344, 245.3671, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+81, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+82, 202742, 643, 5004, 5004, 3, 169, 0, -391.1242, 796.3162, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+83, 202742, 643, 5004, 5004, 3, 169, 0, -548.1771, 807.5104, 246.4562, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+84, 202742, 643, 5004, 5004, 3, 169, 0, -581.4739, 784.1632, 245.3917, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+85, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+86, 202742, 643, 5004, 5004, 3, 169, 0, -586.0226, 808.3559, 245.4128, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+87, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+88, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+89, 202742, 643, 5004, 5004, 3, 169, 0, -226.2889, 808.7465, 262.4425, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+90, 202742, 643, 5004, 5004, 3, 169, 0, -272.7153, 807.8299, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+91, 202742, 643, 5004, 5004, 3, 169, 0, -335.619, 805.8668, 260.7825, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+92, 202742, 643, 5004, 5004, 3, 169, 0, -479.9549, 803.1893, 253.4132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+93, 202742, 643, 5004, 5004, 3, 169, 0, -607.69, 836.9983, 246.2324, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+94, 202742, 643, 5004, 5004, 3, 169, 0, -299.9826, 801.5759, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+95, 202742, 643, 5004, 5004, 3, 169, 0, -621.425, 835.7364, 250.5735, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+96, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+97, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+98, 202742, 643, 5004, 5004, 3, 169, 0, -298.357, 853.6345, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+99, 202742, 643, 5004, 5004, 3, 169, 0, -457.8351, 802.7327, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+100, 202742, 643, 5004, 5004, 3, 169, 0, -605.7587, 822.4447, 246.8475, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+101, 202742, 643, 5004, 5004, 3, 169, 0, -311.526, 782.5868, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+102, 202742, 643, 5004, 5004, 3, 169, 0, -362.8908, 795.5602, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+103, 202742, 643, 5004, 5004, 3, 169, 0, -595.3865, 825.0136, 245.388, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+104, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+105, 202742, 643, 5004, 5004, 3, 169, 0, -304.5349, 791.9608, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+106, 202742, 643, 5004, 5004, 3, 169, 0, -518.662, 809.2816, 257.7878, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+107, 202742, 643, 5004, 5004, 3, 169, 0, -548.1771, 807.5104, 246.4562, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+108, 202742, 643, 5004, 5004, 3, 169, 0, -588.5107, 794.9981, 245.4122, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+109, 202742, 643, 5004, 5004, 3, 169, 0, -342.7049, 809.5555, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+110, 202742, 643, 5004, 5004, 3, 169, 0, -581.4739, 784.1632, 245.3917, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+111, 202742, 643, 5004, 5004, 3, 169, 0, -479.9549, 803.1893, 253.4132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+112, 202742, 643, 5004, 5004, 3, 169, 0, -225.7423, 822.6299, 261.5414, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+113, 202742, 643, 5004, 5004, 3, 169, 0, -609.2257, 790.7344, 245.3671, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+114, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+115, 202742, 643, 5004, 5004, 3, 169, 0, -586.0226, 808.3559, 245.4128, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+116, 202742, 643, 5004, 5004, 3, 169, 0, -462.7195, 816.3304, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+117, 202742, 643, 5004, 5004, 3, 169, 0, -576.1688, 820.5981, 245.388, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+118, 202742, 643, 5004, 5004, 3, 169, 0, -386.6591, 810.1473, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+119, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+120, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+121, 202742, 643, 5004, 5004, 3, 169, 0, -472.6013, 814.3001, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+122, 202742, 643, 5004, 5004, 3, 169, 0, -236.5861, 804.4183, 261.4096, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+123, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+124, 202742, 643, 5004, 5004, 3, 169, 0, -586.0226, 808.3559, 245.4128, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+125, 202742, 643, 5004, 5004, 3, 169, 0, -616.9158, 788.9645, 246.8475, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+126, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+127, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+128, 202742, 643, 5004, 5004, 3, 169, 0, -581.4739, 784.1632, 245.3917, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+129, 202742, 643, 5004, 5004, 3, 169, 0, -427.9673, 799.2715, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+130, 202742, 643, 5004, 5004, 3, 169, 0, -142.5002, 807.4653, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+131, 202742, 643, 5004, 5004, 3, 169, 0, -359.4024, 816.0008, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+132, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+133, 202742, 643, 5004, 5004, 3, 169, 0, -545.8215, 803.1368, 256.9915, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+134, 202742, 643, 5004, 5004, 3, 169, 0, -548.1771, 807.5104, 246.4562, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+135, 202742, 643, 5004, 5004, 3, 169, 0, -609.2257, 790.7344, 245.3671, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+136, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+137, 202742, 643, 5004, 5004, 3, 169, 0, -479.9549, 803.1893, 253.4132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+138, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+139, 202742, 643, 5004, 5004, 3, 169, 0, -304.8722, 803.3438, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+140, 202742, 643, 5004, 5004, 3, 169, 0, -595.9771, 834.451, 245.4122, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+141, 202742, 643, 5004, 5004, 3, 169, 0, -287.5294, 800.5106, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+142, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+143, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+144, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+145, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+146, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+147, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+148, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+149, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+150, 202742, 643, 5004, 5004, 3, 169, 0, -479.9549, 803.1893, 253.4132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+151, 202742, 643, 5004, 5004, 3, 169, 0, -481.6059, 796.6169, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+152, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+153, 202742, 643, 5004, 5004, 3, 169, 0, -609.2257, 790.7344, 245.3671, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+154, 202742, 643, 5004, 5004, 3, 169, 0, -581.4739, 784.1632, 245.3917, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+155, 202742, 643, 5004, 5004, 3, 169, 0, -611.7615, 789.2568, 246.8475, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+156, 202742, 643, 5004, 5004, 3, 169, 0, -548.1771, 807.5104, 246.4562, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+157, 202742, 643, 5004, 5004, 3, 169, 0, -599.2275, 802.1318, 245.4122, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+158, 202742, 643, 5004, 5004, 3, 169, 0, -594.126, 850.4564, 248.2198, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+159, 202742, 643, 5004, 5004, 3, 169, 0, -557.9584, 809.366, 256.9915, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+160, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+161, 202742, 643, 5004, 5004, 3, 169, 0, -272.7153, 807.8299, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+162, 202742, 643, 5004, 5004, 3, 169, 0, -361.9618, 808.1545, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+163, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+164, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+165, 202742, 643, 5004, 5004, 3, 169, 0, -457.8351, 802.7327, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+166, 202742, 643, 5004, 5004, 3, 169, 0, -358.4568, 817.6851, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+167, 202742, 643, 5004, 5004, 3, 169, 0, -240.8974, 805.6653, 260.8077, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+168, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+169, 202742, 643, 5004, 5004, 3, 169, 0, -299.1329, 817.9169, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+170, 202742, 643, 5004, 5004, 3, 169, 0, -586.0226, 808.3559, 245.4128, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+171, 202742, 643, 5004, 5004, 3, 169, 0, -586.0226, 808.3559, 245.4128, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+172, 202742, 643, 5004, 5004, 3, 169, 0, -587.9221, 811.8238, 245.388, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+173, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+174, 202742, 643, 5004, 5004, 3, 169, 0, -560.1353, 808.0738, 256.9915, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+175, 202742, 643, 5004, 5004, 3, 169, 0, -310.2377, 796.3908, 261.6247, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+176, 202742, 643, 5004, 5004, 3, 169, 0, -588.1623, 789.9441, 245.4122, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+177, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+178, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+179, 202742, 643, 5004, 5004, 3, 169, 0, -433.7593, 809.1063, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+180, 202742, 643, 5004, 5004, 3, 169, 0, -244.1751, 805.7748, 260.2285, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+181, 202742, 643, 5004, 5004, 3, 169, 0, -382.1367, 808.9256, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+182, 202742, 643, 5004, 5004, 3, 169, 0, -371.249, 818.6626, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+183, 202742, 643, 5004, 5004, 3, 169, 0, -581.4739, 784.1632, 245.3917, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+184, 202742, 643, 5004, 5004, 3, 169, 0, -272.7153, 807.8299, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+185, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+186, 202742, 643, 5004, 5004, 3, 169, 0, -609.2257, 790.7344, 245.3671, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+187, 202742, 643, 5004, 5004, 3, 169, 0, -548.1771, 807.5104, 246.4562, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+188, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+189, 202742, 643, 5004, 5004, 3, 169, 0, -479.9549, 803.1893, 253.4132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+190, 202742, 643, 5004, 5004, 3, 169, 0, -468.1788, 815.2173, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+191, 202742, 643, 5004, 5004, 3, 169, 0, -617.4396, 819.5039, 246.8475, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+192, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+193, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+194, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+195, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+196, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+197, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+198, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+199, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+200, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+201, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+202, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+203, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+204, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+205, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+206, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+207, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+208, 205542, 643, 5004, 5004, 3, 169, 0, 54.11389, 802.0451, 805.761, 3.188875, 0, 0, -0.9997206, 0.02363881, 7200, 255, 1, 26365), -- Doodad_Abyssal_Coral_Chunk_Ceiling01_Break01 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+209, 202742, 643, 5004, 5004, 3, 169, 0, 23.34144, 822.1941, 807.1287, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+210, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+211, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+212, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+213, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+214, 202742, 643, 5004, 5004, 3, 169, 0, 67.83644, 808.8594, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+215, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+216, 202742, 643, 5004, 5004, 3, 169, 0, 152.8295, 807.125, 808.9501, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+217, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+218, 202742, 643, 5004, 5004, 3, 169, 0, 41.15274, 820.7129, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+219, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+220, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+221, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+222, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+223, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+224, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+225, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+226, 202742, 643, 5004, 5004, 3, 169, 0, 122.2837, 821.2411, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+227, 202742, 643, 5004, 5004, 3, 169, 0, 66.71084, 799.9061, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+228, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+229, 202742, 643, 5004, 5004, 3, 169, 0, 42.32461, 810.2007, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+230, 202742, 643, 5004, 5004, 3, 169, 0, 55.99442, 852.5627, 806.6016, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+231, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+232, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+233, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+234, 202742, 643, 5004, 5004, 3, 169, 0, 139.0025, 808.6485, 808.9529, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+235, 202742, 643, 5004, 5004, 3, 169, 0, 128.2726, 802.2448, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+236, 202742, 643, 5004, 5004, 3, 169, 0, 34.18035, 802.2026, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+237, 202742, 643, 5004, 5004, 3, 169, 0, 185.5, 823.4261, 808.7596, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+238, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+239, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+240, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+241, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+242, 202742, 643, 5004, 5004, 3, 169, 0, 54.4508, 786.307, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+243, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+244, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+245, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+246, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+247, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+248, 202742, 643, 5004, 5004, 3, 169, 0, 46.77086, 807.3769, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+249, 202742, 643, 5004, 5004, 3, 169, 0, 3.151752, 806.9824, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+250, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+251, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+252, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+253, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+254, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+255, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+256, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+257, 202742, 643, 5004, 5004, 3, 169, 0, -361.9618, 808.1545, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+258, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+259, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+260, 202742, 643, 5004, 5004, 3, 169, 0, -293.2812, 815.7661, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+261, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+262, 202742, 643, 5004, 5004, 3, 169, 0, -317.3369, 828.0981, 261.2295, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+263, 202742, 643, 5004, 5004, 3, 169, 0, 228.5578, 802.1016, 808.8599, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+264, 202742, 643, 5004, 5004, 3, 169, 0, -370.3526, 820.8972, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+265, 202742, 643, 5004, 5004, 3, 169, 0, -272.7153, 807.8299, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+266, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+267, 202742, 643, 5004, 5004, 3, 169, 0, -230.1498, 814.9638, 261.888, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+268, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+269, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+270, 202742, 643, 5004, 5004, 3, 169, 0, -289.2099, 804.3326, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+271, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+272, 202742, 643, 5004, 5004, 3, 169, 0, -225.7609, 791.6033, 261.6887, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+273, 202742, 643, 5004, 5004, 3, 169, 0, 229.2187, 751.057, 808.4615, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+274, 202742, 643, 5004, 5004, 3, 169, 0, -305.6156, 802.5328, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+275, 202742, 643, 5004, 5004, 3, 169, 0, -332.5158, 814.4702, 260.7189, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+276, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+277, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+278, 202742, 643, 5004, 5004, 3, 169, 0, -361.9618, 808.1545, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+279, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+280, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+281, 202742, 643, 5004, 5004, 3, 169, 0, -431.4555, 796.5049, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+282, 202742, 643, 5004, 5004, 3, 169, 0, -468.8807, 818.1053, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+283, 202742, 643, 5004, 5004, 3, 169, 0, 27.38033, 819.5683, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+284, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+285, 202742, 643, 5004, 5004, 3, 169, 0, 25.24629, 805.5485, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+286, 202742, 643, 5004, 5004, 3, 169, 0, 33.70946, 772.0159, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+287, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+288, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+289, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+290, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+291, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+292, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+293, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+294, 202742, 643, 5004, 5004, 3, 169, 0, 128.2726, 802.2448, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+295, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+296, 202742, 643, 5004, 5004, 3, 169, 0, 163.3956, 826.3505, 808.8995, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+297, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+298, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+299, 202742, 643, 5004, 5004, 3, 169, 0, 49.03465, 764.1146, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+300, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+301, 202742, 643, 5004, 5004, 3, 169, 0, 40.07397, 810.2864, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+302, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+303, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+304, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+305, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+306, 202742, 643, 5004, 5004, 3, 169, 0, 49.85577, 783.4945, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+307, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+308, 202742, 643, 5004, 5004, 3, 169, 0, 117.859, 806.287, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+309, 202742, 643, 5004, 5004, 3, 169, 0, 71.9766, 790.4659, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+310, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+311, 202742, 643, 5004, 5004, 3, 169, 0, 56.07465, 822.0661, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+312, 202742, 643, 5004, 5004, 3, 169, 0, 187.6993, 818.705, 808.8981, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+313, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+314, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+315, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+316, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+317, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+318, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+319, 202742, 643, 5004, 5004, 3, 169, 0, 36.25398, 805.0674, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+320, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+321, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+322, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+323, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+324, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+325, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+326, 202742, 643, 5004, 5004, 3, 169, 0, -300.9183, 806.5731, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+327, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+328, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+329, 202742, 643, 5004, 5004, 3, 169, 0, -256.5955, 808.0364, 259.165, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+330, 202742, 643, 5004, 5004, 3, 169, 0, -256.5955, 808.0364, 259.165, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+331, 202742, 643, 5004, 5004, 3, 169, 0, -299.0084, 846.2816, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+332, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+333, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+334, 202742, 643, 5004, 5004, 3, 169, 0, -309.8387, 789.3887, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+335, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+336, 202742, 643, 5004, 5004, 3, 169, 0, 236.8778, 835.5942, 808.5815, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+337, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+338, 202742, 643, 5004, 5004, 3, 169, 0, 219.9689, 785.3399, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+339, 202742, 643, 5004, 5004, 3, 169, 0, -272.7153, 807.8299, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+340, 202742, 643, 5004, 5004, 3, 169, 0, 219.8616, 745.4353, 808.9315, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+341, 202742, 643, 5004, 5004, 3, 169, 0, -373.566, 817.3975, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+342, 202742, 643, 5004, 5004, 3, 169, 0, -272.7153, 807.8299, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+343, 202742, 643, 5004, 5004, 3, 169, 0, -342.7049, 809.5555, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+344, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+345, 202742, 643, 5004, 5004, 3, 169, 0, -385.505, 803.7447, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+346, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+347, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+348, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+349, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+350, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+351, 202742, 643, 5004, 5004, 3, 169, 0, -423.7201, 799.1238, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+352, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+353, 202742, 643, 5004, 5004, 3, 169, 0, -387.2965, 814.9402, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+354, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+355, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+356, 203199, 643, 5004, 5004, 3, 169, 0, 118.4531, 798.9879, 809.069, 2.809975, 0, 0, 0.9862852, 0.1650499, 7200, 255, 0, 26365), -- Throne of Tides Defense System (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+357, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+358, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+359, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+360, 202742, 643, 5004, 5004, 3, 169, 0, 138.1355, 836.0701, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+361, 202742, 643, 5004, 5004, 3, 169, 0, 50.11511, 799.2448, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+362, 202742, 643, 5004, 5004, 3, 169, 0, 25.7226, 783.4463, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+363, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+364, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+365, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+366, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+367, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+368, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+369, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+370, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+371, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+372, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+373, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+374, 202742, 643, 5004, 5004, 3, 169, 0, 235.4976, 851.8138, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+375, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+376, 202742, 643, 5004, 5004, 3, 169, 0, 24.27828, 790.6388, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+377, 202742, 643, 5004, 5004, 3, 169, 0, 173.4377, 797.7512, 808.8982, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+378, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+379, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+380, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+381, 202742, 643, 5004, 5004, 3, 169, 0, 44.30289, 795.4138, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+382, 202742, 643, 5004, 5004, 3, 169, 0, -183.9505, 793.7863, 798.3094, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+383, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+384, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+385, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+386, 202742, 643, 5004, 5004, 3, 169, 0, 81.32465, 790.5443, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+387, 202742, 643, 5004, 5004, 3, 169, 0, 66.25199, 808.4076, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+388, 202742, 643, 5004, 5004, 3, 169, 0, 19.75219, 794.9404, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+389, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+390, 202742, 643, 5004, 5004, 3, 169, 0, 37.84798, 809.5364, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+391, 202742, 643, 5004, 5004, 3, 169, 0, 204.5055, 822.8646, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+392, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+393, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+394, 202742, 643, 5004, 5004, 3, 169, 0, 184.8169, 818.9229, 808.8981, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+395, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+396, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+397, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+398, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+399, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+400, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+401, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+402, 202742, 643, 5004, 5004, 3, 169, 0, 164.3785, 810.9473, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+403, 202742, 643, 5004, 5004, 3, 169, 0, 121.7077, 823.9096, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+404, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+405, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+406, 202742, 643, 5004, 5004, 3, 169, 0, -161.0122, 800.5391, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+407, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+408, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+409, 202742, 643, 5004, 5004, 3, 169, 0, 60.86016, 826.0198, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+410, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+411, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+412, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+413, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+414, 202742, 643, 5004, 5004, 3, 169, 0, 30.94499, 775.5549, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+415, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+416, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+417, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+418, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+419, 202742, 643, 5004, 5004, 3, 169, 0, 18.81054, 811.6598, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+420, 202742, 643, 5004, 5004, 3, 169, 0, -161.798, 806.3669, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+421, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+422, 202742, 643, 5004, 5004, 3, 169, 0, 37.51942, 808.0055, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+423, 202742, 643, 5004, 5004, 3, 169, 0, 32.40952, 816.1072, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+424, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+425, 202742, 643, 5004, 5004, 3, 169, 0, 48.45687, 833.707, 806.847, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+426, 202742, 643, 5004, 5004, 3, 169, 0, 101.3276, 803.9319, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+427, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+428, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+429, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+430, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+431, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+432, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+433, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+434, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+435, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+436, 202742, 643, 5004, 5004, 3, 169, 0, 56.23428, 852.5358, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+437, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+438, 202742, 643, 5004, 5004, 3, 169, 0, 220.2995, 784.8843, 808.6176, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+439, 202742, 643, 5004, 5004, 3, 169, 0, 204.1316, 789.7789, 808.8981, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+440, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+441, 202742, 643, 5004, 5004, 3, 169, 0, -154.8054, 807.1638, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+442, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+443, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+444, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+445, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+446, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+447, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+448, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+449, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+450, 202742, 643, 5004, 5004, 3, 169, 0, 95.39789, 807.9736, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+451, 202742, 643, 5004, 5004, 3, 169, 0, 49.11228, 810.8226, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+452, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+453, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+454, 202742, 643, 5004, 5004, 3, 169, 0, 53.19302, 825.8992, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+455, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+456, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+457, 202742, 643, 5004, 5004, 3, 169, 0, 45.14339, 798.1777, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+458, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+459, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+460, 202742, 643, 5004, 5004, 3, 169, 0, 252.7033, 837.0171, 808.6521, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+461, 202742, 643, 5004, 5004, 3, 169, 0, -233.4787, 794.2557, 261.3294, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+462, 202742, 643, 5004, 5004, 3, 169, 0, -232.4247, 817.0153, 261.5318, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+463, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+464, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+465, 202742, 643, 5004, 5004, 3, 169, 0, 15.64157, 794.6729, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+466, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+467, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+468, 202742, 643, 5004, 5004, 3, 169, 0, 163.592, 810.28, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+469, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+470, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+471, 202742, 643, 5004, 5004, 3, 169, 0, 70.80521, 825.8344, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+472, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+473, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+474, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+475, 202742, 643, 5004, 5004, 3, 169, 0, 134.3909, 783.0038, 808.9399, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+476, 202742, 643, 5004, 5004, 3, 169, 0, 224.4486, 868.4969, 808.9075, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+477, 202742, 643, 5004, 5004, 3, 169, 0, 35.29088, 789.2382, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+478, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+479, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+480, 202742, 643, 5004, 5004, 3, 169, 0, 144.6964, 800.9507, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+481, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+482, 202742, 643, 5004, 5004, 3, 169, 0, -144.5155, 802.4929, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+483, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+484, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+485, 202742, 643, 5004, 5004, 3, 169, 0, 63.66795, 812.6854, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+486, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+487, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+488, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+489, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+490, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+491, 202742, 643, 5004, 5004, 3, 169, 0, 176.6737, 798.1036, 808.8982, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+492, 202742, 643, 5004, 5004, 3, 169, 0, 49.45714, 849.3591, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+493, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+494, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+495, 202742, 643, 5004, 5004, 3, 169, 0, 138.7346, 793.4713, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+496, 202742, 643, 5004, 5004, 3, 169, 0, 46.89986, 803.9729, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+497, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+498, 202742, 643, 5004, 5004, 3, 169, 0, 158.7424, 764.696, 808.8522, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+499, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+500, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+501, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+502, 202742, 643, 5004, 5004, 3, 169, 0, 255.0835, 832.9749, 808.9399, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+503, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+504, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+505, 202742, 643, 5004, 5004, 3, 169, 0, 49.91712, 828.2465, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+506, 202742, 643, 5004, 5004, 3, 169, 0, 31.41403, 818.7122, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+507, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+508, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+509, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+510, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+511, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+512, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+513, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+514, 202742, 643, 5004, 5004, 3, 169, 0, -190.7427, 808.0786, 797.972, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+515, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+516, 202742, 643, 5004, 5004, 3, 169, 0, 153.3218, 807.6686, 808.9524, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+517, 202742, 643, 5004, 5004, 3, 169, 0, 41.92853, 810.147, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+518, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+519, 202742, 643, 5004, 5004, 3, 169, 0, 128.2265, 836.8654, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+520, 202742, 643, 5004, 5004, 3, 169, 0, 56.19157, 795.5731, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+521, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+522, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+523, 202742, 643, 5004, 5004, 3, 169, 0, 42.91511, 758.9261, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+524, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+525, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+526, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+527, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+528, 202742, 643, 5004, 5004, 3, 169, 0, 200.0507, 774.572, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+529, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+530, 202742, 643, 5004, 5004, 3, 169, 0, 173.7833, 813.332, 808.8981, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+531, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+532, 202742, 643, 5004, 5004, 3, 169, 0, 57.879, 835.134, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+533, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+534, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+535, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+536, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+537, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+538, 202742, 643, 5004, 5004, 3, 169, 0, 223.379, 772.0664, 808.9438, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+539, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+540, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+541, 202742, 643, 5004, 5004, 3, 169, 0, 76.34039, 802.842, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+542, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+543, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+544, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+545, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+546, 202742, 643, 5004, 5004, 3, 169, 0, 219.2139, 781.1704, 808.7433, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+547, 202742, 643, 5004, 5004, 3, 169, 0, 43.30576, 817.2437, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+548, 202742, 643, 5004, 5004, 3, 169, 0, 122.7969, 782.9244, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+549, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+550, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+551, 202742, 643, 5004, 5004, 3, 169, 0, -141.0634, 803.2926, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+552, 202742, 643, 5004, 5004, 3, 169, 0, 27.23885, 815.9766, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+553, 202742, 643, 5004, 5004, 3, 169, 0, 154.2409, 750.1065, 808.4761, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+554, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+555, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+556, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+557, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+558, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+559, 202742, 643, 5004, 5004, 3, 169, 0, 43.41222, 811.1862, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+560, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+561, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+562, 202742, 643, 5004, 5004, 3, 169, 0, 175.644, 815.9926, 808.8981, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+563, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+564, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+565, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+566, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+567, 202742, 643, 5004, 5004, 3, 169, 0, 133.4906, 785.5891, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+568, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+569, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+570, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+571, 202742, 643, 5004, 5004, 3, 169, 0, 226.2346, 743.9595, 808.7316, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+572, 202742, 643, 5004, 5004, 3, 169, 0, -141.6026, 793.4182, 797.7479, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+573, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+574, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+575, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+576, 202742, 643, 5004, 5004, 3, 169, 0, 242.5083, 840.6996, 808.42, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+577, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+578, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+579, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+580, 202742, 643, 5004, 5004, 3, 169, 0, 45.76748, 797.5413, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+581, 202742, 643, 5004, 5004, 3, 169, 0, 32.84404, 783.896, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+582, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+583, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+584, 202742, 643, 5004, 5004, 3, 169, 0, 35.69193, 797.364, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+585, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+586, 202742, 643, 5004, 5004, 3, 169, 0, 23.14739, 782.2534, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+587, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+588, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+589, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+590, 202742, 643, 5004, 5004, 3, 169, 0, 76.97551, 816.9681, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+591, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+592, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+593, 202742, 643, 5004, 5004, 3, 169, 0, 38.81, 808.1566, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+594, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+595, 202742, 643, 5004, 5004, 3, 169, 0, 58.84452, 792.6604, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+596, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+597, 202742, 643, 5004, 5004, 3, 169, 0, 220.7575, 837.2082, 808.9401, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+598, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+599, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+600, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+601, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+602, 202742, 643, 5004, 5004, 3, 169, 0, 215.1334, 794.4091, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+603, 202742, 643, 5004, 5004, 3, 169, 0, 128.2726, 802.2448, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+604, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+605, 202742, 643, 5004, 5004, 3, 169, 0, 81.4409, 806.8326, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+606, 202742, 643, 5004, 5004, 3, 169, 0, 70.75249, 823.026, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+607, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+608, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+609, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+610, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+611, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+612, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+613, 202742, 643, 5004, 5004, 3, 169, 0, 165.2305, 745.3442, 808.8819, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+614, 202742, 643, 5004, 5004, 3, 169, 0, 188.4053, 781.3583, 808.8981, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+615, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+616, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+617, 202742, 643, 5004, 5004, 3, 169, 0, 9.439528, 795.3918, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+618, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+619, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+620, 202742, 643, 5004, 5004, 3, 169, 0, 44.11723, 793.6713, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+621, 202742, 643, 5004, 5004, 3, 169, 0, 75.23912, 814.7702, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+622, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+623, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+624, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+625, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+626, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+627, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+628, 202742, 643, 5004, 5004, 3, 169, 0, 195.0128, 806.8054, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+629, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+630, 202742, 643, 5004, 5004, 3, 169, 0, 58.63293, 785.918, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+631, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+632, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+633, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+634, 202742, 643, 5004, 5004, 3, 169, 0, 128.2726, 802.2448, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+635, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+636, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+637, 202742, 643, 5004, 5004, 3, 169, 0, 48.32239, 803.2721, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+638, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+639, 202742, 643, 5004, 5004, 3, 169, 0, 200.4377, 826.8185, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+640, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+641, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+642, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+643, 202742, 643, 5004, 5004, 3, 169, 0, 234.6348, 750.9623, 808.2863, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+644, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+645, 202742, 643, 5004, 5004, 3, 169, 0, 200.4481, 773.2861, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+646, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+647, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+648, 202742, 643, 5004, 5004, 3, 169, 0, 132.0989, 774.636, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+649, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+650, 202742, 643, 5004, 5004, 3, 169, 0, 40.17184, 834.3758, 806.847, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+651, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+652, 202742, 643, 5004, 5004, 3, 169, 0, 37.45625, 803.8706, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+653, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+654, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+655, 202742, 643, 5004, 5004, 3, 169, 0, 39.93117, 791.3494, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+656, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+657, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+658, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+659, 202742, 643, 5004, 5004, 3, 169, 0, -151.5696, 811.7796, 797.6751, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+660, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+661, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+662, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+663, 202742, 643, 5004, 5004, 3, 169, 0, 42.51493, 804.5654, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+664, 202742, 643, 5004, 5004, 3, 169, 0, 40.60753, 805.2148, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+665, 202742, 643, 5004, 5004, 3, 169, 0, 223.5058, 835.8316, 808.9401, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+666, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+667, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+668, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+669, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+670, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+671, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+672, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+673, 202742, 643, 5004, 5004, 3, 169, 0, 46.42083, 790.2306, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+674, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+675, 202742, 643, 5004, 5004, 3, 169, 0, 35.415, 793.2467, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+676, 202742, 643, 5004, 5004, 3, 169, 0, 209.2919, 796.3069, 808.8981, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+677, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+678, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+679, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+680, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+681, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+682, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+683, 202742, 643, 5004, 5004, 3, 169, 0, 165.2075, 752.0398, 808.8794, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+684, 202742, 643, 5004, 5004, 3, 169, 0, 128.2726, 802.2448, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+685, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+686, 202742, 643, 5004, 5004, 3, 169, 0, -147.9583, 807.6516, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+687, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+688, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+689, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+690, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+691, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+692, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+693, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+694, 202742, 643, 5004, 5004, 3, 169, 0, 66.62801, 836.2322, 807.0526, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+695, 202742, 643, 5004, 5004, 3, 169, 0, 34.39502, 773.1477, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+696, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+697, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+698, 202742, 643, 5004, 5004, 3, 169, 0, 28.35011, 780.5449, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+699, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+700, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+701, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+702, 202742, 643, 5004, 5004, 3, 169, 0, 39.4081, 788.0806, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+703, 202742, 643, 5004, 5004, 3, 169, 0, 55.37197, 836.162, 806.848, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+704, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+705, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+706, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+707, 202742, 643, 5004, 5004, 3, 169, 0, -123.85, 802.1953, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+708, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+709, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+710, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+711, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+712, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+713, 202742, 643, 5004, 5004, 3, 169, 0, 43.07348, 821.6616, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+714, 202742, 643, 5004, 5004, 3, 169, 0, 128.2726, 802.2448, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+715, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+716, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+717, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+718, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+719, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+720, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+721, 202742, 643, 5004, 5004, 3, 169, 0, 91.35651, 792.2914, 807.1234, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+722, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+723, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+724, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+725, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+726, 202742, 643, 5004, 5004, 3, 169, 0, 128.2726, 802.2448, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+727, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+728, 202742, 643, 5004, 5004, 3, 169, 0, 235.7025, 831.2547, 808.7969, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+729, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+730, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+731, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+732, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+733, 202742, 643, 5004, 5004, 3, 169, 0, 61.52082, 805.3383, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+734, 202742, 643, 5004, 5004, 3, 169, 0, 34.08147, 821.5872, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+735, 202742, 643, 5004, 5004, 3, 169, 0, 41.34742, 768.7258, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+736, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+737, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+738, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+739, 202742, 643, 5004, 5004, 3, 169, 0, 171.5869, 808.459, 808.8981, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+740, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+741, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+742, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+743, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+744, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+745, 202742, 643, 5004, 5004, 3, 169, 0, 74.49322, 827.2534, 807.1271, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+746, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+747, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+748, 202742, 643, 5004, 5004, 3, 169, 0, -166.5038, 801.6523, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+749, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+750, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+751, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+752, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+753, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+754, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+755, 202742, 643, 5004, 5004, 3, 169, 0, 157.9003, 807.3672, 808.6937, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+756, 202742, 643, 5004, 5004, 3, 169, 0, 31.56881, 779.1186, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+757, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+758, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+759, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+760, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+761, 202742, 643, 5004, 5004, 3, 169, 0, 50.75718, 822.6475, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+762, 202742, 643, 5004, 5004, 3, 169, 0, 196.4739, 808.0817, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+763, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+764, 202742, 643, 5004, 5004, 3, 169, 0, 34.17076, 800.0736, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+765, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+766, 202742, 643, 5004, 5004, 3, 169, 0, 221.8779, 757.4844, 808.7989, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+767, 202742, 643, 5004, 5004, 3, 169, 0, 217.8538, 830.1664, 808.9406, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+768, 202742, 643, 5004, 5004, 3, 169, 0, -152.0358, 802.0839, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+769, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+770, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+771, 202742, 643, 5004, 5004, 3, 169, 0, 36.89356, 834.9725, 807.1595, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+772, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+773, 202742, 643, 5004, 5004, 3, 169, 0, 128.2726, 802.2448, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+774, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+775, 205216, 643, 5004, 5004, 3, 169, 0, -157.986, 982.238, 229.131, 2.984498, 0, 0, 0.9969168, 0.07846643, 7200, 255, 1, 26365), -- Neptulon's Cache (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+776, 204964, 643, 5004, 5004, 3, 169, 0, -647.283, 806.7465, 249.3488, 0, 0, 0, 0, 1, 7200, 255, 1, 26365); -- Instance Portal (Party + Heroic) (Area: Throne of the Tides - Difficulty: 2) + + +DELETE FROM `gameobject_addon` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+775; +INSERT INTO `gameobject_addon` (`guid`, `parent_rotation0`, `parent_rotation1`, `parent_rotation2`, `parent_rotation3`) VALUES +(@OGUID+1, 0, 0, 1, -0.00000004371139), -- Doodad_WG_Invisible_Door02 +(@OGUID+2, 0, 0, 1, -0.00000004371139), -- Doodad_Abyssal_Leviathan_Tentacle_fromBelow01 +(@OGUID+3, 0, 0, 1, -0.00000004371139), -- Doodad_Abyssal_Leviathan_Tentacle01 +(@OGUID+4, 0, 0, 1, -0.00000004371139), -- Doodad_WG_Invisible_Door01 +(@OGUID+5, 0, 0, 1, -0.00000004371139), -- Doodad_Abyssal_Maw_Door_04 +(@OGUID+6, 0, 0, 1, -0.00000004371139), -- Doodad_Abyssal_Maw_Door_03 +(@OGUID+7, 0, 0, 1, -0.00000004371139), -- 0 +(@OGUID+8, 0, 0, 1, -0.00000004371139), -- Doodad_Abyssal_Maw_Door_02 +(@OGUID+9, 0, 0, 1, -0.00000004371139), -- Doodad_Abyssal_Maw_Door_01 +(@OGUID+208, 0, 0, 1, -0.00000004371139); -- Doodad_Abyssal_Coral_Chunk_Ceiling01_Break01 + +DELETE FROM `creature_template_addon` WHERE `entry` IN (44752 /*44752 (Faceless Sapper)*/, 44566 /*44566 (Ozumat) - Ozumat Globe Impact Periodic*/, 44950 /*44950 (Unyielding Behemoth (Hand Visual)) - Ride Vehicle Hardcoded, Shrink*/, 44864 /*44864 (Ozumat Combat Trigger)*/, 92870 /*92870 (Sindragosa's Fury)*/, 40765 /*40765 (Commander Ulthok) - Ulthok Intro Visual State*/, 40925 /*40925 (Tainted Sentry) - Summon Unstable Corruptions*/, 40923 /*40923 (Unstable Corruption) - Unstable Corruption Growth*/, 40943 /*40943 (Gilgoblin Aquamage)*/, 40792 /*40792 (Neptulon) - Purify*/, 40936 /*40936 (Faceless Watcher) - Void Rip*/, 40935 /*40935 (Gilgoblin Hunter)*/, 40633 /*40633 (Naz'jar Honor Guard) - Water Window Break Visual*/, 44404 /*44404 (Naz'jar Tempest Witch) - Water Window Break Visual*/, 40586 /*40586 (Lady Naz'jar) - Waterspout*/, 41139 /*41139 (Naz'jar Spiritmender) - Water Window Jump Through Visual*/, 40584 /*40584 (Naz'jar Invader) - Water Window Jump Through Visual*/, 40634 /*40634 (Naz'jar Tempest Witch)*/, 51395 /*51395 (Throne of Tides Teleporter) - Teleporter Active Visual*/, 40579 /*40579 (Deep Murloc Hunter)*/, 39959 /*39959 (Lady Naz'jar)*/, 39960 /*39960 (Deep Murloc Drudge)*/, 44656 /*44656 (Ozumat Add Spawner)*/, 41096 /*41096 (Naz'jar Spiritmender) - Water Window Jump Through Visual*/, 39616 /*39616 (Naz'jar Invader) - Water Window Jump Through Visual*/, 40825 /*40825 (Erunak Stonespeaker) - Enslave*/, 40788 /*40788 (Mindbender Ghur'sha) - Unrelenting Agony*/, 40577 /*40577 (Naz'jar Sentinel)*/, 50270 /*50270 (Captain Taylor)*/, 45030 /*45030 (Ozumat Vehicle, Big)*/, 40655 /*40655 (Ozumat)*/, 48983 /*48983 (Geyser) - Geyser*/, 44581 /*44581 (Ozumat Vehicle)*/, 45672 /*45672 (Naz'jar Soldier)*/, 51391 /*51391 (Throne of Tides Teleporter) - Teleporter Base Visual*/, 45620 /*45620 (Naz'jar Soldier)*/, 45621 /*45621 (Elemental Guard) - Water Bolt*/, 50278 /*50278 (Naz'jar Invader) - Permanent Feign Death*/, 50276 /*50276 (Naz'jar Spiritmender) - Permanent Feign Death*/); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(44752, 0, 0, 0, 1, 0, ''), -- 44752 (Faceless Sapper) +(44566, 0, 0, 50331648, 1, 0, '83126'), -- 44566 (Ozumat) - Ozumat Globe Impact Periodic +(44950, 0, 0, 50331648, 1, 0, '83976'), -- 44950 (Unyielding Behemoth (Hand Visual)) - Ride Vehicle Hardcoded, Shrink +(44864, 0, 0, 0, 1, 0, ''), -- 44864 (Ozumat Combat Trigger) +-- (92870, 0, 0, 50331648, 1, 0, ''), -- 92870 (Sindragosa's Fury) +(40765, 0, 0, 0, 1, 0, '76017'), -- 40765 (Commander Ulthok) - Ulthok Intro Visual State +(40925, 0, 0, 0, 1, 0, '76625'), -- 40925 (Tainted Sentry) - Summon Unstable Corruptions +(40923, 0, 0, 0, 1, 0, '76362'), -- 40923 (Unstable Corruption) - Unstable Corruption Growth +(40943, 0, 0, 0, 1, 0, ''), -- 40943 (Gilgoblin Aquamage) +(40792, 0, 0, 0, 1, 0, '76952'), -- 40792 (Neptulon) - Purify +(40936, 0, 0, 0, 1, 0, '76604'), -- 40936 (Faceless Watcher) - Void Rip +(40935, 0, 0, 0, 1, 0, ''), -- 40935 (Gilgoblin Hunter) +(40633, 0, 0, 50331648, 1, 0, '75808'), -- 40633 (Naz'jar Honor Guard) - Water Window Break Visual +(44404, 0, 0, 0, 1, 0, '75808'), -- 44404 (Naz'jar Tempest Witch) - Water Window Break Visual +(40586, 0, 0, 0, 1, 0, '90495'), -- 40586 (Lady Naz'jar) - Waterspout +(41139, 0, 0, 0, 1, 0, '74048'), -- 41139 (Naz'jar Spiritmender) - Water Window Jump Through Visual +(40584, 0, 0, 50331648, 1, 0, '74048'), -- 40584 (Naz'jar Invader) - Water Window Jump Through Visual +(40634, 0, 0, 0, 1, 0, ''), -- 40634 (Naz'jar Tempest Witch) +(51395, 0, 0, 50331648, 1, 0, '95296'), -- 51395 (Throne of Tides Teleporter) - Teleporter Active Visual +(40579, 0, 0, 0, 1, 0, ''), -- 40579 (Deep Murloc Hunter) +(39959, 0, 0, 0, 1, 0, ''), -- 39959 (Lady Naz'jar) +(39960, 0, 0, 0, 1, 0, ''), -- 39960 (Deep Murloc Drudge) +(44656, 0, 0, 0, 1, 0, ''), -- 44656 (Ozumat Add Spawner) +(41096, 0, 0, 50331648, 1, 0, '74048'), -- 41096 (Naz'jar Spiritmender) - Water Window Jump Through Visual +(39616, 0, 0, 50331648, 1, 0, '74048'), -- 39616 (Naz'jar Invader) - Water Window Jump Through Visual +(40825, 0, 0, 0, 1, 0, '76616'), -- 40825 (Erunak Stonespeaker) - Enslave +(40788, 0, 0, 0, 1, 0, '76339'), -- 40788 (Mindbender Ghur'sha) - Unrelenting Agony +(40577, 0, 0, 0, 1, 0, ''), -- 40577 (Naz'jar Sentinel) +(50270, 0, 0, 0, 1, 0, ''), -- 50270 (Captain Taylor) +(45030, 0, 0, 50331648, 1, 0, ''), -- 45030 (Ozumat Vehicle, Big) +(40655, 0, 0, 50331648, 1, 0, ''), -- 40655 (Ozumat) +(48983, 0, 0, 0, 1, 0, '91347'), -- 48983 (Geyser) - Geyser +(44581, 0, 0, 50331648, 1, 0, ''), -- 44581 (Ozumat Vehicle) +(45672, 0, 0, 50331648, 1, 0, ''), -- 45672 (Naz'jar Soldier) +(51391, 0, 0, 50331648, 1, 0, '95293'), -- 51391 (Throne of Tides Teleporter) - Teleporter Base Visual +(45620, 0, 0, 50331648, 1, 0, ''), -- 45620 (Naz'jar Soldier) +(45621, 0, 0, 50331648, 1, 0, '85211'), -- 45621 (Elemental Guard) - Water Bolt +(50278, 0, 0, 0, 1, 0, '29266'), -- 50278 (Naz'jar Invader) - Permanent Feign Death +(50276, 0, 0, 0, 1, 0, '29266'); -- 50276 (Naz'jar Spiritmender) - Permanent Feign Death + +UPDATE `creature_template_addon` SET `auras`='' WHERE `entry`=21252; -- 21252 (World Trigger (Not Immune PC)) +UPDATE `creature_template_addon` SET `auras`='' WHERE `entry`=22517; -- 22517 (World Trigger (Large AOI)) +UPDATE `creature_template_addon` SET `auras`='' WHERE `entry`=36171; -- 36171 (World Trigger (Infinite AOI)) + +UPDATE `creature_model_info` SET `BoundingRadius`=1.525103 WHERE `DisplayID`=32708; +UPDATE `creature_model_info` SET `BoundingRadius`=4.129169 WHERE `DisplayID`=33792; +UPDATE `creature_model_info` SET `BoundingRadius`=1.355182 WHERE `DisplayID`=33846; +UPDATE `creature_model_info` SET `BoundingRadius`=0.05212237, `CombatReach`=0.05 WHERE `DisplayID`=33845; +UPDATE `creature_model_info` SET `BoundingRadius`=2.752779 WHERE `DisplayID`=31674; +UPDATE `creature_model_info` SET `BoundingRadius`=0.8949282 WHERE `DisplayID`=37388; +UPDATE `creature_model_info` SET `BoundingRadius`=0.9946799, `CombatReach`=1 WHERE `DisplayID`=30408; +UPDATE `creature_model_info` SET `BoundingRadius`=1.649186 WHERE `DisplayID`=37386; +UPDATE `creature_model_info` SET `BoundingRadius`=1.198815 WHERE `DisplayID`=32578; +UPDATE `creature_model_info` SET `BoundingRadius`=1.649186 WHERE `DisplayID`=37370; +UPDATE `creature_model_info` SET `BoundingRadius`=0.8949282 WHERE `DisplayID`=37387; +UPDATE `creature_model_info` SET `BoundingRadius`=0.3 WHERE `DisplayID`=16925; + +DELETE FROM `gossip_menu` WHERE (`MenuId`=12568 AND `TextId`=17676); +INSERT INTO `gossip_menu` (`MenuId`, `TextId`) VALUES +(12568, 17676); -- 50270 (Captain Taylor) + +DELETE FROM `gossip_menu_option` WHERE (`MenuId`=11469 AND `OptionID`=0); +INSERT INTO `gossip_menu_option` (`MenuId`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextId`) VALUES +(11469, 0, 0, 'We are ready!', 41133); + +DELETE FROM `creature_text` WHERE `CreatureID` IN (39959,40586,40765,40788,40792,40825); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `comment`) VALUES +(39959, 0, 0, 'Armies of the depths, wash over our enemies as a tide of death!', 14, 0, 100, 0, 0, 18890, 50510, 'Lady Naz''jar to Player'), +(39959, 1, 0, 'Meddlesome gnats! You think us defeated so easily?', 14, 0, 100, 0, 0, 18891, 43121, 'Lady Naz''jar to Player'), +(40586, 0, 0, 'You have interfered with our plans for the last time, mortals!', 14, 0, 100, 0, 0, 18886, 50505, 'Lady Naz''jar to Player'), +(40586, 1, 0, 'Take arms, minions! Rise from the icy depths!', 14, 0, 100, 0, 0, 18892, 50513, 'Lady Naz''jar'), +(40586, 2, 0, 'Destroy these intruders! Leave them for the great dark beyond!', 14, 0, 100, 0, 0, 18893, 50514, 'Lady Naz''jar'), +(40586, 3, 0, 'Ulthok, stop them...', 14, 0, 100, 0, 0, 18889, 50509, 'Lady Naz''jar to Player'), +(40765, 0, 0, 'Iilth vwah, uhn''agth fhssh za.', 14, 0, 100, 0, 0, 18543, 50522, 'Commander Ulthok to Player'), +(40765, 1, 0, 'Where one falls, many shall take its place...', 15, 0, 100, 0, 0, 18543, 50523, 'Commander Ulthok to Player'), +(40765, 2, 0, 'Ywaq maq oou.', 14, 0, 100, 0, 0, 18542, 50529, 'Commander Ulthok to Player'), +(40788, 0, 0, 'A new host must be found.', 14, 0, 100, 0, 0, 18860, 50534, 'Mindbender Ghur''sha to Erunak Stonespeaker'), +(40788, 1, 0, 'Is. This. Reality?', 14, 0, 100, 0, 0, 18867, 50543, 'Mindbender Ghur''sha'), +(40788, 2, 0, 'They are outside the cycle...', 14, 0, 100, 0, 0, 18863, 50538, 'Mindbender Ghur''sha to Player'), +(40792, 0, 0, 'Ahh - my fearless assistants, I assume.', 14, 0, 100, 0, 0, 19469, 44263, 'Neptulon to Player'), +(40792, 1, 0, 'You may yet regret your presence here.', 14, 0, 100, 0, 0, 19470, 44264, 'Neptulon to Player'), +(40792, 2, 0, 'As I purify these waters, the servants of filth will surely be stirred. Beware!', 14, 0, 100, 0, 0, 19471, 44265, 'Neptulon to Player'), +(40792, 3, 0, 'Patience, guests. The waters are nearly cleansed.', 14, 0, 100, 0, 0, 19475, 44269, 'Neptulon to Player'), +(40792, 4, 0, 'The beast has returned! It must not pollute my waters!', 14, 0, 100, 0, 0, 19476, 44270, 'Neptulon to Player'), +(40792, 5, 0, 'Augh... Their filthiness stains me!', 14, 0, 100, 0, 0, 19472, 44266, 'Neptulon to Player'), +(40792, 6, 0, 'My waters are cleansed! Drink in their power!', 14, 0, 100, 0, 0, 19478, 44272, 'Neptulon to Player'), +(40792, 7, 0, 'Behold the power of pure water!', 14, 0, 100, 0, 0, 19477, 44271, 'Neptulon to Player'), +(40792, 8, 0, 'Ozumat is vulnerable, strike now!', 41, 0, 100, 0, 0, 19477, 50863, 'Neptulon to Player'), +(40825, 0, 0, 'I thank you, my friends. Forgive me. I... I have grown too weak to be of any assistance.', 14, 0, 100, 0, 0, 18662, 50533, 'Erunak Stonespeaker'), +(40825, 1, 0, 'I am... weary. You must carry on without me. I shall take my leave once my strength has returned.', 14, 0, 100, 0, 0, 18664, 50648, 'Erunak Stonespeaker to Player'); + +DELETE FROM `npc_spellclick_spells` WHERE (`npc_entry`=51391 AND `spell_id`=95284) OR (`npc_entry`=51395 AND `spell_id`=95285); +INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES +(51391, 95284, 3, 0), +(51395, 95285, 3, 0); From ae1abb63be02ff8283ea6d3abb2303b833014f28 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Sat, 12 May 2018 13:17:14 +0200 Subject: [PATCH 11/35] Revert "Core/SAI: Fixed crashes when SAI targets pets that use sai if not tamed" This reverts commit 9fd67b7044793c95c68a595c12a529e02409d19b. It's crashing core, it very likely needs to import more commits from 3.3.5a before this can be re-added --- src/server/game/AI/SmartScripts/SmartScript.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 26ec90fdd60..5853c8914ee 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -65,7 +65,7 @@ SmartScript::~SmartScript() bool SmartScript::IsSmart(Creature* c /*= nullptr*/) { bool smart = true; - if (!dynamic_cast(c->AI())) + if (c && c->GetAIName() != "SmartAI") smart = false; if (!me || me->GetAIName() != "SmartAI") @@ -80,7 +80,7 @@ bool SmartScript::IsSmart(Creature* c /*= nullptr*/) bool SmartScript::IsSmartGO(GameObject* g /*= nullptr*/) { bool smart = true; - if (!dynamic_cast(g->AI())) + if (g && g->GetAIName() != "SmartGameObjectAI") smart = false; if (!go || go->GetAIName() != "SmartGameObjectAI") From 98364454ca0dc313c98ef6c17028c78ae3cfe00b Mon Sep 17 00:00:00 2001 From: Aokromes Date: Sat, 12 May 2018 13:23:19 +0200 Subject: [PATCH 12/35] Core/Quest: Fix crash caused by disabled quests Fix crash happening when a disabled quest was added and rewarded (through a GM command). Disabled quests are not validated on startup and they can reference invalid spells. --- src/server/game/Conditions/DisableMgr.cpp | 5 ----- src/server/game/Entities/Player/Player.cpp | 2 +- src/server/scripts/Commands/cs_quest.cpp | 9 ++++++--- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/server/game/Conditions/DisableMgr.cpp b/src/server/game/Conditions/DisableMgr.cpp index 6c56566ed44..9cbf062a63b 100644 --- a/src/server/game/Conditions/DisableMgr.cpp +++ b/src/server/game/Conditions/DisableMgr.cpp @@ -374,11 +374,6 @@ bool IsDisabledFor(DisableType type, uint32 entry, Unit const* unit, uint8 flags } return false; case DISABLE_TYPE_QUEST: - if (!unit) - return true; - if (Player const* player = unit->ToPlayer()) - if (player->IsGameMaster()) - return false; return true; case DISABLE_TYPE_BATTLEGROUND: case DISABLE_TYPE_OUTDOORPVP: diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 56c9eaa3a1f..807ccbbbfa1 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15205,7 +15205,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, // cast spells after mark quest complete (some spells have quest completed state requirements in spell_area data) if (quest->GetRewSpellCast() > 0) { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpellCast()); + SpellInfo const* spellInfo = ASSERT_NOTNULL(sSpellMgr->GetSpellInfo(quest->GetRewSpellCast())); if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !quest->HasFlag(QUEST_FLAGS_PLAYER_CAST_ON_COMPLETE)) { if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID())) diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp index d4bd1d2129d..5f896b1a5c1 100644 --- a/src/server/scripts/Commands/cs_quest.cpp +++ b/src/server/scripts/Commands/cs_quest.cpp @@ -26,6 +26,7 @@ EndScriptData */ #include "Chat.h" #include "DatabaseEnv.h" #include "DBCStores.h" +#include "DisableMgr.h" #include "ObjectMgr.h" #include "Player.h" #include "ReputationMgr.h" @@ -73,7 +74,7 @@ public: Quest const* quest = sObjectMgr->GetQuestTemplate(entry); - if (!quest) + if (!quest || DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, entry, nullptr)) { handler->PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND, entry); handler->SetSentErrorMessage(true); @@ -185,7 +186,8 @@ public: Quest const* quest = sObjectMgr->GetQuestTemplate(entry); // If player doesn't have the quest - if (!quest || player->GetQuestStatus(entry) == QUEST_STATUS_NONE) + if (!quest || player->GetQuestStatus(entry) == QUEST_STATUS_NONE + || DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, entry, nullptr)) { handler->PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND, entry); handler->SetSentErrorMessage(true); @@ -289,7 +291,8 @@ public: Quest const* quest = sObjectMgr->GetQuestTemplate(entry); // If player doesn't have the quest - if (!quest || player->GetQuestStatus(entry) != QUEST_STATUS_COMPLETE) + if (!quest || player->GetQuestStatus(entry) != QUEST_STATUS_COMPLETE + || DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, entry, nullptr)) { handler->PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND, entry); handler->SetSentErrorMessage(true); From a5cad33ba015694e7035d235d77d39ead7113c56 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sat, 5 May 2018 19:46:45 +0200 Subject: [PATCH 13/35] Scripts/Icecrown Citadel: Fix "intended" crash Change an assert (that can happen easily using ".npc add") to a sanity check --- .../Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index c372c16446f..460b458bf44 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -997,7 +997,8 @@ class npc_saurfang_event : public CreatureScript void SetData(uint32 type, uint32 data) override { - ASSERT(!type && data && data < 6); + if (!(!type && data && data < 6)) + return; _index = data; } From 12dec8cd713fde7a2a967ee9a93cb0c17acc44ee Mon Sep 17 00:00:00 2001 From: ZenoX92 Date: Tue, 8 May 2018 02:06:52 +0200 Subject: [PATCH 14/35] DB/Gossip: Gaeriyan Closes #21909 --- .../world/3.3.5/2018_05_08_00_world_335.sql | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 sql/updates/world/3.3.5/2018_05_08_00_world_335.sql diff --git a/sql/updates/world/3.3.5/2018_05_08_00_world_335.sql b/sql/updates/world/3.3.5/2018_05_08_00_world_335.sql new file mode 100644 index 00000000000..48cd894b635 --- /dev/null +++ b/sql/updates/world/3.3.5/2018_05_08_00_world_335.sql @@ -0,0 +1,17 @@ +-- +-- Gaeriyan --> Fix Gossip Texts +DELETE FROM `gossip_menu` WHERE `MenuID`=1914 AND `TextID` IN (2567,2569); +INSERT INTO `gossip_menu` (`MenuID`, `TextID`, `VerifiedBuild`) VALUES +(1914,2567,0), +(1914,2569,0); + +DELETE FROM `npc_text` WHERE `ID`=2569; +INSERT INTO `npc_text` (`ID`, `text0_0`, `text0_1`, `BroadcastTextID0`, `lang0`, `Probability0`, `em0_1`) VALUES +(2569,"I have given you all the knowledge I have, $n. May luck be with you.","",4826,0,1,0); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=1914; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(14,1914,2567,0,0,14,0,3912,0,0,0,0,0,"","Show gossip text 2567 if quest 'Meet at the Grave' is not taken"), +(14,1914,2568,0,0,14,0,3912,0,0,1,0,0,"","Show gossip text 2568 if quest 'Meet at the Grave' is taken"), +(14,1914,2568,0,0,14,0,3913,0,0,0,0,0,"","Show gossip text 2568 if quest 'A Grave Situation' is not taken"), +(14,1914,2569,0,0,14,0,3913,0,0,1,0,0,"","Show gossip text 2569 if quest 'A Grave Situation' is taken"); From 136977657d64229b13b57e9c154d4a3d1791c492 Mon Sep 17 00:00:00 2001 From: ZenoX92 Date: Tue, 8 May 2018 02:07:33 +0200 Subject: [PATCH 15/35] DB/Quest: The Videre Elixir Closes #21910 --- .../world/3.3.5/2018_05_08_01_world_335.sql | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 sql/updates/world/3.3.5/2018_05_08_01_world_335.sql diff --git a/sql/updates/world/3.3.5/2018_05_08_01_world_335.sql b/sql/updates/world/3.3.5/2018_05_08_01_world_335.sql new file mode 100644 index 00000000000..6b780a9c1a7 --- /dev/null +++ b/sql/updates/world/3.3.5/2018_05_08_01_world_335.sql @@ -0,0 +1,35 @@ +-- Quest "The Videre Elixir" +-- Miblon's Bait +UPDATE `gameobject_template` SET `AIName`="SmartGameObjectAI" WHERE `entry`=164758; +DELETE FROM `smart_scripts` WHERE `entryorguid`=164758 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 +(164758,1,0,0,1,0,100,1,0,0,0,1000,45,1,1,0,0,0,0,19,9467,50,0,0,0,0,0,"Miblon's Bait - Out of Combat - Set Data to Miblon Snarltooth (No Repeat)"); + +-- Miblon Snarltooth +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=9467; +DELETE FROM `smart_scripts` WHERE `entryorguid`=9467 AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`=946700 AND `source_type`=9; +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 +(9467,0,0,0,11,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Respawn - Set Event Phase 1"), +(9467,0,1,0,38,1,100,0,1,1,0,0,80,946700,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Data Set - Run Script (Phase 1)"), +(946700,9,0,0,0,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Set Event Phase 0"), +(946700,9,1,0,0,0,100,0,0,0,0,0,83,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Remove NPC Flag Gossip"), +(946700,9,2,0,0,0,100,0,1000,1000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Say Line 0"), +(946700,9,3,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,20,164758,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Set Orientation"), +(946700,9,4,0,0,0,100,0,1000,1000,0,0,41,0,115,0,0,0,0,14,17428,164729,0,0,0,0,0,"Miblon Snarltooth - On Script - Despawn Gameobject 'Miblon's Door'"), +(946700,9,5,0,0,0,100,0,0,0,0,0,59,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Set Run On"), +(946700,9,6,0,0,0,100,0,1000,1000,0,0,69,0,0,0,0,0,0,20,164758,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Move to Closest Gameobject 'Miblon's Bait'"), +(946700,9,7,0,0,0,100,0,3000,3000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Say Line 1"), +(946700,9,8,0,0,0,100,0,3000,3000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Say Line 2"), +(946700,9,9,0,0,0,100,0,4000,4000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Say Line 3"), +(946700,9,10,0,0,0,100,0,105000,105000,0,0,24,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Evade"), +(946700,9,11,0,0,0,100,0,0,0,0,0,82,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Add NPC Flag Gossip"), +(946700,9,12,0,0,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Set Event Phase 1"); + +-- Texts +DELETE FROM `creature_text` WHERE `CreatureID`=9467; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(9467,0,0,"%s abandons the block he was holding up in the doorway, and looks towards the bait.",16,0,100,0,0,0,4836,0,"Miblon Snarltooth"), +(9467,1,0,"%s sniffs the bait.",16,0,100,0,0,0,4768,0,"Miblon Snarltooth"), +(9467,2,0,"Grumble...",12,0,100,0,0,0,4766,0,"Miblon Snarltooth"), +(9467,3,0,"%s gnaws at the bait ravenously.",16,0,100,0,0,0,4771,0,"Miblon Snarltooth"); From 3d001a48f5a1c4aa73674c303dbb17be2d74eb92 Mon Sep 17 00:00:00 2001 From: ZenoX92 Date: Tue, 8 May 2018 02:08:12 +0200 Subject: [PATCH 16/35] DB/Gossip: Niby the Almighty Closes #21911 --- .../world/3.3.5/2018_05_08_02_world_335.sql | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 sql/updates/world/3.3.5/2018_05_08_02_world_335.sql diff --git a/sql/updates/world/3.3.5/2018_05_08_02_world_335.sql b/sql/updates/world/3.3.5/2018_05_08_02_world_335.sql new file mode 100644 index 00000000000..d300bf66ae5 --- /dev/null +++ b/sql/updates/world/3.3.5/2018_05_08_02_world_335.sql @@ -0,0 +1,19 @@ +-- +-- Niby the Almighty --> Add gossip chatter +DELETE FROM `gossip_menu` WHERE `MenuID` IN (5841,5842,5843,5844); +INSERT INTO `gossip_menu` (`MenuID`, `TextID`, `VerifiedBuild`) VALUES +(5844,7002,0), +(5843,7003,0), +(5842,7004,0), +(5841,7005,0); + +DELETE FROM `gossip_menu_option` WHERE `MenuID` IN (5845,5844,5843,5842); +INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextID`, `OptionType`, `OptionNpcFlag`, `ActionMenuID`, `ActionPoiID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `VerifiedBuild`) VALUES +(5845,0,0,"I am in search of a great and powerful Warlock.",9625,1,1,5844,0,0,0,"",0,0), +(5844,0,0,"What task?",9627,1,1,5843,0,0,0,"",0,0), +(5843,0,0,"This is all very interesting but what is it that you want?",9629,1,1,5842,0,0,0,"",0,0), +(5842,0,0,"How do I do that?",9631,1,1,5841,0,0,0,"",0,0); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=5845; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15,5845,0,0,0,15,0,256,0,0,0,0,0,"","Show gossip option if player is a Warlock"); From deacbbe8824b4a12d89faf934ab1e66d75cc17f3 Mon Sep 17 00:00:00 2001 From: ZenoX92 Date: Tue, 8 May 2018 02:08:42 +0200 Subject: [PATCH 17/35] DB/Gossip: Ur'dan Closes #21912 --- sql/updates/world/3.3.5/2018_05_08_03_world_335.sql | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 sql/updates/world/3.3.5/2018_05_08_03_world_335.sql diff --git a/sql/updates/world/3.3.5/2018_05_08_03_world_335.sql b/sql/updates/world/3.3.5/2018_05_08_03_world_335.sql new file mode 100644 index 00000000000..287628363c4 --- /dev/null +++ b/sql/updates/world/3.3.5/2018_05_08_03_world_335.sql @@ -0,0 +1,11 @@ +-- +-- Ur'dan --> Add Gossip Text +UPDATE `creature_template` SET `gossip_menu_id`=5864 WHERE `entry`=14522; + +DELETE FROM `gossip_menu` WHERE `MenuID`=5864; +INSERT INTO `gossip_menu` (`MenuID`, `TextID`, `VerifiedBuild`) VALUES +(5864,7037,0); + +DELETE FROM `gossip_menu_option` WHERE `MenuID`=5864; +INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextID`, `OptionType`, `OptionNpcFlag`, `ActionMenuID`, `ActionPoiID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `VerifiedBuild`) VALUES +(5864,0,1,"I wish to purchase from you.",9734,3,128,0,0,0,0,"",0,0); From 731a25f603ccbc7616541613211527c2ef493a27 Mon Sep 17 00:00:00 2001 From: ZenoX92 Date: Tue, 8 May 2018 02:09:20 +0200 Subject: [PATCH 18/35] DB/Quest: Quest Emotes (Felwood) Closes #21913 --- .../world/3.3.5/2018_05_08_04_world_335.sql | 206 ++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 sql/updates/world/3.3.5/2018_05_08_04_world_335.sql diff --git a/sql/updates/world/3.3.5/2018_05_08_04_world_335.sql b/sql/updates/world/3.3.5/2018_05_08_04_world_335.sql new file mode 100644 index 00000000000..9980bbc1d9d --- /dev/null +++ b/sql/updates/world/3.3.5/2018_05_08_04_world_335.sql @@ -0,0 +1,206 @@ +-- +-- Quest "Forces of Jaedenar" +DELETE FROM `quest_details` WHERE `ID`=5155; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5155,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=6 WHERE `ID`=5155; +UPDATE `quest_offer_reward` SET `Emote1`=4, `Emote2`=1, `Emote3`=1 WHERE `ID`=5155; + +-- Quest "Collection of the Corrupt Water" +DELETE FROM `quest_details` WHERE `ID`=5157; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5157,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=6, `EmoteOnComplete`=6 WHERE `ID`=5157; +UPDATE `quest_offer_reward` SET `Emote1`=2, `Emote2`=1 WHERE `ID`=5157; + +-- Quest "Seeking Spiritual Aid" +DELETE FROM `quest_details` WHERE `ID`=5158; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5158,1,0,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnComplete`=2 WHERE `ID`=5158; +UPDATE `quest_offer_reward` SET `Emote1`=1, `Emote2`=1 WHERE `ID`=5158; + +-- Quest "Cleansed Water Returns to Felwood" +DELETE FROM `quest_details` WHERE `ID`=5159; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5159,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnComplete`=2 WHERE `ID`=5159; +UPDATE `quest_offer_reward` SET `Emote1`=4, `Emote2`=1 WHERE `ID`=5159; + +-- Quest "Dousing the Flames of Protection" +DELETE FROM `quest_details` WHERE `ID`=5165; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5165,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID`=5165; +UPDATE `quest_offer_reward` SET `Emote1`=1, `Emote2`=1 WHERE `ID`=5165; + +-- Quest "A Final Blow" +DELETE FROM `quest_details` WHERE `ID`=5242; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5242,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID`=5242; +UPDATE `quest_offer_reward` SET `Emote1`=4, `Emote2`=1, `Emote3`=2 WHERE `ID`=5242; + +-- Quest "Verifying the Corruption" +DELETE FROM `quest_details` WHERE `ID`=5156; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5156,1,1,1,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID`=5156; + +-- Quest "Cleansing Felwood" +DELETE FROM `quest_details` WHERE `ID` IN (4101,4102); +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4101,1,0,0,0,0,0,0,0,0), +(4102,1,0,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=5, `EmoteOnComplete`=5 WHERE `ID` IN (4101,4102); +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID` IN (4101,4102); + +-- Quest "Salve via Hunting" +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID` IN (4103,4108,5882,5887); +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID` IN (4103,4108,5882,5887); + +-- Quest "A Strange One" +DELETE FROM `quest_details` WHERE `ID`=6605; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(6605,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=6 WHERE `ID`=6605; + +-- Quest "Well of Corruption" +DELETE FROM `quest_details` WHERE `ID`=4505; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4505,1,1,1,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=5, `EmoteOnComplete`=5 WHERE `ID`=4505; +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=4505; + +-- Quest "Corrupted Sabers" +DELETE FROM `quest_details` WHERE `ID`=4506; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4506,1,11,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=5 WHERE `ID`=4506; +UPDATE `quest_offer_reward` SET `Emote1`=4, `Emote2`=11 WHERE `ID`=4506; + +-- Quest "A Husband's Last Battle" +DELETE FROM `quest_details` WHERE `ID`=6162; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(6162,1,1,5,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=6, `EmoteOnComplete`=6 WHERE `ID`=6162; +UPDATE `quest_offer_reward` SET `Emote1`=2, `Emote2`=1 WHERE `ID`=6162; + +-- Quest "Timbermaw Ally" +DELETE FROM `quest_details` WHERE `ID`=8460; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(8460,1,1,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=8460; + +-- Quest "Speak to Nafien" +DELETE FROM `quest_details` WHERE `ID`=8462; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(8462,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=8462; + +-- Quest "Feathers for Grazle" +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1, `EmoteOnComplete`=0 WHERE `ID`=8466; +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=8466; + +-- Quest "Feathers for Nafien" +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1, `EmoteOnComplete`=0 WHERE `ID`=8467; + +-- Quest "Wild Guardians" +DELETE FROM `quest_details` WHERE `ID`=4521; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4521,1,0,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=25 WHERE `ID`=4521; + +-- Quest "Wild Guardians (Part 2)" +DELETE FROM `quest_details` WHERE `ID`=4741; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4741,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=4741; + +-- Quest "Wild Guardians (Part 3)" +DELETE FROM `quest_details` WHERE `ID`=4721; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4721,1,0,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=25 WHERE `ID`=4721; + +-- Quest "The Corruption of the Jadefire" +DELETE FROM `quest_details` WHERE `ID`=4421; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4421,1,2,1,0,0,0,0,0,0); + +-- Quest "Further Corruption" +DELETE FROM `quest_details` WHERE `ID`=4906; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4906,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=20 WHERE `ID`=4906; +UPDATE `quest_offer_reward` SET `Emote1`=1, `Emote2`=2 WHERE `ID`=4906; + +-- Quest "Flute of Xavaric" +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=6, `EmoteOnComplete`=6 WHERE `ID`=939; +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=939; + +-- Quest "Felbound Ancients" +DELETE FROM `quest_details` WHERE `ID`=4441; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4441,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID`=4441; +UPDATE `quest_offer_reward` SET `Emote1`=2 WHERE `ID`=4441; + +-- Quest "Purified!" +DELETE FROM `quest_details` WHERE `ID`=4442; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4442,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=2 WHERE `ID`=4442; + +-- Quest "Ancient Spirit" +UPDATE `quest_offer_reward` SET `Emote1`=2, `RewardText`="Yes, $N. Felwood has been through much hardship. Thank you for what you have done.$B$BOne day, we may be able to reclaim Felwood from the corruption; every kind deed helps." WHERE `ID`=4261; + +-- Quest "A Strange Red Key" +UPDATE `quest_request_items` SET `EmoteOnComplete`=6 WHERE `ID`=5202; +UPDATE `quest_offer_reward` SET `Emote1`=4 WHERE `ID`=5202; + +-- Quest "Rescue From Jaedenar" +DELETE FROM `quest_details` WHERE `ID`=5203; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5203,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=6, `Emote2`=1, `Emote3`=1 WHERE `ID`=5203; + +-- Quest "Retribution of the Light" +DELETE FROM `quest_details` WHERE `ID`=5204; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5204,1,1,1,0,0,0,0,0,0); + +-- Quest "The Remains of Trey Lightforge" +UPDATE `quest_request_items` SET `EmoteOnComplete`=6 WHERE `ID`=5385; +UPDATE `quest_offer_reward` SET `Emote1`=2 WHERE `ID`=5385; + +-- Quest "An Imp's Request" +DELETE FROM `quest_details` WHERE `ID`=8419; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(8419,1,0,0,0,0,0,0,0,0); + +-- Quest "What Niby Commands" +DELETE FROM `quest_details` WHERE `ID`=7601; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(7601,1,1,1,1,0,0,0,0,0); + +-- Quest "Kroshius' Infernal Core" +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=6, `EmoteOnComplete`=6 WHERE `ID`=7603; +UPDATE `quest_offer_reward` SET `Emote1`=5 WHERE `ID`=7603; + +-- Quest "Sacred Cloth" +UPDATE `quest_request_items` SET `EmoteOnComplete`=0 WHERE `ID`=6032; + +-- Quest "The Root of All Evil" +DELETE FROM `quest_details` WHERE `ID`=8481; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(8481,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID`=8481; + +-- Quest "The Brokering of Peace" +DELETE FROM `quest_details` WHERE `ID` IN (8484,8485); +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(8484,1,1,0,0,0,0,0,0,0), +(8485,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnComplete`=2 WHERE `ID` IN (8484,8485); +UPDATE `quest_offer_reward` SET `Emote1`=1, `Emote2`=1 WHERE `ID` IN (8484,8485); From b462bffdf0ed58283ba2ac199e06606b3500f865 Mon Sep 17 00:00:00 2001 From: ZenoX92 Date: Tue, 8 May 2018 02:10:08 +0200 Subject: [PATCH 19/35] DB/Text: Ulathek Closes #21914 --- sql/updates/world/3.3.5/2018_05_08_05_world_335.sql | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 sql/updates/world/3.3.5/2018_05_08_05_world_335.sql diff --git a/sql/updates/world/3.3.5/2018_05_08_05_world_335.sql b/sql/updates/world/3.3.5/2018_05_08_05_world_335.sql new file mode 100644 index 00000000000..3ada38bcd83 --- /dev/null +++ b/sql/updates/world/3.3.5/2018_05_08_05_world_335.sql @@ -0,0 +1,9 @@ +-- +-- Ulathek +DELETE FROM `smart_scripts` WHERE `entryorguid`=14523 AND `source_type`=0 AND `id`=6; +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 +(14523,0,6,0,4,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ulathek - On Aggro - Say Line 0"); + +DELETE FROM `creature_text` WHERE `CreatureID`=14523; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(14523,0,0,"You dog! Now I'll trap your soul into a shard and give you to my imp as a plaything!",12,0,100,0,0,0,9735,0,"Ulathek"); From a10b09d424d8a10016da1d1e48448af7181998b3 Mon Sep 17 00:00:00 2001 From: ZenoX92 Date: Tue, 8 May 2018 18:21:48 +0200 Subject: [PATCH 20/35] DB/Quest: The Videre Elixir updates Updates https://github.com/TrinityCore/TrinityCore/commit/395242a437f414b6c64f3a169dfb7fc6f9d725ed --- .../world/3.3.5/2018_05_08_06_world_335.sql | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 sql/updates/world/3.3.5/2018_05_08_06_world_335.sql diff --git a/sql/updates/world/3.3.5/2018_05_08_06_world_335.sql b/sql/updates/world/3.3.5/2018_05_08_06_world_335.sql new file mode 100644 index 00000000000..610a14a9726 --- /dev/null +++ b/sql/updates/world/3.3.5/2018_05_08_06_world_335.sql @@ -0,0 +1,16 @@ +-- +DELETE FROM `smart_scripts` WHERE `entryorguid`=946700 AND `source_type`=9; +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 +(946700,9,0,0,0,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Set Event Phase 0"), +(946700,9,1,0,0,0,100,0,0,0,0,0,83,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Remove NPC Flag Gossip"), +(946700,9,2,0,0,0,100,0,1000,1000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Say Line 2"), +(946700,9,3,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Say Line 0"), +(946700,9,4,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,20,164758,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Set Orientation"), +(946700,9,5,0,0,0,100,0,1000,1000,0,0,41,0,115,0,0,0,0,14,17428,164729,0,0,0,0,0,"Miblon Snarltooth - On Script - Despawn Gameobject 'Miblon's Door'"), +(946700,9,6,0,0,0,100,0,0,0,0,0,59,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Set Run On"), +(946700,9,7,0,0,0,100,0,1000,1000,0,0,69,0,0,0,0,0,0,20,164758,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Move to Closest Gameobject 'Miblon's Bait'"), +(946700,9,8,0,0,0,100,0,3000,3000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Say Line 1"), +(946700,9,9,0,0,0,100,0,4000,4000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Say Line 3"), +(946700,9,10,0,0,0,100,0,108000,108000,0,0,24,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Evade"), +(946700,9,11,0,0,0,100,0,0,0,0,0,82,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Add NPC Flag Gossip"), +(946700,9,12,0,0,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Set Event Phase 1"); From 353e9919c3b90254ff28953fb895d696312076c9 Mon Sep 17 00:00:00 2001 From: ZenoX92 Date: Tue, 8 May 2018 18:28:12 +0200 Subject: [PATCH 21/35] DB/Creature: Niby the Almighty & Impsy Closes #21916 --- .../world/3.3.5/2018_05_08_07_world_335.sql | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 sql/updates/world/3.3.5/2018_05_08_07_world_335.sql diff --git a/sql/updates/world/3.3.5/2018_05_08_07_world_335.sql b/sql/updates/world/3.3.5/2018_05_08_07_world_335.sql new file mode 100644 index 00000000000..cf0593389cf --- /dev/null +++ b/sql/updates/world/3.3.5/2018_05_08_07_world_335.sql @@ -0,0 +1,79 @@ +-- +-- World Invisible Trigger +SET @GUID := 64987; +DELETE FROM `creature` WHERE `guid`=@GUID; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES +(@GUID,12999,1,0,0,1,1,0,0,5416.44,-742.98,346.204,1.75579,300,0,0,7212,0,0,0,0,0,"",0); + +-- Niby the Almighty +DELETE FROM `smart_scripts` WHERE `entryorguid`=14469 AND `source_type`=0 AND `id` IN (1,2,3,4,5); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (1446900,1446901,1446902,1446903) AND `source_type`=9; +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`, `event_param5`, `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 +(14469,0,1,0,40,0,100,0,1,14469,0,0,0,80,1446901,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Waypoint 1 Reached - Run Script"), +(14469,0,2,0,40,0,100,0,2,14469,0,0,0,80,1446902,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Waypoint 2 Reached - Run Script"), +(14469,0,3,0,1,1,100,0,1000,15000,150000,180000,0,80,1446903,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - Out of Combat - Run Script"), +(14469,0,4,0,11,0,100,0,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Respawn - Set Event Phase 1"), +(14469,0,5,0,38,0,100,0,1,1,0,0,0,69,0,0,0,0,0,0,8,0,0,0,5413.9,-737.721,344.624,0,"Niby the Almighty - On Data Set - Move to Position"), +(1446900,9,0,0,0,0,100,0,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Set Event Phase 0"), +(1446900,9,1,0,0,0,100,0,0,0,0,0,0,83,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Remove Npc Flag Questgiver+Gossip"), +(1446900,9,2,0,0,0,100,0,0,0,0,0,0,53,0,14469,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Start Waypoint"), +(1446901,9,0,0,0,0,100,0,0,0,0,0,0,54,23000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Pause Waypoint"), +(1446901,9,1,0,0,0,100,0,1000,1000,0,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,1.2,"Niby the Almighty - On Script - Set Orientation"), +(1446901,9,2,0,0,0,100,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 0"), +(1446901,9,3,0,0,0,100,0,6000,6000,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 1"), +(1446901,9,4,0,0,0,100,0,0,0,0,0,0,11,23056,0,0,0,0,0,19,12999,0,0,0,0,0,0,"Niby the Almighty - On Script - Cast 'Call Infernal Destroyer'"), +(1446901,9,5,0,0,0,100,0,6000,6000,0,0,0,1,0,0,0,0,0,0,19,14470,100,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 0"), +(1446901,9,6,0,0,0,100,0,0,0,0,0,0,1,1,0,0,0,0,0,19,14470,100,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 1"), +(1446901,9,7,0,0,0,100,0,4000,4000,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 2"), +(1446902,9,0,0,0,0,100,0,0,0,0,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,1.653,"Niby the Almighty - On Script - Set Orientation"), +(1446902,9,1,0,0,0,100,0,0,0,0,0,0,82,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Add Npc Flag Questgiver+Gossip"), +(1446902,9,2,0,0,0,100,0,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Set Event Phase 1"), +(1446903,9,0,0,0,0,100,0,0,0,0,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 3"), +(1446903,9,1,0,0,0,100,0,5000,5000,0,0,0,11,23053,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Cast 'Infernal Conjure Dummy DND'"), +(1446903,9,2,0,0,0,100,0,3000,3000,0,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 4"), +(1446903,9,3,0,0,0,100,0,1000,1000,0,0,0,1,2,0,0,0,0,0,19,14470,0,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 2 (Impsy)"), +(1446903,9,4,0,0,0,100,0,5000,5000,0,0,0,1,5,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 5"), +(1446903,9,5,0,0,0,100,0,0,0,0,0,0,45,1,1,0,0,0,0,19,14470,0,0,0,0,0,0,"Niby the Almighty - On Script - Set Data to Impsy"), +(1446903,9,6,0,0,0,100,0,0,0,0,0,0,29,1,180,0,0,0,0,19,14470,0,0,0,0,0,0,"Niby the Almighty - On Script - Start Follow"), +(1446903,9,7,0,0,0,100,0,3000,3000,0,0,0,1,3,0,0,0,0,0,19,14470,0,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 3 (Impsy)"); + +-- Impsy +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=14470; +DELETE FROM `smart_scripts` WHERE `entryorguid`=14470 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`, `event_param5`, `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 +(14470,0,0,0,38,0,100,0,1,1,0,0,0,89,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Impsy - On Data Set - Stop Random Movement"), +(14470,0,1,0,38,0,100,0,1,1,0,0,0,53,1,14470,0,0,0,0,1,0,0,0,0,0,0,0,"Impsy - On Data Set - Start Waypoint"), +(14470,0,2,0,40,0,100,0,11,14470,0,0,0,45,1,1,0,0,0,0,19,14469,0,0,0,0,0,0,"Impsy - On Waypoint 11 Reached - Set Data to Niby the Almighty"), +(14470,0,3,0,40,0,100,0,11,14470,0,0,0,89,5,0,0,0,0,0,1,0,0,0,0,0,0,0,"Impsy - On Waypoint 11 Reached - Start Random Movement"), +(14470,0,4,0,11,0,100,0,0,0,0,0,0,89,5,0,0,0,0,0,1,0,0,0,0,0,0,0,"Impsy - On Respawn - Start Random Movement"); + +-- Texts +DELETE FROM `creature_text` WHERE `CreatureID`=14469 AND `GroupID` IN (3,4,5); +DELETE FROM `creature_text` WHERE `CreatureID`=14470 AND `GroupID` IN (2,3); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(14469,3,0,"This is it, Impsy. I can feel it! This is the big one!",12,0,100,5,0,0,9615,0,"Niby the Almighty"), +(14469,3,1,"Brace yourself for the glorious impact, Impsy!",12,0,100,5,0,0,9616,0,"Niby the Almighty"), +(14469,3,2,"Kick me out, will they!? I'll show those uptight cone heads in Stormwind the true power of Niby! BEHOLD!",12,0,100,15,0,0,9617,0,"Niby the Almighty"), +(14469,4,0,"%s shakes his fist in frustration.",16,0,100,0,0,0,9618,0,"Niby the Almighty"), +(14469,5,0,"Why you little!",12,0,100,0,0,0,9622,0,"Niby the Almighty"), +(14470,2,0,"Niby, you are stupid.",12,0,100,0,0,0,9619,0,"Impsy"), +(14470,2,1,"Oh my, what a surprise! Another failure!? But how, oh great one??",12,0,100,0,0,0,9620,0,"Impsy"), +(14470,2,2,"Awe inspiring, master. Your ineptitude is awe inspiring.",12,0,100,0,0,0,9621,0,"Impsy"), +(14470,3,0,"Ack! Help! Crazed gnome trying to kill me!",12,0,100,0,0,0,9623,0,"Impsy"); + +-- Waypoints +DELETE FROM `waypoints` WHERE `entry` IN (14469,14470); +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`) VALUES +(14469,1,5407.19,-753,350.82), +(14469,2,5413.9,-737.721,344.624), +(14470,1,5399.15,-735.454,343.567), +(14470,2,5386.63,-729.446,343.992), +(14470,3,5384.08,-722.534,345.173), +(14470,4,5396.26,-713.693,346.403), +(14470,5,5415.7,-722.556,344.598), +(14470,6,5434.85,-723.435,342.78), +(14470,7,5444.68,-732.313,342.527), +(14470,8,5440.93,-743.161,343.643), +(14470,9,5427.72,-750.631,347.609), +(14470,10,5416.55,-749.533,348.499), +(14470,11,5407.59,-736.618,344.249); From 927d7518ca20a5e7471c51d882db1937707ffb97 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Fri, 11 May 2018 20:36:14 +0200 Subject: [PATCH 22/35] Dep/Jemalloc: Update to Jemalloc 5.1.0 --- dep/PackageList.txt | 2 +- dep/jemalloc/CMakeLists.txt | 4 +- dep/jemalloc/COPYING | 4 +- dep/jemalloc/ChangeLog | 121 +- .../include/jemalloc/internal/arena_externs.h | 17 +- .../jemalloc/internal/arena_inlines_a.h | 2 +- .../jemalloc/internal/arena_inlines_b.h | 11 +- .../include/jemalloc/internal/arena_stats.h | 237 +++ .../jemalloc/internal/arena_structs_b.h | 85 +- .../include/jemalloc/internal/arena_types.h | 2 - .../internal/background_thread_externs.h | 2 + .../internal/background_thread_structs.h | 1 + .../include/jemalloc/internal/base_externs.h | 5 +- .../include/jemalloc/internal/base_inlines.h | 4 + .../include/jemalloc/internal/base_structs.h | 4 + .../include/jemalloc/internal/base_types.h | 26 + dep/jemalloc/include/jemalloc/internal/bin.h | 106 + .../include/jemalloc/internal/bin_stats.h | 51 + .../include/jemalloc/internal/cache_bin.h | 114 ++ dep/jemalloc/include/jemalloc/internal/ctl.h | 5 +- dep/jemalloc/include/jemalloc/internal/div.h | 41 + .../include/jemalloc/internal/emitter.h | 435 ++++ .../jemalloc/internal/extent_externs.h | 9 +- .../jemalloc/internal/extent_inlines.h | 36 +- .../jemalloc/internal/extent_structs.h | 102 +- .../include/jemalloc/internal/extent_types.h | 8 + dep/jemalloc/include/jemalloc/internal/hash.h | 28 +- .../internal/jemalloc_internal_decls.h | 11 +- .../internal/jemalloc_internal_inlines_a.h | 9 +- .../internal/jemalloc_internal_inlines_c.h | 27 +- .../internal/jemalloc_internal_macros.h | 3 + .../internal/jemalloc_internal_types.h | 11 +- .../jemalloc/internal/jemalloc_preamble.h | 29 +- .../jemalloc/internal/jemalloc_preamble.h.in | 29 +- dep/jemalloc/include/jemalloc/internal/log.h | 115 ++ .../include/jemalloc/internal/malloc_io.h | 40 + .../include/jemalloc/internal/mutex_prof.h | 39 +- .../include/jemalloc/internal/pages.h | 17 + .../jemalloc/internal/prof_inlines_a.h | 11 + .../jemalloc/internal/prof_inlines_b.h | 11 - .../include/jemalloc/internal/rtree.h | 42 +- .../include/jemalloc/internal/rtree_tsd.h | 2 +- dep/jemalloc/include/jemalloc/internal/spin.h | 20 +- .../include/jemalloc/internal/stats.h | 134 -- .../include/jemalloc/internal/stats_tsd.h | 12 - dep/jemalloc/include/jemalloc/internal/sz.h | 4 +- .../jemalloc/internal/tcache_externs.h | 8 +- .../jemalloc/internal/tcache_inlines.h | 99 +- .../jemalloc/internal/tcache_structs.h | 79 +- .../include/jemalloc/internal/tcache_types.h | 5 - .../include/jemalloc/internal/ticker.h | 38 +- dep/jemalloc/include/jemalloc/internal/tsd.h | 2 + .../include/jemalloc/internal/tsd_tls.h | 2 +- .../include/jemalloc/internal/witness.h | 2 +- dep/jemalloc/include/jemalloc/jemalloc.h | 8 +- dep/jemalloc/include/msvc_compat/inttypes.h | 313 --- dep/jemalloc/include/msvc_compat/stdbool.h | 16 - dep/jemalloc/include/msvc_compat/stdint.h | 247 --- .../jemalloc_internal_defs.h.in.cmake | 33 +- dep/jemalloc/src/arena.c | 406 ++-- dep/jemalloc/src/background_thread.c | 151 +- dep/jemalloc/src/base.c | 166 +- dep/jemalloc/src/bin.c | 50 + dep/jemalloc/src/ctl.c | 307 ++- dep/jemalloc/src/div.c | 55 + dep/jemalloc/src/extent.c | 508 +++-- dep/jemalloc/src/extent_dss.c | 5 +- dep/jemalloc/src/jemalloc.c | 198 +- dep/jemalloc/src/jemalloc_cpp.cpp | 23 +- dep/jemalloc/src/log.c | 78 + dep/jemalloc/src/malloc_io.c | 17 +- dep/jemalloc/src/mutex.c | 5 +- dep/jemalloc/src/pages.c | 230 ++- dep/jemalloc/src/prof.c | 19 +- dep/jemalloc/src/spin.c | 4 - dep/jemalloc/src/stats.c | 1793 +++++++++-------- dep/jemalloc/src/sz.c | 3 +- dep/jemalloc/src/tcache.c | 59 +- dep/jemalloc/src/tsd.c | 10 + dep/jemalloc/src/zone.c | 30 +- 80 files changed, 4334 insertions(+), 2663 deletions(-) create mode 100644 dep/jemalloc/include/jemalloc/internal/arena_stats.h create mode 100644 dep/jemalloc/include/jemalloc/internal/bin.h create mode 100644 dep/jemalloc/include/jemalloc/internal/bin_stats.h create mode 100644 dep/jemalloc/include/jemalloc/internal/cache_bin.h create mode 100644 dep/jemalloc/include/jemalloc/internal/div.h create mode 100644 dep/jemalloc/include/jemalloc/internal/emitter.h create mode 100644 dep/jemalloc/include/jemalloc/internal/log.h delete mode 100644 dep/jemalloc/include/jemalloc/internal/stats_tsd.h delete mode 100644 dep/jemalloc/include/msvc_compat/inttypes.h delete mode 100644 dep/jemalloc/include/msvc_compat/stdbool.h delete mode 100644 dep/jemalloc/include/msvc_compat/stdint.h create mode 100644 dep/jemalloc/src/bin.c create mode 100644 dep/jemalloc/src/div.c create mode 100644 dep/jemalloc/src/log.c delete mode 100644 dep/jemalloc/src/spin.c diff --git a/dep/PackageList.txt b/dep/PackageList.txt index df8139ddd3e..85bd19361c1 100644 --- a/dep/PackageList.txt +++ b/dep/PackageList.txt @@ -30,7 +30,7 @@ G3D (a commercial-grade C++ 3D engine available as Open Source (BSD License) jemalloc (a general-purpose scalable concurrent malloc-implementation) http://www.canonware.com/jemalloc/ - Version: 5.0.1 + Version: 5.1.0 libreadline (command line editing library) https://cnswww.cns.cwru.edu/php/chet/readline/rltop.html diff --git a/dep/jemalloc/CMakeLists.txt b/dep/jemalloc/CMakeLists.txt index 39a48004a8e..f67237b66e1 100644 --- a/dep/jemalloc/CMakeLists.txt +++ b/dep/jemalloc/CMakeLists.txt @@ -40,9 +40,11 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT NOJEM) ${CMAKE_CURRENT_SOURCE_DIR}/src/arena.c ${CMAKE_CURRENT_SOURCE_DIR}/src/background_thread.c ${CMAKE_CURRENT_SOURCE_DIR}/src/base.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/bin.c ${CMAKE_CURRENT_SOURCE_DIR}/src/bitmap.c ${CMAKE_CURRENT_SOURCE_DIR}/src/ckh.c ${CMAKE_CURRENT_SOURCE_DIR}/src/ctl.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/div.c ${CMAKE_CURRENT_SOURCE_DIR}/src/extent.c ${CMAKE_CURRENT_SOURCE_DIR}/src/extent_dss.c ${CMAKE_CURRENT_SOURCE_DIR}/src/extent_mmap.c @@ -51,6 +53,7 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT NOJEM) ${CMAKE_CURRENT_SOURCE_DIR}/src/jemalloc.c ${CMAKE_CURRENT_SOURCE_DIR}/src/jemalloc_cpp.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/large.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/log.c ${CMAKE_CURRENT_SOURCE_DIR}/src/malloc_io.c ${CMAKE_CURRENT_SOURCE_DIR}/src/mutex.c ${CMAKE_CURRENT_SOURCE_DIR}/src/mutex_pool.c @@ -59,7 +62,6 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT NOJEM) ${CMAKE_CURRENT_SOURCE_DIR}/src/prng.c ${CMAKE_CURRENT_SOURCE_DIR}/src/prof.c ${CMAKE_CURRENT_SOURCE_DIR}/src/rtree.c - ${CMAKE_CURRENT_SOURCE_DIR}/src/spin.c ${CMAKE_CURRENT_SOURCE_DIR}/src/stats.c ${CMAKE_CURRENT_SOURCE_DIR}/src/sz.c ${CMAKE_CURRENT_SOURCE_DIR}/src/tcache.c diff --git a/dep/jemalloc/COPYING b/dep/jemalloc/COPYING index e308632a813..98458d971ac 100644 --- a/dep/jemalloc/COPYING +++ b/dep/jemalloc/COPYING @@ -1,10 +1,10 @@ Unless otherwise specified, files in the jemalloc source distribution are subject to the following license: -------------------------------------------------------------------------------- -Copyright (C) 2002-2017 Jason Evans . +Copyright (C) 2002-2018 Jason Evans . All rights reserved. Copyright (C) 2007-2012 Mozilla Foundation. All rights reserved. -Copyright (C) 2009-2017 Facebook, Inc. All rights reserved. +Copyright (C) 2009-2018 Facebook, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/dep/jemalloc/ChangeLog b/dep/jemalloc/ChangeLog index ee1b7ead399..29a00fb78e5 100644 --- a/dep/jemalloc/ChangeLog +++ b/dep/jemalloc/ChangeLog @@ -4,6 +4,123 @@ brevity. Much more detail can be found in the git revision history: https://github.com/jemalloc/jemalloc +* 5.1.0 (May 4th, 2018) + + This release is primarily about fine-tuning, ranging from several new features + to numerous notable performance and portability enhancements. The release and + prior dev versions have been running in multiple large scale applications for + months, and the cumulative improvements are substantial in many cases. + + Given the long and successful production runs, this release is likely a good + candidate for applications to upgrade, from both jemalloc 5.0 and before. For + performance-critical applications, the newly added TUNING.md provides + guidelines on jemalloc tuning. + + New features: + - Implement transparent huge page support for internal metadata. (@interwq) + - Add opt.thp to allow enabling / disabling transparent huge pages for all + mappings. (@interwq) + - Add maximum background thread count option. (@djwatson) + - Allow prof_active to control opt.lg_prof_interval and prof.gdump. + (@interwq) + - Allow arena index lookup based on allocation addresses via mallctl. + (@lionkov) + - Allow disabling initial-exec TLS model. (@davidtgoldblatt, @KenMacD) + - Add opt.lg_extent_max_active_fit to set the max ratio between the size of + the active extent selected (to split off from) and the size of the requested + allocation. (@interwq, @davidtgoldblatt) + - Add retain_grow_limit to set the max size when growing virtual address + space. (@interwq) + - Add mallctl interfaces: + + arena..retain_grow_limit (@interwq) + + arenas.lookup (@lionkov) + + max_background_threads (@djwatson) + + opt.lg_extent_max_active_fit (@interwq) + + opt.max_background_threads (@djwatson) + + opt.metadata_thp (@interwq) + + opt.thp (@interwq) + + stats.metadata_thp (@interwq) + + Portability improvements: + - Support GNU/kFreeBSD configuration. (@paravoid) + - Support m68k, nios2 and SH3 architectures. (@paravoid) + - Fall back to FD_CLOEXEC when O_CLOEXEC is unavailable. (@zonyitoo) + - Fix symbol listing for cross-compiling. (@tamird) + - Fix high bits computation on ARM. (@davidtgoldblatt, @paravoid) + - Disable the CPU_SPINWAIT macro for Power. (@davidtgoldblatt, @marxin) + - Fix MSVC 2015 & 2017 builds. (@rustyx) + - Improve RISC-V support. (@EdSchouten) + - Set name mangling script in strict mode. (@nicolov) + - Avoid MADV_HUGEPAGE on ARM. (@marxin) + - Modify configure to determine return value of strerror_r. + (@davidtgoldblatt, @cferris1000) + - Make sure CXXFLAGS is tested with CPP compiler. (@nehaljwani) + - Fix 32-bit build on MSVC. (@rustyx) + - Fix external symbol on MSVC. (@maksqwe) + - Avoid a printf format specifier warning. (@jasone) + - Add configure option --disable-initial-exec-tls which can allow jemalloc to + be dynamically loaded after program startup. (@davidtgoldblatt, @KenMacD) + - AArch64: Add ILP32 support. (@cmuellner) + - Add --with-lg-vaddr configure option to support cross compiling. + (@cmuellner, @davidtgoldblatt) + + Optimizations and refactors: + - Improve active extent fit with extent_max_active_fit. This considerably + reduces fragmentation over time and improves virtual memory and metadata + usage. (@davidtgoldblatt, @interwq) + - Eagerly coalesce large extents to reduce fragmentation. (@interwq) + - sdallocx: only read size info when page aligned (i.e. possibly sampled), + which speeds up the sized deallocation path significantly. (@interwq) + - Avoid attempting new mappings for in place expansion with retain, since + it rarely succeeds in practice and causes high overhead. (@interwq) + - Refactor OOM handling in newImpl. (@wqfish) + - Add internal fine-grained logging functionality for debugging use. + (@davidtgoldblatt) + - Refactor arena / tcache interactions. (@davidtgoldblatt) + - Refactor extent management with dumpable flag. (@davidtgoldblatt) + - Add runtime detection of lazy purging. (@interwq) + - Use pairing heap instead of red-black tree for extents_avail. (@djwatson) + - Use sysctl on startup in FreeBSD. (@trasz) + - Use thread local prng state instead of atomic. (@djwatson) + - Make decay to always purge one more extent than before, because in + practice large extents are usually the ones that cross the decay threshold. + Purging the additional extent helps save memory as well as reduce VM + fragmentation. (@interwq) + - Fast division by dynamic values. (@davidtgoldblatt) + - Improve the fit for aligned allocation. (@interwq, @edwinsmith) + - Refactor extent_t bitpacking. (@rkmisra) + - Optimize the generated assembly for ticker operations. (@davidtgoldblatt) + - Convert stats printing to use a structured text emitter. (@davidtgoldblatt) + - Remove preserve_lru feature for extents management. (@djwatson) + - Consolidate two memory loads into one on the fast deallocation path. + (@davidtgoldblatt, @interwq) + + Bug fixes (most of the issues are only relevant to jemalloc 5.0): + - Fix deadlock with multithreaded fork in OS X. (@davidtgoldblatt) + - Validate returned file descriptor before use. (@zonyitoo) + - Fix a few background thread initialization and shutdown issues. (@interwq) + - Fix an extent coalesce + decay race by taking both coalescing extents off + the LRU list. (@interwq) + - Fix potentially unbound increase during decay, caused by one thread keep + stashing memory to purge while other threads generating new pages. The + number of pages to purge is checked to prevent this. (@interwq) + - Fix a FreeBSD bootstrap assertion. (@strejda, @interwq) + - Handle 32 bit mutex counters. (@rkmisra) + - Fix a indexing bug when creating background threads. (@davidtgoldblatt, + @binliu19) + - Fix arguments passed to extent_init. (@yuleniwo, @interwq) + - Fix addresses used for ordering mutexes. (@rkmisra) + - Fix abort_conf processing during bootstrap. (@interwq) + - Fix include path order for out-of-tree builds. (@cmuellner) + + Incompatible changes: + - Remove --disable-thp. (@interwq) + - Remove mallctl interfaces: + + config.thp (@interwq) + + Documentation: + - Add TUNING.md. (@interwq, @davidtgoldblatt, @djwatson) + * 5.0.1 (July 1, 2017) This bugfix release fixes several issues, most of which are obscure enough @@ -22,7 +139,7 @@ brevity. Much more detail can be found in the git revision history: unlikely to be an issue with other libc implementations. (@interwq) - Mask signals during background thread creation. This prevents signals from being inadvertently delivered to background threads. (@jasone, - @davidgoldblatt, @interwq) + @davidtgoldblatt, @interwq) - Avoid inactivity checks within background threads, in order to prevent recursive mutex acquisition. (@interwq) - Fix extent_grow_retained() to use the specified hooks when the @@ -515,7 +632,7 @@ brevity. Much more detail can be found in the git revision history: these fixes, xallocx() now tries harder to partially fulfill requests for optional extra space. Note that a couple of minor heap profiling optimizations are included, but these are better thought of as performance - fixes that were integral to disovering most of the other bugs. + fixes that were integral to discovering most of the other bugs. Optimizations: - Avoid a chunk metadata read in arena_prof_tctx_set(), since it is in the diff --git a/dep/jemalloc/include/jemalloc/internal/arena_externs.h b/dep/jemalloc/include/jemalloc/internal/arena_externs.h index af16d158852..4b3732b41da 100644 --- a/dep/jemalloc/include/jemalloc/internal/arena_externs.h +++ b/dep/jemalloc/include/jemalloc/internal/arena_externs.h @@ -1,6 +1,7 @@ #ifndef JEMALLOC_INTERNAL_ARENA_EXTERNS_H #define JEMALLOC_INTERNAL_ARENA_EXTERNS_H +#include "jemalloc/internal/bin.h" #include "jemalloc/internal/extent_dss.h" #include "jemalloc/internal/pages.h" #include "jemalloc/internal/size_classes.h" @@ -9,25 +10,19 @@ extern ssize_t opt_dirty_decay_ms; extern ssize_t opt_muzzy_decay_ms; -extern const arena_bin_info_t arena_bin_info[NBINS]; - extern percpu_arena_mode_t opt_percpu_arena; extern const char *percpu_arena_mode_names[]; extern const uint64_t h_steps[SMOOTHSTEP_NSTEPS]; extern malloc_mutex_t arenas_lock; -void arena_stats_large_nrequests_add(tsdn_t *tsdn, arena_stats_t *arena_stats, - szind_t szind, uint64_t nrequests); -void arena_stats_mapped_add(tsdn_t *tsdn, arena_stats_t *arena_stats, - size_t size); void arena_basic_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads, const char **dss, ssize_t *dirty_decay_ms, ssize_t *muzzy_decay_ms, size_t *nactive, size_t *ndirty, size_t *nmuzzy); void arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads, const char **dss, ssize_t *dirty_decay_ms, ssize_t *muzzy_decay_ms, size_t *nactive, size_t *ndirty, size_t *nmuzzy, arena_stats_t *astats, - malloc_bin_stats_t *bstats, malloc_large_stats_t *lstats); + bin_stats_t *bstats, arena_stats_large_t *lstats); void arena_extents_dirty_dalloc(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, extent_t *extent); #ifdef JEMALLOC_JET @@ -50,11 +45,11 @@ void arena_decay(tsdn_t *tsdn, arena_t *arena, bool is_background_thread, void arena_reset(tsd_t *tsd, arena_t *arena); void arena_destroy(tsd_t *tsd, arena_t *arena); void arena_tcache_fill_small(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache, - tcache_bin_t *tbin, szind_t binind, uint64_t prof_accumbytes); -void arena_alloc_junk_small(void *ptr, const arena_bin_info_t *bin_info, + cache_bin_t *tbin, szind_t binind, uint64_t prof_accumbytes); +void arena_alloc_junk_small(void *ptr, const bin_info_t *bin_info, bool zero); -typedef void (arena_dalloc_junk_small_t)(void *, const arena_bin_info_t *); +typedef void (arena_dalloc_junk_small_t)(void *, const bin_info_t *); extern arena_dalloc_junk_small_t *JET_MUTABLE arena_dalloc_junk_small; void *arena_malloc_hard(tsdn_t *tsdn, arena_t *arena, size_t size, @@ -77,6 +72,8 @@ ssize_t arena_dirty_decay_ms_default_get(void); bool arena_dirty_decay_ms_default_set(ssize_t decay_ms); ssize_t arena_muzzy_decay_ms_default_get(void); bool arena_muzzy_decay_ms_default_set(ssize_t decay_ms); +bool arena_retain_grow_limit_get_set(tsd_t *tsd, arena_t *arena, + size_t *old_limit, size_t *new_limit); unsigned arena_nthreads_get(arena_t *arena, bool internal); void arena_nthreads_inc(arena_t *arena, bool internal); void arena_nthreads_dec(arena_t *arena, bool internal); diff --git a/dep/jemalloc/include/jemalloc/internal/arena_inlines_a.h b/dep/jemalloc/include/jemalloc/internal/arena_inlines_a.h index da5877060a8..9abf7f6ac70 100644 --- a/dep/jemalloc/include/jemalloc/internal/arena_inlines_a.h +++ b/dep/jemalloc/include/jemalloc/internal/arena_inlines_a.h @@ -25,7 +25,7 @@ static inline bool arena_prof_accum(tsdn_t *tsdn, arena_t *arena, uint64_t accumbytes) { cassert(config_prof); - if (likely(prof_interval == 0)) { + if (likely(prof_interval == 0 || !prof_active_get_unlocked())) { return false; } diff --git a/dep/jemalloc/include/jemalloc/internal/arena_inlines_b.h b/dep/jemalloc/include/jemalloc/internal/arena_inlines_b.h index 003abe116fb..2b7e77e7216 100644 --- a/dep/jemalloc/include/jemalloc/internal/arena_inlines_b.h +++ b/dep/jemalloc/include/jemalloc/internal/arena_inlines_b.h @@ -8,13 +8,6 @@ #include "jemalloc/internal/sz.h" #include "jemalloc/internal/ticker.h" -static inline szind_t -arena_bin_index(arena_t *arena, arena_bin_t *bin) { - szind_t binind = (szind_t)(bin - arena->bins); - assert(binind < NBINS); - return binind; -} - JEMALLOC_ALWAYS_INLINE prof_tctx_t * arena_prof_tctx_get(tsdn_t *tsdn, const void *ptr, alloc_ctx_t *alloc_ctx) { cassert(config_prof); @@ -35,7 +28,7 @@ arena_prof_tctx_get(tsdn_t *tsdn, const void *ptr, alloc_ctx_t *alloc_ctx) { } JEMALLOC_ALWAYS_INLINE void -arena_prof_tctx_set(tsdn_t *tsdn, const void *ptr, size_t usize, +arena_prof_tctx_set(tsdn_t *tsdn, const void *ptr, UNUSED size_t usize, alloc_ctx_t *alloc_ctx, prof_tctx_t *tctx) { cassert(config_prof); assert(ptr != NULL); @@ -54,7 +47,7 @@ arena_prof_tctx_set(tsdn_t *tsdn, const void *ptr, size_t usize, } static inline void -arena_prof_tctx_reset(tsdn_t *tsdn, const void *ptr, prof_tctx_t *tctx) { +arena_prof_tctx_reset(tsdn_t *tsdn, const void *ptr, UNUSED prof_tctx_t *tctx) { cassert(config_prof); assert(ptr != NULL); diff --git a/dep/jemalloc/include/jemalloc/internal/arena_stats.h b/dep/jemalloc/include/jemalloc/internal/arena_stats.h new file mode 100644 index 00000000000..5f3dca8b155 --- /dev/null +++ b/dep/jemalloc/include/jemalloc/internal/arena_stats.h @@ -0,0 +1,237 @@ +#ifndef JEMALLOC_INTERNAL_ARENA_STATS_H +#define JEMALLOC_INTERNAL_ARENA_STATS_H + +#include "jemalloc/internal/atomic.h" +#include "jemalloc/internal/mutex.h" +#include "jemalloc/internal/mutex_prof.h" +#include "jemalloc/internal/size_classes.h" + +/* + * In those architectures that support 64-bit atomics, we use atomic updates for + * our 64-bit values. Otherwise, we use a plain uint64_t and synchronize + * externally. + */ +#ifdef JEMALLOC_ATOMIC_U64 +typedef atomic_u64_t arena_stats_u64_t; +#else +/* Must hold the arena stats mutex while reading atomically. */ +typedef uint64_t arena_stats_u64_t; +#endif + +typedef struct arena_stats_large_s arena_stats_large_t; +struct arena_stats_large_s { + /* + * Total number of allocation/deallocation requests served directly by + * the arena. + */ + arena_stats_u64_t nmalloc; + arena_stats_u64_t ndalloc; + + /* + * Number of allocation requests that correspond to this size class. + * This includes requests served by tcache, though tcache only + * periodically merges into this counter. + */ + arena_stats_u64_t nrequests; /* Partially derived. */ + + /* Current number of allocations of this size class. */ + size_t curlextents; /* Derived. */ +}; + +typedef struct arena_stats_decay_s arena_stats_decay_t; +struct arena_stats_decay_s { + /* Total number of purge sweeps. */ + arena_stats_u64_t npurge; + /* Total number of madvise calls made. */ + arena_stats_u64_t nmadvise; + /* Total number of pages purged. */ + arena_stats_u64_t purged; +}; + +/* + * Arena stats. Note that fields marked "derived" are not directly maintained + * within the arena code; rather their values are derived during stats merge + * requests. + */ +typedef struct arena_stats_s arena_stats_t; +struct arena_stats_s { +#ifndef JEMALLOC_ATOMIC_U64 + malloc_mutex_t mtx; +#endif + + /* Number of bytes currently mapped, excluding retained memory. */ + atomic_zu_t mapped; /* Partially derived. */ + + /* + * Number of unused virtual memory bytes currently retained. Retained + * bytes are technically mapped (though always decommitted or purged), + * but they are excluded from the mapped statistic (above). + */ + atomic_zu_t retained; /* Derived. */ + + arena_stats_decay_t decay_dirty; + arena_stats_decay_t decay_muzzy; + + atomic_zu_t base; /* Derived. */ + atomic_zu_t internal; + atomic_zu_t resident; /* Derived. */ + atomic_zu_t metadata_thp; + + atomic_zu_t allocated_large; /* Derived. */ + arena_stats_u64_t nmalloc_large; /* Derived. */ + arena_stats_u64_t ndalloc_large; /* Derived. */ + arena_stats_u64_t nrequests_large; /* Derived. */ + + /* Number of bytes cached in tcache associated with this arena. */ + atomic_zu_t tcache_bytes; /* Derived. */ + + mutex_prof_data_t mutex_prof_data[mutex_prof_num_arena_mutexes]; + + /* One element for each large size class. */ + arena_stats_large_t lstats[NSIZES - NBINS]; + + /* Arena uptime. */ + nstime_t uptime; +}; + +static inline bool +arena_stats_init(UNUSED tsdn_t *tsdn, arena_stats_t *arena_stats) { + if (config_debug) { + for (size_t i = 0; i < sizeof(arena_stats_t); i++) { + assert(((char *)arena_stats)[i] == 0); + } + } +#ifndef JEMALLOC_ATOMIC_U64 + if (malloc_mutex_init(&arena_stats->mtx, "arena_stats", + WITNESS_RANK_ARENA_STATS, malloc_mutex_rank_exclusive)) { + return true; + } +#endif + /* Memory is zeroed, so there is no need to clear stats. */ + return false; +} + +static inline void +arena_stats_lock(tsdn_t *tsdn, arena_stats_t *arena_stats) { +#ifndef JEMALLOC_ATOMIC_U64 + malloc_mutex_lock(tsdn, &arena_stats->mtx); +#endif +} + +static inline void +arena_stats_unlock(tsdn_t *tsdn, arena_stats_t *arena_stats) { +#ifndef JEMALLOC_ATOMIC_U64 + malloc_mutex_unlock(tsdn, &arena_stats->mtx); +#endif +} + +static inline uint64_t +arena_stats_read_u64(tsdn_t *tsdn, arena_stats_t *arena_stats, + arena_stats_u64_t *p) { +#ifdef JEMALLOC_ATOMIC_U64 + return atomic_load_u64(p, ATOMIC_RELAXED); +#else + malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); + return *p; +#endif +} + +static inline void +arena_stats_add_u64(tsdn_t *tsdn, arena_stats_t *arena_stats, + arena_stats_u64_t *p, uint64_t x) { +#ifdef JEMALLOC_ATOMIC_U64 + atomic_fetch_add_u64(p, x, ATOMIC_RELAXED); +#else + malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); + *p += x; +#endif +} + +UNUSED static inline void +arena_stats_sub_u64(tsdn_t *tsdn, arena_stats_t *arena_stats, + arena_stats_u64_t *p, uint64_t x) { +#ifdef JEMALLOC_ATOMIC_U64 + UNUSED uint64_t r = atomic_fetch_sub_u64(p, x, ATOMIC_RELAXED); + assert(r - x <= r); +#else + malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); + *p -= x; + assert(*p + x >= *p); +#endif +} + +/* + * Non-atomically sets *dst += src. *dst needs external synchronization. + * This lets us avoid the cost of a fetch_add when its unnecessary (note that + * the types here are atomic). + */ +static inline void +arena_stats_accum_u64(arena_stats_u64_t *dst, uint64_t src) { +#ifdef JEMALLOC_ATOMIC_U64 + uint64_t cur_dst = atomic_load_u64(dst, ATOMIC_RELAXED); + atomic_store_u64(dst, src + cur_dst, ATOMIC_RELAXED); +#else + *dst += src; +#endif +} + +static inline size_t +arena_stats_read_zu(tsdn_t *tsdn, arena_stats_t *arena_stats, atomic_zu_t *p) { +#ifdef JEMALLOC_ATOMIC_U64 + return atomic_load_zu(p, ATOMIC_RELAXED); +#else + malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); + return atomic_load_zu(p, ATOMIC_RELAXED); +#endif +} + +static inline void +arena_stats_add_zu(tsdn_t *tsdn, arena_stats_t *arena_stats, atomic_zu_t *p, + size_t x) { +#ifdef JEMALLOC_ATOMIC_U64 + atomic_fetch_add_zu(p, x, ATOMIC_RELAXED); +#else + malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); + size_t cur = atomic_load_zu(p, ATOMIC_RELAXED); + atomic_store_zu(p, cur + x, ATOMIC_RELAXED); +#endif +} + +static inline void +arena_stats_sub_zu(tsdn_t *tsdn, arena_stats_t *arena_stats, atomic_zu_t *p, + size_t x) { +#ifdef JEMALLOC_ATOMIC_U64 + UNUSED size_t r = atomic_fetch_sub_zu(p, x, ATOMIC_RELAXED); + assert(r - x <= r); +#else + malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); + size_t cur = atomic_load_zu(p, ATOMIC_RELAXED); + atomic_store_zu(p, cur - x, ATOMIC_RELAXED); +#endif +} + +/* Like the _u64 variant, needs an externally synchronized *dst. */ +static inline void +arena_stats_accum_zu(atomic_zu_t *dst, size_t src) { + size_t cur_dst = atomic_load_zu(dst, ATOMIC_RELAXED); + atomic_store_zu(dst, src + cur_dst, ATOMIC_RELAXED); +} + +static inline void +arena_stats_large_nrequests_add(tsdn_t *tsdn, arena_stats_t *arena_stats, + szind_t szind, uint64_t nrequests) { + arena_stats_lock(tsdn, arena_stats); + arena_stats_add_u64(tsdn, arena_stats, &arena_stats->lstats[szind - + NBINS].nrequests, nrequests); + arena_stats_unlock(tsdn, arena_stats); +} + +static inline void +arena_stats_mapped_add(tsdn_t *tsdn, arena_stats_t *arena_stats, size_t size) { + arena_stats_lock(tsdn, arena_stats); + arena_stats_add_zu(tsdn, arena_stats, &arena_stats->mapped, size); + arena_stats_unlock(tsdn, arena_stats); +} + + +#endif /* JEMALLOC_INTERNAL_ARENA_STATS_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/arena_structs_b.h b/dep/jemalloc/include/jemalloc/internal/arena_structs_b.h index d1fffec1936..38bc95962d8 100644 --- a/dep/jemalloc/include/jemalloc/internal/arena_structs_b.h +++ b/dep/jemalloc/include/jemalloc/internal/arena_structs_b.h @@ -1,7 +1,9 @@ #ifndef JEMALLOC_INTERNAL_ARENA_STRUCTS_B_H #define JEMALLOC_INTERNAL_ARENA_STRUCTS_B_H +#include "jemalloc/internal/arena_stats.h" #include "jemalloc/internal/atomic.h" +#include "jemalloc/internal/bin.h" #include "jemalloc/internal/bitmap.h" #include "jemalloc/internal/extent_dss.h" #include "jemalloc/internal/jemalloc_internal_types.h" @@ -10,45 +12,8 @@ #include "jemalloc/internal/ql.h" #include "jemalloc/internal/size_classes.h" #include "jemalloc/internal/smoothstep.h" -#include "jemalloc/internal/stats.h" #include "jemalloc/internal/ticker.h" -/* - * Read-only information associated with each element of arena_t's bins array - * is stored separately, partly to reduce memory usage (only one copy, rather - * than one per arena), but mainly to avoid false cacheline sharing. - * - * Each slab has the following layout: - * - * /--------------------\ - * | region 0 | - * |--------------------| - * | region 1 | - * |--------------------| - * | ... | - * | ... | - * | ... | - * |--------------------| - * | region nregs-1 | - * \--------------------/ - */ -struct arena_bin_info_s { - /* Size of regions in a slab for this bin's size class. */ - size_t reg_size; - - /* Total size of a slab for this bin's size class. */ - size_t slab_size; - - /* Total number of regions in a slab for this bin's size class. */ - uint32_t nregs; - - /* - * Metadata used to manipulate bitmaps for slabs associated with this - * bin. - */ - bitmap_info_t bitmap_info; -}; - struct arena_decay_s { /* Synchronizes all non-atomic fields. */ malloc_mutex_t mtx; @@ -104,37 +69,11 @@ struct arena_decay_s { * arena and ctl code. * * Synchronization: Same as associated arena's stats field. */ - decay_stats_t *stats; + arena_stats_decay_t *stats; /* Peak number of pages in associated extents. Used for debug only. */ uint64_t ceil_npages; }; -struct arena_bin_s { - /* All operations on arena_bin_t fields require lock ownership. */ - malloc_mutex_t lock; - - /* - * Current slab being used to service allocations of this bin's size - * class. slabcur is independent of slabs_{nonfull,full}; whenever - * slabcur is reassigned, the previous slab must be deallocated or - * inserted into slabs_{nonfull,full}. - */ - extent_t *slabcur; - - /* - * Heap of non-full slabs. This heap is used to assure that new - * allocations come from the non-full slab that is oldest/lowest in - * memory. - */ - extent_heap_t slabs_nonfull; - - /* List used to track full slabs. */ - extent_list_t slabs_full; - - /* Bin statistics. */ - malloc_bin_stats_t stats; -}; - struct arena_s { /* * Number of threads currently assigned to this arena. Each thread has @@ -162,14 +101,15 @@ struct arena_s { arena_stats_t stats; /* - * List of tcaches for extant threads associated with this arena. - * Stats from these are merged incrementally, and at exit if - * opt_stats_print is enabled. + * Lists of tcaches and cache_bin_array_descriptors for extant threads + * associated with this arena. Stats from these are merged + * incrementally, and at exit if opt_stats_print is enabled. * * Synchronization: tcache_ql_mtx. */ - ql_head(tcache_t) tcache_ql; - malloc_mutex_t tcache_ql_mtx; + ql_head(tcache_t) tcache_ql; + ql_head(cache_bin_array_descriptor_t) cache_bin_array_descriptor_ql; + malloc_mutex_t tcache_ql_mtx; /* Synchronization: internal. */ prof_accum_t prof_accum; @@ -239,9 +179,14 @@ struct arena_s { * be effective even if multiple arenas' extent allocation requests are * highly interleaved. * + * retain_grow_limit is the max allowed size ind to expand (unless the + * required size is greater). Default is no limit, and controlled + * through mallctl only. + * * Synchronization: extent_grow_mtx */ pszind_t extent_grow_next; + pszind_t retain_grow_limit; malloc_mutex_t extent_grow_mtx; /* @@ -258,7 +203,7 @@ struct arena_s { * * Synchronization: internal. */ - arena_bin_t bins[NBINS]; + bin_t bins[NBINS]; /* * Base allocator, from which arena metadata are allocated. diff --git a/dep/jemalloc/include/jemalloc/internal/arena_types.h b/dep/jemalloc/include/jemalloc/internal/arena_types.h index a691bd811e0..70001b5f16f 100644 --- a/dep/jemalloc/include/jemalloc/internal/arena_types.h +++ b/dep/jemalloc/include/jemalloc/internal/arena_types.h @@ -12,9 +12,7 @@ #define DECAY_NTICKS_PER_UPDATE 1000 typedef struct arena_slab_data_s arena_slab_data_t; -typedef struct arena_bin_info_s arena_bin_info_t; typedef struct arena_decay_s arena_decay_t; -typedef struct arena_bin_s arena_bin_t; typedef struct arena_s arena_t; typedef struct arena_tdata_s arena_tdata_t; typedef struct alloc_ctx_s alloc_ctx_t; diff --git a/dep/jemalloc/include/jemalloc/internal/background_thread_externs.h b/dep/jemalloc/include/jemalloc/internal/background_thread_externs.h index 8b4b8471a95..3209aa49ffa 100644 --- a/dep/jemalloc/include/jemalloc/internal/background_thread_externs.h +++ b/dep/jemalloc/include/jemalloc/internal/background_thread_externs.h @@ -2,9 +2,11 @@ #define JEMALLOC_INTERNAL_BACKGROUND_THREAD_EXTERNS_H extern bool opt_background_thread; +extern size_t opt_max_background_threads; extern malloc_mutex_t background_thread_lock; extern atomic_b_t background_thread_enabled_state; extern size_t n_background_threads; +extern size_t max_background_threads; extern background_thread_info_t *background_thread_info; extern bool can_enable_background_thread; diff --git a/dep/jemalloc/include/jemalloc/internal/background_thread_structs.h b/dep/jemalloc/include/jemalloc/internal/background_thread_structs.h index e69a7d022b4..c1107dfe9c4 100644 --- a/dep/jemalloc/include/jemalloc/internal/background_thread_structs.h +++ b/dep/jemalloc/include/jemalloc/internal/background_thread_structs.h @@ -8,6 +8,7 @@ #endif #define BACKGROUND_THREAD_INDEFINITE_SLEEP UINT64_MAX +#define MAX_BACKGROUND_THREAD_LIMIT MALLOCX_ARENA_LIMIT typedef enum { background_thread_stopped, diff --git a/dep/jemalloc/include/jemalloc/internal/base_externs.h b/dep/jemalloc/include/jemalloc/internal/base_externs.h index a4fd5ac7d9a..7b705c9b4d1 100644 --- a/dep/jemalloc/include/jemalloc/internal/base_externs.h +++ b/dep/jemalloc/include/jemalloc/internal/base_externs.h @@ -1,6 +1,9 @@ #ifndef JEMALLOC_INTERNAL_BASE_EXTERNS_H #define JEMALLOC_INTERNAL_BASE_EXTERNS_H +extern metadata_thp_mode_t opt_metadata_thp; +extern const char *metadata_thp_mode_names[]; + base_t *b0get(void); base_t *base_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks); void base_delete(tsdn_t *tsdn, base_t *base); @@ -10,7 +13,7 @@ extent_hooks_t *base_extent_hooks_set(base_t *base, void *base_alloc(tsdn_t *tsdn, base_t *base, size_t size, size_t alignment); extent_t *base_alloc_extent(tsdn_t *tsdn, base_t *base); void base_stats_get(tsdn_t *tsdn, base_t *base, size_t *allocated, - size_t *resident, size_t *mapped); + size_t *resident, size_t *mapped, size_t *n_thp); void base_prefork(tsdn_t *tsdn, base_t *base); void base_postfork_parent(tsdn_t *tsdn, base_t *base); void base_postfork_child(tsdn_t *tsdn, base_t *base); diff --git a/dep/jemalloc/include/jemalloc/internal/base_inlines.h b/dep/jemalloc/include/jemalloc/internal/base_inlines.h index 931560bfaea..aec0e2e1e1c 100644 --- a/dep/jemalloc/include/jemalloc/internal/base_inlines.h +++ b/dep/jemalloc/include/jemalloc/internal/base_inlines.h @@ -6,4 +6,8 @@ base_ind_get(const base_t *base) { return base->ind; } +static inline bool +metadata_thp_enabled(void) { + return (opt_metadata_thp != metadata_thp_disabled); +} #endif /* JEMALLOC_INTERNAL_BASE_INLINES_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/base_structs.h b/dep/jemalloc/include/jemalloc/internal/base_structs.h index 18e227bd5a6..2102247ac43 100644 --- a/dep/jemalloc/include/jemalloc/internal/base_structs.h +++ b/dep/jemalloc/include/jemalloc/internal/base_structs.h @@ -30,6 +30,8 @@ struct base_s { /* Protects base_alloc() and base_stats_get() operations. */ malloc_mutex_t mtx; + /* Using THP when true (metadata_thp auto mode). */ + bool auto_thp_switched; /* * Most recent size class in the series of increasingly large base * extents. Logarithmic spacing between subsequent allocations ensures @@ -50,6 +52,8 @@ struct base_s { size_t allocated; size_t resident; size_t mapped; + /* Number of THP regions touched. */ + size_t n_thp; }; #endif /* JEMALLOC_INTERNAL_BASE_STRUCTS_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/base_types.h b/dep/jemalloc/include/jemalloc/internal/base_types.h index be7ee82589f..b6db77df7c6 100644 --- a/dep/jemalloc/include/jemalloc/internal/base_types.h +++ b/dep/jemalloc/include/jemalloc/internal/base_types.h @@ -4,4 +4,30 @@ typedef struct base_block_s base_block_t; typedef struct base_s base_t; +#define METADATA_THP_DEFAULT metadata_thp_disabled + +/* + * In auto mode, arenas switch to huge pages for the base allocator on the + * second base block. a0 switches to thp on the 5th block (after 20 megabytes + * of metadata), since more metadata (e.g. rtree nodes) come from a0's base. + */ + +#define BASE_AUTO_THP_THRESHOLD 2 +#define BASE_AUTO_THP_THRESHOLD_A0 5 + +typedef enum { + metadata_thp_disabled = 0, + /* + * Lazily enable hugepage for metadata. To avoid high RSS caused by THP + * + low usage arena (i.e. THP becomes a significant percentage), the + * "auto" option only starts using THP after a base allocator used up + * the first THP region. Starting from the second hugepage (in a single + * arena), "auto" behaves the same as "always", i.e. madvise hugepage + * right away. + */ + metadata_thp_auto = 1, + metadata_thp_always = 2, + metadata_thp_mode_limit = 3 +} metadata_thp_mode_t; + #endif /* JEMALLOC_INTERNAL_BASE_TYPES_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/bin.h b/dep/jemalloc/include/jemalloc/internal/bin.h new file mode 100644 index 00000000000..9b416ada7ed --- /dev/null +++ b/dep/jemalloc/include/jemalloc/internal/bin.h @@ -0,0 +1,106 @@ +#ifndef JEMALLOC_INTERNAL_BIN_H +#define JEMALLOC_INTERNAL_BIN_H + +#include "jemalloc/internal/extent_types.h" +#include "jemalloc/internal/extent_structs.h" +#include "jemalloc/internal/mutex.h" +#include "jemalloc/internal/bin_stats.h" + +/* + * A bin contains a set of extents that are currently being used for slab + * allocations. + */ + +/* + * Read-only information associated with each element of arena_t's bins array + * is stored separately, partly to reduce memory usage (only one copy, rather + * than one per arena), but mainly to avoid false cacheline sharing. + * + * Each slab has the following layout: + * + * /--------------------\ + * | region 0 | + * |--------------------| + * | region 1 | + * |--------------------| + * | ... | + * | ... | + * | ... | + * |--------------------| + * | region nregs-1 | + * \--------------------/ + */ +typedef struct bin_info_s bin_info_t; +struct bin_info_s { + /* Size of regions in a slab for this bin's size class. */ + size_t reg_size; + + /* Total size of a slab for this bin's size class. */ + size_t slab_size; + + /* Total number of regions in a slab for this bin's size class. */ + uint32_t nregs; + + /* + * Metadata used to manipulate bitmaps for slabs associated with this + * bin. + */ + bitmap_info_t bitmap_info; +}; + +extern const bin_info_t bin_infos[NBINS]; + + +typedef struct bin_s bin_t; +struct bin_s { + /* All operations on bin_t fields require lock ownership. */ + malloc_mutex_t lock; + + /* + * Current slab being used to service allocations of this bin's size + * class. slabcur is independent of slabs_{nonfull,full}; whenever + * slabcur is reassigned, the previous slab must be deallocated or + * inserted into slabs_{nonfull,full}. + */ + extent_t *slabcur; + + /* + * Heap of non-full slabs. This heap is used to assure that new + * allocations come from the non-full slab that is oldest/lowest in + * memory. + */ + extent_heap_t slabs_nonfull; + + /* List used to track full slabs. */ + extent_list_t slabs_full; + + /* Bin statistics. */ + bin_stats_t stats; +}; + +/* Initializes a bin to empty. Returns true on error. */ +bool bin_init(bin_t *bin); + +/* Forking. */ +void bin_prefork(tsdn_t *tsdn, bin_t *bin); +void bin_postfork_parent(tsdn_t *tsdn, bin_t *bin); +void bin_postfork_child(tsdn_t *tsdn, bin_t *bin); + +/* Stats. */ +static inline void +bin_stats_merge(tsdn_t *tsdn, bin_stats_t *dst_bin_stats, bin_t *bin) { + malloc_mutex_lock(tsdn, &bin->lock); + malloc_mutex_prof_read(tsdn, &dst_bin_stats->mutex_data, &bin->lock); + dst_bin_stats->nmalloc += bin->stats.nmalloc; + dst_bin_stats->ndalloc += bin->stats.ndalloc; + dst_bin_stats->nrequests += bin->stats.nrequests; + dst_bin_stats->curregs += bin->stats.curregs; + dst_bin_stats->nfills += bin->stats.nfills; + dst_bin_stats->nflushes += bin->stats.nflushes; + dst_bin_stats->nslabs += bin->stats.nslabs; + dst_bin_stats->reslabs += bin->stats.reslabs; + dst_bin_stats->curslabs += bin->stats.curslabs; + malloc_mutex_unlock(tsdn, &bin->lock); +} + +#endif /* JEMALLOC_INTERNAL_BIN_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/bin_stats.h b/dep/jemalloc/include/jemalloc/internal/bin_stats.h new file mode 100644 index 00000000000..86e673ec446 --- /dev/null +++ b/dep/jemalloc/include/jemalloc/internal/bin_stats.h @@ -0,0 +1,51 @@ +#ifndef JEMALLOC_INTERNAL_BIN_STATS_H +#define JEMALLOC_INTERNAL_BIN_STATS_H + +#include "jemalloc/internal/mutex_prof.h" + +typedef struct bin_stats_s bin_stats_t; +struct bin_stats_s { + /* + * Total number of allocation/deallocation requests served directly by + * the bin. Note that tcache may allocate an object, then recycle it + * many times, resulting many increments to nrequests, but only one + * each to nmalloc and ndalloc. + */ + uint64_t nmalloc; + uint64_t ndalloc; + + /* + * Number of allocation requests that correspond to the size of this + * bin. This includes requests served by tcache, though tcache only + * periodically merges into this counter. + */ + uint64_t nrequests; + + /* + * Current number of regions of this size class, including regions + * currently cached by tcache. + */ + size_t curregs; + + /* Number of tcache fills from this bin. */ + uint64_t nfills; + + /* Number of tcache flushes to this bin. */ + uint64_t nflushes; + + /* Total number of slabs created for this bin's size class. */ + uint64_t nslabs; + + /* + * Total number of slabs reused by extracting them from the slabs heap + * for this bin's size class. + */ + uint64_t reslabs; + + /* Current number of slabs in this bin. */ + size_t curslabs; + + mutex_prof_data_t mutex_data; +}; + +#endif /* JEMALLOC_INTERNAL_BIN_STATS_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/cache_bin.h b/dep/jemalloc/include/jemalloc/internal/cache_bin.h new file mode 100644 index 00000000000..12f3ef2dd0a --- /dev/null +++ b/dep/jemalloc/include/jemalloc/internal/cache_bin.h @@ -0,0 +1,114 @@ +#ifndef JEMALLOC_INTERNAL_CACHE_BIN_H +#define JEMALLOC_INTERNAL_CACHE_BIN_H + +#include "jemalloc/internal/ql.h" + +/* + * The cache_bins are the mechanism that the tcache and the arena use to + * communicate. The tcache fills from and flushes to the arena by passing a + * cache_bin_t to fill/flush. When the arena needs to pull stats from the + * tcaches associated with it, it does so by iterating over its + * cache_bin_array_descriptor_t objects and reading out per-bin stats it + * contains. This makes it so that the arena need not know about the existence + * of the tcache at all. + */ + + +/* + * The count of the number of cached allocations in a bin. We make this signed + * so that negative numbers can encode "invalid" states (e.g. a low water mark + * of -1 for a cache that has been depleted). + */ +typedef int32_t cache_bin_sz_t; + +typedef struct cache_bin_stats_s cache_bin_stats_t; +struct cache_bin_stats_s { + /* + * Number of allocation requests that corresponded to the size of this + * bin. + */ + uint64_t nrequests; +}; + +/* + * Read-only information associated with each element of tcache_t's tbins array + * is stored separately, mainly to reduce memory usage. + */ +typedef struct cache_bin_info_s cache_bin_info_t; +struct cache_bin_info_s { + /* Upper limit on ncached. */ + cache_bin_sz_t ncached_max; +}; + +typedef struct cache_bin_s cache_bin_t; +struct cache_bin_s { + /* Min # cached since last GC. */ + cache_bin_sz_t low_water; + /* # of cached objects. */ + cache_bin_sz_t ncached; + /* + * ncached and stats are both modified frequently. Let's keep them + * close so that they have a higher chance of being on the same + * cacheline, thus less write-backs. + */ + cache_bin_stats_t tstats; + /* + * Stack of available objects. + * + * To make use of adjacent cacheline prefetch, the items in the avail + * stack goes to higher address for newer allocations. avail points + * just above the available space, which means that + * avail[-ncached, ... -1] are available items and the lowest item will + * be allocated first. + */ + void **avail; +}; + +typedef struct cache_bin_array_descriptor_s cache_bin_array_descriptor_t; +struct cache_bin_array_descriptor_s { + /* + * The arena keeps a list of the cache bins associated with it, for + * stats collection. + */ + ql_elm(cache_bin_array_descriptor_t) link; + /* Pointers to the tcache bins. */ + cache_bin_t *bins_small; + cache_bin_t *bins_large; +}; + +static inline void +cache_bin_array_descriptor_init(cache_bin_array_descriptor_t *descriptor, + cache_bin_t *bins_small, cache_bin_t *bins_large) { + ql_elm_new(descriptor, link); + descriptor->bins_small = bins_small; + descriptor->bins_large = bins_large; +} + +JEMALLOC_ALWAYS_INLINE void * +cache_bin_alloc_easy(cache_bin_t *bin, bool *success) { + void *ret; + + if (unlikely(bin->ncached == 0)) { + bin->low_water = -1; + *success = false; + return NULL; + } + /* + * success (instead of ret) should be checked upon the return of this + * function. We avoid checking (ret == NULL) because there is never a + * null stored on the avail stack (which is unknown to the compiler), + * and eagerly checking ret would cause pipeline stall (waiting for the + * cacheline). + */ + *success = true; + ret = *(bin->avail - bin->ncached); + bin->ncached--; + + if (unlikely(bin->ncached < bin->low_water)) { + bin->low_water = bin->ncached; + } + + return ret; +} + +#endif /* JEMALLOC_INTERNAL_CACHE_BIN_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/ctl.h b/dep/jemalloc/include/jemalloc/internal/ctl.h index a91c4cf556b..d927d94801e 100644 --- a/dep/jemalloc/include/jemalloc/internal/ctl.h +++ b/dep/jemalloc/include/jemalloc/internal/ctl.h @@ -40,14 +40,15 @@ typedef struct ctl_arena_stats_s { uint64_t ndalloc_small; uint64_t nrequests_small; - malloc_bin_stats_t bstats[NBINS]; - malloc_large_stats_t lstats[NSIZES - NBINS]; + bin_stats_t bstats[NBINS]; + arena_stats_large_t lstats[NSIZES - NBINS]; } ctl_arena_stats_t; typedef struct ctl_stats_s { size_t allocated; size_t active; size_t metadata; + size_t metadata_thp; size_t resident; size_t mapped; size_t retained; diff --git a/dep/jemalloc/include/jemalloc/internal/div.h b/dep/jemalloc/include/jemalloc/internal/div.h new file mode 100644 index 00000000000..aebae9398cf --- /dev/null +++ b/dep/jemalloc/include/jemalloc/internal/div.h @@ -0,0 +1,41 @@ +#ifndef JEMALLOC_INTERNAL_DIV_H +#define JEMALLOC_INTERNAL_DIV_H + +#include "jemalloc/internal/assert.h" + +/* + * This module does the division that computes the index of a region in a slab, + * given its offset relative to the base. + * That is, given a divisor d, an n = i * d (all integers), we'll return i. + * We do some pre-computation to do this more quickly than a CPU division + * instruction. + * We bound n < 2^32, and don't support dividing by one. + */ + +typedef struct div_info_s div_info_t; +struct div_info_s { + uint32_t magic; +#ifdef JEMALLOC_DEBUG + size_t d; +#endif +}; + +void div_init(div_info_t *div_info, size_t divisor); + +static inline size_t +div_compute(div_info_t *div_info, size_t n) { + assert(n <= (uint32_t)-1); + /* + * This generates, e.g. mov; imul; shr on x86-64. On a 32-bit machine, + * the compilers I tried were all smart enough to turn this into the + * appropriate "get the high 32 bits of the result of a multiply" (e.g. + * mul; mov edx eax; on x86, umull on arm, etc.). + */ + size_t i = ((uint64_t)n * (uint64_t)div_info->magic) >> 32; +#ifdef JEMALLOC_DEBUG + assert(i * div_info->d == n); +#endif + return i; +} + +#endif /* JEMALLOC_INTERNAL_DIV_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/emitter.h b/dep/jemalloc/include/jemalloc/internal/emitter.h new file mode 100644 index 00000000000..3a2b2f7f2e4 --- /dev/null +++ b/dep/jemalloc/include/jemalloc/internal/emitter.h @@ -0,0 +1,435 @@ +#ifndef JEMALLOC_INTERNAL_EMITTER_H +#define JEMALLOC_INTERNAL_EMITTER_H + +#include "jemalloc/internal/ql.h" + +typedef enum emitter_output_e emitter_output_t; +enum emitter_output_e { + emitter_output_json, + emitter_output_table +}; + +typedef enum emitter_justify_e emitter_justify_t; +enum emitter_justify_e { + emitter_justify_left, + emitter_justify_right, + /* Not for users; just to pass to internal functions. */ + emitter_justify_none +}; + +typedef enum emitter_type_e emitter_type_t; +enum emitter_type_e { + emitter_type_bool, + emitter_type_int, + emitter_type_unsigned, + emitter_type_uint32, + emitter_type_uint64, + emitter_type_size, + emitter_type_ssize, + emitter_type_string, + /* + * A title is a column title in a table; it's just a string, but it's + * not quoted. + */ + emitter_type_title, +}; + +typedef struct emitter_col_s emitter_col_t; +struct emitter_col_s { + /* Filled in by the user. */ + emitter_justify_t justify; + int width; + emitter_type_t type; + union { + bool bool_val; + int int_val; + unsigned unsigned_val; + uint32_t uint32_val; + uint64_t uint64_val; + size_t size_val; + ssize_t ssize_val; + const char *str_val; + }; + + /* Filled in by initialization. */ + ql_elm(emitter_col_t) link; +}; + +typedef struct emitter_row_s emitter_row_t; +struct emitter_row_s { + ql_head(emitter_col_t) cols; +}; + +static inline void +emitter_row_init(emitter_row_t *row) { + ql_new(&row->cols); +} + +static inline void +emitter_col_init(emitter_col_t *col, emitter_row_t *row) { + ql_elm_new(col, link); + ql_tail_insert(&row->cols, col, link); +} + +typedef struct emitter_s emitter_t; +struct emitter_s { + emitter_output_t output; + /* The output information. */ + void (*write_cb)(void *, const char *); + void *cbopaque; + int nesting_depth; + /* True if we've already emitted a value at the given depth. */ + bool item_at_depth; +}; + +static inline void +emitter_init(emitter_t *emitter, emitter_output_t emitter_output, + void (*write_cb)(void *, const char *), void *cbopaque) { + emitter->output = emitter_output; + emitter->write_cb = write_cb; + emitter->cbopaque = cbopaque; + emitter->item_at_depth = false; + emitter->nesting_depth = 0; +} + +/* Internal convenience function. Write to the emitter the given string. */ +JEMALLOC_FORMAT_PRINTF(2, 3) +static inline void +emitter_printf(emitter_t *emitter, const char *format, ...) { + va_list ap; + + va_start(ap, format); + malloc_vcprintf(emitter->write_cb, emitter->cbopaque, format, ap); + va_end(ap); +} + +/* Write to the emitter the given string, but only in table mode. */ +JEMALLOC_FORMAT_PRINTF(2, 3) +static inline void +emitter_table_printf(emitter_t *emitter, const char *format, ...) { + if (emitter->output == emitter_output_table) { + va_list ap; + va_start(ap, format); + malloc_vcprintf(emitter->write_cb, emitter->cbopaque, format, ap); + va_end(ap); + } +} + +static inline void +emitter_gen_fmt(char *out_fmt, size_t out_size, const char *fmt_specifier, + emitter_justify_t justify, int width) { + size_t written; + if (justify == emitter_justify_none) { + written = malloc_snprintf(out_fmt, out_size, + "%%%s", fmt_specifier); + } else if (justify == emitter_justify_left) { + written = malloc_snprintf(out_fmt, out_size, + "%%-%d%s", width, fmt_specifier); + } else { + written = malloc_snprintf(out_fmt, out_size, + "%%%d%s", width, fmt_specifier); + } + /* Only happens in case of bad format string, which *we* choose. */ + assert(written < out_size); +} + +/* + * Internal. Emit the given value type in the relevant encoding (so that the + * bool true gets mapped to json "true", but the string "true" gets mapped to + * json "\"true\"", for instance. + * + * Width is ignored if justify is emitter_justify_none. + */ +static inline void +emitter_print_value(emitter_t *emitter, emitter_justify_t justify, int width, + emitter_type_t value_type, const void *value) { + size_t str_written; +#define BUF_SIZE 256 +#define FMT_SIZE 10 + /* + * We dynamically generate a format string to emit, to let us use the + * snprintf machinery. This is kinda hacky, but gets the job done + * quickly without having to think about the various snprintf edge + * cases. + */ + char fmt[FMT_SIZE]; + char buf[BUF_SIZE]; + +#define EMIT_SIMPLE(type, format) \ + emitter_gen_fmt(fmt, FMT_SIZE, format, justify, width); \ + emitter_printf(emitter, fmt, *(const type *)value); \ + + switch (value_type) { + case emitter_type_bool: + emitter_gen_fmt(fmt, FMT_SIZE, "s", justify, width); + emitter_printf(emitter, fmt, *(const bool *)value ? + "true" : "false"); + break; + case emitter_type_int: + EMIT_SIMPLE(int, "d") + break; + case emitter_type_unsigned: + EMIT_SIMPLE(unsigned, "u") + break; + case emitter_type_ssize: + EMIT_SIMPLE(ssize_t, "zd") + break; + case emitter_type_size: + EMIT_SIMPLE(size_t, "zu") + break; + case emitter_type_string: + str_written = malloc_snprintf(buf, BUF_SIZE, "\"%s\"", + *(const char *const *)value); + /* + * We control the strings we output; we shouldn't get anything + * anywhere near the fmt size. + */ + assert(str_written < BUF_SIZE); + emitter_gen_fmt(fmt, FMT_SIZE, "s", justify, width); + emitter_printf(emitter, fmt, buf); + break; + case emitter_type_uint32: + EMIT_SIMPLE(uint32_t, FMTu32) + break; + case emitter_type_uint64: + EMIT_SIMPLE(uint64_t, FMTu64) + break; + case emitter_type_title: + EMIT_SIMPLE(char *const, "s"); + break; + default: + unreachable(); + } +#undef BUF_SIZE +#undef FMT_SIZE +} + + +/* Internal functions. In json mode, tracks nesting state. */ +static inline void +emitter_nest_inc(emitter_t *emitter) { + emitter->nesting_depth++; + emitter->item_at_depth = false; +} + +static inline void +emitter_nest_dec(emitter_t *emitter) { + emitter->nesting_depth--; + emitter->item_at_depth = true; +} + +static inline void +emitter_indent(emitter_t *emitter) { + int amount = emitter->nesting_depth; + const char *indent_str; + if (emitter->output == emitter_output_json) { + indent_str = "\t"; + } else { + amount *= 2; + indent_str = " "; + } + for (int i = 0; i < amount; i++) { + emitter_printf(emitter, "%s", indent_str); + } +} + +static inline void +emitter_json_key_prefix(emitter_t *emitter) { + emitter_printf(emitter, "%s\n", emitter->item_at_depth ? "," : ""); + emitter_indent(emitter); +} + +static inline void +emitter_begin(emitter_t *emitter) { + if (emitter->output == emitter_output_json) { + assert(emitter->nesting_depth == 0); + emitter_printf(emitter, "{"); + emitter_nest_inc(emitter); + } else { + // tabular init + emitter_printf(emitter, "%s", ""); + } +} + +static inline void +emitter_end(emitter_t *emitter) { + if (emitter->output == emitter_output_json) { + assert(emitter->nesting_depth == 1); + emitter_nest_dec(emitter); + emitter_printf(emitter, "\n}\n"); + } +} + +/* + * Note emits a different kv pair as well, but only in table mode. Omits the + * note if table_note_key is NULL. + */ +static inline void +emitter_kv_note(emitter_t *emitter, const char *json_key, const char *table_key, + emitter_type_t value_type, const void *value, + const char *table_note_key, emitter_type_t table_note_value_type, + const void *table_note_value) { + if (emitter->output == emitter_output_json) { + assert(emitter->nesting_depth > 0); + emitter_json_key_prefix(emitter); + emitter_printf(emitter, "\"%s\": ", json_key); + emitter_print_value(emitter, emitter_justify_none, -1, + value_type, value); + } else { + emitter_indent(emitter); + emitter_printf(emitter, "%s: ", table_key); + emitter_print_value(emitter, emitter_justify_none, -1, + value_type, value); + if (table_note_key != NULL) { + emitter_printf(emitter, " (%s: ", table_note_key); + emitter_print_value(emitter, emitter_justify_none, -1, + table_note_value_type, table_note_value); + emitter_printf(emitter, ")"); + } + emitter_printf(emitter, "\n"); + } + emitter->item_at_depth = true; +} + +static inline void +emitter_kv(emitter_t *emitter, const char *json_key, const char *table_key, + emitter_type_t value_type, const void *value) { + emitter_kv_note(emitter, json_key, table_key, value_type, value, NULL, + emitter_type_bool, NULL); +} + +static inline void +emitter_json_kv(emitter_t *emitter, const char *json_key, + emitter_type_t value_type, const void *value) { + if (emitter->output == emitter_output_json) { + emitter_kv(emitter, json_key, NULL, value_type, value); + } +} + +static inline void +emitter_table_kv(emitter_t *emitter, const char *table_key, + emitter_type_t value_type, const void *value) { + if (emitter->output == emitter_output_table) { + emitter_kv(emitter, NULL, table_key, value_type, value); + } +} + +static inline void +emitter_dict_begin(emitter_t *emitter, const char *json_key, + const char *table_header) { + if (emitter->output == emitter_output_json) { + emitter_json_key_prefix(emitter); + emitter_printf(emitter, "\"%s\": {", json_key); + emitter_nest_inc(emitter); + } else { + emitter_indent(emitter); + emitter_printf(emitter, "%s\n", table_header); + emitter_nest_inc(emitter); + } +} + +static inline void +emitter_dict_end(emitter_t *emitter) { + if (emitter->output == emitter_output_json) { + assert(emitter->nesting_depth > 0); + emitter_nest_dec(emitter); + emitter_printf(emitter, "\n"); + emitter_indent(emitter); + emitter_printf(emitter, "}"); + } else { + emitter_nest_dec(emitter); + } +} + +static inline void +emitter_json_dict_begin(emitter_t *emitter, const char *json_key) { + if (emitter->output == emitter_output_json) { + emitter_dict_begin(emitter, json_key, NULL); + } +} + +static inline void +emitter_json_dict_end(emitter_t *emitter) { + if (emitter->output == emitter_output_json) { + emitter_dict_end(emitter); + } +} + +static inline void +emitter_table_dict_begin(emitter_t *emitter, const char *table_key) { + if (emitter->output == emitter_output_table) { + emitter_dict_begin(emitter, NULL, table_key); + } +} + +static inline void +emitter_table_dict_end(emitter_t *emitter) { + if (emitter->output == emitter_output_table) { + emitter_dict_end(emitter); + } +} + +static inline void +emitter_json_arr_begin(emitter_t *emitter, const char *json_key) { + if (emitter->output == emitter_output_json) { + emitter_json_key_prefix(emitter); + emitter_printf(emitter, "\"%s\": [", json_key); + emitter_nest_inc(emitter); + } +} + +static inline void +emitter_json_arr_end(emitter_t *emitter) { + if (emitter->output == emitter_output_json) { + assert(emitter->nesting_depth > 0); + emitter_nest_dec(emitter); + emitter_printf(emitter, "\n"); + emitter_indent(emitter); + emitter_printf(emitter, "]"); + } +} + +static inline void +emitter_json_arr_obj_begin(emitter_t *emitter) { + if (emitter->output == emitter_output_json) { + emitter_json_key_prefix(emitter); + emitter_printf(emitter, "{"); + emitter_nest_inc(emitter); + } +} + +static inline void +emitter_json_arr_obj_end(emitter_t *emitter) { + if (emitter->output == emitter_output_json) { + assert(emitter->nesting_depth > 0); + emitter_nest_dec(emitter); + emitter_printf(emitter, "\n"); + emitter_indent(emitter); + emitter_printf(emitter, "}"); + } +} + +static inline void +emitter_json_arr_value(emitter_t *emitter, emitter_type_t value_type, + const void *value) { + if (emitter->output == emitter_output_json) { + emitter_json_key_prefix(emitter); + emitter_print_value(emitter, emitter_justify_none, -1, + value_type, value); + } +} + +static inline void +emitter_table_row(emitter_t *emitter, emitter_row_t *row) { + if (emitter->output != emitter_output_table) { + return; + } + emitter_col_t *col; + ql_foreach(col, &row->cols, link) { + emitter_print_value(emitter, col->justify, col->width, + col->type, (const void *)&col->bool_val); + } + emitter_table_printf(emitter, "\n"); +} + +#endif /* JEMALLOC_INTERNAL_EMITTER_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/extent_externs.h b/dep/jemalloc/include/jemalloc/internal/extent_externs.h index 489a813c80d..b8a4d026ceb 100644 --- a/dep/jemalloc/include/jemalloc/internal/extent_externs.h +++ b/dep/jemalloc/include/jemalloc/internal/extent_externs.h @@ -4,12 +4,13 @@ #include "jemalloc/internal/mutex.h" #include "jemalloc/internal/mutex_pool.h" #include "jemalloc/internal/ph.h" -#include "jemalloc/internal/rb.h" #include "jemalloc/internal/rtree.h" -extern rtree_t extents_rtree; -extern const extent_hooks_t extent_hooks_default; -extern mutex_pool_t extent_mutex_pool; +extern size_t opt_lg_extent_max_active_fit; + +extern rtree_t extents_rtree; +extern const extent_hooks_t extent_hooks_default; +extern mutex_pool_t extent_mutex_pool; extent_t *extent_alloc(tsdn_t *tsdn, arena_t *arena); void extent_dalloc(tsdn_t *tsdn, arena_t *arena, extent_t *extent); diff --git a/dep/jemalloc/include/jemalloc/internal/extent_inlines.h b/dep/jemalloc/include/jemalloc/internal/extent_inlines.h index bb2bd699ed2..77181df8d24 100644 --- a/dep/jemalloc/include/jemalloc/internal/extent_inlines.h +++ b/dep/jemalloc/include/jemalloc/internal/extent_inlines.h @@ -93,6 +93,12 @@ extent_committed_get(const extent_t *extent) { EXTENT_BITS_COMMITTED_SHIFT); } +static inline bool +extent_dumpable_get(const extent_t *extent) { + return (bool)((extent->e_bits & EXTENT_BITS_DUMPABLE_MASK) >> + EXTENT_BITS_DUMPABLE_SHIFT); +} + static inline bool extent_slab_get(const extent_t *extent) { return (bool)((extent->e_bits & EXTENT_BITS_SLAB_MASK) >> @@ -184,15 +190,22 @@ extent_addr_set(extent_t *extent, void *addr) { } static inline void -extent_addr_randomize(tsdn_t *tsdn, extent_t *extent, size_t alignment) { +extent_addr_randomize(UNUSED tsdn_t *tsdn, extent_t *extent, size_t alignment) { assert(extent_base_get(extent) == extent_addr_get(extent)); if (alignment < PAGE) { unsigned lg_range = LG_PAGE - lg_floor(CACHELINE_CEILING(alignment)); - size_t r = - prng_lg_range_zu(&extent_arena_get(extent)->offset_state, - lg_range, true); + size_t r; + if (!tsdn_null(tsdn)) { + tsd_t *tsd = tsdn_tsd(tsdn); + r = (size_t)prng_lg_range_u64( + tsd_offset_statep_get(tsd), lg_range); + } else { + r = prng_lg_range_zu( + &extent_arena_get(extent)->offset_state, + lg_range, true); + } uintptr_t random_offset = ((uintptr_t)r) << (LG_PAGE - lg_range); extent->e_addr = (void *)((uintptr_t)extent->e_addr + @@ -269,6 +282,12 @@ extent_committed_set(extent_t *extent, bool committed) { ((uint64_t)committed << EXTENT_BITS_COMMITTED_SHIFT); } +static inline void +extent_dumpable_set(extent_t *extent, bool dumpable) { + extent->e_bits = (extent->e_bits & ~EXTENT_BITS_DUMPABLE_MASK) | + ((uint64_t)dumpable << EXTENT_BITS_DUMPABLE_SHIFT); +} + static inline void extent_slab_set(extent_t *extent, bool slab) { extent->e_bits = (extent->e_bits & ~EXTENT_BITS_SLAB_MASK) | @@ -283,7 +302,7 @@ extent_prof_tctx_set(extent_t *extent, prof_tctx_t *tctx) { static inline void extent_init(extent_t *extent, arena_t *arena, void *addr, size_t size, bool slab, szind_t szind, size_t sn, extent_state_t state, bool zeroed, - bool committed) { + bool committed, bool dumpable) { assert(addr == PAGE_ADDR2BASE(addr) || !slab); extent_arena_set(extent, arena); @@ -295,6 +314,7 @@ extent_init(extent_t *extent, arena_t *arena, void *addr, size_t size, extent_state_set(extent, state); extent_zeroed_set(extent, zeroed); extent_committed_set(extent, committed); + extent_dumpable_set(extent, dumpable); ql_elm_new(extent, ql_link); if (config_prof) { extent_prof_tctx_set(extent, NULL); @@ -312,6 +332,7 @@ extent_binit(extent_t *extent, void *addr, size_t bsize, size_t sn) { extent_state_set(extent, extent_state_active); extent_zeroed_set(extent, true); extent_committed_set(extent, true); + extent_dumpable_set(extent, true); } static inline void @@ -334,6 +355,11 @@ extent_list_append(extent_list_t *list, extent_t *extent) { ql_tail_insert(list, extent, ql_link); } +static inline void +extent_list_prepend(extent_list_t *list, extent_t *extent) { + ql_head_insert(list, extent, ql_link); +} + static inline void extent_list_replace(extent_list_t *list, extent_t *to_remove, extent_t *to_insert) { diff --git a/dep/jemalloc/include/jemalloc/internal/extent_structs.h b/dep/jemalloc/include/jemalloc/internal/extent_structs.h index d2979503458..4873b9e9e49 100644 --- a/dep/jemalloc/include/jemalloc/internal/extent_structs.h +++ b/dep/jemalloc/include/jemalloc/internal/extent_structs.h @@ -5,7 +5,6 @@ #include "jemalloc/internal/bitmap.h" #include "jemalloc/internal/mutex.h" #include "jemalloc/internal/ql.h" -#include "jemalloc/internal/rb.h" #include "jemalloc/internal/ph.h" #include "jemalloc/internal/size_classes.h" @@ -24,13 +23,14 @@ struct extent_s { * a: arena_ind * b: slab * c: committed + * d: dumpable * z: zeroed * t: state * i: szind * f: nfree * n: sn * - * nnnnnnnn ... nnnnnfff fffffffi iiiiiiit tzcbaaaa aaaaaaaa + * nnnnnnnn ... nnnnffff ffffffii iiiiiitt zdcbaaaa aaaaaaaa * * arena_ind: Arena from which this extent came, or all 1 bits if * unassociated. @@ -45,6 +45,23 @@ struct extent_s { * as on a system that overcommits and satisfies physical * memory needs on demand via soft page faults. * + * dumpable: The dumpable flag indicates whether or not we've set the + * memory in question to be dumpable. Note that this + * interacts somewhat subtly with user-specified extent hooks, + * since we don't know if *they* are fiddling with + * dumpability (in which case, we don't want to undo whatever + * they're doing). To deal with this scenario, we: + * - Make dumpable false only for memory allocated with the + * default hooks. + * - Only allow memory to go from non-dumpable to dumpable, + * and only once. + * - Never make the OS call to allow dumping when the + * dumpable bit is already set. + * These three constraints mean that we will never + * accidentally dump user memory that the user meant to set + * nondumpable with their extent hooks. + * + * * zeroed: The zeroed flag is used by extent recycling code to track * whether memory is zero-filled. * @@ -69,38 +86,42 @@ struct extent_s { * serial number to both resulting adjacent extents. */ uint64_t e_bits; -#define EXTENT_BITS_ARENA_SHIFT 0 -#define EXTENT_BITS_ARENA_MASK \ - (((uint64_t)(1U << MALLOCX_ARENA_BITS) - 1) << EXTENT_BITS_ARENA_SHIFT) +#define MASK(CURRENT_FIELD_WIDTH, CURRENT_FIELD_SHIFT) ((((((uint64_t)0x1U) << (CURRENT_FIELD_WIDTH)) - 1)) << (CURRENT_FIELD_SHIFT)) -#define EXTENT_BITS_SLAB_SHIFT MALLOCX_ARENA_BITS -#define EXTENT_BITS_SLAB_MASK \ - ((uint64_t)0x1U << EXTENT_BITS_SLAB_SHIFT) +#define EXTENT_BITS_ARENA_WIDTH MALLOCX_ARENA_BITS +#define EXTENT_BITS_ARENA_SHIFT 0 +#define EXTENT_BITS_ARENA_MASK MASK(EXTENT_BITS_ARENA_WIDTH, EXTENT_BITS_ARENA_SHIFT) -#define EXTENT_BITS_COMMITTED_SHIFT (MALLOCX_ARENA_BITS + 1) -#define EXTENT_BITS_COMMITTED_MASK \ - ((uint64_t)0x1U << EXTENT_BITS_COMMITTED_SHIFT) +#define EXTENT_BITS_SLAB_WIDTH 1 +#define EXTENT_BITS_SLAB_SHIFT (EXTENT_BITS_ARENA_WIDTH + EXTENT_BITS_ARENA_SHIFT) +#define EXTENT_BITS_SLAB_MASK MASK(EXTENT_BITS_SLAB_WIDTH, EXTENT_BITS_SLAB_SHIFT) -#define EXTENT_BITS_ZEROED_SHIFT (MALLOCX_ARENA_BITS + 2) -#define EXTENT_BITS_ZEROED_MASK \ - ((uint64_t)0x1U << EXTENT_BITS_ZEROED_SHIFT) +#define EXTENT_BITS_COMMITTED_WIDTH 1 +#define EXTENT_BITS_COMMITTED_SHIFT (EXTENT_BITS_SLAB_WIDTH + EXTENT_BITS_SLAB_SHIFT) +#define EXTENT_BITS_COMMITTED_MASK MASK(EXTENT_BITS_COMMITTED_WIDTH, EXTENT_BITS_COMMITTED_SHIFT) -#define EXTENT_BITS_STATE_SHIFT (MALLOCX_ARENA_BITS + 3) -#define EXTENT_BITS_STATE_MASK \ - ((uint64_t)0x3U << EXTENT_BITS_STATE_SHIFT) +#define EXTENT_BITS_DUMPABLE_WIDTH 1 +#define EXTENT_BITS_DUMPABLE_SHIFT (EXTENT_BITS_COMMITTED_WIDTH + EXTENT_BITS_COMMITTED_SHIFT) +#define EXTENT_BITS_DUMPABLE_MASK MASK(EXTENT_BITS_DUMPABLE_WIDTH, EXTENT_BITS_DUMPABLE_SHIFT) -#define EXTENT_BITS_SZIND_SHIFT (MALLOCX_ARENA_BITS + 5) -#define EXTENT_BITS_SZIND_MASK \ - (((uint64_t)(1U << LG_CEIL_NSIZES) - 1) << EXTENT_BITS_SZIND_SHIFT) +#define EXTENT_BITS_ZEROED_WIDTH 1 +#define EXTENT_BITS_ZEROED_SHIFT (EXTENT_BITS_DUMPABLE_WIDTH + EXTENT_BITS_DUMPABLE_SHIFT) +#define EXTENT_BITS_ZEROED_MASK MASK(EXTENT_BITS_ZEROED_WIDTH, EXTENT_BITS_ZEROED_SHIFT) -#define EXTENT_BITS_NFREE_SHIFT \ - (MALLOCX_ARENA_BITS + 5 + LG_CEIL_NSIZES) -#define EXTENT_BITS_NFREE_MASK \ - ((uint64_t)((1U << (LG_SLAB_MAXREGS + 1)) - 1) << EXTENT_BITS_NFREE_SHIFT) +#define EXTENT_BITS_STATE_WIDTH 2 +#define EXTENT_BITS_STATE_SHIFT (EXTENT_BITS_ZEROED_WIDTH + EXTENT_BITS_ZEROED_SHIFT) +#define EXTENT_BITS_STATE_MASK MASK(EXTENT_BITS_STATE_WIDTH, EXTENT_BITS_STATE_SHIFT) -#define EXTENT_BITS_SN_SHIFT \ - (MALLOCX_ARENA_BITS + 5 + LG_CEIL_NSIZES + (LG_SLAB_MAXREGS + 1)) -#define EXTENT_BITS_SN_MASK (UINT64_MAX << EXTENT_BITS_SN_SHIFT) +#define EXTENT_BITS_SZIND_WIDTH LG_CEIL_NSIZES +#define EXTENT_BITS_SZIND_SHIFT (EXTENT_BITS_STATE_WIDTH + EXTENT_BITS_STATE_SHIFT) +#define EXTENT_BITS_SZIND_MASK MASK(EXTENT_BITS_SZIND_WIDTH, EXTENT_BITS_SZIND_SHIFT) + +#define EXTENT_BITS_NFREE_WIDTH (LG_SLAB_MAXREGS + 1) +#define EXTENT_BITS_NFREE_SHIFT (EXTENT_BITS_SZIND_WIDTH + EXTENT_BITS_SZIND_SHIFT) +#define EXTENT_BITS_NFREE_MASK MASK(EXTENT_BITS_NFREE_WIDTH, EXTENT_BITS_NFREE_SHIFT) + +#define EXTENT_BITS_SN_SHIFT (EXTENT_BITS_NFREE_WIDTH + EXTENT_BITS_NFREE_SHIFT) +#define EXTENT_BITS_SN_MASK (UINT64_MAX << EXTENT_BITS_SN_SHIFT) /* Pointer to the extent that this structure is responsible for. */ void *e_addr; @@ -120,20 +141,19 @@ struct extent_s { size_t e_bsize; }; - union { - /* - * List linkage, used by a variety of lists: - * - arena_bin_t's slabs_full - * - extents_t's LRU - * - stashed dirty extents - * - arena's large allocations - */ - ql_elm(extent_t) ql_link; - /* Red-black tree linkage, used by arena's extent_avail. */ - rb_node(extent_t) rb_link; - }; + /* + * List linkage, used by a variety of lists: + * - bin_t's slabs_full + * - extents_t's LRU + * - stashed dirty extents + * - arena's large allocations + */ + ql_elm(extent_t) ql_link; - /* Linkage for per size class sn/address-ordered heaps. */ + /* + * Linkage for per size class sn/address-ordered heaps, and + * for extent_avail + */ phn(extent_t) ph_link; union { @@ -148,7 +168,7 @@ struct extent_s { }; }; typedef ql_head(extent_t) extent_list_t; -typedef rb_tree(extent_t) extent_tree_t; +typedef ph(extent_t) extent_tree_t; typedef ph(extent_t) extent_heap_t; /* Quantized collection of extents, with built-in LRU queue. */ diff --git a/dep/jemalloc/include/jemalloc/internal/extent_types.h b/dep/jemalloc/include/jemalloc/internal/extent_types.h index b6905ce1055..c0561d99f8f 100644 --- a/dep/jemalloc/include/jemalloc/internal/extent_types.h +++ b/dep/jemalloc/include/jemalloc/internal/extent_types.h @@ -6,4 +6,12 @@ typedef struct extents_s extents_t; #define EXTENT_HOOKS_INITIALIZER NULL +#define EXTENT_GROW_MAX_PIND (NPSIZES - 1) + +/* + * When reuse (and split) an active extent, (1U << opt_lg_extent_max_active_fit) + * is the max ratio between the size of the active extent and the new extent. + */ +#define LG_EXTENT_MAX_ACTIVE_FIT_DEFAULT 6 + #endif /* JEMALLOC_INTERNAL_EXTENT_TYPES_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/hash.h b/dep/jemalloc/include/jemalloc/internal/hash.h index 188296cf0e2..dcfc992df37 100644 --- a/dep/jemalloc/include/jemalloc/internal/hash.h +++ b/dep/jemalloc/include/jemalloc/internal/hash.h @@ -260,22 +260,22 @@ hash_x64_128(const void *key, const int len, const uint32_t seed, uint64_t k2 = 0; switch (len & 15) { - case 15: k2 ^= ((uint64_t)(tail[14])) << 48; - case 14: k2 ^= ((uint64_t)(tail[13])) << 40; - case 13: k2 ^= ((uint64_t)(tail[12])) << 32; - case 12: k2 ^= ((uint64_t)(tail[11])) << 24; - case 11: k2 ^= ((uint64_t)(tail[10])) << 16; - case 10: k2 ^= ((uint64_t)(tail[ 9])) << 8; + case 15: k2 ^= ((uint64_t)(tail[14])) << 48; /* falls through */ + case 14: k2 ^= ((uint64_t)(tail[13])) << 40; /* falls through */ + case 13: k2 ^= ((uint64_t)(tail[12])) << 32; /* falls through */ + case 12: k2 ^= ((uint64_t)(tail[11])) << 24; /* falls through */ + case 11: k2 ^= ((uint64_t)(tail[10])) << 16; /* falls through */ + case 10: k2 ^= ((uint64_t)(tail[ 9])) << 8; /* falls through */ case 9: k2 ^= ((uint64_t)(tail[ 8])) << 0; k2 *= c2; k2 = hash_rotl_64(k2, 33); k2 *= c1; h2 ^= k2; - - case 8: k1 ^= ((uint64_t)(tail[ 7])) << 56; - case 7: k1 ^= ((uint64_t)(tail[ 6])) << 48; - case 6: k1 ^= ((uint64_t)(tail[ 5])) << 40; - case 5: k1 ^= ((uint64_t)(tail[ 4])) << 32; - case 4: k1 ^= ((uint64_t)(tail[ 3])) << 24; - case 3: k1 ^= ((uint64_t)(tail[ 2])) << 16; - case 2: k1 ^= ((uint64_t)(tail[ 1])) << 8; + /* falls through */ + case 8: k1 ^= ((uint64_t)(tail[ 7])) << 56; /* falls through */ + case 7: k1 ^= ((uint64_t)(tail[ 6])) << 48; /* falls through */ + case 6: k1 ^= ((uint64_t)(tail[ 5])) << 40; /* falls through */ + case 5: k1 ^= ((uint64_t)(tail[ 4])) << 32; /* falls through */ + case 4: k1 ^= ((uint64_t)(tail[ 3])) << 24; /* falls through */ + case 3: k1 ^= ((uint64_t)(tail[ 2])) << 16; /* falls through */ + case 2: k1 ^= ((uint64_t)(tail[ 1])) << 8; /* falls through */ case 1: k1 ^= ((uint64_t)(tail[ 0])) << 0; k1 *= c1; k1 = hash_rotl_64(k1, 31); k1 *= c2; h1 ^= k1; } diff --git a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_decls.h b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_decls.h index 8ae5ef48cd8..be70df510e3 100644 --- a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_decls.h +++ b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_decls.h @@ -5,7 +5,16 @@ #ifdef _WIN32 # include # include "msvc_compat/windows_extra.h" - +# ifdef _WIN64 +# if LG_VADDR <= 32 +# error Generate the headers using x64 vcargs +# endif +# else +# if LG_VADDR > 32 +# undef LG_VADDR +# define LG_VADDR 32 +# endif +# endif #else # include # include diff --git a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_a.h b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_a.h index 24ea416297f..c6a1f7eb2ca 100644 --- a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_a.h +++ b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_a.h @@ -106,16 +106,16 @@ decay_ticker_get(tsd_t *tsd, unsigned ind) { return &tdata->decay_ticker; } -JEMALLOC_ALWAYS_INLINE tcache_bin_t * +JEMALLOC_ALWAYS_INLINE cache_bin_t * tcache_small_bin_get(tcache_t *tcache, szind_t binind) { assert(binind < NBINS); - return &tcache->tbins_small[binind]; + return &tcache->bins_small[binind]; } -JEMALLOC_ALWAYS_INLINE tcache_bin_t * +JEMALLOC_ALWAYS_INLINE cache_bin_t * tcache_large_bin_get(tcache_t *tcache, szind_t binind) { assert(binind >= NBINS &&binind < nhbins); - return &tcache->tbins_large[binind - NBINS]; + return &tcache->bins_large[binind - NBINS]; } JEMALLOC_ALWAYS_INLINE bool @@ -151,6 +151,7 @@ pre_reentrancy(tsd_t *tsd, arena_t *arena) { assert(arena != arena_get(tsd_tsdn(tsd), 0, false)); bool fast = tsd_fast(tsd); + assert(tsd_reentrancy_level_get(tsd) < INT8_MAX); ++*tsd_reentrancy_levelp_get(tsd); if (fast) { /* Prepare slow path for reentrancy. */ diff --git a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_c.h b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_c.h index 7ffce6fb035..c829ac60cbe 100644 --- a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_c.h +++ b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_c.h @@ -5,6 +5,24 @@ #include "jemalloc/internal/sz.h" #include "jemalloc/internal/witness.h" +/* + * Translating the names of the 'i' functions: + * Abbreviations used in the first part of the function name (before + * alloc/dalloc) describe what that function accomplishes: + * a: arena (query) + * s: size (query, or sized deallocation) + * e: extent (query) + * p: aligned (allocates) + * vs: size (query, without knowing that the pointer is into the heap) + * r: rallocx implementation + * x: xallocx implementation + * Abbreviations used in the second part of the function name (after + * alloc/dalloc) describe the arguments it takes + * z: whether to return zeroed memory + * t: accepts a tcache_t * parameter + * m: accepts an arena_t * parameter + */ + JEMALLOC_ALWAYS_INLINE arena_t * iaalloc(tsdn_t *tsdn, const void *ptr) { assert(ptr != NULL); @@ -27,8 +45,10 @@ iallocztm(tsdn_t *tsdn, size_t size, szind_t ind, bool zero, tcache_t *tcache, assert(size != 0); assert(!is_internal || tcache == NULL); assert(!is_internal || arena == NULL || arena_is_auto(arena)); - witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), - WITNESS_RANK_CORE, 0); + if (!tsdn_null(tsdn) && tsd_reentrancy_level_get(tsdn_tsd(tsdn)) == 0) { + witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), + WITNESS_RANK_CORE, 0); + } ret = arena_malloc(tsdn, arena, size, ind, zero, tcache, slow_path); if (config_stats && is_internal && likely(ret != NULL)) { @@ -91,7 +111,8 @@ idalloctm(tsdn_t *tsdn, void *ptr, tcache_t *tcache, alloc_ctx_t *alloc_ctx, if (config_stats && is_internal) { arena_internal_sub(iaalloc(tsdn, ptr), isalloc(tsdn, ptr)); } - if (!is_internal && tsd_reentrancy_level_get(tsdn_tsd(tsdn)) != 0) { + if (!is_internal && !tsdn_null(tsdn) && + tsd_reentrancy_level_get(tsdn_tsd(tsdn)) != 0) { assert(tcache == NULL); } arena_dalloc(tsdn, ptr, tcache, alloc_ctx, slow_path); diff --git a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_macros.h b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_macros.h index 4571895ec37..ed75d3768e5 100644 --- a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_macros.h +++ b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_macros.h @@ -37,4 +37,7 @@ # define JET_MUTABLE const #endif +#define JEMALLOC_VA_ARGS_HEAD(head, ...) head +#define JEMALLOC_VA_ARGS_TAIL(head, ...) __VA_ARGS__ + #endif /* JEMALLOC_INTERNAL_MACROS_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_types.h b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_types.h index 50f9d001d54..1b750b122c9 100644 --- a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_types.h +++ b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_types.h @@ -79,22 +79,29 @@ typedef int malloc_cpuid_t; # ifdef __hppa__ # define LG_QUANTUM 4 # endif +# ifdef __m68k__ +# define LG_QUANTUM 3 +# endif # ifdef __mips__ # define LG_QUANTUM 3 # endif +# ifdef __nios2__ +# define LG_QUANTUM 3 +# endif # ifdef __or1k__ # define LG_QUANTUM 3 # endif # ifdef __powerpc__ # define LG_QUANTUM 4 # endif -# ifdef __riscv__ +# if defined(__riscv) || defined(__riscv__) # define LG_QUANTUM 4 # endif # ifdef __s390__ # define LG_QUANTUM 4 # endif -# ifdef __SH4__ +# if (defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || \ + defined(__SH4_SINGLE_ONLY__)) # define LG_QUANTUM 4 # endif # ifdef __tile__ diff --git a/dep/jemalloc/include/jemalloc/internal/jemalloc_preamble.h b/dep/jemalloc/include/jemalloc/internal/jemalloc_preamble.h index 39045c857f3..a373a8b2d3e 100644 --- a/dep/jemalloc/include/jemalloc/internal/jemalloc_preamble.h +++ b/dep/jemalloc/include/jemalloc/internal/jemalloc_preamble.h @@ -47,6 +47,10 @@ #endif #include "jemalloc/internal/hooks.h" +#ifdef JEMALLOC_DEFINE_MADVISE_FREE +# define JEMALLOC_MADV_FREE 8 +#endif + static const bool config_debug = #ifdef JEMALLOC_DEBUG true @@ -61,6 +65,13 @@ static const bool have_dss = false #endif ; +static const bool have_madvise_huge = +#ifdef JEMALLOC_HAVE_MADVISE_HUGE + true +#else + false +#endif + ; static const bool config_fill = #ifdef JEMALLOC_FILL true @@ -111,13 +122,6 @@ static const bool config_stats = false #endif ; -static const bool config_thp = -#ifdef JEMALLOC_THP - true -#else - false -#endif - ; static const bool config_tls = #ifdef JEMALLOC_TLS true @@ -146,6 +150,17 @@ static const bool config_cache_oblivious = false #endif ; +/* + * Undocumented, for jemalloc development use only at the moment. See the note + * in jemalloc/internal/log.h. + */ +static const bool config_log = +#ifdef JEMALLOC_LOG + true +#else + false +#endif + ; #ifdef JEMALLOC_HAVE_SCHED_GETCPU /* Currently percpu_arena depends on sched_getcpu. */ #define JEMALLOC_PERCPU_ARENA diff --git a/dep/jemalloc/include/jemalloc/internal/jemalloc_preamble.h.in b/dep/jemalloc/include/jemalloc/internal/jemalloc_preamble.h.in index 18539a09887..e621fbc8599 100644 --- a/dep/jemalloc/include/jemalloc/internal/jemalloc_preamble.h.in +++ b/dep/jemalloc/include/jemalloc/internal/jemalloc_preamble.h.in @@ -47,6 +47,10 @@ #endif #include "jemalloc/internal/hooks.h" +#ifdef JEMALLOC_DEFINE_MADVISE_FREE +# define JEMALLOC_MADV_FREE 8 +#endif + static const bool config_debug = #ifdef JEMALLOC_DEBUG true @@ -61,6 +65,13 @@ static const bool have_dss = false #endif ; +static const bool have_madvise_huge = +#ifdef JEMALLOC_HAVE_MADVISE_HUGE + true +#else + false +#endif + ; static const bool config_fill = #ifdef JEMALLOC_FILL true @@ -111,13 +122,6 @@ static const bool config_stats = false #endif ; -static const bool config_thp = -#ifdef JEMALLOC_THP - true -#else - false -#endif - ; static const bool config_tls = #ifdef JEMALLOC_TLS true @@ -146,6 +150,17 @@ static const bool config_cache_oblivious = false #endif ; +/* + * Undocumented, for jemalloc development use only at the moment. See the note + * in jemalloc/internal/log.h. + */ +static const bool config_log = +#ifdef JEMALLOC_LOG + true +#else + false +#endif + ; #ifdef JEMALLOC_HAVE_SCHED_GETCPU /* Currently percpu_arena depends on sched_getcpu. */ #define JEMALLOC_PERCPU_ARENA diff --git a/dep/jemalloc/include/jemalloc/internal/log.h b/dep/jemalloc/include/jemalloc/internal/log.h new file mode 100644 index 00000000000..64208586354 --- /dev/null +++ b/dep/jemalloc/include/jemalloc/internal/log.h @@ -0,0 +1,115 @@ +#ifndef JEMALLOC_INTERNAL_LOG_H +#define JEMALLOC_INTERNAL_LOG_H + +#include "jemalloc/internal/atomic.h" +#include "jemalloc/internal/malloc_io.h" +#include "jemalloc/internal/mutex.h" + +#ifdef JEMALLOC_LOG +# define JEMALLOC_LOG_VAR_BUFSIZE 1000 +#else +# define JEMALLOC_LOG_VAR_BUFSIZE 1 +#endif + +#define JEMALLOC_LOG_BUFSIZE 4096 + +/* + * The log malloc_conf option is a '|'-delimited list of log_var name segments + * which should be logged. The names are themselves hierarchical, with '.' as + * the delimiter (a "segment" is just a prefix in the log namespace). So, if + * you have: + * + * log("arena", "log msg for arena"); // 1 + * log("arena.a", "log msg for arena.a"); // 2 + * log("arena.b", "log msg for arena.b"); // 3 + * log("arena.a.a", "log msg for arena.a.a"); // 4 + * log("extent.a", "log msg for extent.a"); // 5 + * log("extent.b", "log msg for extent.b"); // 6 + * + * And your malloc_conf option is "log=arena.a|extent", then lines 2, 4, 5, and + * 6 will print at runtime. You can enable logging from all log vars by + * writing "log=.". + * + * None of this should be regarded as a stable API for right now. It's intended + * as a debugging interface, to let us keep around some of our printf-debugging + * statements. + */ + +extern char log_var_names[JEMALLOC_LOG_VAR_BUFSIZE]; +extern atomic_b_t log_init_done; + +typedef struct log_var_s log_var_t; +struct log_var_s { + /* + * Lowest bit is "inited", second lowest is "enabled". Putting them in + * a single word lets us avoid any fences on weak architectures. + */ + atomic_u_t state; + const char *name; +}; + +#define LOG_NOT_INITIALIZED 0U +#define LOG_INITIALIZED_NOT_ENABLED 1U +#define LOG_ENABLED 2U + +#define LOG_VAR_INIT(name_str) {ATOMIC_INIT(LOG_NOT_INITIALIZED), name_str} + +/* + * Returns the value we should assume for state (which is not necessarily + * accurate; if logging is done before logging has finished initializing, then + * we default to doing the safe thing by logging everything). + */ +unsigned log_var_update_state(log_var_t *log_var); + +/* We factor out the metadata management to allow us to test more easily. */ +#define log_do_begin(log_var) \ +if (config_log) { \ + unsigned log_state = atomic_load_u(&(log_var).state, \ + ATOMIC_RELAXED); \ + if (unlikely(log_state == LOG_NOT_INITIALIZED)) { \ + log_state = log_var_update_state(&(log_var)); \ + assert(log_state != LOG_NOT_INITIALIZED); \ + } \ + if (log_state == LOG_ENABLED) { \ + { + /* User code executes here. */ +#define log_do_end(log_var) \ + } \ + } \ +} + +/* + * MSVC has some preprocessor bugs in its expansion of __VA_ARGS__ during + * preprocessing. To work around this, we take all potential extra arguments in + * a var-args functions. Since a varargs macro needs at least one argument in + * the "...", we accept the format string there, and require that the first + * argument in this "..." is a const char *. + */ +static inline void +log_impl_varargs(const char *name, ...) { + char buf[JEMALLOC_LOG_BUFSIZE]; + va_list ap; + + va_start(ap, name); + const char *format = va_arg(ap, const char *); + size_t dst_offset = 0; + dst_offset += malloc_snprintf(buf, JEMALLOC_LOG_BUFSIZE, "%s: ", name); + dst_offset += malloc_vsnprintf(buf + dst_offset, + JEMALLOC_LOG_BUFSIZE - dst_offset, format, ap); + dst_offset += malloc_snprintf(buf + dst_offset, + JEMALLOC_LOG_BUFSIZE - dst_offset, "\n"); + va_end(ap); + + malloc_write(buf); +} + +/* Call as log("log.var.str", "format_string %d", arg_for_format_string); */ +#define LOG(log_var_str, ...) \ +do { \ + static log_var_t log_var = LOG_VAR_INIT(log_var_str); \ + log_do_begin(log_var) \ + log_impl_varargs((log_var).name, __VA_ARGS__); \ + log_do_end(log_var) \ +} while (0) + +#endif /* JEMALLOC_INTERNAL_LOG_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/malloc_io.h b/dep/jemalloc/include/jemalloc/internal/malloc_io.h index 47ae58ec352..bfe556b523d 100644 --- a/dep/jemalloc/include/jemalloc/internal/malloc_io.h +++ b/dep/jemalloc/include/jemalloc/internal/malloc_io.h @@ -53,10 +53,50 @@ size_t malloc_vsnprintf(char *str, size_t size, const char *format, va_list ap); size_t malloc_snprintf(char *str, size_t size, const char *format, ...) JEMALLOC_FORMAT_PRINTF(3, 4); +/* + * The caller can set write_cb and cbopaque to null to choose to print with the + * je_malloc_message hook. + */ void malloc_vcprintf(void (*write_cb)(void *, const char *), void *cbopaque, const char *format, va_list ap); void malloc_cprintf(void (*write_cb)(void *, const char *), void *cbopaque, const char *format, ...) JEMALLOC_FORMAT_PRINTF(3, 4); void malloc_printf(const char *format, ...) JEMALLOC_FORMAT_PRINTF(1, 2); +static inline ssize_t +malloc_write_fd(int fd, const void *buf, size_t count) { +#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_write) + /* + * Use syscall(2) rather than write(2) when possible in order to avoid + * the possibility of memory allocation within libc. This is necessary + * on FreeBSD; most operating systems do not have this problem though. + * + * syscall() returns long or int, depending on platform, so capture the + * result in the widest plausible type to avoid compiler warnings. + */ + long result = syscall(SYS_write, fd, buf, count); +#else + ssize_t result = (ssize_t)write(fd, buf, +#ifdef _WIN32 + (unsigned int) +#endif + count); +#endif + return (ssize_t)result; +} + +static inline ssize_t +malloc_read_fd(int fd, void *buf, size_t count) { +#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_read) + long result = syscall(SYS_read, fd, buf, count); +#else + ssize_t result = read(fd, buf, +#ifdef _WIN32 + (unsigned int) +#endif + count); +#endif + return (ssize_t)result; +} + #endif /* JEMALLOC_INTERNAL_MALLOC_IO_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/mutex_prof.h b/dep/jemalloc/include/jemalloc/internal/mutex_prof.h index 3358bcf5351..ce183d33529 100644 --- a/dep/jemalloc/include/jemalloc/internal/mutex_prof.h +++ b/dep/jemalloc/include/jemalloc/internal/mutex_prof.h @@ -35,21 +35,34 @@ typedef enum { mutex_prof_num_arena_mutexes } mutex_prof_arena_ind_t; -#define MUTEX_PROF_COUNTERS \ - OP(num_ops, uint64_t) \ - OP(num_wait, uint64_t) \ - OP(num_spin_acq, uint64_t) \ - OP(num_owner_switch, uint64_t) \ - OP(total_wait_time, uint64_t) \ - OP(max_wait_time, uint64_t) \ - OP(max_num_thds, uint32_t) +#define MUTEX_PROF_UINT64_COUNTERS \ + OP(num_ops, uint64_t, "n_lock_ops") \ + OP(num_wait, uint64_t, "n_waiting") \ + OP(num_spin_acq, uint64_t, "n_spin_acq") \ + OP(num_owner_switch, uint64_t, "n_owner_switch") \ + OP(total_wait_time, uint64_t, "total_wait_ns") \ + OP(max_wait_time, uint64_t, "max_wait_ns") -typedef enum { -#define OP(counter, type) mutex_counter_##counter, - MUTEX_PROF_COUNTERS +#define MUTEX_PROF_UINT32_COUNTERS \ + OP(max_num_thds, uint32_t, "max_n_thds") + +#define MUTEX_PROF_COUNTERS \ + MUTEX_PROF_UINT64_COUNTERS \ + MUTEX_PROF_UINT32_COUNTERS + +#define OP(counter, type, human) mutex_counter_##counter, + +#define COUNTER_ENUM(counter_list, t) \ + typedef enum { \ + counter_list \ + mutex_prof_num_##t##_counters \ + } mutex_prof_##t##_counter_ind_t; + +COUNTER_ENUM(MUTEX_PROF_UINT64_COUNTERS, uint64_t) +COUNTER_ENUM(MUTEX_PROF_UINT32_COUNTERS, uint32_t) + +#undef COUNTER_ENUM #undef OP - mutex_prof_num_counters -} mutex_prof_counter_ind_t; typedef struct { /* diff --git a/dep/jemalloc/include/jemalloc/internal/pages.h b/dep/jemalloc/include/jemalloc/internal/pages.h index 28383b7f973..7dae633afe5 100644 --- a/dep/jemalloc/include/jemalloc/internal/pages.h +++ b/dep/jemalloc/include/jemalloc/internal/pages.h @@ -58,6 +58,20 @@ static const bool pages_can_purge_forced = #endif ; +typedef enum { + thp_mode_default = 0, /* Do not change hugepage settings. */ + thp_mode_always = 1, /* Always set MADV_HUGEPAGE. */ + thp_mode_never = 2, /* Always set MADV_NOHUGEPAGE. */ + + thp_mode_names_limit = 3, /* Used for option processing. */ + thp_mode_not_supported = 3 /* No THP support detected. */ +} thp_mode_t; + +#define THP_MODE_DEFAULT thp_mode_default +extern thp_mode_t opt_thp; +extern thp_mode_t init_system_thp_mode; /* Initial system wide state. */ +extern const char *thp_mode_names[]; + void *pages_map(void *addr, size_t size, size_t alignment, bool *commit); void pages_unmap(void *addr, size_t size); bool pages_commit(void *addr, size_t size); @@ -66,6 +80,9 @@ bool pages_purge_lazy(void *addr, size_t size); bool pages_purge_forced(void *addr, size_t size); bool pages_huge(void *addr, size_t size); bool pages_nohuge(void *addr, size_t size); +bool pages_dontdump(void *addr, size_t size); +bool pages_dodump(void *addr, size_t size); bool pages_boot(void); +void pages_set_thp_state (void *ptr, size_t size); #endif /* JEMALLOC_INTERNAL_PAGES_EXTERNS_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/prof_inlines_a.h b/dep/jemalloc/include/jemalloc/internal/prof_inlines_a.h index eda6839ade4..a6efb4851dc 100644 --- a/dep/jemalloc/include/jemalloc/internal/prof_inlines_a.h +++ b/dep/jemalloc/include/jemalloc/internal/prof_inlines_a.h @@ -69,4 +69,15 @@ prof_accum_cancel(tsdn_t *tsdn, prof_accum_t *prof_accum, size_t usize) { #endif } +JEMALLOC_ALWAYS_INLINE bool +prof_active_get_unlocked(void) { + /* + * Even if opt_prof is true, sampling can be temporarily disabled by + * setting prof_active to false. No locking is used when reading + * prof_active in the fast path, so there are no guarantees regarding + * how long it will take for all threads to notice state changes. + */ + return prof_active; +} + #endif /* JEMALLOC_INTERNAL_PROF_INLINES_A_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/prof_inlines_b.h b/dep/jemalloc/include/jemalloc/internal/prof_inlines_b.h index d670cb7b8f8..6ff465ad7f0 100644 --- a/dep/jemalloc/include/jemalloc/internal/prof_inlines_b.h +++ b/dep/jemalloc/include/jemalloc/internal/prof_inlines_b.h @@ -3,17 +3,6 @@ #include "jemalloc/internal/sz.h" -JEMALLOC_ALWAYS_INLINE bool -prof_active_get_unlocked(void) { - /* - * Even if opt_prof is true, sampling can be temporarily disabled by - * setting prof_active to false. No locking is used when reading - * prof_active in the fast path, so there are no guarantees regarding - * how long it will take for all threads to notice state changes. - */ - return prof_active; -} - JEMALLOC_ALWAYS_INLINE bool prof_gdump_get_unlocked(void) { /* diff --git a/dep/jemalloc/include/jemalloc/internal/rtree.h b/dep/jemalloc/include/jemalloc/internal/rtree.h index b5d4db3988f..b59d33a80bc 100644 --- a/dep/jemalloc/include/jemalloc/internal/rtree.h +++ b/dep/jemalloc/include/jemalloc/internal/rtree.h @@ -178,9 +178,21 @@ rtree_leaf_elm_bits_read(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, JEMALLOC_ALWAYS_INLINE extent_t * rtree_leaf_elm_bits_extent_get(uintptr_t bits) { +# ifdef __aarch64__ + /* + * aarch64 doesn't sign extend the highest virtual address bit to set + * the higher ones. Instead, the high bits gets zeroed. + */ + uintptr_t high_bit_mask = ((uintptr_t)1 << LG_VADDR) - 1; + /* Mask off the slab bit. */ + uintptr_t low_bit_mask = ~(uintptr_t)1; + uintptr_t mask = high_bit_mask & low_bit_mask; + return (extent_t *)(bits & mask); +# else /* Restore sign-extended high bits, mask slab bit. */ return (extent_t *)((uintptr_t)((intptr_t)(bits << RTREE_NHIB) >> RTREE_NHIB) & ~((uintptr_t)0x1)); +# endif } JEMALLOC_ALWAYS_INLINE szind_t @@ -196,8 +208,8 @@ rtree_leaf_elm_bits_slab_get(uintptr_t bits) { # endif JEMALLOC_ALWAYS_INLINE extent_t * -rtree_leaf_elm_extent_read(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, - bool dependent) { +rtree_leaf_elm_extent_read(UNUSED tsdn_t *tsdn, UNUSED rtree_t *rtree, + rtree_leaf_elm_t *elm, bool dependent) { #ifdef RTREE_LEAF_COMPACT uintptr_t bits = rtree_leaf_elm_bits_read(tsdn, rtree, elm, dependent); return rtree_leaf_elm_bits_extent_get(bits); @@ -209,8 +221,8 @@ rtree_leaf_elm_extent_read(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, } JEMALLOC_ALWAYS_INLINE szind_t -rtree_leaf_elm_szind_read(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, - bool dependent) { +rtree_leaf_elm_szind_read(UNUSED tsdn_t *tsdn, UNUSED rtree_t *rtree, + rtree_leaf_elm_t *elm, bool dependent) { #ifdef RTREE_LEAF_COMPACT uintptr_t bits = rtree_leaf_elm_bits_read(tsdn, rtree, elm, dependent); return rtree_leaf_elm_bits_szind_get(bits); @@ -221,8 +233,8 @@ rtree_leaf_elm_szind_read(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, } JEMALLOC_ALWAYS_INLINE bool -rtree_leaf_elm_slab_read(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, - bool dependent) { +rtree_leaf_elm_slab_read(UNUSED tsdn_t *tsdn, UNUSED rtree_t *rtree, + rtree_leaf_elm_t *elm, bool dependent) { #ifdef RTREE_LEAF_COMPACT uintptr_t bits = rtree_leaf_elm_bits_read(tsdn, rtree, elm, dependent); return rtree_leaf_elm_bits_slab_get(bits); @@ -233,8 +245,8 @@ rtree_leaf_elm_slab_read(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, } static inline void -rtree_leaf_elm_extent_write(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, - extent_t *extent) { +rtree_leaf_elm_extent_write(UNUSED tsdn_t *tsdn, UNUSED rtree_t *rtree, + rtree_leaf_elm_t *elm, extent_t *extent) { #ifdef RTREE_LEAF_COMPACT uintptr_t old_bits = rtree_leaf_elm_bits_read(tsdn, rtree, elm, true); uintptr_t bits = ((uintptr_t)rtree_leaf_elm_bits_szind_get(old_bits) << @@ -247,8 +259,8 @@ rtree_leaf_elm_extent_write(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, } static inline void -rtree_leaf_elm_szind_write(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, - szind_t szind) { +rtree_leaf_elm_szind_write(UNUSED tsdn_t *tsdn, UNUSED rtree_t *rtree, + rtree_leaf_elm_t *elm, szind_t szind) { assert(szind <= NSIZES); #ifdef RTREE_LEAF_COMPACT @@ -265,8 +277,8 @@ rtree_leaf_elm_szind_write(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, } static inline void -rtree_leaf_elm_slab_write(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, - bool slab) { +rtree_leaf_elm_slab_write(UNUSED tsdn_t *tsdn, UNUSED rtree_t *rtree, + rtree_leaf_elm_t *elm, bool slab) { #ifdef RTREE_LEAF_COMPACT uintptr_t old_bits = rtree_leaf_elm_bits_read(tsdn, rtree, elm, true); @@ -448,8 +460,14 @@ rtree_szind_slab_read(tsdn_t *tsdn, rtree_t *rtree, rtree_ctx_t *rtree_ctx, if (!dependent && elm == NULL) { return true; } +#ifdef RTREE_LEAF_COMPACT + uintptr_t bits = rtree_leaf_elm_bits_read(tsdn, rtree, elm, dependent); + *r_szind = rtree_leaf_elm_bits_szind_get(bits); + *r_slab = rtree_leaf_elm_bits_slab_get(bits); +#else *r_szind = rtree_leaf_elm_szind_read(tsdn, rtree, elm, dependent); *r_slab = rtree_leaf_elm_slab_read(tsdn, rtree, elm, dependent); +#endif return false; } diff --git a/dep/jemalloc/include/jemalloc/internal/rtree_tsd.h b/dep/jemalloc/include/jemalloc/internal/rtree_tsd.h index 3cdc8625487..93a75173a8d 100644 --- a/dep/jemalloc/include/jemalloc/internal/rtree_tsd.h +++ b/dep/jemalloc/include/jemalloc/internal/rtree_tsd.h @@ -26,7 +26,7 @@ * Zero initializer required for tsd initialization only. Proper initialization * done via rtree_ctx_data_init(). */ -#define RTREE_CTX_ZERO_INITIALIZER {{{0}}} +#define RTREE_CTX_ZERO_INITIALIZER {{{0}}, {{0}}} typedef struct rtree_leaf_elm_s rtree_leaf_elm_t; diff --git a/dep/jemalloc/include/jemalloc/internal/spin.h b/dep/jemalloc/include/jemalloc/internal/spin.h index e2afc98cfda..22804c687f1 100644 --- a/dep/jemalloc/include/jemalloc/internal/spin.h +++ b/dep/jemalloc/include/jemalloc/internal/spin.h @@ -1,25 +1,29 @@ #ifndef JEMALLOC_INTERNAL_SPIN_H #define JEMALLOC_INTERNAL_SPIN_H -#ifdef JEMALLOC_SPIN_C_ -# define SPIN_INLINE extern inline -#else -# define SPIN_INLINE inline -#endif - #define SPIN_INITIALIZER {0U} typedef struct { unsigned iteration; } spin_t; -SPIN_INLINE void +static inline void +spin_cpu_spinwait() { +# if HAVE_CPU_SPINWAIT + CPU_SPINWAIT; +# else + volatile int x = 0; + x = x; +# endif +} + +static inline void spin_adaptive(spin_t *spin) { volatile uint32_t i; if (spin->iteration < 5) { for (i = 0; i < (1U << spin->iteration); i++) { - CPU_SPINWAIT; + spin_cpu_spinwait(); } spin->iteration++; } else { diff --git a/dep/jemalloc/include/jemalloc/internal/stats.h b/dep/jemalloc/include/jemalloc/internal/stats.h index 1198779ab9c..852e34269ab 100644 --- a/dep/jemalloc/include/jemalloc/internal/stats.h +++ b/dep/jemalloc/include/jemalloc/internal/stats.h @@ -1,12 +1,6 @@ #ifndef JEMALLOC_INTERNAL_STATS_H #define JEMALLOC_INTERNAL_STATS_H -#include "jemalloc/internal/atomic.h" -#include "jemalloc/internal/mutex_prof.h" -#include "jemalloc/internal/mutex.h" -#include "jemalloc/internal/size_classes.h" -#include "jemalloc/internal/stats_tsd.h" - /* OPTION(opt, var_name, default, set_value_to) */ #define STATS_PRINT_OPTIONS \ OPTION('J', json, false, true) \ @@ -33,132 +27,4 @@ extern char opt_stats_print_opts[stats_print_tot_num_options+1]; void stats_print(void (*write_cb)(void *, const char *), void *cbopaque, const char *opts); -/* - * In those architectures that support 64-bit atomics, we use atomic updates for - * our 64-bit values. Otherwise, we use a plain uint64_t and synchronize - * externally. - */ -#ifdef JEMALLOC_ATOMIC_U64 -typedef atomic_u64_t arena_stats_u64_t; -#else -/* Must hold the arena stats mutex while reading atomically. */ -typedef uint64_t arena_stats_u64_t; -#endif - -typedef struct malloc_bin_stats_s { - /* - * Total number of allocation/deallocation requests served directly by - * the bin. Note that tcache may allocate an object, then recycle it - * many times, resulting many increments to nrequests, but only one - * each to nmalloc and ndalloc. - */ - uint64_t nmalloc; - uint64_t ndalloc; - - /* - * Number of allocation requests that correspond to the size of this - * bin. This includes requests served by tcache, though tcache only - * periodically merges into this counter. - */ - uint64_t nrequests; - - /* - * Current number of regions of this size class, including regions - * currently cached by tcache. - */ - size_t curregs; - - /* Number of tcache fills from this bin. */ - uint64_t nfills; - - /* Number of tcache flushes to this bin. */ - uint64_t nflushes; - - /* Total number of slabs created for this bin's size class. */ - uint64_t nslabs; - - /* - * Total number of slabs reused by extracting them from the slabs heap - * for this bin's size class. - */ - uint64_t reslabs; - - /* Current number of slabs in this bin. */ - size_t curslabs; - - mutex_prof_data_t mutex_data; -} malloc_bin_stats_t; - -typedef struct malloc_large_stats_s { - /* - * Total number of allocation/deallocation requests served directly by - * the arena. - */ - arena_stats_u64_t nmalloc; - arena_stats_u64_t ndalloc; - - /* - * Number of allocation requests that correspond to this size class. - * This includes requests served by tcache, though tcache only - * periodically merges into this counter. - */ - arena_stats_u64_t nrequests; /* Partially derived. */ - - /* Current number of allocations of this size class. */ - size_t curlextents; /* Derived. */ -} malloc_large_stats_t; - -typedef struct decay_stats_s { - /* Total number of purge sweeps. */ - arena_stats_u64_t npurge; - /* Total number of madvise calls made. */ - arena_stats_u64_t nmadvise; - /* Total number of pages purged. */ - arena_stats_u64_t purged; -} decay_stats_t; - -/* - * Arena stats. Note that fields marked "derived" are not directly maintained - * within the arena code; rather their values are derived during stats merge - * requests. - */ -typedef struct arena_stats_s { -#ifndef JEMALLOC_ATOMIC_U64 - malloc_mutex_t mtx; -#endif - - /* Number of bytes currently mapped, excluding retained memory. */ - atomic_zu_t mapped; /* Partially derived. */ - - /* - * Number of unused virtual memory bytes currently retained. Retained - * bytes are technically mapped (though always decommitted or purged), - * but they are excluded from the mapped statistic (above). - */ - atomic_zu_t retained; /* Derived. */ - - decay_stats_t decay_dirty; - decay_stats_t decay_muzzy; - - atomic_zu_t base; /* Derived. */ - atomic_zu_t internal; - atomic_zu_t resident; /* Derived. */ - - atomic_zu_t allocated_large; /* Derived. */ - arena_stats_u64_t nmalloc_large; /* Derived. */ - arena_stats_u64_t ndalloc_large; /* Derived. */ - arena_stats_u64_t nrequests_large; /* Derived. */ - - /* Number of bytes cached in tcache associated with this arena. */ - atomic_zu_t tcache_bytes; /* Derived. */ - - mutex_prof_data_t mutex_prof_data[mutex_prof_num_arena_mutexes]; - - /* One element for each large size class. */ - malloc_large_stats_t lstats[NSIZES - NBINS]; - - /* Arena uptime. */ - nstime_t uptime; -} arena_stats_t; - #endif /* JEMALLOC_INTERNAL_STATS_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/stats_tsd.h b/dep/jemalloc/include/jemalloc/internal/stats_tsd.h deleted file mode 100644 index d0c3bbe4945..00000000000 --- a/dep/jemalloc/include/jemalloc/internal/stats_tsd.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef JEMALLOC_INTERNAL_STATS_TSD_H -#define JEMALLOC_INTERNAL_STATS_TSD_H - -typedef struct tcache_bin_stats_s { - /* - * Number of allocation requests that corresponded to the size of this - * bin. - */ - uint64_t nrequests; -} tcache_bin_stats_t; - -#endif /* JEMALLOC_INTERNAL_STATS_TSD_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/sz.h b/dep/jemalloc/include/jemalloc/internal/sz.h index 7f640d55ad7..97946289854 100644 --- a/dep/jemalloc/include/jemalloc/internal/sz.h +++ b/dep/jemalloc/include/jemalloc/internal/sz.h @@ -61,7 +61,7 @@ sz_psz2ind(size_t psz) { pszind_t lg_delta = (x < LG_SIZE_CLASS_GROUP + LG_PAGE + 1) ? LG_PAGE : x - LG_SIZE_CLASS_GROUP - 1; - size_t delta_inverse_mask = ZD(-1) << lg_delta; + size_t delta_inverse_mask = ZU(-1) << lg_delta; pszind_t mod = ((((psz-1) & delta_inverse_mask) >> lg_delta)) & ((ZU(1) << LG_SIZE_CLASS_GROUP) - 1); @@ -142,7 +142,7 @@ sz_size2index_compute(size_t size) { szind_t lg_delta = (x < LG_SIZE_CLASS_GROUP + LG_QUANTUM + 1) ? LG_QUANTUM : x - LG_SIZE_CLASS_GROUP - 1; - size_t delta_inverse_mask = ZD(-1) << lg_delta; + size_t delta_inverse_mask = ZU(-1) << lg_delta; szind_t mod = ((((size-1) & delta_inverse_mask) >> lg_delta)) & ((ZU(1) << LG_SIZE_CLASS_GROUP) - 1); diff --git a/dep/jemalloc/include/jemalloc/internal/tcache_externs.h b/dep/jemalloc/include/jemalloc/internal/tcache_externs.h index db3e9c7d5d1..790367bd481 100644 --- a/dep/jemalloc/include/jemalloc/internal/tcache_externs.h +++ b/dep/jemalloc/include/jemalloc/internal/tcache_externs.h @@ -6,7 +6,7 @@ extern bool opt_tcache; extern ssize_t opt_lg_tcache_max; -extern tcache_bin_info_t *tcache_bin_info; +extern cache_bin_info_t *tcache_bin_info; /* * Number of tcache bins. There are NBINS small-object bins, plus 0 or more @@ -30,10 +30,10 @@ extern tcaches_t *tcaches; size_t tcache_salloc(tsdn_t *tsdn, const void *ptr); void tcache_event_hard(tsd_t *tsd, tcache_t *tcache); void *tcache_alloc_small_hard(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache, - tcache_bin_t *tbin, szind_t binind, bool *tcache_success); -void tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, tcache_bin_t *tbin, + cache_bin_t *tbin, szind_t binind, bool *tcache_success); +void tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, cache_bin_t *tbin, szind_t binind, unsigned rem); -void tcache_bin_flush_large(tsd_t *tsd, tcache_bin_t *tbin, szind_t binind, +void tcache_bin_flush_large(tsd_t *tsd, cache_bin_t *tbin, szind_t binind, unsigned rem, tcache_t *tcache); void tcache_arena_reassociate(tsdn_t *tsdn, tcache_t *tcache, arena_t *arena); diff --git a/dep/jemalloc/include/jemalloc/internal/tcache_inlines.h b/dep/jemalloc/include/jemalloc/internal/tcache_inlines.h index c55bcd2723d..0f6ab8cb50a 100644 --- a/dep/jemalloc/include/jemalloc/internal/tcache_inlines.h +++ b/dep/jemalloc/include/jemalloc/internal/tcache_inlines.h @@ -1,6 +1,7 @@ #ifndef JEMALLOC_INTERNAL_TCACHE_INLINES_H #define JEMALLOC_INTERNAL_TCACHE_INLINES_H +#include "jemalloc/internal/bin.h" #include "jemalloc/internal/jemalloc_internal_types.h" #include "jemalloc/internal/size_classes.h" #include "jemalloc/internal/sz.h" @@ -38,43 +39,16 @@ tcache_event(tsd_t *tsd, tcache_t *tcache) { } JEMALLOC_ALWAYS_INLINE void * -tcache_alloc_easy(tcache_bin_t *tbin, bool *tcache_success) { +tcache_alloc_small(tsd_t *tsd, arena_t *arena, tcache_t *tcache, + UNUSED size_t size, szind_t binind, bool zero, bool slow_path) { void *ret; - - if (unlikely(tbin->ncached == 0)) { - tbin->low_water = -1; - *tcache_success = false; - return NULL; - } - /* - * tcache_success (instead of ret) should be checked upon the return of - * this function. We avoid checking (ret == NULL) because there is - * never a null stored on the avail stack (which is unknown to the - * compiler), and eagerly checking ret would cause pipeline stall - * (waiting for the cacheline). - */ - *tcache_success = true; - ret = *(tbin->avail - tbin->ncached); - tbin->ncached--; - - if (unlikely((low_water_t)tbin->ncached < tbin->low_water)) { - tbin->low_water = tbin->ncached; - } - - return ret; -} - -JEMALLOC_ALWAYS_INLINE void * -tcache_alloc_small(tsd_t *tsd, arena_t *arena, tcache_t *tcache, size_t size, - szind_t binind, bool zero, bool slow_path) { - void *ret; - tcache_bin_t *tbin; + cache_bin_t *bin; bool tcache_success; size_t usize JEMALLOC_CC_SILENCE_INIT(0); assert(binind < NBINS); - tbin = tcache_small_bin_get(tcache, binind); - ret = tcache_alloc_easy(tbin, &tcache_success); + bin = tcache_small_bin_get(tcache, binind); + ret = cache_bin_alloc_easy(bin, &tcache_success); assert(tcache_success == (ret != NULL)); if (unlikely(!tcache_success)) { bool tcache_hard_success; @@ -84,7 +58,7 @@ tcache_alloc_small(tsd_t *tsd, arena_t *arena, tcache_t *tcache, size_t size, } ret = tcache_alloc_small_hard(tsd_tsdn(tsd), arena, tcache, - tbin, binind, &tcache_hard_success); + bin, binind, &tcache_hard_success); if (tcache_hard_success == false) { return NULL; } @@ -103,22 +77,21 @@ tcache_alloc_small(tsd_t *tsd, arena_t *arena, tcache_t *tcache, size_t size, if (likely(!zero)) { if (slow_path && config_fill) { if (unlikely(opt_junk_alloc)) { - arena_alloc_junk_small(ret, - &arena_bin_info[binind], false); + arena_alloc_junk_small(ret, &bin_infos[binind], + false); } else if (unlikely(opt_zero)) { memset(ret, 0, usize); } } } else { if (slow_path && config_fill && unlikely(opt_junk_alloc)) { - arena_alloc_junk_small(ret, &arena_bin_info[binind], - true); + arena_alloc_junk_small(ret, &bin_infos[binind], true); } memset(ret, 0, usize); } if (config_stats) { - tbin->tstats.nrequests++; + bin->tstats.nrequests++; } if (config_prof) { tcache->prof_accumbytes += usize; @@ -131,12 +104,12 @@ JEMALLOC_ALWAYS_INLINE void * tcache_alloc_large(tsd_t *tsd, arena_t *arena, tcache_t *tcache, size_t size, szind_t binind, bool zero, bool slow_path) { void *ret; - tcache_bin_t *tbin; + cache_bin_t *bin; bool tcache_success; assert(binind >= NBINS &&binind < nhbins); - tbin = tcache_large_bin_get(tcache, binind); - ret = tcache_alloc_easy(tbin, &tcache_success); + bin = tcache_large_bin_get(tcache, binind); + ret = cache_bin_alloc_easy(bin, &tcache_success); assert(tcache_success == (ret != NULL)); if (unlikely(!tcache_success)) { /* @@ -176,7 +149,7 @@ tcache_alloc_large(tsd_t *tsd, arena_t *arena, tcache_t *tcache, size_t size, } if (config_stats) { - tbin->tstats.nrequests++; + bin->tstats.nrequests++; } if (config_prof) { tcache->prof_accumbytes += usize; @@ -190,24 +163,24 @@ tcache_alloc_large(tsd_t *tsd, arena_t *arena, tcache_t *tcache, size_t size, JEMALLOC_ALWAYS_INLINE void tcache_dalloc_small(tsd_t *tsd, tcache_t *tcache, void *ptr, szind_t binind, bool slow_path) { - tcache_bin_t *tbin; - tcache_bin_info_t *tbin_info; + cache_bin_t *bin; + cache_bin_info_t *bin_info; assert(tcache_salloc(tsd_tsdn(tsd), ptr) <= SMALL_MAXCLASS); if (slow_path && config_fill && unlikely(opt_junk_free)) { - arena_dalloc_junk_small(ptr, &arena_bin_info[binind]); + arena_dalloc_junk_small(ptr, &bin_infos[binind]); } - tbin = tcache_small_bin_get(tcache, binind); - tbin_info = &tcache_bin_info[binind]; - if (unlikely(tbin->ncached == tbin_info->ncached_max)) { - tcache_bin_flush_small(tsd, tcache, tbin, binind, - (tbin_info->ncached_max >> 1)); + bin = tcache_small_bin_get(tcache, binind); + bin_info = &tcache_bin_info[binind]; + if (unlikely(bin->ncached == bin_info->ncached_max)) { + tcache_bin_flush_small(tsd, tcache, bin, binind, + (bin_info->ncached_max >> 1)); } - assert(tbin->ncached < tbin_info->ncached_max); - tbin->ncached++; - *(tbin->avail - tbin->ncached) = ptr; + assert(bin->ncached < bin_info->ncached_max); + bin->ncached++; + *(bin->avail - bin->ncached) = ptr; tcache_event(tsd, tcache); } @@ -215,8 +188,8 @@ tcache_dalloc_small(tsd_t *tsd, tcache_t *tcache, void *ptr, szind_t binind, JEMALLOC_ALWAYS_INLINE void tcache_dalloc_large(tsd_t *tsd, tcache_t *tcache, void *ptr, szind_t binind, bool slow_path) { - tcache_bin_t *tbin; - tcache_bin_info_t *tbin_info; + cache_bin_t *bin; + cache_bin_info_t *bin_info; assert(tcache_salloc(tsd_tsdn(tsd), ptr) > SMALL_MAXCLASS); assert(tcache_salloc(tsd_tsdn(tsd), ptr) <= tcache_maxclass); @@ -225,15 +198,15 @@ tcache_dalloc_large(tsd_t *tsd, tcache_t *tcache, void *ptr, szind_t binind, large_dalloc_junk(ptr, sz_index2size(binind)); } - tbin = tcache_large_bin_get(tcache, binind); - tbin_info = &tcache_bin_info[binind]; - if (unlikely(tbin->ncached == tbin_info->ncached_max)) { - tcache_bin_flush_large(tsd, tbin, binind, - (tbin_info->ncached_max >> 1), tcache); + bin = tcache_large_bin_get(tcache, binind); + bin_info = &tcache_bin_info[binind]; + if (unlikely(bin->ncached == bin_info->ncached_max)) { + tcache_bin_flush_large(tsd, bin, binind, + (bin_info->ncached_max >> 1), tcache); } - assert(tbin->ncached < tbin_info->ncached_max); - tbin->ncached++; - *(tbin->avail - tbin->ncached) = ptr; + assert(bin->ncached < bin_info->ncached_max); + bin->ncached++; + *(bin->avail - bin->ncached) = ptr; tcache_event(tsd, tcache); } diff --git a/dep/jemalloc/include/jemalloc/internal/tcache_structs.h b/dep/jemalloc/include/jemalloc/internal/tcache_structs.h index 7eb516fb6b1..07b7387059f 100644 --- a/dep/jemalloc/include/jemalloc/internal/tcache_structs.h +++ b/dep/jemalloc/include/jemalloc/internal/tcache_structs.h @@ -3,54 +3,51 @@ #include "jemalloc/internal/ql.h" #include "jemalloc/internal/size_classes.h" -#include "jemalloc/internal/stats_tsd.h" +#include "jemalloc/internal/cache_bin.h" #include "jemalloc/internal/ticker.h" -/* - * Read-only information associated with each element of tcache_t's tbins array - * is stored separately, mainly to reduce memory usage. - */ -struct tcache_bin_info_s { - unsigned ncached_max; /* Upper limit on ncached. */ -}; - -struct tcache_bin_s { - low_water_t low_water; /* Min # cached since last GC. */ - uint32_t ncached; /* # of cached objects. */ - /* - * ncached and stats are both modified frequently. Let's keep them - * close so that they have a higher chance of being on the same - * cacheline, thus less write-backs. - */ - tcache_bin_stats_t tstats; - /* - * To make use of adjacent cacheline prefetch, the items in the avail - * stack goes to higher address for newer allocations. avail points - * just above the available space, which means that - * avail[-ncached, ... -1] are available items and the lowest item will - * be allocated first. - */ - void **avail; /* Stack of available objects. */ -}; - struct tcache_s { - /* Data accessed frequently first: prof, ticker and small bins. */ - uint64_t prof_accumbytes;/* Cleared after arena_prof_accum(). */ - ticker_t gc_ticker; /* Drives incremental GC. */ /* - * The pointer stacks associated with tbins follow as a contiguous - * array. During tcache initialization, the avail pointer in each - * element of tbins is initialized to point to the proper offset within - * this array. + * To minimize our cache-footprint, we put the frequently accessed data + * together at the start of this struct. */ - tcache_bin_t tbins_small[NBINS]; - /* Data accessed less often below. */ - ql_elm(tcache_t) link; /* Used for aggregating stats. */ - arena_t *arena; /* Associated arena. */ - szind_t next_gc_bin; /* Next bin to GC. */ + + /* Cleared after arena_prof_accum(). */ + uint64_t prof_accumbytes; + /* Drives incremental GC. */ + ticker_t gc_ticker; + /* + * The pointer stacks associated with bins follow as a contiguous array. + * During tcache initialization, the avail pointer in each element of + * tbins is initialized to point to the proper offset within this array. + */ + cache_bin_t bins_small[NBINS]; + + /* + * This data is less hot; we can be a little less careful with our + * footprint here. + */ + /* Lets us track all the tcaches in an arena. */ + ql_elm(tcache_t) link; + /* + * The descriptor lets the arena find our cache bins without seeing the + * tcache definition. This enables arenas to aggregate stats across + * tcaches without having a tcache dependency. + */ + cache_bin_array_descriptor_t cache_bin_array_descriptor; + + /* The arena this tcache is associated with. */ + arena_t *arena; + /* Next bin to GC. */ + szind_t next_gc_bin; /* For small bins, fill (ncached_max >> lg_fill_div). */ uint8_t lg_fill_div[NBINS]; - tcache_bin_t tbins_large[NSIZES-NBINS]; + /* + * We put the cache bins for large size classes at the end of the + * struct, since some of them might not get used. This might end up + * letting us avoid touching an extra page if we don't have to. + */ + cache_bin_t bins_large[NSIZES-NBINS]; }; /* Linkage for list of available (previously used) explicit tcache IDs. */ diff --git a/dep/jemalloc/include/jemalloc/internal/tcache_types.h b/dep/jemalloc/include/jemalloc/internal/tcache_types.h index 1155d62cb44..e49bc9d79eb 100644 --- a/dep/jemalloc/include/jemalloc/internal/tcache_types.h +++ b/dep/jemalloc/include/jemalloc/internal/tcache_types.h @@ -3,14 +3,9 @@ #include "jemalloc/internal/size_classes.h" -typedef struct tcache_bin_info_s tcache_bin_info_t; -typedef struct tcache_bin_s tcache_bin_t; typedef struct tcache_s tcache_t; typedef struct tcaches_s tcaches_t; -/* ncached is cast to this type for comparison. */ -typedef int32_t low_water_t; - /* * tcache pointers close to NULL are used to encode state information that is * used for two purposes: preventing thread caching on a per thread basis and diff --git a/dep/jemalloc/include/jemalloc/internal/ticker.h b/dep/jemalloc/include/jemalloc/internal/ticker.h index 572b96459cc..4b3604708e1 100644 --- a/dep/jemalloc/include/jemalloc/internal/ticker.h +++ b/dep/jemalloc/include/jemalloc/internal/ticker.h @@ -32,14 +32,42 @@ ticker_read(const ticker_t *ticker) { return ticker->tick; } +/* + * Not intended to be a public API. Unfortunately, on x86, neither gcc nor + * clang seems smart enough to turn + * ticker->tick -= nticks; + * if (unlikely(ticker->tick < 0)) { + * fixup ticker + * return true; + * } + * return false; + * into + * subq %nticks_reg, (%ticker_reg) + * js fixup ticker + * + * unless we force "fixup ticker" out of line. In that case, gcc gets it right, + * but clang now does worse than before. So, on x86 with gcc, we force it out + * of line, but otherwise let the inlining occur. Ordinarily this wouldn't be + * worth the hassle, but this is on the fast path of both malloc and free (via + * tcache_event). + */ +#if defined(__GNUC__) && !defined(__clang__) \ + && (defined(__x86_64__) || defined(__i386__)) +JEMALLOC_NOINLINE +#endif +static bool +ticker_fixup(ticker_t *ticker) { + ticker->tick = ticker->nticks; + return true; +} + static inline bool ticker_ticks(ticker_t *ticker, int32_t nticks) { - if (unlikely(ticker->tick < nticks)) { - ticker->tick = ticker->nticks; - return true; - } ticker->tick -= nticks; - return(false); + if (unlikely(ticker->tick < 0)) { + return ticker_fixup(ticker); + } + return false; } static inline bool diff --git a/dep/jemalloc/include/jemalloc/internal/tsd.h b/dep/jemalloc/include/jemalloc/internal/tsd.h index 155a2ec6c44..0b9841aa7db 100644 --- a/dep/jemalloc/include/jemalloc/internal/tsd.h +++ b/dep/jemalloc/include/jemalloc/internal/tsd.h @@ -65,6 +65,7 @@ typedef void (*test_callback_t)(int *); O(arenas_tdata_bypass, bool, bool) \ O(reentrancy_level, int8_t, int8_t) \ O(narenas_tdata, uint32_t, uint32_t) \ + O(offset_state, uint64_t, uint64_t) \ O(thread_allocated, uint64_t, uint64_t) \ O(thread_deallocated, uint64_t, uint64_t) \ O(prof_tdata, prof_tdata_t *, prof_tdata_t *) \ @@ -84,6 +85,7 @@ typedef void (*test_callback_t)(int *); 0, \ 0, \ 0, \ + 0, \ NULL, \ RTREE_CTX_ZERO_INITIALIZER, \ NULL, \ diff --git a/dep/jemalloc/include/jemalloc/internal/tsd_tls.h b/dep/jemalloc/include/jemalloc/internal/tsd_tls.h index 757aaa0eeff..0de64b7b8bf 100644 --- a/dep/jemalloc/include/jemalloc/internal/tsd_tls.h +++ b/dep/jemalloc/include/jemalloc/internal/tsd_tls.h @@ -39,7 +39,7 @@ tsd_get_allocates(void) { /* Get/set. */ JEMALLOC_ALWAYS_INLINE tsd_t * -tsd_get(bool init) { +tsd_get(UNUSED bool init) { assert(tsd_booted); return &tsd_tls; } diff --git a/dep/jemalloc/include/jemalloc/internal/witness.h b/dep/jemalloc/include/jemalloc/internal/witness.h index 33be6661071..7ace8ae4a11 100644 --- a/dep/jemalloc/include/jemalloc/internal/witness.h +++ b/dep/jemalloc/include/jemalloc/internal/witness.h @@ -51,7 +51,7 @@ #define WITNESS_RANK_ARENA_LARGE 19U #define WITNESS_RANK_LEAF 0xffffffffU -#define WITNESS_RANK_ARENA_BIN WITNESS_RANK_LEAF +#define WITNESS_RANK_BIN WITNESS_RANK_LEAF #define WITNESS_RANK_ARENA_STATS WITNESS_RANK_LEAF #define WITNESS_RANK_DSS WITNESS_RANK_LEAF #define WITNESS_RANK_PROF_ACTIVE WITNESS_RANK_LEAF diff --git a/dep/jemalloc/include/jemalloc/jemalloc.h b/dep/jemalloc/include/jemalloc/jemalloc.h index 6ffe5c71b38..c41a9b48974 100644 --- a/dep/jemalloc/include/jemalloc/jemalloc.h +++ b/dep/jemalloc/include/jemalloc/jemalloc.h @@ -83,12 +83,12 @@ extern "C" { #include #include -#define JEMALLOC_VERSION "5.0.1-0-g896ed3a8b3f41998d4fb4d625d30ac63ef2d51fb" +#define JEMALLOC_VERSION "5.1.0-0-g61efbda7098de6fe64c362d309824864308c36d4" #define JEMALLOC_VERSION_MAJOR 5 -#define JEMALLOC_VERSION_MINOR 0 -#define JEMALLOC_VERSION_BUGFIX 1 +#define JEMALLOC_VERSION_MINOR 1 +#define JEMALLOC_VERSION_BUGFIX 0 #define JEMALLOC_VERSION_NREV 0 -#define JEMALLOC_VERSION_GID "896ed3a8b3f41998d4fb4d625d30ac63ef2d51fb" +#define JEMALLOC_VERSION_GID "61efbda7098de6fe64c362d309824864308c36d4" #define MALLOCX_LG_ALIGN(la) ((int)(la)) #if LG_SIZEOF_PTR == 2 diff --git a/dep/jemalloc/include/msvc_compat/inttypes.h b/dep/jemalloc/include/msvc_compat/inttypes.h deleted file mode 100644 index a4e6b75cb91..00000000000 --- a/dep/jemalloc/include/msvc_compat/inttypes.h +++ /dev/null @@ -1,313 +0,0 @@ -// ISO C9x compliant inttypes.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_INTTYPES_H_ // [ -#define _MSC_INTTYPES_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include "stdint.h" - -// 7.8 Format conversion of integer types - -typedef struct { - intmax_t quot; - intmax_t rem; -} imaxdiv_t; - -// 7.8.1 Macros for format specifiers - -#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 - -#ifdef _WIN64 -# define __PRI64_PREFIX "l" -# define __PRIPTR_PREFIX "l" -#else -# define __PRI64_PREFIX "ll" -# define __PRIPTR_PREFIX -#endif - -// The fprintf macros for signed integers are: -#define PRId8 "d" -#define PRIi8 "i" -#define PRIdLEAST8 "d" -#define PRIiLEAST8 "i" -#define PRIdFAST8 "d" -#define PRIiFAST8 "i" - -#define PRId16 "hd" -#define PRIi16 "hi" -#define PRIdLEAST16 "hd" -#define PRIiLEAST16 "hi" -#define PRIdFAST16 "hd" -#define PRIiFAST16 "hi" - -#define PRId32 "d" -#define PRIi32 "i" -#define PRIdLEAST32 "d" -#define PRIiLEAST32 "i" -#define PRIdFAST32 "d" -#define PRIiFAST32 "i" - -#define PRId64 __PRI64_PREFIX "d" -#define PRIi64 __PRI64_PREFIX "i" -#define PRIdLEAST64 __PRI64_PREFIX "d" -#define PRIiLEAST64 __PRI64_PREFIX "i" -#define PRIdFAST64 __PRI64_PREFIX "d" -#define PRIiFAST64 __PRI64_PREFIX "i" - -#define PRIdMAX __PRI64_PREFIX "d" -#define PRIiMAX __PRI64_PREFIX "i" - -#define PRIdPTR __PRIPTR_PREFIX "d" -#define PRIiPTR __PRIPTR_PREFIX "i" - -// The fprintf macros for unsigned integers are: -#define PRIo8 "o" -#define PRIu8 "u" -#define PRIx8 "x" -#define PRIX8 "X" -#define PRIoLEAST8 "o" -#define PRIuLEAST8 "u" -#define PRIxLEAST8 "x" -#define PRIXLEAST8 "X" -#define PRIoFAST8 "o" -#define PRIuFAST8 "u" -#define PRIxFAST8 "x" -#define PRIXFAST8 "X" - -#define PRIo16 "ho" -#define PRIu16 "hu" -#define PRIx16 "hx" -#define PRIX16 "hX" -#define PRIoLEAST16 "ho" -#define PRIuLEAST16 "hu" -#define PRIxLEAST16 "hx" -#define PRIXLEAST16 "hX" -#define PRIoFAST16 "ho" -#define PRIuFAST16 "hu" -#define PRIxFAST16 "hx" -#define PRIXFAST16 "hX" - -#define PRIo32 "o" -#define PRIu32 "u" -#define PRIx32 "x" -#define PRIX32 "X" -#define PRIoLEAST32 "o" -#define PRIuLEAST32 "u" -#define PRIxLEAST32 "x" -#define PRIXLEAST32 "X" -#define PRIoFAST32 "o" -#define PRIuFAST32 "u" -#define PRIxFAST32 "x" -#define PRIXFAST32 "X" - -#define PRIo64 __PRI64_PREFIX "o" -#define PRIu64 __PRI64_PREFIX "u" -#define PRIx64 __PRI64_PREFIX "x" -#define PRIX64 __PRI64_PREFIX "X" -#define PRIoLEAST64 __PRI64_PREFIX "o" -#define PRIuLEAST64 __PRI64_PREFIX "u" -#define PRIxLEAST64 __PRI64_PREFIX "x" -#define PRIXLEAST64 __PRI64_PREFIX "X" -#define PRIoFAST64 __PRI64_PREFIX "o" -#define PRIuFAST64 __PRI64_PREFIX "u" -#define PRIxFAST64 __PRI64_PREFIX "x" -#define PRIXFAST64 __PRI64_PREFIX "X" - -#define PRIoMAX __PRI64_PREFIX "o" -#define PRIuMAX __PRI64_PREFIX "u" -#define PRIxMAX __PRI64_PREFIX "x" -#define PRIXMAX __PRI64_PREFIX "X" - -#define PRIoPTR __PRIPTR_PREFIX "o" -#define PRIuPTR __PRIPTR_PREFIX "u" -#define PRIxPTR __PRIPTR_PREFIX "x" -#define PRIXPTR __PRIPTR_PREFIX "X" - -// The fscanf macros for signed integers are: -#define SCNd8 "d" -#define SCNi8 "i" -#define SCNdLEAST8 "d" -#define SCNiLEAST8 "i" -#define SCNdFAST8 "d" -#define SCNiFAST8 "i" - -#define SCNd16 "hd" -#define SCNi16 "hi" -#define SCNdLEAST16 "hd" -#define SCNiLEAST16 "hi" -#define SCNdFAST16 "hd" -#define SCNiFAST16 "hi" - -#define SCNd32 "ld" -#define SCNi32 "li" -#define SCNdLEAST32 "ld" -#define SCNiLEAST32 "li" -#define SCNdFAST32 "ld" -#define SCNiFAST32 "li" - -#define SCNd64 "I64d" -#define SCNi64 "I64i" -#define SCNdLEAST64 "I64d" -#define SCNiLEAST64 "I64i" -#define SCNdFAST64 "I64d" -#define SCNiFAST64 "I64i" - -#define SCNdMAX "I64d" -#define SCNiMAX "I64i" - -#ifdef _WIN64 // [ -# define SCNdPTR "I64d" -# define SCNiPTR "I64i" -#else // _WIN64 ][ -# define SCNdPTR "ld" -# define SCNiPTR "li" -#endif // _WIN64 ] - -// The fscanf macros for unsigned integers are: -#define SCNo8 "o" -#define SCNu8 "u" -#define SCNx8 "x" -#define SCNX8 "X" -#define SCNoLEAST8 "o" -#define SCNuLEAST8 "u" -#define SCNxLEAST8 "x" -#define SCNXLEAST8 "X" -#define SCNoFAST8 "o" -#define SCNuFAST8 "u" -#define SCNxFAST8 "x" -#define SCNXFAST8 "X" - -#define SCNo16 "ho" -#define SCNu16 "hu" -#define SCNx16 "hx" -#define SCNX16 "hX" -#define SCNoLEAST16 "ho" -#define SCNuLEAST16 "hu" -#define SCNxLEAST16 "hx" -#define SCNXLEAST16 "hX" -#define SCNoFAST16 "ho" -#define SCNuFAST16 "hu" -#define SCNxFAST16 "hx" -#define SCNXFAST16 "hX" - -#define SCNo32 "lo" -#define SCNu32 "lu" -#define SCNx32 "lx" -#define SCNX32 "lX" -#define SCNoLEAST32 "lo" -#define SCNuLEAST32 "lu" -#define SCNxLEAST32 "lx" -#define SCNXLEAST32 "lX" -#define SCNoFAST32 "lo" -#define SCNuFAST32 "lu" -#define SCNxFAST32 "lx" -#define SCNXFAST32 "lX" - -#define SCNo64 "I64o" -#define SCNu64 "I64u" -#define SCNx64 "I64x" -#define SCNX64 "I64X" -#define SCNoLEAST64 "I64o" -#define SCNuLEAST64 "I64u" -#define SCNxLEAST64 "I64x" -#define SCNXLEAST64 "I64X" -#define SCNoFAST64 "I64o" -#define SCNuFAST64 "I64u" -#define SCNxFAST64 "I64x" -#define SCNXFAST64 "I64X" - -#define SCNoMAX "I64o" -#define SCNuMAX "I64u" -#define SCNxMAX "I64x" -#define SCNXMAX "I64X" - -#ifdef _WIN64 // [ -# define SCNoPTR "I64o" -# define SCNuPTR "I64u" -# define SCNxPTR "I64x" -# define SCNXPTR "I64X" -#else // _WIN64 ][ -# define SCNoPTR "lo" -# define SCNuPTR "lu" -# define SCNxPTR "lx" -# define SCNXPTR "lX" -#endif // _WIN64 ] - -#endif // __STDC_FORMAT_MACROS ] - -// 7.8.2 Functions for greatest-width integer types - -// 7.8.2.1 The imaxabs function -#define imaxabs _abs64 - -// 7.8.2.2 The imaxdiv function - -// This is modified version of div() function from Microsoft's div.c found -// in %MSVC.NET%\crt\src\div.c -#ifdef STATIC_IMAXDIV // [ -static -#else // STATIC_IMAXDIV ][ -_inline -#endif // STATIC_IMAXDIV ] -imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) -{ - imaxdiv_t result; - - result.quot = numer / denom; - result.rem = numer % denom; - - if (numer < 0 && result.rem > 0) { - // did division wrong; must fix up - ++result.quot; - result.rem -= denom; - } - - return result; -} - -// 7.8.2.3 The strtoimax and strtoumax functions -#define strtoimax _strtoi64 -#define strtoumax _strtoui64 - -// 7.8.2.4 The wcstoimax and wcstoumax functions -#define wcstoimax _wcstoi64 -#define wcstoumax _wcstoui64 - - -#endif // _MSC_INTTYPES_H_ ] diff --git a/dep/jemalloc/include/msvc_compat/stdbool.h b/dep/jemalloc/include/msvc_compat/stdbool.h deleted file mode 100644 index da9ee8b809b..00000000000 --- a/dep/jemalloc/include/msvc_compat/stdbool.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef stdbool_h -#define stdbool_h - -#include - -/* MSVC doesn't define _Bool or bool in C, but does have BOOL */ -/* Note this doesn't pass autoconf's test because (bool) 0.5 != true */ -typedef BOOL _Bool; - -#define bool _Bool -#define true 1 -#define false 0 - -#define __bool_true_false_are_defined 1 - -#endif /* stdbool_h */ diff --git a/dep/jemalloc/include/msvc_compat/stdint.h b/dep/jemalloc/include/msvc_compat/stdint.h deleted file mode 100644 index d02608a5972..00000000000 --- a/dep/jemalloc/include/msvc_compat/stdint.h +++ /dev/null @@ -1,247 +0,0 @@ -// ISO C9x compliant stdint.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006-2008 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_STDINT_H_ // [ -#define _MSC_STDINT_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include - -// For Visual Studio 6 in C++ mode and for many Visual Studio versions when -// compiling for ARM we should wrap include with 'extern "C++" {}' -// or compiler give many errors like this: -// error C2733: second C linkage of overloaded function 'wmemchr' not allowed -#ifdef __cplusplus -extern "C" { -#endif -# include -#ifdef __cplusplus -} -#endif - -// Define _W64 macros to mark types changing their size, like intptr_t. -#ifndef _W64 -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif - - -// 7.18.1 Integer types - -// 7.18.1.1 Exact-width integer types - -// Visual Studio 6 and Embedded Visual C++ 4 doesn't -// realize that, e.g. char has the same size as __int8 -// so we give up on __intX for them. -#if (_MSC_VER < 1300) - typedef signed char int8_t; - typedef signed short int16_t; - typedef signed int int32_t; - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; - typedef unsigned int uint32_t; -#else - typedef signed __int8 int8_t; - typedef signed __int16 int16_t; - typedef signed __int32 int32_t; - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; -#endif -typedef signed __int64 int64_t; -typedef unsigned __int64 uint64_t; - - -// 7.18.1.2 Minimum-width integer types -typedef int8_t int_least8_t; -typedef int16_t int_least16_t; -typedef int32_t int_least32_t; -typedef int64_t int_least64_t; -typedef uint8_t uint_least8_t; -typedef uint16_t uint_least16_t; -typedef uint32_t uint_least32_t; -typedef uint64_t uint_least64_t; - -// 7.18.1.3 Fastest minimum-width integer types -typedef int8_t int_fast8_t; -typedef int16_t int_fast16_t; -typedef int32_t int_fast32_t; -typedef int64_t int_fast64_t; -typedef uint8_t uint_fast8_t; -typedef uint16_t uint_fast16_t; -typedef uint32_t uint_fast32_t; -typedef uint64_t uint_fast64_t; - -// 7.18.1.4 Integer types capable of holding object pointers -#ifdef _WIN64 // [ - typedef signed __int64 intptr_t; - typedef unsigned __int64 uintptr_t; -#else // _WIN64 ][ - typedef _W64 signed int intptr_t; - typedef _W64 unsigned int uintptr_t; -#endif // _WIN64 ] - -// 7.18.1.5 Greatest-width integer types -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; - - -// 7.18.2 Limits of specified-width integer types - -#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 - -// 7.18.2.1 Limits of exact-width integer types -#define INT8_MIN ((int8_t)_I8_MIN) -#define INT8_MAX _I8_MAX -#define INT16_MIN ((int16_t)_I16_MIN) -#define INT16_MAX _I16_MAX -#define INT32_MIN ((int32_t)_I32_MIN) -#define INT32_MAX _I32_MAX -#define INT64_MIN ((int64_t)_I64_MIN) -#define INT64_MAX _I64_MAX -#define UINT8_MAX _UI8_MAX -#define UINT16_MAX _UI16_MAX -#define UINT32_MAX _UI32_MAX -#define UINT64_MAX _UI64_MAX - -// 7.18.2.2 Limits of minimum-width integer types -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define INT_LEAST64_MIN INT64_MIN -#define INT_LEAST64_MAX INT64_MAX -#define UINT_LEAST8_MAX UINT8_MAX -#define UINT_LEAST16_MAX UINT16_MAX -#define UINT_LEAST32_MAX UINT32_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -// 7.18.2.3 Limits of fastest minimum-width integer types -#define INT_FAST8_MIN INT8_MIN -#define INT_FAST8_MAX INT8_MAX -#define INT_FAST16_MIN INT16_MIN -#define INT_FAST16_MAX INT16_MAX -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST32_MAX INT32_MAX -#define INT_FAST64_MIN INT64_MIN -#define INT_FAST64_MAX INT64_MAX -#define UINT_FAST8_MAX UINT8_MAX -#define UINT_FAST16_MAX UINT16_MAX -#define UINT_FAST32_MAX UINT32_MAX -#define UINT_FAST64_MAX UINT64_MAX - -// 7.18.2.4 Limits of integer types capable of holding object pointers -#ifdef _WIN64 // [ -# define INTPTR_MIN INT64_MIN -# define INTPTR_MAX INT64_MAX -# define UINTPTR_MAX UINT64_MAX -#else // _WIN64 ][ -# define INTPTR_MIN INT32_MIN -# define INTPTR_MAX INT32_MAX -# define UINTPTR_MAX UINT32_MAX -#endif // _WIN64 ] - -// 7.18.2.5 Limits of greatest-width integer types -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -// 7.18.3 Limits of other integer types - -#ifdef _WIN64 // [ -# define PTRDIFF_MIN _I64_MIN -# define PTRDIFF_MAX _I64_MAX -#else // _WIN64 ][ -# define PTRDIFF_MIN _I32_MIN -# define PTRDIFF_MAX _I32_MAX -#endif // _WIN64 ] - -#define SIG_ATOMIC_MIN INT_MIN -#define SIG_ATOMIC_MAX INT_MAX - -#ifndef SIZE_MAX // [ -# ifdef _WIN64 // [ -# define SIZE_MAX _UI64_MAX -# else // _WIN64 ][ -# define SIZE_MAX _UI32_MAX -# endif // _WIN64 ] -#endif // SIZE_MAX ] - -// WCHAR_MIN and WCHAR_MAX are also defined in -#ifndef WCHAR_MIN // [ -# define WCHAR_MIN 0 -#endif // WCHAR_MIN ] -#ifndef WCHAR_MAX // [ -# define WCHAR_MAX _UI16_MAX -#endif // WCHAR_MAX ] - -#define WINT_MIN 0 -#define WINT_MAX _UI16_MAX - -#endif // __STDC_LIMIT_MACROS ] - - -// 7.18.4 Limits of other integer types - -#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 - -// 7.18.4.1 Macros for minimum-width integer constants - -#define INT8_C(val) val##i8 -#define INT16_C(val) val##i16 -#define INT32_C(val) val##i32 -#define INT64_C(val) val##i64 - -#define UINT8_C(val) val##ui8 -#define UINT16_C(val) val##ui16 -#define UINT32_C(val) val##ui32 -#define UINT64_C(val) val##ui64 - -// 7.18.4.2 Macros for greatest-width integer constants -#define INTMAX_C INT64_C -#define UINTMAX_C UINT64_C - -#endif // __STDC_CONSTANT_MACROS ] - - -#endif // _MSC_STDINT_H_ ] diff --git a/dep/jemalloc/jemalloc_internal_defs.h.in.cmake b/dep/jemalloc/jemalloc_internal_defs.h.in.cmake index 1527fa2c2fe..be6f92713a4 100644 --- a/dep/jemalloc/jemalloc_internal_defs.h.in.cmake +++ b/dep/jemalloc/jemalloc_internal_defs.h.in.cmake @@ -34,6 +34,8 @@ * order to yield to another virtual CPU. */ #define CPU_SPINWAIT __asm__ volatile("pause") +/* 1 if CPU_SPINWAIT is defined, 0 otherwise. */ +#define HAVE_CPU_SPINWAIT 1 /* * Number of significant bits in virtual addresses. This may be less than the @@ -238,6 +240,12 @@ */ #define JEMALLOC_CACHE_OBLIVIOUS +/* + * If defined, enable logging facilities. We make this a configure option to + * avoid taking extra branches everywhere. + */ +/* #undef JEMALLOC_LOG */ + /* * Darwin (OS X) uses zones to work around Mach-O symbol override shortcomings. */ @@ -255,6 +263,12 @@ /* Defined if madvise(2) is available. */ #define JEMALLOC_HAVE_MADVISE +/* + * Defined if transparent huge pages are supported via the MADV_[NO]HUGEPAGE + * arguments to madvise(2). + */ +#define JEMALLOC_HAVE_MADVISE_HUGE + /* * Methods for purging unused pages differ between operating systems. * @@ -268,15 +282,23 @@ * MADV_FREE, though typically with higher * system overhead. */ -@JEM_MADFREE_DEF@ JEMALLOC_PURGE_MADVISE_FREE +@JEM_MADFREE_DEF@ JEMALLOC_PURGE_MADVISE_FREE #define JEMALLOC_PURGE_MADVISE_DONTNEED -#define JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS 1 +#define JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS + +/* Defined if madvise(2) is available but MADV_FREE is not (x86 Linux only). */ +/* #undef JEMALLOC_DEFINE_MADVISE_FREE */ + +/* + * Defined if MADV_DO[NT]DUMP is supported as an argument to madvise. + */ +#define JEMALLOC_MADVISE_DONTDUMP /* * Defined if transparent huge pages (THPs) are supported via the * MADV_[NO]HUGEPAGE arguments to madvise(2), and THP support is enabled. */ -#define JEMALLOC_THP +/* #undef JEMALLOC_THP */ /* Define if operating system has alloca.h header. */ #define JEMALLOC_HAS_ALLOCA_H 1 @@ -337,6 +359,11 @@ /* If defined, jemalloc takes the malloc/free/etc. symbol names. */ #define JEMALLOC_IS_MALLOC 1 +/* + * Defined if strerror_r returns char * if _GNU_SOURCE is defined. + */ +#define JEMALLOC_STRERROR_R_RETURNS_CHAR_WITH_GNU_SOURCE + /* sizeof(void *) == 2^LG_SIZEOF_PTR. */ #define LG_SIZEOF_PTR @JEM_SIZEDEF@ diff --git a/dep/jemalloc/src/arena.c b/dep/jemalloc/src/arena.c index 632fce5233e..5d55bf1a060 100644 --- a/dep/jemalloc/src/arena.c +++ b/dep/jemalloc/src/arena.c @@ -3,6 +3,7 @@ #include "jemalloc/internal/jemalloc_internal_includes.h" #include "jemalloc/internal/assert.h" +#include "jemalloc/internal/div.h" #include "jemalloc/internal/extent_dss.h" #include "jemalloc/internal/extent_mmap.h" #include "jemalloc/internal/mutex.h" @@ -32,21 +33,6 @@ ssize_t opt_muzzy_decay_ms = MUZZY_DECAY_MS_DEFAULT; static atomic_zd_t dirty_decay_ms_default; static atomic_zd_t muzzy_decay_ms_default; -const arena_bin_info_t arena_bin_info[NBINS] = { -#define BIN_INFO_bin_yes(reg_size, slab_size, nregs) \ - {reg_size, slab_size, nregs, BITMAP_INFO_INITIALIZER(nregs)}, -#define BIN_INFO_bin_no(reg_size, slab_size, nregs) -#define SC(index, lg_grp, lg_delta, ndelta, psz, bin, pgs, \ - lg_delta_lookup) \ - BIN_INFO_bin_##bin((1U<mtx, "arena_stats", - WITNESS_RANK_ARENA_STATS, malloc_mutex_rank_exclusive)) { - return true; - } -#endif - /* Memory is zeroed, so there is no need to clear stats. */ - return false; -} - -static void -arena_stats_lock(tsdn_t *tsdn, arena_stats_t *arena_stats) { -#ifndef JEMALLOC_ATOMIC_U64 - malloc_mutex_lock(tsdn, &arena_stats->mtx); -#endif -} - -static void -arena_stats_unlock(tsdn_t *tsdn, arena_stats_t *arena_stats) { -#ifndef JEMALLOC_ATOMIC_U64 - malloc_mutex_unlock(tsdn, &arena_stats->mtx); -#endif -} - -static uint64_t -arena_stats_read_u64(tsdn_t *tsdn, arena_stats_t *arena_stats, - arena_stats_u64_t *p) { -#ifdef JEMALLOC_ATOMIC_U64 - return atomic_load_u64(p, ATOMIC_RELAXED); -#else - malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); - return *p; -#endif -} - -static void -arena_stats_add_u64(tsdn_t *tsdn, arena_stats_t *arena_stats, - arena_stats_u64_t *p, uint64_t x) { -#ifdef JEMALLOC_ATOMIC_U64 - atomic_fetch_add_u64(p, x, ATOMIC_RELAXED); -#else - malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); - *p += x; -#endif -} - -UNUSED static void -arena_stats_sub_u64(tsdn_t *tsdn, arena_stats_t *arena_stats, - arena_stats_u64_t *p, uint64_t x) { -#ifdef JEMALLOC_ATOMIC_U64 - UNUSED uint64_t r = atomic_fetch_sub_u64(p, x, ATOMIC_RELAXED); - assert(r - x <= r); -#else - malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); - *p -= x; - assert(*p + x >= *p); -#endif -} - -/* - * Non-atomically sets *dst += src. *dst needs external synchronization. - * This lets us avoid the cost of a fetch_add when its unnecessary (note that - * the types here are atomic). - */ -static void -arena_stats_accum_u64(arena_stats_u64_t *dst, uint64_t src) { -#ifdef JEMALLOC_ATOMIC_U64 - uint64_t cur_dst = atomic_load_u64(dst, ATOMIC_RELAXED); - atomic_store_u64(dst, src + cur_dst, ATOMIC_RELAXED); -#else - *dst += src; -#endif -} - -static size_t -arena_stats_read_zu(tsdn_t *tsdn, arena_stats_t *arena_stats, atomic_zu_t *p) { -#ifdef JEMALLOC_ATOMIC_U64 - return atomic_load_zu(p, ATOMIC_RELAXED); -#else - malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); - return atomic_load_zu(p, ATOMIC_RELAXED); -#endif -} - -static void -arena_stats_add_zu(tsdn_t *tsdn, arena_stats_t *arena_stats, atomic_zu_t *p, - size_t x) { -#ifdef JEMALLOC_ATOMIC_U64 - atomic_fetch_add_zu(p, x, ATOMIC_RELAXED); -#else - malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); - size_t cur = atomic_load_zu(p, ATOMIC_RELAXED); - atomic_store_zu(p, cur + x, ATOMIC_RELAXED); -#endif -} - -static void -arena_stats_sub_zu(tsdn_t *tsdn, arena_stats_t *arena_stats, atomic_zu_t *p, - size_t x) { -#ifdef JEMALLOC_ATOMIC_U64 - UNUSED size_t r = atomic_fetch_sub_zu(p, x, ATOMIC_RELAXED); - assert(r - x <= r); -#else - malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); - size_t cur = atomic_load_zu(p, ATOMIC_RELAXED); - atomic_store_zu(p, cur - x, ATOMIC_RELAXED); -#endif -} - -/* Like the _u64 variant, needs an externally synchronized *dst. */ -static void -arena_stats_accum_zu(atomic_zu_t *dst, size_t src) { - size_t cur_dst = atomic_load_zu(dst, ATOMIC_RELAXED); - atomic_store_zu(dst, src + cur_dst, ATOMIC_RELAXED); -} - void -arena_stats_large_nrequests_add(tsdn_t *tsdn, arena_stats_t *arena_stats, - szind_t szind, uint64_t nrequests) { - arena_stats_lock(tsdn, arena_stats); - arena_stats_add_u64(tsdn, arena_stats, &arena_stats->lstats[szind - - NBINS].nrequests, nrequests); - arena_stats_unlock(tsdn, arena_stats); -} - -void -arena_stats_mapped_add(tsdn_t *tsdn, arena_stats_t *arena_stats, size_t size) { - arena_stats_lock(tsdn, arena_stats); - arena_stats_add_zu(tsdn, arena_stats, &arena_stats->mapped, size); - arena_stats_unlock(tsdn, arena_stats); -} - -void -arena_basic_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads, +arena_basic_stats_merge(UNUSED tsdn_t *tsdn, arena_t *arena, unsigned *nthreads, const char **dss, ssize_t *dirty_decay_ms, ssize_t *muzzy_decay_ms, size_t *nactive, size_t *ndirty, size_t *nmuzzy) { *nthreads += arena_nthreads_get(arena, false); @@ -228,15 +77,15 @@ void arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads, const char **dss, ssize_t *dirty_decay_ms, ssize_t *muzzy_decay_ms, size_t *nactive, size_t *ndirty, size_t *nmuzzy, arena_stats_t *astats, - malloc_bin_stats_t *bstats, malloc_large_stats_t *lstats) { + bin_stats_t *bstats, arena_stats_large_t *lstats) { cassert(config_stats); arena_basic_stats_merge(tsdn, arena, nthreads, dss, dirty_decay_ms, muzzy_decay_ms, nactive, ndirty, nmuzzy); - size_t base_allocated, base_resident, base_mapped; + size_t base_allocated, base_resident, base_mapped, metadata_thp; base_stats_get(tsdn, arena->base, &base_allocated, &base_resident, - &base_mapped); + &base_mapped, &metadata_thp); arena_stats_lock(tsdn, &arena->stats); @@ -267,6 +116,7 @@ arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads, arena_stats_accum_zu(&astats->base, base_allocated); arena_stats_accum_zu(&astats->internal, arena_internal_get(arena)); + arena_stats_accum_zu(&astats->metadata_thp, metadata_thp); arena_stats_accum_zu(&astats->resident, base_resident + (((atomic_load_zu(&arena->nactive, ATOMIC_RELAXED) + extents_npages_get(&arena->extents_dirty) + @@ -303,16 +153,16 @@ arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads, /* tcache_bytes counts currently cached bytes. */ atomic_store_zu(&astats->tcache_bytes, 0, ATOMIC_RELAXED); malloc_mutex_lock(tsdn, &arena->tcache_ql_mtx); - tcache_t *tcache; - ql_foreach(tcache, &arena->tcache_ql, link) { + cache_bin_array_descriptor_t *descriptor; + ql_foreach(descriptor, &arena->cache_bin_array_descriptor_ql, link) { szind_t i = 0; for (; i < NBINS; i++) { - tcache_bin_t *tbin = tcache_small_bin_get(tcache, i); + cache_bin_t *tbin = &descriptor->bins_small[i]; arena_stats_accum_zu(&astats->tcache_bytes, tbin->ncached * sz_index2size(i)); } for (; i < nhbins; i++) { - tcache_bin_t *tbin = tcache_large_bin_get(tcache, i); + cache_bin_t *tbin = &descriptor->bins_large[i]; arena_stats_accum_zu(&astats->tcache_bytes, tbin->ncached * sz_index2size(i)); } @@ -351,20 +201,7 @@ arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads, nstime_subtract(&astats->uptime, &arena->create_time); for (szind_t i = 0; i < NBINS; i++) { - arena_bin_t *bin = &arena->bins[i]; - - malloc_mutex_lock(tsdn, &bin->lock); - malloc_mutex_prof_read(tsdn, &bstats[i].mutex_data, &bin->lock); - bstats[i].nmalloc += bin->stats.nmalloc; - bstats[i].ndalloc += bin->stats.ndalloc; - bstats[i].nrequests += bin->stats.nrequests; - bstats[i].curregs += bin->stats.curregs; - bstats[i].nfills += bin->stats.nfills; - bstats[i].nflushes += bin->stats.nflushes; - bstats[i].nslabs += bin->stats.nslabs; - bstats[i].reslabs += bin->stats.reslabs; - bstats[i].curslabs += bin->stats.curslabs; - malloc_mutex_unlock(tsdn, &bin->lock); + bin_stats_merge(tsdn, &bstats[i], &arena->bins[i]); } } @@ -384,8 +221,7 @@ arena_extents_dirty_dalloc(tsdn_t *tsdn, arena_t *arena, } static void * -arena_slab_reg_alloc(tsdn_t *tsdn, extent_t *slab, - const arena_bin_info_t *bin_info) { +arena_slab_reg_alloc(extent_t *slab, const bin_info_t *bin_info) { void *ret; arena_slab_data_t *slab_data = extent_slab_data_get(slab); size_t regind; @@ -412,37 +248,22 @@ arena_slab_regind(extent_t *slab, szind_t binind, const void *ptr) { assert((uintptr_t)ptr < (uintptr_t)extent_past_get(slab)); /* Freeing an interior pointer can cause assertion failure. */ assert(((uintptr_t)ptr - (uintptr_t)extent_addr_get(slab)) % - (uintptr_t)arena_bin_info[binind].reg_size == 0); + (uintptr_t)bin_infos[binind].reg_size == 0); + + diff = (size_t)((uintptr_t)ptr - (uintptr_t)extent_addr_get(slab)); /* Avoid doing division with a variable divisor. */ - diff = (size_t)((uintptr_t)ptr - (uintptr_t)extent_addr_get(slab)); - switch (binind) { -#define REGIND_bin_yes(index, reg_size) \ - case index: \ - regind = diff / (reg_size); \ - assert(diff == regind * (reg_size)); \ - break; -#define REGIND_bin_no(index, reg_size) -#define SC(index, lg_grp, lg_delta, ndelta, psz, bin, pgs, \ - lg_delta_lookup) \ - REGIND_bin_##bin(index, (1U<nregs); @@ -692,7 +513,8 @@ arena_decay_try_purge(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, bool is_background_thread) { if (current_npages > npages_limit) { arena_decay_to_limit(tsdn, arena, decay, extents, false, - npages_limit, is_background_thread); + npages_limit, current_npages - npages_limit, + is_background_thread); } } @@ -738,7 +560,7 @@ arena_decay_epoch_advance(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, } static void -arena_decay_reinit(arena_decay_t *decay, extents_t *extents, ssize_t decay_ms) { +arena_decay_reinit(arena_decay_t *decay, ssize_t decay_ms) { arena_decay_ms_write(decay, decay_ms); if (decay_ms > 0) { nstime_init(&decay->interval, (uint64_t)decay_ms * @@ -755,8 +577,8 @@ arena_decay_reinit(arena_decay_t *decay, extents_t *extents, ssize_t decay_ms) { } static bool -arena_decay_init(arena_decay_t *decay, extents_t *extents, ssize_t decay_ms, - decay_stats_t *stats) { +arena_decay_init(arena_decay_t *decay, ssize_t decay_ms, + arena_stats_decay_t *stats) { if (config_debug) { for (size_t i = 0; i < sizeof(arena_decay_t); i++) { assert(((char *)decay)[i] == 0); @@ -768,7 +590,7 @@ arena_decay_init(arena_decay_t *decay, extents_t *extents, ssize_t decay_ms, return true; } decay->purging = false; - arena_decay_reinit(decay, extents, decay_ms); + arena_decay_reinit(decay, decay_ms); /* Memory is zeroed, so there is no need to clear stats. */ if (config_stats) { decay->stats = stats; @@ -798,7 +620,8 @@ arena_maybe_decay(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, if (decay_ms <= 0) { if (decay_ms == 0) { arena_decay_to_limit(tsdn, arena, decay, extents, false, - 0, is_background_thread); + 0, extents_npages_get(extents), + is_background_thread); } return false; } @@ -876,7 +699,7 @@ arena_decay_ms_set(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, * infrequent, either between the {-1, 0, >0} states, or a one-time * arbitrary change during initial arena configuration. */ - arena_decay_reinit(decay, extents, decay_ms); + arena_decay_reinit(decay, decay_ms); arena_maybe_decay(tsdn, arena, decay, extents, false); malloc_mutex_unlock(tsdn, &decay->mtx); @@ -900,14 +723,15 @@ arena_muzzy_decay_ms_set(tsdn_t *tsdn, arena_t *arena, static size_t arena_stash_decayed(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, extents_t *extents, size_t npages_limit, - extent_list_t *decay_extents) { + size_t npages_decay_max, extent_list_t *decay_extents) { witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), WITNESS_RANK_CORE, 0); /* Stash extents according to npages_limit. */ size_t nstashed = 0; extent_t *extent; - while ((extent = extents_evict(tsdn, arena, r_extent_hooks, extents, + while (nstashed < npages_decay_max && + (extent = extents_evict(tsdn, arena, r_extent_hooks, extents, npages_limit)) != NULL) { extent_list_append(decay_extents, extent); nstashed += extent_size_get(extent) >> LG_PAGE; @@ -982,12 +806,15 @@ arena_decay_stashed(tsdn_t *tsdn, arena_t *arena, } /* - * npages_limit: Decay as many dirty extents as possible without violating the - * invariant: (extents_npages_get(extents) >= npages_limit) + * npages_limit: Decay at most npages_decay_max pages without violating the + * invariant: (extents_npages_get(extents) >= npages_limit). We need an upper + * bound on number of pages in order to prevent unbounded growth (namely in + * stashed), otherwise unbounded new pages could be added to extents during the + * current decay run, so that the purging thread never finishes. */ static void arena_decay_to_limit(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, - extents_t *extents, bool all, size_t npages_limit, + extents_t *extents, bool all, size_t npages_limit, size_t npages_decay_max, bool is_background_thread) { witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), WITNESS_RANK_CORE, 1); @@ -1005,7 +832,7 @@ arena_decay_to_limit(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, extent_list_init(&decay_extents); size_t npurge = arena_stash_decayed(tsdn, arena, &extent_hooks, extents, - npages_limit, &decay_extents); + npages_limit, npages_decay_max, &decay_extents); if (npurge != 0) { UNUSED size_t npurged = arena_decay_stashed(tsdn, arena, &extent_hooks, decay, extents, all, &decay_extents, @@ -1023,7 +850,7 @@ arena_decay_impl(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, if (all) { malloc_mutex_lock(tsdn, &decay->mtx); arena_decay_to_limit(tsdn, arena, decay, extents, all, 0, - is_background_thread); + extents_npages_get(extents), is_background_thread); malloc_mutex_unlock(tsdn, &decay->mtx); return false; @@ -1036,7 +863,7 @@ arena_decay_impl(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, bool epoch_advanced = arena_maybe_decay(tsdn, arena, decay, extents, is_background_thread); - size_t npages_new; + UNUSED size_t npages_new; if (epoch_advanced) { /* Backlog is updated on epoch advance. */ npages_new = decay->backlog[SMOOTHSTEP_NSTEPS-1]; @@ -1045,7 +872,8 @@ arena_decay_impl(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, if (have_background_thread && background_thread_enabled() && epoch_advanced && !is_background_thread) { - background_thread_interval_check(tsdn, arena, decay, npages_new); + background_thread_interval_check(tsdn, arena, decay, + npages_new); } return false; @@ -1082,18 +910,18 @@ arena_slab_dalloc(tsdn_t *tsdn, arena_t *arena, extent_t *slab) { } static void -arena_bin_slabs_nonfull_insert(arena_bin_t *bin, extent_t *slab) { +arena_bin_slabs_nonfull_insert(bin_t *bin, extent_t *slab) { assert(extent_nfree_get(slab) > 0); extent_heap_insert(&bin->slabs_nonfull, slab); } static void -arena_bin_slabs_nonfull_remove(arena_bin_t *bin, extent_t *slab) { +arena_bin_slabs_nonfull_remove(bin_t *bin, extent_t *slab) { extent_heap_remove(&bin->slabs_nonfull, slab); } static extent_t * -arena_bin_slabs_nonfull_tryget(arena_bin_t *bin) { +arena_bin_slabs_nonfull_tryget(bin_t *bin) { extent_t *slab = extent_heap_remove_first(&bin->slabs_nonfull); if (slab == NULL) { return NULL; @@ -1105,7 +933,7 @@ arena_bin_slabs_nonfull_tryget(arena_bin_t *bin) { } static void -arena_bin_slabs_full_insert(arena_t *arena, arena_bin_t *bin, extent_t *slab) { +arena_bin_slabs_full_insert(arena_t *arena, bin_t *bin, extent_t *slab) { assert(extent_nfree_get(slab) == 0); /* * Tracking extents is required by arena_reset, which is not allowed @@ -1119,7 +947,7 @@ arena_bin_slabs_full_insert(arena_t *arena, arena_bin_t *bin, extent_t *slab) { } static void -arena_bin_slabs_full_remove(arena_t *arena, arena_bin_t *bin, extent_t *slab) { +arena_bin_slabs_full_remove(arena_t *arena, bin_t *bin, extent_t *slab) { if (arena_is_auto(arena)) { return; } @@ -1173,7 +1001,7 @@ arena_reset(tsd_t *tsd, arena_t *arena) { /* Bins. */ for (unsigned i = 0; i < NBINS; i++) { extent_t *slab; - arena_bin_t *bin = &arena->bins[i]; + bin_t *bin = &arena->bins[i]; malloc_mutex_lock(tsd_tsdn(tsd), &bin->lock); if (bin->slabcur != NULL) { slab = bin->slabcur; @@ -1262,7 +1090,7 @@ arena_destroy(tsd_t *tsd, arena_t *arena) { static extent_t * arena_slab_alloc_hard(tsdn_t *tsdn, arena_t *arena, - extent_hooks_t **r_extent_hooks, const arena_bin_info_t *bin_info, + extent_hooks_t **r_extent_hooks, const bin_info_t *bin_info, szind_t szind) { extent_t *slab; bool zero, commit; @@ -1285,7 +1113,7 @@ arena_slab_alloc_hard(tsdn_t *tsdn, arena_t *arena, static extent_t * arena_slab_alloc(tsdn_t *tsdn, arena_t *arena, szind_t binind, - const arena_bin_info_t *bin_info) { + const bin_info_t *bin_info) { witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), WITNESS_RANK_CORE, 0); @@ -1321,10 +1149,10 @@ arena_slab_alloc(tsdn_t *tsdn, arena_t *arena, szind_t binind, } static extent_t * -arena_bin_nonfull_slab_get(tsdn_t *tsdn, arena_t *arena, arena_bin_t *bin, +arena_bin_nonfull_slab_get(tsdn_t *tsdn, arena_t *arena, bin_t *bin, szind_t binind) { extent_t *slab; - const arena_bin_info_t *bin_info; + const bin_info_t *bin_info; /* Look for a usable slab. */ slab = arena_bin_slabs_nonfull_tryget(bin); @@ -1333,7 +1161,7 @@ arena_bin_nonfull_slab_get(tsdn_t *tsdn, arena_t *arena, arena_bin_t *bin, } /* No existing slabs have any space available. */ - bin_info = &arena_bin_info[binind]; + bin_info = &bin_infos[binind]; /* Allocate a new slab. */ malloc_mutex_unlock(tsdn, &bin->lock); @@ -1364,12 +1192,12 @@ arena_bin_nonfull_slab_get(tsdn_t *tsdn, arena_t *arena, arena_bin_t *bin, /* Re-fill bin->slabcur, then call arena_slab_reg_alloc(). */ static void * -arena_bin_malloc_hard(tsdn_t *tsdn, arena_t *arena, arena_bin_t *bin, +arena_bin_malloc_hard(tsdn_t *tsdn, arena_t *arena, bin_t *bin, szind_t binind) { - const arena_bin_info_t *bin_info; + const bin_info_t *bin_info; extent_t *slab; - bin_info = &arena_bin_info[binind]; + bin_info = &bin_infos[binind]; if (!arena_is_auto(arena) && bin->slabcur != NULL) { arena_bin_slabs_full_insert(arena, bin, bin->slabcur); bin->slabcur = NULL; @@ -1381,7 +1209,7 @@ arena_bin_malloc_hard(tsdn_t *tsdn, arena_t *arena, arena_bin_t *bin, * bin lock in arena_bin_nonfull_slab_get(). */ if (extent_nfree_get(bin->slabcur) > 0) { - void *ret = arena_slab_reg_alloc(tsdn, bin->slabcur, + void *ret = arena_slab_reg_alloc(bin->slabcur, bin_info); if (slab != NULL) { /* @@ -1415,14 +1243,14 @@ arena_bin_malloc_hard(tsdn_t *tsdn, arena_t *arena, arena_bin_t *bin, assert(extent_nfree_get(bin->slabcur) > 0); - return arena_slab_reg_alloc(tsdn, slab, bin_info); + return arena_slab_reg_alloc(slab, bin_info); } void arena_tcache_fill_small(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache, - tcache_bin_t *tbin, szind_t binind, uint64_t prof_accumbytes) { + cache_bin_t *tbin, szind_t binind, uint64_t prof_accumbytes) { unsigned i, nfill; - arena_bin_t *bin; + bin_t *bin; assert(tbin->ncached == 0); @@ -1437,8 +1265,7 @@ arena_tcache_fill_small(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache, void *ptr; if ((slab = bin->slabcur) != NULL && extent_nfree_get(slab) > 0) { - ptr = arena_slab_reg_alloc(tsdn, slab, - &arena_bin_info[binind]); + ptr = arena_slab_reg_alloc(slab, &bin_infos[binind]); } else { ptr = arena_bin_malloc_hard(tsdn, arena, bin, binind); } @@ -1455,8 +1282,7 @@ arena_tcache_fill_small(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache, break; } if (config_fill && unlikely(opt_junk_alloc)) { - arena_alloc_junk_small(ptr, &arena_bin_info[binind], - true); + arena_alloc_junk_small(ptr, &bin_infos[binind], true); } /* Insert such that low regions get used first. */ *(tbin->avail - nfill + i) = ptr; @@ -1474,14 +1300,14 @@ arena_tcache_fill_small(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache, } void -arena_alloc_junk_small(void *ptr, const arena_bin_info_t *bin_info, bool zero) { +arena_alloc_junk_small(void *ptr, const bin_info_t *bin_info, bool zero) { if (!zero) { memset(ptr, JEMALLOC_ALLOC_JUNK, bin_info->reg_size); } } static void -arena_dalloc_junk_small_impl(void *ptr, const arena_bin_info_t *bin_info) { +arena_dalloc_junk_small_impl(void *ptr, const bin_info_t *bin_info) { memset(ptr, JEMALLOC_FREE_JUNK, bin_info->reg_size); } arena_dalloc_junk_small_t *JET_MUTABLE arena_dalloc_junk_small = @@ -1490,7 +1316,7 @@ arena_dalloc_junk_small_t *JET_MUTABLE arena_dalloc_junk_small = static void * arena_malloc_small(tsdn_t *tsdn, arena_t *arena, szind_t binind, bool zero) { void *ret; - arena_bin_t *bin; + bin_t *bin; size_t usize; extent_t *slab; @@ -1500,7 +1326,7 @@ arena_malloc_small(tsdn_t *tsdn, arena_t *arena, szind_t binind, bool zero) { malloc_mutex_lock(tsdn, &bin->lock); if ((slab = bin->slabcur) != NULL && extent_nfree_get(slab) > 0) { - ret = arena_slab_reg_alloc(tsdn, slab, &arena_bin_info[binind]); + ret = arena_slab_reg_alloc(slab, &bin_infos[binind]); } else { ret = arena_bin_malloc_hard(tsdn, arena, bin, binind); } @@ -1524,14 +1350,14 @@ arena_malloc_small(tsdn_t *tsdn, arena_t *arena, szind_t binind, bool zero) { if (config_fill) { if (unlikely(opt_junk_alloc)) { arena_alloc_junk_small(ret, - &arena_bin_info[binind], false); + &bin_infos[binind], false); } else if (unlikely(opt_zero)) { memset(ret, 0, usize); } } } else { if (config_fill && unlikely(opt_junk_alloc)) { - arena_alloc_junk_small(ret, &arena_bin_info[binind], + arena_alloc_junk_small(ret, &bin_infos[binind], true); } memset(ret, 0, usize); @@ -1636,13 +1462,13 @@ arena_dalloc_promoted(tsdn_t *tsdn, void *ptr, tcache_t *tcache, } static void -arena_dissociate_bin_slab(arena_t *arena, extent_t *slab, arena_bin_t *bin) { +arena_dissociate_bin_slab(arena_t *arena, extent_t *slab, bin_t *bin) { /* Dissociate slab from bin. */ if (slab == bin->slabcur) { bin->slabcur = NULL; } else { szind_t binind = extent_szind_get(slab); - const arena_bin_info_t *bin_info = &arena_bin_info[binind]; + const bin_info_t *bin_info = &bin_infos[binind]; /* * The following block's conditional is necessary because if the @@ -1659,7 +1485,7 @@ arena_dissociate_bin_slab(arena_t *arena, extent_t *slab, arena_bin_t *bin) { static void arena_dalloc_bin_slab(tsdn_t *tsdn, arena_t *arena, extent_t *slab, - arena_bin_t *bin) { + bin_t *bin) { assert(slab != bin->slabcur); malloc_mutex_unlock(tsdn, &bin->lock); @@ -1673,8 +1499,8 @@ arena_dalloc_bin_slab(tsdn_t *tsdn, arena_t *arena, extent_t *slab, } static void -arena_bin_lower_slab(tsdn_t *tsdn, arena_t *arena, extent_t *slab, - arena_bin_t *bin) { +arena_bin_lower_slab(UNUSED tsdn_t *tsdn, arena_t *arena, extent_t *slab, + bin_t *bin) { assert(extent_nfree_get(slab) > 0); /* @@ -1704,14 +1530,14 @@ arena_dalloc_bin_locked_impl(tsdn_t *tsdn, arena_t *arena, extent_t *slab, void *ptr, bool junked) { arena_slab_data_t *slab_data = extent_slab_data_get(slab); szind_t binind = extent_szind_get(slab); - arena_bin_t *bin = &arena->bins[binind]; - const arena_bin_info_t *bin_info = &arena_bin_info[binind]; + bin_t *bin = &arena->bins[binind]; + const bin_info_t *bin_info = &bin_infos[binind]; if (!junked && config_fill && unlikely(opt_junk_free)) { arena_dalloc_junk_small(ptr, bin_info); } - arena_slab_reg_dalloc(tsdn, slab, slab_data, ptr); + arena_slab_reg_dalloc(slab, slab_data, ptr); unsigned nfree = extent_nfree_get(slab); if (nfree == bin_info->nregs) { arena_dissociate_bin_slab(arena, slab, bin); @@ -1736,7 +1562,7 @@ arena_dalloc_bin_junked_locked(tsdn_t *tsdn, arena_t *arena, extent_t *extent, static void arena_dalloc_bin(tsdn_t *tsdn, arena_t *arena, extent_t *extent, void *ptr) { szind_t binind = extent_szind_get(extent); - arena_bin_t *bin = &arena->bins[binind]; + bin_t *bin = &arena->bins[binind]; malloc_mutex_lock(tsdn, &bin->lock); arena_dalloc_bin_locked_impl(tsdn, arena, extent, ptr, false); @@ -1770,7 +1596,7 @@ arena_ralloc_no_move(tsdn_t *tsdn, void *ptr, size_t oldsize, size_t size, * Avoid moving the allocation if the size class can be left the * same. */ - assert(arena_bin_info[sz_size2index(oldsize)].reg_size == + assert(bin_infos[sz_size2index(oldsize)].reg_size == oldsize); if ((usize_max > SMALL_MAXCLASS || sz_size2index(usize_max) != sz_size2index(oldsize)) && (size > oldsize || usize_max < @@ -1885,6 +1711,33 @@ arena_muzzy_decay_ms_default_set(ssize_t decay_ms) { return false; } +bool +arena_retain_grow_limit_get_set(tsd_t *tsd, arena_t *arena, size_t *old_limit, + size_t *new_limit) { + assert(opt_retain); + + pszind_t new_ind JEMALLOC_CC_SILENCE_INIT(0); + if (new_limit != NULL) { + size_t limit = *new_limit; + /* Grow no more than the new limit. */ + if ((new_ind = sz_psz2ind(limit + 1) - 1) > + EXTENT_GROW_MAX_PIND) { + return true; + } + } + + malloc_mutex_lock(tsd_tsdn(tsd), &arena->extent_grow_mtx); + if (old_limit != NULL) { + *old_limit = sz_pind2sz(arena->retain_grow_limit); + } + if (new_limit != NULL) { + arena->retain_grow_limit = new_ind; + } + malloc_mutex_unlock(tsd_tsdn(tsd), &arena->extent_grow_mtx); + + return false; +} + unsigned arena_nthreads_get(arena_t *arena, bool internal) { return atomic_load_u(&arena->nthreads[internal], ATOMIC_RELAXED); @@ -1935,6 +1788,7 @@ arena_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks) { } ql_new(&arena->tcache_ql); + ql_new(&arena->cache_bin_array_descriptor_ql); if (malloc_mutex_init(&arena->tcache_ql_mtx, "tcache_ql", WITNESS_RANK_TCACHE_QL, malloc_mutex_rank_exclusive)) { goto label_error; @@ -2001,16 +1855,17 @@ arena_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks) { goto label_error; } - if (arena_decay_init(&arena->decay_dirty, &arena->extents_dirty, + if (arena_decay_init(&arena->decay_dirty, arena_dirty_decay_ms_default_get(), &arena->stats.decay_dirty)) { goto label_error; } - if (arena_decay_init(&arena->decay_muzzy, &arena->extents_muzzy, + if (arena_decay_init(&arena->decay_muzzy, arena_muzzy_decay_ms_default_get(), &arena->stats.decay_muzzy)) { goto label_error; } arena->extent_grow_next = sz_psz2ind(HUGEPAGE); + arena->retain_grow_limit = EXTENT_GROW_MAX_PIND; if (malloc_mutex_init(&arena->extent_grow_mtx, "extent_grow", WITNESS_RANK_EXTENT_GROW, malloc_mutex_rank_exclusive)) { goto label_error; @@ -2024,17 +1879,10 @@ arena_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks) { /* Initialize bins. */ for (i = 0; i < NBINS; i++) { - arena_bin_t *bin = &arena->bins[i]; - if (malloc_mutex_init(&bin->lock, "arena_bin", - WITNESS_RANK_ARENA_BIN, malloc_mutex_rank_exclusive)) { + bool err = bin_init(&arena->bins[i]); + if (err) { goto label_error; } - bin->slabcur = NULL; - extent_heap_new(&bin->slabs_nonfull); - extent_list_init(&bin->slabs_full); - if (config_stats) { - memset(&bin->stats, 0, sizeof(malloc_bin_stats_t)); - } } arena->base = base; @@ -2070,6 +1918,16 @@ void arena_boot(void) { arena_dirty_decay_ms_default_set(opt_dirty_decay_ms); arena_muzzy_decay_ms_default_set(opt_muzzy_decay_ms); +#define REGIND_bin_yes(index, reg_size) \ + div_init(&arena_binind_div_info[(index)], (reg_size)); +#define REGIND_bin_no(index, reg_size) +#define SC(index, lg_grp, lg_delta, ndelta, psz, bin, pgs, \ + lg_delta_lookup) \ + REGIND_bin_##bin(index, (1U<bins[i].lock); + bin_prefork(tsdn, &arena->bins[i]); } } @@ -2124,7 +1982,7 @@ arena_postfork_parent(tsdn_t *tsdn, arena_t *arena) { unsigned i; for (i = 0; i < NBINS; i++) { - malloc_mutex_postfork_parent(tsdn, &arena->bins[i].lock); + bin_postfork_parent(tsdn, &arena->bins[i]); } malloc_mutex_postfork_parent(tsdn, &arena->large_mtx); base_postfork_parent(tsdn, arena->base); @@ -2154,15 +2012,21 @@ arena_postfork_child(tsdn_t *tsdn, arena_t *arena) { } if (config_stats) { ql_new(&arena->tcache_ql); + ql_new(&arena->cache_bin_array_descriptor_ql); tcache_t *tcache = tcache_get(tsdn_tsd(tsdn)); if (tcache != NULL && tcache->arena == arena) { ql_elm_new(tcache, link); ql_tail_insert(&arena->tcache_ql, tcache, link); + cache_bin_array_descriptor_init( + &tcache->cache_bin_array_descriptor, + tcache->bins_small, tcache->bins_large); + ql_tail_insert(&arena->cache_bin_array_descriptor_ql, + &tcache->cache_bin_array_descriptor, link); } } for (i = 0; i < NBINS; i++) { - malloc_mutex_postfork_child(tsdn, &arena->bins[i].lock); + bin_postfork_child(tsdn, &arena->bins[i]); } malloc_mutex_postfork_child(tsdn, &arena->large_mtx); base_postfork_child(tsdn, arena->base); diff --git a/dep/jemalloc/src/background_thread.c b/dep/jemalloc/src/background_thread.c index eb30eb5b423..3517a3bb8ed 100644 --- a/dep/jemalloc/src/background_thread.c +++ b/dep/jemalloc/src/background_thread.c @@ -11,12 +11,14 @@ #define BACKGROUND_THREAD_DEFAULT false /* Read-only after initialization. */ bool opt_background_thread = BACKGROUND_THREAD_DEFAULT; +size_t opt_max_background_threads = MAX_BACKGROUND_THREAD_LIMIT; /* Used for thread creation, termination and stats. */ malloc_mutex_t background_thread_lock; /* Indicates global state. Atomic because decay reads this w/o locking. */ atomic_b_t background_thread_enabled_state; size_t n_background_threads; +size_t max_background_threads; /* Thread info per-index. */ background_thread_info_t *background_thread_info; @@ -30,19 +32,20 @@ bool can_enable_background_thread; static int (*pthread_create_fptr)(pthread_t *__restrict, const pthread_attr_t *, void *(*)(void *), void *__restrict); -static pthread_once_t once_control = PTHREAD_ONCE_INIT; static void -pthread_create_wrapper_once(void) { +pthread_create_wrapper_init(void) { #ifdef JEMALLOC_LAZY_LOCK - isthreaded = true; + if (!isthreaded) { + isthreaded = true; + } #endif } int pthread_create_wrapper(pthread_t *__restrict thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *__restrict arg) { - pthread_once(&once_control, pthread_create_wrapper_once); + pthread_create_wrapper_init(); return pthread_create_fptr(thread, attr, start_routine, arg); } @@ -286,7 +289,7 @@ background_work_sleep_once(tsdn_t *tsdn, background_thread_info_t *info, unsigne uint64_t min_interval = BACKGROUND_THREAD_INDEFINITE_SLEEP; unsigned narenas = narenas_total_get(); - for (unsigned i = ind; i < narenas; i += ncpus) { + for (unsigned i = ind; i < narenas; i += max_background_threads) { arena_t *arena = arena_get(tsdn, i, false); if (!arena) { continue; @@ -379,35 +382,32 @@ background_thread_create_signals_masked(pthread_t *thread, return create_err; } -static void +static bool check_background_thread_creation(tsd_t *tsd, unsigned *n_created, bool *created_threads) { + bool ret = false; if (likely(*n_created == n_background_threads)) { - return; + return ret; } - malloc_mutex_unlock(tsd_tsdn(tsd), &background_thread_info[0].mtx); -label_restart: - malloc_mutex_lock(tsd_tsdn(tsd), &background_thread_lock); - for (unsigned i = 1; i < ncpus; i++) { + tsdn_t *tsdn = tsd_tsdn(tsd); + malloc_mutex_unlock(tsdn, &background_thread_info[0].mtx); + for (unsigned i = 1; i < max_background_threads; i++) { if (created_threads[i]) { continue; } background_thread_info_t *info = &background_thread_info[i]; - malloc_mutex_lock(tsd_tsdn(tsd), &info->mtx); - assert(info->state != background_thread_paused); + malloc_mutex_lock(tsdn, &info->mtx); + /* + * In case of the background_thread_paused state because of + * arena reset, delay the creation. + */ bool create = (info->state == background_thread_started); - malloc_mutex_unlock(tsd_tsdn(tsd), &info->mtx); + malloc_mutex_unlock(tsdn, &info->mtx); if (!create) { continue; } - /* - * To avoid deadlock with prefork handlers (which waits for the - * mutex held here), unlock before calling pthread_create(). - */ - malloc_mutex_unlock(tsd_tsdn(tsd), &background_thread_lock); - pre_reentrancy(tsd, NULL); int err = background_thread_create_signals_masked(&info->thread, NULL, background_thread_entry, (void *)(uintptr_t)i); @@ -423,19 +423,21 @@ label_restart: abort(); } } - /* Restart since we unlocked. */ - goto label_restart; + /* Return to restart the loop since we unlocked. */ + ret = true; + break; } - malloc_mutex_lock(tsd_tsdn(tsd), &background_thread_info[0].mtx); - malloc_mutex_unlock(tsd_tsdn(tsd), &background_thread_lock); + malloc_mutex_lock(tsdn, &background_thread_info[0].mtx); + + return ret; } static void background_thread0_work(tsd_t *tsd) { /* Thread0 is also responsible for launching / terminating threads. */ - VARIABLE_ARRAY(bool, created_threads, ncpus); + VARIABLE_ARRAY(bool, created_threads, max_background_threads); unsigned i; - for (i = 1; i < ncpus; i++) { + for (i = 1; i < max_background_threads; i++) { created_threads[i] = false; } /* Start working, and create more threads when asked. */ @@ -445,8 +447,10 @@ background_thread0_work(tsd_t *tsd) { &background_thread_info[0])) { continue; } - check_background_thread_creation(tsd, &n_created, - (bool *)&created_threads); + if (check_background_thread_creation(tsd, &n_created, + (bool *)&created_threads)) { + continue; + } background_work_sleep_once(tsd_tsdn(tsd), &background_thread_info[0], 0); } @@ -456,15 +460,20 @@ background_thread0_work(tsd_t *tsd) { * the global background_thread mutex (and is waiting) for us. */ assert(!background_thread_enabled()); - for (i = 1; i < ncpus; i++) { + for (i = 1; i < max_background_threads; i++) { background_thread_info_t *info = &background_thread_info[i]; assert(info->state != background_thread_paused); if (created_threads[i]) { background_threads_disable_single(tsd, info); } else { malloc_mutex_lock(tsd_tsdn(tsd), &info->mtx); - /* Clear in case the thread wasn't created. */ - info->state = background_thread_stopped; + if (info->state != background_thread_stopped) { + /* The thread was not created. */ + assert(info->state == + background_thread_started); + n_background_threads--; + info->state = background_thread_stopped; + } malloc_mutex_unlock(tsd_tsdn(tsd), &info->mtx); } } @@ -498,7 +507,7 @@ background_work(tsd_t *tsd, unsigned ind) { static void * background_thread_entry(void *ind_arg) { unsigned thread_ind = (unsigned)(uintptr_t)ind_arg; - assert(thread_ind < ncpus); + assert(thread_ind < max_background_threads); #ifdef JEMALLOC_HAVE_PTHREAD_SETNAME_NP pthread_setname_np(pthread_self(), "jemalloc_bg_thd"); #endif @@ -532,7 +541,7 @@ background_thread_create(tsd_t *tsd, unsigned arena_ind) { malloc_mutex_assert_owner(tsd_tsdn(tsd), &background_thread_lock); /* We create at most NCPUs threads. */ - size_t thread_ind = arena_ind % ncpus; + size_t thread_ind = arena_ind % max_background_threads; background_thread_info_t *info = &background_thread_info[thread_ind]; bool need_new_thread; @@ -586,26 +595,29 @@ background_threads_enable(tsd_t *tsd) { assert(background_thread_enabled()); malloc_mutex_assert_owner(tsd_tsdn(tsd), &background_thread_lock); - VARIABLE_ARRAY(bool, marked, ncpus); + VARIABLE_ARRAY(bool, marked, max_background_threads); unsigned i, nmarked; - for (i = 0; i < ncpus; i++) { + for (i = 0; i < max_background_threads; i++) { marked[i] = false; } nmarked = 0; + /* Thread 0 is required and created at the end. */ + marked[0] = true; /* Mark the threads we need to create for thread 0. */ unsigned n = narenas_total_get(); for (i = 1; i < n; i++) { - if (marked[i % ncpus] || + if (marked[i % max_background_threads] || arena_get(tsd_tsdn(tsd), i, false) == NULL) { continue; } - background_thread_info_t *info = &background_thread_info[i]; + background_thread_info_t *info = &background_thread_info[ + i % max_background_threads]; malloc_mutex_lock(tsd_tsdn(tsd), &info->mtx); assert(info->state == background_thread_stopped); background_thread_init(tsd, info); malloc_mutex_unlock(tsd_tsdn(tsd), &info->mtx); - marked[i % ncpus] = true; - if (++nmarked == ncpus) { + marked[i % max_background_threads] = true; + if (++nmarked == max_background_threads) { break; } } @@ -720,14 +732,14 @@ background_thread_prefork0(tsdn_t *tsdn) { void background_thread_prefork1(tsdn_t *tsdn) { - for (unsigned i = 0; i < ncpus; i++) { + for (unsigned i = 0; i < max_background_threads; i++) { malloc_mutex_prefork(tsdn, &background_thread_info[i].mtx); } } void background_thread_postfork_parent(tsdn_t *tsdn) { - for (unsigned i = 0; i < ncpus; i++) { + for (unsigned i = 0; i < max_background_threads; i++) { malloc_mutex_postfork_parent(tsdn, &background_thread_info[i].mtx); } @@ -736,7 +748,7 @@ background_thread_postfork_parent(tsdn_t *tsdn) { void background_thread_postfork_child(tsdn_t *tsdn) { - for (unsigned i = 0; i < ncpus; i++) { + for (unsigned i = 0; i < max_background_threads; i++) { malloc_mutex_postfork_child(tsdn, &background_thread_info[i].mtx); } @@ -749,7 +761,7 @@ background_thread_postfork_child(tsdn_t *tsdn) { malloc_mutex_lock(tsdn, &background_thread_lock); n_background_threads = 0; background_thread_enabled_set(tsdn, false); - for (unsigned i = 0; i < ncpus; i++) { + for (unsigned i = 0; i < max_background_threads; i++) { background_thread_info_t *info = &background_thread_info[i]; malloc_mutex_lock(tsdn, &info->mtx); info->state = background_thread_stopped; @@ -773,7 +785,7 @@ background_thread_stats_read(tsdn_t *tsdn, background_thread_stats_t *stats) { stats->num_threads = n_background_threads; uint64_t num_runs = 0; nstime_init(&stats->run_interval, 0); - for (unsigned i = 0; i < ncpus; i++) { + for (unsigned i = 0; i < max_background_threads; i++) { background_thread_info_t *info = &background_thread_info[i]; malloc_mutex_lock(tsdn, &info->mtx); if (info->state != background_thread_stopped) { @@ -795,6 +807,26 @@ background_thread_stats_read(tsdn_t *tsdn, background_thread_stats_t *stats) { #undef BILLION #undef BACKGROUND_THREAD_MIN_INTERVAL_NS +static bool +pthread_create_fptr_init(void) { + if (pthread_create_fptr != NULL) { + return false; + } + pthread_create_fptr = dlsym(RTLD_NEXT, "pthread_create"); + if (pthread_create_fptr == NULL) { + can_enable_background_thread = false; + if (config_lazy_lock || opt_background_thread) { + malloc_write(": Error in dlsym(RTLD_NEXT, " + "\"pthread_create\")\n"); + abort(); + } + } else { + can_enable_background_thread = true; + } + + return false; +} + /* * When lazy lock is enabled, we need to make sure setting isthreaded before * taking any background_thread locks. This is called early in ctl (instead of @@ -805,7 +837,8 @@ void background_thread_ctl_init(tsdn_t *tsdn) { malloc_mutex_assert_not_owner(tsdn, &background_thread_lock); #ifdef JEMALLOC_PTHREAD_CREATE_WRAPPER - pthread_once(&once_control, pthread_create_wrapper_once); + pthread_create_fptr_init(); + pthread_create_wrapper_init(); #endif } @@ -818,18 +851,10 @@ background_thread_boot0(void) { "supports pthread only\n"); return true; } - #ifdef JEMALLOC_PTHREAD_CREATE_WRAPPER - pthread_create_fptr = dlsym(RTLD_NEXT, "pthread_create"); - if (pthread_create_fptr == NULL) { - can_enable_background_thread = false; - if (config_lazy_lock || opt_background_thread) { - malloc_write(": Error in dlsym(RTLD_NEXT, " - "\"pthread_create\")\n"); - abort(); - } - } else { - can_enable_background_thread = true; + if ((config_lazy_lock || opt_background_thread) && + pthread_create_fptr_init()) { + return true; } #endif return false; @@ -841,6 +866,12 @@ background_thread_boot1(tsdn_t *tsdn) { assert(have_background_thread); assert(narenas_total_get() > 0); + if (opt_max_background_threads == MAX_BACKGROUND_THREAD_LIMIT && + ncpus < MAX_BACKGROUND_THREAD_LIMIT) { + opt_max_background_threads = ncpus; + } + max_background_threads = opt_max_background_threads; + background_thread_enabled_set(tsdn, opt_background_thread); if (malloc_mutex_init(&background_thread_lock, "background_thread_global", @@ -848,17 +879,15 @@ background_thread_boot1(tsdn_t *tsdn) { malloc_mutex_rank_exclusive)) { return true; } - if (opt_background_thread) { - background_thread_ctl_init(tsdn); - } background_thread_info = (background_thread_info_t *)base_alloc(tsdn, - b0get(), ncpus * sizeof(background_thread_info_t), CACHELINE); + b0get(), opt_max_background_threads * + sizeof(background_thread_info_t), CACHELINE); if (background_thread_info == NULL) { return true; } - for (unsigned i = 0; i < ncpus; i++) { + for (unsigned i = 0; i < max_background_threads; i++) { background_thread_info_t *info = &background_thread_info[i]; /* Thread mutex is rank_inclusive because of thread0. */ if (malloc_mutex_init(&info->mtx, "background_thread", diff --git a/dep/jemalloc/src/base.c b/dep/jemalloc/src/base.c index 97078b134d1..b0324b5d758 100644 --- a/dep/jemalloc/src/base.c +++ b/dep/jemalloc/src/base.c @@ -10,25 +10,40 @@ /******************************************************************************/ /* Data. */ -static base_t *b0; +static base_t *b0; + +metadata_thp_mode_t opt_metadata_thp = METADATA_THP_DEFAULT; + +const char *metadata_thp_mode_names[] = { + "disabled", + "auto", + "always" +}; /******************************************************************************/ +static inline bool +metadata_thp_madvise(void) { + return (metadata_thp_enabled() && + (init_system_thp_mode == thp_mode_default)); +} + static void * base_map(tsdn_t *tsdn, extent_hooks_t *extent_hooks, unsigned ind, size_t size) { void *addr; bool zero = true; bool commit = true; + /* Use huge page sizes and alignment regardless of opt_metadata_thp. */ assert(size == HUGEPAGE_CEILING(size)); - + size_t alignment = HUGEPAGE; if (extent_hooks == &extent_hooks_default) { - addr = extent_alloc_mmap(NULL, size, PAGE, &zero, &commit); + addr = extent_alloc_mmap(NULL, size, alignment, &zero, &commit); } else { /* No arena context as we are creating new arenas. */ tsd_t *tsd = tsdn_null(tsdn) ? tsd_fetch() : tsdn_tsd(tsdn); pre_reentrancy(tsd, NULL); - addr = extent_hooks->alloc(extent_hooks, NULL, size, PAGE, + addr = extent_hooks->alloc(extent_hooks, NULL, size, alignment, &zero, &commit, ind); post_reentrancy(tsd); } @@ -51,16 +66,16 @@ base_unmap(tsdn_t *tsdn, extent_hooks_t *extent_hooks, unsigned ind, void *addr, */ if (extent_hooks == &extent_hooks_default) { if (!extent_dalloc_mmap(addr, size)) { - return; + goto label_done; } if (!pages_decommit(addr, size)) { - return; + goto label_done; } if (!pages_purge_forced(addr, size)) { - return; + goto label_done; } if (!pages_purge_lazy(addr, size)) { - return; + goto label_done; } /* Nothing worked. This should never happen. */ not_reached(); @@ -70,27 +85,33 @@ base_unmap(tsdn_t *tsdn, extent_hooks_t *extent_hooks, unsigned ind, void *addr, if (extent_hooks->dalloc != NULL && !extent_hooks->dalloc(extent_hooks, addr, size, true, ind)) { - goto label_done; + goto label_post_reentrancy; } if (extent_hooks->decommit != NULL && !extent_hooks->decommit(extent_hooks, addr, size, 0, size, ind)) { - goto label_done; + goto label_post_reentrancy; } if (extent_hooks->purge_forced != NULL && !extent_hooks->purge_forced(extent_hooks, addr, size, 0, size, ind)) { - goto label_done; + goto label_post_reentrancy; } if (extent_hooks->purge_lazy != NULL && !extent_hooks->purge_lazy(extent_hooks, addr, size, 0, size, ind)) { - goto label_done; + goto label_post_reentrancy; } /* Nothing worked. That's the application's problem. */ - label_done: + label_post_reentrancy: post_reentrancy(tsd); - return; + } +label_done: + if (metadata_thp_madvise()) { + /* Set NOHUGEPAGE after unmap to avoid kernel defrag. */ + assert(((uintptr_t)addr & HUGEPAGE_MASK) == 0 && + (size & HUGEPAGE_MASK) == 0); + pages_nohuge(addr, size); } } @@ -105,6 +126,56 @@ base_extent_init(size_t *extent_sn_next, extent_t *extent, void *addr, extent_binit(extent, addr, size, sn); } +static size_t +base_get_num_blocks(base_t *base, bool with_new_block) { + base_block_t *b = base->blocks; + assert(b != NULL); + + size_t n_blocks = with_new_block ? 2 : 1; + while (b->next != NULL) { + n_blocks++; + b = b->next; + } + + return n_blocks; +} + +static void +base_auto_thp_switch(tsdn_t *tsdn, base_t *base) { + assert(opt_metadata_thp == metadata_thp_auto); + malloc_mutex_assert_owner(tsdn, &base->mtx); + if (base->auto_thp_switched) { + return; + } + /* Called when adding a new block. */ + bool should_switch; + if (base_ind_get(base) != 0) { + should_switch = (base_get_num_blocks(base, true) == + BASE_AUTO_THP_THRESHOLD); + } else { + should_switch = (base_get_num_blocks(base, true) == + BASE_AUTO_THP_THRESHOLD_A0); + } + if (!should_switch) { + return; + } + + base->auto_thp_switched = true; + assert(!config_stats || base->n_thp == 0); + /* Make the initial blocks THP lazily. */ + base_block_t *block = base->blocks; + while (block != NULL) { + assert((block->size & HUGEPAGE_MASK) == 0); + pages_huge(block, block->size); + if (config_stats) { + base->n_thp += HUGEPAGE_CEILING(block->size - + extent_bsize_get(&block->extent)) >> LG_HUGEPAGE; + } + block = block->next; + assert(block == NULL || (base_ind_get(base) == 0)); + } +} + static void * base_extent_bump_alloc_helper(extent_t *extent, size_t *gap_size, size_t size, size_t alignment) { @@ -124,8 +195,8 @@ base_extent_bump_alloc_helper(extent_t *extent, size_t *gap_size, size_t size, } static void -base_extent_bump_alloc_post(tsdn_t *tsdn, base_t *base, extent_t *extent, - size_t gap_size, void *addr, size_t size) { +base_extent_bump_alloc_post(base_t *base, extent_t *extent, size_t gap_size, + void *addr, size_t size) { if (extent_bsize_get(extent) > 0) { /* * Compute the index for the largest size class that does not @@ -140,23 +211,31 @@ base_extent_bump_alloc_post(tsdn_t *tsdn, base_t *base, extent_t *extent, base->allocated += size; /* * Add one PAGE to base_resident for every page boundary that is - * crossed by the new allocation. + * crossed by the new allocation. Adjust n_thp similarly when + * metadata_thp is enabled. */ base->resident += PAGE_CEILING((uintptr_t)addr + size) - PAGE_CEILING((uintptr_t)addr - gap_size); assert(base->allocated <= base->resident); assert(base->resident <= base->mapped); + if (metadata_thp_madvise() && (opt_metadata_thp == + metadata_thp_always || base->auto_thp_switched)) { + base->n_thp += (HUGEPAGE_CEILING((uintptr_t)addr + size) + - HUGEPAGE_CEILING((uintptr_t)addr - gap_size)) >> + LG_HUGEPAGE; + assert(base->mapped >= base->n_thp << LG_HUGEPAGE); + } } } static void * -base_extent_bump_alloc(tsdn_t *tsdn, base_t *base, extent_t *extent, - size_t size, size_t alignment) { +base_extent_bump_alloc(base_t *base, extent_t *extent, size_t size, + size_t alignment) { void *ret; size_t gap_size; ret = base_extent_bump_alloc_helper(extent, &gap_size, size, alignment); - base_extent_bump_alloc_post(tsdn, base, extent, gap_size, ret, size); + base_extent_bump_alloc_post(base, extent, gap_size, ret, size); return ret; } @@ -166,8 +245,8 @@ base_extent_bump_alloc(tsdn_t *tsdn, base_t *base, extent_t *extent, * On success a pointer to the initialized base_block_t header is returned. */ static base_block_t * -base_block_alloc(tsdn_t *tsdn, extent_hooks_t *extent_hooks, unsigned ind, - pszind_t *pind_last, size_t *extent_sn_next, size_t size, +base_block_alloc(tsdn_t *tsdn, base_t *base, extent_hooks_t *extent_hooks, + unsigned ind, pszind_t *pind_last, size_t *extent_sn_next, size_t size, size_t alignment) { alignment = ALIGNMENT_CEILING(alignment, QUANTUM); size_t usize = ALIGNMENT_CEILING(size, alignment); @@ -193,6 +272,25 @@ base_block_alloc(tsdn_t *tsdn, extent_hooks_t *extent_hooks, unsigned ind, if (block == NULL) { return NULL; } + + if (metadata_thp_madvise()) { + void *addr = (void *)block; + assert(((uintptr_t)addr & HUGEPAGE_MASK) == 0 && + (block_size & HUGEPAGE_MASK) == 0); + if (opt_metadata_thp == metadata_thp_always) { + pages_huge(addr, block_size); + } else if (opt_metadata_thp == metadata_thp_auto && + base != NULL) { + /* base != NULL indicates this is not a new base. */ + malloc_mutex_lock(tsdn, &base->mtx); + base_auto_thp_switch(tsdn, base); + if (base->auto_thp_switched) { + pages_huge(addr, block_size); + } + malloc_mutex_unlock(tsdn, &base->mtx); + } + } + *pind_last = sz_psz2ind(block_size); block->size = block_size; block->next = NULL; @@ -216,7 +314,7 @@ base_extent_alloc(tsdn_t *tsdn, base_t *base, size_t size, size_t alignment) { * called. */ malloc_mutex_unlock(tsdn, &base->mtx); - base_block_t *block = base_block_alloc(tsdn, extent_hooks, + base_block_t *block = base_block_alloc(tsdn, base, extent_hooks, base_ind_get(base), &base->pind_last, &base->extent_sn_next, size, alignment); malloc_mutex_lock(tsdn, &base->mtx); @@ -229,8 +327,16 @@ base_extent_alloc(tsdn_t *tsdn, base_t *base, size_t size, size_t alignment) { base->allocated += sizeof(base_block_t); base->resident += PAGE_CEILING(sizeof(base_block_t)); base->mapped += block->size; + if (metadata_thp_madvise() && + !(opt_metadata_thp == metadata_thp_auto + && !base->auto_thp_switched)) { + assert(base->n_thp > 0); + base->n_thp += HUGEPAGE_CEILING(sizeof(base_block_t)) >> + LG_HUGEPAGE; + } assert(base->allocated <= base->resident); assert(base->resident <= base->mapped); + assert(base->n_thp << LG_HUGEPAGE <= base->mapped); } return &block->extent; } @@ -244,7 +350,7 @@ base_t * base_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks) { pszind_t pind_last = 0; size_t extent_sn_next = 0; - base_block_t *block = base_block_alloc(tsdn, extent_hooks, ind, + base_block_t *block = base_block_alloc(tsdn, NULL, extent_hooks, ind, &pind_last, &extent_sn_next, sizeof(base_t), QUANTUM); if (block == NULL) { return NULL; @@ -265,6 +371,7 @@ base_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks) { base->pind_last = pind_last; base->extent_sn_next = extent_sn_next; base->blocks = block; + base->auto_thp_switched = false; for (szind_t i = 0; i < NSIZES; i++) { extent_heap_new(&base->avail[i]); } @@ -272,10 +379,14 @@ base_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks) { base->allocated = sizeof(base_block_t); base->resident = PAGE_CEILING(sizeof(base_block_t)); base->mapped = block->size; + base->n_thp = (opt_metadata_thp == metadata_thp_always) && + metadata_thp_madvise() ? HUGEPAGE_CEILING(sizeof(base_block_t)) + >> LG_HUGEPAGE : 0; assert(base->allocated <= base->resident); assert(base->resident <= base->mapped); + assert(base->n_thp << LG_HUGEPAGE <= base->mapped); } - base_extent_bump_alloc_post(tsdn, base, &block->extent, gap_size, base, + base_extent_bump_alloc_post(base, &block->extent, gap_size, base, base_size); return base; @@ -332,7 +443,7 @@ base_alloc_impl(tsdn_t *tsdn, base_t *base, size_t size, size_t alignment, goto label_return; } - ret = base_extent_bump_alloc(tsdn, base, extent, usize, alignment); + ret = base_extent_bump_alloc(base, extent, usize, alignment); if (esn != NULL) { *esn = extent_sn_get(extent); } @@ -368,7 +479,7 @@ base_alloc_extent(tsdn_t *tsdn, base_t *base) { void base_stats_get(tsdn_t *tsdn, base_t *base, size_t *allocated, size_t *resident, - size_t *mapped) { + size_t *mapped, size_t *n_thp) { cassert(config_stats); malloc_mutex_lock(tsdn, &base->mtx); @@ -377,6 +488,7 @@ base_stats_get(tsdn_t *tsdn, base_t *base, size_t *allocated, size_t *resident, *allocated = base->allocated; *resident = base->resident; *mapped = base->mapped; + *n_thp = base->n_thp; malloc_mutex_unlock(tsdn, &base->mtx); } diff --git a/dep/jemalloc/src/bin.c b/dep/jemalloc/src/bin.c new file mode 100644 index 00000000000..0886bc4ea92 --- /dev/null +++ b/dep/jemalloc/src/bin.c @@ -0,0 +1,50 @@ +#include "jemalloc/internal/jemalloc_preamble.h" +#include "jemalloc/internal/jemalloc_internal_includes.h" + +#include "jemalloc/internal/bin.h" +#include "jemalloc/internal/witness.h" + +const bin_info_t bin_infos[NBINS] = { +#define BIN_INFO_bin_yes(reg_size, slab_size, nregs) \ + {reg_size, slab_size, nregs, BITMAP_INFO_INITIALIZER(nregs)}, +#define BIN_INFO_bin_no(reg_size, slab_size, nregs) +#define SC(index, lg_grp, lg_delta, ndelta, psz, bin, pgs, \ + lg_delta_lookup) \ + BIN_INFO_bin_##bin((1U<lock, "bin", WITNESS_RANK_BIN, + malloc_mutex_rank_exclusive)) { + return true; + } + bin->slabcur = NULL; + extent_heap_new(&bin->slabs_nonfull); + extent_list_init(&bin->slabs_full); + if (config_stats) { + memset(&bin->stats, 0, sizeof(bin_stats_t)); + } + return false; +} + +void +bin_prefork(tsdn_t *tsdn, bin_t *bin) { + malloc_mutex_prefork(tsdn, &bin->lock); +} + +void +bin_postfork_parent(tsdn_t *tsdn, bin_t *bin) { + malloc_mutex_postfork_parent(tsdn, &bin->lock); +} + +void +bin_postfork_child(tsdn_t *tsdn, bin_t *bin) { + malloc_mutex_postfork_child(tsdn, &bin->lock); +} diff --git a/dep/jemalloc/src/ctl.c b/dep/jemalloc/src/ctl.c index 36bc8fb5b75..1e713a3d104 100644 --- a/dep/jemalloc/src/ctl.c +++ b/dep/jemalloc/src/ctl.c @@ -57,6 +57,7 @@ static const ctl_named_node_t *n##_index(tsdn_t *tsdn, \ CTL_PROTO(version) CTL_PROTO(epoch) CTL_PROTO(background_thread) +CTL_PROTO(max_background_threads) CTL_PROTO(thread_tcache_enabled) CTL_PROTO(thread_tcache_flush) CTL_PROTO(thread_prof_name) @@ -75,16 +76,17 @@ CTL_PROTO(config_prof) CTL_PROTO(config_prof_libgcc) CTL_PROTO(config_prof_libunwind) CTL_PROTO(config_stats) -CTL_PROTO(config_thp) CTL_PROTO(config_utrace) CTL_PROTO(config_xmalloc) CTL_PROTO(opt_abort) CTL_PROTO(opt_abort_conf) +CTL_PROTO(opt_metadata_thp) CTL_PROTO(opt_retain) CTL_PROTO(opt_dss) CTL_PROTO(opt_narenas) CTL_PROTO(opt_percpu_arena) CTL_PROTO(opt_background_thread) +CTL_PROTO(opt_max_background_threads) CTL_PROTO(opt_dirty_decay_ms) CTL_PROTO(opt_muzzy_decay_ms) CTL_PROTO(opt_stats_print) @@ -94,6 +96,8 @@ CTL_PROTO(opt_zero) CTL_PROTO(opt_utrace) CTL_PROTO(opt_xmalloc) CTL_PROTO(opt_tcache) +CTL_PROTO(opt_thp) +CTL_PROTO(opt_lg_extent_max_active_fit) CTL_PROTO(opt_lg_tcache_max) CTL_PROTO(opt_prof) CTL_PROTO(opt_prof_prefix) @@ -117,6 +121,7 @@ CTL_PROTO(arena_i_dss) CTL_PROTO(arena_i_dirty_decay_ms) CTL_PROTO(arena_i_muzzy_decay_ms) CTL_PROTO(arena_i_extent_hooks) +CTL_PROTO(arena_i_retain_grow_limit) INDEX_PROTO(arena_i) CTL_PROTO(arenas_bin_i_size) CTL_PROTO(arenas_bin_i_nregs) @@ -134,6 +139,7 @@ CTL_PROTO(arenas_nbins) CTL_PROTO(arenas_nhbins) CTL_PROTO(arenas_nlextents) CTL_PROTO(arenas_create) +CTL_PROTO(arenas_lookup) CTL_PROTO(prof_thread_active_init) CTL_PROTO(prof_active) CTL_PROTO(prof_dump) @@ -182,6 +188,7 @@ CTL_PROTO(stats_arenas_i_muzzy_nmadvise) CTL_PROTO(stats_arenas_i_muzzy_purged) CTL_PROTO(stats_arenas_i_base) CTL_PROTO(stats_arenas_i_internal) +CTL_PROTO(stats_arenas_i_metadata_thp) CTL_PROTO(stats_arenas_i_tcache_bytes) CTL_PROTO(stats_arenas_i_resident) INDEX_PROTO(stats_arenas_i) @@ -191,6 +198,7 @@ CTL_PROTO(stats_background_thread_num_threads) CTL_PROTO(stats_background_thread_num_runs) CTL_PROTO(stats_background_thread_run_interval) CTL_PROTO(stats_metadata) +CTL_PROTO(stats_metadata_thp) CTL_PROTO(stats_resident) CTL_PROTO(stats_mapped) CTL_PROTO(stats_retained) @@ -266,7 +274,6 @@ static const ctl_named_node_t config_node[] = { {NAME("prof_libgcc"), CTL(config_prof_libgcc)}, {NAME("prof_libunwind"), CTL(config_prof_libunwind)}, {NAME("stats"), CTL(config_stats)}, - {NAME("thp"), CTL(config_thp)}, {NAME("utrace"), CTL(config_utrace)}, {NAME("xmalloc"), CTL(config_xmalloc)} }; @@ -274,11 +281,13 @@ static const ctl_named_node_t config_node[] = { static const ctl_named_node_t opt_node[] = { {NAME("abort"), CTL(opt_abort)}, {NAME("abort_conf"), CTL(opt_abort_conf)}, + {NAME("metadata_thp"), CTL(opt_metadata_thp)}, {NAME("retain"), CTL(opt_retain)}, {NAME("dss"), CTL(opt_dss)}, {NAME("narenas"), CTL(opt_narenas)}, {NAME("percpu_arena"), CTL(opt_percpu_arena)}, {NAME("background_thread"), CTL(opt_background_thread)}, + {NAME("max_background_threads"), CTL(opt_max_background_threads)}, {NAME("dirty_decay_ms"), CTL(opt_dirty_decay_ms)}, {NAME("muzzy_decay_ms"), CTL(opt_muzzy_decay_ms)}, {NAME("stats_print"), CTL(opt_stats_print)}, @@ -288,6 +297,8 @@ static const ctl_named_node_t opt_node[] = { {NAME("utrace"), CTL(opt_utrace)}, {NAME("xmalloc"), CTL(opt_xmalloc)}, {NAME("tcache"), CTL(opt_tcache)}, + {NAME("thp"), CTL(opt_thp)}, + {NAME("lg_extent_max_active_fit"), CTL(opt_lg_extent_max_active_fit)}, {NAME("lg_tcache_max"), CTL(opt_lg_tcache_max)}, {NAME("prof"), CTL(opt_prof)}, {NAME("prof_prefix"), CTL(opt_prof_prefix)}, @@ -316,7 +327,8 @@ static const ctl_named_node_t arena_i_node[] = { {NAME("dss"), CTL(arena_i_dss)}, {NAME("dirty_decay_ms"), CTL(arena_i_dirty_decay_ms)}, {NAME("muzzy_decay_ms"), CTL(arena_i_muzzy_decay_ms)}, - {NAME("extent_hooks"), CTL(arena_i_extent_hooks)} + {NAME("extent_hooks"), CTL(arena_i_extent_hooks)}, + {NAME("retain_grow_limit"), CTL(arena_i_retain_grow_limit)} }; static const ctl_named_node_t super_arena_i_node[] = { {NAME(""), CHILD(named, arena_i)} @@ -362,7 +374,8 @@ static const ctl_named_node_t arenas_node[] = { {NAME("bin"), CHILD(indexed, arenas_bin)}, {NAME("nlextents"), CTL(arenas_nlextents)}, {NAME("lextent"), CHILD(indexed, arenas_lextent)}, - {NAME("create"), CTL(arenas_create)} + {NAME("create"), CTL(arenas_create)}, + {NAME("lookup"), CTL(arenas_lookup)} }; static const ctl_named_node_t prof_node[] = { @@ -474,6 +487,7 @@ static const ctl_named_node_t stats_arenas_i_node[] = { {NAME("muzzy_purged"), CTL(stats_arenas_i_muzzy_purged)}, {NAME("base"), CTL(stats_arenas_i_base)}, {NAME("internal"), CTL(stats_arenas_i_internal)}, + {NAME("metadata_thp"), CTL(stats_arenas_i_metadata_thp)}, {NAME("tcache_bytes"), CTL(stats_arenas_i_tcache_bytes)}, {NAME("resident"), CTL(stats_arenas_i_resident)}, {NAME("small"), CHILD(named, stats_arenas_i_small)}, @@ -512,6 +526,7 @@ static const ctl_named_node_t stats_node[] = { {NAME("allocated"), CTL(stats_allocated)}, {NAME("active"), CTL(stats_active)}, {NAME("metadata"), CTL(stats_metadata)}, + {NAME("metadata_thp"), CTL(stats_metadata_thp)}, {NAME("resident"), CTL(stats_resident)}, {NAME("mapped"), CTL(stats_mapped)}, {NAME("retained"), CTL(stats_retained)}, @@ -525,6 +540,7 @@ static const ctl_named_node_t root_node[] = { {NAME("version"), CTL(version)}, {NAME("epoch"), CTL(epoch)}, {NAME("background_thread"), CTL(background_thread)}, + {NAME("max_background_threads"), CTL(max_background_threads)}, {NAME("thread"), CHILD(named, thread)}, {NAME("config"), CHILD(named, config)}, {NAME("opt"), CHILD(named, opt)}, @@ -550,7 +566,7 @@ static const ctl_named_node_t super_root_node[] = { * synchronized by the ctl mutex. */ static void -accum_arena_stats_u64(arena_stats_u64_t *dst, arena_stats_u64_t *src) { +ctl_accum_arena_stats_u64(arena_stats_u64_t *dst, arena_stats_u64_t *src) { #ifdef JEMALLOC_ATOMIC_U64 uint64_t cur_dst = atomic_load_u64(dst, ATOMIC_RELAXED); uint64_t cur_src = atomic_load_u64(src, ATOMIC_RELAXED); @@ -562,7 +578,7 @@ accum_arena_stats_u64(arena_stats_u64_t *dst, arena_stats_u64_t *src) { /* Likewise: with ctl mutex synchronization, reading is simple. */ static uint64_t -arena_stats_read_u64(arena_stats_u64_t *p) { +ctl_arena_stats_read_u64(arena_stats_u64_t *p) { #ifdef JEMALLOC_ATOMIC_U64 return atomic_load_u64(p, ATOMIC_RELAXED); #else @@ -570,7 +586,8 @@ arena_stats_read_u64(arena_stats_u64_t *p) { #endif } -static void accum_atomic_zu(atomic_zu_t *dst, atomic_zu_t *src) { +static void +accum_atomic_zu(atomic_zu_t *dst, atomic_zu_t *src) { size_t cur_dst = atomic_load_zu(dst, ATOMIC_RELAXED); size_t cur_src = atomic_load_zu(src, ATOMIC_RELAXED); atomic_store_zu(dst, cur_dst + cur_src, ATOMIC_RELAXED); @@ -680,9 +697,9 @@ ctl_arena_clear(ctl_arena_t *ctl_arena) { ctl_arena->astats->ndalloc_small = 0; ctl_arena->astats->nrequests_small = 0; memset(ctl_arena->astats->bstats, 0, NBINS * - sizeof(malloc_bin_stats_t)); + sizeof(bin_stats_t)); memset(ctl_arena->astats->lstats, 0, (NSIZES - NBINS) * - sizeof(malloc_large_stats_t)); + sizeof(arena_stats_large_t)); } } @@ -745,18 +762,18 @@ ctl_arena_stats_sdmerge(ctl_arena_t *ctl_sdarena, ctl_arena_t *ctl_arena, &astats->astats.retained); } - accum_arena_stats_u64(&sdstats->astats.decay_dirty.npurge, + ctl_accum_arena_stats_u64(&sdstats->astats.decay_dirty.npurge, &astats->astats.decay_dirty.npurge); - accum_arena_stats_u64(&sdstats->astats.decay_dirty.nmadvise, + ctl_accum_arena_stats_u64(&sdstats->astats.decay_dirty.nmadvise, &astats->astats.decay_dirty.nmadvise); - accum_arena_stats_u64(&sdstats->astats.decay_dirty.purged, + ctl_accum_arena_stats_u64(&sdstats->astats.decay_dirty.purged, &astats->astats.decay_dirty.purged); - accum_arena_stats_u64(&sdstats->astats.decay_muzzy.npurge, + ctl_accum_arena_stats_u64(&sdstats->astats.decay_muzzy.npurge, &astats->astats.decay_muzzy.npurge); - accum_arena_stats_u64(&sdstats->astats.decay_muzzy.nmadvise, + ctl_accum_arena_stats_u64(&sdstats->astats.decay_muzzy.nmadvise, &astats->astats.decay_muzzy.nmadvise); - accum_arena_stats_u64(&sdstats->astats.decay_muzzy.purged, + ctl_accum_arena_stats_u64(&sdstats->astats.decay_muzzy.purged, &astats->astats.decay_muzzy.purged); #define OP(mtx) malloc_mutex_prof_merge( \ @@ -773,6 +790,8 @@ MUTEX_PROF_ARENA_MUTEXES &astats->astats.internal); accum_atomic_zu(&sdstats->astats.resident, &astats->astats.resident); + accum_atomic_zu(&sdstats->astats.metadata_thp, + &astats->astats.metadata_thp); } else { assert(atomic_load_zu( &astats->astats.internal, ATOMIC_RELAXED) == 0); @@ -794,11 +813,11 @@ MUTEX_PROF_ARENA_MUTEXES assert(atomic_load_zu(&astats->astats.allocated_large, ATOMIC_RELAXED) == 0); } - accum_arena_stats_u64(&sdstats->astats.nmalloc_large, + ctl_accum_arena_stats_u64(&sdstats->astats.nmalloc_large, &astats->astats.nmalloc_large); - accum_arena_stats_u64(&sdstats->astats.ndalloc_large, + ctl_accum_arena_stats_u64(&sdstats->astats.ndalloc_large, &astats->astats.ndalloc_large); - accum_arena_stats_u64(&sdstats->astats.nrequests_large, + ctl_accum_arena_stats_u64(&sdstats->astats.nrequests_large, &astats->astats.nrequests_large); accum_atomic_zu(&sdstats->astats.tcache_bytes, @@ -835,11 +854,11 @@ MUTEX_PROF_ARENA_MUTEXES } for (i = 0; i < NSIZES - NBINS; i++) { - accum_arena_stats_u64(&sdstats->lstats[i].nmalloc, + ctl_accum_arena_stats_u64(&sdstats->lstats[i].nmalloc, &astats->lstats[i].nmalloc); - accum_arena_stats_u64(&sdstats->lstats[i].ndalloc, + ctl_accum_arena_stats_u64(&sdstats->lstats[i].ndalloc, &astats->lstats[i].ndalloc); - accum_arena_stats_u64(&sdstats->lstats[i].nrequests, + ctl_accum_arena_stats_u64(&sdstats->lstats[i].nrequests, &astats->lstats[i].nrequests); if (!destroyed) { sdstats->lstats[i].curlextents += @@ -938,6 +957,8 @@ ctl_refresh(tsdn_t *tsdn) { &ctl_sarena->astats->astats.base, ATOMIC_RELAXED) + atomic_load_zu(&ctl_sarena->astats->astats.internal, ATOMIC_RELAXED); + ctl_stats->metadata_thp = atomic_load_zu( + &ctl_sarena->astats->astats.metadata_thp, ATOMIC_RELAXED); ctl_stats->resident = atomic_load_zu( &ctl_sarena->astats->astats.resident, ATOMIC_RELAXED); ctl_stats->mapped = atomic_load_zu( @@ -1549,6 +1570,71 @@ label_return: return ret; } +static int +max_background_threads_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, + void *oldp, size_t *oldlenp, void *newp, size_t newlen) { + int ret; + size_t oldval; + + if (!have_background_thread) { + return ENOENT; + } + background_thread_ctl_init(tsd_tsdn(tsd)); + + malloc_mutex_lock(tsd_tsdn(tsd), &ctl_mtx); + malloc_mutex_lock(tsd_tsdn(tsd), &background_thread_lock); + if (newp == NULL) { + oldval = max_background_threads; + READ(oldval, size_t); + } else { + if (newlen != sizeof(size_t)) { + ret = EINVAL; + goto label_return; + } + oldval = max_background_threads; + READ(oldval, size_t); + + size_t newval = *(size_t *)newp; + if (newval == oldval) { + ret = 0; + goto label_return; + } + if (newval > opt_max_background_threads) { + ret = EINVAL; + goto label_return; + } + + if (background_thread_enabled()) { + if (!can_enable_background_thread) { + malloc_printf(": Error in dlsym(" + "RTLD_NEXT, \"pthread_create\"). Cannot " + "enable background_thread\n"); + ret = EFAULT; + goto label_return; + } + background_thread_enabled_set(tsd_tsdn(tsd), false); + if (background_threads_disable(tsd)) { + ret = EFAULT; + goto label_return; + } + max_background_threads = newval; + background_thread_enabled_set(tsd_tsdn(tsd), true); + if (background_threads_enable(tsd)) { + ret = EFAULT; + goto label_return; + } + } else { + max_background_threads = newval; + } + } + ret = 0; +label_return: + malloc_mutex_unlock(tsd_tsdn(tsd), &background_thread_lock); + malloc_mutex_unlock(tsd_tsdn(tsd), &ctl_mtx); + + return ret; +} + /******************************************************************************/ CTL_RO_CONFIG_GEN(config_cache_oblivious, bool) @@ -1560,7 +1646,6 @@ CTL_RO_CONFIG_GEN(config_prof, bool) CTL_RO_CONFIG_GEN(config_prof_libgcc, bool) CTL_RO_CONFIG_GEN(config_prof_libunwind, bool) CTL_RO_CONFIG_GEN(config_stats, bool) -CTL_RO_CONFIG_GEN(config_thp, bool) CTL_RO_CONFIG_GEN(config_utrace, bool) CTL_RO_CONFIG_GEN(config_xmalloc, bool) @@ -1568,12 +1653,15 @@ CTL_RO_CONFIG_GEN(config_xmalloc, bool) CTL_RO_NL_GEN(opt_abort, opt_abort, bool) CTL_RO_NL_GEN(opt_abort_conf, opt_abort_conf, bool) +CTL_RO_NL_GEN(opt_metadata_thp, metadata_thp_mode_names[opt_metadata_thp], + const char *) CTL_RO_NL_GEN(opt_retain, opt_retain, bool) CTL_RO_NL_GEN(opt_dss, opt_dss, const char *) CTL_RO_NL_GEN(opt_narenas, opt_narenas, unsigned) CTL_RO_NL_GEN(opt_percpu_arena, percpu_arena_mode_names[opt_percpu_arena], const char *) CTL_RO_NL_GEN(opt_background_thread, opt_background_thread, bool) +CTL_RO_NL_GEN(opt_max_background_threads, opt_max_background_threads, size_t) CTL_RO_NL_GEN(opt_dirty_decay_ms, opt_dirty_decay_ms, ssize_t) CTL_RO_NL_GEN(opt_muzzy_decay_ms, opt_muzzy_decay_ms, ssize_t) CTL_RO_NL_GEN(opt_stats_print, opt_stats_print, bool) @@ -1583,6 +1671,9 @@ CTL_RO_NL_CGEN(config_fill, opt_zero, opt_zero, bool) CTL_RO_NL_CGEN(config_utrace, opt_utrace, opt_utrace, bool) CTL_RO_NL_CGEN(config_xmalloc, opt_xmalloc, opt_xmalloc, bool) CTL_RO_NL_GEN(opt_tcache, opt_tcache, bool) +CTL_RO_NL_GEN(opt_thp, thp_mode_names[opt_thp], const char *) +CTL_RO_NL_GEN(opt_lg_extent_max_active_fit, opt_lg_extent_max_active_fit, + size_t) CTL_RO_NL_GEN(opt_lg_tcache_max, opt_lg_tcache_max, ssize_t) CTL_RO_NL_CGEN(config_prof, opt_prof, opt_prof, bool) CTL_RO_NL_CGEN(config_prof, opt_prof_prefix, opt_prof_prefix, const char *) @@ -2162,20 +2253,41 @@ arena_i_extent_hooks_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, malloc_mutex_lock(tsd_tsdn(tsd), &ctl_mtx); MIB_UNSIGNED(arena_ind, 1); - if (arena_ind < narenas_total_get() && (arena = - arena_get(tsd_tsdn(tsd), arena_ind, false)) != NULL) { - if (newp != NULL) { - extent_hooks_t *old_extent_hooks; - extent_hooks_t *new_extent_hooks - JEMALLOC_CC_SILENCE_INIT(NULL); - WRITE(new_extent_hooks, extent_hooks_t *); - old_extent_hooks = extent_hooks_set(tsd, arena, - new_extent_hooks); + if (arena_ind < narenas_total_get()) { + extent_hooks_t *old_extent_hooks; + arena = arena_get(tsd_tsdn(tsd), arena_ind, false); + if (arena == NULL) { + if (arena_ind >= narenas_auto) { + ret = EFAULT; + goto label_return; + } + old_extent_hooks = + (extent_hooks_t *)&extent_hooks_default; READ(old_extent_hooks, extent_hooks_t *); + if (newp != NULL) { + /* Initialize a new arena as a side effect. */ + extent_hooks_t *new_extent_hooks + JEMALLOC_CC_SILENCE_INIT(NULL); + WRITE(new_extent_hooks, extent_hooks_t *); + arena = arena_init(tsd_tsdn(tsd), arena_ind, + new_extent_hooks); + if (arena == NULL) { + ret = EFAULT; + goto label_return; + } + } } else { - extent_hooks_t *old_extent_hooks = - extent_hooks_get(arena); - READ(old_extent_hooks, extent_hooks_t *); + if (newp != NULL) { + extent_hooks_t *new_extent_hooks + JEMALLOC_CC_SILENCE_INIT(NULL); + WRITE(new_extent_hooks, extent_hooks_t *); + old_extent_hooks = extent_hooks_set(tsd, arena, + new_extent_hooks); + READ(old_extent_hooks, extent_hooks_t *); + } else { + old_extent_hooks = extent_hooks_get(arena); + READ(old_extent_hooks, extent_hooks_t *); + } } } else { ret = EFAULT; @@ -2187,6 +2299,42 @@ label_return: return ret; } +static int +arena_i_retain_grow_limit_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, + void *oldp, size_t *oldlenp, void *newp, size_t newlen) { + int ret; + unsigned arena_ind; + arena_t *arena; + + if (!opt_retain) { + /* Only relevant when retain is enabled. */ + return ENOENT; + } + + malloc_mutex_lock(tsd_tsdn(tsd), &ctl_mtx); + MIB_UNSIGNED(arena_ind, 1); + if (arena_ind < narenas_total_get() && (arena = + arena_get(tsd_tsdn(tsd), arena_ind, false)) != NULL) { + size_t old_limit, new_limit; + if (newp != NULL) { + WRITE(new_limit, size_t); + } + bool err = arena_retain_grow_limit_get_set(tsd, arena, + &old_limit, newp != NULL ? &new_limit : NULL); + if (!err) { + READ(old_limit, size_t); + ret = 0; + } else { + ret = EFAULT; + } + } else { + ret = EFAULT; + } +label_return: + malloc_mutex_unlock(tsd_tsdn(tsd), &ctl_mtx); + return ret; +} + static const ctl_named_node_t * arena_i_index(tsdn_t *tsdn, const size_t *mib, size_t miblen, size_t i) { const ctl_named_node_t *ret; @@ -2248,7 +2396,7 @@ arenas_decay_ms_ctl_impl(tsd_t *tsd, const size_t *mib, size_t miblen, ret = EINVAL; goto label_return; } - if (dirty ? arena_dirty_decay_ms_default_set(*(ssize_t *)newp) + if (dirty ? arena_dirty_decay_ms_default_set(*(ssize_t *)newp) : arena_muzzy_decay_ms_default_set(*(ssize_t *)newp)) { ret = EFAULT; goto label_return; @@ -2279,9 +2427,9 @@ CTL_RO_NL_GEN(arenas_page, PAGE, size_t) CTL_RO_NL_GEN(arenas_tcache_max, tcache_maxclass, size_t) CTL_RO_NL_GEN(arenas_nbins, NBINS, unsigned) CTL_RO_NL_GEN(arenas_nhbins, nhbins, unsigned) -CTL_RO_NL_GEN(arenas_bin_i_size, arena_bin_info[mib[2]].reg_size, size_t) -CTL_RO_NL_GEN(arenas_bin_i_nregs, arena_bin_info[mib[2]].nregs, uint32_t) -CTL_RO_NL_GEN(arenas_bin_i_slab_size, arena_bin_info[mib[2]].slab_size, size_t) +CTL_RO_NL_GEN(arenas_bin_i_size, bin_infos[mib[2]].reg_size, size_t) +CTL_RO_NL_GEN(arenas_bin_i_nregs, bin_infos[mib[2]].nregs, uint32_t) +CTL_RO_NL_GEN(arenas_bin_i_slab_size, bin_infos[mib[2]].slab_size, size_t) static const ctl_named_node_t * arenas_bin_i_index(tsdn_t *tsdn, const size_t *mib, size_t miblen, size_t i) { if (i > NBINS) { @@ -2325,6 +2473,36 @@ label_return: return ret; } +static int +arenas_lookup_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, void *oldp, + size_t *oldlenp, void *newp, size_t newlen) { + int ret; + unsigned arena_ind; + void *ptr; + extent_t *extent; + arena_t *arena; + + ptr = NULL; + ret = EINVAL; + malloc_mutex_lock(tsd_tsdn(tsd), &ctl_mtx); + WRITE(ptr, void *); + extent = iealloc(tsd_tsdn(tsd), ptr); + if (extent == NULL) + goto label_return; + + arena = extent_arena_get(extent); + if (arena == NULL) + goto label_return; + + arena_ind = arena_ind_get(arena); + READ(arena_ind, unsigned); + + ret = 0; +label_return: + malloc_mutex_unlock(tsd_tsdn(tsd), &ctl_mtx); + return ret; +} + /******************************************************************************/ static int @@ -2460,6 +2638,7 @@ CTL_RO_NL_CGEN(config_prof, lg_prof_sample, lg_prof_sample, size_t) CTL_RO_CGEN(config_stats, stats_allocated, ctl_stats->allocated, size_t) CTL_RO_CGEN(config_stats, stats_active, ctl_stats->active, size_t) CTL_RO_CGEN(config_stats, stats_metadata, ctl_stats->metadata, size_t) +CTL_RO_CGEN(config_stats, stats_metadata_thp, ctl_stats->metadata_thp, size_t) CTL_RO_CGEN(config_stats, stats_resident, ctl_stats->resident, size_t) CTL_RO_CGEN(config_stats, stats_mapped, ctl_stats->mapped, size_t) CTL_RO_CGEN(config_stats, stats_retained, ctl_stats->retained, size_t) @@ -2490,24 +2669,24 @@ CTL_RO_CGEN(config_stats, stats_arenas_i_retained, size_t) CTL_RO_CGEN(config_stats, stats_arenas_i_dirty_npurge, - arena_stats_read_u64(&arenas_i(mib[2])->astats->astats.decay_dirty.npurge), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->astats.decay_dirty.npurge), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_dirty_nmadvise, - arena_stats_read_u64( + ctl_arena_stats_read_u64( &arenas_i(mib[2])->astats->astats.decay_dirty.nmadvise), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_dirty_purged, - arena_stats_read_u64(&arenas_i(mib[2])->astats->astats.decay_dirty.purged), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->astats.decay_dirty.purged), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_muzzy_npurge, - arena_stats_read_u64(&arenas_i(mib[2])->astats->astats.decay_muzzy.npurge), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->astats.decay_muzzy.npurge), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_muzzy_nmadvise, - arena_stats_read_u64( + ctl_arena_stats_read_u64( &arenas_i(mib[2])->astats->astats.decay_muzzy.nmadvise), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_muzzy_purged, - arena_stats_read_u64(&arenas_i(mib[2])->astats->astats.decay_muzzy.purged), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->astats.decay_muzzy.purged), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_base, atomic_load_zu(&arenas_i(mib[2])->astats->astats.base, ATOMIC_RELAXED), @@ -2515,6 +2694,9 @@ CTL_RO_CGEN(config_stats, stats_arenas_i_base, CTL_RO_CGEN(config_stats, stats_arenas_i_internal, atomic_load_zu(&arenas_i(mib[2])->astats->astats.internal, ATOMIC_RELAXED), size_t) +CTL_RO_CGEN(config_stats, stats_arenas_i_metadata_thp, + atomic_load_zu(&arenas_i(mib[2])->astats->astats.metadata_thp, + ATOMIC_RELAXED), size_t) CTL_RO_CGEN(config_stats, stats_arenas_i_tcache_bytes, atomic_load_zu(&arenas_i(mib[2])->astats->astats.tcache_bytes, ATOMIC_RELAXED), size_t) @@ -2534,14 +2716,17 @@ CTL_RO_CGEN(config_stats, stats_arenas_i_large_allocated, atomic_load_zu(&arenas_i(mib[2])->astats->astats.allocated_large, ATOMIC_RELAXED), size_t) CTL_RO_CGEN(config_stats, stats_arenas_i_large_nmalloc, - arena_stats_read_u64(&arenas_i(mib[2])->astats->astats.nmalloc_large), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->astats.nmalloc_large), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_large_ndalloc, - arena_stats_read_u64(&arenas_i(mib[2])->astats->astats.ndalloc_large), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->astats.ndalloc_large), uint64_t) +/* + * Note: "nmalloc" here instead of "nrequests" in the read. This is intentional. + */ CTL_RO_CGEN(config_stats, stats_arenas_i_large_nrequests, - arena_stats_read_u64(&arenas_i(mib[2])->astats->astats.nmalloc_large), - uint64_t) /* Intentional. */ + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->astats.nmalloc_large), uint64_t) /* Intentional. */ /* Lock profiling related APIs below. */ #define RO_MUTEX_CTL_GEN(n, l) \ @@ -2622,7 +2807,7 @@ stats_mutexes_reset_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, MUTEX_PROF_RESET(arena->base->mtx); for (szind_t i = 0; i < NBINS; i++) { - arena_bin_t *bin = &arena->bins[i]; + bin_t *bin = &arena->bins[i]; MUTEX_PROF_RESET(bin->lock); } } @@ -2659,14 +2844,14 @@ stats_arenas_i_bins_j_index(tsdn_t *tsdn, const size_t *mib, size_t miblen, } CTL_RO_CGEN(config_stats, stats_arenas_i_lextents_j_nmalloc, - arena_stats_read_u64(&arenas_i(mib[2])->astats->lstats[mib[4]].nmalloc), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->lstats[mib[4]].nmalloc), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_lextents_j_ndalloc, - arena_stats_read_u64(&arenas_i(mib[2])->astats->lstats[mib[4]].ndalloc), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->lstats[mib[4]].ndalloc), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_lextents_j_nrequests, - arena_stats_read_u64(&arenas_i(mib[2])->astats->lstats[mib[4]].nrequests), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->lstats[mib[4]].nrequests), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_lextents_j_curlextents, arenas_i(mib[2])->astats->lstats[mib[4]].curlextents, size_t) diff --git a/dep/jemalloc/src/div.c b/dep/jemalloc/src/div.c new file mode 100644 index 00000000000..808892a133f --- /dev/null +++ b/dep/jemalloc/src/div.c @@ -0,0 +1,55 @@ +#include "jemalloc/internal/jemalloc_preamble.h" + +#include "jemalloc/internal/div.h" + +#include "jemalloc/internal/assert.h" + +/* + * Suppose we have n = q * d, all integers. We know n and d, and want q = n / d. + * + * For any k, we have (here, all division is exact; not C-style rounding): + * floor(ceil(2^k / d) * n / 2^k) = floor((2^k + r) / d * n / 2^k), where + * r = (-2^k) mod d. + * + * Expanding this out: + * ... = floor(2^k / d * n / 2^k + r / d * n / 2^k) + * = floor(n / d + (r / d) * (n / 2^k)). + * + * The fractional part of n / d is 0 (because of the assumption that d divides n + * exactly), so we have: + * ... = n / d + floor((r / d) * (n / 2^k)) + * + * So that our initial expression is equal to the quantity we seek, so long as + * (r / d) * (n / 2^k) < 1. + * + * r is a remainder mod d, so r < d and r / d < 1 always. We can make + * n / 2 ^ k < 1 by setting k = 32. This gets us a value of magic that works. + */ + +void +div_init(div_info_t *div_info, size_t d) { + /* Nonsensical. */ + assert(d != 0); + /* + * This would make the value of magic too high to fit into a uint32_t + * (we would want magic = 2^32 exactly). This would mess with code gen + * on 32-bit machines. + */ + assert(d != 1); + + uint64_t two_to_k = ((uint64_t)1 << 32); + uint32_t magic = (uint32_t)(two_to_k / d); + + /* + * We want magic = ceil(2^k / d), but C gives us floor. We have to + * increment it unless the result was exact (i.e. unless d is a power of + * two). + */ + if (two_to_k % d != 0) { + magic++; + } + div_info->magic = magic; +#ifdef JEMALLOC_DEBUG + div_info->d = d; +#endif +} diff --git a/dep/jemalloc/src/extent.c b/dep/jemalloc/src/extent.c index fa45c84d34f..09d6d771817 100644 --- a/dep/jemalloc/src/extent.c +++ b/dep/jemalloc/src/extent.c @@ -17,6 +17,8 @@ rtree_t extents_rtree; /* Keyed by the address of the extent_t being protected. */ mutex_pool_t extent_mutex_pool; +size_t opt_lg_extent_max_active_fit = LG_EXTENT_MAX_ACTIVE_FIT_DEFAULT; + static const bitmap_info_t extents_bitmap_info = BITMAP_INFO_INITIALIZER(NPSIZES+1); @@ -117,7 +119,7 @@ static void extent_record(tsdn_t *tsdn, arena_t *arena, /******************************************************************************/ -rb_gen(UNUSED, extent_avail_, extent_tree_t, extent_t, rb_link, +ph_gen(UNUSED, extent_avail_, extent_tree_t, extent_t, ph_link, extent_esnead_comp) typedef enum { @@ -304,8 +306,7 @@ extents_npages_get(extents_t *extents) { } static void -extents_insert_locked(tsdn_t *tsdn, extents_t *extents, extent_t *extent, - bool preserve_lru) { +extents_insert_locked(tsdn_t *tsdn, extents_t *extents, extent_t *extent) { malloc_mutex_assert_owner(tsdn, &extents->mtx); assert(extent_state_get(extent) == extents->state); @@ -317,9 +318,7 @@ extents_insert_locked(tsdn_t *tsdn, extents_t *extents, extent_t *extent, (size_t)pind); } extent_heap_insert(&extents->heaps[pind], extent); - if (!preserve_lru) { - extent_list_append(&extents->lru, extent); - } + extent_list_append(&extents->lru, extent); size_t npages = size >> LG_PAGE; /* * All modifications to npages hold the mutex (as asserted above), so we @@ -333,8 +332,7 @@ extents_insert_locked(tsdn_t *tsdn, extents_t *extents, extent_t *extent, } static void -extents_remove_locked(tsdn_t *tsdn, extents_t *extents, extent_t *extent, - bool preserve_lru) { +extents_remove_locked(tsdn_t *tsdn, extents_t *extents, extent_t *extent) { malloc_mutex_assert_owner(tsdn, &extents->mtx); assert(extent_state_get(extent) == extents->state); @@ -346,9 +344,7 @@ extents_remove_locked(tsdn_t *tsdn, extents_t *extents, extent_t *extent, bitmap_set(extents->bitmap, &extents_bitmap_info, (size_t)pind); } - if (!preserve_lru) { - extent_list_remove(&extents->lru, extent); - } + extent_list_remove(&extents->lru, extent); size_t npages = size >> LG_PAGE; /* * As in extents_insert_locked, we hold extents->mtx and so don't need @@ -361,6 +357,43 @@ extents_remove_locked(tsdn_t *tsdn, extents_t *extents, extent_t *extent, cur_extents_npages - (size >> LG_PAGE), ATOMIC_RELAXED); } +/* + * Find an extent with size [min_size, max_size) to satisfy the alignment + * requirement. For each size, try only the first extent in the heap. + */ +static extent_t * +extents_fit_alignment(extents_t *extents, size_t min_size, size_t max_size, + size_t alignment) { + pszind_t pind = sz_psz2ind(extent_size_quantize_ceil(min_size)); + pszind_t pind_max = sz_psz2ind(extent_size_quantize_ceil(max_size)); + + for (pszind_t i = (pszind_t)bitmap_ffu(extents->bitmap, + &extents_bitmap_info, (size_t)pind); i < pind_max; i = + (pszind_t)bitmap_ffu(extents->bitmap, &extents_bitmap_info, + (size_t)i+1)) { + assert(i < NPSIZES); + assert(!extent_heap_empty(&extents->heaps[i])); + extent_t *extent = extent_heap_first(&extents->heaps[i]); + uintptr_t base = (uintptr_t)extent_base_get(extent); + size_t candidate_size = extent_size_get(extent); + assert(candidate_size >= min_size); + + uintptr_t next_align = ALIGNMENT_CEILING((uintptr_t)base, + PAGE_CEILING(alignment)); + if (base > next_align || base + candidate_size <= next_align) { + /* Overflow or not crossing the next alignment. */ + continue; + } + + size_t leadsize = next_align - base; + if (candidate_size - leadsize >= min_size) { + return extent; + } + } + + return NULL; +} + /* Do any-best-fit extent selection, i.e. select any extent that best fits. */ static extent_t * extents_best_fit_locked(tsdn_t *tsdn, arena_t *arena, extents_t *extents, @@ -369,8 +402,15 @@ extents_best_fit_locked(tsdn_t *tsdn, arena_t *arena, extents_t *extents, pszind_t i = (pszind_t)bitmap_ffu(extents->bitmap, &extents_bitmap_info, (size_t)pind); if (i < NPSIZES+1) { + /* + * In order to reduce fragmentation, avoid reusing and splitting + * large extents for much smaller sizes. + */ + if ((sz_pind2sz(i) >> opt_lg_extent_max_active_fit) > size) { + return NULL; + } assert(!extent_heap_empty(&extents->heaps[i])); - extent_t *extent = extent_heap_any(&extents->heaps[i]); + extent_t *extent = extent_heap_first(&extents->heaps[i]); assert(extent_size_get(extent) >= size); return extent; } @@ -415,12 +455,30 @@ extents_first_fit_locked(tsdn_t *tsdn, arena_t *arena, extents_t *extents, */ static extent_t * extents_fit_locked(tsdn_t *tsdn, arena_t *arena, extents_t *extents, - size_t size) { + size_t esize, size_t alignment) { malloc_mutex_assert_owner(tsdn, &extents->mtx); - return extents->delay_coalesce ? extents_best_fit_locked(tsdn, arena, - extents, size) : extents_first_fit_locked(tsdn, arena, extents, - size); + size_t max_size = esize + PAGE_CEILING(alignment) - PAGE; + /* Beware size_t wrap-around. */ + if (max_size < esize) { + return NULL; + } + + extent_t *extent = extents->delay_coalesce ? + extents_best_fit_locked(tsdn, arena, extents, max_size) : + extents_first_fit_locked(tsdn, arena, extents, max_size); + + if (alignment > PAGE && extent == NULL) { + /* + * max_size guarantees the alignment requirement but is rather + * pessimistic. Next we try to satisfy the aligned allocation + * with sizes in [esize, max_size). + */ + extent = extents_fit_alignment(extents, esize, max_size, + alignment); + } + + return extent; } static bool @@ -436,7 +494,7 @@ extent_try_delayed_coalesce(tsdn_t *tsdn, arena_t *arena, if (!coalesced) { return true; } - extents_insert_locked(tsdn, extents, extent, true); + extents_insert_locked(tsdn, extents, extent); return false; } @@ -449,8 +507,10 @@ extents_alloc(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), WITNESS_RANK_CORE, 0); - return extent_recycle(tsdn, arena, r_extent_hooks, extents, new_addr, - size, pad, alignment, slab, szind, zero, commit, false); + extent_t *extent = extent_recycle(tsdn, arena, r_extent_hooks, extents, + new_addr, size, pad, alignment, slab, szind, zero, commit, false); + assert(extent == NULL || extent_dumpable_get(extent)); + return extent; } void @@ -458,6 +518,7 @@ extents_dalloc(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, extents_t *extents, extent_t *extent) { assert(extent_base_get(extent) != NULL); assert(extent_size_get(extent) != 0); + assert(extent_dumpable_get(extent)); witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), WITNESS_RANK_CORE, 0); @@ -487,14 +548,13 @@ extents_evict(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, goto label_return; } /* Check the eviction limit. */ - size_t npages = extent_size_get(extent) >> LG_PAGE; size_t extents_npages = atomic_load_zu(&extents->npages, ATOMIC_RELAXED); - if (extents_npages - npages < npages_min) { + if (extents_npages <= npages_min) { extent = NULL; goto label_return; } - extents_remove_locked(tsdn, extents, extent, false); + extents_remove_locked(tsdn, extents, extent); if (!extents->delay_coalesce) { break; } @@ -567,29 +627,29 @@ extents_postfork_child(tsdn_t *tsdn, extents_t *extents) { static void extent_deactivate_locked(tsdn_t *tsdn, arena_t *arena, extents_t *extents, - extent_t *extent, bool preserve_lru) { + extent_t *extent) { assert(extent_arena_get(extent) == arena); assert(extent_state_get(extent) == extent_state_active); extent_state_set(extent, extents_state_get(extents)); - extents_insert_locked(tsdn, extents, extent, preserve_lru); + extents_insert_locked(tsdn, extents, extent); } static void extent_deactivate(tsdn_t *tsdn, arena_t *arena, extents_t *extents, - extent_t *extent, bool preserve_lru) { + extent_t *extent) { malloc_mutex_lock(tsdn, &extents->mtx); - extent_deactivate_locked(tsdn, arena, extents, extent, preserve_lru); + extent_deactivate_locked(tsdn, arena, extents, extent); malloc_mutex_unlock(tsdn, &extents->mtx); } static void extent_activate_locked(tsdn_t *tsdn, arena_t *arena, extents_t *extents, - extent_t *extent, bool preserve_lru) { + extent_t *extent) { assert(extent_arena_get(extent) == arena); assert(extent_state_get(extent) == extents_state_get(extents)); - extents_remove_locked(tsdn, extents, extent, preserve_lru); + extents_remove_locked(tsdn, extents, extent); extent_state_set(extent, extent_state_active); } @@ -723,6 +783,13 @@ extent_reregister(tsdn_t *tsdn, extent_t *extent) { assert(!err); } +/* + * Removes all pointers to the given extent from the global rtree indices for + * its interior. This is relevant for slab extents, for which we need to do + * metadata lookups at places other than the head of the extent. We deregister + * on the interior, then, when an extent moves from being an active slab to an + * inactive state. + */ static void extent_interior_deregister(tsdn_t *tsdn, rtree_ctx_t *rtree_ctx, extent_t *extent) { @@ -737,8 +804,11 @@ extent_interior_deregister(tsdn_t *tsdn, rtree_ctx_t *rtree_ctx, } } +/* + * Removes all pointers to the given extent from the global rtree. + */ static void -extent_deregister(tsdn_t *tsdn, extent_t *extent) { +extent_deregister_impl(tsdn_t *tsdn, extent_t *extent, bool gdump) { rtree_ctx_t rtree_ctx_fallback; rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback); rtree_leaf_elm_t *elm_a, *elm_b; @@ -755,16 +825,30 @@ extent_deregister(tsdn_t *tsdn, extent_t *extent) { extent_unlock(tsdn, extent); - if (config_prof) { + if (config_prof && gdump) { extent_gdump_sub(tsdn, extent); } } +static void +extent_deregister(tsdn_t *tsdn, extent_t *extent) { + extent_deregister_impl(tsdn, extent, true); +} + +static void +extent_deregister_no_gdump_sub(tsdn_t *tsdn, extent_t *extent) { + extent_deregister_impl(tsdn, extent, false); +} + +/* + * Tries to find and remove an extent from extents that can be used for the + * given allocation request. + */ static extent_t * extent_recycle_extract(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, rtree_ctx_t *rtree_ctx, extents_t *extents, void *new_addr, size_t size, size_t pad, size_t alignment, bool slab, - bool *zero, bool *commit, bool growing_retained) { + bool growing_retained) { witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), WITNESS_RANK_CORE, growing_retained ? 1 : 0); assert(alignment > 0); @@ -786,11 +870,6 @@ extent_recycle_extract(tsdn_t *tsdn, arena_t *arena, } size_t esize = size + pad; - size_t alloc_size = esize + PAGE_CEILING(alignment) - PAGE; - /* Beware size_t wrap-around. */ - if (alloc_size < esize) { - return NULL; - } malloc_mutex_lock(tsdn, &extents->mtx); extent_hooks_assure_initialized(arena, r_extent_hooks); extent_t *extent; @@ -812,86 +891,172 @@ extent_recycle_extract(tsdn_t *tsdn, arena_t *arena, extent_unlock(tsdn, unlock_extent); } } else { - extent = extents_fit_locked(tsdn, arena, extents, alloc_size); + extent = extents_fit_locked(tsdn, arena, extents, esize, + alignment); } if (extent == NULL) { malloc_mutex_unlock(tsdn, &extents->mtx); return NULL; } - extent_activate_locked(tsdn, arena, extents, extent, false); + extent_activate_locked(tsdn, arena, extents, extent); malloc_mutex_unlock(tsdn, &extents->mtx); - if (extent_zeroed_get(extent)) { - *zero = true; - } - if (extent_committed_get(extent)) { - *commit = true; - } - return extent; } -static extent_t * -extent_recycle_split(tsdn_t *tsdn, arena_t *arena, - extent_hooks_t **r_extent_hooks, rtree_ctx_t *rtree_ctx, extents_t *extents, +/* + * Given an allocation request and an extent guaranteed to be able to satisfy + * it, this splits off lead and trail extents, leaving extent pointing to an + * extent satisfying the allocation. + * This function doesn't put lead or trail into any extents_t; it's the caller's + * job to ensure that they can be reused. + */ +typedef enum { + /* + * Split successfully. lead, extent, and trail, are modified to extents + * describing the ranges before, in, and after the given allocation. + */ + extent_split_interior_ok, + /* + * The extent can't satisfy the given allocation request. None of the + * input extent_t *s are touched. + */ + extent_split_interior_cant_alloc, + /* + * In a potentially invalid state. Must leak (if *to_leak is non-NULL), + * and salvage what's still salvageable (if *to_salvage is non-NULL). + * None of lead, extent, or trail are valid. + */ + extent_split_interior_error +} extent_split_interior_result_t; + +static extent_split_interior_result_t +extent_split_interior(tsdn_t *tsdn, arena_t *arena, + extent_hooks_t **r_extent_hooks, rtree_ctx_t *rtree_ctx, + /* The result of splitting, in case of success. */ + extent_t **extent, extent_t **lead, extent_t **trail, + /* The mess to clean up, in case of error. */ + extent_t **to_leak, extent_t **to_salvage, void *new_addr, size_t size, size_t pad, size_t alignment, bool slab, - szind_t szind, extent_t *extent, bool growing_retained) { + szind_t szind, bool growing_retained) { size_t esize = size + pad; - size_t leadsize = ALIGNMENT_CEILING((uintptr_t)extent_base_get(extent), - PAGE_CEILING(alignment)) - (uintptr_t)extent_base_get(extent); + size_t leadsize = ALIGNMENT_CEILING((uintptr_t)extent_base_get(*extent), + PAGE_CEILING(alignment)) - (uintptr_t)extent_base_get(*extent); assert(new_addr == NULL || leadsize == 0); - assert(extent_size_get(extent) >= leadsize + esize); - size_t trailsize = extent_size_get(extent) - leadsize - esize; + if (extent_size_get(*extent) < leadsize + esize) { + return extent_split_interior_cant_alloc; + } + size_t trailsize = extent_size_get(*extent) - leadsize - esize; + + *lead = NULL; + *trail = NULL; + *to_leak = NULL; + *to_salvage = NULL; /* Split the lead. */ if (leadsize != 0) { - extent_t *lead = extent; - extent = extent_split_impl(tsdn, arena, r_extent_hooks, - lead, leadsize, NSIZES, false, esize + trailsize, szind, + *lead = *extent; + *extent = extent_split_impl(tsdn, arena, r_extent_hooks, + *lead, leadsize, NSIZES, false, esize + trailsize, szind, slab, growing_retained); - if (extent == NULL) { - extent_deregister(tsdn, lead); - extents_leak(tsdn, arena, r_extent_hooks, extents, - lead, growing_retained); - return NULL; + if (*extent == NULL) { + *to_leak = *lead; + *lead = NULL; + return extent_split_interior_error; } - extent_deactivate(tsdn, arena, extents, lead, false); } /* Split the trail. */ if (trailsize != 0) { - extent_t *trail = extent_split_impl(tsdn, arena, - r_extent_hooks, extent, esize, szind, slab, trailsize, - NSIZES, false, growing_retained); - if (trail == NULL) { - extent_deregister(tsdn, extent); - extents_leak(tsdn, arena, r_extent_hooks, extents, - extent, growing_retained); - return NULL; + *trail = extent_split_impl(tsdn, arena, r_extent_hooks, *extent, + esize, szind, slab, trailsize, NSIZES, false, + growing_retained); + if (*trail == NULL) { + *to_leak = *extent; + *to_salvage = *lead; + *lead = NULL; + *extent = NULL; + return extent_split_interior_error; } - extent_deactivate(tsdn, arena, extents, trail, false); - } else if (leadsize == 0) { + } + + if (leadsize == 0 && trailsize == 0) { /* * Splitting causes szind to be set as a side effect, but no * splitting occurred. */ - extent_szind_set(extent, szind); + extent_szind_set(*extent, szind); if (szind != NSIZES) { rtree_szind_slab_update(tsdn, &extents_rtree, rtree_ctx, - (uintptr_t)extent_addr_get(extent), szind, slab); - if (slab && extent_size_get(extent) > PAGE) { + (uintptr_t)extent_addr_get(*extent), szind, slab); + if (slab && extent_size_get(*extent) > PAGE) { rtree_szind_slab_update(tsdn, &extents_rtree, rtree_ctx, - (uintptr_t)extent_past_get(extent) - + (uintptr_t)extent_past_get(*extent) - (uintptr_t)PAGE, szind, slab); } } } - return extent; + return extent_split_interior_ok; } +/* + * This fulfills the indicated allocation request out of the given extent (which + * the caller should have ensured was big enough). If there's any unused space + * before or after the resulting allocation, that space is given its own extent + * and put back into extents. + */ +static extent_t * +extent_recycle_split(tsdn_t *tsdn, arena_t *arena, + extent_hooks_t **r_extent_hooks, rtree_ctx_t *rtree_ctx, extents_t *extents, + void *new_addr, size_t size, size_t pad, size_t alignment, bool slab, + szind_t szind, extent_t *extent, bool growing_retained) { + extent_t *lead; + extent_t *trail; + extent_t *to_leak; + extent_t *to_salvage; + + extent_split_interior_result_t result = extent_split_interior( + tsdn, arena, r_extent_hooks, rtree_ctx, &extent, &lead, &trail, + &to_leak, &to_salvage, new_addr, size, pad, alignment, slab, szind, + growing_retained); + + if (result == extent_split_interior_ok) { + if (lead != NULL) { + extent_deactivate(tsdn, arena, extents, lead); + } + if (trail != NULL) { + extent_deactivate(tsdn, arena, extents, trail); + } + return extent; + } else { + /* + * We should have picked an extent that was large enough to + * fulfill our allocation request. + */ + assert(result == extent_split_interior_error); + if (to_salvage != NULL) { + extent_deregister(tsdn, to_salvage); + } + if (to_leak != NULL) { + void *leak = extent_base_get(to_leak); + extent_deregister_no_gdump_sub(tsdn, to_leak); + extents_leak(tsdn, arena, r_extent_hooks, extents, + to_leak, growing_retained); + assert(extent_lock_from_addr(tsdn, rtree_ctx, leak) + == NULL); + } + return NULL; + } + unreachable(); +} + +/* + * Tries to satisfy the given allocation request by reusing one of the extents + * in the given extents_t. + */ static extent_t * extent_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, extents_t *extents, void *new_addr, size_t size, size_t pad, @@ -906,16 +1071,12 @@ extent_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, rtree_ctx_t rtree_ctx_fallback; rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback); - bool committed = false; extent_t *extent = extent_recycle_extract(tsdn, arena, r_extent_hooks, - rtree_ctx, extents, new_addr, size, pad, alignment, slab, zero, - &committed, growing_retained); + rtree_ctx, extents, new_addr, size, pad, alignment, slab, + growing_retained); if (extent == NULL) { return NULL; } - if (committed) { - *commit = true; - } extent = extent_recycle_split(tsdn, arena, r_extent_hooks, rtree_ctx, extents, new_addr, size, pad, alignment, slab, szind, extent, @@ -934,6 +1095,13 @@ extent_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, extent_zeroed_set(extent, true); } + if (extent_committed_get(extent)) { + *commit = true; + } + if (extent_zeroed_get(extent)) { + *zero = true; + } + if (pad != 0) { extent_addr_randomize(tsdn, extent, alignment); } @@ -999,11 +1167,12 @@ extent_alloc_core(tsdn_t *tsdn, arena_t *arena, void *new_addr, size_t size, static void * extent_alloc_default_impl(tsdn_t *tsdn, arena_t *arena, void *new_addr, size_t size, size_t alignment, bool *zero, bool *commit) { - void *ret; - - ret = extent_alloc_core(tsdn, arena, new_addr, size, alignment, zero, + void *ret = extent_alloc_core(tsdn, arena, new_addr, size, alignment, zero, commit, (dss_prec_t)atomic_load_u(&arena->dss_prec, ATOMIC_RELAXED)); + if (have_madvise_huge && ret) { + pages_set_thp_state(ret, size); + } return ret; } @@ -1028,7 +1197,18 @@ extent_alloc_default(extent_hooks_t *extent_hooks, void *new_addr, size_t size, static void extent_hook_pre_reentrancy(tsdn_t *tsdn, arena_t *arena) { tsd_t *tsd = tsdn_null(tsdn) ? tsd_fetch() : tsdn_tsd(tsdn); - pre_reentrancy(tsd, arena); + if (arena == arena_get(tsd_tsdn(tsd), 0, false)) { + /* + * The only legitimate case of customized extent hooks for a0 is + * hooks with no allocation activities. One such example is to + * place metadata on pre-allocated resources such as huge pages. + * In that case, rely on reentrancy_level checks to catch + * infinite recursions. + */ + pre_reentrancy(tsd, NULL); + } else { + pre_reentrancy(tsd, arena); + } } static void @@ -1081,9 +1261,8 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena, void *ptr; if (*r_extent_hooks == &extent_hooks_default) { - ptr = extent_alloc_core(tsdn, arena, NULL, alloc_size, PAGE, - &zeroed, &committed, (dss_prec_t)atomic_load_u( - &arena->dss_prec, ATOMIC_RELAXED)); + ptr = extent_alloc_default_impl(tsdn, arena, NULL, + alloc_size, PAGE, &zeroed, &committed); } else { extent_hook_pre_reentrancy(tsdn, arena); ptr = (*r_extent_hooks)->alloc(*r_extent_hooks, NULL, @@ -1094,21 +1273,18 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena, extent_init(extent, arena, ptr, alloc_size, false, NSIZES, arena_extent_sn_next(arena), extent_state_active, zeroed, - committed); + committed, true); if (ptr == NULL) { extent_dalloc(tsdn, arena, extent); goto label_err; } + if (extent_register_no_gdump_add(tsdn, extent)) { extents_leak(tsdn, arena, r_extent_hooks, &arena->extents_retained, extent, true); goto label_err; } - size_t leadsize = ALIGNMENT_CEILING((uintptr_t)ptr, - PAGE_CEILING(alignment)) - (uintptr_t)ptr; - assert(alloc_size >= leadsize + esize); - size_t trailsize = alloc_size - leadsize - esize; if (extent_zeroed_get(extent) && extent_committed_get(extent)) { *zero = true; } @@ -1116,54 +1292,46 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena, *commit = true; } - /* Split the lead. */ - if (leadsize != 0) { - extent_t *lead = extent; - extent = extent_split_impl(tsdn, arena, r_extent_hooks, lead, - leadsize, NSIZES, false, esize + trailsize, szind, slab, - true); - if (extent == NULL) { - extent_deregister(tsdn, lead); - extents_leak(tsdn, arena, r_extent_hooks, + rtree_ctx_t rtree_ctx_fallback; + rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback); + + extent_t *lead; + extent_t *trail; + extent_t *to_leak; + extent_t *to_salvage; + extent_split_interior_result_t result = extent_split_interior( + tsdn, arena, r_extent_hooks, rtree_ctx, &extent, &lead, &trail, + &to_leak, &to_salvage, NULL, size, pad, alignment, slab, szind, + true); + + if (result == extent_split_interior_ok) { + if (lead != NULL) { + extent_record(tsdn, arena, r_extent_hooks, &arena->extents_retained, lead, true); - goto label_err; } - extent_record(tsdn, arena, r_extent_hooks, - &arena->extents_retained, lead, true); - } - - /* Split the trail. */ - if (trailsize != 0) { - extent_t *trail = extent_split_impl(tsdn, arena, r_extent_hooks, - extent, esize, szind, slab, trailsize, NSIZES, false, true); - if (trail == NULL) { - extent_deregister(tsdn, extent); - extents_leak(tsdn, arena, r_extent_hooks, - &arena->extents_retained, extent, true); - goto label_err; + if (trail != NULL) { + extent_record(tsdn, arena, r_extent_hooks, + &arena->extents_retained, trail, true); } - extent_record(tsdn, arena, r_extent_hooks, - &arena->extents_retained, trail, true); - } else if (leadsize == 0) { + } else { /* - * Splitting causes szind to be set as a side effect, but no - * splitting occurred. + * We should have allocated a sufficiently large extent; the + * cant_alloc case should not occur. */ - rtree_ctx_t rtree_ctx_fallback; - rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, - &rtree_ctx_fallback); - - extent_szind_set(extent, szind); - if (szind != NSIZES) { - rtree_szind_slab_update(tsdn, &extents_rtree, rtree_ctx, - (uintptr_t)extent_addr_get(extent), szind, slab); - if (slab && extent_size_get(extent) > PAGE) { - rtree_szind_slab_update(tsdn, &extents_rtree, - rtree_ctx, - (uintptr_t)extent_past_get(extent) - - (uintptr_t)PAGE, szind, slab); + assert(result == extent_split_interior_error); + if (to_salvage != NULL) { + if (config_prof) { + extent_gdump_add(tsdn, to_salvage); } + extent_record(tsdn, arena, r_extent_hooks, + &arena->extents_retained, to_salvage, true); } + if (to_leak != NULL) { + extent_deregister_no_gdump_sub(tsdn, to_leak); + extents_leak(tsdn, arena, r_extent_hooks, + &arena->extents_retained, to_leak, true); + } + goto label_err; } if (*commit && !extent_committed_get(extent)) { @@ -1177,13 +1345,14 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena, } /* - * Increment extent_grow_next if doing so wouldn't exceed the legal + * Increment extent_grow_next if doing so wouldn't exceed the allowed * range. */ - if (arena->extent_grow_next + egn_skip + 1 < NPSIZES) { + if (arena->extent_grow_next + egn_skip + 1 <= + arena->retain_grow_limit) { arena->extent_grow_next += egn_skip + 1; } else { - arena->extent_grow_next = NPSIZES - 1; + arena->extent_grow_next = arena->retain_grow_limit; } /* All opportunities for failure are past. */ malloc_mutex_unlock(tsdn, &arena->extent_grow_mtx); @@ -1271,7 +1440,8 @@ extent_alloc_wrapper_hard(tsdn_t *tsdn, arena_t *arena, return NULL; } extent_init(extent, arena, addr, esize, slab, szind, - arena_extent_sn_next(arena), extent_state_active, zero, commit); + arena_extent_sn_next(arena), extent_state_active, *zero, *commit, + true); if (pad != 0) { extent_addr_randomize(tsdn, extent, alignment); } @@ -1296,10 +1466,20 @@ extent_alloc_wrapper(tsdn_t *tsdn, arena_t *arena, extent_t *extent = extent_alloc_retained(tsdn, arena, r_extent_hooks, new_addr, size, pad, alignment, slab, szind, zero, commit); if (extent == NULL) { + if (opt_retain && new_addr != NULL) { + /* + * When retain is enabled and new_addr is set, we do not + * attempt extent_alloc_wrapper_hard which does mmap + * that is very unlikely to succeed (unless it happens + * to be at the end). + */ + return NULL; + } extent = extent_alloc_wrapper_hard(tsdn, arena, r_extent_hooks, new_addr, size, pad, alignment, slab, szind, zero, commit); } + assert(extent == NULL || extent_dumpable_get(extent)); return extent; } @@ -1329,16 +1509,7 @@ extent_coalesce(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, bool growing_retained) { assert(extent_can_coalesce(arena, extents, inner, outer)); - if (forward && extents->delay_coalesce) { - /* - * The extent that remains after coalescing must occupy the - * outer extent's position in the LRU. For forward coalescing, - * swap the inner extent into the LRU. - */ - extent_list_replace(&extents->lru, outer, inner); - } - extent_activate_locked(tsdn, arena, extents, outer, - extents->delay_coalesce); + extent_activate_locked(tsdn, arena, extents, outer); malloc_mutex_unlock(tsdn, &extents->mtx); bool err = extent_merge_impl(tsdn, arena, r_extent_hooks, @@ -1346,11 +1517,7 @@ extent_coalesce(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, malloc_mutex_lock(tsdn, &extents->mtx); if (err) { - if (forward && extents->delay_coalesce) { - extent_list_replace(&extents->lru, inner, outer); - } - extent_deactivate_locked(tsdn, arena, extents, outer, - extents->delay_coalesce); + extent_deactivate_locked(tsdn, arena, extents, outer); } return err; @@ -1422,6 +1589,10 @@ extent_try_coalesce(tsdn_t *tsdn, arena_t *arena, return extent; } +/* + * Does the metadata management portions of putting an unused extent into the + * given extents_t (coalesces, deregisters slab interiors, the heap operations). + */ static void extent_record(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, extents_t *extents, extent_t *extent, bool growing_retained) { @@ -1447,9 +1618,20 @@ extent_record(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, if (!extents->delay_coalesce) { extent = extent_try_coalesce(tsdn, arena, r_extent_hooks, rtree_ctx, extents, extent, NULL, growing_retained); + } else if (extent_size_get(extent) >= LARGE_MINCLASS) { + /* Always coalesce large extents eagerly. */ + bool coalesced; + size_t prev_size; + do { + prev_size = extent_size_get(extent); + assert(extent_state_get(extent) == extent_state_active); + extent = extent_try_coalesce(tsdn, arena, + r_extent_hooks, rtree_ctx, extents, extent, + &coalesced, growing_retained); + } while (coalesced && + extent_size_get(extent) >= prev_size + LARGE_MINCLASS); } - - extent_deactivate_locked(tsdn, arena, extents, extent, false); + extent_deactivate_locked(tsdn, arena, extents, extent); malloc_mutex_unlock(tsdn, &extents->mtx); } @@ -1520,6 +1702,7 @@ extent_dalloc_wrapper_try(tsdn_t *tsdn, arena_t *arena, void extent_dalloc_wrapper(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, extent_t *extent) { + assert(extent_dumpable_get(extent)); witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), WITNESS_RANK_CORE, 0); @@ -1780,6 +1963,13 @@ extent_split_default(extent_hooks_t *extent_hooks, void *addr, size_t size, } #endif +/* + * Accepts the extent to split, and the characteristics of each side of the + * split. The 'a' parameters go with the 'lead' of the resulting pair of + * extents (the lower addressed portion of the split), and the 'b' parameters go + * with the trail (the higher addressed portion). This makes 'extent' the lead, + * and returns the trail (except in case of error). + */ static extent_t * extent_split_impl(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, extent_t *extent, size_t size_a, @@ -1803,7 +1993,7 @@ extent_split_impl(tsdn_t *tsdn, arena_t *arena, extent_init(trail, arena, (void *)((uintptr_t)extent_base_get(extent) + size_a), size_b, slab_b, szind_b, extent_sn_get(extent), extent_state_get(extent), extent_zeroed_get(extent), - extent_committed_get(extent)); + extent_committed_get(extent), extent_dumpable_get(extent)); rtree_ctx_t rtree_ctx_fallback; rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback); @@ -1814,7 +2004,7 @@ extent_split_impl(tsdn_t *tsdn, arena_t *arena, extent_init(&lead, arena, extent_addr_get(extent), size_a, slab_a, szind_a, extent_sn_get(extent), extent_state_get(extent), extent_zeroed_get(extent), - extent_committed_get(extent)); + extent_committed_get(extent), extent_dumpable_get(extent)); extent_rtree_leaf_elms_lookup(tsdn, rtree_ctx, &lead, false, true, &lead_elm_a, &lead_elm_b); diff --git a/dep/jemalloc/src/extent_dss.c b/dep/jemalloc/src/extent_dss.c index e72da95870d..2b1ea9cafa0 100644 --- a/dep/jemalloc/src/extent_dss.c +++ b/dep/jemalloc/src/extent_dss.c @@ -156,7 +156,7 @@ extent_alloc_dss(tsdn_t *tsdn, arena_t *arena, void *new_addr, size_t size, extent_init(gap, arena, gap_addr_page, gap_size_page, false, NSIZES, arena_extent_sn_next(arena), - extent_state_active, false, true); + extent_state_active, false, true, true); } /* * Compute the address just past the end of the desired @@ -199,7 +199,8 @@ extent_alloc_dss(tsdn_t *tsdn, arena_t *arena, void *new_addr, size_t size, extent_init(&extent, arena, ret, size, size, false, NSIZES, - extent_state_active, false, true); + extent_state_active, false, true, + true); if (extent_purge_forced_wrapper(tsdn, arena, &extent_hooks, &extent, 0, size)) { diff --git a/dep/jemalloc/src/jemalloc.c b/dep/jemalloc/src/jemalloc.c index 0ee8ad48b98..f93c16fa3cf 100644 --- a/dep/jemalloc/src/jemalloc.c +++ b/dep/jemalloc/src/jemalloc.c @@ -8,6 +8,7 @@ #include "jemalloc/internal/extent_dss.h" #include "jemalloc/internal/extent_mmap.h" #include "jemalloc/internal/jemalloc_internal_types.h" +#include "jemalloc/internal/log.h" #include "jemalloc/internal/malloc_io.h" #include "jemalloc/internal/mutex.h" #include "jemalloc/internal/rtree.h" @@ -848,10 +849,8 @@ malloc_conf_error(const char *msg, const char *k, size_t klen, const char *v, size_t vlen) { malloc_printf(": %s: %.*s:%.*s\n", msg, (int)klen, k, (int)vlen, v); + /* If abort_conf is set, error out after processing all options. */ had_conf_error = true; - if (opt_abort_conf) { - malloc_abort_invalid_conf(); - } } static void @@ -1051,8 +1050,22 @@ malloc_conf_init(void) { CONF_HANDLE_BOOL(opt_abort, "abort") CONF_HANDLE_BOOL(opt_abort_conf, "abort_conf") - if (opt_abort_conf && had_conf_error) { - malloc_abort_invalid_conf(); + if (strncmp("metadata_thp", k, klen) == 0) { + int i; + bool match = false; + for (i = 0; i < metadata_thp_mode_limit; i++) { + if (strncmp(metadata_thp_mode_names[i], + v, vlen) == 0) { + opt_metadata_thp = i; + match = true; + break; + } + } + if (!match) { + malloc_conf_error("Invalid conf value", + k, klen, v, vlen); + } + continue; } CONF_HANDLE_BOOL(opt_retain, "retain") if (strncmp("dss", k, klen) == 0) { @@ -1128,12 +1141,14 @@ malloc_conf_init(void) { CONF_HANDLE_BOOL(opt_xmalloc, "xmalloc") } CONF_HANDLE_BOOL(opt_tcache, "tcache") + CONF_HANDLE_SIZE_T(opt_lg_extent_max_active_fit, + "lg_extent_max_active_fit", 0, + (sizeof(size_t) << 3), yes, yes, false) CONF_HANDLE_SSIZE_T(opt_lg_tcache_max, "lg_tcache_max", -1, (sizeof(size_t) << 3) - 1) if (strncmp("percpu_arena", k, klen) == 0) { - int i; bool match = false; - for (i = percpu_arena_mode_names_base; i < + for (int i = percpu_arena_mode_names_base; i < percpu_arena_mode_names_limit; i++) { if (strncmp(percpu_arena_mode_names[i], v, vlen) == 0) { @@ -1155,6 +1170,10 @@ malloc_conf_init(void) { } CONF_HANDLE_BOOL(opt_background_thread, "background_thread"); + CONF_HANDLE_SIZE_T(opt_max_background_threads, + "max_background_threads", 1, + opt_max_background_threads, yes, yes, + true); if (config_prof) { CONF_HANDLE_BOOL(opt_prof, "prof") CONF_HANDLE_CHAR_P(opt_prof_prefix, @@ -1173,6 +1192,37 @@ malloc_conf_init(void) { CONF_HANDLE_BOOL(opt_prof_final, "prof_final") CONF_HANDLE_BOOL(opt_prof_leak, "prof_leak") } + if (config_log) { + if (CONF_MATCH("log")) { + size_t cpylen = ( + vlen <= sizeof(log_var_names) ? + vlen : sizeof(log_var_names) - 1); + strncpy(log_var_names, v, cpylen); + log_var_names[cpylen] = '\0'; + continue; + } + } + if (CONF_MATCH("thp")) { + bool match = false; + for (int i = 0; i < thp_mode_names_limit; i++) { + if (strncmp(thp_mode_names[i],v, vlen) + == 0) { + if (!have_madvise_huge) { + malloc_conf_error( + "No THP support", + k, klen, v, vlen); + } + opt_thp = i; + match = true; + break; + } + } + if (!match) { + malloc_conf_error("Invalid conf value", + k, klen, v, vlen); + } + continue; + } malloc_conf_error("Invalid conf pair", k, klen, v, vlen); #undef CONF_MATCH @@ -1188,7 +1238,11 @@ malloc_conf_init(void) { #undef CONF_HANDLE_SSIZE_T #undef CONF_HANDLE_CHAR_P } + if (opt_abort_conf && had_conf_error) { + malloc_abort_invalid_conf(); + } } + atomic_store_b(&log_init_done, true, ATOMIC_RELEASE); } static bool @@ -1493,6 +1547,8 @@ malloc_init_hard(void) { post_reentrancy(tsd); malloc_mutex_unlock(tsd_tsdn(tsd), &init_lock); + witness_assert_lockless(witness_tsd_tsdn( + tsd_witness_tsdp_get_unsafe(tsd))); malloc_tsd_boot1(); /* Update TSD after tsd_boot1. */ tsd = tsd_fetch(); @@ -1500,8 +1556,11 @@ malloc_init_hard(void) { assert(have_background_thread); /* * Need to finish init & unlock first before creating background - * threads (pthread_create depends on malloc). + * threads (pthread_create depends on malloc). ctl_init (which + * sets isthreaded) needs to be called without holding any lock. */ + background_thread_ctl_init(tsd_tsdn(tsd)); + malloc_mutex_lock(tsd_tsdn(tsd), &background_thread_lock); bool err = background_thread_create(tsd, 0); malloc_mutex_unlock(tsd_tsdn(tsd), &background_thread_lock); @@ -1701,7 +1760,7 @@ compute_size_with_overflow(bool may_overflow, dynamic_opts_t *dopts, } /* A size_t with its high-half bits all set to 1. */ - const static size_t high_bits = SIZE_T_MAX << (sizeof(size_t) * 8 / 2); + static const size_t high_bits = SIZE_T_MAX << (sizeof(size_t) * 8 / 2); *size = dopts->item_size * dopts->num_items; @@ -1962,6 +2021,8 @@ je_malloc(size_t size) { static_opts_t sopts; dynamic_opts_t dopts; + LOG("core.malloc.entry", "size: %zu", size); + static_opts_init(&sopts); dynamic_opts_init(&dopts); @@ -1976,6 +2037,8 @@ je_malloc(size_t size) { imalloc(&sopts, &dopts); + LOG("core.malloc.exit", "result: %p", ret); + return ret; } @@ -1986,6 +2049,9 @@ je_posix_memalign(void **memptr, size_t alignment, size_t size) { static_opts_t sopts; dynamic_opts_t dopts; + LOG("core.posix_memalign.entry", "mem ptr: %p, alignment: %zu, " + "size: %zu", memptr, alignment, size); + static_opts_init(&sopts); dynamic_opts_init(&dopts); @@ -2002,6 +2068,10 @@ je_posix_memalign(void **memptr, size_t alignment, size_t size) { dopts.alignment = alignment; ret = imalloc(&sopts, &dopts); + + LOG("core.posix_memalign.exit", "result: %d, alloc ptr: %p", ret, + *memptr); + return ret; } @@ -2014,6 +2084,9 @@ je_aligned_alloc(size_t alignment, size_t size) { static_opts_t sopts; dynamic_opts_t dopts; + LOG("core.aligned_alloc.entry", "alignment: %zu, size: %zu\n", + alignment, size); + static_opts_init(&sopts); dynamic_opts_init(&dopts); @@ -2032,6 +2105,9 @@ je_aligned_alloc(size_t alignment, size_t size) { dopts.alignment = alignment; imalloc(&sopts, &dopts); + + LOG("core.aligned_alloc.exit", "result: %p", ret); + return ret; } @@ -2043,6 +2119,8 @@ je_calloc(size_t num, size_t size) { static_opts_t sopts; dynamic_opts_t dopts; + LOG("core.calloc.entry", "num: %zu, size: %zu\n", num, size); + static_opts_init(&sopts); dynamic_opts_init(&dopts); @@ -2059,6 +2137,8 @@ je_calloc(size_t num, size_t size) { imalloc(&sopts, &dopts); + LOG("core.calloc.exit", "result: %p", ret); + return ret; } @@ -2161,17 +2241,37 @@ isfree(tsd_t *tsd, void *ptr, size_t usize, tcache_t *tcache, bool slow_path) { assert(malloc_initialized() || IS_INITIALIZER); alloc_ctx_t alloc_ctx, *ctx; - if (config_prof && opt_prof) { + if (!config_cache_oblivious && ((uintptr_t)ptr & PAGE_MASK) != 0) { + /* + * When cache_oblivious is disabled and ptr is not page aligned, + * the allocation was not sampled -- usize can be used to + * determine szind directly. + */ + alloc_ctx.szind = sz_size2index(usize); + alloc_ctx.slab = true; + ctx = &alloc_ctx; + if (config_debug) { + alloc_ctx_t dbg_ctx; + rtree_ctx_t *rtree_ctx = tsd_rtree_ctx(tsd); + rtree_szind_slab_read(tsd_tsdn(tsd), &extents_rtree, + rtree_ctx, (uintptr_t)ptr, true, &dbg_ctx.szind, + &dbg_ctx.slab); + assert(dbg_ctx.szind == alloc_ctx.szind); + assert(dbg_ctx.slab == alloc_ctx.slab); + } + } else if (config_prof && opt_prof) { rtree_ctx_t *rtree_ctx = tsd_rtree_ctx(tsd); rtree_szind_slab_read(tsd_tsdn(tsd), &extents_rtree, rtree_ctx, (uintptr_t)ptr, true, &alloc_ctx.szind, &alloc_ctx.slab); assert(alloc_ctx.szind == sz_size2index(usize)); ctx = &alloc_ctx; - prof_free(tsd, ptr, usize, ctx); } else { ctx = NULL; } + if (config_prof && opt_prof) { + prof_free(tsd, ptr, usize, ctx); + } if (config_stats) { *tsd_thread_deallocatedp_get(tsd) += usize; } @@ -2192,6 +2292,8 @@ je_realloc(void *ptr, size_t size) { size_t usize JEMALLOC_CC_SILENCE_INIT(0); size_t old_usize = 0; + LOG("core.realloc.entry", "ptr: %p, size: %zu\n", ptr, size); + if (unlikely(size == 0)) { if (ptr != NULL) { /* realloc(ptr, 0) is equivalent to free(ptr). */ @@ -2204,6 +2306,8 @@ je_realloc(void *ptr, size_t size) { tcache = NULL; } ifree(tsd, ptr, tcache, true); + + LOG("core.realloc.exit", "result: %p", NULL); return NULL; } size = 1; @@ -2236,7 +2340,9 @@ je_realloc(void *ptr, size_t size) { tsdn = tsd_tsdn(tsd); } else { /* realloc(NULL, size) is equivalent to malloc(size). */ - return je_malloc(size); + void *ret = je_malloc(size); + LOG("core.realloc.exit", "result: %p", ret); + return ret; } if (unlikely(ret == NULL)) { @@ -2257,11 +2363,15 @@ je_realloc(void *ptr, size_t size) { } UTRACE(ptr, size, ret); check_entry_exit_locking(tsdn); + + LOG("core.realloc.exit", "result: %p", ret); return ret; } JEMALLOC_EXPORT void JEMALLOC_NOTHROW je_free(void *ptr) { + LOG("core.free.entry", "ptr: %p", ptr); + UTRACE(ptr, 0, 0); if (likely(ptr != NULL)) { /* @@ -2291,6 +2401,7 @@ je_free(void *ptr) { } check_entry_exit_locking(tsd_tsdn(tsd)); } + LOG("core.free.exit", ""); } /* @@ -2310,6 +2421,9 @@ je_memalign(size_t alignment, size_t size) { static_opts_t sopts; dynamic_opts_t dopts; + LOG("core.memalign.entry", "alignment: %zu, size: %zu\n", alignment, + size); + static_opts_init(&sopts); dynamic_opts_init(&dopts); @@ -2327,6 +2441,8 @@ je_memalign(size_t alignment, size_t size) { dopts.alignment = alignment; imalloc(&sopts, &dopts); + + LOG("core.memalign.exit", "result: %p", ret); return ret; } #endif @@ -2341,6 +2457,8 @@ je_valloc(size_t size) { static_opts_t sopts; dynamic_opts_t dopts; + LOG("core.valloc.entry", "size: %zu\n", size); + static_opts_init(&sopts); dynamic_opts_init(&dopts); @@ -2359,6 +2477,7 @@ je_valloc(size_t size) { imalloc(&sopts, &dopts); + LOG("core.valloc.exit", "result: %p\n", ret); return ret; } #endif @@ -2432,6 +2551,8 @@ je_mallocx(size_t size, int flags) { static_opts_t sopts; dynamic_opts_t dopts; + LOG("core.mallocx.entry", "size: %zu, flags: %d", size, flags); + static_opts_init(&sopts); dynamic_opts_init(&dopts); @@ -2465,6 +2586,8 @@ je_mallocx(size_t size, int flags) { } imalloc(&sopts, &dopts); + + LOG("core.mallocx.exit", "result: %p", ret); return ret; } @@ -2545,6 +2668,10 @@ je_rallocx(void *ptr, size_t size, int flags) { arena_t *arena; tcache_t *tcache; + LOG("core.rallocx.entry", "ptr: %p, size: %zu, flags: %d", ptr, + size, flags); + + assert(ptr != NULL); assert(size != 0); assert(malloc_initialized() || IS_INITIALIZER); @@ -2607,6 +2734,8 @@ je_rallocx(void *ptr, size_t size, int flags) { } UTRACE(ptr, size, p); check_entry_exit_locking(tsd_tsdn(tsd)); + + LOG("core.rallocx.exit", "result: %p", p); return p; label_oom: if (config_xmalloc && unlikely(opt_xmalloc)) { @@ -2615,6 +2744,8 @@ label_oom: } UTRACE(ptr, size, 0); check_entry_exit_locking(tsd_tsdn(tsd)); + + LOG("core.rallocx.exit", "result: %p", NULL); return NULL; } @@ -2701,6 +2832,9 @@ je_xallocx(void *ptr, size_t size, size_t extra, int flags) { size_t alignment = MALLOCX_ALIGN_GET(flags); bool zero = flags & MALLOCX_ZERO; + LOG("core.xallocx.entry", "ptr: %p, size: %zu, extra: %zu, " + "flags: %d", ptr, size, extra, flags); + assert(ptr != NULL); assert(size != 0); assert(SIZE_T_MAX - size >= extra); @@ -2750,15 +2884,19 @@ je_xallocx(void *ptr, size_t size, size_t extra, int flags) { label_not_resized: UTRACE(ptr, size, ptr); check_entry_exit_locking(tsd_tsdn(tsd)); + + LOG("core.xallocx.exit", "result: %zu", usize); return usize; } JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW JEMALLOC_ATTR(pure) -je_sallocx(const void *ptr, int flags) { +je_sallocx(const void *ptr, UNUSED int flags) { size_t usize; tsdn_t *tsdn; + LOG("core.sallocx.entry", "ptr: %p, flags: %d", ptr, flags); + assert(malloc_initialized() || IS_INITIALIZER); assert(ptr != NULL); @@ -2773,11 +2911,15 @@ je_sallocx(const void *ptr, int flags) { } check_entry_exit_locking(tsdn); + + LOG("core.sallocx.exit", "result: %zu", usize); return usize; } JEMALLOC_EXPORT void JEMALLOC_NOTHROW je_dallocx(void *ptr, int flags) { + LOG("core.dallocx.entry", "ptr: %p, flags: %d", ptr, flags); + assert(ptr != NULL); assert(malloc_initialized() || IS_INITIALIZER); @@ -2815,6 +2957,8 @@ je_dallocx(void *ptr, int flags) { ifree(tsd, ptr, tcache, true); } check_entry_exit_locking(tsd_tsdn(tsd)); + + LOG("core.dallocx.exit", ""); } JEMALLOC_ALWAYS_INLINE size_t @@ -2836,6 +2980,9 @@ je_sdallocx(void *ptr, size_t size, int flags) { assert(ptr != NULL); assert(malloc_initialized() || IS_INITIALIZER); + LOG("core.sdallocx.entry", "ptr: %p, size: %zu, flags: %d", ptr, + size, flags); + tsd_t *tsd = tsd_fetch(); bool fast = tsd_fast(tsd); size_t usize = inallocx(tsd_tsdn(tsd), size, flags); @@ -2872,6 +3019,8 @@ je_sdallocx(void *ptr, size_t size, int flags) { isfree(tsd, ptr, usize, tcache, true); } check_entry_exit_locking(tsd_tsdn(tsd)); + + LOG("core.sdallocx.exit", ""); } JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW @@ -2883,6 +3032,7 @@ je_nallocx(size_t size, int flags) { assert(size != 0); if (unlikely(malloc_init())) { + LOG("core.nallocx.exit", "result: %zu", ZU(0)); return 0; } @@ -2891,10 +3041,12 @@ je_nallocx(size_t size, int flags) { usize = inallocx(tsdn, size, flags); if (unlikely(usize > LARGE_MAXCLASS)) { + LOG("core.nallocx.exit", "result: %zu", ZU(0)); return 0; } check_entry_exit_locking(tsdn); + LOG("core.nallocx.exit", "result: %zu", usize); return usize; } @@ -2904,7 +3056,10 @@ je_mallctl(const char *name, void *oldp, size_t *oldlenp, void *newp, int ret; tsd_t *tsd; + LOG("core.mallctl.entry", "name: %s", name); + if (unlikely(malloc_init())) { + LOG("core.mallctl.exit", "result: %d", EAGAIN); return EAGAIN; } @@ -2912,6 +3067,8 @@ je_mallctl(const char *name, void *oldp, size_t *oldlenp, void *newp, check_entry_exit_locking(tsd_tsdn(tsd)); ret = ctl_byname(tsd, name, oldp, oldlenp, newp, newlen); check_entry_exit_locking(tsd_tsdn(tsd)); + + LOG("core.mallctl.exit", "result: %d", ret); return ret; } @@ -2919,7 +3076,10 @@ JEMALLOC_EXPORT int JEMALLOC_NOTHROW je_mallctlnametomib(const char *name, size_t *mibp, size_t *miblenp) { int ret; + LOG("core.mallctlnametomib.entry", "name: %s", name); + if (unlikely(malloc_init())) { + LOG("core.mallctlnametomib.exit", "result: %d", EAGAIN); return EAGAIN; } @@ -2927,6 +3087,8 @@ je_mallctlnametomib(const char *name, size_t *mibp, size_t *miblenp) { check_entry_exit_locking(tsd_tsdn(tsd)); ret = ctl_nametomib(tsd, name, mibp, miblenp); check_entry_exit_locking(tsd_tsdn(tsd)); + + LOG("core.mallctlnametomib.exit", "result: %d", ret); return ret; } @@ -2936,7 +3098,10 @@ je_mallctlbymib(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, int ret; tsd_t *tsd; + LOG("core.mallctlbymib.entry", ""); + if (unlikely(malloc_init())) { + LOG("core.mallctlbymib.exit", "result: %d", EAGAIN); return EAGAIN; } @@ -2944,6 +3109,7 @@ je_mallctlbymib(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, check_entry_exit_locking(tsd_tsdn(tsd)); ret = ctl_bymib(tsd, mib, miblen, oldp, oldlenp, newp, newlen); check_entry_exit_locking(tsd_tsdn(tsd)); + LOG("core.mallctlbymib.exit", "result: %d", ret); return ret; } @@ -2952,10 +3118,13 @@ je_malloc_stats_print(void (*write_cb)(void *, const char *), void *cbopaque, const char *opts) { tsdn_t *tsdn; + LOG("core.malloc_stats_print.entry", ""); + tsdn = tsdn_fetch(); check_entry_exit_locking(tsdn); stats_print(write_cb, cbopaque, opts); check_entry_exit_locking(tsdn); + LOG("core.malloc_stats_print.exit", ""); } JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW @@ -2963,6 +3132,8 @@ je_malloc_usable_size(JEMALLOC_USABLE_SIZE_CONST void *ptr) { size_t ret; tsdn_t *tsdn; + LOG("core.malloc_usable_size.entry", "ptr: %p", ptr); + assert(malloc_initialized() || IS_INITIALIZER); tsdn = tsdn_fetch(); @@ -2980,6 +3151,7 @@ je_malloc_usable_size(JEMALLOC_USABLE_SIZE_CONST void *ptr) { } check_entry_exit_locking(tsdn); + LOG("core.malloc_usable_size.exit", "result: %zu", ret); return ret; } diff --git a/dep/jemalloc/src/jemalloc_cpp.cpp b/dep/jemalloc/src/jemalloc_cpp.cpp index 844ab398a71..f0ceddae33a 100644 --- a/dep/jemalloc/src/jemalloc_cpp.cpp +++ b/dep/jemalloc/src/jemalloc_cpp.cpp @@ -39,12 +39,10 @@ void operator delete(void *ptr, std::size_t size) noexcept; void operator delete[](void *ptr, std::size_t size) noexcept; #endif -template -void * -newImpl(std::size_t size) noexcept(IsNoExcept) { - void *ptr = je_malloc(size); - if (likely(ptr != nullptr)) - return ptr; +JEMALLOC_NOINLINE +static void * +handleOOM(std::size_t size, bool nothrow) { + void *ptr = nullptr; while (ptr == nullptr) { std::new_handler handler; @@ -68,11 +66,22 @@ newImpl(std::size_t size) noexcept(IsNoExcept) { ptr = je_malloc(size); } - if (ptr == nullptr && !IsNoExcept) + if (ptr == nullptr && !nothrow) std::__throw_bad_alloc(); return ptr; } +template +JEMALLOC_ALWAYS_INLINE +void * +newImpl(std::size_t size) noexcept(IsNoExcept) { + void *ptr = je_malloc(size); + if (likely(ptr != nullptr)) + return ptr; + + return handleOOM(size, IsNoExcept); +} + void * operator new(std::size_t size) { return newImpl(size); diff --git a/dep/jemalloc/src/log.c b/dep/jemalloc/src/log.c new file mode 100644 index 00000000000..778902fb9b8 --- /dev/null +++ b/dep/jemalloc/src/log.c @@ -0,0 +1,78 @@ +#include "jemalloc/internal/jemalloc_preamble.h" +#include "jemalloc/internal/jemalloc_internal_includes.h" + +#include "jemalloc/internal/log.h" + +char log_var_names[JEMALLOC_LOG_VAR_BUFSIZE]; +atomic_b_t log_init_done = ATOMIC_INIT(false); + +/* + * Returns true if we were able to pick out a segment. Fills in r_segment_end + * with a pointer to the first character after the end of the string. + */ +static const char * +log_var_extract_segment(const char* segment_begin) { + const char *end; + for (end = segment_begin; *end != '\0' && *end != '|'; end++) { + } + return end; +} + +static bool +log_var_matches_segment(const char *segment_begin, const char *segment_end, + const char *log_var_begin, const char *log_var_end) { + assert(segment_begin <= segment_end); + assert(log_var_begin < log_var_end); + + ptrdiff_t segment_len = segment_end - segment_begin; + ptrdiff_t log_var_len = log_var_end - log_var_begin; + /* The special '.' segment matches everything. */ + if (segment_len == 1 && *segment_begin == '.') { + return true; + } + if (segment_len == log_var_len) { + return strncmp(segment_begin, log_var_begin, segment_len) == 0; + } else if (segment_len < log_var_len) { + return strncmp(segment_begin, log_var_begin, segment_len) == 0 + && log_var_begin[segment_len] == '.'; + } else { + return false; + } +} + +unsigned +log_var_update_state(log_var_t *log_var) { + const char *log_var_begin = log_var->name; + const char *log_var_end = log_var->name + strlen(log_var->name); + + /* Pointer to one before the beginning of the current segment. */ + const char *segment_begin = log_var_names; + + /* + * If log_init done is false, we haven't parsed the malloc conf yet. To + * avoid log-spew, we default to not displaying anything. + */ + if (!atomic_load_b(&log_init_done, ATOMIC_ACQUIRE)) { + return LOG_INITIALIZED_NOT_ENABLED; + } + + while (true) { + const char *segment_end = log_var_extract_segment( + segment_begin); + assert(segment_end < log_var_names + JEMALLOC_LOG_VAR_BUFSIZE); + if (log_var_matches_segment(segment_begin, segment_end, + log_var_begin, log_var_end)) { + atomic_store_u(&log_var->state, LOG_ENABLED, + ATOMIC_RELAXED); + return LOG_ENABLED; + } + if (*segment_end == '\0') { + /* Hit the end of the segment string with no match. */ + atomic_store_u(&log_var->state, + LOG_INITIALIZED_NOT_ENABLED, ATOMIC_RELAXED); + return LOG_INITIALIZED_NOT_ENABLED; + } + /* Otherwise, skip the delimiter and continue. */ + segment_begin = segment_end + 1; + } +} diff --git a/dep/jemalloc/src/malloc_io.c b/dep/jemalloc/src/malloc_io.c index 6b99afcd3fc..7bdc13f9519 100644 --- a/dep/jemalloc/src/malloc_io.c +++ b/dep/jemalloc/src/malloc_io.c @@ -70,20 +70,7 @@ static char *x2s(uintmax_t x, bool alt_form, bool uppercase, char *s, /* malloc_message() setup. */ static void wrtmessage(void *cbopaque, const char *s) { -#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_write) - /* - * Use syscall(2) rather than write(2) when possible in order to avoid - * the possibility of memory allocation within libc. This is necessary - * on FreeBSD; most operating systems do not have this problem though. - * - * syscall() returns long or int, depending on platform, so capture the - * unused result in the widest plausible type to avoid compiler - * warnings. - */ - UNUSED long result = syscall(SYS_write, STDERR_FILENO, s, strlen(s)); -#else - UNUSED ssize_t result = write(STDERR_FILENO, s, strlen(s)); -#endif + malloc_write_fd(STDERR_FILENO, s, strlen(s)); } JEMALLOC_EXPORT void (*je_malloc_message)(void *, const char *s); @@ -111,7 +98,7 @@ buferror(int err, char *buf, size_t buflen) { FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, (LPSTR)buf, (DWORD)buflen, NULL); return 0; -#elif defined(__GLIBC__) && defined(_GNU_SOURCE) +#elif defined(JEMALLOC_STRERROR_R_RETURNS_CHAR_WITH_GNU_SOURCE) && defined(_GNU_SOURCE) char *b = strerror_r(err, buf, buflen); if (b != buf) { strncpy(buf, b, buflen); diff --git a/dep/jemalloc/src/mutex.c b/dep/jemalloc/src/mutex.c index a528ef0c243..30222b3e582 100644 --- a/dep/jemalloc/src/mutex.c +++ b/dep/jemalloc/src/mutex.c @@ -4,6 +4,7 @@ #include "jemalloc/internal/assert.h" #include "jemalloc/internal/malloc_io.h" +#include "jemalloc/internal/spin.h" #ifndef _CRT_SPINCOUNT #define _CRT_SPINCOUNT 4000 @@ -53,7 +54,7 @@ malloc_mutex_lock_slow(malloc_mutex_t *mutex) { int cnt = 0, max_cnt = MALLOC_MUTEX_MAX_SPIN; do { - CPU_SPINWAIT; + spin_cpu_spinwait(); if (!malloc_mutex_trylock_final(mutex)) { data->n_spin_acquired++; return; @@ -173,7 +174,7 @@ malloc_mutex_init(malloc_mutex_t *mutex, const char *name, mutex->lock_order = lock_order; if (lock_order == malloc_mutex_address_ordered) { witness_init(&mutex->witness, name, rank, - mutex_addr_comp, &mutex); + mutex_addr_comp, mutex); } else { witness_init(&mutex->witness, name, rank, NULL, NULL); } diff --git a/dep/jemalloc/src/pages.c b/dep/jemalloc/src/pages.c index fec64dd01d7..26002692d60 100644 --- a/dep/jemalloc/src/pages.c +++ b/dep/jemalloc/src/pages.c @@ -10,6 +10,9 @@ #ifdef JEMALLOC_SYSCTL_VM_OVERCOMMIT #include +#ifdef __FreeBSD__ +#include +#endif #endif /******************************************************************************/ @@ -25,6 +28,18 @@ static int mmap_flags; #endif static bool os_overcommits; +const char *thp_mode_names[] = { + "default", + "always", + "never", + "not supported" +}; +thp_mode_t opt_thp = THP_MODE_DEFAULT; +thp_mode_t init_system_thp_mode; + +/* Runtime support for lazy purge. Irrelevant when !pages_can_purge_lazy. */ +static bool pages_can_purge_lazy_runtime = true; + /******************************************************************************/ /* * Function prototypes for static functions that are referenced prior to @@ -252,12 +267,25 @@ pages_purge_lazy(void *addr, size_t size) { if (!pages_can_purge_lazy) { return true; } + if (!pages_can_purge_lazy_runtime) { + /* + * Built with lazy purge enabled, but detected it was not + * supported on the current system. + */ + return true; + } #ifdef _WIN32 VirtualAlloc(addr, size, MEM_RESET, PAGE_READWRITE); return false; #elif defined(JEMALLOC_PURGE_MADVISE_FREE) - return (madvise(addr, size, MADV_FREE) != 0); + return (madvise(addr, size, +# ifdef MADV_FREE + MADV_FREE +# else + JEMALLOC_MADV_FREE +# endif + ) != 0); #elif defined(JEMALLOC_PURGE_MADVISE_DONTNEED) && \ !defined(JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS) return (madvise(addr, size, MADV_DONTNEED) != 0); @@ -286,12 +314,13 @@ pages_purge_forced(void *addr, size_t size) { #endif } -bool -pages_huge(void *addr, size_t size) { - assert(HUGEPAGE_ADDR2BASE(addr) == addr); - assert(HUGEPAGE_CEILING(size) == size); - -#ifdef JEMALLOC_THP +static bool +pages_huge_impl(void *addr, size_t size, bool aligned) { + if (aligned) { + assert(HUGEPAGE_ADDR2BASE(addr) == addr); + assert(HUGEPAGE_CEILING(size) == size); + } +#ifdef JEMALLOC_HAVE_MADVISE_HUGE return (madvise(addr, size, MADV_HUGEPAGE) != 0); #else return true; @@ -299,23 +328,70 @@ pages_huge(void *addr, size_t size) { } bool -pages_nohuge(void *addr, size_t size) { - assert(HUGEPAGE_ADDR2BASE(addr) == addr); - assert(HUGEPAGE_CEILING(size) == size); +pages_huge(void *addr, size_t size) { + return pages_huge_impl(addr, size, true); +} -#ifdef JEMALLOC_THP +static bool +pages_huge_unaligned(void *addr, size_t size) { + return pages_huge_impl(addr, size, false); +} + +static bool +pages_nohuge_impl(void *addr, size_t size, bool aligned) { + if (aligned) { + assert(HUGEPAGE_ADDR2BASE(addr) == addr); + assert(HUGEPAGE_CEILING(size) == size); + } + +#ifdef JEMALLOC_HAVE_MADVISE_HUGE return (madvise(addr, size, MADV_NOHUGEPAGE) != 0); #else return false; #endif } +bool +pages_nohuge(void *addr, size_t size) { + return pages_nohuge_impl(addr, size, true); +} + +static bool +pages_nohuge_unaligned(void *addr, size_t size) { + return pages_nohuge_impl(addr, size, false); +} + +bool +pages_dontdump(void *addr, size_t size) { + assert(PAGE_ADDR2BASE(addr) == addr); + assert(PAGE_CEILING(size) == size); +#ifdef JEMALLOC_MADVISE_DONTDUMP + return madvise(addr, size, MADV_DONTDUMP) != 0; +#else + return false; +#endif +} + +bool +pages_dodump(void *addr, size_t size) { + assert(PAGE_ADDR2BASE(addr) == addr); + assert(PAGE_CEILING(size) == size); +#ifdef JEMALLOC_MADVISE_DONTDUMP + return madvise(addr, size, MADV_DODUMP) != 0; +#else + return false; +#endif +} + + static size_t os_page_detect(void) { #ifdef _WIN32 SYSTEM_INFO si; GetSystemInfo(&si); return si.dwPageSize; +#elif defined(__FreeBSD__) + return getpagesize(); #else long result = sysconf(_SC_PAGESIZE); if (result == -1) { @@ -332,9 +408,19 @@ os_overcommits_sysctl(void) { size_t sz; sz = sizeof(vm_overcommit); +#if defined(__FreeBSD__) && defined(VM_OVERCOMMIT) + int mib[2]; + + mib[0] = CTL_VM; + mib[1] = VM_OVERCOMMIT; + if (sysctl(mib, 2, &vm_overcommit, &sz, NULL, 0) != 0) { + return false; /* Error. */ + } +#else if (sysctlbyname("vm.overcommit", &vm_overcommit, &sz, NULL, 0) != 0) { return false; /* Error. */ } +#endif return ((vm_overcommit & 0x3) == 0); } @@ -350,27 +436,44 @@ static bool os_overcommits_proc(void) { int fd; char buf[1]; - ssize_t nread; #if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_open) - fd = (int)syscall(SYS_open, "/proc/sys/vm/overcommit_memory", O_RDONLY | - O_CLOEXEC); + #if defined(O_CLOEXEC) + fd = (int)syscall(SYS_open, "/proc/sys/vm/overcommit_memory", O_RDONLY | + O_CLOEXEC); + #else + fd = (int)syscall(SYS_open, "/proc/sys/vm/overcommit_memory", O_RDONLY); + if (fd != -1) { + fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); + } + #endif #elif defined(JEMALLOC_USE_SYSCALL) && defined(SYS_openat) - fd = (int)syscall(SYS_openat, - AT_FDCWD, "/proc/sys/vm/overcommit_memory", O_RDONLY | O_CLOEXEC); + #if defined(O_CLOEXEC) + fd = (int)syscall(SYS_openat, + AT_FDCWD, "/proc/sys/vm/overcommit_memory", O_RDONLY | O_CLOEXEC); + #else + fd = (int)syscall(SYS_openat, + AT_FDCWD, "/proc/sys/vm/overcommit_memory", O_RDONLY); + if (fd != -1) { + fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); + } + #endif #else - fd = open("/proc/sys/vm/overcommit_memory", O_RDONLY | O_CLOEXEC); + #if defined(O_CLOEXEC) + fd = open("/proc/sys/vm/overcommit_memory", O_RDONLY | O_CLOEXEC); + #else + fd = open("/proc/sys/vm/overcommit_memory", O_RDONLY); + if (fd != -1) { + fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); + } + #endif #endif + if (fd == -1) { return false; /* Error. */ } -#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_read) - nread = (ssize_t)syscall(SYS_read, fd, &buf, sizeof(buf)); -#else - nread = read(fd, &buf, sizeof(buf)); -#endif - + ssize_t nread = malloc_read_fd(fd, &buf, sizeof(buf)); #if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_close) syscall(SYS_close, fd); #else @@ -390,6 +493,71 @@ os_overcommits_proc(void) { } #endif +void +pages_set_thp_state (void *ptr, size_t size) { + if (opt_thp == thp_mode_default || opt_thp == init_system_thp_mode) { + return; + } + assert(opt_thp != thp_mode_not_supported && + init_system_thp_mode != thp_mode_not_supported); + + if (opt_thp == thp_mode_always + && init_system_thp_mode != thp_mode_never) { + assert(init_system_thp_mode == thp_mode_default); + pages_huge_unaligned(ptr, size); + } else if (opt_thp == thp_mode_never) { + assert(init_system_thp_mode == thp_mode_default || + init_system_thp_mode == thp_mode_always); + pages_nohuge_unaligned(ptr, size); + } +} + +static void +init_thp_state(void) { + if (!have_madvise_huge) { + if (metadata_thp_enabled() && opt_abort) { + malloc_write(": no MADV_HUGEPAGE support\n"); + abort(); + } + goto label_error; + } + + static const char sys_state_madvise[] = "always [madvise] never\n"; + static const char sys_state_always[] = "[always] madvise never\n"; + static const char sys_state_never[] = "always madvise [never]\n"; + char buf[sizeof(sys_state_madvise)]; + +#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_open) + int fd = (int)syscall(SYS_open, + "/sys/kernel/mm/transparent_hugepage/enabled", O_RDONLY); +#else + int fd = open("/sys/kernel/mm/transparent_hugepage/enabled", O_RDONLY); +#endif + if (fd == -1) { + goto label_error; + } + + ssize_t nread = malloc_read_fd(fd, &buf, sizeof(buf)); +#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_close) + syscall(SYS_close, fd); +#else + close(fd); +#endif + + if (strncmp(buf, sys_state_madvise, (size_t)nread) == 0) { + init_system_thp_mode = thp_mode_default; + } else if (strncmp(buf, sys_state_always, (size_t)nread) == 0) { + init_system_thp_mode = thp_mode_always; + } else if (strncmp(buf, sys_state_never, (size_t)nread) == 0) { + init_system_thp_mode = thp_mode_never; + } else { + goto label_error; + } + return; +label_error: + opt_thp = init_system_thp_mode = thp_mode_not_supported; +} + bool pages_boot(void) { os_page = os_page_detect(); @@ -418,5 +586,21 @@ pages_boot(void) { os_overcommits = false; #endif + init_thp_state(); + + /* Detect lazy purge runtime support. */ + if (pages_can_purge_lazy) { + bool committed = false; + void *madv_free_page = os_pages_map(NULL, PAGE, PAGE, &committed); + if (madv_free_page == NULL) { + return true; + } + assert(pages_can_purge_lazy_runtime); + if (pages_purge_lazy(madv_free_page, PAGE)) { + pages_can_purge_lazy_runtime = false; + } + os_pages_unmap(madv_free_page, PAGE); + } + return false; } diff --git a/dep/jemalloc/src/prof.c b/dep/jemalloc/src/prof.c index 975722c4c38..13df641a030 100644 --- a/dep/jemalloc/src/prof.c +++ b/dep/jemalloc/src/prof.c @@ -978,7 +978,7 @@ prof_dump_flush(bool propagate_err) { cassert(config_prof); - err = write(prof_dump_fd, prof_dump_buf, prof_dump_buf_end); + err = malloc_write_fd(prof_dump_fd, prof_dump_buf, prof_dump_buf_end); if (err == -1) { if (!propagate_err) { malloc_write(": write() failed during heap " @@ -1409,7 +1409,15 @@ prof_open_maps(const char *format, ...) { va_start(ap, format); malloc_vsnprintf(filename, sizeof(filename), format, ap); va_end(ap); + +#if defined(O_CLOEXEC) mfd = open(filename, O_RDONLY | O_CLOEXEC); +#else + mfd = open(filename, O_RDONLY); + if (mfd != -1) { + fcntl(mfd, F_SETFD, fcntl(mfd, F_GETFD) | FD_CLOEXEC); + } +#endif return mfd; } @@ -1463,8 +1471,9 @@ prof_dump_maps(bool propagate_err) { goto label_return; } } - nread = read(mfd, &prof_dump_buf[prof_dump_buf_end], - PROF_DUMP_BUFSIZE - prof_dump_buf_end); + nread = malloc_read_fd(mfd, + &prof_dump_buf[prof_dump_buf_end], PROF_DUMP_BUFSIZE + - prof_dump_buf_end); } while (nread > 0); } else { ret = true; @@ -1772,7 +1781,7 @@ prof_idump(tsdn_t *tsdn) { cassert(config_prof); - if (!prof_booted || tsdn_null(tsdn)) { + if (!prof_booted || tsdn_null(tsdn) || !prof_active_get_unlocked()) { return; } tsd = tsdn_tsd(tsdn); @@ -1829,7 +1838,7 @@ prof_gdump(tsdn_t *tsdn) { cassert(config_prof); - if (!prof_booted || tsdn_null(tsdn)) { + if (!prof_booted || tsdn_null(tsdn) || !prof_active_get_unlocked()) { return; } tsd = tsdn_tsd(tsdn); diff --git a/dep/jemalloc/src/spin.c b/dep/jemalloc/src/spin.c deleted file mode 100644 index 24372c26c94..00000000000 --- a/dep/jemalloc/src/spin.c +++ /dev/null @@ -1,4 +0,0 @@ -#define JEMALLOC_SPIN_C_ -#include "jemalloc/internal/jemalloc_preamble.h" - -#include "jemalloc/internal/spin.h" diff --git a/dep/jemalloc/src/stats.c b/dep/jemalloc/src/stats.c index 087df7676e9..08b9507cfe9 100644 --- a/dep/jemalloc/src/stats.c +++ b/dep/jemalloc/src/stats.c @@ -4,6 +4,7 @@ #include "jemalloc/internal/assert.h" #include "jemalloc/internal/ctl.h" +#include "jemalloc/internal/emitter.h" #include "jemalloc/internal/mutex.h" #include "jemalloc/internal/mutex_prof.h" @@ -84,41 +85,138 @@ gen_mutex_ctl_str(char *str, size_t buf_len, const char *prefix, } static void -read_arena_bin_mutex_stats(unsigned arena_ind, unsigned bin_ind, - uint64_t results[mutex_prof_num_counters]) { +mutex_stats_init_cols(emitter_row_t *row, const char *table_name, + emitter_col_t *name, + emitter_col_t col_uint64_t[mutex_prof_num_uint64_t_counters], + emitter_col_t col_uint32_t[mutex_prof_num_uint32_t_counters]) { + mutex_prof_uint64_t_counter_ind_t k_uint64_t = 0; + mutex_prof_uint32_t_counter_ind_t k_uint32_t = 0; + + emitter_col_t *col; + + if (name != NULL) { + emitter_col_init(name, row); + name->justify = emitter_justify_left; + name->width = 21; + name->type = emitter_type_title; + name->str_val = table_name; + } + +#define WIDTH_uint32_t 12 +#define WIDTH_uint64_t 16 +#define OP(counter, counter_type, human) \ + col = &col_##counter_type[k_##counter_type]; \ + ++k_##counter_type; \ + emitter_col_init(col, row); \ + col->justify = emitter_justify_right; \ + col->width = WIDTH_##counter_type; \ + col->type = emitter_type_title; \ + col->str_val = human; + MUTEX_PROF_COUNTERS +#undef OP +#undef WIDTH_uint32_t +#undef WIDTH_uint64_t +} + +static void +mutex_stats_read_global(const char *name, emitter_col_t *col_name, + emitter_col_t col_uint64_t[mutex_prof_num_uint64_t_counters], + emitter_col_t col_uint32_t[mutex_prof_num_uint32_t_counters]) { char cmd[MUTEX_CTL_STR_MAX_LENGTH]; -#define OP(c, t) \ - gen_mutex_ctl_str(cmd, MUTEX_CTL_STR_MAX_LENGTH, \ - "arenas.0.bins.0","mutex", #c); \ - CTL_M2_M4_GET(cmd, arena_ind, bin_ind, \ - (t *)&results[mutex_counter_##c], t); -MUTEX_PROF_COUNTERS + + col_name->str_val = name; + + emitter_col_t *dst; +#define EMITTER_TYPE_uint32_t emitter_type_uint32 +#define EMITTER_TYPE_uint64_t emitter_type_uint64 +#define OP(counter, counter_type, human) \ + dst = &col_##counter_type[mutex_counter_##counter]; \ + dst->type = EMITTER_TYPE_##counter_type; \ + gen_mutex_ctl_str(cmd, MUTEX_CTL_STR_MAX_LENGTH, \ + "mutexes", name, #counter); \ + CTL_GET(cmd, (counter_type *)&dst->bool_val, counter_type); + MUTEX_PROF_COUNTERS #undef OP +#undef EMITTER_TYPE_uint32_t +#undef EMITTER_TYPE_uint64_t } static void -mutex_stats_output_json(void (*write_cb)(void *, const char *), void *cbopaque, - const char *name, uint64_t stats[mutex_prof_num_counters], - const char *json_indent, bool last) { - malloc_cprintf(write_cb, cbopaque, "%s\"%s\": {\n", json_indent, name); +mutex_stats_read_arena(unsigned arena_ind, mutex_prof_arena_ind_t mutex_ind, + const char *name, emitter_col_t *col_name, + emitter_col_t col_uint64_t[mutex_prof_num_uint64_t_counters], + emitter_col_t col_uint32_t[mutex_prof_num_uint32_t_counters]) { + char cmd[MUTEX_CTL_STR_MAX_LENGTH]; - mutex_prof_counter_ind_t k = 0; - char *fmt_str[2] = {"%s\t\"%s\": %"FMTu32"%s\n", - "%s\t\"%s\": %"FMTu64"%s\n"}; -#define OP(c, t) \ - malloc_cprintf(write_cb, cbopaque, \ - fmt_str[sizeof(t) / sizeof(uint32_t) - 1], \ - json_indent, #c, (t)stats[mutex_counter_##c], \ - (++k == mutex_prof_num_counters) ? "" : ","); -MUTEX_PROF_COUNTERS + col_name->str_val = name; + + emitter_col_t *dst; +#define EMITTER_TYPE_uint32_t emitter_type_uint32 +#define EMITTER_TYPE_uint64_t emitter_type_uint64 +#define OP(counter, counter_type, human) \ + dst = &col_##counter_type[mutex_counter_##counter]; \ + dst->type = EMITTER_TYPE_##counter_type; \ + gen_mutex_ctl_str(cmd, MUTEX_CTL_STR_MAX_LENGTH, \ + "arenas.0.mutexes", arena_mutex_names[mutex_ind], #counter);\ + CTL_M2_GET(cmd, arena_ind, \ + (counter_type *)&dst->bool_val, counter_type); + MUTEX_PROF_COUNTERS #undef OP - malloc_cprintf(write_cb, cbopaque, "%s}%s\n", json_indent, - last ? "" : ","); +#undef EMITTER_TYPE_uint32_t +#undef EMITTER_TYPE_uint64_t } static void -stats_arena_bins_print(void (*write_cb)(void *, const char *), void *cbopaque, - bool json, bool large, bool mutex, unsigned i) { +mutex_stats_read_arena_bin(unsigned arena_ind, unsigned bin_ind, + emitter_col_t col_uint64_t[mutex_prof_num_uint64_t_counters], + emitter_col_t col_uint32_t[mutex_prof_num_uint32_t_counters]) { + char cmd[MUTEX_CTL_STR_MAX_LENGTH]; + emitter_col_t *dst; + +#define EMITTER_TYPE_uint32_t emitter_type_uint32 +#define EMITTER_TYPE_uint64_t emitter_type_uint64 +#define OP(counter, counter_type, human) \ + dst = &col_##counter_type[mutex_counter_##counter]; \ + dst->type = EMITTER_TYPE_##counter_type; \ + gen_mutex_ctl_str(cmd, MUTEX_CTL_STR_MAX_LENGTH, \ + "arenas.0.bins.0","mutex", #counter); \ + CTL_M2_M4_GET(cmd, arena_ind, bin_ind, \ + (counter_type *)&dst->bool_val, counter_type); + MUTEX_PROF_COUNTERS +#undef OP +#undef EMITTER_TYPE_uint32_t +#undef EMITTER_TYPE_uint64_t +} + +/* "row" can be NULL to avoid emitting in table mode. */ +static void +mutex_stats_emit(emitter_t *emitter, emitter_row_t *row, + emitter_col_t col_uint64_t[mutex_prof_num_uint64_t_counters], + emitter_col_t col_uint32_t[mutex_prof_num_uint32_t_counters]) { + if (row != NULL) { + emitter_table_row(emitter, row); + } + + mutex_prof_uint64_t_counter_ind_t k_uint64_t = 0; + mutex_prof_uint32_t_counter_ind_t k_uint32_t = 0; + + emitter_col_t *col; + +#define EMITTER_TYPE_uint32_t emitter_type_uint32 +#define EMITTER_TYPE_uint64_t emitter_type_uint64 +#define OP(counter, type, human) \ + col = &col_##type[k_##type]; \ + ++k_##type; \ + emitter_json_kv(emitter, #counter, EMITTER_TYPE_##type, \ + (const void *)&col->bool_val); + MUTEX_PROF_COUNTERS; +#undef OP +#undef EMITTER_TYPE_uint32_t +#undef EMITTER_TYPE_uint64_t +} + +static void +stats_arena_bins_print(emitter_t *emitter, bool mutex, unsigned i) { size_t page; bool in_gap, in_gap_prev; unsigned nbins, j; @@ -126,18 +224,71 @@ stats_arena_bins_print(void (*write_cb)(void *, const char *), void *cbopaque, CTL_GET("arenas.page", &page, size_t); CTL_GET("arenas.nbins", &nbins, unsigned); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"bins\": [\n"); - } else { - char *mutex_counters = " n_lock_ops n_waiting" - " n_spin_acq total_wait_ns max_wait_ns\n"; - malloc_cprintf(write_cb, cbopaque, - "bins: size ind allocated nmalloc" - " ndalloc nrequests curregs curslabs regs" - " pgs util nfills nflushes newslabs" - " reslabs%s", mutex ? mutex_counters : "\n"); + + emitter_row_t header_row; + emitter_row_init(&header_row); + + emitter_row_t row; + emitter_row_init(&row); +#define COL(name, left_or_right, col_width, etype) \ + emitter_col_t col_##name; \ + emitter_col_init(&col_##name, &row); \ + col_##name.justify = emitter_justify_##left_or_right; \ + col_##name.width = col_width; \ + col_##name.type = emitter_type_##etype; \ + emitter_col_t header_col_##name; \ + emitter_col_init(&header_col_##name, &header_row); \ + header_col_##name.justify = emitter_justify_##left_or_right; \ + header_col_##name.width = col_width; \ + header_col_##name.type = emitter_type_title; \ + header_col_##name.str_val = #name; + + COL(size, right, 20, size) + COL(ind, right, 4, unsigned) + COL(allocated, right, 13, uint64) + COL(nmalloc, right, 13, uint64) + COL(ndalloc, right, 13, uint64) + COL(nrequests, right, 13, uint64) + COL(curregs, right, 13, size) + COL(curslabs, right, 13, size) + COL(regs, right, 5, unsigned) + COL(pgs, right, 4, size) + /* To buffer a right- and left-justified column. */ + COL(justify_spacer, right, 1, title) + COL(util, right, 6, title) + COL(nfills, right, 13, uint64) + COL(nflushes, right, 13, uint64) + COL(nslabs, right, 13, uint64) + COL(nreslabs, right, 13, uint64) +#undef COL + + /* Don't want to actually print the name. */ + header_col_justify_spacer.str_val = " "; + col_justify_spacer.str_val = " "; + + + emitter_col_t col_mutex64[mutex_prof_num_uint64_t_counters]; + emitter_col_t col_mutex32[mutex_prof_num_uint32_t_counters]; + + emitter_col_t header_mutex64[mutex_prof_num_uint64_t_counters]; + emitter_col_t header_mutex32[mutex_prof_num_uint32_t_counters]; + + if (mutex) { + mutex_stats_init_cols(&row, NULL, NULL, col_mutex64, + col_mutex32); + mutex_stats_init_cols(&header_row, NULL, NULL, header_mutex64, + header_mutex32); } + + /* + * We print a "bins:" header as part of the table row; we need to adjust + * the header size column to compensate. + */ + header_col_size.width -=5; + emitter_table_printf(emitter, "bins:"); + emitter_table_row(emitter, &header_row); + emitter_json_arr_begin(emitter, "bins"); + for (j = 0, in_gap = false; j < nbins; j++) { uint64_t nslabs; size_t reg_size, slab_size, curregs; @@ -151,8 +302,8 @@ stats_arena_bins_print(void (*write_cb)(void *, const char *), void *cbopaque, in_gap_prev = in_gap; in_gap = (nslabs == 0); - if (!json && in_gap_prev && !in_gap) { - malloc_cprintf(write_cb, cbopaque, + if (in_gap_prev && !in_gap) { + emitter_table_printf(emitter, " ---\n"); } @@ -177,105 +328,127 @@ stats_arena_bins_print(void (*write_cb)(void *, const char *), void *cbopaque, CTL_M2_M4_GET("stats.arenas.0.bins.0.curslabs", i, j, &curslabs, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t{\n" - "\t\t\t\t\t\t\"nmalloc\": %"FMTu64",\n" - "\t\t\t\t\t\t\"ndalloc\": %"FMTu64",\n" - "\t\t\t\t\t\t\"curregs\": %zu,\n" - "\t\t\t\t\t\t\"nrequests\": %"FMTu64",\n" - "\t\t\t\t\t\t\"nfills\": %"FMTu64",\n" - "\t\t\t\t\t\t\"nflushes\": %"FMTu64",\n" - "\t\t\t\t\t\t\"nreslabs\": %"FMTu64",\n" - "\t\t\t\t\t\t\"curslabs\": %zu%s\n", - nmalloc, ndalloc, curregs, nrequests, nfills, - nflushes, nreslabs, curslabs, mutex ? "," : ""); - if (mutex) { - uint64_t mutex_stats[mutex_prof_num_counters]; - read_arena_bin_mutex_stats(i, j, mutex_stats); - mutex_stats_output_json(write_cb, cbopaque, - "mutex", mutex_stats, "\t\t\t\t\t\t", true); - } - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t}%s\n", - (j + 1 < nbins) ? "," : ""); - } else if (!in_gap) { - size_t availregs = nregs * curslabs; - char util[6]; - if (get_rate_str((uint64_t)curregs, (uint64_t)availregs, - util)) { - if (availregs == 0) { - malloc_snprintf(util, sizeof(util), - "1"); - } else if (curregs > availregs) { - /* - * Race detected: the counters were read - * in separate mallctl calls and - * concurrent operations happened in - * between. In this case no meaningful - * utilization can be computed. - */ - malloc_snprintf(util, sizeof(util), - " race"); - } else { - not_reached(); - } - } - uint64_t mutex_stats[mutex_prof_num_counters]; - if (mutex) { - read_arena_bin_mutex_stats(i, j, mutex_stats); - } + if (mutex) { + mutex_stats_read_arena_bin(i, j, col_mutex64, + col_mutex32); + } - malloc_cprintf(write_cb, cbopaque, "%20zu %3u %12zu %12" - FMTu64" %12"FMTu64" %12"FMTu64" %12zu %12zu %4u" - " %3zu %-5s %12"FMTu64" %12"FMTu64" %12"FMTu64 - " %12"FMTu64, reg_size, j, curregs * reg_size, - nmalloc, ndalloc, nrequests, curregs, curslabs, - nregs, slab_size / page, util, nfills, nflushes, - nslabs, nreslabs); + emitter_json_arr_obj_begin(emitter); + emitter_json_kv(emitter, "nmalloc", emitter_type_uint64, + &nmalloc); + emitter_json_kv(emitter, "ndalloc", emitter_type_uint64, + &ndalloc); + emitter_json_kv(emitter, "curregs", emitter_type_size, + &curregs); + emitter_json_kv(emitter, "nrequests", emitter_type_uint64, + &nrequests); + emitter_json_kv(emitter, "nfills", emitter_type_uint64, + &nfills); + emitter_json_kv(emitter, "nflushes", emitter_type_uint64, + &nflushes); + emitter_json_kv(emitter, "nreslabs", emitter_type_uint64, + &nreslabs); + emitter_json_kv(emitter, "curslabs", emitter_type_size, + &curslabs); + if (mutex) { + emitter_json_dict_begin(emitter, "mutex"); + mutex_stats_emit(emitter, NULL, col_mutex64, + col_mutex32); + emitter_json_dict_end(emitter); + } + emitter_json_arr_obj_end(emitter); - /* Output less info for bin mutexes to save space. */ - if (mutex) { - malloc_cprintf(write_cb, cbopaque, - " %12"FMTu64" %12"FMTu64" %12"FMTu64 - " %14"FMTu64" %12"FMTu64"\n", - mutex_stats[mutex_counter_num_ops], - mutex_stats[mutex_counter_num_wait], - mutex_stats[mutex_counter_num_spin_acq], - mutex_stats[mutex_counter_total_wait_time], - mutex_stats[mutex_counter_max_wait_time]); + size_t availregs = nregs * curslabs; + char util[6]; + if (get_rate_str((uint64_t)curregs, (uint64_t)availregs, util)) + { + if (availregs == 0) { + malloc_snprintf(util, sizeof(util), "1"); + } else if (curregs > availregs) { + /* + * Race detected: the counters were read in + * separate mallctl calls and concurrent + * operations happened in between. In this case + * no meaningful utilization can be computed. + */ + malloc_snprintf(util, sizeof(util), " race"); } else { - malloc_cprintf(write_cb, cbopaque, "\n"); + not_reached(); } } + + col_size.size_val = reg_size; + col_ind.unsigned_val = j; + col_allocated.size_val = curregs * reg_size; + col_nmalloc.uint64_val = nmalloc; + col_ndalloc.uint64_val = ndalloc; + col_nrequests.uint64_val = nrequests; + col_curregs.size_val = curregs; + col_curslabs.size_val = curslabs; + col_regs.unsigned_val = nregs; + col_pgs.size_val = slab_size / page; + col_util.str_val = util; + col_nfills.uint64_val = nfills; + col_nflushes.uint64_val = nflushes; + col_nslabs.uint64_val = nslabs; + col_nreslabs.uint64_val = nreslabs; + + /* + * Note that mutex columns were initialized above, if mutex == + * true. + */ + + emitter_table_row(emitter, &row); } - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t]%s\n", large ? "," : ""); - } else { - if (in_gap) { - malloc_cprintf(write_cb, cbopaque, - " ---\n"); - } + emitter_json_arr_end(emitter); /* Close "bins". */ + + if (in_gap) { + emitter_table_printf(emitter, " ---\n"); } } static void -stats_arena_lextents_print(void (*write_cb)(void *, const char *), - void *cbopaque, bool json, unsigned i) { +stats_arena_lextents_print(emitter_t *emitter, unsigned i) { unsigned nbins, nlextents, j; bool in_gap, in_gap_prev; CTL_GET("arenas.nbins", &nbins, unsigned); CTL_GET("arenas.nlextents", &nlextents, unsigned); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"lextents\": [\n"); - } else { - malloc_cprintf(write_cb, cbopaque, - "large: size ind allocated nmalloc" - " ndalloc nrequests curlextents\n"); - } + + emitter_row_t header_row; + emitter_row_init(&header_row); + emitter_row_t row; + emitter_row_init(&row); + +#define COL(name, left_or_right, col_width, etype) \ + emitter_col_t header_##name; \ + emitter_col_init(&header_##name, &header_row); \ + header_##name.justify = emitter_justify_##left_or_right; \ + header_##name.width = col_width; \ + header_##name.type = emitter_type_title; \ + header_##name.str_val = #name; \ + \ + emitter_col_t col_##name; \ + emitter_col_init(&col_##name, &row); \ + col_##name.justify = emitter_justify_##left_or_right; \ + col_##name.width = col_width; \ + col_##name.type = emitter_type_##etype; + + COL(size, right, 20, size) + COL(ind, right, 4, unsigned) + COL(allocated, right, 13, size) + COL(nmalloc, right, 13, uint64) + COL(ndalloc, right, 13, uint64) + COL(nrequests, right, 13, uint64) + COL(curlextents, right, 13, size) +#undef COL + + /* As with bins, we label the large extents table. */ + header_size.width -= 6; + emitter_table_printf(emitter, "large:"); + emitter_table_row(emitter, &header_row); + emitter_json_arr_begin(emitter, "lextents"); + for (j = 0, in_gap = false; j < nlextents; j++) { uint64_t nmalloc, ndalloc, nrequests; size_t lextent_size, curlextents; @@ -289,119 +462,71 @@ stats_arena_lextents_print(void (*write_cb)(void *, const char *), in_gap_prev = in_gap; in_gap = (nrequests == 0); - if (!json && in_gap_prev && !in_gap) { - malloc_cprintf(write_cb, cbopaque, + if (in_gap_prev && !in_gap) { + emitter_table_printf(emitter, " ---\n"); } CTL_M2_GET("arenas.lextent.0.size", j, &lextent_size, size_t); CTL_M2_M4_GET("stats.arenas.0.lextents.0.curlextents", i, j, &curlextents, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t{\n" - "\t\t\t\t\t\t\"curlextents\": %zu\n" - "\t\t\t\t\t}%s\n", - curlextents, - (j + 1 < nlextents) ? "," : ""); - } else if (!in_gap) { - malloc_cprintf(write_cb, cbopaque, - "%20zu %3u %12zu %12"FMTu64" %12"FMTu64 - " %12"FMTu64" %12zu\n", - lextent_size, nbins + j, - curlextents * lextent_size, nmalloc, ndalloc, - nrequests, curlextents); + + emitter_json_arr_obj_begin(emitter); + emitter_json_kv(emitter, "curlextents", emitter_type_size, + &curlextents); + emitter_json_arr_obj_end(emitter); + + col_size.size_val = lextent_size; + col_ind.unsigned_val = nbins + j; + col_allocated.size_val = curlextents * lextent_size; + col_nmalloc.uint64_val = nmalloc; + col_ndalloc.uint64_val = ndalloc; + col_nrequests.uint64_val = nrequests; + col_curlextents.size_val = curlextents; + + if (!in_gap) { + emitter_table_row(emitter, &row); } } - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t]\n"); - } else { - if (in_gap) { - malloc_cprintf(write_cb, cbopaque, - " ---\n"); - } + emitter_json_arr_end(emitter); /* Close "lextents". */ + if (in_gap) { + emitter_table_printf(emitter, " ---\n"); } } static void -read_arena_mutex_stats(unsigned arena_ind, - uint64_t results[mutex_prof_num_arena_mutexes][mutex_prof_num_counters]) { - char cmd[MUTEX_CTL_STR_MAX_LENGTH]; +stats_arena_mutexes_print(emitter_t *emitter, unsigned arena_ind) { + emitter_row_t row; + emitter_col_t col_name; + emitter_col_t col64[mutex_prof_num_uint64_t_counters]; + emitter_col_t col32[mutex_prof_num_uint32_t_counters]; - mutex_prof_arena_ind_t i; - for (i = 0; i < mutex_prof_num_arena_mutexes; i++) { -#define OP(c, t) \ - gen_mutex_ctl_str(cmd, MUTEX_CTL_STR_MAX_LENGTH, \ - "arenas.0.mutexes", arena_mutex_names[i], #c); \ - CTL_M2_GET(cmd, arena_ind, \ - (t *)&results[i][mutex_counter_##c], t); -MUTEX_PROF_COUNTERS -#undef OP + emitter_row_init(&row); + mutex_stats_init_cols(&row, "", &col_name, col64, col32); + + emitter_json_dict_begin(emitter, "mutexes"); + emitter_table_row(emitter, &row); + + for (mutex_prof_arena_ind_t i = 0; i < mutex_prof_num_arena_mutexes; + i++) { + const char *name = arena_mutex_names[i]; + emitter_json_dict_begin(emitter, name); + mutex_stats_read_arena(arena_ind, i, name, &col_name, col64, + col32); + mutex_stats_emit(emitter, &row, col64, col32); + emitter_json_dict_end(emitter); /* Close the mutex dict. */ } + emitter_json_dict_end(emitter); /* End "mutexes". */ } static void -mutex_stats_output(void (*write_cb)(void *, const char *), void *cbopaque, - const char *name, uint64_t stats[mutex_prof_num_counters], - bool first_mutex) { - if (first_mutex) { - /* Print title. */ - malloc_cprintf(write_cb, cbopaque, - " n_lock_ops n_waiting" - " n_spin_acq n_owner_switch total_wait_ns" - " max_wait_ns max_n_thds\n"); - } - - malloc_cprintf(write_cb, cbopaque, "%s", name); - malloc_cprintf(write_cb, cbopaque, ":%*c", - (int)(20 - strlen(name)), ' '); - - char *fmt_str[2] = {"%12"FMTu32, "%16"FMTu64}; -#define OP(c, t) \ - malloc_cprintf(write_cb, cbopaque, \ - fmt_str[sizeof(t) / sizeof(uint32_t) - 1], \ - (t)stats[mutex_counter_##c]); -MUTEX_PROF_COUNTERS -#undef OP - malloc_cprintf(write_cb, cbopaque, "\n"); -} - -static void -stats_arena_mutexes_print(void (*write_cb)(void *, const char *), - void *cbopaque, bool json, bool json_end, unsigned arena_ind) { - uint64_t mutex_stats[mutex_prof_num_arena_mutexes][mutex_prof_num_counters]; - read_arena_mutex_stats(arena_ind, mutex_stats); - - /* Output mutex stats. */ - if (json) { - malloc_cprintf(write_cb, cbopaque, "\t\t\t\t\"mutexes\": {\n"); - mutex_prof_arena_ind_t i, last_mutex; - last_mutex = mutex_prof_num_arena_mutexes - 1; - for (i = 0; i < mutex_prof_num_arena_mutexes; i++) { - mutex_stats_output_json(write_cb, cbopaque, - arena_mutex_names[i], mutex_stats[i], - "\t\t\t\t\t", (i == last_mutex)); - } - malloc_cprintf(write_cb, cbopaque, "\t\t\t\t}%s\n", - json_end ? "" : ","); - } else { - mutex_prof_arena_ind_t i; - for (i = 0; i < mutex_prof_num_arena_mutexes; i++) { - mutex_stats_output(write_cb, cbopaque, - arena_mutex_names[i], mutex_stats[i], i == 0); - } - } -} - -static void -stats_arena_print(void (*write_cb)(void *, const char *), void *cbopaque, - bool json, unsigned i, bool bins, bool large, bool mutex) { +stats_arena_print(emitter_t *emitter, unsigned i, bool bins, bool large, + bool mutex) { unsigned nthreads; const char *dss; ssize_t dirty_decay_ms, muzzy_decay_ms; size_t page, pactive, pdirty, pmuzzy, mapped, retained; - size_t base, internal, resident; + size_t base, internal, resident, metadata_thp; uint64_t dirty_npurge, dirty_nmadvise, dirty_purged; uint64_t muzzy_npurge, muzzy_nmadvise, muzzy_purged; size_t small_allocated; @@ -414,31 +539,16 @@ stats_arena_print(void (*write_cb)(void *, const char *), void *cbopaque, CTL_GET("arenas.page", &page, size_t); CTL_M2_GET("stats.arenas.0.nthreads", i, &nthreads, unsigned); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"nthreads\": %u,\n", nthreads); - } else { - malloc_cprintf(write_cb, cbopaque, - "assigned threads: %u\n", nthreads); - } + emitter_kv(emitter, "nthreads", "assigned threads", + emitter_type_unsigned, &nthreads); CTL_M2_GET("stats.arenas.0.uptime", i, &uptime, uint64_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"uptime_ns\": %"FMTu64",\n", uptime); - } else { - malloc_cprintf(write_cb, cbopaque, - "uptime: %"FMTu64"\n", uptime); - } + emitter_kv(emitter, "uptime_ns", "uptime", emitter_type_uint64, + &uptime); CTL_M2_GET("stats.arenas.0.dss", i, &dss, const char *); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"dss\": \"%s\",\n", dss); - } else { - malloc_cprintf(write_cb, cbopaque, - "dss allocation precedence: %s\n", dss); - } + emitter_kv(emitter, "dss", "dss allocation precedence", + emitter_type_string, &dss); CTL_M2_GET("stats.arenas.0.dirty_decay_ms", i, &dirty_decay_ms, ssize_t); @@ -455,205 +565,271 @@ stats_arena_print(void (*write_cb)(void *, const char *), void *cbopaque, CTL_M2_GET("stats.arenas.0.muzzy_nmadvise", i, &muzzy_nmadvise, uint64_t); CTL_M2_GET("stats.arenas.0.muzzy_purged", i, &muzzy_purged, uint64_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"dirty_decay_ms\": %zd,\n", dirty_decay_ms); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"muzzy_decay_ms\": %zd,\n", muzzy_decay_ms); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"pactive\": %zu,\n", pactive); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"pdirty\": %zu,\n", pdirty); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"pmuzzy\": %zu,\n", pmuzzy); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"dirty_npurge\": %"FMTu64",\n", dirty_npurge); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"dirty_nmadvise\": %"FMTu64",\n", dirty_nmadvise); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"dirty_purged\": %"FMTu64",\n", dirty_purged); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"muzzy_npurge\": %"FMTu64",\n", muzzy_npurge); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"muzzy_nmadvise\": %"FMTu64",\n", muzzy_nmadvise); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"muzzy_purged\": %"FMTu64",\n", muzzy_purged); + + emitter_row_t decay_row; + emitter_row_init(&decay_row); + + /* JSON-style emission. */ + emitter_json_kv(emitter, "dirty_decay_ms", emitter_type_ssize, + &dirty_decay_ms); + emitter_json_kv(emitter, "muzzy_decay_ms", emitter_type_ssize, + &muzzy_decay_ms); + + emitter_json_kv(emitter, "pactive", emitter_type_size, &pactive); + emitter_json_kv(emitter, "pdirty", emitter_type_size, &pdirty); + emitter_json_kv(emitter, "pmuzzy", emitter_type_size, &pmuzzy); + + emitter_json_kv(emitter, "dirty_npurge", emitter_type_uint64, + &dirty_npurge); + emitter_json_kv(emitter, "dirty_nmadvise", emitter_type_uint64, + &dirty_nmadvise); + emitter_json_kv(emitter, "dirty_purged", emitter_type_uint64, + &dirty_purged); + + emitter_json_kv(emitter, "muzzy_npurge", emitter_type_uint64, + &muzzy_npurge); + emitter_json_kv(emitter, "muzzy_nmadvise", emitter_type_uint64, + &muzzy_nmadvise); + emitter_json_kv(emitter, "muzzy_purged", emitter_type_uint64, + &muzzy_purged); + + /* Table-style emission. */ + emitter_col_t decay_type; + emitter_col_init(&decay_type, &decay_row); + decay_type.justify = emitter_justify_right; + decay_type.width = 9; + decay_type.type = emitter_type_title; + decay_type.str_val = "decaying:"; + + emitter_col_t decay_time; + emitter_col_init(&decay_time, &decay_row); + decay_time.justify = emitter_justify_right; + decay_time.width = 6; + decay_time.type = emitter_type_title; + decay_time.str_val = "time"; + + emitter_col_t decay_npages; + emitter_col_init(&decay_npages, &decay_row); + decay_npages.justify = emitter_justify_right; + decay_npages.width = 13; + decay_npages.type = emitter_type_title; + decay_npages.str_val = "npages"; + + emitter_col_t decay_sweeps; + emitter_col_init(&decay_sweeps, &decay_row); + decay_sweeps.justify = emitter_justify_right; + decay_sweeps.width = 13; + decay_sweeps.type = emitter_type_title; + decay_sweeps.str_val = "sweeps"; + + emitter_col_t decay_madvises; + emitter_col_init(&decay_madvises, &decay_row); + decay_madvises.justify = emitter_justify_right; + decay_madvises.width = 13; + decay_madvises.type = emitter_type_title; + decay_madvises.str_val = "madvises"; + + emitter_col_t decay_purged; + emitter_col_init(&decay_purged, &decay_row); + decay_purged.justify = emitter_justify_right; + decay_purged.width = 13; + decay_purged.type = emitter_type_title; + decay_purged.str_val = "purged"; + + /* Title row. */ + emitter_table_row(emitter, &decay_row); + + /* Dirty row. */ + decay_type.str_val = "dirty:"; + + if (dirty_decay_ms >= 0) { + decay_time.type = emitter_type_ssize; + decay_time.ssize_val = dirty_decay_ms; } else { - malloc_cprintf(write_cb, cbopaque, - "decaying: time npages sweeps madvises" - " purged\n"); - if (dirty_decay_ms >= 0) { - malloc_cprintf(write_cb, cbopaque, - " dirty: %5zd %12zu %12"FMTu64" %12"FMTu64" %12" - FMTu64"\n", dirty_decay_ms, pdirty, dirty_npurge, - dirty_nmadvise, dirty_purged); - } else { - malloc_cprintf(write_cb, cbopaque, - " dirty: N/A %12zu %12"FMTu64" %12"FMTu64" %12" - FMTu64"\n", pdirty, dirty_npurge, dirty_nmadvise, - dirty_purged); - } - if (muzzy_decay_ms >= 0) { - malloc_cprintf(write_cb, cbopaque, - " muzzy: %5zd %12zu %12"FMTu64" %12"FMTu64" %12" - FMTu64"\n", muzzy_decay_ms, pmuzzy, muzzy_npurge, - muzzy_nmadvise, muzzy_purged); - } else { - malloc_cprintf(write_cb, cbopaque, - " muzzy: N/A %12zu %12"FMTu64" %12"FMTu64" %12" - FMTu64"\n", pmuzzy, muzzy_npurge, muzzy_nmadvise, - muzzy_purged); - } + decay_time.type = emitter_type_title; + decay_time.str_val = "N/A"; } - CTL_M2_GET("stats.arenas.0.small.allocated", i, &small_allocated, - size_t); - CTL_M2_GET("stats.arenas.0.small.nmalloc", i, &small_nmalloc, uint64_t); - CTL_M2_GET("stats.arenas.0.small.ndalloc", i, &small_ndalloc, uint64_t); - CTL_M2_GET("stats.arenas.0.small.nrequests", i, &small_nrequests, - uint64_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"small\": {\n"); + decay_npages.type = emitter_type_size; + decay_npages.size_val = pdirty; - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"allocated\": %zu,\n", small_allocated); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"nmalloc\": %"FMTu64",\n", small_nmalloc); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"ndalloc\": %"FMTu64",\n", small_ndalloc); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"nrequests\": %"FMTu64"\n", small_nrequests); + decay_sweeps.type = emitter_type_uint64; + decay_sweeps.uint64_val = dirty_npurge; - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t},\n"); + decay_madvises.type = emitter_type_uint64; + decay_madvises.uint64_val = dirty_nmadvise; + + decay_purged.type = emitter_type_uint64; + decay_purged.uint64_val = dirty_purged; + + emitter_table_row(emitter, &decay_row); + + /* Muzzy row. */ + decay_type.str_val = "muzzy:"; + + if (muzzy_decay_ms >= 0) { + decay_time.type = emitter_type_ssize; + decay_time.ssize_val = muzzy_decay_ms; } else { - malloc_cprintf(write_cb, cbopaque, - " allocated nmalloc" - " ndalloc nrequests\n"); - malloc_cprintf(write_cb, cbopaque, - "small: %12zu %12"FMTu64" %12"FMTu64 - " %12"FMTu64"\n", - small_allocated, small_nmalloc, small_ndalloc, - small_nrequests); + decay_time.type = emitter_type_title; + decay_time.str_val = "N/A"; } - CTL_M2_GET("stats.arenas.0.large.allocated", i, &large_allocated, - size_t); - CTL_M2_GET("stats.arenas.0.large.nmalloc", i, &large_nmalloc, uint64_t); - CTL_M2_GET("stats.arenas.0.large.ndalloc", i, &large_ndalloc, uint64_t); - CTL_M2_GET("stats.arenas.0.large.nrequests", i, &large_nrequests, - uint64_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"large\": {\n"); + decay_npages.type = emitter_type_size; + decay_npages.size_val = pmuzzy; - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"allocated\": %zu,\n", large_allocated); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"nmalloc\": %"FMTu64",\n", large_nmalloc); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"ndalloc\": %"FMTu64",\n", large_ndalloc); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"nrequests\": %"FMTu64"\n", large_nrequests); + decay_sweeps.type = emitter_type_uint64; + decay_sweeps.uint64_val = muzzy_npurge; - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t},\n"); - } else { - malloc_cprintf(write_cb, cbopaque, - "large: %12zu %12"FMTu64" %12"FMTu64 - " %12"FMTu64"\n", - large_allocated, large_nmalloc, large_ndalloc, - large_nrequests); - malloc_cprintf(write_cb, cbopaque, - "total: %12zu %12"FMTu64" %12"FMTu64 - " %12"FMTu64"\n", - small_allocated + large_allocated, small_nmalloc + - large_nmalloc, small_ndalloc + large_ndalloc, - small_nrequests + large_nrequests); - } - if (!json) { - malloc_cprintf(write_cb, cbopaque, - "active: %12zu\n", pactive * page); - } + decay_madvises.type = emitter_type_uint64; + decay_madvises.uint64_val = muzzy_nmadvise; - CTL_M2_GET("stats.arenas.0.mapped", i, &mapped, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"mapped\": %zu,\n", mapped); - } else { - malloc_cprintf(write_cb, cbopaque, - "mapped: %12zu\n", mapped); - } + decay_purged.type = emitter_type_uint64; + decay_purged.uint64_val = muzzy_purged; - CTL_M2_GET("stats.arenas.0.retained", i, &retained, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"retained\": %zu,\n", retained); - } else { - malloc_cprintf(write_cb, cbopaque, - "retained: %12zu\n", retained); - } + emitter_table_row(emitter, &decay_row); - CTL_M2_GET("stats.arenas.0.base", i, &base, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"base\": %zu,\n", base); - } else { - malloc_cprintf(write_cb, cbopaque, - "base: %12zu\n", base); - } + /* Small / large / total allocation counts. */ + emitter_row_t alloc_count_row; + emitter_row_init(&alloc_count_row); - CTL_M2_GET("stats.arenas.0.internal", i, &internal, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"internal\": %zu,\n", internal); - } else { - malloc_cprintf(write_cb, cbopaque, - "internal: %12zu\n", internal); - } + emitter_col_t alloc_count_title; + emitter_col_init(&alloc_count_title, &alloc_count_row); + alloc_count_title.justify = emitter_justify_left; + alloc_count_title.width = 25; + alloc_count_title.type = emitter_type_title; + alloc_count_title.str_val = ""; - CTL_M2_GET("stats.arenas.0.tcache_bytes", i, &tcache_bytes, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"tcache\": %zu,\n", tcache_bytes); - } else { - malloc_cprintf(write_cb, cbopaque, - "tcache: %12zu\n", tcache_bytes); - } + emitter_col_t alloc_count_allocated; + emitter_col_init(&alloc_count_allocated, &alloc_count_row); + alloc_count_allocated.justify = emitter_justify_right; + alloc_count_allocated.width = 12; + alloc_count_allocated.type = emitter_type_title; + alloc_count_allocated.str_val = "allocated"; - CTL_M2_GET("stats.arenas.0.resident", i, &resident, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"resident\": %zu%s\n", resident, - (bins || large || mutex) ? "," : ""); - } else { - malloc_cprintf(write_cb, cbopaque, - "resident: %12zu\n", resident); - } + emitter_col_t alloc_count_nmalloc; + emitter_col_init(&alloc_count_nmalloc, &alloc_count_row); + alloc_count_nmalloc.justify = emitter_justify_right; + alloc_count_nmalloc.width = 12; + alloc_count_nmalloc.type = emitter_type_title; + alloc_count_nmalloc.str_val = "nmalloc"; + + emitter_col_t alloc_count_ndalloc; + emitter_col_init(&alloc_count_ndalloc, &alloc_count_row); + alloc_count_ndalloc.justify = emitter_justify_right; + alloc_count_ndalloc.width = 12; + alloc_count_ndalloc.type = emitter_type_title; + alloc_count_ndalloc.str_val = "ndalloc"; + + emitter_col_t alloc_count_nrequests; + emitter_col_init(&alloc_count_nrequests, &alloc_count_row); + alloc_count_nrequests.justify = emitter_justify_right; + alloc_count_nrequests.width = 12; + alloc_count_nrequests.type = emitter_type_title; + alloc_count_nrequests.str_val = "nrequests"; + + emitter_table_row(emitter, &alloc_count_row); + +#define GET_AND_EMIT_ALLOC_STAT(small_or_large, name, valtype) \ + CTL_M2_GET("stats.arenas.0." #small_or_large "." #name, i, \ + &small_or_large##_##name, valtype##_t); \ + emitter_json_kv(emitter, #name, emitter_type_##valtype, \ + &small_or_large##_##name); \ + alloc_count_##name.type = emitter_type_##valtype; \ + alloc_count_##name.valtype##_val = small_or_large##_##name; + + emitter_json_dict_begin(emitter, "small"); + alloc_count_title.str_val = "small:"; + + GET_AND_EMIT_ALLOC_STAT(small, allocated, size) + GET_AND_EMIT_ALLOC_STAT(small, nmalloc, uint64) + GET_AND_EMIT_ALLOC_STAT(small, ndalloc, uint64) + GET_AND_EMIT_ALLOC_STAT(small, nrequests, uint64) + + emitter_table_row(emitter, &alloc_count_row); + emitter_json_dict_end(emitter); /* Close "small". */ + + emitter_json_dict_begin(emitter, "large"); + alloc_count_title.str_val = "large:"; + + GET_AND_EMIT_ALLOC_STAT(large, allocated, size) + GET_AND_EMIT_ALLOC_STAT(large, nmalloc, uint64) + GET_AND_EMIT_ALLOC_STAT(large, ndalloc, uint64) + GET_AND_EMIT_ALLOC_STAT(large, nrequests, uint64) + + emitter_table_row(emitter, &alloc_count_row); + emitter_json_dict_end(emitter); /* Close "large". */ + +#undef GET_AND_EMIT_ALLOC_STAT + + /* Aggregated small + large stats are emitter only in table mode. */ + alloc_count_title.str_val = "total:"; + alloc_count_allocated.size_val = small_allocated + large_allocated; + alloc_count_nmalloc.uint64_val = small_nmalloc + large_nmalloc; + alloc_count_ndalloc.uint64_val = small_ndalloc + large_ndalloc; + alloc_count_nrequests.uint64_val = small_nrequests + large_nrequests; + emitter_table_row(emitter, &alloc_count_row); + + emitter_row_t mem_count_row; + emitter_row_init(&mem_count_row); + + emitter_col_t mem_count_title; + emitter_col_init(&mem_count_title, &mem_count_row); + mem_count_title.justify = emitter_justify_left; + mem_count_title.width = 25; + mem_count_title.type = emitter_type_title; + mem_count_title.str_val = ""; + + emitter_col_t mem_count_val; + emitter_col_init(&mem_count_val, &mem_count_row); + mem_count_val.justify = emitter_justify_right; + mem_count_val.width = 12; + mem_count_val.type = emitter_type_title; + mem_count_val.str_val = ""; + + emitter_table_row(emitter, &mem_count_row); + mem_count_val.type = emitter_type_size; + + /* Active count in bytes is emitted only in table mode. */ + mem_count_title.str_val = "active:"; + mem_count_val.size_val = pactive * page; + emitter_table_row(emitter, &mem_count_row); + +#define GET_AND_EMIT_MEM_STAT(stat) \ + CTL_M2_GET("stats.arenas.0."#stat, i, &stat, size_t); \ + emitter_json_kv(emitter, #stat, emitter_type_size, &stat); \ + mem_count_title.str_val = #stat":"; \ + mem_count_val.size_val = stat; \ + emitter_table_row(emitter, &mem_count_row); + + GET_AND_EMIT_MEM_STAT(mapped) + GET_AND_EMIT_MEM_STAT(retained) + GET_AND_EMIT_MEM_STAT(base) + GET_AND_EMIT_MEM_STAT(internal) + GET_AND_EMIT_MEM_STAT(metadata_thp) + GET_AND_EMIT_MEM_STAT(tcache_bytes) + GET_AND_EMIT_MEM_STAT(resident) +#undef GET_AND_EMIT_MEM_STAT if (mutex) { - stats_arena_mutexes_print(write_cb, cbopaque, json, - !(bins || large), i); + stats_arena_mutexes_print(emitter, i); } if (bins) { - stats_arena_bins_print(write_cb, cbopaque, json, large, mutex, - i); + stats_arena_bins_print(emitter, mutex, i); } if (large) { - stats_arena_lextents_print(write_cb, cbopaque, json, i); + stats_arena_lextents_print(emitter, i); } } static void -stats_general_print(void (*write_cb)(void *, const char *), void *cbopaque, - bool json, bool more) { +stats_general_print(emitter_t *emitter) { const char *cpv; - bool bv; + bool bv, bv2; unsigned uv; uint32_t u32v; uint64_t u64v; - ssize_t ssv; + ssize_t ssv, ssv2; size_t sv, bsz, usz, ssz, sssz, cpsz; bsz = sizeof(bool); @@ -663,365 +839,248 @@ stats_general_print(void (*write_cb)(void *, const char *), void *cbopaque, cpsz = sizeof(const char *); CTL_GET("version", &cpv, const char *); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\"version\": \"%s\",\n", cpv); - } else { - malloc_cprintf(write_cb, cbopaque, "Version: %s\n", cpv); - } + emitter_kv(emitter, "version", "Version", emitter_type_string, &cpv); /* config. */ -#define CONFIG_WRITE_BOOL_JSON(n, c) \ - if (json) { \ - CTL_GET("config."#n, &bv, bool); \ - malloc_cprintf(write_cb, cbopaque, \ - "\t\t\t\""#n"\": %s%s\n", bv ? "true" : "false", \ - (c)); \ - } + emitter_dict_begin(emitter, "config", "Build-time option settings"); +#define CONFIG_WRITE_BOOL(name) \ + do { \ + CTL_GET("config."#name, &bv, bool); \ + emitter_kv(emitter, #name, "config."#name, \ + emitter_type_bool, &bv); \ + } while (0) - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\"config\": {\n"); - } + CONFIG_WRITE_BOOL(cache_oblivious); + CONFIG_WRITE_BOOL(debug); + CONFIG_WRITE_BOOL(fill); + CONFIG_WRITE_BOOL(lazy_lock); + emitter_kv(emitter, "malloc_conf", "config.malloc_conf", + emitter_type_string, &config_malloc_conf); - CONFIG_WRITE_BOOL_JSON(cache_oblivious, ",") - - CTL_GET("config.debug", &bv, bool); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"debug\": %s,\n", bv ? "true" : "false"); - } else { - malloc_cprintf(write_cb, cbopaque, "Assertions %s\n", - bv ? "enabled" : "disabled"); - } - - CONFIG_WRITE_BOOL_JSON(fill, ",") - CONFIG_WRITE_BOOL_JSON(lazy_lock, ",") - - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"malloc_conf\": \"%s\",\n", - config_malloc_conf); - } else { - malloc_cprintf(write_cb, cbopaque, - "config.malloc_conf: \"%s\"\n", config_malloc_conf); - } - - CONFIG_WRITE_BOOL_JSON(prof, ",") - CONFIG_WRITE_BOOL_JSON(prof_libgcc, ",") - CONFIG_WRITE_BOOL_JSON(prof_libunwind, ",") - CONFIG_WRITE_BOOL_JSON(stats, ",") - CONFIG_WRITE_BOOL_JSON(thp, ",") - CONFIG_WRITE_BOOL_JSON(utrace, ",") - CONFIG_WRITE_BOOL_JSON(xmalloc, "") - - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t},\n"); - } -#undef CONFIG_WRITE_BOOL_JSON + CONFIG_WRITE_BOOL(prof); + CONFIG_WRITE_BOOL(prof_libgcc); + CONFIG_WRITE_BOOL(prof_libunwind); + CONFIG_WRITE_BOOL(stats); + CONFIG_WRITE_BOOL(utrace); + CONFIG_WRITE_BOOL(xmalloc); +#undef CONFIG_WRITE_BOOL + emitter_dict_end(emitter); /* Close "config" dict. */ /* opt. */ -#define OPT_WRITE_BOOL(n, c) \ - if (je_mallctl("opt."#n, (void *)&bv, &bsz, NULL, 0) == 0) { \ - if (json) { \ - malloc_cprintf(write_cb, cbopaque, \ - "\t\t\t\""#n"\": %s%s\n", bv ? "true" : \ - "false", (c)); \ - } else { \ - malloc_cprintf(write_cb, cbopaque, \ - " opt."#n": %s\n", bv ? "true" : "false"); \ - } \ - } -#define OPT_WRITE_BOOL_MUTABLE(n, m, c) { \ - bool bv2; \ - if (je_mallctl("opt."#n, (void *)&bv, &bsz, NULL, 0) == 0 && \ - je_mallctl(#m, (void *)&bv2, &bsz, NULL, 0) == 0) { \ - if (json) { \ - malloc_cprintf(write_cb, cbopaque, \ - "\t\t\t\""#n"\": %s%s\n", bv ? "true" : \ - "false", (c)); \ - } else { \ - malloc_cprintf(write_cb, cbopaque, \ - " opt."#n": %s ("#m": %s)\n", bv ? "true" \ - : "false", bv2 ? "true" : "false"); \ - } \ - } \ -} -#define OPT_WRITE_UNSIGNED(n, c) \ - if (je_mallctl("opt."#n, (void *)&uv, &usz, NULL, 0) == 0) { \ - if (json) { \ - malloc_cprintf(write_cb, cbopaque, \ - "\t\t\t\""#n"\": %u%s\n", uv, (c)); \ - } else { \ - malloc_cprintf(write_cb, cbopaque, \ - " opt."#n": %u\n", uv); \ - } \ - } -#define OPT_WRITE_SSIZE_T(n, c) \ - if (je_mallctl("opt."#n, (void *)&ssv, &sssz, NULL, 0) == 0) { \ - if (json) { \ - malloc_cprintf(write_cb, cbopaque, \ - "\t\t\t\""#n"\": %zd%s\n", ssv, (c)); \ - } else { \ - malloc_cprintf(write_cb, cbopaque, \ - " opt."#n": %zd\n", ssv); \ - } \ - } -#define OPT_WRITE_SSIZE_T_MUTABLE(n, m, c) { \ - ssize_t ssv2; \ - if (je_mallctl("opt."#n, (void *)&ssv, &sssz, NULL, 0) == 0 && \ - je_mallctl(#m, (void *)&ssv2, &sssz, NULL, 0) == 0) { \ - if (json) { \ - malloc_cprintf(write_cb, cbopaque, \ - "\t\t\t\""#n"\": %zd%s\n", ssv, (c)); \ - } else { \ - malloc_cprintf(write_cb, cbopaque, \ - " opt."#n": %zd ("#m": %zd)\n", \ - ssv, ssv2); \ - } \ - } \ -} -#define OPT_WRITE_CHAR_P(n, c) \ - if (je_mallctl("opt."#n, (void *)&cpv, &cpsz, NULL, 0) == 0) { \ - if (json) { \ - malloc_cprintf(write_cb, cbopaque, \ - "\t\t\t\""#n"\": \"%s\"%s\n", cpv, (c)); \ - } else { \ - malloc_cprintf(write_cb, cbopaque, \ - " opt."#n": \"%s\"\n", cpv); \ - } \ +#define OPT_WRITE(name, var, size, emitter_type) \ + if (je_mallctl("opt."name, (void *)&var, &size, NULL, 0) == \ + 0) { \ + emitter_kv(emitter, name, "opt."name, emitter_type, \ + &var); \ } - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\"opt\": {\n"); - } else { - malloc_cprintf(write_cb, cbopaque, - "Run-time option settings:\n"); - } - OPT_WRITE_BOOL(abort, ",") - OPT_WRITE_BOOL(abort_conf, ",") - OPT_WRITE_BOOL(retain, ",") - OPT_WRITE_CHAR_P(dss, ",") - OPT_WRITE_UNSIGNED(narenas, ",") - OPT_WRITE_CHAR_P(percpu_arena, ",") - OPT_WRITE_BOOL_MUTABLE(background_thread, background_thread, ",") - OPT_WRITE_SSIZE_T_MUTABLE(dirty_decay_ms, arenas.dirty_decay_ms, ",") - OPT_WRITE_SSIZE_T_MUTABLE(muzzy_decay_ms, arenas.muzzy_decay_ms, ",") - OPT_WRITE_CHAR_P(junk, ",") - OPT_WRITE_BOOL(zero, ",") - OPT_WRITE_BOOL(utrace, ",") - OPT_WRITE_BOOL(xmalloc, ",") - OPT_WRITE_BOOL(tcache, ",") - OPT_WRITE_SSIZE_T(lg_tcache_max, ",") - OPT_WRITE_BOOL(prof, ",") - OPT_WRITE_CHAR_P(prof_prefix, ",") - OPT_WRITE_BOOL_MUTABLE(prof_active, prof.active, ",") - OPT_WRITE_BOOL_MUTABLE(prof_thread_active_init, prof.thread_active_init, - ",") - OPT_WRITE_SSIZE_T_MUTABLE(lg_prof_sample, prof.lg_sample, ",") - OPT_WRITE_BOOL(prof_accum, ",") - OPT_WRITE_SSIZE_T(lg_prof_interval, ",") - OPT_WRITE_BOOL(prof_gdump, ",") - OPT_WRITE_BOOL(prof_final, ",") - OPT_WRITE_BOOL(prof_leak, ",") - OPT_WRITE_BOOL(stats_print, ",") - if (json || opt_stats_print) { - /* - * stats_print_opts is always emitted for JSON, so as long as it - * comes last it's safe to unconditionally omit the comma here - * (rather than having to conditionally omit it elsewhere - * depending on configuration). - */ - OPT_WRITE_CHAR_P(stats_print_opts, "") - } - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t},\n"); +#define OPT_WRITE_MUTABLE(name, var1, var2, size, emitter_type, \ + altname) \ + if (je_mallctl("opt."name, (void *)&var1, &size, NULL, 0) == \ + 0 && je_mallctl(altname, (void *)&var2, &size, NULL, 0) \ + == 0) { \ + emitter_kv_note(emitter, name, "opt."name, \ + emitter_type, &var1, altname, emitter_type, \ + &var2); \ } +#define OPT_WRITE_BOOL(name) OPT_WRITE(name, bv, bsz, emitter_type_bool) +#define OPT_WRITE_BOOL_MUTABLE(name, altname) \ + OPT_WRITE_MUTABLE(name, bv, bv2, bsz, emitter_type_bool, altname) + +#define OPT_WRITE_UNSIGNED(name) \ + OPT_WRITE(name, uv, usz, emitter_type_unsigned) + +#define OPT_WRITE_SSIZE_T(name) \ + OPT_WRITE(name, ssv, sssz, emitter_type_ssize) +#define OPT_WRITE_SSIZE_T_MUTABLE(name, altname) \ + OPT_WRITE_MUTABLE(name, ssv, ssv2, sssz, emitter_type_ssize, \ + altname) + +#define OPT_WRITE_CHAR_P(name) \ + OPT_WRITE(name, cpv, cpsz, emitter_type_string) + + emitter_dict_begin(emitter, "opt", "Run-time option settings"); + + OPT_WRITE_BOOL("abort") + OPT_WRITE_BOOL("abort_conf") + OPT_WRITE_BOOL("retain") + OPT_WRITE_CHAR_P("dss") + OPT_WRITE_UNSIGNED("narenas") + OPT_WRITE_CHAR_P("percpu_arena") + OPT_WRITE_CHAR_P("metadata_thp") + OPT_WRITE_BOOL_MUTABLE("background_thread", "background_thread") + OPT_WRITE_SSIZE_T_MUTABLE("dirty_decay_ms", "arenas.dirty_decay_ms") + OPT_WRITE_SSIZE_T_MUTABLE("muzzy_decay_ms", "arenas.muzzy_decay_ms") + OPT_WRITE_UNSIGNED("lg_extent_max_active_fit") + OPT_WRITE_CHAR_P("junk") + OPT_WRITE_BOOL("zero") + OPT_WRITE_BOOL("utrace") + OPT_WRITE_BOOL("xmalloc") + OPT_WRITE_BOOL("tcache") + OPT_WRITE_SSIZE_T("lg_tcache_max") + OPT_WRITE_CHAR_P("thp") + OPT_WRITE_BOOL("prof") + OPT_WRITE_CHAR_P("prof_prefix") + OPT_WRITE_BOOL_MUTABLE("prof_active", "prof.active") + OPT_WRITE_BOOL_MUTABLE("prof_thread_active_init", + "prof.thread_active_init") + OPT_WRITE_SSIZE_T_MUTABLE("lg_prof_sample", "prof.lg_sample") + OPT_WRITE_BOOL("prof_accum") + OPT_WRITE_SSIZE_T("lg_prof_interval") + OPT_WRITE_BOOL("prof_gdump") + OPT_WRITE_BOOL("prof_final") + OPT_WRITE_BOOL("prof_leak") + OPT_WRITE_BOOL("stats_print") + OPT_WRITE_CHAR_P("stats_print_opts") + + emitter_dict_end(emitter); + +#undef OPT_WRITE +#undef OPT_WRITE_MUTABLE #undef OPT_WRITE_BOOL #undef OPT_WRITE_BOOL_MUTABLE +#undef OPT_WRITE_UNSIGNED #undef OPT_WRITE_SSIZE_T +#undef OPT_WRITE_SSIZE_T_MUTABLE #undef OPT_WRITE_CHAR_P - /* arenas. */ - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\"arenas\": {\n"); - } - - CTL_GET("arenas.narenas", &uv, unsigned); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"narenas\": %u,\n", uv); - } else { - malloc_cprintf(write_cb, cbopaque, "Arenas: %u\n", uv); - } - - if (json) { - CTL_GET("arenas.dirty_decay_ms", &ssv, ssize_t); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"dirty_decay_ms\": %zd,\n", ssv); - - CTL_GET("arenas.muzzy_decay_ms", &ssv, ssize_t); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"muzzy_decay_ms\": %zd,\n", ssv); - } - - CTL_GET("arenas.quantum", &sv, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"quantum\": %zu,\n", sv); - } else { - malloc_cprintf(write_cb, cbopaque, "Quantum size: %zu\n", sv); - } - - CTL_GET("arenas.page", &sv, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"page\": %zu,\n", sv); - } else { - malloc_cprintf(write_cb, cbopaque, "Page size: %zu\n", sv); - } - - if (je_mallctl("arenas.tcache_max", (void *)&sv, &ssz, NULL, 0) == 0) { - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"tcache_max\": %zu,\n", sv); - } else { - malloc_cprintf(write_cb, cbopaque, - "Maximum thread-cached size class: %zu\n", sv); - } - } - - if (json) { - unsigned nbins, nlextents, i; - - CTL_GET("arenas.nbins", &nbins, unsigned); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"nbins\": %u,\n", nbins); - - CTL_GET("arenas.nhbins", &uv, unsigned); - malloc_cprintf(write_cb, cbopaque, "\t\t\t\"nhbins\": %u,\n", - uv); - - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"bin\": [\n"); - for (i = 0; i < nbins; i++) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t{\n"); - - CTL_M2_GET("arenas.bin.0.size", i, &sv, size_t); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"size\": %zu,\n", sv); - - CTL_M2_GET("arenas.bin.0.nregs", i, &u32v, uint32_t); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"nregs\": %"FMTu32",\n", u32v); - - CTL_M2_GET("arenas.bin.0.slab_size", i, &sv, size_t); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"slab_size\": %zu\n", sv); - - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t}%s\n", (i + 1 < nbins) ? "," : ""); - } - malloc_cprintf(write_cb, cbopaque, - "\t\t\t],\n"); - - CTL_GET("arenas.nlextents", &nlextents, unsigned); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"nlextents\": %u,\n", nlextents); - - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"lextent\": [\n"); - for (i = 0; i < nlextents; i++) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t{\n"); - - CTL_M2_GET("arenas.lextent.0.size", i, &sv, size_t); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"size\": %zu\n", sv); - - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t}%s\n", (i + 1 < nlextents) ? "," : ""); - } - malloc_cprintf(write_cb, cbopaque, - "\t\t\t]\n"); - - malloc_cprintf(write_cb, cbopaque, - "\t\t}%s\n", (config_prof || more) ? "," : ""); - } - /* prof. */ - if (config_prof && json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\"prof\": {\n"); + if (config_prof) { + emitter_dict_begin(emitter, "prof", "Profiling settings"); CTL_GET("prof.thread_active_init", &bv, bool); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"thread_active_init\": %s,\n", bv ? "true" : - "false"); + emitter_kv(emitter, "thread_active_init", + "prof.thread_active_init", emitter_type_bool, &bv); CTL_GET("prof.active", &bv, bool); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"active\": %s,\n", bv ? "true" : "false"); + emitter_kv(emitter, "active", "prof.active", emitter_type_bool, + &bv); CTL_GET("prof.gdump", &bv, bool); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"gdump\": %s,\n", bv ? "true" : "false"); + emitter_kv(emitter, "gdump", "prof.gdump", emitter_type_bool, + &bv); CTL_GET("prof.interval", &u64v, uint64_t); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"interval\": %"FMTu64",\n", u64v); + emitter_kv(emitter, "interval", "prof.interval", + emitter_type_uint64, &u64v); CTL_GET("prof.lg_sample", &ssv, ssize_t); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"lg_sample\": %zd\n", ssv); + emitter_kv(emitter, "lg_sample", "prof.lg_sample", + emitter_type_ssize, &ssv); - malloc_cprintf(write_cb, cbopaque, - "\t\t}%s\n", more ? "," : ""); + emitter_dict_end(emitter); /* Close "prof". */ } + + /* arenas. */ + /* + * The json output sticks arena info into an "arenas" dict; the table + * output puts them at the top-level. + */ + emitter_json_dict_begin(emitter, "arenas"); + + CTL_GET("arenas.narenas", &uv, unsigned); + emitter_kv(emitter, "narenas", "Arenas", emitter_type_unsigned, &uv); + + /* + * Decay settings are emitted only in json mode; in table mode, they're + * emitted as notes with the opt output, above. + */ + CTL_GET("arenas.dirty_decay_ms", &ssv, ssize_t); + emitter_json_kv(emitter, "dirty_decay_ms", emitter_type_ssize, &ssv); + + CTL_GET("arenas.muzzy_decay_ms", &ssv, ssize_t); + emitter_json_kv(emitter, "muzzy_decay_ms", emitter_type_ssize, &ssv); + + CTL_GET("arenas.quantum", &sv, size_t); + emitter_kv(emitter, "quantum", "Quantum size", emitter_type_size, &sv); + + CTL_GET("arenas.page", &sv, size_t); + emitter_kv(emitter, "page", "Page size", emitter_type_size, &sv); + + if (je_mallctl("arenas.tcache_max", (void *)&sv, &ssz, NULL, 0) == 0) { + emitter_kv(emitter, "tcache_max", + "Maximum thread-cached size class", emitter_type_size, &sv); + } + + unsigned nbins; + CTL_GET("arenas.nbins", &nbins, unsigned); + emitter_kv(emitter, "nbins", "Number of bin size classes", + emitter_type_unsigned, &nbins); + + unsigned nhbins; + CTL_GET("arenas.nhbins", &nhbins, unsigned); + emitter_kv(emitter, "nhbins", "Number of thread-cache bin size classes", + emitter_type_unsigned, &nhbins); + + /* + * We do enough mallctls in a loop that we actually want to omit them + * (not just omit the printing). + */ + if (emitter->output == emitter_output_json) { + emitter_json_arr_begin(emitter, "bin"); + for (unsigned i = 0; i < nbins; i++) { + emitter_json_arr_obj_begin(emitter); + + CTL_M2_GET("arenas.bin.0.size", i, &sv, size_t); + emitter_json_kv(emitter, "size", emitter_type_size, + &sv); + + CTL_M2_GET("arenas.bin.0.nregs", i, &u32v, uint32_t); + emitter_json_kv(emitter, "nregs", emitter_type_uint32, + &u32v); + + CTL_M2_GET("arenas.bin.0.slab_size", i, &sv, size_t); + emitter_json_kv(emitter, "slab_size", emitter_type_size, + &sv); + + emitter_json_arr_obj_end(emitter); + } + emitter_json_arr_end(emitter); /* Close "bin". */ + } + + unsigned nlextents; + CTL_GET("arenas.nlextents", &nlextents, unsigned); + emitter_kv(emitter, "nlextents", "Number of large size classes", + emitter_type_unsigned, &nlextents); + + if (emitter->output == emitter_output_json) { + emitter_json_arr_begin(emitter, "lextent"); + for (unsigned i = 0; i < nlextents; i++) { + emitter_json_arr_obj_begin(emitter); + + CTL_M2_GET("arenas.lextent.0.size", i, &sv, size_t); + emitter_json_kv(emitter, "size", emitter_type_size, + &sv); + + emitter_json_arr_obj_end(emitter); + } + emitter_json_arr_end(emitter); /* Close "lextent". */ + } + + emitter_json_dict_end(emitter); /* Close "arenas" */ } static void -read_global_mutex_stats( - uint64_t results[mutex_prof_num_global_mutexes][mutex_prof_num_counters]) { - char cmd[MUTEX_CTL_STR_MAX_LENGTH]; - - mutex_prof_global_ind_t i; - for (i = 0; i < mutex_prof_num_global_mutexes; i++) { -#define OP(c, t) \ - gen_mutex_ctl_str(cmd, MUTEX_CTL_STR_MAX_LENGTH, \ - "mutexes", global_mutex_names[i], #c); \ - CTL_GET(cmd, (t *)&results[i][mutex_counter_##c], t); -MUTEX_PROF_COUNTERS -#undef OP - } -} - -static void -stats_print_helper(void (*write_cb)(void *, const char *), void *cbopaque, - bool json, bool merged, bool destroyed, bool unmerged, bool bins, - bool large, bool mutex) { - size_t allocated, active, metadata, resident, mapped, retained; +stats_print_helper(emitter_t *emitter, bool merged, bool destroyed, + bool unmerged, bool bins, bool large, bool mutex) { + /* + * These should be deleted. We keep them around for a while, to aid in + * the transition to the emitter code. + */ + size_t allocated, active, metadata, metadata_thp, resident, mapped, + retained; size_t num_background_threads; uint64_t background_thread_num_runs, background_thread_run_interval; CTL_GET("stats.allocated", &allocated, size_t); CTL_GET("stats.active", &active, size_t); CTL_GET("stats.metadata", &metadata, size_t); + CTL_GET("stats.metadata_thp", &metadata_thp, size_t); CTL_GET("stats.resident", &resident, size_t); CTL_GET("stats.mapped", &mapped, size_t); CTL_GET("stats.retained", &retained, size_t); - uint64_t mutex_stats[mutex_prof_num_global_mutexes][mutex_prof_num_counters]; - if (mutex) { - read_global_mutex_stats(mutex_stats); - } - if (have_background_thread) { CTL_GET("stats.background_thread.num_threads", &num_background_threads, size_t); @@ -1035,182 +1094,130 @@ stats_print_helper(void (*write_cb)(void *, const char *), void *cbopaque, background_thread_run_interval = 0; } - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\"stats\": {\n"); + /* Generic global stats. */ + emitter_json_dict_begin(emitter, "stats"); + emitter_json_kv(emitter, "allocated", emitter_type_size, &allocated); + emitter_json_kv(emitter, "active", emitter_type_size, &active); + emitter_json_kv(emitter, "metadata", emitter_type_size, &metadata); + emitter_json_kv(emitter, "metadata_thp", emitter_type_size, + &metadata_thp); + emitter_json_kv(emitter, "resident", emitter_type_size, &resident); + emitter_json_kv(emitter, "mapped", emitter_type_size, &mapped); + emitter_json_kv(emitter, "retained", emitter_type_size, &retained); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"allocated\": %zu,\n", allocated); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"active\": %zu,\n", active); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"metadata\": %zu,\n", metadata); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"resident\": %zu,\n", resident); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"mapped\": %zu,\n", mapped); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"retained\": %zu,\n", retained); + emitter_table_printf(emitter, "Allocated: %zu, active: %zu, " + "metadata: %zu (n_thp %zu), resident: %zu, mapped: %zu, " + "retained: %zu\n", allocated, active, metadata, metadata_thp, + resident, mapped, retained); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"background_thread\": {\n"); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"num_threads\": %zu,\n", num_background_threads); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"num_runs\": %"FMTu64",\n", - background_thread_num_runs); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"run_interval\": %"FMTu64"\n", - background_thread_run_interval); - malloc_cprintf(write_cb, cbopaque, "\t\t\t}%s\n", - mutex ? "," : ""); + /* Background thread stats. */ + emitter_json_dict_begin(emitter, "background_thread"); + emitter_json_kv(emitter, "num_threads", emitter_type_size, + &num_background_threads); + emitter_json_kv(emitter, "num_runs", emitter_type_uint64, + &background_thread_num_runs); + emitter_json_kv(emitter, "run_interval", emitter_type_uint64, + &background_thread_run_interval); + emitter_json_dict_end(emitter); /* Close "background_thread". */ - if (mutex) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"mutexes\": {\n"); - mutex_prof_global_ind_t i; - for (i = 0; i < mutex_prof_num_global_mutexes; i++) { - mutex_stats_output_json(write_cb, cbopaque, - global_mutex_names[i], mutex_stats[i], - "\t\t\t\t", - i == mutex_prof_num_global_mutexes - 1); - } - malloc_cprintf(write_cb, cbopaque, "\t\t\t}\n"); + emitter_table_printf(emitter, "Background threads: %zu, " + "num_runs: %"FMTu64", run_interval: %"FMTu64" ns\n", + num_background_threads, background_thread_num_runs, + background_thread_run_interval); + + if (mutex) { + emitter_row_t row; + emitter_col_t name; + emitter_col_t col64[mutex_prof_num_uint64_t_counters]; + emitter_col_t col32[mutex_prof_num_uint32_t_counters]; + + emitter_row_init(&row); + mutex_stats_init_cols(&row, "", &name, col64, col32); + + emitter_table_row(emitter, &row); + emitter_json_dict_begin(emitter, "mutexes"); + + for (int i = 0; i < mutex_prof_num_global_mutexes; i++) { + mutex_stats_read_global(global_mutex_names[i], &name, + col64, col32); + emitter_json_dict_begin(emitter, global_mutex_names[i]); + mutex_stats_emit(emitter, &row, col64, col32); + emitter_json_dict_end(emitter); } - malloc_cprintf(write_cb, cbopaque, - "\t\t}%s\n", (merged || unmerged || destroyed) ? "," : ""); - } else { - malloc_cprintf(write_cb, cbopaque, - "Allocated: %zu, active: %zu, metadata: %zu," - " resident: %zu, mapped: %zu, retained: %zu\n", - allocated, active, metadata, resident, mapped, retained); - if (have_background_thread && num_background_threads > 0) { - malloc_cprintf(write_cb, cbopaque, - "Background threads: %zu, num_runs: %"FMTu64", " - "run_interval: %"FMTu64" ns\n", - num_background_threads, - background_thread_num_runs, - background_thread_run_interval); - } - if (mutex) { - mutex_prof_global_ind_t i; - for (i = 0; i < mutex_prof_num_global_mutexes; i++) { - mutex_stats_output(write_cb, cbopaque, - global_mutex_names[i], mutex_stats[i], - i == 0); - } - } + emitter_json_dict_end(emitter); /* Close "mutexes". */ } + emitter_json_dict_end(emitter); /* Close "stats". */ + if (merged || destroyed || unmerged) { unsigned narenas; - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\"stats.arenas\": {\n"); - } + emitter_json_dict_begin(emitter, "stats.arenas"); CTL_GET("arenas.narenas", &narenas, unsigned); - { - size_t mib[3]; - size_t miblen = sizeof(mib) / sizeof(size_t); - size_t sz; - VARIABLE_ARRAY(bool, initialized, narenas); - bool destroyed_initialized; - unsigned i, j, ninitialized; + size_t mib[3]; + size_t miblen = sizeof(mib) / sizeof(size_t); + size_t sz; + VARIABLE_ARRAY(bool, initialized, narenas); + bool destroyed_initialized; + unsigned i, j, ninitialized; - xmallctlnametomib("arena.0.initialized", mib, &miblen); - for (i = ninitialized = 0; i < narenas; i++) { - mib[1] = i; - sz = sizeof(bool); - xmallctlbymib(mib, miblen, &initialized[i], &sz, - NULL, 0); - if (initialized[i]) { - ninitialized++; - } - } - mib[1] = MALLCTL_ARENAS_DESTROYED; + xmallctlnametomib("arena.0.initialized", mib, &miblen); + for (i = ninitialized = 0; i < narenas; i++) { + mib[1] = i; sz = sizeof(bool); - xmallctlbymib(mib, miblen, &destroyed_initialized, &sz, + xmallctlbymib(mib, miblen, &initialized[i], &sz, NULL, 0); - - /* Merged stats. */ - if (merged && (ninitialized > 1 || !unmerged)) { - /* Print merged arena stats. */ - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"merged\": {\n"); - } else { - malloc_cprintf(write_cb, cbopaque, - "\nMerged arenas stats:\n"); - } - stats_arena_print(write_cb, cbopaque, json, - MALLCTL_ARENAS_ALL, bins, large, mutex); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t}%s\n", - ((destroyed_initialized && - destroyed) || unmerged) ? "," : - ""); - } + if (initialized[i]) { + ninitialized++; } + } + mib[1] = MALLCTL_ARENAS_DESTROYED; + sz = sizeof(bool); + xmallctlbymib(mib, miblen, &destroyed_initialized, &sz, + NULL, 0); - /* Destroyed stats. */ - if (destroyed_initialized && destroyed) { - /* Print destroyed arena stats. */ - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"destroyed\": {\n"); - } else { - malloc_cprintf(write_cb, cbopaque, - "\nDestroyed arenas stats:\n"); - } - stats_arena_print(write_cb, cbopaque, json, - MALLCTL_ARENAS_DESTROYED, bins, large, - mutex); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t}%s\n", unmerged ? "," : - ""); - } - } + /* Merged stats. */ + if (merged && (ninitialized > 1 || !unmerged)) { + /* Print merged arena stats. */ + emitter_table_printf(emitter, "Merged arenas stats:\n"); + emitter_json_dict_begin(emitter, "merged"); + stats_arena_print(emitter, MALLCTL_ARENAS_ALL, bins, + large, mutex); + emitter_json_dict_end(emitter); /* Close "merged". */ + } - /* Unmerged stats. */ - if (unmerged) { - for (i = j = 0; i < narenas; i++) { - if (initialized[i]) { - if (json) { - j++; - malloc_cprintf(write_cb, - cbopaque, - "\t\t\t\"%u\": {\n", - i); - } else { - malloc_cprintf(write_cb, - cbopaque, - "\narenas[%u]:\n", - i); - } - stats_arena_print(write_cb, - cbopaque, json, i, bins, - large, mutex); - if (json) { - malloc_cprintf(write_cb, - cbopaque, - "\t\t\t}%s\n", (j < - ninitialized) ? "," - : ""); - } - } + /* Destroyed stats. */ + if (destroyed_initialized && destroyed) { + /* Print destroyed arena stats. */ + emitter_table_printf(emitter, + "Destroyed arenas stats:\n"); + emitter_json_dict_begin(emitter, "destroyed"); + stats_arena_print(emitter, MALLCTL_ARENAS_DESTROYED, + bins, large, mutex); + emitter_json_dict_end(emitter); /* Close "destroyed". */ + } + + /* Unmerged stats. */ + if (unmerged) { + for (i = j = 0; i < narenas; i++) { + if (initialized[i]) { + char arena_ind_str[20]; + malloc_snprintf(arena_ind_str, + sizeof(arena_ind_str), "%u", i); + emitter_json_dict_begin(emitter, + arena_ind_str); + emitter_table_printf(emitter, + "arenas[%s]:\n", arena_ind_str); + stats_arena_print(emitter, i, bins, + large, mutex); + /* Close "". */ + emitter_json_dict_end(emitter); } } } - - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t}\n"); - } + emitter_json_dict_end(emitter); /* Close "stats.arenas". */ } } @@ -1257,29 +1264,23 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque, } } - if (json) { - malloc_cprintf(write_cb, cbopaque, - "{\n" - "\t\"jemalloc\": {\n"); - } else { - malloc_cprintf(write_cb, cbopaque, - "___ Begin jemalloc statistics ___\n"); - } + emitter_t emitter; + emitter_init(&emitter, + json ? emitter_output_json : emitter_output_table, write_cb, + cbopaque); + emitter_begin(&emitter); + emitter_table_printf(&emitter, "___ Begin jemalloc statistics ___\n"); + emitter_json_dict_begin(&emitter, "jemalloc"); if (general) { - stats_general_print(write_cb, cbopaque, json, config_stats); + stats_general_print(&emitter); } if (config_stats) { - stats_print_helper(write_cb, cbopaque, json, merged, destroyed, - unmerged, bins, large, mutex); + stats_print_helper(&emitter, merged, destroyed, unmerged, + bins, large, mutex); } - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t}\n" - "}\n"); - } else { - malloc_cprintf(write_cb, cbopaque, - "--- End jemalloc statistics ---\n"); - } + emitter_json_dict_end(&emitter); /* Closes the "jemalloc" dict. */ + emitter_table_printf(&emitter, "--- End jemalloc statistics ---\n"); + emitter_end(&emitter); } diff --git a/dep/jemalloc/src/sz.c b/dep/jemalloc/src/sz.c index 0986615f711..9de77e45fff 100644 --- a/dep/jemalloc/src/sz.c +++ b/dep/jemalloc/src/sz.c @@ -26,7 +26,8 @@ const size_t sz_index2size_tab[NSIZES] = { JEMALLOC_ALIGNED(CACHELINE) const uint8_t sz_size2index_tab[] = { #if LG_TINY_MIN == 0 -#warning "Dangerous LG_TINY_MIN" +/* The div module doesn't support division by 1. */ +#error "Unsupported LG_TINY_MIN" #define S2B_0(i) i, #elif LG_TINY_MIN == 1 #warning "Dangerous LG_TINY_MIN" diff --git a/dep/jemalloc/src/tcache.c b/dep/jemalloc/src/tcache.c index 936ef3140d5..a769a6b17bc 100644 --- a/dep/jemalloc/src/tcache.c +++ b/dep/jemalloc/src/tcache.c @@ -12,7 +12,7 @@ bool opt_tcache = true; ssize_t opt_lg_tcache_max = LG_TCACHE_MAXCLASS_DEFAULT; -tcache_bin_info_t *tcache_bin_info; +cache_bin_info_t *tcache_bin_info; static unsigned stack_nelms; /* Total stack elms per tcache. */ unsigned nhbins; @@ -40,7 +40,7 @@ void tcache_event_hard(tsd_t *tsd, tcache_t *tcache) { szind_t binind = tcache->next_gc_bin; - tcache_bin_t *tbin; + cache_bin_t *tbin; if (binind < NBINS) { tbin = tcache_small_bin_get(tcache, binind); } else { @@ -58,7 +58,7 @@ tcache_event_hard(tsd_t *tsd, tcache_t *tcache) { * Reduce fill count by 2X. Limit lg_fill_div such that * the fill count is always at least 1. */ - tcache_bin_info_t *tbin_info = &tcache_bin_info[binind]; + cache_bin_info_t *tbin_info = &tcache_bin_info[binind]; if ((tbin_info->ncached_max >> (tcache->lg_fill_div[binind] + 1)) >= 1) { tcache->lg_fill_div[binind]++; @@ -86,7 +86,7 @@ tcache_event_hard(tsd_t *tsd, tcache_t *tcache) { void * tcache_alloc_small_hard(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache, - tcache_bin_t *tbin, szind_t binind, bool *tcache_success) { + cache_bin_t *tbin, szind_t binind, bool *tcache_success) { void *ret; assert(tcache->arena != NULL); @@ -95,18 +95,18 @@ tcache_alloc_small_hard(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache, if (config_prof) { tcache->prof_accumbytes = 0; } - ret = tcache_alloc_easy(tbin, tcache_success); + ret = cache_bin_alloc_easy(tbin, tcache_success); return ret; } void -tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, tcache_bin_t *tbin, +tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, cache_bin_t *tbin, szind_t binind, unsigned rem) { bool merged_stats = false; assert(binind < NBINS); - assert(rem <= tbin->ncached); + assert((cache_bin_sz_t)rem <= tbin->ncached); arena_t *arena = tcache->arena; assert(arena != NULL); @@ -121,7 +121,7 @@ tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, tcache_bin_t *tbin, /* Lock the arena bin associated with the first object. */ extent_t *extent = item_extent[0]; arena_t *bin_arena = extent_arena_get(extent); - arena_bin_t *bin = &bin_arena->bins[binind]; + bin_t *bin = &bin_arena->bins[binind]; if (config_prof && bin_arena == arena) { if (arena_prof_accum(tsd_tsdn(tsd), arena, @@ -169,7 +169,7 @@ tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, tcache_bin_t *tbin, * The flush loop didn't happen to flush to this thread's * arena, so the stats didn't get merged. Manually do so now. */ - arena_bin_t *bin = &arena->bins[binind]; + bin_t *bin = &arena->bins[binind]; malloc_mutex_lock(tsd_tsdn(tsd), &bin->lock); bin->stats.nflushes++; bin->stats.nrequests += tbin->tstats.nrequests; @@ -180,18 +180,18 @@ tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, tcache_bin_t *tbin, memmove(tbin->avail - rem, tbin->avail - tbin->ncached, rem * sizeof(void *)); tbin->ncached = rem; - if ((low_water_t)tbin->ncached < tbin->low_water) { + if (tbin->ncached < tbin->low_water) { tbin->low_water = tbin->ncached; } } void -tcache_bin_flush_large(tsd_t *tsd, tcache_bin_t *tbin, szind_t binind, +tcache_bin_flush_large(tsd_t *tsd, cache_bin_t *tbin, szind_t binind, unsigned rem, tcache_t *tcache) { bool merged_stats = false; assert(binind < nhbins); - assert(rem <= tbin->ncached); + assert((cache_bin_sz_t)rem <= tbin->ncached); arena_t *arena = tcache->arena; assert(arena != NULL); @@ -278,7 +278,7 @@ tcache_bin_flush_large(tsd_t *tsd, tcache_bin_t *tbin, szind_t binind, memmove(tbin->avail - rem, tbin->avail - tbin->ncached, rem * sizeof(void *)); tbin->ncached = rem; - if ((low_water_t)tbin->ncached < tbin->low_water) { + if (tbin->ncached < tbin->low_water) { tbin->low_water = tbin->ncached; } } @@ -291,8 +291,15 @@ tcache_arena_associate(tsdn_t *tsdn, tcache_t *tcache, arena_t *arena) { if (config_stats) { /* Link into list of extant tcaches. */ malloc_mutex_lock(tsdn, &arena->tcache_ql_mtx); + ql_elm_new(tcache, link); ql_tail_insert(&arena->tcache_ql, tcache, link); + cache_bin_array_descriptor_init( + &tcache->cache_bin_array_descriptor, tcache->bins_small, + tcache->bins_large); + ql_tail_insert(&arena->cache_bin_array_descriptor_ql, + &tcache->cache_bin_array_descriptor, link); + malloc_mutex_unlock(tsdn, &arena->tcache_ql_mtx); } } @@ -316,6 +323,8 @@ tcache_arena_dissociate(tsdn_t *tsdn, tcache_t *tcache) { assert(in_ql); } ql_remove(&arena->tcache_ql, tcache, link); + ql_remove(&arena->cache_bin_array_descriptor_ql, + &tcache->cache_bin_array_descriptor, link); tcache_stats_merge(tsdn, tcache, arena); malloc_mutex_unlock(tsdn, &arena->tcache_ql_mtx); } @@ -354,8 +363,8 @@ tcache_init(tsd_t *tsd, tcache_t *tcache, void *avail_stack) { size_t stack_offset = 0; assert((TCACHE_NSLOTS_SMALL_MAX & 1U) == 0); - memset(tcache->tbins_small, 0, sizeof(tcache_bin_t) * NBINS); - memset(tcache->tbins_large, 0, sizeof(tcache_bin_t) * (nhbins - NBINS)); + memset(tcache->bins_small, 0, sizeof(cache_bin_t) * NBINS); + memset(tcache->bins_large, 0, sizeof(cache_bin_t) * (nhbins - NBINS)); unsigned i = 0; for (; i < NBINS; i++) { tcache->lg_fill_div[i] = 1; @@ -450,7 +459,7 @@ tcache_flush_cache(tsd_t *tsd, tcache_t *tcache) { assert(tcache->arena != NULL); for (unsigned i = 0; i < NBINS; i++) { - tcache_bin_t *tbin = tcache_small_bin_get(tcache, i); + cache_bin_t *tbin = tcache_small_bin_get(tcache, i); tcache_bin_flush_small(tsd, tcache, tbin, i, 0); if (config_stats) { @@ -458,7 +467,7 @@ tcache_flush_cache(tsd_t *tsd, tcache_t *tcache) { } } for (unsigned i = NBINS; i < nhbins; i++) { - tcache_bin_t *tbin = tcache_large_bin_get(tcache, i); + cache_bin_t *tbin = tcache_large_bin_get(tcache, i); tcache_bin_flush_large(tsd, tbin, i, 0, tcache); if (config_stats) { @@ -524,8 +533,8 @@ tcache_stats_merge(tsdn_t *tsdn, tcache_t *tcache, arena_t *arena) { /* Merge and reset tcache stats. */ for (i = 0; i < NBINS; i++) { - arena_bin_t *bin = &arena->bins[i]; - tcache_bin_t *tbin = tcache_small_bin_get(tcache, i); + bin_t *bin = &arena->bins[i]; + cache_bin_t *tbin = tcache_small_bin_get(tcache, i); malloc_mutex_lock(tsdn, &bin->lock); bin->stats.nrequests += tbin->tstats.nrequests; malloc_mutex_unlock(tsdn, &bin->lock); @@ -533,7 +542,7 @@ tcache_stats_merge(tsdn_t *tsdn, tcache_t *tcache, arena_t *arena) { } for (; i < nhbins; i++) { - tcache_bin_t *tbin = tcache_large_bin_get(tcache, i); + cache_bin_t *tbin = tcache_large_bin_get(tcache, i); arena_stats_large_nrequests_add(tsdn, &arena->stats, i, tbin->tstats.nrequests); tbin->tstats.nrequests = 0; @@ -657,21 +666,21 @@ tcache_boot(tsdn_t *tsdn) { nhbins = sz_size2index(tcache_maxclass) + 1; /* Initialize tcache_bin_info. */ - tcache_bin_info = (tcache_bin_info_t *)base_alloc(tsdn, b0get(), nhbins - * sizeof(tcache_bin_info_t), CACHELINE); + tcache_bin_info = (cache_bin_info_t *)base_alloc(tsdn, b0get(), nhbins + * sizeof(cache_bin_info_t), CACHELINE); if (tcache_bin_info == NULL) { return true; } stack_nelms = 0; unsigned i; for (i = 0; i < NBINS; i++) { - if ((arena_bin_info[i].nregs << 1) <= TCACHE_NSLOTS_SMALL_MIN) { + if ((bin_infos[i].nregs << 1) <= TCACHE_NSLOTS_SMALL_MIN) { tcache_bin_info[i].ncached_max = TCACHE_NSLOTS_SMALL_MIN; - } else if ((arena_bin_info[i].nregs << 1) <= + } else if ((bin_infos[i].nregs << 1) <= TCACHE_NSLOTS_SMALL_MAX) { tcache_bin_info[i].ncached_max = - (arena_bin_info[i].nregs << 1); + (bin_infos[i].nregs << 1); } else { tcache_bin_info[i].ncached_max = TCACHE_NSLOTS_SMALL_MAX; diff --git a/dep/jemalloc/src/tsd.c b/dep/jemalloc/src/tsd.c index f968992f2b5..c1430682dd5 100644 --- a/dep/jemalloc/src/tsd.c +++ b/dep/jemalloc/src/tsd.c @@ -71,6 +71,16 @@ tsd_data_init(tsd_t *tsd) { */ rtree_ctx_data_init(tsd_rtree_ctxp_get_unsafe(tsd)); + /* + * A nondeterministic seed based on the address of tsd reduces + * the likelihood of lockstep non-uniform cache index + * utilization among identical concurrent processes, but at the + * cost of test repeatability. For debug builds, instead use a + * deterministic seed. + */ + *tsd_offset_statep_get(tsd) = config_debug ? 0 : + (uint64_t)(uintptr_t)tsd; + return tsd_tcache_enabled_data_init(tsd); } diff --git a/dep/jemalloc/src/zone.c b/dep/jemalloc/src/zone.c index 9d3b7b49522..23dfdd04a91 100644 --- a/dep/jemalloc/src/zone.c +++ b/dep/jemalloc/src/zone.c @@ -89,6 +89,7 @@ JEMALLOC_ATTR(weak_import); static malloc_zone_t *default_zone, *purgeable_zone; static malloc_zone_t jemalloc_zone; static struct malloc_introspection_t jemalloc_zone_introspect; +static pid_t zone_force_lock_pid = -1; /******************************************************************************/ /* Function prototypes for non-inline static functions. */ @@ -270,6 +271,12 @@ zone_log(malloc_zone_t *zone, void *address) { static void zone_force_lock(malloc_zone_t *zone) { if (isthreaded) { + /* + * See the note in zone_force_unlock, below, to see why we need + * this. + */ + assert(zone_force_lock_pid == -1); + zone_force_lock_pid = getpid(); jemalloc_prefork(); } } @@ -277,14 +284,25 @@ zone_force_lock(malloc_zone_t *zone) { static void zone_force_unlock(malloc_zone_t *zone) { /* - * Call jemalloc_postfork_child() rather than - * jemalloc_postfork_parent(), because this function is executed by both - * parent and child. The parent can tolerate having state - * reinitialized, but the child cannot unlock mutexes that were locked - * by the parent. + * zone_force_lock and zone_force_unlock are the entry points to the + * forking machinery on OS X. The tricky thing is, the child is not + * allowed to unlock mutexes locked in the parent, even if owned by the + * forking thread (and the mutex type we use in OS X will fail an assert + * if we try). In the child, we can get away with reinitializing all + * the mutexes, which has the effect of unlocking them. In the parent, + * doing this would mean we wouldn't wake any waiters blocked on the + * mutexes we unlock. So, we record the pid of the current thread in + * zone_force_lock, and use that to detect if we're in the parent or + * child here, to decide which unlock logic we need. */ if (isthreaded) { - jemalloc_postfork_child(); + assert(zone_force_lock_pid != -1); + if (getpid() == zone_force_lock_pid) { + jemalloc_postfork_parent(); + } else { + jemalloc_postfork_child(); + } + zone_force_lock_pid = -1; } } From b6d893f91c98266602628e7778734440b4ce7805 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Sat, 12 May 2018 13:27:41 +0200 Subject: [PATCH 23/35] rename files --- ...018_05_12_01_world_from_335_was_2018_05_08_00_world_335.sql} | 2 ++ ...018_05_12_02_world_from_335_was_2018_05_08_01_world_335.sql} | 2 ++ ...018_05_12_03_world_from_335_was_2018_05_08_02_world_335.sql} | 2 ++ ...018_05_12_04_world_from_335_was_2018_05_08_03_world_335.sql} | 2 ++ ...018_05_12_05_world_from_335_was_2018_05_08_04_world_335.sql} | 2 ++ ...018_05_12_06_world_from_335_was_2018_05_08_05_world_335.sql} | 2 ++ ...018_05_12_07_world_from_335_was_2018_05_08_06_world_335.sql} | 2 ++ ...018_05_12_08_world_from_335_was_2018_05_08_07_world_335.sql} | 2 ++ 8 files changed, 16 insertions(+) rename sql/updates/world/{3.3.5/2018_05_08_00_world_335.sql => 4.3.4/2018_05_12_01_world_from_335_was_2018_05_08_00_world_335.sql} (99%) rename sql/updates/world/{3.3.5/2018_05_08_01_world_335.sql => 4.3.4/2018_05_12_02_world_from_335_was_2018_05_08_01_world_335.sql} (99%) rename sql/updates/world/{3.3.5/2018_05_08_02_world_335.sql => 4.3.4/2018_05_12_03_world_from_335_was_2018_05_08_02_world_335.sql} (99%) rename sql/updates/world/{3.3.5/2018_05_08_03_world_335.sql => 4.3.4/2018_05_12_04_world_from_335_was_2018_05_08_03_world_335.sql} (99%) rename sql/updates/world/{3.3.5/2018_05_08_04_world_335.sql => 4.3.4/2018_05_12_05_world_from_335_was_2018_05_08_04_world_335.sql} (99%) rename sql/updates/world/{3.3.5/2018_05_08_05_world_335.sql => 4.3.4/2018_05_12_06_world_from_335_was_2018_05_08_05_world_335.sql} (99%) rename sql/updates/world/{3.3.5/2018_05_08_06_world_335.sql => 4.3.4/2018_05_12_07_world_from_335_was_2018_05_08_06_world_335.sql} (99%) rename sql/updates/world/{3.3.5/2018_05_08_07_world_335.sql => 4.3.4/2018_05_12_08_world_from_335_was_2018_05_08_07_world_335.sql} (99%) diff --git a/sql/updates/world/3.3.5/2018_05_08_00_world_335.sql b/sql/updates/world/4.3.4/2018_05_12_01_world_from_335_was_2018_05_08_00_world_335.sql similarity index 99% rename from sql/updates/world/3.3.5/2018_05_08_00_world_335.sql rename to sql/updates/world/4.3.4/2018_05_12_01_world_from_335_was_2018_05_08_00_world_335.sql index 48cd894b635..66cd3d50ebc 100644 --- a/sql/updates/world/3.3.5/2018_05_08_00_world_335.sql +++ b/sql/updates/world/4.3.4/2018_05_12_01_world_from_335_was_2018_05_08_00_world_335.sql @@ -1,3 +1,4 @@ +/* -- -- Gaeriyan --> Fix Gossip Texts DELETE FROM `gossip_menu` WHERE `MenuID`=1914 AND `TextID` IN (2567,2569); @@ -15,3 +16,4 @@ INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry (14,1914,2568,0,0,14,0,3912,0,0,1,0,0,"","Show gossip text 2568 if quest 'Meet at the Grave' is taken"), (14,1914,2568,0,0,14,0,3913,0,0,0,0,0,"","Show gossip text 2568 if quest 'A Grave Situation' is not taken"), (14,1914,2569,0,0,14,0,3913,0,0,1,0,0,"","Show gossip text 2569 if quest 'A Grave Situation' is taken"); +*/ diff --git a/sql/updates/world/3.3.5/2018_05_08_01_world_335.sql b/sql/updates/world/4.3.4/2018_05_12_02_world_from_335_was_2018_05_08_01_world_335.sql similarity index 99% rename from sql/updates/world/3.3.5/2018_05_08_01_world_335.sql rename to sql/updates/world/4.3.4/2018_05_12_02_world_from_335_was_2018_05_08_01_world_335.sql index 6b780a9c1a7..2441cd546d0 100644 --- a/sql/updates/world/3.3.5/2018_05_08_01_world_335.sql +++ b/sql/updates/world/4.3.4/2018_05_12_02_world_from_335_was_2018_05_08_01_world_335.sql @@ -1,3 +1,4 @@ +/* -- Quest "The Videre Elixir" -- Miblon's Bait UPDATE `gameobject_template` SET `AIName`="SmartGameObjectAI" WHERE `entry`=164758; @@ -33,3 +34,4 @@ INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Lan (9467,1,0,"%s sniffs the bait.",16,0,100,0,0,0,4768,0,"Miblon Snarltooth"), (9467,2,0,"Grumble...",12,0,100,0,0,0,4766,0,"Miblon Snarltooth"), (9467,3,0,"%s gnaws at the bait ravenously.",16,0,100,0,0,0,4771,0,"Miblon Snarltooth"); +*/ diff --git a/sql/updates/world/3.3.5/2018_05_08_02_world_335.sql b/sql/updates/world/4.3.4/2018_05_12_03_world_from_335_was_2018_05_08_02_world_335.sql similarity index 99% rename from sql/updates/world/3.3.5/2018_05_08_02_world_335.sql rename to sql/updates/world/4.3.4/2018_05_12_03_world_from_335_was_2018_05_08_02_world_335.sql index d300bf66ae5..f16bad2a2e6 100644 --- a/sql/updates/world/3.3.5/2018_05_08_02_world_335.sql +++ b/sql/updates/world/4.3.4/2018_05_12_03_world_from_335_was_2018_05_08_02_world_335.sql @@ -1,3 +1,4 @@ +/* -- -- Niby the Almighty --> Add gossip chatter DELETE FROM `gossip_menu` WHERE `MenuID` IN (5841,5842,5843,5844); @@ -17,3 +18,4 @@ INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionTex DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=5845; INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES (15,5845,0,0,0,15,0,256,0,0,0,0,0,"","Show gossip option if player is a Warlock"); +*/ diff --git a/sql/updates/world/3.3.5/2018_05_08_03_world_335.sql b/sql/updates/world/4.3.4/2018_05_12_04_world_from_335_was_2018_05_08_03_world_335.sql similarity index 99% rename from sql/updates/world/3.3.5/2018_05_08_03_world_335.sql rename to sql/updates/world/4.3.4/2018_05_12_04_world_from_335_was_2018_05_08_03_world_335.sql index 287628363c4..171f1312b98 100644 --- a/sql/updates/world/3.3.5/2018_05_08_03_world_335.sql +++ b/sql/updates/world/4.3.4/2018_05_12_04_world_from_335_was_2018_05_08_03_world_335.sql @@ -1,3 +1,4 @@ +/* -- -- Ur'dan --> Add Gossip Text UPDATE `creature_template` SET `gossip_menu_id`=5864 WHERE `entry`=14522; @@ -9,3 +10,4 @@ INSERT INTO `gossip_menu` (`MenuID`, `TextID`, `VerifiedBuild`) VALUES DELETE FROM `gossip_menu_option` WHERE `MenuID`=5864; INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextID`, `OptionType`, `OptionNpcFlag`, `ActionMenuID`, `ActionPoiID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `VerifiedBuild`) VALUES (5864,0,1,"I wish to purchase from you.",9734,3,128,0,0,0,0,"",0,0); +*/ diff --git a/sql/updates/world/3.3.5/2018_05_08_04_world_335.sql b/sql/updates/world/4.3.4/2018_05_12_05_world_from_335_was_2018_05_08_04_world_335.sql similarity index 99% rename from sql/updates/world/3.3.5/2018_05_08_04_world_335.sql rename to sql/updates/world/4.3.4/2018_05_12_05_world_from_335_was_2018_05_08_04_world_335.sql index 9980bbc1d9d..f8c08c5517e 100644 --- a/sql/updates/world/3.3.5/2018_05_08_04_world_335.sql +++ b/sql/updates/world/4.3.4/2018_05_12_05_world_from_335_was_2018_05_08_04_world_335.sql @@ -1,3 +1,4 @@ +/* -- -- Quest "Forces of Jaedenar" DELETE FROM `quest_details` WHERE `ID`=5155; @@ -204,3 +205,4 @@ INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `Emot (8485,1,1,0,0,0,0,0,0,0); UPDATE `quest_request_items` SET `EmoteOnComplete`=2 WHERE `ID` IN (8484,8485); UPDATE `quest_offer_reward` SET `Emote1`=1, `Emote2`=1 WHERE `ID` IN (8484,8485); +*/ diff --git a/sql/updates/world/3.3.5/2018_05_08_05_world_335.sql b/sql/updates/world/4.3.4/2018_05_12_06_world_from_335_was_2018_05_08_05_world_335.sql similarity index 99% rename from sql/updates/world/3.3.5/2018_05_08_05_world_335.sql rename to sql/updates/world/4.3.4/2018_05_12_06_world_from_335_was_2018_05_08_05_world_335.sql index 3ada38bcd83..65f4043ee59 100644 --- a/sql/updates/world/3.3.5/2018_05_08_05_world_335.sql +++ b/sql/updates/world/4.3.4/2018_05_12_06_world_from_335_was_2018_05_08_05_world_335.sql @@ -1,3 +1,4 @@ +/* -- -- Ulathek DELETE FROM `smart_scripts` WHERE `entryorguid`=14523 AND `source_type`=0 AND `id`=6; @@ -7,3 +8,4 @@ INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_ DELETE FROM `creature_text` WHERE `CreatureID`=14523; INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES (14523,0,0,"You dog! Now I'll trap your soul into a shard and give you to my imp as a plaything!",12,0,100,0,0,0,9735,0,"Ulathek"); +*/ diff --git a/sql/updates/world/3.3.5/2018_05_08_06_world_335.sql b/sql/updates/world/4.3.4/2018_05_12_07_world_from_335_was_2018_05_08_06_world_335.sql similarity index 99% rename from sql/updates/world/3.3.5/2018_05_08_06_world_335.sql rename to sql/updates/world/4.3.4/2018_05_12_07_world_from_335_was_2018_05_08_06_world_335.sql index 610a14a9726..b863e8d5e14 100644 --- a/sql/updates/world/3.3.5/2018_05_08_06_world_335.sql +++ b/sql/updates/world/4.3.4/2018_05_12_07_world_from_335_was_2018_05_08_06_world_335.sql @@ -1,3 +1,4 @@ +/* -- DELETE FROM `smart_scripts` WHERE `entryorguid`=946700 AND `source_type`=9; 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 @@ -14,3 +15,4 @@ INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_ (946700,9,10,0,0,0,100,0,108000,108000,0,0,24,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Evade"), (946700,9,11,0,0,0,100,0,0,0,0,0,82,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Add NPC Flag Gossip"), (946700,9,12,0,0,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Set Event Phase 1"); +*/ diff --git a/sql/updates/world/3.3.5/2018_05_08_07_world_335.sql b/sql/updates/world/4.3.4/2018_05_12_08_world_from_335_was_2018_05_08_07_world_335.sql similarity index 99% rename from sql/updates/world/3.3.5/2018_05_08_07_world_335.sql rename to sql/updates/world/4.3.4/2018_05_12_08_world_from_335_was_2018_05_08_07_world_335.sql index cf0593389cf..6d84c9ae787 100644 --- a/sql/updates/world/3.3.5/2018_05_08_07_world_335.sql +++ b/sql/updates/world/4.3.4/2018_05_12_08_world_from_335_was_2018_05_08_07_world_335.sql @@ -1,3 +1,4 @@ +/* -- -- World Invisible Trigger SET @GUID := 64987; @@ -77,3 +78,4 @@ INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `positi (14470,9,5427.72,-750.631,347.609), (14470,10,5416.55,-749.533,348.499), (14470,11,5407.59,-736.618,344.249); +*/ From 299682a893235e4e1174d5a18d18c1a6e35a5f9a Mon Sep 17 00:00:00 2001 From: Killyana Date: Sat, 12 May 2018 18:25:37 +0200 Subject: [PATCH 24/35] DB: Add a missing SQL --- .../world/4.3.4/2018_05_12_09_world.sql | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 sql/updates/world/4.3.4/2018_05_12_09_world.sql diff --git a/sql/updates/world/4.3.4/2018_05_12_09_world.sql b/sql/updates/world/4.3.4/2018_05_12_09_world.sql new file mode 100644 index 00000000000..3619469a6ce --- /dev/null +++ b/sql/updates/world/4.3.4/2018_05_12_09_world.sql @@ -0,0 +1,107 @@ +-- +SET @GUID := 68274; + +-- Pathing for Mechagnome Laborer Entry: 29389 +SET @NPC := @GUID; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=7910.65,`position_y`=-1418.727,`position_z`=1534.705 WHERE `guid`=@NPC; +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_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,7910.65,-1418.727,1534.705,0,0,0,0,100,0), +(@PATH,2,7913.654,-1426.635,1534.705,0,0,0,0,100,0), +(@PATH,3,7920.053,-1414.188,1534.705,0,0,0,0,100,0), +(@PATH,4,7922.347,-1395.791,1534.705,0,0,0,0,100,0), +(@PATH,5,7920.222,-1386.216,1534.705,0,0,0,0,100,0), +(@PATH,6,7923.166,-1385.087,1534.705,0,0,0,0,100,0), +(@PATH,7,7916.864,-1385.485,1534.705,0,0,0,0,100,0), +(@PATH,8,7916.226,-1392.192,1534.705,0,0,0,0,100,0), +(@PATH,9,7911.995,-1404.557,1534.705,0,0,0,0,100,0); + +-- Pathing for Mechagnome Laborer Entry: 29389 +SET @NPC := @GUID+1; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=7868.562,`position_y`=-1363.65,`position_z`=1534.059 WHERE `guid`=@NPC; +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_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,7868.562,-1363.65,1534.059,0,0,0,0,100,0), +(@PATH,2,7879.646,-1351.339,1534.705,0,0,0,0,100,0), +(@PATH,3,7868.222,-1355.34,1534.705,0,0,0,0,100,0), +(@PATH,4,7851.979,-1359.603,1534.705,0,0,0,0,100,0), +(@PATH,5,7840.327,-1375.057,1534.059,0,0,0,0,100,0), +(@PATH,6,7843.573,-1379.135,1534.059,0,0,0,0,100,0), +(@PATH,7,7830.217,-1389.011,1534.366,0,0,0,0,100,0), +(@PATH,8,7825.899,-1405.483,1534.705,0,0,0,0,100,0), +(@PATH,9,7846.697,-1416.326,1534.059,0,0,0,0,100,0), +(@PATH,10,7849.118,-1427.04,1534.059,0,0,0,0,100,0), +(@PATH,11,7848.421,-1411.426,1534.059,0,0,0,0,100,0), +(@PATH,12,7845.131,-1389.869,1534.059,0,0,0,0,100,0), +(@PATH,13,7859.611,-1375.139,1534.059,0,0,0,0,100,0); + +-- Pathing for Mechagnome Laborer Entry: 29389 +SET @NPC := @GUID+2; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=7900.394,`position_y`=-1481.597,`position_z`=1532.27 WHERE `guid`=@NPC; +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_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,7900.394,-1481.597,1532.27,0,0,0,0,100,0), +(@PATH,2,7921.518,-1469.935,1532.267,0,0,0,0,100,0), +(@PATH,3,7939.954,-1444.368,1532.134,0,0,0,0,100,0), +(@PATH,4,7915.613,-1432.221,1535.256,0,0,0,0,100,0), +(@PATH,5,7939.954,-1444.368,1532.134,0,0,0,0,100,0), +(@PATH,6,7921.518,-1469.935,1532.267,0,0,0,0,100,0), +(@PATH,7,7900.394,-1481.597,1532.27,0,0,0,0,100,0), +(@PATH,8,7875.807,-1482.918,1532.255,0,0,0,0,100,0), +(@PATH,9,7872.38,-1464.144,1534.557,0,0,0,0,100,0), +(@PATH,10,7875.807,-1482.918,1532.255,0,0,0,0,100,0); + +-- Pathing for Mechagnome Laborer Entry: 29389 +SET @NPC := @GUID+3; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=7857.495,`position_y`=-1330.407,`position_z`=1534.557 WHERE `guid`=@NPC; +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_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,7857.495,-1330.407,1534.557,0,0,0,0,100,0), +(@PATH,2,7853.63,-1310.692,1532.1,0,0,0,0,100,0), +(@PATH,3,7832.517,-1312.412,1532.386,0,0,0,0,100,0), +(@PATH,4,7814.14,-1322.234,1532.386,0,0,0,0,100,0), +(@PATH,5,7795.604,-1339.547,1532.251,0,0,0,0,100,0), +(@PATH,6,7817.405,-1356.497,1535.256,0,0,0,0,100,0), +(@PATH,7,7804.852,-1402.777,1535.256,0,0,0,0,100,0), +(@PATH,8,7782.151,-1408.093,1532.063,0,0,0,0,100,0), +(@PATH,9,7804.852,-1402.777,1535.256,0,0,0,0,100,0), +(@PATH,10,7817.405,-1356.497,1535.256,0,0,0,0,100,0), +(@PATH,11,7795.604,-1339.547,1532.251,0,0,0,0,100,0), +(@PATH,12,7814.14,-1322.234,1532.386,0,0,0,0,100,0), +(@PATH,13,7832.517,-1312.412,1532.386,0,0,0,0,100,0), +(@PATH,14,7853.63,-1310.692,1532.1,0,0,0,0,100,0); + +-- Pathing for Mechagnome Laborer Entry: 29389 +SET @NPC := @GUID+4; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=7309.224,`position_y`=-666.5821,`position_z`=784.8982 WHERE `guid`=@NPC; +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_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,7309.224,-666.5821,784.8982,0,0,0,0,100,0), +(@PATH,2,7309.142,-656.5869,784.8982,0,0,0,0,100,0), +(@PATH,3,7309.335,-647.4516,784.8982,0,0,0,0,100,0), +(@PATH,4,7309.67,-640.1229,784.8982,0,0,0,0,100,0), +(@PATH,5,7309.579,-631.7067,785.1652,0,0,0,0,100,0), +(@PATH,6,7309.624,-623.5741,785.4073,0,0,0,0,100,0), +(@PATH,7,7309.579,-631.7067,785.1652,0,0,0,0,100,0), +(@PATH,8,7309.67,-640.1229,784.8982,0,0,0,0,100,0), +(@PATH,9,7309.335,-647.4516,784.8982,0,0,0,0,100,0), +(@PATH,10,7309.142,-656.5869,784.8982,0,0,0,0,100,0), +(@PATH,11,7309.224,-666.5821,784.8982,0,0,0,0,100,0), +(@PATH,12,7309.377,-678.6055,785.1129,0,0,0,0,100,0), +(@PATH,13,7309.483,-688.7038,785.1492,0,0,0,0,100,0), +(@PATH,14,7309.378,-678.7083,785.1492,0,0,0,0,100,0); From 2e3fef6452efb2f928db3e5870ad8b8ba4a6c8f1 Mon Sep 17 00:00:00 2001 From: Killyana Date: Sat, 12 May 2018 18:40:27 +0200 Subject: [PATCH 25/35] DB/Creature: Fix incorrect unit flag for Ice Steppe Rhino --- sql/updates/world/4.3.4/2018_05_12_10_world.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 sql/updates/world/4.3.4/2018_05_12_10_world.sql diff --git a/sql/updates/world/4.3.4/2018_05_12_10_world.sql b/sql/updates/world/4.3.4/2018_05_12_10_world.sql new file mode 100644 index 00000000000..1209558e6fc --- /dev/null +++ b/sql/updates/world/4.3.4/2018_05_12_10_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `unit_flags`=32768 WHERE `entry`=29469; From 5f45307a78d4eb0c3991b3e1a72e80bb986f6ec4 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Sat, 12 May 2018 19:28:32 +0200 Subject: [PATCH 26/35] Core/Misc: Fix FreezeDetector triggered on startup Fix FreezeDetector triggering the assert on startup if scripts took more than a few seconds to initialize. --- src/server/worldserver/Main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 99d074bd6f9..b4eee978873 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -91,7 +91,7 @@ class FreezeDetector { public: FreezeDetector(Trinity::Asio::IoContext& ioContext, uint32 maxCoreStuckTime) - : _timer(ioContext), _worldLoopCounter(0), _lastChangeMsTime(0), _maxCoreStuckTimeInMs(maxCoreStuckTime) { } + : _timer(ioContext), _worldLoopCounter(0), _lastChangeMsTime(getMSTime()), _maxCoreStuckTimeInMs(maxCoreStuckTime) { } static void Start(std::shared_ptr const& freezeDetector) { From f369f877c54147689aca6804760f7e71c31a8298 Mon Sep 17 00:00:00 2001 From: Killyana Date: Sat, 12 May 2018 19:49:27 +0200 Subject: [PATCH 27/35] DB: Missing formations --- sql/updates/world/4.3.4/2018_05_12_11_world.sql | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 sql/updates/world/4.3.4/2018_05_12_11_world.sql diff --git a/sql/updates/world/4.3.4/2018_05_12_11_world.sql b/sql/updates/world/4.3.4/2018_05_12_11_world.sql new file mode 100644 index 00000000000..f3281027b6b --- /dev/null +++ b/sql/updates/world/4.3.4/2018_05_12_11_world.sql @@ -0,0 +1,11 @@ +-- +DELETE FROM `creature_formations` WHERE `leaderGUID` IN (120830,120831,120833,120832,120836,123124,120835,120834); +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES +(120830, 120830, 0, 0, 515, 0, 0), +(120830, 120831, 10, 215, 515, 0, 0), +(120832, 120832, 0, 0, 515, 0, 0), +(120832, 120833, 10, 215, 515, 0, 0), +(120834, 120834, 0, 0, 515, 0, 0), +(120834, 120835, 10, 215, 515, 0, 0), +(120836, 120836, 0, 0, 515, 0, 0), +(120836, 123124, 10, 215, 515, 0, 0); From 11c60eb617afbabbba5e78809709c00007e37d45 Mon Sep 17 00:00:00 2001 From: Killyana Date: Sun, 13 May 2018 12:52:33 +0200 Subject: [PATCH 28/35] DB/Misc: Delete Dup spawns and update SAI target --- sql/updates/world/4.3.4/2018_05_13_00_world.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 sql/updates/world/4.3.4/2018_05_13_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_05_13_00_world.sql b/sql/updates/world/4.3.4/2018_05_13_00_world.sql new file mode 100644 index 00000000000..5ed66c36e4b --- /dev/null +++ b/sql/updates/world/4.3.4/2018_05_13_00_world.sql @@ -0,0 +1,7 @@ +-- +-- Delete duplicate Armory and Cathedral doors +DELETE FROM `gameobject` WHERE `guid` IN (200966,203104,212814,216444,220549,200965,203103,212815,216443,220550); + +-- UPDATE SAI target +UPDATE `smart_scripts` SET `target_param1`=200252 WHERE `entryorguid` IN (101852) AND `source_type`=1 AND `id`=0; +UPDATE `smart_scripts` SET `target_param1`=200251 WHERE `entryorguid` IN (101853) AND `source_type`=1 AND `id`=0; From 19bfbb2fd94eed30a51f25b8aa12caeb535c2bcc Mon Sep 17 00:00:00 2001 From: Killyana Date: Sun, 13 May 2018 14:38:34 +0200 Subject: [PATCH 29/35] DB: Remove some Dup spawns --- .../world/4.3.4/2018_05_13_01_world.sql | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 sql/updates/world/4.3.4/2018_05_13_01_world.sql diff --git a/sql/updates/world/4.3.4/2018_05_13_01_world.sql b/sql/updates/world/4.3.4/2018_05_13_01_world.sql new file mode 100644 index 00000000000..3a53b50b5be --- /dev/null +++ b/sql/updates/world/4.3.4/2018_05_13_01_world.sql @@ -0,0 +1,38 @@ +DELETE FROM `creature` WHERE `guid` IN (350034, 349936, 350035, 359090,203124,371716, 360264,363632,363631,362091,144796,144794,144792,144789,144785,75558 ,85190 ,85189 ,85187 ,85191 ,85188 ,88485 ,143705,143697,143713,143700,143708,143715,362067,362078,362077,362076,362079,362080,348390,348391,348437,348436,348387,348551,348388,348552,348386,348550,348389,348435,142710,143273,143263,143264,143271,143269,143268,143272,143231,143230,143232,409 ,408 ,411 ,410 ,412 ,413 ,414 ,415 ,100215,100213,131035,103543,307708,48255 ,144094,144009,143921,107837,123113,123149,123157,123151,123148,123111,106487,106483,106482,106486,142693,142695,142697,142694,142696,343027,347682,348200,348451,348780,343829,344111,344419,344965,345371,345735,346323,346391,346428,346496,346707,347026,344112,344416,344967,345370,345772,346321,346393,346434,346498,346709,347027,347684,348198,348452,348782,342533,343028,343030,347683,348199,348453,348781,343543,343810,344110,344418,344966,345372,346322,346392,346448,346497,346719,347028,342529,343029,343830,344109,344417,346324,346394,346534,346722,347029,347685,348197,348454,348767,369538,138471,138470,138469,138468,296 ,293 ,292 ,295 ,294 ,138492,138494,138493,376356,376375,376373,376374,376602,376452,376449,376451,376453,376454,376444,252238,252364,252354,252359,252352,252346,252347,252274,252615,252539,252524,252513,252530,252483,252652,252593,252577,252651,252561,252537,252585,252552,252650,252605,252550,252602,252553,252540,252614,252578,252536,252531,252517,252599,252580,252508,252604,252589,252575,252556,252654,252648,252621,252612,252586,252582,252562,252549,252541,252659,252643,252618,252660,252601,252570,252547,252610,252573,252424,252595,252546,252657,252571,252565,252521,252594,252532,252516,252505,252420,252653,252598,252658,252607,252534,252468,252646,252587,252408,252623,252603,252574,252620,252613,252545,252526,252518,252510,252400,252639,252569,252564,252649,252392,48308,48309); -- 434 +DELETE FROM `creature_addon` WHERE `guid` IN (350034, 349936, 350035, 359090,203124,371716, 360264,363632,363631,362091,144796,144794,144792,144789,144785,75558 ,85190 ,85189 ,85187 ,85191 ,85188 ,88485 ,143705,143697,143713,143700,143708,143715,362067,362078,362077,362076,362079,362080,348390,348391,348437,348436,348387,348551,348388,348552,348386,348550,348389,348435,142710,143273,143263,143264,143271,143269,143268,143272,143231,143230,143232,409 ,408 ,411 ,410 ,412 ,413 ,414 ,415 ,100215,100213,131035,103543,307708,48255 ,144094,144009,143921,107837,123113,123149,123157,123151,123148,123111,106487,106483,106482,106486,142693,142695,142697,142694,142696,343027,347682,348200,348451,348780,343829,344111,344419,344965,345371,345735,346323,346391,346428,346496,346707,347026,344112,344416,344967,345370,345772,346321,346393,346434,346498,346709,347027,347684,348198,348452,348782,342533,343028,343030,347683,348199,348453,348781,343543,343810,344110,344418,344966,345372,346322,346392,346448,346497,346719,347028,342529,343029,343830,344109,344417,346324,346394,346534,346722,347029,347685,348197,348454,348767,369538,138471,138470,138469,138468,296 ,293 ,292 ,295 ,294 ,138492,138494,138493,376356,376375,376373,376374,376602,376452,376449,376451,376453,376454,376444,252238,252364,252354,252359,252352,252346,252347,252274,252615,252539,252524,252513,252530,252483,252652,252593,252577,252651,252561,252537,252585,252552,252650,252605,252550,252602,252553,252540,252614,252578,252536,252531,252517,252599,252580,252508,252604,252589,252575,252556,252654,252648,252621,252612,252586,252582,252562,252549,252541,252659,252643,252618,252660,252601,252570,252547,252610,252573,252424,252595,252546,252657,252571,252565,252521,252594,252532,252516,252505,252420,252653,252598,252658,252607,252534,252468,252646,252587,252408,252623,252603,252574,252620,252613,252545,252526,252518,252510,252400,252639,252569,252564,252649,252392,48308,48309); -- 434 + +DELETE FROM `creature` WHERE `id`=31401 AND `guid` IN (111931, 111932, 111933, 111934, 111935); +DELETE FROM `creature_addon` WHERE `guid` IN (124089); +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`) VALUES +(124089, 1240890, 0, 50331648, 0, 0); + +DELETE FROM `waypoint_data` WHERE `id`=1325600; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(1325600, 25, -4210.05, 3036.03, 359.272, 0, 0, 1, 0, 100, 0), +(1325600, 24, -4197.81, 3024.34, 366.188, 0, 0, 1, 0, 100, 0), +(1325600, 23, -4166.6, 3015.78, 353.327, 0, 0, 1, 0, 100, 0), +(1325600, 22, -4119.36, 3000.52, 350.383, 0, 0, 1, 0, 100, 0), +(1325600, 21, -4078.06, 3004.44, 346.771, 0, 0, 1, 0, 100, 0), +(1325600, 20, -4047.5, 3033.21, 346.827, 0, 0, 1, 0, 100, 0), +(1325600, 19, -4037.82, 3075.94, 350.938, 0, 0, 1, 0, 100, 0), +(1325600, 18, -4037.22, 3122.49, 345.133, 0, 0, 1, 0, 100, 0), +(1325600, 17, -4020.08, 3150.26, 329.883, 0, 0, 1, 0, 100, 0), +(1325600, 16, -3983.11, 3172.78, 330.133, 0, 0, 1, 0, 100, 0), +(1325600, 15, -3945.8, 3163.18, 338.493, 0, 0, 1, 0, 100, 0), +(1325600, 14, -3906.74, 3138.08, 347.049, 0, 0, 1, 0, 100, 0), +(1325600, 13, -3872.96, 3116.54, 357.438, 0, 0, 1, 0, 100, 0), +(1325600, 12, -3857.7, 3086.13, 367.605, 0, 0, 1, 0, 100, 0), +(1325600, 11, -3866.05, 3043.05, 372.104, 0, 0, 1, 0, 100, 0), +(1325600, 10, -3902.36, 3025, 374.716, 0, 0, 1, 0, 100, 0), +(1325600, 9, -3939.95, 3047.44, 368.138, 0, 0, 1, 0, 100, 0), +(1325600, 8, -3976.81, 3075.32, 357.966, 0, 0, 1, 0, 100, 0), +(1325600, 7, -4015.78, 3101.06, 352.327, 0, 0, 1, 0, 100, 0), +(1325600, 6, -4057.3, 3120.64, 344.022, 0, 0, 1, 0, 100, 0), +(1325600, 5, -4093.99, 3151.9, 340.022, 0, 0, 1, 0, 100, 0), +(1325600, 4, -4133.58, 3148.63, 338.077, 0, 0, 1, 0, 100, 0), +(1325600, 3, -4161.6, 3113.01, 348.633, 0, 0, 1, 0, 100, 0), +(1325600, 2, -4193.34, 3081.12, 359.272, 0, 0, 1, 0, 100, 0), +(1325600, 1, -4214.1, 3060.08, 359.272, 0, 0, 1, 0, 100, 0); + +DELETE FROM `gameobject_addon` WHERE `guid` IN (200965, 200966, 203103, 203104, 212814, 212815, 216443, 216444, 220549, 220550); +DELETE FROM `game_event_creature` WHERE `guid` IN (292,293,294,295,296,362067,362076,362077,362078,362079,362080,362091); From 6e40f5114ecb8d769fc99398e4c1d60bd616d36c Mon Sep 17 00:00:00 2001 From: Killyana Date: Sun, 13 May 2018 16:33:38 +0200 Subject: [PATCH 30/35] DB/Creature: Remove some Dup spawns --- .../world/3.3.5/2018_05_13_00_world_335.sql | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 sql/updates/world/3.3.5/2018_05_13_00_world_335.sql diff --git a/sql/updates/world/3.3.5/2018_05_13_00_world_335.sql b/sql/updates/world/3.3.5/2018_05_13_00_world_335.sql new file mode 100644 index 00000000000..8dd102b657f --- /dev/null +++ b/sql/updates/world/3.3.5/2018_05_13_00_world_335.sql @@ -0,0 +1,35 @@ +-- +DELETE FROM `creature` WHERE `guid` IN (48255, 75558,88485, 103543,106482, 106483,106486, 106487,107837, 142693,142694, 142695,142696, 142697,142710, 143230,143231, 143232,143263, 143264,143268, 143269,143271, 143272,143273, 143697,143700, 143705,143708, 143713,143715, 143921,144009, 144094,144785, 144789,144792, 144794,144796, 203124); +DELETE FROM `creature_addon` WHERE `guid` IN (48255, 75558,88485, 103543,106482, 106483,106486, 106487,107837, 142693,142694, 142695,142696, 142697,142710, 143230,143231, 143232,143263, 143264,143268, 143269,143271, 143272,143273, 143697,143700, 143705,143708, 143713,143715, 143921,144009, 144094,144785, 144789,144792, 144794,144796, 203124); +DELETE FROM `creature` WHERE `id`=31401 AND `guid` IN (111931, 111932, 111933, 111934, 111935); + +DELETE FROM `waypoint_data` WHERE `id`=1325600; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(1325600, 25, -4210.05, 3036.03, 359.272, 0, 0, 1, 0, 100, 0), +(1325600, 24, -4197.81, 3024.34, 366.188, 0, 0, 1, 0, 100, 0), +(1325600, 23, -4166.6, 3015.78, 353.327, 0, 0, 1, 0, 100, 0), +(1325600, 22, -4119.36, 3000.52, 350.383, 0, 0, 1, 0, 100, 0), +(1325600, 21, -4078.06, 3004.44, 346.771, 0, 0, 1, 0, 100, 0), +(1325600, 20, -4047.5, 3033.21, 346.827, 0, 0, 1, 0, 100, 0), +(1325600, 19, -4037.82, 3075.94, 350.938, 0, 0, 1, 0, 100, 0), +(1325600, 18, -4037.22, 3122.49, 345.133, 0, 0, 1, 0, 100, 0), +(1325600, 17, -4020.08, 3150.26, 329.883, 0, 0, 1, 0, 100, 0), +(1325600, 16, -3983.11, 3172.78, 330.133, 0, 0, 1, 0, 100, 0), +(1325600, 15, -3945.8, 3163.18, 338.493, 0, 0, 1, 0, 100, 0), +(1325600, 14, -3906.74, 3138.08, 347.049, 0, 0, 1, 0, 100, 0), +(1325600, 13, -3872.96, 3116.54, 357.438, 0, 0, 1, 0, 100, 0), +(1325600, 12, -3857.7, 3086.13, 367.605, 0, 0, 1, 0, 100, 0), +(1325600, 11, -3866.05, 3043.05, 372.104, 0, 0, 1, 0, 100, 0), +(1325600, 10, -3902.36, 3025, 374.716, 0, 0, 1, 0, 100, 0), +(1325600, 9, -3939.95, 3047.44, 368.138, 0, 0, 1, 0, 100, 0), +(1325600, 8, -3976.81, 3075.32, 357.966, 0, 0, 1, 0, 100, 0), +(1325600, 7, -4015.78, 3101.06, 352.327, 0, 0, 1, 0, 100, 0), +(1325600, 6, -4057.3, 3120.64, 344.022, 0, 0, 1, 0, 100, 0), +(1325600, 5, -4093.99, 3151.9, 340.022, 0, 0, 1, 0, 100, 0), +(1325600, 4, -4133.58, 3148.63, 338.077, 0, 0, 1, 0, 100, 0), +(1325600, 3, -4161.6, 3113.01, 348.633, 0, 0, 1, 0, 100, 0), +(1325600, 2, -4193.34, 3081.12, 359.272, 0, 0, 1, 0, 100, 0), +(1325600, 1, -4214.1, 3060.08, 359.272, 0, 0, 1, 0, 100, 0); + +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (-143921) AND `source_type`=0; +DELETE FROM `spawn_group` WHERE `spawnType`=0 AND `SpawnId` IN (48255,106482,106483,106486,106487,107837,111931,111932,111933,111934,111935,142710); From a3028a1f5a158391d603de3f0c6a4902f7e0edca Mon Sep 17 00:00:00 2001 From: Killyana Date: Mon, 14 May 2018 02:02:52 +0200 Subject: [PATCH 31/35] DB/Creature: Add some missing spawns to Tempest Keep --- sql/updates/world/3.3.5/2018_05_14_00_world.sql | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 sql/updates/world/3.3.5/2018_05_14_00_world.sql diff --git a/sql/updates/world/3.3.5/2018_05_14_00_world.sql b/sql/updates/world/3.3.5/2018_05_14_00_world.sql new file mode 100644 index 00000000000..9a75cb233b3 --- /dev/null +++ b/sql/updates/world/3.3.5/2018_05_14_00_world.sql @@ -0,0 +1,13 @@ +-- +DELETE FROM `creature` WHERE `guid` IN (48255,64988,64989,64990,64991,64992,64993,75558,84444,84484); +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES +(48255, 20038, 550, 0, 0, 1, 1, 0, 0, 310.438, 41.6756, -2.38937, 3.79216, 300, 0, 0, 48902, 0, 0, 0, 0, 0, "", 0), +(64988, 20038, 550, 0, 0, 1, 1, 0, 0, 313.605, 38.1466, -2.38937, 3.53769, 300, 0, 0, 48902, 0, 0, 0, 0, 0, "", 0), +(64989, 20037, 550, 0, 0, 1, 1, 0, 1, 319.51, 43.7734, -2.38937, 3.57472, 300, 0, 0, 100520, 16155, 0, 0, 0, 0, "", 0), +(64990, 20037, 550, 0, 0, 1, 1, 0, 1, 339.52, -50.6231, -2.38754, 0.416626, 300, 0, 0, 100520, 16155, 0, 0, 0, 0, "", 0), +(64991, 20038, 550, 0, 0, 1, 1, 0, 0, 348.485, -42.0046, -2.38833, 0.531368, 300, 0, 0, 48902, 0, 0, 0, 0, 0, "", 0), +(64992, 20038, 550, 0, 0, 1, 1, 0, 0, 352.302, -40.07, -2.38816, 0.492098, 300, 0, 0, 48902, 0, 0, 0, 0, 0, "", 0), +(64993, 20037, 550, 0, 0, 1, 1, 0, 1, 358.22, -39.9547, -2.38682, 0.465866, 300, 0, 0, 100520, 16155, 0, 0, 0, 0, "", 0), +(75558, 20052, 550, 0, 0, 1, 1, 0, 0, 433.013, 324.812, 15.4822, 1.68793, 300, 0, 0, 125668, 0, 0, 0, 0, 0, "", 0), +(84444, 20052, 550, 0, 0, 1, 1, 0, 0, 479.372, 376.597, 15.5883, 3.10479, 300, 0, 0, 125668, 0, 0, 0, 0, 0, "", 0), +(84484, 20042, 550, 0, 0, 1, 1, 0, 0, 401.508, 356.858, 14.8947, 3.68035, 300, 0, 0, 125668, 0, 0, 0, 0, 0, "", 0); From 89d99d5e6096206426180506bd1a14d70ec42177 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Mon, 14 May 2018 03:25:36 +0200 Subject: [PATCH 32/35] rename files --- ...018_05_14_00_world_from_335_was_2018_05_13_00_world_335.sql} | 2 ++ .../2018_05_14_01_world_from_335_was_2018_05_14_00_world.sql} | 0 2 files changed, 2 insertions(+) rename sql/updates/world/{3.3.5/2018_05_13_00_world_335.sql => 4.3.4/2018_05_14_00_world_from_335_was_2018_05_13_00_world_335.sql} (99%) rename sql/updates/world/{3.3.5/2018_05_14_00_world.sql => 4.3.4/2018_05_14_01_world_from_335_was_2018_05_14_00_world.sql} (100%) diff --git a/sql/updates/world/3.3.5/2018_05_13_00_world_335.sql b/sql/updates/world/4.3.4/2018_05_14_00_world_from_335_was_2018_05_13_00_world_335.sql similarity index 99% rename from sql/updates/world/3.3.5/2018_05_13_00_world_335.sql rename to sql/updates/world/4.3.4/2018_05_14_00_world_from_335_was_2018_05_13_00_world_335.sql index 8dd102b657f..d44756fc6dc 100644 --- a/sql/updates/world/3.3.5/2018_05_13_00_world_335.sql +++ b/sql/updates/world/4.3.4/2018_05_14_00_world_from_335_was_2018_05_13_00_world_335.sql @@ -1,3 +1,4 @@ +/* -- DELETE FROM `creature` WHERE `guid` IN (48255, 75558,88485, 103543,106482, 106483,106486, 106487,107837, 142693,142694, 142695,142696, 142697,142710, 143230,143231, 143232,143263, 143264,143268, 143269,143271, 143272,143273, 143697,143700, 143705,143708, 143713,143715, 143921,144009, 144094,144785, 144789,144792, 144794,144796, 203124); DELETE FROM `creature_addon` WHERE `guid` IN (48255, 75558,88485, 103543,106482, 106483,106486, 106487,107837, 142693,142694, 142695,142696, 142697,142710, 143230,143231, 143232,143263, 143264,143268, 143269,143271, 143272,143273, 143697,143700, 143705,143708, 143713,143715, 143921,144009, 144094,144785, 144789,144792, 144794,144796, 203124); @@ -33,3 +34,4 @@ INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `positio DELETE FROM `smart_scripts` WHERE `entryorguid` IN (-143921) AND `source_type`=0; DELETE FROM `spawn_group` WHERE `spawnType`=0 AND `SpawnId` IN (48255,106482,106483,106486,106487,107837,111931,111932,111933,111934,111935,142710); +*/ diff --git a/sql/updates/world/3.3.5/2018_05_14_00_world.sql b/sql/updates/world/4.3.4/2018_05_14_01_world_from_335_was_2018_05_14_00_world.sql similarity index 100% rename from sql/updates/world/3.3.5/2018_05_14_00_world.sql rename to sql/updates/world/4.3.4/2018_05_14_01_world_from_335_was_2018_05_14_00_world.sql From bb274f8a2e011ee8bf0967ae0758f1c85b371fde Mon Sep 17 00:00:00 2001 From: Aokromes Date: Tue, 15 May 2018 15:36:23 +0200 Subject: [PATCH 33/35] TDB 4.3.4.30 2018/05/15 --- revision_data.h.in.cmake | 2 +- sql/base/auth_database.sql | 3 ++- sql/base/characters_database.sql | 3 ++- .../4.3.4/auth/29_2018_05_15}/2018_04_15_00_auth.sql | 0 .../characters/29_2018_05_15}/2018_04_15_00_characters.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_15_00_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_15_01_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_15_02_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_15_03_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_15_04_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_16_00_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_16_01_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_17_00_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_17_01_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_17_02_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_17_03_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_18_00_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_21_00_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_21_01_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_21_02_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_21_03_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_23_00_world.sql | 0 ...018_04_25_00_world_from_335_was_2018_04_17_00_world_335.sql | 0 ...018_04_25_01_world_from_335_was_2018_04_17_01_world_335.sql | 0 ...018_04_25_02_world_from_335_was_2018_04_17_02_world_335.sql | 0 ...018_04_25_03_world_from_335_was_2018_04_17_03_world_335.sql | 0 ...018_04_25_04_world_from_335_was_2018_04_22_00_world_335.sql | 0 ...018_04_25_05_world_from_335_was_2018_04_24_00_world_335.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_04_26_00_world.sql | 0 .../2018_04_29_00_world_from_335_was_2018_04_26_00_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_05_03_00_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_05_12_00_world.sql | 0 ...018_05_12_01_world_from_335_was_2018_05_08_00_world_335.sql | 0 ...018_05_12_02_world_from_335_was_2018_05_08_01_world_335.sql | 0 ...018_05_12_03_world_from_335_was_2018_05_08_02_world_335.sql | 0 ...018_05_12_04_world_from_335_was_2018_05_08_03_world_335.sql | 0 ...018_05_12_05_world_from_335_was_2018_05_08_04_world_335.sql | 0 ...018_05_12_06_world_from_335_was_2018_05_08_05_world_335.sql | 0 ...018_05_12_07_world_from_335_was_2018_05_08_06_world_335.sql | 0 ...018_05_12_08_world_from_335_was_2018_05_08_07_world_335.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_05_12_09_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_05_12_10_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_05_12_11_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_05_13_00_world.sql | 0 .../4.3.4/world/29_2018_05_15}/2018_05_13_01_world.sql | 0 ...018_05_14_00_world_from_335_was_2018_05_13_00_world_335.sql | 0 .../2018_05_14_01_world_from_335_was_2018_05_14_00_world.sql | 0 sql/updates/auth/2018_05_15_00_auth.sql | 2 ++ sql/updates/characters/2018_05_15_00_characters.sql | 2 ++ 49 files changed, 9 insertions(+), 3 deletions(-) rename sql/{updates/auth/4.3.4 => old/4.3.4/auth/29_2018_05_15}/2018_04_15_00_auth.sql (100%) rename sql/{updates/characters/4.3.4 => old/4.3.4/characters/29_2018_05_15}/2018_04_15_00_characters.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_15_00_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_15_01_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_15_02_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_15_03_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_15_04_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_16_00_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_16_01_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_17_00_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_17_01_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_17_02_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_17_03_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_18_00_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_21_00_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_21_01_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_21_02_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_21_03_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_23_00_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_25_00_world_from_335_was_2018_04_17_00_world_335.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_25_01_world_from_335_was_2018_04_17_01_world_335.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_25_02_world_from_335_was_2018_04_17_02_world_335.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_25_03_world_from_335_was_2018_04_17_03_world_335.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_25_04_world_from_335_was_2018_04_22_00_world_335.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_25_05_world_from_335_was_2018_04_24_00_world_335.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_26_00_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_04_29_00_world_from_335_was_2018_04_26_00_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_05_03_00_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_05_12_00_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_05_12_01_world_from_335_was_2018_05_08_00_world_335.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_05_12_02_world_from_335_was_2018_05_08_01_world_335.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_05_12_03_world_from_335_was_2018_05_08_02_world_335.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_05_12_04_world_from_335_was_2018_05_08_03_world_335.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_05_12_05_world_from_335_was_2018_05_08_04_world_335.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_05_12_06_world_from_335_was_2018_05_08_05_world_335.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_05_12_07_world_from_335_was_2018_05_08_06_world_335.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_05_12_08_world_from_335_was_2018_05_08_07_world_335.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_05_12_09_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_05_12_10_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_05_12_11_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_05_13_00_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_05_13_01_world.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_05_14_00_world_from_335_was_2018_05_13_00_world_335.sql (100%) rename sql/{updates/world/4.3.4 => old/4.3.4/world/29_2018_05_15}/2018_05_14_01_world_from_335_was_2018_05_14_00_world.sql (100%) create mode 100644 sql/updates/auth/2018_05_15_00_auth.sql create mode 100644 sql/updates/characters/2018_05_15_00_characters.sql diff --git a/revision_data.h.in.cmake b/revision_data.h.in.cmake index 1a614510400..d1db25941f6 100644 --- a/revision_data.h.in.cmake +++ b/revision_data.h.in.cmake @@ -9,7 +9,7 @@ #define _SOURCE_DIRECTORY R"(@CMAKE_SOURCE_DIR@)" #define _BUILD_DIRECTORY R"(@BUILDDIR@)" #define _MYSQL_EXECUTABLE R"(@MYSQL_EXECUTABLE@)" - #define _FULL_DATABASE "TDB_full_world_434.29_2018_04_15.sql" + #define _FULL_DATABASE "TDB_full_world_434.30_2018_05_15.sql" #define VER_COMPANYNAME_STR "TrinityCore Developers" #define VER_LEGALCOPYRIGHT_STR "(c)2008-2018 TrinityCore" #define VER_FILEVERSION 0,0,0 diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index 5c14a5b6acc..44ccf4e29af 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -2009,7 +2009,8 @@ INSERT INTO `updates` VALUES ('2018_03_06_00_auth_from_335_was_2018_03_06_00_auth.sql','3F8EA885898CE0F9D47043A832602D77','ARCHIVED','2018-02-16 01:40:04',0), ('2018_03_16_00_auth.sql','E77AFBFE7C1DEC8839AECC40140ED1AF55B56A10','ARCHIVED','2018-03-16 01:40:04',0), ('2018_03_28_00_auth.sql','45A7C896BDF00B1C319C9F889893D3B95E45EF0A','ARCHIVED','2018-03-28 01:40:04',0), -('2018_04_15_00_auth.sql','2293BAA1DA754CFD780838FE99EDB98FD7C041E0','ARCHIVED','2018-04-15 01:40:04',0); +('2018_04_15_00_auth.sql','2293BAA1DA754CFD780838FE99EDB98FD7C041E0','ARCHIVED','2018-04-15 01:40:04',0), +('2018_05_15_00_auth.sql','9076B44013D5BE1E92A06BDE7CE4F9B6663272CC','ARCHIVED','2018-05-15 01:40:04',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index 22c1766a9b4..48f8d4b3bb0 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -2955,7 +2955,8 @@ INSERT INTO `updates` VALUES ('2018_02_16_00_characters.sql','F1254689CE8A0B0AF149E557830287FF583B8D91','ARCHIVED','2018-02-16 00:00:00',0), ('2018_03_16_00_characters.sql','722EAFB7F508882F584DCAE61F97F1A11EDE126E','ARCHIVED','2018-03-16 00:00:00',0), ('2018_03_25_00_characters.sql','4FE3C6866A6DCD4926D451F6009464D290C2EF1F','ARCHIVED','2018-03-25 00:00:00',0), -('2018_04_15_00_characters.sql','F7058DE71A2BD3B31088AE586ACB3ECB2EB5A268','ARCHIVED','2018-04-15 00:00:00',0); +('2018_04_15_00_characters.sql','F7058DE71A2BD3B31088AE586ACB3ECB2EB5A268','ARCHIVED','2018-04-15 00:00:00',0), +('2018_05_15_00_characters.sql','1FC906E4C7E86DCA67243F0768A94825A2C9E323','ARCHIVED','2018-05-15 00:00:00',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/auth/4.3.4/2018_04_15_00_auth.sql b/sql/old/4.3.4/auth/29_2018_05_15/2018_04_15_00_auth.sql similarity index 100% rename from sql/updates/auth/4.3.4/2018_04_15_00_auth.sql rename to sql/old/4.3.4/auth/29_2018_05_15/2018_04_15_00_auth.sql diff --git a/sql/updates/characters/4.3.4/2018_04_15_00_characters.sql b/sql/old/4.3.4/characters/29_2018_05_15/2018_04_15_00_characters.sql similarity index 100% rename from sql/updates/characters/4.3.4/2018_04_15_00_characters.sql rename to sql/old/4.3.4/characters/29_2018_05_15/2018_04_15_00_characters.sql diff --git a/sql/updates/world/4.3.4/2018_04_15_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_15_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_15_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_15_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_15_01_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_15_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_15_01_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_15_01_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_15_02_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_15_02_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_15_02_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_15_02_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_15_03_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_15_03_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_15_03_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_15_03_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_15_04_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_15_04_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_15_04_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_15_04_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_16_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_16_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_16_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_16_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_16_01_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_16_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_16_01_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_16_01_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_17_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_17_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_17_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_17_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_17_01_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_17_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_17_01_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_17_01_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_17_02_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_17_02_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_17_02_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_17_02_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_17_03_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_17_03_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_17_03_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_17_03_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_18_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_18_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_18_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_18_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_21_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_21_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_21_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_21_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_21_01_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_21_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_21_01_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_21_01_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_21_02_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_21_02_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_21_02_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_21_02_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_21_03_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_21_03_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_21_03_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_21_03_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_23_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_23_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_23_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_23_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_25_00_world_from_335_was_2018_04_17_00_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_25_00_world_from_335_was_2018_04_17_00_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_25_00_world_from_335_was_2018_04_17_00_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_25_00_world_from_335_was_2018_04_17_00_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_04_25_01_world_from_335_was_2018_04_17_01_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_25_01_world_from_335_was_2018_04_17_01_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_25_01_world_from_335_was_2018_04_17_01_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_25_01_world_from_335_was_2018_04_17_01_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_04_25_02_world_from_335_was_2018_04_17_02_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_25_02_world_from_335_was_2018_04_17_02_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_25_02_world_from_335_was_2018_04_17_02_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_25_02_world_from_335_was_2018_04_17_02_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_04_25_03_world_from_335_was_2018_04_17_03_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_25_03_world_from_335_was_2018_04_17_03_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_25_03_world_from_335_was_2018_04_17_03_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_25_03_world_from_335_was_2018_04_17_03_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_04_25_04_world_from_335_was_2018_04_22_00_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_25_04_world_from_335_was_2018_04_22_00_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_25_04_world_from_335_was_2018_04_22_00_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_25_04_world_from_335_was_2018_04_22_00_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_04_25_05_world_from_335_was_2018_04_24_00_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_25_05_world_from_335_was_2018_04_24_00_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_25_05_world_from_335_was_2018_04_24_00_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_25_05_world_from_335_was_2018_04_24_00_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_04_26_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_26_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_26_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_26_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_29_00_world_from_335_was_2018_04_26_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_29_00_world_from_335_was_2018_04_26_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_29_00_world_from_335_was_2018_04_26_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_29_00_world_from_335_was_2018_04_26_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_05_03_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_03_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_05_03_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_05_03_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_05_12_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_05_12_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_05_12_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_05_12_01_world_from_335_was_2018_05_08_00_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_01_world_from_335_was_2018_05_08_00_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_05_12_01_world_from_335_was_2018_05_08_00_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_05_12_01_world_from_335_was_2018_05_08_00_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_05_12_02_world_from_335_was_2018_05_08_01_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_02_world_from_335_was_2018_05_08_01_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_05_12_02_world_from_335_was_2018_05_08_01_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_05_12_02_world_from_335_was_2018_05_08_01_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_05_12_03_world_from_335_was_2018_05_08_02_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_03_world_from_335_was_2018_05_08_02_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_05_12_03_world_from_335_was_2018_05_08_02_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_05_12_03_world_from_335_was_2018_05_08_02_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_05_12_04_world_from_335_was_2018_05_08_03_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_04_world_from_335_was_2018_05_08_03_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_05_12_04_world_from_335_was_2018_05_08_03_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_05_12_04_world_from_335_was_2018_05_08_03_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_05_12_05_world_from_335_was_2018_05_08_04_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_05_world_from_335_was_2018_05_08_04_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_05_12_05_world_from_335_was_2018_05_08_04_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_05_12_05_world_from_335_was_2018_05_08_04_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_05_12_06_world_from_335_was_2018_05_08_05_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_06_world_from_335_was_2018_05_08_05_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_05_12_06_world_from_335_was_2018_05_08_05_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_05_12_06_world_from_335_was_2018_05_08_05_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_05_12_07_world_from_335_was_2018_05_08_06_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_07_world_from_335_was_2018_05_08_06_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_05_12_07_world_from_335_was_2018_05_08_06_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_05_12_07_world_from_335_was_2018_05_08_06_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_05_12_08_world_from_335_was_2018_05_08_07_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_08_world_from_335_was_2018_05_08_07_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_05_12_08_world_from_335_was_2018_05_08_07_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_05_12_08_world_from_335_was_2018_05_08_07_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_05_12_09_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_09_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_05_12_09_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_05_12_09_world.sql diff --git a/sql/updates/world/4.3.4/2018_05_12_10_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_10_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_05_12_10_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_05_12_10_world.sql diff --git a/sql/updates/world/4.3.4/2018_05_12_11_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_11_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_05_12_11_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_05_12_11_world.sql diff --git a/sql/updates/world/4.3.4/2018_05_13_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_13_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_05_13_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_05_13_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_05_13_01_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_13_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_05_13_01_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_05_13_01_world.sql diff --git a/sql/updates/world/4.3.4/2018_05_14_00_world_from_335_was_2018_05_13_00_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_14_00_world_from_335_was_2018_05_13_00_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_05_14_00_world_from_335_was_2018_05_13_00_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_05_14_00_world_from_335_was_2018_05_13_00_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_05_14_01_world_from_335_was_2018_05_14_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_14_01_world_from_335_was_2018_05_14_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_05_14_01_world_from_335_was_2018_05_14_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_05_14_01_world_from_335_was_2018_05_14_00_world.sql diff --git a/sql/updates/auth/2018_05_15_00_auth.sql b/sql/updates/auth/2018_05_15_00_auth.sql new file mode 100644 index 00000000000..2f1965a664a --- /dev/null +++ b/sql/updates/auth/2018_05_15_00_auth.sql @@ -0,0 +1,2 @@ +-- TDB 4.3.4-30 auth database +UPDATE `updates` SET `state`='ARCHIVED'; diff --git a/sql/updates/characters/2018_05_15_00_characters.sql b/sql/updates/characters/2018_05_15_00_characters.sql new file mode 100644 index 00000000000..f6c105d043c --- /dev/null +++ b/sql/updates/characters/2018_05_15_00_characters.sql @@ -0,0 +1,2 @@ +-- TDB 4.3.4-30 characters database +UPDATE `updates` SET `state`='ARCHIVED'; From 853928d3ed4a490121af24de96f7d89a11e9a590 Mon Sep 17 00:00:00 2001 From: Killyana Date: Tue, 15 May 2018 16:22:14 +0200 Subject: [PATCH 34/35] DB/Creature: Stormwind Royal Guard --- sql/updates/world/2018_05_15_00_world.sql | 95 +++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 sql/updates/world/2018_05_15_00_world.sql diff --git a/sql/updates/world/2018_05_15_00_world.sql b/sql/updates/world/2018_05_15_00_world.sql new file mode 100644 index 00000000000..b814627f7ef --- /dev/null +++ b/sql/updates/world/2018_05_15_00_world.sql @@ -0,0 +1,95 @@ +-- +DELETE FROM `creature` WHERE `guid` IN (280662,280655,280654,280659,280657,280658,280656,280661,280660); +DELETE FROM `creature_addon` WHERE `guid` IN (280662,280655,280654,280659,280657,280658,280656,280661,280660); +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-9119.9,`position_y`=390.402,`position_z`=91.8667 WHERE `guid`=280791; +UPDATE `creature` SET `spawndist`=0,`MovementType`=0,`position_x`=-9119.9,`position_y`=390.402,`position_z`=91.8667 WHERE `guid` IN (280796,280794,280795,280793,280792,280798,280799,280797); +DELETE FROM `creature_addon` WHERE `guid` IN (280791,280796,280794,280795,280793,280792,280798,280799,280797); +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(280796,0,29284,0,1,0, '78855'), +(280794,0,29284,0,1,0, '78855'), +(280795,0,29284,0,1,0, '78855'), +(280793,0,29284,0,1,0, '78855'), +(280792,0,29284,0,1,0, '78855'), +(280798,0,29284,0,1,0, '78855'), +(280799,0,29284,0,1,0, '78855'), +(280797,0,29284,0,1,0, '78855'), +(280791,2807910,29284,0,1,0, '78855'); + +DELETE FROM `creature_formations` WHERE `leaderGUID`=280791; +INSERT INTO `creature_formations` (`leaderGUID`,`memberGUID`,`dist`,`angle`,`groupAI`,`point_1`,`point_2`) VALUES +(280791, 280791, 0, 0, 515, 0, 0), +(280791, 280796, 3, 90, 515, 0, 0), +(280791, 280794, 3, 270, 515, 0, 0), +(280791, 280795, 5, 45, 515, 0, 0), +(280791, 280793, 5, 315, 515, 0, 0), +(280791, 280792, 4, 360, 515, 0, 0), +(280791, 280798, 8, 360, 515, 0, 0), +(280791, 280799, 9, 22, 515, 0, 0), +(280791, 280797, 9, 344, 515, 0, 0); + +DELETE FROM `smart_scripts` WHERE `entryorguid`=42218 AND `source_type`=0 AND `id`>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 +(42218,0,1,0,4,0,100,0,0,0,0,0,28,78855,0,0,0,0,0,1,0,0,0,0,0,0,0,"Stormwind Royal Guard - On aggro - Remove aura"), +(42218,0,2,0,34,0,100,0,2,58,0,0,41,0,0,0,0,0,0,11,42218,30,0,0,0,0,0,"Stormwind Royal Guard - On movement informer - despawn all guars"); + +DELETE FROM `waypoint_data` WHERE `id`=2807910; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(2807910, 1, -9119.9, 390.402, 91.8667, 0, 0, 0, 0, 100, 0), +(2807910, 2, -9120.68, 389.773, 91.8667, 0, 0, 0, 0, 100, 0), +(2807910, 3, -9136.41, 381.545, 90.6434, 0, 0, 0, 0, 100, 0), +(2807910, 4, -9157.69, 359.5, 89.305, 0, 0, 0, 0, 100, 0), +(2807910, 5, -9174.68, 339.597, 83.9513, 0, 0, 0, 0, 100, 0), +(2807910, 6, -9180.38, 319.033, 79.9367, 0, 0, 0, 0, 100, 0), +(2807910, 7, -9179.4, 282.561, 76.0222, 0, 0, 0, 0, 100, 0), +(2807910, 8, -9186.77, 238.557, 72.4619, 0, 0, 0, 0, 100, 0), +(2807910, 9, -9214.09, 208.528, 69.7846, 0, 0, 0, 0, 100, 0), +(2807910, 10, -9241.48, 173.536, 67.8369, 0, 0, 0, 0, 100, 0), +(2807910, 11, -9263.96, 154.547, 67.2846, 0, 0, 0, 0, 100, 0), +(2807910, 12, -9292.29, 148.413, 66.4168, 0, 0, 0, 0, 100, 0), +(2807910, 13, -9327.91, 130.203, 64.0227, 0, 0, 0, 0, 100, 0), +(2807910, 14, -9348.82, 117.773, 62.7116, 0, 0, 0, 0, 100, 0), +(2807910, 15, -9385.51, 104.726, 59.7012, 0, 0, 0, 0, 100, 0), +(2807910, 16, -9409.12, 92.467, 57.7331, 0, 0, 0, 0, 100, 0), +(2807910, 17, -9435.12, 72.3941, 56.0949, 0, 0, 0, 0, 100, 0), +(2807910, 18, -9454.01, 64.7517, 56.0216, 0, 0, 0, 0, 100, 0), +(2807910, 19, -9483.89, 65.4722, 56.1705, 0, 0, 0, 0, 100, 0), +(2807910, 20, -9491.36, 60.8906, 55.8921, 0, 0, 0, 0, 100, 0), +(2807910, 21, -9504.84, 33.474, 56.3795, 0, 0, 0, 0, 100, 0), +(2807910, 22, -9525.04, -5.62326, 55.8272, 0, 0, 0, 0, 100, 0), +(2807910, 23, -9539.8, -35.5156, 56.431, 0, 0, 0, 0, 100, 0), +(2807910, 24, -9546.57, -61.9184, 57.0113, 0, 0, 0, 0, 100, 0), +(2807910, 25, -9549.15, -101.922, 57.2853, 0, 0, 0, 0, 100, 0), +(2807910, 26, -9551.71, -131.13, 57.3982, 0, 0, 0, 0, 100, 0), +(2807910, 27, -9572.64, -156.448, 57.3927, 0, 0, 0, 0, 100, 0), +(2807910, 28, -9583.48, -186.366, 57.5604, 0, 0, 0, 0, 100, 0), +(2807910, 29, -9598.09, -223.769, 57.2399, 0, 0, 0, 0, 100, 0), +(2807910, 30, -9609.41, -258.146, 57.1602, 0, 0, 0, 0, 100, 0), +(2807910, 31, -9618.23, -294.892, 56.9496, 0, 0, 0, 0, 100, 0), +(2807910, 32, -9620.23, -324.826, 57.5732, 0, 0, 0, 0, 100, 0), +(2807910, 33, -9620.42, -359.37, 57.2582, 0, 0, 0, 0, 100, 0), +(2807910, 34, -9619.54, -392.205, 57.804, 0, 0, 0, 0, 100, 0), +(2807910, 35, -9611.05, -426.469, 57.3709, 0, 0, 0, 0, 100, 0), +(2807910, 36, -9598.08, -453.528, 57.6788, 0, 0, 0, 0, 100, 0), +(2807910, 37, -9588.98, -476.995, 57.7533, 0, 0, 0, 0, 100, 0), +(2807910, 38, -9593.1, -503.181, 57.3872, 0, 0, 0, 0, 100, 0), +(2807910, 39, -9599.22, -512.536, 57.3586, 0, 0, 0, 0, 100, 0), +(2807910, 40, -9610.61, -530.849, 54.8333, 0, 0, 0, 0, 100, 0), +(2807910, 41, -9616.64, -555.116, 54.4425, 0, 0, 0, 0, 100, 0), +(2807910, 42, -9621.07, -599.967, 52.7582, 0, 0, 0, 0, 100, 0), +(2807910, 43, -9623.73, -630.854, 51.541, 0, 0, 0, 0, 100, 0), +(2807910, 44, -9641.07, -661.401, 49.3346, 0, 0, 0, 0, 100, 0), +(2807910, 45, -9648.89, -693.67, 46.7381, 0, 0, 0, 0, 100, 0), +(2807910, 46, -9655.99, -725.42, 44.418, 0, 0, 0, 0, 100, 0), +(2807910, 47, -9653.45, -752.071, 44.5802, 0, 0, 0, 0, 100, 0), +(2807910, 48, -9651.89, -780.089, 44.3004, 0, 0, 0, 0, 100, 0), +(2807910, 49, -9647.31, -797.179, 43.5314, 0, 0, 0, 0, 100, 0), +(2807910, 50, -9631.43, -817.967, 43.8334, 0, 0, 0, 0, 100, 0), +(2807910, 51, -9606.31, -843.512, 43.7135, 0, 0, 0, 0, 100, 0), +(2807910, 52, -9586.62, -866.698, 43.743, 0, 0, 0, 0, 100, 0), +(2807910, 53, -9581.56, -898.13, 43.6025, 0, 0, 0, 0, 100, 0), +(2807910, 54, -9587.17, -930.189, 43.328, 0, 0, 0, 0, 100, 0), +(2807910, 55, -9611.5, -962.557, 43.7248, 0, 0, 0, 0, 100, 0), +(2807910, 56, -9618.83, -979.495, 43.7668, 0, 0, 0, 0, 100, 0), +(2807910, 57, -9621.49, -1000.79, 42.2443, 0, 0, 0, 0, 100, 0), +(2807910, 58, -9619.17, -1033.02, 39.6984, 0, 0, 0, 0, 100, 0), +(2807910, 59, -9619.17, -1033.02, 39.6984, 0, 0, 0, 0, 100, 0); From d56875f414e4ffd47ccd3aa698dd0b6154e6eae4 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Tue, 15 May 2018 16:29:03 +0200 Subject: [PATCH 35/35] missing part --- sql/updates/auth/{ => 4.3.4}/2018_05_15_00_auth.sql | 0 .../characters/{ => 4.3.4}/2018_05_15_00_characters.sql | 0 sql/updates/world/4.3.4/2018_05_15_00_world.sql | 3 +++ .../{2018_05_15_00_world.sql => 4.3.4/2018_05_15_01_world.sql} | 0 4 files changed, 3 insertions(+) rename sql/updates/auth/{ => 4.3.4}/2018_05_15_00_auth.sql (100%) rename sql/updates/characters/{ => 4.3.4}/2018_05_15_00_characters.sql (100%) create mode 100644 sql/updates/world/4.3.4/2018_05_15_00_world.sql rename sql/updates/world/{2018_05_15_00_world.sql => 4.3.4/2018_05_15_01_world.sql} (100%) diff --git a/sql/updates/auth/2018_05_15_00_auth.sql b/sql/updates/auth/4.3.4/2018_05_15_00_auth.sql similarity index 100% rename from sql/updates/auth/2018_05_15_00_auth.sql rename to sql/updates/auth/4.3.4/2018_05_15_00_auth.sql diff --git a/sql/updates/characters/2018_05_15_00_characters.sql b/sql/updates/characters/4.3.4/2018_05_15_00_characters.sql similarity index 100% rename from sql/updates/characters/2018_05_15_00_characters.sql rename to sql/updates/characters/4.3.4/2018_05_15_00_characters.sql diff --git a/sql/updates/world/4.3.4/2018_05_15_00_world.sql b/sql/updates/world/4.3.4/2018_05_15_00_world.sql new file mode 100644 index 00000000000..45908f53347 --- /dev/null +++ b/sql/updates/world/4.3.4/2018_05_15_00_world.sql @@ -0,0 +1,3 @@ +UPDATE `version` SET `db_version`='TDB 434.30', `cache_id`=30 LIMIT 1; + +UPDATE `updates` SET `state`='ARCHIVED'; diff --git a/sql/updates/world/2018_05_15_00_world.sql b/sql/updates/world/4.3.4/2018_05_15_01_world.sql similarity index 100% rename from sql/updates/world/2018_05_15_00_world.sql rename to sql/updates/world/4.3.4/2018_05_15_01_world.sql