[9795] Implement CONDITION_INSTANCE_SCRIPT (mapid, some_id)

True if mapid fit to called instance map id and instance script confirm success for some_id case.

Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
patman128 2010-04-26 09:06:46 +04:00 committed by VladimirMangos
parent 929798e635
commit 3032e80bb6
8 changed files with 41 additions and 8 deletions

View file

@ -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());

View file

@ -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;
}
}
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;
}

View file

@ -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

View file

@ -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;

View file

@ -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; }

View file

@ -45,6 +45,7 @@
#include "WaypointManager.h"
#include "GossipDef.h"
#include "Mail.h"
#include "InstanceData.h"
#include <limits>
@ -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;
}

View file

@ -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
{

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "9794"
#define REVISION_NR "9795"
#endif // __REVISION_NR_H__