Core/Loot: Move loot generation out of Player::SendLoot

Port From (https://github.com/TrinityCore/TrinityCore/commit/8c20f620d7b070b13b40803095e5fa97f9349512)
This commit is contained in:
hondacrx
2022-09-18 22:13:40 -04:00
parent aa88c5bb2f
commit 6c7991c28f
6 changed files with 185 additions and 230 deletions
+86 -9
View File
@@ -1225,24 +1225,65 @@ namespace Game.Spells
return;
case GameObjectTypes.SpellFocus:
{
// triggering linked GO
uint trapEntry = gameObjTarget.GetGoInfo().SpellFocus.linkedTrap;
if (trapEntry != 0)
gameObjTarget.TriggeringLinkedGameObject(trapEntry, player);
return;
}
case GameObjectTypes.Chest:
{
// @todo possible must be moved to loot release (in different from linked triggering)
if (gameObjTarget.GetGoInfo().Chest.triggeredEvent != 0)
var bg = player.GetBattleground();
if (bg != null)
{
Log.outDebug(LogFilter.Spells, "Chest ScriptStart id {0} for GO {1}", gameObjTarget.GetGoInfo().Chest.triggeredEvent, gameObjTarget.GetSpawnId());
player.GetMap().ScriptsStart(ScriptsType.Event, gameObjTarget.GetGoInfo().Chest.triggeredEvent, player, gameObjTarget);
if (!bg.CanActivateGO((int)gameObjTarget.GetEntry(), (uint)bg.GetPlayerTeam(player.GetGUID())))
{
player.SendLootRelease(guid);
return;
}
}
// triggering linked GO
uint _trapEntry = gameObjTarget.GetGoInfo().Chest.linkedTrap;
if (_trapEntry != 0)
gameObjTarget.TriggeringLinkedGameObject(_trapEntry, player);
if (gameObjTarget.GetLootState() == LootState.Ready)
{
uint lootId = gameObjTarget.GetGoInfo().GetLootId();
if (lootId != 0)
{
gameObjTarget.SetLootGenerationTime();
Group group = player.GetGroup();
bool groupRules = group != null && gameObjTarget.GetGoInfo().Chest.usegrouplootrules != 0;
Loot loot = new(gameObjTarget.GetMap(), guid, loottype, groupRules ? group : null);
gameObjTarget.loot = loot;
loot.FillLoot(lootId, LootStorage.Gameobject, player, !groupRules, false, gameObjTarget.GetLootMode(), gameObjTarget.GetMap().GetDifficultyLootItemContext());
if (gameObjTarget.GetLootMode() > 0)
{
var addon = gameObjTarget.GetTemplateAddon();
if (addon != null)
loot.GenerateMoneyLoot(addon.Mingold, addon.Maxgold);
}
}
/// @todo possible must be moved to loot release (in different from linked triggering)
if (gameObjTarget.GetGoInfo().Chest.triggeredEvent != 0)
{
Log.outDebug(LogFilter.Spells, $"Chest ScriptStart id {gameObjTarget.GetGoInfo().Chest.triggeredEvent} for GO {gameObjTarget.GetSpawnId()}");
GameEvents.Trigger(gameObjTarget.GetGoInfo().Chest.triggeredEvent, player, gameObjTarget);
}
// triggering linked GO
uint trapEntry = gameObjTarget.GetGoInfo().Chest.linkedTrap;
if (trapEntry != 0)
gameObjTarget.TriggeringLinkedGameObject(trapEntry, player);
gameObjTarget.SetLootState(LootState.Activated, player);
}
break;
}
// Don't return, let loots been taken
default:
break;
@@ -1909,10 +1950,37 @@ namespace Game.Spells
if (effectHandleMode != SpellEffectHandleMode.HitTarget)
return;
if (!m_caster.IsTypeId(TypeId.Player))
Player player = m_caster.ToPlayer();
if (player == null)
return;
m_caster.ToPlayer().SendLoot(unitTarget.GetGUID(), LootType.Pickpocketing);
Creature creature = unitTarget?.ToCreature();
if (creature == null)
return;
if (creature.CanGeneratePickPocketLoot())
{
creature.StartPickPocketRefillTimer();
creature.loot = new Loot(creature.GetMap(), creature.GetGUID(), LootType.Pickpocketing, null);
uint lootid = creature.GetCreatureTemplate().PickPocketId;
if (lootid != 0)
creature.loot.FillLoot(lootid, LootStorage.Pickpocketing, player, true);
// Generate extra money for pick pocket loot
uint a = RandomHelper.URand(0, creature.GetLevel() / 2);
uint b = RandomHelper.URand(0, player.GetLevel() / 2);
creature.loot.gold = (uint)(10 * (a + b) * WorldConfig.GetFloatValue(WorldCfg.RateDropMoney));
}
else if (creature.loot != null)
{
if (creature.loot.loot_type == LootType.Pickpocketing && creature.loot.IsLooted())
player.SendLootError(creature.loot.GetGUID(), creature.GetGUID(), LootError.AlreadPickPocketed);
return;
}
player.SendLoot(unitTarget.GetGUID(), LootType.Pickpocketing);
}
[SpellEffectHandler(SpellEffectName.AddFarsight)]
@@ -3170,6 +3238,8 @@ namespace Game.Spells
if (caster != null)
{
caster.UpdateCraftSkill(m_spellInfo);
itemTarget.loot = new Loot(caster.GetMap(), itemTarget.GetGUID(), LootType.Disenchanting, null);
itemTarget.loot.FillLoot(itemTarget.GetDisenchantLoot(caster).Id, LootStorage.Disenchant, caster, true);
caster.SendLoot(itemTarget.GetGUID(), LootType.Disenchanting);
}
@@ -3543,6 +3613,9 @@ namespace Game.Spells
creature.RemoveUnitFlag(UnitFlags.Skinnable);
creature.SetDynamicFlag(UnitDynFlags.Lootable);
creature.loot = new Loot(creature.GetMap(), creature.GetGUID(), LootType.Skinning, null);
creature.loot.FillLoot(creature.GetCreatureTemplate().SkinLootId, LootStorage.Skinning, player, true);
creature.SetLootRecipient(player, false);
player.SendLoot(creature.GetGUID(), LootType.Skinning);
if (skill == SkillType.Skinning)
@@ -4254,6 +4327,8 @@ namespace Game.Spells
player.UpdateGatherSkill(SkillType.Jewelcrafting, SkillValue, reqSkillValue);
}
itemTarget.loot = new Loot(player.GetMap(), itemTarget.GetGUID(), LootType.Prospecting, null);
itemTarget.loot.FillLoot(itemTarget.GetEntry(), LootStorage.Prospecting, player, true);
player.SendLoot(itemTarget.GetGUID(), LootType.Prospecting);
}
@@ -4280,6 +4355,8 @@ namespace Game.Spells
player.UpdateGatherSkill(SkillType.Inscription, SkillValue, reqSkillValue);
}
itemTarget.loot = new Loot(player.GetMap(), itemTarget.GetGUID(), LootType.Milling, null);
itemTarget.loot.FillLoot(itemTarget.GetEntry(), LootStorage.Milling, player, true);
player.SendLoot(itemTarget.GetGUID(), LootType.Milling);
}