--HG-- branch : trunk rename : src/server/authserver/AuthCodes.cpp => src/server/authserver/Authentication/AuthCodes.cpp rename : src/server/authserver/AuthCodes.h => src/server/authserver/Authentication/AuthCodes.h rename : src/server/authserver/RealmList.cpp => src/server/authserver/Realms/RealmList.cpp rename : src/server/authserver/RealmList.h => src/server/authserver/Realms/RealmList.h rename : src/server/authserver/AuthSocket.cpp => src/server/authserver/Server/AuthSocket.cpp rename : src/server/authserver/AuthSocket.h => src/server/authserver/Server/AuthSocket.h rename : src/server/authserver/RealmAcceptor.h => src/server/authserver/Server/RealmAcceptor.h rename : src/server/authserver/RealmSocket.cpp => src/server/authserver/Server/RealmSocket.cpp rename : src/server/authserver/RealmSocket.h => src/server/authserver/Server/RealmSocket.h rename : src/server/game/AI/CombatAI.cpp => src/server/game/AI/CoreAI/CombatAI.cpp rename : src/server/game/AI/CombatAI.h => src/server/game/AI/CoreAI/CombatAI.h rename : src/server/game/AI/GuardAI.cpp => src/server/game/AI/CoreAI/GuardAI.cpp rename : src/server/game/AI/GuardAI.h => src/server/game/AI/CoreAI/GuardAI.h rename : src/server/game/AI/PassiveAI.cpp => src/server/game/AI/CoreAI/PassiveAI.cpp rename : src/server/game/AI/PassiveAI.h => src/server/game/AI/CoreAI/PassiveAI.h rename : src/server/game/AI/PetAI.cpp => src/server/game/AI/CoreAI/PetAI.cpp rename : src/server/game/AI/PetAI.h => src/server/game/AI/CoreAI/PetAI.h rename : src/server/game/AI/ReactorAI.cpp => src/server/game/AI/CoreAI/ReactorAI.cpp rename : src/server/game/AI/ReactorAI.h => src/server/game/AI/CoreAI/ReactorAI.h rename : src/server/game/AI/TotemAI.cpp => src/server/game/AI/CoreAI/TotemAI.cpp rename : src/server/game/AI/TotemAI.h => src/server/game/AI/CoreAI/TotemAI.h rename : src/server/game/AI/UnitAI.cpp => src/server/game/AI/CoreAI/UnitAI.cpp rename : src/server/game/AI/UnitAI.h => src/server/game/AI/CoreAI/UnitAI.h rename : src/server/game/Account/AccountMgr.cpp => src/server/game/Accounts/AccountMgr.cpp rename : src/server/game/Account/AccountMgr.h => src/server/game/Accounts/AccountMgr.h rename : src/server/game/AI/AuctionHouseBot/AuctionHouseBot.cpp => src/server/game/AuctionHouse/AuctionHouseBot/AuctionHouseBot.cpp rename : src/server/game/AI/AuctionHouseBot/AuctionHouseBot.h => src/server/game/AuctionHouse/AuctionHouseBot/AuctionHouseBot.h rename : src/server/game/BattleGrounds/BattleGroundAA.cpp => src/server/game/BattleGrounds/Zones/BattleGroundAA.cpp rename : src/server/game/BattleGrounds/BattleGroundAA.h => src/server/game/BattleGrounds/Zones/BattleGroundAA.h rename : src/server/game/BattleGrounds/BattleGroundAB.cpp => src/server/game/BattleGrounds/Zones/BattleGroundAB.cpp rename : src/server/game/BattleGrounds/BattleGroundAB.h => src/server/game/BattleGrounds/Zones/BattleGroundAB.h rename : src/server/game/BattleGrounds/BattleGroundAV.cpp => src/server/game/BattleGrounds/Zones/BattleGroundAV.cpp rename : src/server/game/BattleGrounds/BattleGroundAV.h => src/server/game/BattleGrounds/Zones/BattleGroundAV.h rename : src/server/game/BattleGrounds/BattleGroundBE.cpp => src/server/game/BattleGrounds/Zones/BattleGroundBE.cpp rename : src/server/game/BattleGrounds/BattleGroundBE.h => src/server/game/BattleGrounds/Zones/BattleGroundBE.h rename : src/server/game/BattleGrounds/BattleGroundDS.cpp => src/server/game/BattleGrounds/Zones/BattleGroundDS.cpp rename : src/server/game/BattleGrounds/BattleGroundDS.h => src/server/game/BattleGrounds/Zones/BattleGroundDS.h rename : src/server/game/BattleGrounds/BattleGroundEY.cpp => src/server/game/BattleGrounds/Zones/BattleGroundEY.cpp rename : src/server/game/BattleGrounds/BattleGroundEY.h => src/server/game/BattleGrounds/Zones/BattleGroundEY.h rename : src/server/game/BattleGrounds/BattleGroundIC.cpp => src/server/game/BattleGrounds/Zones/BattleGroundIC.cpp rename : src/server/game/BattleGrounds/BattleGroundIC.h => src/server/game/BattleGrounds/Zones/BattleGroundIC.h rename : src/server/game/BattleGrounds/BattleGroundNA.cpp => src/server/game/BattleGrounds/Zones/BattleGroundNA.cpp rename : src/server/game/BattleGrounds/BattleGroundNA.h => src/server/game/BattleGrounds/Zones/BattleGroundNA.h rename : src/server/game/BattleGrounds/BattleGroundRB.cpp => src/server/game/BattleGrounds/Zones/BattleGroundRB.cpp rename : src/server/game/BattleGrounds/BattleGroundRB.h => src/server/game/BattleGrounds/Zones/BattleGroundRB.h rename : src/server/game/BattleGrounds/BattleGroundRL.cpp => src/server/game/BattleGrounds/Zones/BattleGroundRL.cpp rename : src/server/game/BattleGrounds/BattleGroundRL.h => src/server/game/BattleGrounds/Zones/BattleGroundRL.h rename : src/server/game/BattleGrounds/BattleGroundRV.cpp => src/server/game/BattleGrounds/Zones/BattleGroundRV.cpp rename : src/server/game/BattleGrounds/BattleGroundRV.h => src/server/game/BattleGrounds/Zones/BattleGroundRV.h rename : src/server/game/BattleGrounds/BattleGroundSA.cpp => src/server/game/BattleGrounds/Zones/BattleGroundSA.cpp rename : src/server/game/BattleGrounds/BattleGroundSA.h => src/server/game/BattleGrounds/Zones/BattleGroundSA.h rename : src/server/game/BattleGrounds/BattleGroundWS.cpp => src/server/game/BattleGrounds/Zones/BattleGroundWS.cpp rename : src/server/game/BattleGrounds/BattleGroundWS.h => src/server/game/BattleGrounds/Zones/BattleGroundWS.h rename : src/server/game/Chat/Channel.cpp => src/server/game/Chat/Channels/Channel.cpp rename : src/server/game/Chat/Channel.h => src/server/game/Chat/Channels/Channel.h rename : src/server/game/Chat/ChannelMgr.cpp => src/server/game/Chat/Channels/ChannelMgr.cpp rename : src/server/game/Chat/ChannelMgr.h => src/server/game/Chat/Channels/ChannelMgr.h rename : src/server/game/Chat/Debugcmds.cpp => src/server/game/Chat/Commands/Debugcmds.cpp rename : src/server/game/Chat/Level0.cpp => src/server/game/Chat/Commands/Level0.cpp rename : src/server/game/Chat/Level1.cpp => src/server/game/Chat/Commands/Level1.cpp rename : src/server/game/Chat/Level2.cpp => src/server/game/Chat/Commands/Level2.cpp rename : src/server/game/Chat/Level3.cpp => src/server/game/Chat/Commands/Level3.cpp rename : src/server/shared/vmap/BIH.cpp => src/server/game/CollisionDetection/BIH.cpp rename : src/server/shared/vmap/BIH.h => src/server/game/CollisionDetection/BIH.h rename : src/server/shared/vmap/CMakeLists.txt => src/server/game/CollisionDetection/CMakeLists.txt rename : src/server/shared/vmap/IVMapManager.h => src/server/game/CollisionDetection/IVMapManager.h rename : src/server/shared/vmap/MapTree.cpp => src/server/game/CollisionDetection/MapTree.cpp rename : src/server/shared/vmap/MapTree.h => src/server/game/CollisionDetection/MapTree.h rename : src/server/shared/vmap/ModelInstance.cpp => src/server/game/CollisionDetection/ModelInstance.cpp rename : src/server/shared/vmap/ModelInstance.h => src/server/game/CollisionDetection/ModelInstance.h rename : src/server/shared/vmap/TileAssembler.cpp => src/server/game/CollisionDetection/TileAssembler.cpp rename : src/server/shared/vmap/TileAssembler.h => src/server/game/CollisionDetection/TileAssembler.h rename : src/server/shared/vmap/VMapDefinitions.h => src/server/game/CollisionDetection/VMapDefinitions.h rename : src/server/shared/vmap/VMapFactory.cpp => src/server/game/CollisionDetection/VMapFactory.cpp rename : src/server/shared/vmap/VMapFactory.h => src/server/game/CollisionDetection/VMapFactory.h rename : src/server/shared/vmap/VMapManager2.cpp => src/server/game/CollisionDetection/VMapManager2.cpp rename : src/server/shared/vmap/VMapManager2.h => src/server/game/CollisionDetection/VMapManager2.h rename : src/server/shared/vmap/VMapTools.h => src/server/game/CollisionDetection/VMapTools.h rename : src/server/shared/vmap/WorldModel.cpp => src/server/game/CollisionDetection/WorldModel.cpp rename : src/server/shared/vmap/WorldModel.h => src/server/game/CollisionDetection/WorldModel.h rename : src/server/game/Events/UnitEvents.h => src/server/game/Combat/UnitEvents.h rename : src/server/game/ConditionMgr/ConditionMgr.cpp => src/server/game/Conditions/ConditionMgr.cpp rename : src/server/game/ConditionMgr/ConditionMgr.h => src/server/game/Conditions/ConditionMgr.h rename : src/server/game/LookingForGroup/LFG.h => src/server/game/DungeonFinding/LFG.h rename : src/server/game/LookingForGroup/LFGMgr.cpp => src/server/game/DungeonFinding/LFGMgr.cpp rename : src/server/game/LookingForGroup/LFGMgr.h => src/server/game/DungeonFinding/LFGMgr.h rename : src/server/game/Entities/Object/Corpse.cpp => src/server/game/Entities/Corpse/Corpse.cpp rename : src/server/game/Entities/Object/Corpse.h => src/server/game/Entities/Corpse/Corpse.h rename : src/server/game/Entities/Object/DynamicObject.cpp => src/server/game/Entities/DynamicObject/DynamicObject.cpp rename : src/server/game/Entities/Object/DynamicObject.h => src/server/game/Entities/DynamicObject/DynamicObject.h rename : src/server/game/Entities/Item/Bag.cpp => src/server/game/Entities/Item/Container/Bag.cpp rename : src/server/game/Entities/Item/Bag.h => src/server/game/Entities/Item/Container/Bag.h rename : src/server/game/Map/ObjectPosSelector.cpp => src/server/game/Entities/Object/ObjectPosSelector.cpp rename : src/server/game/Map/ObjectPosSelector.h => src/server/game/Entities/Object/ObjectPosSelector.h rename : src/server/game/Entities/Object/UpdateData.cpp => src/server/game/Entities/Object/Updates/UpdateData.cpp rename : src/server/game/Entities/Object/UpdateData.h => src/server/game/Entities/Object/Updates/UpdateData.h rename : src/server/game/Entities/Object/UpdateFields.h => src/server/game/Entities/Object/Updates/UpdateFields.h rename : src/server/game/Entities/Object/UpdateMask.h => src/server/game/Entities/Object/Updates/UpdateMask.h rename : src/server/game/Movement/Transports.cpp => src/server/game/Entities/Transport/Transports.cpp rename : src/server/game/Movement/Transports.h => src/server/game/Entities/Transport/Transports.h rename : src/server/game/Events/GlobalEvents.cpp => src/server/game/Globals/GlobalEvents.cpp rename : src/server/game/Events/GlobalEvents.h => src/server/game/Globals/GlobalEvents.h rename : src/server/game/Entities/Object/ObjectAccessor.cpp => src/server/game/Globals/ObjectAccessor.cpp rename : src/server/game/Entities/Object/ObjectAccessor.h => src/server/game/Globals/ObjectAccessor.h rename : src/server/game/Entities/Object/ObjectMgr.cpp => src/server/game/Globals/ObjectMgr.cpp rename : src/server/game/Entities/Object/ObjectMgr.h => src/server/game/Globals/ObjectMgr.h rename : src/server/game/Map/Cell/Cell.h => src/server/game/Maps/Cell/Cell.h rename : src/server/game/Map/Cell/CellImpl.h => src/server/game/Maps/Cell/CellImpl.h rename : src/server/game/Map/Grid/GridDefines.h => src/server/game/Maps/Grid/GridDefines.h rename : src/server/game/Map/Grid/GridNotifiers.cpp => src/server/game/Maps/Grid/GridNotifiers.cpp rename : src/server/game/Map/Grid/GridNotifiers.h => src/server/game/Maps/Grid/GridNotifiers.h rename : src/server/game/Map/Grid/GridNotifiersImpl.h => src/server/game/Maps/Grid/GridNotifiersImpl.h rename : src/server/game/Map/Grid/GridStates.cpp => src/server/game/Maps/Grid/GridStates.cpp rename : src/server/game/Map/Grid/GridStates.h => src/server/game/Maps/Grid/GridStates.h rename : src/server/game/Map/Grid/ObjectGridLoader.cpp => src/server/game/Maps/Grid/ObjectGridLoader.cpp rename : src/server/game/Map/Grid/ObjectGridLoader.h => src/server/game/Maps/Grid/ObjectGridLoader.h rename : src/server/game/Map/Map.cpp => src/server/game/Maps/Map.cpp rename : src/server/game/Map/Map.h => src/server/game/Maps/Map.h rename : src/server/game/Map/MapInstanced.cpp => src/server/game/Maps/MapInstanced.cpp rename : src/server/game/Map/MapInstanced.h => src/server/game/Maps/MapInstanced.h rename : src/server/game/Map/MapManager.cpp => src/server/game/Maps/MapManager.cpp rename : src/server/game/Map/MapManager.h => src/server/game/Maps/MapManager.h rename : src/server/game/Map/MapRefManager.h => src/server/game/Maps/MapRefManager.h rename : src/server/game/Map/MapReference.h => src/server/game/Maps/MapReference.h rename : src/server/game/Map/MapUpdater.cpp => src/server/game/Maps/MapUpdater.cpp rename : src/server/game/Map/MapUpdater.h => src/server/game/Maps/MapUpdater.h rename : src/server/game/Map/ZoneScript.h => src/server/game/Maps/ZoneScript.h rename : src/server/game/Globals/Formulas.h => src/server/game/Miscellaneous/Formulas.h rename : src/server/game/Globals/Language.h => src/server/game/Miscellaneous/Language.h rename : src/server/game/Globals/SharedDefines.h => src/server/game/Miscellaneous/SharedDefines.h rename : src/server/game/Movement/MovementGenerators/MovementGenerator.cpp => src/server/game/Movement/MovementGenerator.cpp rename : src/server/game/Movement/MovementGenerators/MovementGenerator.h => src/server/game/Movement/MovementGenerator.h rename : src/server/game/Movement/MovementGenerators/MovementGeneratorImpl.h => src/server/game/Movement/MovementGeneratorImpl.h rename : src/server/game/Movement/Path.h => src/server/game/Movement/Waypoints/Path.h rename : src/server/game/Movement/WaypointManager.cpp => src/server/game/Movement/Waypoints/WaypointManager.cpp rename : src/server/game/Movement/WaypointManager.h => src/server/game/Movement/Waypoints/WaypointManager.h rename : src/server/game/OutdoorPvP/OutdoorPvPEP.cpp => src/server/game/OutdoorPvP/Zones/OutdoorPvPEP.cpp rename : src/server/game/OutdoorPvP/OutdoorPvPEP.h => src/server/game/OutdoorPvP/Zones/OutdoorPvPEP.h rename : src/server/game/OutdoorPvP/OutdoorPvPHP.cpp => src/server/game/OutdoorPvP/Zones/OutdoorPvPHP.cpp rename : src/server/game/OutdoorPvP/OutdoorPvPHP.h => src/server/game/OutdoorPvP/Zones/OutdoorPvPHP.h rename : src/server/game/OutdoorPvP/OutdoorPvPNA.cpp => src/server/game/OutdoorPvP/Zones/OutdoorPvPNA.cpp rename : src/server/game/OutdoorPvP/OutdoorPvPNA.h => src/server/game/OutdoorPvP/Zones/OutdoorPvPNA.h rename : src/server/game/OutdoorPvP/OutdoorPvPSI.cpp => src/server/game/OutdoorPvP/Zones/OutdoorPvPSI.cpp rename : src/server/game/OutdoorPvP/OutdoorPvPSI.h => src/server/game/OutdoorPvP/Zones/OutdoorPvPSI.h rename : src/server/game/OutdoorPvP/OutdoorPvPTF.cpp => src/server/game/OutdoorPvP/Zones/OutdoorPvPTF.cpp rename : src/server/game/OutdoorPvP/OutdoorPvPTF.h => src/server/game/OutdoorPvP/Zones/OutdoorPvPTF.h rename : src/server/game/OutdoorPvP/OutdoorPvPZM.cpp => src/server/game/OutdoorPvP/Zones/OutdoorPvPZM.cpp rename : src/server/game/OutdoorPvP/OutdoorPvPZM.h => src/server/game/OutdoorPvP/Zones/OutdoorPvPZM.h rename : src/server/game/PrecompiledHeaders/pchlinux.cpp => src/server/game/PrecompiledHeaders/NixCorePCH.cpp rename : src/server/game/PrecompiledHeaders/pchlinux.h => src/server/game/PrecompiledHeaders/NixCorePCH.h rename : src/server/game/ScriptMgr/ScriptedPch.cpp => src/server/game/PrecompiledHeaders/ScriptPCH.cpp rename : src/server/game/ScriptMgr/ScriptedPch.h => src/server/game/PrecompiledHeaders/ScriptPCH.h rename : src/server/game/PrecompiledHeaders/pchdef.cpp => src/server/game/PrecompiledHeaders/WinCorePCH.cpp rename : src/server/game/PrecompiledHeaders/pchdef.h => src/server/game/PrecompiledHeaders/WinCorePCH.h rename : src/server/game/ScriptMgr/ScriptLoader.cpp => src/server/game/Scripting/ScriptLoader.cpp rename : src/server/game/ScriptMgr/ScriptLoader.h => src/server/game/Scripting/ScriptLoader.h rename : src/server/game/ScriptMgr/ScriptMgr.cpp => src/server/game/Scripting/ScriptMgr.cpp rename : src/server/game/ScriptMgr/ScriptMgr.h => src/server/game/Scripting/ScriptMgr.h rename : src/server/game/ScriptMgr/ScriptSystem.cpp => src/server/game/Scripting/ScriptSystem.cpp rename : src/server/game/ScriptMgr/ScriptSystem.h => src/server/game/Scripting/ScriptSystem.h rename : src/server/game/Addons/AddonHandler.cpp => src/server/game/Server/Protocol/Handlers/AddonHandler.cpp rename : src/server/game/Addons/AddonHandler.h => src/server/game/Server/Protocol/Handlers/AddonHandler.h rename : src/server/game/BattleGrounds/ArenaTeamHandler.cpp => src/server/game/Server/Protocol/Handlers/ArenaTeamHandler.cpp rename : src/server/game/AuctionHouse/AuctionHouseHandler.cpp => src/server/game/Server/Protocol/Handlers/AuctionHouseHandler.cpp rename : src/server/game/BattleGrounds/BattleGroundHandler.cpp => src/server/game/Server/Protocol/Handlers/BattleGroundHandler.cpp rename : src/server/game/Calender/CalendarHandler.cpp => src/server/game/Server/Protocol/Handlers/CalendarHandler.cpp rename : src/server/game/Chat/ChannelHandler.cpp => src/server/game/Server/Protocol/Handlers/ChannelHandler.cpp rename : src/server/game/Entities/Player/CharacterHandler.cpp => src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp rename : src/server/game/Chat/ChatHandler.cpp => src/server/game/Server/Protocol/Handlers/ChatHandler.cpp rename : src/server/game/Combat/CombatHandler.cpp => src/server/game/Server/Protocol/Handlers/CombatHandler.cpp rename : src/server/game/Entities/Player/DuelHandler.cpp => src/server/game/Server/Protocol/Handlers/DuelHandler.cpp rename : src/server/game/Groups/GroupHandler.cpp => src/server/game/Server/Protocol/Handlers/GroupHandler.cpp rename : src/server/game/Guilds/GuildHandler.cpp => src/server/game/Server/Protocol/Handlers/GuildHandler.cpp rename : src/server/game/Entities/Item/ItemHandler.cpp => src/server/game/Server/Protocol/Handlers/ItemHandler.cpp rename : src/server/game/LookingForGroup/LFGHandler.cpp => src/server/game/Server/Protocol/Handlers/LFGHandler.cpp rename : src/server/game/Loot/LootHandler.cpp => src/server/game/Server/Protocol/Handlers/LootHandler.cpp rename : src/server/game/Entities/Player/MiscHandler.cpp => src/server/game/Server/Protocol/Handlers/MiscHandler.cpp rename : src/server/game/Movement/MovementHandler.cpp => src/server/game/Server/Protocol/Handlers/MovementHandler.cpp rename : src/server/game/Entities/Creature/NPCHandler.cpp => src/server/game/Server/Protocol/Handlers/NPCHandler.cpp rename : src/server/game/Entities/Creature/NPCHandler.h => src/server/game/Server/Protocol/Handlers/NPCHandler.h rename : src/server/game/Entities/Pet/PetHandler.cpp => src/server/game/Server/Protocol/Handlers/PetHandler.cpp rename : src/server/game/Entities/Player/PetitionsHandler.cpp => src/server/game/Server/Protocol/Handlers/PetitionsHandler.cpp rename : src/server/game/Quests/QueryHandler.cpp => src/server/game/Server/Protocol/Handlers/QueryHandler.cpp rename : src/server/game/Quests/QuestHandler.cpp => src/server/game/Server/Protocol/Handlers/QuestHandler.cpp rename : src/server/game/Skills/SkillHandler.cpp => src/server/game/Server/Protocol/Handlers/SkillHandler.cpp rename : src/server/game/Spells/SpellHandler.cpp => src/server/game/Server/Protocol/Handlers/SpellHandler.cpp rename : src/server/game/Movement/TaxiHandler.cpp => src/server/game/Server/Protocol/Handlers/TaxiHandler.cpp rename : src/server/game/Entities/Player/TicketHandler.cpp => src/server/game/Server/Protocol/Handlers/TicketHandler.cpp rename : src/server/game/Entities/Player/TradeHandler.cpp => src/server/game/Server/Protocol/Handlers/TradeHandler.cpp rename : src/server/game/Entities/Player/VoiceChatHandler.cpp => src/server/game/Server/Protocol/Handlers/VoiceChatHandler.cpp rename : src/server/game/Opcodes/Opcodes.cpp => src/server/game/Server/Protocol/Opcodes.cpp rename : src/server/game/Opcodes/Opcodes.h => src/server/game/Server/Protocol/Opcodes.h rename : src/server/game/World/WorldLog.cpp => src/server/game/Server/Protocol/WorldLog.cpp rename : src/server/game/World/WorldLog.h => src/server/game/Server/Protocol/WorldLog.h rename : src/server/game/World/WorldSession.cpp => src/server/game/Server/WorldSession.cpp rename : src/server/game/World/WorldSession.h => src/server/game/Server/WorldSession.h rename : src/server/game/World/WorldSocket.cpp => src/server/game/Server/WorldSocket.cpp rename : src/server/game/World/WorldSocket.h => src/server/game/Server/WorldSocket.h rename : src/server/game/World/WorldSocketMgr.cpp => src/server/game/Server/WorldSocketMgr.cpp rename : src/server/game/World/WorldSocketMgr.h => src/server/game/Server/WorldSocketMgr.h rename : src/server/shared/Config/CMakeLists.txt => src/server/shared/Configuration/CMakeLists.txt rename : src/server/shared/Config/Config.cpp => src/server/shared/Configuration/Config.cpp rename : src/server/shared/Config/Config.h => src/server/shared/Configuration/Config.h rename : src/server/shared/Config/ConfigEnv.h => src/server/shared/Configuration/ConfigEnv.h rename : src/server/shared/Config/ConfigLibrary.vcproj => src/server/shared/Configuration/ConfigLibrary.vcproj rename : src/server/shared/Config/dotconfpp/dotconfpp.cpp => src/server/shared/Configuration/dotconfpp/dotconfpp.cpp rename : src/server/shared/Config/dotconfpp/dotconfpp.h => src/server/shared/Configuration/dotconfpp/dotconfpp.h rename : src/server/shared/Config/dotconfpp/mempool.cpp => src/server/shared/Configuration/dotconfpp/mempool.cpp rename : src/server/shared/Config/dotconfpp/mempool.h => src/server/shared/Configuration/dotconfpp/mempool.h rename : src/server/shared/Auth/SARC4.cpp => src/server/shared/Cryptography/ARC4.cpp rename : src/server/shared/Auth/SARC4.h => src/server/shared/Cryptography/ARC4.h rename : src/server/shared/Auth/AuthCrypt.cpp => src/server/shared/Cryptography/Authentication/AuthCrypt.cpp rename : src/server/shared/Auth/AuthCrypt.h => src/server/shared/Cryptography/Authentication/AuthCrypt.h rename : src/server/shared/Auth/BigNumber.cpp => src/server/shared/Cryptography/BigNumber.cpp rename : src/server/shared/Auth/BigNumber.h => src/server/shared/Cryptography/BigNumber.h rename : src/server/shared/Auth/CMakeLists.txt => src/server/shared/Cryptography/CMakeLists.txt rename : src/server/shared/Auth/Hmac.cpp => src/server/shared/Cryptography/HMACSHA1.cpp rename : src/server/shared/Auth/Hmac.h => src/server/shared/Cryptography/HMACSHA1.h rename : src/server/shared/Auth/md5.c => src/server/shared/Cryptography/MD5.c rename : src/server/shared/Auth/md5.h => src/server/shared/Cryptography/MD5.h rename : src/server/shared/Auth/Sha1.cpp => src/server/shared/Cryptography/SHA1.cpp rename : src/server/shared/Auth/Sha1.h => src/server/shared/Cryptography/SHA1.h rename : src/server/shared/Database/DBCFileLoader.cpp => src/server/shared/DataStores/DBCFileLoader.cpp rename : src/server/shared/Database/DBCFileLoader.h => src/server/shared/DataStores/DBCFileLoader.h rename : src/server/shared/Database/DBCStore.h => src/server/shared/DataStores/DBCStore.h rename : src/server/shared/Errors.h => src/server/shared/Debugging/Errors.h rename : src/server/shared/MemoryLeaks.cpp => src/server/shared/Debugging/MemoryLeaks.cpp rename : src/server/shared/MemoryLeaks.h => src/server/shared/Debugging/MemoryLeaks.h rename : src/server/shared/WheatyExceptionReport.cpp => src/server/shared/Debugging/WheatyExceptionReport.cpp rename : src/server/shared/WheatyExceptionReport.h => src/server/shared/Debugging/WheatyExceptionReport.h rename : src/server/shared/Log.cpp => src/server/shared/Logging/Log.cpp rename : src/server/shared/Log.h => src/server/shared/Logging/Log.h rename : src/server/shared/ByteBuffer.h => src/server/shared/Packets/ByteBuffer.h rename : src/server/shared/WorldPacket.h => src/server/shared/Packets/WorldPacket.h rename : src/server/shared/DelayExecutor.cpp => src/server/shared/Threading/DelayExecutor.cpp rename : src/server/shared/DelayExecutor.h => src/server/shared/Threading/DelayExecutor.h rename : src/server/shared/LockedQueue.h => src/server/shared/Threading/LockedQueue.h rename : src/server/shared/Threading.cpp => src/server/shared/Threading/Threading.cpp rename : src/server/shared/Threading.h => src/server/shared/Threading/Threading.h rename : src/server/shared/ProgressBar.cpp => src/server/shared/Utilities/ProgressBar.cpp rename : src/server/shared/ProgressBar.h => src/server/shared/Utilities/ProgressBar.h rename : src/server/shared/ServiceWin32.cpp => src/server/shared/Utilities/ServiceWin32.cpp rename : src/server/shared/ServiceWin32.h => src/server/shared/Utilities/ServiceWin32.h rename : src/server/shared/SignalHandler.h => src/server/shared/Utilities/SignalHandler.h rename : src/server/shared/Timer.h => src/server/shared/Utilities/Timer.h rename : src/server/shared/Util.cpp => src/server/shared/Utilities/Util.cpp rename : src/server/shared/Util.h => src/server/shared/Utilities/Util.h rename : src/server/worldserver/CliRunnable.cpp => src/server/worldserver/CommandLine/CliRunnable.cpp rename : src/server/worldserver/CliRunnable.h => src/server/worldserver/CommandLine/CliRunnable.h rename : src/server/worldserver/RASocket.cpp => src/server/worldserver/RemoteAccess/RASocket.cpp rename : src/server/worldserver/RASocket.h => src/server/worldserver/RemoteAccess/RASocket.h rename : src/server/worldserver/WorldRunnable.cpp => src/server/worldserver/WorldThread/WorldRunnable.cpp rename : src/server/worldserver/WorldRunnable.h => src/server/worldserver/WorldThread/WorldRunnable.h
823 lines
29 KiB
C++
823 lines
29 KiB
C++
/*
|
|
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include "BattleGround.h"
|
|
#include "BattleGroundSA.h"
|
|
#include "Language.h"
|
|
#include "Player.h"
|
|
#include "GameObject.h"
|
|
#include "ObjectMgr.h"
|
|
#include "WorldPacket.h"
|
|
|
|
|
|
BattleGroundSA::BattleGroundSA()
|
|
{
|
|
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_SA_START_TWO_MINUTES;
|
|
m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_SA_START_ONE_MINUTE;
|
|
m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_SA_START_HALF_MINUTE;
|
|
m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_SA_HAS_BEGUN;
|
|
m_BgObjects.resize(BG_SA_MAXOBJ);
|
|
m_BgCreatures.resize(BG_SA_MAXNPC + BG_SA_MAX_GY);
|
|
TimerEnabled = false;
|
|
UpdateWaitTimer = 0;
|
|
SignaledRoundTwo = false;
|
|
SignaledRoundTwoHalfMin = false;
|
|
InitSecondRound = false;
|
|
}
|
|
|
|
BattleGroundSA::~BattleGroundSA()
|
|
{
|
|
}
|
|
|
|
void BattleGroundSA::Reset()
|
|
{
|
|
TotalTime = 0;
|
|
attackers = ((urand(0,1)) ? TEAM_ALLIANCE : TEAM_HORDE);
|
|
for (uint8 i = 0; i <= 5; i++)
|
|
GateStatus[i] = BG_SA_GATE_OK;
|
|
ShipsStarted = false;
|
|
status = BG_SA_WARMUP;
|
|
}
|
|
|
|
bool BattleGroundSA::SetupBattleGround()
|
|
{
|
|
return ResetObjs();
|
|
}
|
|
|
|
bool BattleGroundSA::ResetObjs()
|
|
{
|
|
uint32 atF = BG_SA_Factions[attackers];
|
|
uint32 defF = BG_SA_Factions[attackers ? TEAM_ALLIANCE : TEAM_HORDE];
|
|
|
|
|
|
for (uint8 i = 0; i <BG_SA_MAXOBJ; i++)
|
|
DelObject(i);
|
|
|
|
for (uint8 i = 0; i < BG_SA_MAXNPC; i++)
|
|
DelCreature(i);
|
|
|
|
for (uint8 i = BG_SA_MAXNPC; i < BG_SA_MAXNPC + BG_SA_MAX_GY; i++)
|
|
DelCreature(i);
|
|
|
|
for (uint8 i = 0; i < 6; i++)
|
|
GateStatus[i] = BG_SA_GATE_OK;
|
|
|
|
for (uint8 i = 0; i < BG_SA_CENTRAL_FLAG; i++)
|
|
{
|
|
if (!AddObject(i,BG_SA_ObjEntries[i],
|
|
BG_SA_ObjSpawnlocs[i][0],BG_SA_ObjSpawnlocs[i][1],
|
|
BG_SA_ObjSpawnlocs[i][2],BG_SA_ObjSpawnlocs[i][3],
|
|
0,0,0,0,RESPAWN_ONE_DAY))
|
|
return false;
|
|
}
|
|
|
|
//Cannons and demolishers - NPCs are spawned
|
|
//By capturing GYs.
|
|
for (uint8 i = 0; i < BG_SA_NPC_SPARKLIGHT; i++)
|
|
{
|
|
if (!AddCreature(BG_SA_NpcEntries[i], i, (attackers == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE),
|
|
BG_SA_NpcSpawnlocs[i][0],BG_SA_NpcSpawnlocs[i][1],
|
|
BG_SA_NpcSpawnlocs[i][2],BG_SA_NpcSpawnlocs[i][3],600))
|
|
return false;
|
|
}
|
|
|
|
OverrideGunFaction();
|
|
DemolisherStartState(true);
|
|
|
|
for (uint8 i = 0; i <= BG_SA_TITAN_RELIC; i++)
|
|
{
|
|
SpawnBGObject(i, RESPAWN_IMMEDIATELY);
|
|
GetBGObject(i)->SetUInt32Value(GAMEOBJECT_FACTION, defF);
|
|
}
|
|
|
|
GetBGObject(BG_SA_TITAN_RELIC)->SetUInt32Value(GAMEOBJECT_FACTION, atF);
|
|
GetBGObject(BG_SA_TITAN_RELIC)->Refresh();
|
|
|
|
for (uint8 i = 0; i <= 5; i++)
|
|
GateStatus[i] = BG_SA_GATE_OK;
|
|
|
|
// MAD props for Kiper for discovering those values - 4 hours of his work.
|
|
GetBGObject(BG_SA_BOAT_ONE)->UpdateRotationFields(1.0f, 0.0002f);
|
|
GetBGObject(BG_SA_BOAT_TWO)->UpdateRotationFields(1.0f, 0.00001f);
|
|
SpawnBGObject(BG_SA_BOAT_ONE, RESPAWN_IMMEDIATELY);
|
|
SpawnBGObject(BG_SA_BOAT_TWO, RESPAWN_IMMEDIATELY);
|
|
|
|
TotalTime = 0;
|
|
ShipsStarted = false;
|
|
|
|
//Graveyards!
|
|
for (uint8 i = 0;i < BG_SA_MAX_GY; i++)
|
|
{
|
|
WorldSafeLocsEntry const *sg = NULL;
|
|
sg = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]);
|
|
|
|
if (!sg)
|
|
{
|
|
sLog.outError("SOTA: Can't find GY entry %u",BG_SA_GYEntries[i]);
|
|
return false;
|
|
}
|
|
|
|
if (i == BG_SA_BEACH_GY)
|
|
{
|
|
GraveyardStatus[i] = attackers;
|
|
AddSpiritGuide(i + BG_SA_MAXNPC, sg->x, sg->y, sg->z, BG_SA_GYOrientation[i], ((attackers == TEAM_HORDE)? HORDE : ALLIANCE));
|
|
}
|
|
else
|
|
{
|
|
GraveyardStatus[i] = ((attackers == TEAM_HORDE)? TEAM_ALLIANCE : TEAM_HORDE);
|
|
if (!AddSpiritGuide(i + BG_SA_MAXNPC, sg->x, sg->y, sg->z, BG_SA_GYOrientation[i], ((attackers == TEAM_HORDE)? ALLIANCE : HORDE)))
|
|
sLog.outError("SOTA: couldn't spawn GY: %u",i);
|
|
}
|
|
}
|
|
|
|
//GY capture points
|
|
for (uint8 i = BG_SA_CENTRAL_FLAG; i < BG_SA_MAXOBJ; i++)
|
|
{
|
|
AddObject(i, BG_SA_ObjEntries[(i + (attackers == TEAM_ALLIANCE ? 3:0))],
|
|
BG_SA_ObjSpawnlocs[i][0], BG_SA_ObjSpawnlocs[i][1],
|
|
BG_SA_ObjSpawnlocs[i][2], BG_SA_ObjSpawnlocs[i][3],
|
|
0,0,0,0,RESPAWN_ONE_DAY);
|
|
GetBGObject(i)->SetUInt32Value(GAMEOBJECT_FACTION, atF);
|
|
}
|
|
|
|
//Player may enter BEFORE we set up bG - lets update his worldstates anyway...
|
|
UpdateWorldState(BG_SA_RIGHT_GY_HORDE , GraveyardStatus[BG_SA_RIGHT_CAPTURABLE_GY] == TEAM_HORDE?1:0);
|
|
UpdateWorldState(BG_SA_LEFT_GY_HORDE , GraveyardStatus[BG_SA_LEFT_CAPTURABLE_GY] == TEAM_HORDE?1:0);
|
|
UpdateWorldState(BG_SA_CENTER_GY_HORDE , GraveyardStatus[BG_SA_CENTRAL_CAPTURABLE_GY] == TEAM_HORDE?1:0);
|
|
|
|
UpdateWorldState(BG_SA_RIGHT_GY_ALLIANCE , GraveyardStatus[BG_SA_RIGHT_CAPTURABLE_GY] == TEAM_ALLIANCE?1:0);
|
|
UpdateWorldState(BG_SA_LEFT_GY_ALLIANCE , GraveyardStatus[BG_SA_LEFT_CAPTURABLE_GY] == TEAM_ALLIANCE?1:0);
|
|
UpdateWorldState(BG_SA_CENTER_GY_ALLIANCE , GraveyardStatus[BG_SA_CENTRAL_CAPTURABLE_GY] == TEAM_ALLIANCE?1:0);
|
|
|
|
if (attackers == TEAM_ALLIANCE)
|
|
{
|
|
UpdateWorldState(BG_SA_ALLY_ATTACKS, 1);
|
|
UpdateWorldState(BG_SA_HORDE_ATTACKS, 0);
|
|
|
|
UpdateWorldState(BG_SA_RIGHT_ATT_TOKEN_ALL, 1);
|
|
UpdateWorldState(BG_SA_LEFT_ATT_TOKEN_ALL, 1);
|
|
UpdateWorldState(BG_SA_RIGHT_ATT_TOKEN_HRD, 0);
|
|
UpdateWorldState(BG_SA_LEFT_ATT_TOKEN_HRD, 0);
|
|
|
|
UpdateWorldState(BG_SA_HORDE_DEFENCE_TOKEN,1);
|
|
UpdateWorldState(BG_SA_ALLIANCE_DEFENCE_TOKEN,0);
|
|
}
|
|
else
|
|
{
|
|
UpdateWorldState(BG_SA_HORDE_ATTACKS, 1);
|
|
UpdateWorldState(BG_SA_ALLY_ATTACKS, 0);
|
|
|
|
UpdateWorldState(BG_SA_RIGHT_ATT_TOKEN_ALL, 0);
|
|
UpdateWorldState(BG_SA_LEFT_ATT_TOKEN_ALL, 0);
|
|
UpdateWorldState(BG_SA_RIGHT_ATT_TOKEN_HRD, 1);
|
|
UpdateWorldState(BG_SA_LEFT_ATT_TOKEN_HRD, 1);
|
|
|
|
UpdateWorldState(BG_SA_HORDE_DEFENCE_TOKEN,0);
|
|
UpdateWorldState(BG_SA_ALLIANCE_DEFENCE_TOKEN,1);
|
|
}
|
|
|
|
UpdateWorldState(BG_SA_PURPLE_GATEWS, 1);
|
|
UpdateWorldState(BG_SA_RED_GATEWS, 1);
|
|
UpdateWorldState(BG_SA_BLUE_GATEWS, 1);
|
|
UpdateWorldState(BG_SA_GREEN_GATEWS, 1);
|
|
UpdateWorldState(BG_SA_YELLOW_GATEWS, 1);
|
|
UpdateWorldState(BG_SA_ANCIENT_GATEWS, 1);
|
|
|
|
TeleportPlayers();
|
|
return true;
|
|
}
|
|
|
|
void BattleGroundSA::StartShips()
|
|
{
|
|
if (ShipsStarted)
|
|
return;
|
|
|
|
DoorOpen(BG_SA_BOAT_ONE);
|
|
DoorOpen(BG_SA_BOAT_TWO);
|
|
|
|
for (int i = BG_SA_BOAT_ONE; i <= BG_SA_BOAT_TWO; i++)
|
|
{
|
|
for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end();itr++)
|
|
{
|
|
if (Player* p = objmgr.GetPlayer(itr->first))
|
|
{
|
|
if (p->GetTeamId() != attackers)
|
|
continue;
|
|
|
|
UpdateData data;
|
|
WorldPacket pkt;
|
|
GetBGObject(i)->BuildValuesUpdateBlockForPlayer(&data, p);
|
|
data.BuildPacket(&pkt);
|
|
p->GetSession()->SendPacket(&pkt);
|
|
}
|
|
}
|
|
}
|
|
ShipsStarted = true;
|
|
}
|
|
|
|
void BattleGroundSA::Update(uint32 diff)
|
|
{
|
|
if (InitSecondRound)
|
|
{
|
|
if (UpdateWaitTimer < diff)
|
|
{
|
|
if (!SignaledRoundTwo)
|
|
{
|
|
SignaledRoundTwo = true;
|
|
InitSecondRound = false;
|
|
SendMessageToAll(LANG_BG_SA_ROUND_TWO_ONE_MINUTE, CHAT_MSG_BG_SYSTEM_NEUTRAL);
|
|
}
|
|
}else
|
|
{
|
|
UpdateWaitTimer -= diff;
|
|
return;
|
|
}
|
|
}
|
|
BattleGround::Update(diff);
|
|
TotalTime += diff;
|
|
|
|
if (status == BG_SA_WARMUP )
|
|
{
|
|
BG_SA_ENDROUNDTIME = BG_SA_ROUNDLENGTH;
|
|
if (TotalTime >= BG_SA_WARMUPLENGTH)
|
|
{
|
|
TotalTime = 0;
|
|
ToggleTimer();
|
|
DemolisherStartState(false);
|
|
status = BG_SA_ROUND_ONE;
|
|
}
|
|
if (TotalTime >= BG_SA_BOAT_START)
|
|
StartShips();
|
|
return;
|
|
}
|
|
else if (status == BG_SA_SECOND_WARMUP)
|
|
{
|
|
if (RoundScores[0].time<BG_SA_ROUNDLENGTH)
|
|
BG_SA_ENDROUNDTIME = RoundScores[0].time;
|
|
else
|
|
BG_SA_ENDROUNDTIME = BG_SA_ROUNDLENGTH;
|
|
|
|
if (TotalTime >= 60000)
|
|
{
|
|
SendWarningToAll(LANG_BG_SA_HAS_BEGUN);
|
|
TotalTime = 0;
|
|
ToggleTimer();
|
|
DemolisherStartState(false);
|
|
status = BG_SA_ROUND_TWO;
|
|
}
|
|
if (TotalTime >= 30000)
|
|
{
|
|
if (!SignaledRoundTwoHalfMin)
|
|
{
|
|
SignaledRoundTwoHalfMin = true;
|
|
SendMessageToAll(LANG_BG_SA_ROUND_TWO_START_HALF_MINUTE, CHAT_MSG_BG_SYSTEM_NEUTRAL);
|
|
}
|
|
}
|
|
StartShips();
|
|
return;
|
|
}
|
|
else if (GetStatus() == STATUS_IN_PROGRESS)
|
|
{
|
|
if (status == BG_SA_ROUND_ONE)
|
|
{
|
|
if (TotalTime >= BG_SA_ROUNDLENGTH)
|
|
{
|
|
RoundScores[0].winner = attackers;
|
|
RoundScores[0].time = BG_SA_ROUNDLENGTH;
|
|
TotalTime = 0;
|
|
status = BG_SA_SECOND_WARMUP;
|
|
attackers = (attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE;
|
|
status = BG_SA_SECOND_WARMUP;
|
|
ToggleTimer();
|
|
ResetObjs();
|
|
return;
|
|
}
|
|
}
|
|
else if (status == BG_SA_ROUND_TWO)
|
|
{
|
|
if (TotalTime >= BG_SA_ENDROUNDTIME)
|
|
{
|
|
RoundScores[1].time = BG_SA_ROUNDLENGTH;
|
|
RoundScores[1].winner = (attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE;
|
|
|
|
if (RoundScores[0].time == RoundScores[1].time)
|
|
EndBattleGround(NULL);
|
|
else if (RoundScores[0].time < RoundScores[1].time)
|
|
EndBattleGround(RoundScores[0].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE);
|
|
else
|
|
EndBattleGround(RoundScores[1].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE);
|
|
return;
|
|
}
|
|
}
|
|
if (status == BG_SA_ROUND_ONE || status == BG_SA_ROUND_TWO)
|
|
{
|
|
SendTime();
|
|
UpdateDemolisherSpawns();
|
|
}
|
|
}
|
|
}
|
|
|
|
void BattleGroundSA::StartingEventCloseDoors()
|
|
{
|
|
}
|
|
|
|
void BattleGroundSA::StartingEventOpenDoors()
|
|
{
|
|
}
|
|
|
|
void BattleGroundSA::FillInitialWorldStates(WorldPacket& data)
|
|
{
|
|
uint32 ally_attacks = uint32(attackers == TEAM_ALLIANCE ? 1 : 0);
|
|
uint32 horde_attacks = uint32(attackers == TEAM_HORDE ? 1 : 0);
|
|
|
|
data << uint32(BG_SA_ANCIENT_GATEWS) << uint32(GateStatus[BG_SA_ANCIENT_GATE]);
|
|
data << uint32(BG_SA_YELLOW_GATEWS) << uint32(GateStatus[BG_SA_YELLOW_GATE]);
|
|
data << uint32(BG_SA_GREEN_GATEWS) << uint32(GateStatus[BG_SA_GREEN_GATE]);
|
|
data << uint32(BG_SA_BLUE_GATEWS) << uint32(GateStatus[BG_SA_BLUE_GATE]);
|
|
data << uint32(BG_SA_RED_GATEWS) << uint32(GateStatus[BG_SA_RED_GATE]);
|
|
data << uint32(BG_SA_PURPLE_GATEWS) << uint32(GateStatus[BG_SA_PURPLE_GATE]);
|
|
|
|
data << uint32(BG_SA_BONUS_TIMER) << uint32(0);
|
|
|
|
data << uint32(BG_SA_HORDE_ATTACKS)<< horde_attacks;
|
|
data << uint32(BG_SA_ALLY_ATTACKS) << ally_attacks;
|
|
|
|
//Time will be sent on first update...
|
|
data << uint32(BG_SA_ENABLE_TIMER) << ((TimerEnabled) ? uint32(1) : uint32(0));
|
|
data << uint32(BG_SA_TIMER_MINS) << uint32(0);
|
|
data << uint32(BG_SA_TIMER_SEC_TENS) << uint32(0);
|
|
data << uint32(BG_SA_TIMER_SEC_DECS) << uint32(0);
|
|
|
|
data << uint32(BG_SA_RIGHT_GY_HORDE) << uint32(GraveyardStatus[BG_SA_RIGHT_CAPTURABLE_GY] == TEAM_HORDE?1:0);
|
|
data << uint32(BG_SA_LEFT_GY_HORDE) << uint32(GraveyardStatus[BG_SA_LEFT_CAPTURABLE_GY] == TEAM_HORDE?1:0);
|
|
data << uint32(BG_SA_CENTER_GY_HORDE) << uint32(GraveyardStatus[BG_SA_CENTRAL_CAPTURABLE_GY] == TEAM_HORDE?1:0);
|
|
|
|
data << uint32(BG_SA_RIGHT_GY_ALLIANCE) << uint32(GraveyardStatus[BG_SA_RIGHT_CAPTURABLE_GY] == TEAM_ALLIANCE?1:0);
|
|
data << uint32(BG_SA_LEFT_GY_ALLIANCE) << uint32(GraveyardStatus[BG_SA_LEFT_CAPTURABLE_GY] == TEAM_ALLIANCE?1:0);
|
|
data << uint32(BG_SA_CENTER_GY_ALLIANCE) << uint32(GraveyardStatus[BG_SA_CENTRAL_CAPTURABLE_GY] == TEAM_ALLIANCE?1:0);
|
|
|
|
data << uint32(BG_SA_HORDE_DEFENCE_TOKEN) << ally_attacks;
|
|
data << uint32(BG_SA_ALLIANCE_DEFENCE_TOKEN) << horde_attacks;
|
|
|
|
data << uint32(BG_SA_LEFT_ATT_TOKEN_HRD) << horde_attacks;
|
|
data << uint32(BG_SA_RIGHT_ATT_TOKEN_HRD) << horde_attacks;
|
|
data << uint32(BG_SA_RIGHT_ATT_TOKEN_ALL) << ally_attacks;
|
|
data << uint32(BG_SA_LEFT_ATT_TOKEN_ALL) << ally_attacks;
|
|
}
|
|
|
|
void BattleGroundSA::AddPlayer(Player *plr)
|
|
{
|
|
BattleGround::AddPlayer(plr);
|
|
//create score and add it to map, default values are set in constructor
|
|
BattleGroundSAScore* sc = new BattleGroundSAScore;
|
|
|
|
if (!ShipsStarted)
|
|
{
|
|
if (plr->GetTeamId() == attackers)
|
|
{
|
|
plr->CastSpell(plr,12438,true);//Without this player falls before boat loads...
|
|
|
|
if (urand(0,1))
|
|
plr->TeleportTo(607, 2682.936f, -830.368f, 50.0f, 2.895f, 0);
|
|
else
|
|
plr->TeleportTo(607, 2577.003f, 980.261f, 50.0f, 0.807f, 0);
|
|
|
|
}
|
|
else
|
|
plr->TeleportTo(607, 1209.7f, -65.16f, 70.1f, 0.0f, 0);
|
|
}
|
|
else
|
|
{
|
|
if (plr->GetTeamId() == attackers)
|
|
plr->TeleportTo(607, 1600.381f, -106.263f, 8.8745f, 3.78f, 0);
|
|
else
|
|
plr->TeleportTo(607, 1209.7f, -65.16f, 70.1f, 0.0f, 0);
|
|
}
|
|
|
|
m_PlayerScores[plr->GetGUID()] = sc;
|
|
}
|
|
|
|
void BattleGroundSA::RemovePlayer(Player* /*plr*/,uint64 /*guid*/)
|
|
{
|
|
}
|
|
|
|
void BattleGroundSA::HandleAreaTrigger(Player * /*Source*/, uint32 /*Trigger*/)
|
|
{
|
|
// this is wrong way to implement these things. On official it done by gameobject spell cast.
|
|
if (GetStatus() != STATUS_IN_PROGRESS)
|
|
return;
|
|
}
|
|
|
|
void BattleGroundSA::UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor)
|
|
{
|
|
BattleGroundScoreMap::iterator itr = m_PlayerScores.find(Source->GetGUID());
|
|
if (itr == m_PlayerScores.end()) // player not found...
|
|
return;
|
|
|
|
if (type == SCORE_DESTROYED_DEMOLISHER)
|
|
((BattleGroundSAScore*)itr->second)->demolishers_destroyed += value;
|
|
else if (type == SCORE_DESTROYED_WALL)
|
|
((BattleGroundSAScore*)itr->second)->gates_destroyed += value;
|
|
else
|
|
BattleGround::UpdatePlayerScore(Source,type,value, doAddHonor);
|
|
}
|
|
|
|
void BattleGroundSA::TeleportPlayers()
|
|
{
|
|
for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
|
|
{
|
|
if (Player *plr = objmgr.GetPlayer(itr->first))
|
|
{
|
|
// should remove spirit of redemption
|
|
if (plr->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION))
|
|
plr->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT);
|
|
|
|
if (!plr->isAlive())
|
|
{
|
|
plr->ResurrectPlayer(1.0f);
|
|
plr->SpawnCorpseBones();
|
|
}
|
|
|
|
plr->SetHealth(plr->GetMaxHealth());
|
|
plr->SetPower(POWER_MANA, plr->GetMaxPower(POWER_MANA));
|
|
plr->CombatStopWithPets(true);
|
|
|
|
if (plr->GetTeamId() == attackers)
|
|
{
|
|
plr->CastSpell(plr,12438,true); //Without this player falls before boat loads...
|
|
|
|
if (urand(0,1))
|
|
plr->TeleportTo(607, 2682.936f, -830.368f, 50.0f, 2.895f, 0);
|
|
else
|
|
plr->TeleportTo(607, 2577.003f, 980.261f, 50.0f, 0.807f, 0);
|
|
}
|
|
else
|
|
plr->TeleportTo(607, 1209.7f, -65.16f, 70.1f, 0.0f, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
void BattleGroundSA::EventPlayerDamagedGO(Player* plr, GameObject* go, uint8 hitType, uint32 destroyedEvent)
|
|
{
|
|
if (!go || !go->GetGOInfo())
|
|
return;
|
|
|
|
switch(hitType)
|
|
{
|
|
case BG_OBJECT_DMG_HIT_TYPE_JUST_DAMAGED://under attack
|
|
SendWarningToAll(LANG_BG_SA_IS_UNDER_ATTACK, go->GetGOInfo()->name);
|
|
break;
|
|
case BG_OBJECT_DMG_HIT_TYPE_DAMAGED:
|
|
break;
|
|
case BG_OBJECT_DMG_HIT_TYPE_JUST_HIGH_DAMAGED:
|
|
{
|
|
uint32 i = GetGateIDFromDestroyEventID(destroyedEvent);
|
|
GateStatus[i] = BG_SA_GATE_DAMAGED;
|
|
uint32 uws = GetWorldStateFromGateID(i);
|
|
if (uws)
|
|
UpdateWorldState(uws, GateStatus[i]);
|
|
break;
|
|
}
|
|
case BG_OBJECT_DMG_HIT_TYPE_HIGH_DAMAGED:
|
|
break;
|
|
case BG_OBJECT_DMG_HIT_TYPE_JUST_DESTROYED://handled at DestroyGate()
|
|
if (destroyedEvent == 19837)
|
|
SendWarningToAll(LANG_BG_SA_CHAMBER_BREACHED);
|
|
else
|
|
SendWarningToAll(LANG_BG_SA_WAS_DESTROYED, go->GetGOInfo()->name);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void BattleGroundSA::HandleKillUnit(Creature* unit, Player* killer)
|
|
{
|
|
if (!unit)
|
|
return;
|
|
|
|
if (unit->GetEntry() == 28781) //Demolisher
|
|
UpdatePlayerScore(killer, SCORE_DESTROYED_DEMOLISHER, 1);
|
|
}
|
|
|
|
/*
|
|
You may ask what the fuck does it do?
|
|
Prevents owner overwriting guns faction with own.
|
|
*/
|
|
void BattleGroundSA::OverrideGunFaction()
|
|
{
|
|
if (!m_BgCreatures[0])
|
|
return;
|
|
|
|
for (uint8 i = BG_SA_GUN_1; i <= BG_SA_GUN_10;i++)
|
|
{
|
|
if (Creature* gun = GetBGCreature(i))
|
|
gun->setFaction(BG_SA_Factions[attackers? TEAM_ALLIANCE : TEAM_HORDE]);
|
|
}
|
|
|
|
for (uint8 i = BG_SA_DEMOLISHER_1; i <= BG_SA_DEMOLISHER_4;i++)
|
|
{
|
|
if (Creature* dem = GetBGCreature(i))
|
|
dem->setFaction(BG_SA_Factions[attackers]);
|
|
}
|
|
}
|
|
|
|
void BattleGroundSA::DemolisherStartState(bool start)
|
|
{
|
|
if (!m_BgCreatures[0])
|
|
return;
|
|
|
|
for (uint8 i = BG_SA_DEMOLISHER_1; i <= BG_SA_DEMOLISHER_4; i++)
|
|
{
|
|
if (Creature* dem = GetBGCreature(i))
|
|
{
|
|
if (start)
|
|
dem->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
|
|
else
|
|
dem->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
|
|
}
|
|
}
|
|
}
|
|
|
|
void BattleGroundSA::DestroyGate(Player* pl, GameObject* /*go*/, uint32 destroyedEvent)
|
|
{
|
|
uint32 i = GetGateIDFromDestroyEventID(destroyedEvent);
|
|
if (!GateStatus[i])
|
|
return;
|
|
|
|
if (GameObject* g = GetBGObject(i))
|
|
{
|
|
if (g->GetGOValue()->building.health == 0)
|
|
{
|
|
GateStatus[i] = BG_SA_GATE_DESTROYED;
|
|
uint32 uws = GetWorldStateFromGateID(i);
|
|
if (uws)
|
|
UpdateWorldState(uws, GateStatus[i]);
|
|
bool rewardHonor = true;
|
|
switch(i)
|
|
{
|
|
case BG_SA_GREEN_GATE:
|
|
if (GateStatus[BG_SA_BLUE_GATE] == BG_SA_GATE_DESTROYED)
|
|
rewardHonor = false;
|
|
break;
|
|
case BG_SA_BLUE_GATE:
|
|
if (GateStatus[BG_SA_GREEN_GATE] == BG_SA_GATE_DESTROYED)
|
|
rewardHonor = false;
|
|
break;
|
|
case BG_SA_RED_GATE:
|
|
if (GateStatus[BG_SA_PURPLE_GATE] == BG_SA_GATE_DESTROYED)
|
|
rewardHonor = false;
|
|
break;
|
|
case BG_SA_PURPLE_GATE:
|
|
if (GateStatus[BG_SA_RED_GATE] == BG_SA_GATE_DESTROYED)
|
|
rewardHonor = false;
|
|
break;
|
|
}
|
|
|
|
if (i < 5)
|
|
DelObject(i+9);
|
|
UpdatePlayerScore(pl,SCORE_DESTROYED_WALL, 1);
|
|
if (rewardHonor)
|
|
UpdatePlayerScore(pl,SCORE_BONUS_HONOR,(GetBonusHonorFromKill(1)));
|
|
}
|
|
}
|
|
}
|
|
|
|
WorldSafeLocsEntry const* BattleGroundSA::GetClosestGraveYard(Player* player)
|
|
{
|
|
uint32 safeloc = 0;
|
|
WorldSafeLocsEntry const* ret;
|
|
WorldSafeLocsEntry const* closest;
|
|
float dist, nearest;
|
|
float x,y,z;
|
|
|
|
player->GetPosition(x,y,z);
|
|
|
|
if (player->GetTeamId() == attackers)
|
|
safeloc = BG_SA_GYEntries[BG_SA_BEACH_GY];
|
|
else
|
|
safeloc = BG_SA_GYEntries[BG_SA_DEFENDER_LAST_GY];
|
|
|
|
closest = sWorldSafeLocsStore.LookupEntry(safeloc);
|
|
nearest = sqrt((closest->x - x)*(closest->x - x) + (closest->y - y)*(closest->y - y)+(closest->z - z)*(closest->z - z));
|
|
|
|
for (uint8 i = BG_SA_RIGHT_CAPTURABLE_GY; i < BG_SA_MAX_GY; i++)
|
|
{
|
|
if (GraveyardStatus[i] != player->GetTeamId())
|
|
continue;
|
|
|
|
ret = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]);
|
|
dist = sqrt((ret->x - x)*(ret->x - x) + (ret->y - y)*(ret->y - y)+(ret->z - z)*(ret->z - z));
|
|
if (dist < nearest)
|
|
{
|
|
closest = ret;
|
|
nearest = dist;
|
|
}
|
|
}
|
|
|
|
return closest;
|
|
}
|
|
|
|
void BattleGroundSA::SendTime()
|
|
{
|
|
uint32 end_of_round = (BG_SA_ENDROUNDTIME - TotalTime);
|
|
UpdateWorldState(BG_SA_TIMER_MINS, end_of_round/60000);
|
|
UpdateWorldState(BG_SA_TIMER_SEC_TENS, (end_of_round%60000)/10000);
|
|
UpdateWorldState(BG_SA_TIMER_SEC_DECS, ((end_of_round%60000)%10000)/1000);
|
|
}
|
|
|
|
void BattleGroundSA::EventPlayerClickedOnFlag(Player *Source, GameObject* target_obj)
|
|
{
|
|
switch(target_obj->GetEntry())
|
|
{
|
|
case 191307:
|
|
case 191308:
|
|
if (GateStatus[BG_SA_GREEN_GATE] == BG_SA_GATE_DESTROYED || GateStatus[BG_SA_BLUE_GATE] == BG_SA_GATE_DESTROYED)
|
|
CaptureGraveyard(BG_SA_LEFT_CAPTURABLE_GY, Source);
|
|
break;
|
|
case 191305:
|
|
case 191306:
|
|
if (GateStatus[BG_SA_GREEN_GATE] == BG_SA_GATE_DESTROYED || GateStatus[BG_SA_BLUE_GATE] == BG_SA_GATE_DESTROYED)
|
|
CaptureGraveyard(BG_SA_RIGHT_CAPTURABLE_GY, Source);
|
|
break;
|
|
case 191310:
|
|
case 191309:
|
|
if ((GateStatus[BG_SA_GREEN_GATE] == BG_SA_GATE_DESTROYED || GateStatus[BG_SA_BLUE_GATE] == BG_SA_GATE_DESTROYED) && (GateStatus[BG_SA_RED_GATE] == BG_SA_GATE_DESTROYED || GateStatus[BG_SA_PURPLE_GATE] == BG_SA_GATE_DESTROYED))
|
|
CaptureGraveyard(BG_SA_CENTRAL_CAPTURABLE_GY, Source);
|
|
break;
|
|
default:
|
|
return;
|
|
};
|
|
}
|
|
|
|
void BattleGroundSA::CaptureGraveyard(BG_SA_Graveyards i, Player *Source)
|
|
{
|
|
DelCreature(BG_SA_MAXNPC + i);
|
|
GraveyardStatus[i] = Source->GetTeamId();
|
|
WorldSafeLocsEntry const *sg = NULL;
|
|
sg = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]);
|
|
AddSpiritGuide(i + BG_SA_MAXNPC, sg->x, sg->y, sg->z, BG_SA_GYOrientation[i], (GraveyardStatus[i] == TEAM_ALLIANCE? ALLIANCE : HORDE));
|
|
uint32 npc = 0;
|
|
uint32 flag = 0;
|
|
|
|
switch(i)
|
|
{
|
|
case BG_SA_LEFT_CAPTURABLE_GY:
|
|
flag = BG_SA_LEFT_FLAG;
|
|
DelObject(flag);
|
|
AddObject(flag,BG_SA_ObjEntries[(flag + (Source->GetTeamId() == TEAM_ALLIANCE ? 0:3))],
|
|
BG_SA_ObjSpawnlocs[flag][0],BG_SA_ObjSpawnlocs[flag][1],
|
|
BG_SA_ObjSpawnlocs[flag][2],BG_SA_ObjSpawnlocs[flag][3],0,0,0,0,RESPAWN_ONE_DAY);
|
|
|
|
npc = BG_SA_NPC_RIGSPARK;
|
|
AddCreature(BG_SA_NpcEntries[npc], npc, attackers,
|
|
BG_SA_NpcSpawnlocs[npc][0], BG_SA_NpcSpawnlocs[npc][1],
|
|
BG_SA_NpcSpawnlocs[npc][2], BG_SA_NpcSpawnlocs[npc][3]);
|
|
|
|
UpdateWorldState(BG_SA_LEFT_GY_ALLIANCE, (GraveyardStatus[i] == TEAM_ALLIANCE? 1:0));
|
|
UpdateWorldState(BG_SA_LEFT_GY_HORDE, (GraveyardStatus[i] == TEAM_ALLIANCE? 0:1));
|
|
if (Source->GetTeamId() == TEAM_ALLIANCE)
|
|
SendWarningToAll(LANG_BG_SA_A_GY_WEST);
|
|
else
|
|
SendWarningToAll(LANG_BG_SA_H_GY_WEST);
|
|
break;
|
|
case BG_SA_RIGHT_CAPTURABLE_GY:
|
|
flag = BG_SA_RIGHT_FLAG;
|
|
DelObject(flag);
|
|
AddObject(flag,BG_SA_ObjEntries[(flag + (Source->GetTeamId() == TEAM_ALLIANCE ? 0:3))],
|
|
BG_SA_ObjSpawnlocs[flag][0],BG_SA_ObjSpawnlocs[flag][1],
|
|
BG_SA_ObjSpawnlocs[flag][2],BG_SA_ObjSpawnlocs[flag][3],0,0,0,0,RESPAWN_ONE_DAY);
|
|
|
|
npc = BG_SA_NPC_SPARKLIGHT;
|
|
AddCreature(BG_SA_NpcEntries[npc], npc, attackers,
|
|
BG_SA_NpcSpawnlocs[npc][0], BG_SA_NpcSpawnlocs[npc][1],
|
|
BG_SA_NpcSpawnlocs[npc][2], BG_SA_NpcSpawnlocs[npc][3]);
|
|
|
|
UpdateWorldState(BG_SA_RIGHT_GY_ALLIANCE, (GraveyardStatus[i] == TEAM_ALLIANCE? 1:0));
|
|
UpdateWorldState(BG_SA_RIGHT_GY_HORDE, (GraveyardStatus[i] == TEAM_ALLIANCE? 0:1));
|
|
if (Source->GetTeamId() == TEAM_ALLIANCE)
|
|
SendWarningToAll(LANG_BG_SA_A_GY_EAST);
|
|
else
|
|
SendWarningToAll(LANG_BG_SA_H_GY_EAST);
|
|
break;
|
|
case BG_SA_CENTRAL_CAPTURABLE_GY:
|
|
flag = BG_SA_CENTRAL_FLAG;
|
|
DelObject(flag);
|
|
AddObject(flag,BG_SA_ObjEntries[(flag + (Source->GetTeamId() == TEAM_ALLIANCE ? 0:3))],
|
|
BG_SA_ObjSpawnlocs[flag][0],BG_SA_ObjSpawnlocs[flag][1],
|
|
BG_SA_ObjSpawnlocs[flag][2],BG_SA_ObjSpawnlocs[flag][3],0,0,0,0,RESPAWN_ONE_DAY);
|
|
|
|
UpdateWorldState(BG_SA_CENTER_GY_ALLIANCE, (GraveyardStatus[i] == TEAM_ALLIANCE? 1:0));
|
|
UpdateWorldState(BG_SA_CENTER_GY_HORDE, (GraveyardStatus[i] == TEAM_ALLIANCE? 0:1));
|
|
if (Source->GetTeamId() == TEAM_ALLIANCE)
|
|
SendWarningToAll(LANG_BG_SA_A_GY_SOUTH);
|
|
else
|
|
SendWarningToAll(LANG_BG_SA_H_GY_SOUTH);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
};
|
|
}
|
|
|
|
void BattleGroundSA::EventPlayerUsedGO(Player* Source, GameObject* object)
|
|
{
|
|
if (object->GetEntry() == BG_SA_ObjEntries[BG_SA_TITAN_RELIC] && GateStatus[BG_SA_ANCIENT_GATE] == BG_SA_GATE_DESTROYED)
|
|
{
|
|
if (Source->GetTeamId() == attackers)
|
|
{
|
|
if (Source->GetTeamId() == ALLIANCE)
|
|
SendMessageToAll(LANG_BG_SA_ALLIANCE_CAPTURED_RELIC, CHAT_MSG_BG_SYSTEM_NEUTRAL);
|
|
else SendMessageToAll(LANG_BG_SA_HORDE_CAPTURED_RELIC, CHAT_MSG_BG_SYSTEM_NEUTRAL);
|
|
|
|
if (status == BG_SA_ROUND_ONE)
|
|
{
|
|
RoundScores[0].winner = attackers;
|
|
RoundScores[0].time = TotalTime;
|
|
attackers = (attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE;
|
|
status = BG_SA_SECOND_WARMUP;
|
|
TotalTime = 0;
|
|
ToggleTimer();
|
|
SendWarningToAll(LANG_BG_SA_ROUND_ONE_END);
|
|
UpdateWaitTimer = 5000;
|
|
SignaledRoundTwo = false;
|
|
SignaledRoundTwoHalfMin = false;
|
|
InitSecondRound = true;
|
|
ResetObjs();
|
|
}
|
|
else if (status == BG_SA_ROUND_TWO)
|
|
{
|
|
RoundScores[1].winner = attackers;
|
|
RoundScores[1].time = TotalTime;ToggleTimer();
|
|
if (RoundScores[0].time == RoundScores[1].time)
|
|
EndBattleGround(NULL);
|
|
else if (RoundScores[0].time < RoundScores[1].time)
|
|
EndBattleGround(RoundScores[0].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE);
|
|
else
|
|
EndBattleGround(RoundScores[1].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void BattleGroundSA::ToggleTimer()
|
|
{
|
|
TimerEnabled = !TimerEnabled;
|
|
UpdateWorldState(BG_SA_ENABLE_TIMER, (TimerEnabled) ? 1 : 0);
|
|
}
|
|
|
|
void BattleGroundSA::EndBattleGround(uint32 winner)
|
|
{
|
|
//honor reward for winning
|
|
if (winner == ALLIANCE)
|
|
RewardHonorToTeam(GetBonusHonorFromKill(1), ALLIANCE);
|
|
else if (winner == HORDE)
|
|
RewardHonorToTeam(GetBonusHonorFromKill(1), HORDE);
|
|
|
|
//complete map_end rewards (even if no team wins)
|
|
RewardHonorToTeam(GetBonusHonorFromKill(2), ALLIANCE);
|
|
RewardHonorToTeam(GetBonusHonorFromKill(2), HORDE);
|
|
|
|
BattleGround::EndBattleGround(winner);
|
|
}
|
|
|
|
void BattleGroundSA::UpdateDemolisherSpawns()
|
|
{
|
|
for (uint8 i = BG_SA_DEMOLISHER_1; i <= BG_SA_DEMOLISHER_4; i++)
|
|
{
|
|
if (m_BgCreatures[i])
|
|
{
|
|
if (Creature *Demolisher = GetBGCreature(i))
|
|
{
|
|
if (Demolisher->isDead())
|
|
{
|
|
uint8 gy = (i >= BG_SA_DEMOLISHER_3 ? 3 : 2);
|
|
if (GraveyardStatus[gy] == attackers)
|
|
Demolisher->Relocate(BG_SA_NpcSpawnlocs[i + 6][0], BG_SA_NpcSpawnlocs[i + 6][1],
|
|
BG_SA_NpcSpawnlocs[i + 6][2], BG_SA_NpcSpawnlocs[i + 6][3]);
|
|
else
|
|
Demolisher->Relocate(BG_SA_NpcSpawnlocs[i][0], BG_SA_NpcSpawnlocs[i][1],
|
|
BG_SA_NpcSpawnlocs[i][2], BG_SA_NpcSpawnlocs[i][3]);
|
|
|
|
Demolisher->Respawn();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|