aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMihapro <miha.penger@siol.net>2013-07-08 18:01:41 +0200
committerMihapro <miha.penger@siol.net>2013-07-08 18:01:41 +0200
commite00fc197793d98bd7ed97f65b7c1532956d0744a (patch)
tree41c291c9a47d262277fe6445ff42b55ff54da853 /src
parent3561ab98bae1dc111530223aaf25f58bb3267677 (diff)
Core/SmartScripts
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp54
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp5
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Maps/Map.cpp2
5 files changed, 35 insertions, 30 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 86c246ff387..0c80945e357 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -897,13 +897,19 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
}
case SMART_ACTION_CALL_KILLEDMONSTER:
{
- Player* player = NULL;
- if (me)
- player = me->GetLootRecipient();
+ if (e.target.type == SMART_TARGET_NONE) // Loot recipient and his group members
+ {
+ if (!me)
+ break;
- if (me && player)
- player->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, player);
- else if (GetBaseObject())
+ if (Player* player = me->GetLootRecipient())
+ {
+ player->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, player);
+ TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_KILLEDMONSTER: Player %u, Killcredit: %u",
+ player->GetGUIDLow(), e.action.killedMonster.creature);
+ }
+ }
+ else // Specific target type
{
ObjectList* targets = GetTargets(e, unit);
if (!targets)
@@ -911,29 +917,21 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
{
- // Special handling for vehicles
- if (IsUnit(*itr))
+ if (IsPlayer(*itr))
+ {
+ (*itr)->ToPlayer()->KilledMonsterCredit(e.action.killedMonster.creature);
+ TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_KILLEDMONSTER: Player %u, Killcredit: %u",
+ (*itr)->GetGUIDLow(), e.action.killedMonster.creature);
+ }
+ else if (IsUnit(*itr)) // Special handling for vehicles
if (Vehicle* vehicle = (*itr)->ToUnit()->GetVehicleKit())
- for (SeatMap::iterator it = vehicle->Seats.begin(); it != vehicle->Seats.end(); ++it)
- if (Player* player = ObjectAccessor::FindPlayer(it->second.Passenger.Guid))
- player->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, player);
-
- if (!IsPlayer(*itr))
- continue;
-
- (*itr)->ToPlayer()->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, (*itr)->ToPlayer());
- TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_KILLEDMONSTER: Player %u, Killcredit: %u",
- (*itr)->GetGUIDLow(), e.action.killedMonster.creature);
+ for (SeatMap::iterator itr = vehicle->Seats.begin(); itr != vehicle->Seats.end(); ++itr)
+ if (Player* player = ObjectAccessor::FindPlayer(itr->second.Passenger.Guid))
+ player->KilledMonsterCredit(e.action.killedMonster.creature);
}
delete targets;
}
- else if (trigger && IsPlayer(unit))
- {
- unit->ToPlayer()->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, unit);
- TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_KILLEDMONSTER: (trigger == true) Player %u, Killcredit: %u",
- unit->GetGUIDLow(), e.action.killedMonster.creature);
- }
break;
}
case SMART_ACTION_SET_INST_DATA:
@@ -1300,10 +1298,10 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
{
- if (!IsPlayer(*itr))
- continue;
-
- (*itr)->ToPlayer()->TeleportTo(e.action.teleport.mapID, e.target.x, e.target.y, e.target.z, e.target.o);
+ if (IsPlayer(*itr))
+ (*itr)->ToPlayer()->TeleportTo(e.action.teleport.mapID, e.target.x, e.target.y, e.target.z, e.target.o);
+ else if (IsCreature(*itr))
+ (*itr)->ToCreature()->NearTeleportTo(e.target.x, e.target.y, e.target.z, e.target.o);
}
delete targets;
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index ec7f307c5ef..872808a7516 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -761,6 +761,11 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_ACTION_CALL_KILLEDMONSTER:
if (!IsCreatureValid(e, e.action.killedMonster.creature))
return false;
+ if (e.GetTargetType() == SMART_TARGET_POSITION)
+ {
+ TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses incorrect TargetType %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.GetTargetType());
+ return false;
+ }
break;
case SMART_ACTION_UPDATE_TEMPLATE:
if (e.action.updateTemplate.creature && !IsCreatureValid(e, e.action.updateTemplate.creature))
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 2f584fdb5d4..419f1e1c884 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -16173,7 +16173,7 @@ void Player::KilledMonster(CreatureTemplate const* cInfo, uint64 guid)
KilledMonsterCredit(cInfo->KillCredit[i], 0);
}
-void Player::KilledMonsterCredit(uint32 entry, uint64 guid)
+void Player::KilledMonsterCredit(uint32 entry, uint64 guid /*= 0*/)
{
uint16 addkillcount = 1;
uint32 real_entry = entry;
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 2058f521f7c..e4e38115dc1 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1413,7 +1413,7 @@ class Player : public Unit, public GridObject<Player>
void ItemAddedQuestCheck(uint32 entry, uint32 count);
void ItemRemovedQuestCheck(uint32 entry, uint32 count);
void KilledMonster(CreatureTemplate const* cInfo, uint64 guid);
- void KilledMonsterCredit(uint32 entry, uint64 guid);
+ void KilledMonsterCredit(uint32 entry, uint64 guid = 0);
void KilledPlayerCredit();
void CastedCreatureOrGO(uint32 entry, uint64 guid, uint32 spell_id);
void TalkedToCreature(uint32 entry, uint64 guid);
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 11ed92b9d5b..5ce4c05abb6 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -820,6 +820,8 @@ void Map::MoveAllCreaturesInMoveList()
{
// update pos
c->Relocate(c->_newPosition);
+ if (c->IsVehicle())
+ c->GetVehicleKit()->RelocatePassengers();
//CreatureRelocationNotify(c, new_cell, new_cell.cellCoord());
c->UpdateObjectVisibility(false);
}