mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 07:37:01 +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;
|
break;
|
||||||
case ACTION_T_SET_INST_DATA:
|
case ACTION_T_SET_INST_DATA:
|
||||||
{
|
{
|
||||||
InstanceData* pInst = (InstanceData*)m_creature->GetInstanceData();
|
InstanceData* pInst = m_creature->GetInstanceData();
|
||||||
if (!pInst)
|
if (!pInst)
|
||||||
{
|
{
|
||||||
sLog.outErrorDb("CreatureEventAI: Event %d attempt to set instance data without instance script. Creature %d", EventId, m_creature->GetEntry());
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
InstanceData* pInst = (InstanceData*)m_creature->GetInstanceData();
|
InstanceData* pInst = m_creature->GetInstanceData();
|
||||||
if (!pInst)
|
if (!pInst)
|
||||||
{
|
{
|
||||||
sLog.outErrorDb("CreatureEventAI: Event %d attempt to set instance data64 without instance script. Creature %d", EventId, m_creature->GetEntry());
|
sLog.outErrorDb("CreatureEventAI: Event %d attempt to set instance data64 without instance script. Creature %d", EventId, m_creature->GetEntry());
|
||||||
|
|
|
||||||
|
|
@ -35,3 +35,10 @@ bool InstanceData::CheckAchievementCriteriaMeet( uint32 criteria_id, Player cons
|
||||||
instance->GetId(),criteria_id);
|
instance->GetId(),criteria_id);
|
||||||
return false;
|
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
|
// Achievement criteria additional requirements check
|
||||||
// NOTE: not use this if same can be checked existed requirement types from AchievementCriteriaRequirementType
|
// 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
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1136,7 +1136,7 @@ void WorldObject::GetZoneAndAreaId(uint32& zoneid, uint32& areaid) const
|
||||||
GetBaseMap()->GetZoneAndAreaId(zoneid, areaid, m_positionX, m_positionY, m_positionZ);
|
GetBaseMap()->GetZoneAndAreaId(zoneid, areaid, m_positionX, m_positionY, m_positionZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
InstanceData* WorldObject::GetInstanceData()
|
InstanceData* WorldObject::GetInstanceData() const
|
||||||
{
|
{
|
||||||
Map *map = GetMap();
|
Map *map = GetMap();
|
||||||
return map->IsDungeon() ? ((InstanceMap*)map)->GetInstanceData() : NULL;
|
return map->IsDungeon() ? ((InstanceMap*)map)->GetInstanceData() : NULL;
|
||||||
|
|
|
||||||
|
|
@ -380,7 +380,7 @@ class MANGOS_DLL_SPEC WorldObject : public Object
|
||||||
uint32 GetAreaId() const;
|
uint32 GetAreaId() const;
|
||||||
void GetZoneAndAreaId(uint32& zoneid, uint32& areaid) const;
|
void GetZoneAndAreaId(uint32& zoneid, uint32& areaid) const;
|
||||||
|
|
||||||
InstanceData* GetInstanceData();
|
InstanceData* GetInstanceData() const;
|
||||||
|
|
||||||
const char* GetName() const { return m_name.c_str(); }
|
const char* GetName() const { return m_name.c_str(); }
|
||||||
void SetName(const std::string& newname) { m_name=newname; }
|
void SetName(const std::string& newname) { m_name=newname; }
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@
|
||||||
#include "WaypointManager.h"
|
#include "WaypointManager.h"
|
||||||
#include "GossipDef.h"
|
#include "GossipDef.h"
|
||||||
#include "Mail.h"
|
#include "Mail.h"
|
||||||
|
#include "InstanceData.h"
|
||||||
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
|
||||||
|
|
@ -7417,6 +7418,15 @@ bool PlayerCondition::Meets(Player const * player) const
|
||||||
}
|
}
|
||||||
return false;
|
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:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -7630,6 +7640,17 @@ bool PlayerCondition::IsValid(ConditionType condition, uint32 value1, uint32 val
|
||||||
|
|
||||||
break;
|
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:
|
case CONDITION_NONE:
|
||||||
break;
|
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_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_NOITEM = 16, // item_id count
|
||||||
CONDITION_SPELL = 17, // spell_id 0, 1 (0: has spell, 1: hasn't spell)
|
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
|
struct PlayerCondition
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "9794"
|
#define REVISION_NR "9795"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue