mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 22:37:03 +00:00
[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:
parent
929798e635
commit
3032e80bb6
8 changed files with 41 additions and 8 deletions
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __REVISION_NR_H__
|
||||
#define __REVISION_NR_H__
|
||||
#define REVISION_NR "9794"
|
||||
#define REVISION_NR "9795"
|
||||
#endif // __REVISION_NR_H__
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue