Skip to content

Commit b7ee1a9

Browse files
3ndosFrancescoBorzi
authored andcommitted
More hooks for Scripts/Modules (#270)
1 parent 440b7e7 commit b7ee1a9

File tree

8 files changed

+255
-14
lines changed

8 files changed

+255
-14
lines changed

src/game/Entities/Item/Item.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -642,8 +642,11 @@ void Item::SetState(ItemUpdateState state, Player* forplayer)
642642
if (uState == ITEM_NEW && state == ITEM_REMOVED)
643643
{
644644
// pretend the item never existed
645-
RemoveFromUpdateQueueOf(forplayer);
646-
forplayer->DeleteRefundReference(GetGUIDLow());
645+
if (forplayer)
646+
{
647+
RemoveFromUpdateQueueOf(forplayer);
648+
forplayer->DeleteRefundReference(GetGUIDLow());
649+
}
647650
delete this;
648651
return;
649652
}
@@ -652,8 +655,8 @@ void Item::SetState(ItemUpdateState state, Player* forplayer)
652655
// new items must stay in new state until saved
653656
if (uState != ITEM_NEW)
654657
uState = state;
655-
656-
AddToUpdateQueueOf(forplayer);
658+
if (forplayer)
659+
AddToUpdateQueueOf(forplayer);
657660
}
658661
else
659662
{

src/game/Entities/Player/Player.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15501,6 +15501,8 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
1550115501
{
1550215502
Item* item = StoreNewItem(dest, itemId, true, Item::GenerateItemRandomPropertyId(itemId));
1550315503
SendNewItem(item, quest->RewardChoiceItemCount[reward], true, false);
15504+
15505+
sScriptMgr->OnQuestRewardItem(this, item, quest->RewardChoiceItemCount[reward]);
1550415506
}
1550515507
else
1550615508
problematicItems.push_back(std::pair<uint32, uint32>(itemId, quest->RewardChoiceItemCount[reward]));
@@ -15518,6 +15520,8 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
1551815520
{
1551915521
Item* item = StoreNewItem(dest, itemId, true, Item::GenerateItemRandomPropertyId(itemId));
1552015522
SendNewItem(item, quest->RewardItemIdCount[i], true, false);
15523+
15524+
sScriptMgr->OnQuestRewardItem(this, item, quest->RewardItemIdCount[i]);
1552115525
}
1552215526
else
1552315527
problematicItems.push_back(std::pair<uint32, uint32>(itemId, quest->RewardItemIdCount[i]));
@@ -24743,6 +24747,8 @@ void Player::StoreLootItem(uint8 lootSlot, Loot* loot)
2474324747
// LootItem is being removed (looted) from the container, delete it from the DB.
2474424748
if (loot->containerId > 0)
2474524749
sLootItemStorage->RemoveStoredLootItem(loot->containerId, item->itemid, item->count);
24750+
24751+
sScriptMgr->OnLootItem(this, newitem, item->count, this->GetLootGUID());
2474624752
}
2474724753
else
2474824754
SendEquipError(msg, NULL, NULL, item->itemid);

