diff --git a/src/game/CreatureEventAI.cpp b/src/game/CreatureEventAI.cpp index 27969b9b2..8849b52d8 100644 --- a/src/game/CreatureEventAI.cpp +++ b/src/game/CreatureEventAI.cpp @@ -711,7 +711,7 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32 break; case ACTION_T_SET_INST_DATA: { - InstanceData* pInst = (InstanceData*)m_creature->GetInstanceData(); + InstanceData* pInst = m_creature->GetInstanceData(); if (!pInst) { sLog.outErrorDb("CreatureEventAI: Event %d attempt to set instance data without instance script. Creature %d", EventId, m_creature->GetEntry()); @@ -730,7 +730,7 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32 return; } - InstanceData* pInst = (InstanceData*)m_creature->GetInstanceData(); + InstanceData* pInst = m_creature->GetInstanceData(); if (!pInst) { sLog.outErrorDb("CreatureEventAI: Event %d attempt to set instance data64 without instance script. Creature %d", EventId, m_creature->GetEntry()); diff --git a/src/game/InstanceData.cpp b/src/game/InstanceData.cpp index 9b55a3c4a..d1d05a882 100644 --- a/src/game/InstanceData.cpp +++ b/src/game/InstanceData.cpp @@ -34,4 +34,11 @@ bool InstanceData::CheckAchievementCriteriaMeet( uint32 criteria_id, Player cons sLog.outError("Achievement system call InstanceData::CheckAchievementCriteriaMeet but instance script for map %u not have implementation for achievement criteria %u", instance->GetId(),criteria_id); return false; -} \ No newline at end of file +} + +bool InstanceData::CheckConditionCriteriaMeet(Player const* /*source*/, uint32 map_id, uint32 instance_condition_id) +{ + sLog.outError("Condition system call InstanceData::CheckConditionCriteriaMeet but instance script for map %u not have implementation for player condition criteria with internal id %u for map %u", + instance->GetId(), instance_condition_id, map_id); + return false; +} diff --git a/src/game/InstanceData.h b/src/game/InstanceData.h index cf1e1f2a9..524d792f8 100644 --- a/src/game/InstanceData.h +++ b/src/game/InstanceData.h @@ -73,6 +73,10 @@ class MANGOS_DLL_SPEC InstanceData // Achievement criteria additional requirements check // NOTE: not use this if same can be checked existed requirement types from AchievementCriteriaRequirementType - virtual bool CheckAchievementCriteriaMeet(uint32 /*criteria_id*/, Player const* /*source*/, Unit const* /*target*/ = NULL, uint32 /*miscvalue1*/ = 0); + virtual bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0); + + // Condition criteria additional requirements check + // This is used for such things are heroic loot + virtual bool CheckConditionCriteriaMeet(Player const* source, uint32 map_id, uint32 instance_condition_id); }; #endif diff --git a/src/game/Object.cpp b/src/game/Object.cpp index c6e221a76..333f1c97a 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -1136,7 +1136,7 @@ void WorldObject::GetZoneAndAreaId(uint32& zoneid, uint32& areaid) const GetBaseMap()->GetZoneAndAreaId(zoneid, areaid, m_positionX, m_positionY, m_positionZ); } -InstanceData* WorldObject::GetInstanceData() +InstanceData* WorldObject::GetInstanceData() const { Map *map = GetMap(); return map->IsDungeon() ? ((InstanceMap*)map)->GetInstanceData() : NULL; diff --git a/src/game/Object.h b/src/game/Object.h index b1036f989..32beee20e 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -380,7 +380,7 @@ class MANGOS_DLL_SPEC WorldObject : public Object uint32 GetAreaId() const; void GetZoneAndAreaId(uint32& zoneid, uint32& areaid) const; - InstanceData* GetInstanceData(); + InstanceData* GetInstanceData() const; const char* GetName() const { return m_name.c_str(); } void SetName(const std::string& newname) { m_name=newname; } diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 50394dec4..fd0895a81 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -45,6 +45,7 @@ #include "WaypointManager.h" #include "GossipDef.h" #include "Mail.h" +#include "InstanceData.h" #include @@ -7417,6 +7418,15 @@ bool PlayerCondition::Meets(Player const * player) const } return false; } + case CONDITION_INSTANCE_SCRIPT: + { + // have meaning only for specific map instance script so ignore other maps + if (player->GetMapId() != value1) + return false; + if (InstanceData* data = player->GetInstanceData()) + return data->CheckConditionCriteriaMeet(player, value1, value2); + return false; + } default: return false; } @@ -7630,6 +7640,17 @@ bool PlayerCondition::IsValid(ConditionType condition, uint32 value1, uint32 val break; } + case CONDITION_INSTANCE_SCRIPT: + { + MapEntry const* mapEntry = sMapStore.LookupEntry(value1); + if (!mapEntry || !mapEntry->IsDungeon()) + { + sLog.outErrorDb("Instance script condition has not existed map id %u as first arg, skipped", value1); + return false; + } + + break; + } case CONDITION_NONE: break; } diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h index a989f2627..25697dbec 100644 --- a/src/game/ObjectMgr.h +++ b/src/game/ObjectMgr.h @@ -315,9 +315,10 @@ enum ConditionType CONDITION_LEVEL = 15, // player_level 0, 1 or 2 (0: equal to, 1: equal or higher than, 2: equal or less than) CONDITION_NOITEM = 16, // item_id count CONDITION_SPELL = 17, // spell_id 0, 1 (0: has spell, 1: hasn't spell) + CONDITION_INSTANCE_SCRIPT = 18, // map_id instance_condition_id (instance script specific enum) }; -#define MAX_CONDITION 18 // maximum value in ConditionType enum +#define MAX_CONDITION 19 // maximum value in ConditionType enum struct PlayerCondition { diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index cf3241dfe..1405e9d7e 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9794" + #define REVISION_NR "9795" #endif // __REVISION_NR_H__