Merge pull request #4700 from Subv/fix001

Core/SAI: Implement SMART_EVENT_GO_STATE_CHANGED and SMART_ACTION_GO_SET_LOOT_STATE
This commit is contained in:
Machiavelli
2012-01-07 11:24:53 -08:00
8 changed files with 51 additions and 3 deletions

View File

@@ -50,6 +50,7 @@ class GameObjectAI
virtual void Destroyed(Player* /*player*/, uint32 /*eventId*/) {}
virtual void SetData(uint32 /*id*/, uint32 /*value*/) {}
virtual void OnGameEvent(bool /*start*/, uint16 /*eventId*/) {}
virtual void OnStateChanged(uint32 state) { }
};
class NullGameObjectAI : public GameObjectAI

View File

@@ -937,6 +937,11 @@ void SmartGameObjectAI::OnGameEvent(bool start, uint16 eventId)
GetScript()->ProcessEventsFor(start ? SMART_EVENT_GAME_EVENT_START : SMART_EVENT_GAME_EVENT_END, NULL, eventId);
}
void SmartGameObjectAI::OnStateChanged(uint32 state)
{
GetScript()->ProcessEventsFor(SMART_EVENT_GO_STATE_CHANGED, NULL, state);
}
class SmartTrigger : public AreaTriggerScript
{
public:

View File

@@ -253,6 +253,7 @@ public:
void SetData(uint32 id, uint32 value);
void SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker);
void OnGameEvent(bool start, uint16 eventId);
void OnStateChanged(uint32 state);
protected:
GameObject* const go;

View File

@@ -1780,6 +1780,20 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
// TODO: Resume path when reached jump location
break;
}
case SMART_ACTION_GO_SET_LOOT_STATE:
{
ObjectList* targets = GetTargets(e, unit);
if (!targets)
return;
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
if (IsGameObject(*itr))
(*itr)->ToGameObject()->SetLootState((LootState)e.action.setGoLootState.state);
delete targets;
break;
}
case SMART_ACTION_SEND_GOSSIP_MENU:
{
if (!GetBaseObject())
@@ -2602,6 +2616,13 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
ProcessAction(e, NULL, var0);
break;
}
case SMART_EVENT_GO_STATE_CHANGED:
{
if (e.event.goStateChanged.state != var0)
return;
ProcessAction(e, unit, var0, var1);
break;
}
default:
sLog->outErrorDb("SmartScript::ProcessEvent: Unhandled Event type %u", e.GetEventType());
break;

View File

@@ -478,6 +478,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
return false;
break;
}
case SMART_EVENT_GO_STATE_CHANGED:
case SMART_EVENT_TIMED_EVENT_TRIGGERED:
case SMART_EVENT_INSTANCE_PLAYER_ENTER:
case SMART_EVENT_TRANSPORT_RELOCATE:

View File

@@ -154,8 +154,9 @@ enum SMART_EVENT
SMART_EVENT_IS_BEHIND_TARGET = 67, //1 // cooldownMin, CooldownMax
SMART_EVENT_GAME_EVENT_START = 68, //1 // game_event.Entry
SMART_EVENT_GAME_EVENT_END = 69, //1 // game_event.Entry
SMART_EVENT_GO_STATE_CHANGED = 70, // go state
SMART_EVENT_END = 70,
SMART_EVENT_END = 71,
};
struct SmartEvent
@@ -345,6 +346,11 @@ struct SmartEvent
uint32 gameEventId;
} gameEvent;
struct
{
uint32 state;
} goStateChanged;
struct
{
uint32 param1;
@@ -466,8 +472,9 @@ enum SMART_ACTION
SMART_ACTION_REMOVE_DYNAMIC_FLAG = 96, // Flags
SMART_ACTION_JUMP_TO_POS = 97, // speedXY, speedZ, targetX, targetY, targetZ
SMART_ACTION_SEND_GOSSIP_MENU = 98, // menuId, optionId
SMART_ACTION_GO_SET_LOOT_STATE = 99, // state
SMART_ACTION_END = 99,
SMART_ACTION_END = 100,
};
struct SmartAction
@@ -871,6 +878,11 @@ struct SmartAction
uint32 gossipNpcTextId;
} sendGossipMenu;
struct
{
uint32 state;
} setGoLootState;
struct
{
uint32 param1;
@@ -1137,6 +1149,7 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] =
{SMART_EVENT_IS_BEHIND_TARGET, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_EVENT_GAME_EVENT_START, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
{SMART_EVENT_GAME_EVENT_END, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
{SMART_EVENT_GO_STATE_CHANGED, SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
};

View File

@@ -1864,3 +1864,9 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player*
}
}
}
void GameObject::SetLootState(LootState s)
{
m_lootState = s;
AI()->OnStateChanged(s);
}

View File

@@ -713,7 +713,7 @@ class GameObject : public WorldObject, public GridObject<GameObject>
void Use(Unit* user);
LootState getLootState() const { return m_lootState; }
void SetLootState(LootState s) { m_lootState = s; }
void SetLootState(LootState s);
uint16 GetLootMode() { return m_LootMode; }
bool HasLootMode(uint16 lootMode) { return m_LootMode & lootMode; }