src/game/Entities/Unit/Unit.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -680,7 +680,10 @@ uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage
680680
if (attacker && attacker->IsAIEnabled)
681681
attacker->GetAI()->DamageDealt(victim, damage, damagetype);
682682
}
683-
683+
684+
// Hook for OnDamage Event
685+
sScriptMgr->OnDamage(attacker, victim, damage);
686+
684687
if (victim->GetTypeId() == TYPEID_PLAYER && attacker != victim)
685688
{
686689
// Signal to pets that their owner was attacked
@@ -1181,7 +1184,10 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama
11811184
default:
11821185
break;
11831186
}
1184-
1187+
1188+
// Script Hook For CalculateSpellDamageTaken -- Allow scripts to change the Damage post class mitigation calculations
1189+
sScriptMgr->ModifySpellDamageTaken(damageInfo->target, damageInfo->attacker, damage);
1190+
11851191
// Calculate absorb resist
11861192
if (damage > 0)
11871193
{
@@ -1277,7 +1283,10 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
12771283
// Add melee damage bonus
12781284
damage = MeleeDamageBonusDone(damageInfo->target, damage, damageInfo->attackType);
12791285
damage = damageInfo->target->MeleeDamageBonusTaken(this, damage, damageInfo->attackType);
1280-
1286+
1287+
// Script Hook For CalculateMeleeDamage -- Allow scripts to change the Damage pre class mitigation calculations
1288+
sScriptMgr->ModifyMeleeDamage(damageInfo->target, damageInfo->attacker, damage);
1289+
12811290
// Calculate armor reduction
12821291
if (IsDamageReducedByArmor((SpellSchoolMask)(damageInfo->damageSchoolMask)))
12831292
{
@@ -9943,7 +9952,10 @@ int32 Unit::DealHeal(Unit* healer, Unit* victim, uint32 addhealth)
99439952

99449953
if (addhealth)
99459954
gain = victim->ModifyHealth(int32(addhealth));
9946-
9955+
9956+
// Hook for OnHeal Event
9957+
sScriptMgr->OnHeal(healer, victim, (uint32&)gain);
9958+
99479959
Unit* unit = healer;
99489960

99499961
if (healer && healer->GetTypeId() == TYPEID_UNIT && healer->ToCreature()->IsTotem())
@@ -10209,7 +10221,9 @@ int32 Unit::HealBySpell(Unit* victim, SpellInfo const* spellInfo, uint32 addHeal
1020910221
uint32 absorb = 0;
1021010222
// calculate heal absorb and reduce healing
1021110223
CalcHealAbsorb(victim, spellInfo, addHealth, absorb);
10212-
10224+
10225+
sScriptMgr->ModifyHealRecieved(this, victim, addHealth);
10226+
1021310227
int32 gain = Unit::DealHeal(this, victim, addHealth);
1021410228
SendHealSpellLog(victim, spellInfo->Id, addHealth, uint32(addHealth - gain), absorb, critical);
1021510229
return gain;

src/game/Handlers/MovementHandler.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "ArenaSpectator.h"
2424
#include "Chat.h"
2525
#include "BattlegroundMgr.h"
26+
#include "ScriptMgr.h"
2627

2728
#define MOVEMENT_PACKET_TIME_DELAY 0
2829

@@ -392,6 +393,8 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recvData)
392393
// now client not include swimming flag in case jumping under water
393394
plrMover->SetInWater(!plrMover->IsInWater() || plrMover->GetBaseMap()->IsUnderWater(movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY(), movementInfo.pos.GetPositionZ()));
394395
}
396+
if (plrMover)//Hook for OnPlayerMove
397+
sScriptMgr->OnPlayerMove(plrMover, movementInfo, opcode);
395398
// Dont allow to turn on walking if charming other player
396399
if (mover->GetGUID() != _player->GetGUID())
397400
movementInfo.flags &= ~MOVEMENTFLAG_WALKING;

src/game/Scripting/ScriptMgr.cpp

Lines changed: 98 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,8 @@ void ScriptMgr::OnPlayerEnterMap(Map* map, Player* player)
602602
ASSERT(map);
603603
ASSERT(player);
604604

605+
FOREACH_SCRIPT(AllMapScript)->OnPlayerEnterAll(map, player);
606+
605607
FOREACH_SCRIPT(PlayerScript)->OnMapChanged(player);
606608

607609
SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
@@ -621,7 +623,9 @@ void ScriptMgr::OnPlayerLeaveMap(Map* map, Player* player)
621623
{
622624
ASSERT(map);
623625
ASSERT(player);
624-
626+
627+
FOREACH_SCRIPT(AllMapScript)->OnPlayerLeaveAll(map, player);
628+
625629
SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
626630
itr->second->OnPlayerLeave(map, player);
627631
SCR_MAP_END;
@@ -815,6 +819,8 @@ void ScriptMgr::OnCreatureUpdate(Creature* creature, uint32 diff)
815819
{
816820
ASSERT(creature);
817821

822+
FOREACH_SCRIPT(AllCreatureScript)->OnAllCreatureUpdate(creature, diff);
823+
818824
GET_SCRIPT(CreatureScript, creature->GetScriptId(), tmpscript);
819825
tmpscript->OnUpdate(creature, diff);
820826
}
@@ -1335,19 +1341,33 @@ void ScriptMgr::OnAfterPlayerMoveItemFromInventory(Player* player, Item* it, uin
13351341

13361342
void ScriptMgr::OnEquip(Player* player, Item* it, uint8 bag, uint8 slot, bool update)
13371343
{
1338-
FOREACH_SCRIPT(PlayerScript)->OnEquip(player, it, bag, slot, update);
1344+
FOREACH_SCRIPT(PlayerScript)->OnEquip(player, it, bag, slot, update);
13391345
}
13401346

13411347
void ScriptMgr::OnPlayerJoinBG(Player* player, Battleground* bg)
13421348
{
1343-
FOREACH_SCRIPT(PlayerScript)->OnPlayerJoinBG(player, bg);
1349+
FOREACH_SCRIPT(PlayerScript)->OnPlayerJoinBG(player, bg);
13441350
}
13451351

13461352
void ScriptMgr::OnPlayerJoinArena(Player* player, Battleground* bg)
13471353
{
1348-
FOREACH_SCRIPT(PlayerScript)->OnPlayerJoinArena(player, bg);
1354+
FOREACH_SCRIPT(PlayerScript)->OnPlayerJoinArena(player, bg);
13491355
}
13501356

1357+
void ScriptMgr::OnLootItem(Player* player, Item* item, uint32 count, uint64 lootguid)
1358+
{
1359+
FOREACH_SCRIPT(PlayerScript)->OnLootItem(player, item, count, lootguid);
1360+
}
1361+
1362+
void ScriptMgr::OnCreateItem(Player* player, Item* item, uint32 count)
1363+
{
1364+
FOREACH_SCRIPT(PlayerScript)->OnCreateItem(player, item, count);
1365+
}
1366+
1367+
void ScriptMgr::OnQuestRewardItem(Player* player, Item* item, uint32 count)
1368+
{
1369+
FOREACH_SCRIPT(PlayerScript)->OnQuestRewardItem(player, item, count);
1370+
}
13511371

13521372
// Guild
13531373
void ScriptMgr::OnGuildAddMember(Guild* guild, Player* player, uint8& plRank)
@@ -1455,6 +1475,76 @@ void ScriptMgr::OnBeforeUpdateArenaPoints(ArenaTeam* at, std::map<uint32, uint32
14551475
FOREACH_SCRIPT(GlobalScript)->OnBeforeUpdateArenaPoints(at,ap);
14561476
}
14571477

1478+
uint32 ScriptMgr::DealDamage(Unit* AttackerUnit, Unit *pVictim, uint32 damage, DamageEffectType damagetype)
1479+
{
1480+
FOR_SCRIPTS_RET(UnitScript, itr, end, damage)
1481+
damage = itr->second->DealDamage(AttackerUnit, pVictim, damage, damagetype);
1482+
return damage;
1483+
}
1484+
void ScriptMgr::Creature_SelectLevel(const CreatureTemplate *cinfo, Creature* creature)
1485+
{
1486+
FOREACH_SCRIPT(AllCreatureScript)->Creature_SelectLevel(cinfo, creature);
1487+
}
1488+
void ScriptMgr::OnHeal(Unit* healer, Unit* reciever, uint32& gain)
1489+
{
1490+
FOREACH_SCRIPT(UnitScript)->OnHeal(healer, reciever, gain);
1491+
}
1492+
1493+
void ScriptMgr::OnDamage(Unit* attacker, Unit* victim, uint32& damage)
1494+
{
1495+
FOREACH_SCRIPT(UnitScript)->OnDamage(attacker, victim, damage);
1496+
}
1497+
1498+
void ScriptMgr::ModifyPeriodicDamageAurasTick(Unit* target, Unit* attacker, uint32& damage)
1499+
{
1500+
FOREACH_SCRIPT(UnitScript)->ModifyPeriodicDamageAurasTick(target, attacker, damage);
1501+
}
1502+
1503+
void ScriptMgr::ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage)
1504+
{
1505+
FOREACH_SCRIPT(UnitScript)->ModifyMeleeDamage(target, attacker, damage);
1506+
}
1507+
1508+
void ScriptMgr::ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage)
1509+
{
1510+
FOREACH_SCRIPT(UnitScript)->ModifySpellDamageTaken(target, attacker, damage);
1511+
}
1512+
1513+
void ScriptMgr::ModifyHealRecieved(Unit* target, Unit* attacker, uint32& damage)
1514+
{
1515+
FOREACH_SCRIPT(UnitScript)->ModifyHealRecieved(target, attacker, damage);
1516+
}
1517+
1518+
void ScriptMgr::OnPlayerMove(Player* player, MovementInfo movementInfo, uint32 opcode)
1519+
{
1520+
FOREACH_SCRIPT(MovementHandlerScript)->OnPlayerMove(player, movementInfo, opcode);
1521+
}
1522+
1523+
AllMapScript::AllMapScript(const char* name)
1524+
: ScriptObject(name)
1525+
{
1526+
ScriptRegistry<AllMapScript>::AddScript(this);
1527+
}
1528+
1529+
AllCreatureScript::AllCreatureScript(const char* name)
1530+
: ScriptObject(name)
1531+
{
1532+
ScriptRegistry<AllCreatureScript>::AddScript(this);
1533+
}
1534+
1535+
UnitScript::UnitScript(const char* name, bool addToScripts)
1536+
: ScriptObject(name)
1537+
{
1538+
if (addToScripts)
1539+
ScriptRegistry<UnitScript>::AddScript(this);
1540+
}
1541+
1542+
MovementHandlerScript::MovementHandlerScript(const char* name)
1543+
: ScriptObject(name)
1544+
{
1545+
ScriptRegistry<MovementHandlerScript>::AddScript(this);
1546+
}
1547+
14581548
SpellScriptLoader::SpellScriptLoader(const char* name)
14591549
: ScriptObject(name)
14601550
{
@@ -1636,6 +1726,10 @@ template class ScriptRegistry<PlayerScript>;
16361726
template class ScriptRegistry<GuildScript>;
16371727
template class ScriptRegistry<GroupScript>;
16381728
template class ScriptRegistry<GlobalScript>;
1729+
template class ScriptRegistry<UnitScript>;
1730+
template class ScriptRegistry<AllCreatureScript>;
1731+
template class ScriptRegistry<AllMapScript>;
1732+
template class ScriptRegistry<MovementHandlerScript>;
16391733

16401734
// Undefine utility macros.
16411735
#undef GET_SCRIPT_RET

0 commit comments

Comments
 (0)