From c76cb0ce7cae42970ac1b0792a9ee4ed33a23386 Mon Sep 17 00:00:00 2001 From: Tartalo Date: Thu, 25 Feb 2010 16:26:03 +0100 Subject: Add new flagged column to access_requirement to set instances opened/closed. This way is possible to open a raid on 10man mode while the rest of modes are closed (for example). Ingame commands to open/close instances coming soon ;) --HG-- branch : trunk --- src/game/Language.h | 2 +- src/game/ObjectMgr.cpp | 5 +++-- src/game/Player.cpp | 24 ++++++++++++++++++++++++ src/game/Player.h | 12 ++++++++++++ 4 files changed, 40 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/game/Language.h b/src/game/Language.h index 3e954be14d1..f83ef222b6b 100644 --- a/src/game/Language.h +++ b/src/game/Language.h @@ -862,7 +862,7 @@ enum TrinityStrings LANG_COMMAND_LIST_FREEZE = 5005, LANG_COMMAND_FROZEN_PLAYERS = 5006, LANG_INSTANCE_RAID_GROUP_ONLY = 5007, - //LANG_INSTANCE_NOT_AS_GHOST = 5008, + LANG_INSTANCE_CLOSED = 5008, LANG_COMMAND_PLAYED_TO_ALL = 5009, LANG_NPCINFO_LINKGUID = 5010, LANG_TELEPORTED_TO_BY_CONSOLE = 5011, diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index cdc267ad1bd..895e651baef 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -5739,8 +5739,8 @@ void ObjectMgr::LoadAccessRequirements() uint32 count = 0; - // 0 1 2 3 4 5 6 7 8 9 10 11 - QueryResult_AutoPtr result = WorldDatabase.Query("SELECT id, level_min, level_max, item, item2, heroic_key, heroic_key2, quest_done, quest_failed_text, heroic_quest_done, heroic_quest_failed_text, heroic_level_min FROM access_requirement"); + // 0 1 2 3 4 5 6 7 8 9 10 11 12 + QueryResult_AutoPtr result = WorldDatabase.Query("SELECT id, level_min, level_max, item, item2, heroic_key, heroic_key2, quest_done, quest_failed_text, heroic_quest_done, heroic_quest_failed_text, heroic_level_min, status FROM access_requirement"); if( !result ) { @@ -5778,6 +5778,7 @@ void ObjectMgr::LoadAccessRequirements() ar.questFailedText = fields[8].GetCppString(); ar.heroicQuest = fields[9].GetUInt32(); ar.heroicQuestFailedText = fields[10].GetCppString(); + ar.status = fields[12].GetUInt8(); if(ar.item) { diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 8379ec77d58..1a5e2720525 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -16980,6 +16980,30 @@ bool Player::Satisfy(AccessRequirement const *ar, uint32 target_map, bool report if(!mapEntry) return false; + bool closed = false; + + switch(mapEntry->IsRaid() ? GetRaidDifficulty() : GetDungeonDifficulty()) + { + case DUNGEON_DIFFICULTY_NORMAL: + closed = (ar->status & DUNGEON_STATUSFLAG_NORMAL) == 0; + break; + case DUNGEON_DIFFICULTY_HEROIC: + closed = (ar->status & DUNGEON_STATUSFLAG_HEROIC) == 0; + break; + case RAID_DIFFICULTY_10MAN_HEROIC: + closed = (ar->status & RAID_STATUSFLAG_10MAN_HEROIC) == 0; + break; + case RAID_DIFFICULTY_25MAN_HEROIC: + closed = (ar->status & RAID_STATUSFLAG_25MAN_HEROIC) == 0; + break; + } + + if (closed) + { + GetSession()->SendAreaTriggerMessage(GetSession()->GetTrinityString(LANG_INSTANCE_CLOSED)); + return false; + } + bool isNormalTargetMap = mapEntry->IsRaid() ? (GetRaidDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL) : (GetDungeonDifficulty() == DUNGEON_DIFFICULTY_NORMAL); diff --git a/src/game/Player.h b/src/game/Player.h index f1ccfc60331..ae179894121 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -868,6 +868,17 @@ struct InstancePlayerBind InstancePlayerBind() : save(NULL), perm(false) {} }; +enum DungeonStatusFlag +{ + DUNGEON_STATUSFLAG_NORMAL = 0x01, + DUNGEON_STATUSFLAG_HEROIC = 0x02, + + RAID_STATUSFLAG_10MAN_NORMAL = 0x01, + RAID_STATUSFLAG_25MAN_NORMAL = 0x02, + RAID_STATUSFLAG_10MAN_HEROIC = 0x04, + RAID_STATUSFLAG_25MAN_HEROIC = 0x08 +}; + struct AccessRequirement { uint8 levelMin; @@ -881,6 +892,7 @@ struct AccessRequirement std::string questFailedText; uint32 heroicQuest; std::string heroicQuestFailedText; + uint8 status; }; class PlayerTaxi -- cgit v1.2.3