Core/Db/Conditions: Add new condition targets for:
- CONDITION_SOURCE_TYPE_CREATURE_TEMPLATE_VEHICLE ConditionTarget = 1 - check vehicle - CONDITION_SOURCE_TYPE_VEHICLE_SPELL ConditionTarget = 1 - check vehicle - CONDITION_SOURCE_TYPE_GOSSIP_MENU = 1 - check gossip provider - CONDITION_SOURCE_TYPE_GOSSIP_MENU_OPTION = 1 - check gossip provider
This commit is contained in:
@@ -326,7 +326,7 @@ void VehicleAI::CheckConditions(const uint32 diff)
|
||||
{
|
||||
if (Player* player = passenger->ToPlayer())
|
||||
{
|
||||
if (!sConditionMgr->IsObjectMeetToConditions(player, conditions))
|
||||
if (!sConditionMgr->IsObjectMeetToConditions(player, me, conditions))
|
||||
{
|
||||
player->ExitVehicle();
|
||||
return;//check other pessanger in next tick
|
||||
|
||||
@@ -343,6 +343,10 @@ uint32 Condition::GetMaxAvailableConditionTargets()
|
||||
switch(SourceType)
|
||||
{
|
||||
case CONDITION_SOURCE_TYPE_SPELL:
|
||||
case CONDITION_SOURCE_TYPE_CREATURE_TEMPLATE_VEHICLE:
|
||||
case CONDITION_SOURCE_TYPE_VEHICLE_SPELL:
|
||||
case CONDITION_SOURCE_TYPE_GOSSIP_MENU:
|
||||
case CONDITION_SOURCE_TYPE_GOSSIP_MENU_OPTION:
|
||||
return 2;
|
||||
case CONDITION_SOURCE_TYPE_SMART_EVENT:
|
||||
return 2;
|
||||
@@ -418,6 +422,12 @@ bool ConditionMgr::IsObjectMeetToConditions(WorldObject* object, ConditionList c
|
||||
return IsObjectMeetToConditions(srcInfo, conditions);
|
||||
}
|
||||
|
||||
bool ConditionMgr::IsObjectMeetToConditions(WorldObject* object1, WorldObject* object2, ConditionList const& conditions)
|
||||
{
|
||||
ConditionSourceInfo srcInfo = ConditionSourceInfo(object1, object2);
|
||||
return IsObjectMeetToConditions(srcInfo, conditions);
|
||||
}
|
||||
|
||||
bool ConditionMgr::IsObjectMeetToConditions(ConditionSourceInfo& sourceInfo, ConditionList const& conditions)
|
||||
{
|
||||
if (conditions.empty())
|
||||
|
||||
@@ -199,6 +199,7 @@ class ConditionMgr
|
||||
ConditionList GetConditionReferences(uint32 refId);
|
||||
|
||||
bool IsObjectMeetToConditions(WorldObject* object, ConditionList const& conditions);
|
||||
bool IsObjectMeetToConditions(WorldObject* object1, WorldObject* object2, ConditionList const& conditions);
|
||||
bool IsObjectMeetToConditions(ConditionSourceInfo& sourceInfo, ConditionList const& conditions);
|
||||
ConditionList GetConditionsForNotGroupedEntry(ConditionSourceType sourceType, uint32 entry);
|
||||
ConditionList GetConditionsForSmartEvent(int32 entryOrGuid, uint32 eventId, uint32 sourceType);
|
||||
|
||||
@@ -14089,7 +14089,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool
|
||||
for (GossipMenuItemsContainer::const_iterator itr = menuItemBounds.first; itr != menuItemBounds.second; ++itr)
|
||||
{
|
||||
bool canTalk = true;
|
||||
if (!sConditionMgr->IsObjectMeetToConditions(this, itr->second.Conditions))
|
||||
if (!sConditionMgr->IsObjectMeetToConditions(this, source, itr->second.Conditions))
|
||||
continue;
|
||||
|
||||
if (source->GetTypeId() == TYPEID_UNIT)
|
||||
@@ -14233,7 +14233,7 @@ void Player::SendPreparedGossip(WorldObject* source)
|
||||
uint32 textId = GetGossipTextId(source);
|
||||
|
||||
if (uint32 menuId = PlayerTalkClass->GetGossipMenu().GetMenuId())
|
||||
textId = GetGossipTextId(menuId);
|
||||
textId = GetGossipTextId(menuId, source);
|
||||
|
||||
PlayerTalkClass->SendGossipMenu(textId, source->GetGUID());
|
||||
}
|
||||
@@ -14378,10 +14378,10 @@ uint32 Player::GetGossipTextId(WorldObject* source)
|
||||
if (!source)
|
||||
return DEFAULT_GOSSIP_MESSAGE;
|
||||
|
||||
return GetGossipTextId(GetDefaultGossipMenuForSource(source));
|
||||
return GetGossipTextId(GetDefaultGossipMenuForSource(source), source);
|
||||
}
|
||||
|
||||
uint32 Player::GetGossipTextId(uint32 menuId)
|
||||
uint32 Player::GetGossipTextId(uint32 menuId, WorldObject* source)
|
||||
{
|
||||
uint32 textId = DEFAULT_GOSSIP_MESSAGE;
|
||||
|
||||
@@ -14391,8 +14391,10 @@ uint32 Player::GetGossipTextId(uint32 menuId)
|
||||
GossipMenusMapBounds menuBounds = sObjectMgr->GetGossipMenusMapBounds(menuId);
|
||||
|
||||
for (GossipMenusContainer::const_iterator itr = menuBounds.first; itr != menuBounds.second; ++itr)
|
||||
if (sConditionMgr->IsObjectMeetToConditions(this, itr->second.conditions))
|
||||
{
|
||||
if (sConditionMgr->IsObjectMeetToConditions(this, source, itr->second.conditions))
|
||||
textId = itr->second.text_id;
|
||||
}
|
||||
|
||||
return textId;
|
||||
}
|
||||
@@ -19862,7 +19864,7 @@ void Player::VehicleSpellInitialize()
|
||||
}
|
||||
|
||||
ConditionList conditions = sConditionMgr->GetConditionsForVehicleSpell(veh->GetEntry(), spellId);
|
||||
if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
|
||||
if (!sConditionMgr->IsObjectMeetToConditions(this, veh, conditions))
|
||||
{
|
||||
sLog->outDebug(LOG_FILTER_CONDITIONSYS, "VehicleSpellInitialize: conditions not met for Vehicle entry %u spell %u", veh->ToCreature()->GetEntry(), spellId);
|
||||
data << uint16(0) << uint8(0) << uint8(i+8);
|
||||
|
||||
@@ -1383,7 +1383,7 @@ class Player : public Unit, public GridObject<Player>
|
||||
void SendPreparedGossip(WorldObject* source);
|
||||
void OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 menuId);
|
||||
|
||||
uint32 GetGossipTextId(uint32 menuId);
|
||||
uint32 GetGossipTextId(uint32 menuId, WorldObject* source);
|
||||
uint32 GetGossipTextId(WorldObject* source);
|
||||
static uint32 GetDefaultGossipMenuForSource(WorldObject* source);
|
||||
|
||||
|
||||
@@ -1425,7 +1425,7 @@ class go_wind_stone : public GameObjectScript
|
||||
break;
|
||||
}
|
||||
|
||||
player->SEND_GOSSIP_MENU(player->GetGossipTextId(gossipId), go->GetGUID());
|
||||
player->SEND_GOSSIP_MENU(player->GetGossipTextId(gossipId, go), go->GetGUID());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user