Misc fixes and missed stuff.

This commit is contained in:
hondacrx
2022-01-04 17:37:55 -05:00
parent ed761eb400
commit 97ce4d6db7
11 changed files with 112 additions and 102 deletions
+2 -1
View File
@@ -789,7 +789,8 @@ namespace Framework.Constants
CommandLookupMapId = 875, CommandLookupMapId = 875,
CommandLookupItemId = 876, CommandLookupItemId = 876,
CommandLookupQuestId = 877, CommandLookupQuestId = 877,
// 878-879 previously used, do not reuse // 878 previously used, do not reuse
CommandDebugPoolstatus = 879,
CommandPdumpCopy = 880, CommandPdumpCopy = 880,
CommandReloadVehicleTemplate = 881, CommandReloadVehicleTemplate = 881,
// Custom Permissions 1000+ // Custom Permissions 1000+
+6
View File
@@ -476,6 +476,12 @@ namespace Game.AI
return false; return false;
} }
if (me.GetCharmInfo() == null)
{
//Log.outError(LogFilter.ScriptsAi, $"me.GetCharmInfo() is NULL in PetAI::CanAttack(). Debug info: {}", GetDebugInfo());
return false;
}
// Passive - passive pets can attack if told to // Passive - passive pets can attack if told to
if (me.HasReactState(ReactStates.Passive)) if (me.HasReactState(ReactStates.Passive))
return me.GetCharmInfo().IsCommandAttack(); return me.GetCharmInfo().IsCommandAttack();
+55 -55
View File
@@ -47,18 +47,18 @@ namespace Game.BattlePets
foreach (var battlePetBreedState in CliDB.BattlePetBreedStateStorage.Values) foreach (var battlePetBreedState in CliDB.BattlePetBreedStateStorage.Values)
{ {
if (!_battlePetBreedStates.ContainsKey(battlePetBreedState.BattlePetBreedID)) if (!BattlePetBreedStates.ContainsKey(battlePetBreedState.BattlePetBreedID))
_battlePetBreedStates[battlePetBreedState.BattlePetBreedID] = new Dictionary<BattlePetState, int>(); BattlePetBreedStates[battlePetBreedState.BattlePetBreedID] = new Dictionary<BattlePetState, int>();
_battlePetBreedStates[battlePetBreedState.BattlePetBreedID][(BattlePetState)battlePetBreedState.BattlePetStateID] = battlePetBreedState.Value; BattlePetBreedStates[battlePetBreedState.BattlePetBreedID][(BattlePetState)battlePetBreedState.BattlePetStateID] = battlePetBreedState.Value;
} }
foreach (var battlePetSpeciesState in CliDB.BattlePetSpeciesStateStorage.Values) foreach (var battlePetSpeciesState in CliDB.BattlePetSpeciesStateStorage.Values)
{ {
if (!_battlePetSpeciesStates.ContainsKey(battlePetSpeciesState.BattlePetSpeciesID)) if (!BattlePetSpeciesStates.ContainsKey(battlePetSpeciesState.BattlePetSpeciesID))
_battlePetSpeciesStates[battlePetSpeciesState.BattlePetSpeciesID] = new Dictionary<BattlePetState, int>(); BattlePetSpeciesStates[battlePetSpeciesState.BattlePetSpeciesID] = new Dictionary<BattlePetState, int>();
_battlePetSpeciesStates[battlePetSpeciesState.BattlePetSpeciesID][(BattlePetState)battlePetSpeciesState.BattlePetStateID] = battlePetSpeciesState.Value; BattlePetSpeciesStates[battlePetSpeciesState.BattlePetSpeciesID][(BattlePetState)battlePetSpeciesState.BattlePetStateID] = battlePetSpeciesState.Value;
} }
LoadAvailablePetBreeds(); LoadAvailablePetBreeds();
@@ -709,62 +709,62 @@ namespace Game.BattlePets
Dictionary<ulong, BattlePet> _pets = new(); Dictionary<ulong, BattlePet> _pets = new();
List<BattlePetSlot> _slots = new(); List<BattlePetSlot> _slots = new();
static Dictionary<uint, Dictionary<BattlePetState, int>> _battlePetBreedStates = new(); public static Dictionary<uint, Dictionary<BattlePetState, int>> BattlePetBreedStates = new();
static Dictionary<uint, Dictionary<BattlePetState, int>> _battlePetSpeciesStates = new(); public static Dictionary<uint, Dictionary<BattlePetState, int>> BattlePetSpeciesStates = new();
static MultiMap<uint, byte> _availableBreedsPerSpecies = new(); static MultiMap<uint, byte> _availableBreedsPerSpecies = new();
static Dictionary<uint, BattlePetBreedQuality> _defaultQualityPerSpecies = new(); static Dictionary<uint, BattlePetBreedQuality> _defaultQualityPerSpecies = new();
}
public class BattlePet public class BattlePet
{
public void CalculateStats()
{ {
public void CalculateStats() // get base breed stats
var breedState = BattlePetMgr.BattlePetBreedStates.LookupByKey(PacketInfo.Breed);
if (breedState == null) // non existing breed id
return;
float health = breedState[BattlePetState.StatStamina];
float power = breedState[BattlePetState.StatPower];
float speed = breedState[BattlePetState.StatSpeed];
// modify stats depending on species - not all pets have this
var speciesState = BattlePetMgr.BattlePetSpeciesStates.LookupByKey(PacketInfo.Species);
if (speciesState != null)
{ {
// get base breed stats health += speciesState[BattlePetState.StatStamina];
var breedState = _battlePetBreedStates.LookupByKey(PacketInfo.Breed); power += speciesState[BattlePetState.StatPower];
if (breedState == null) // non existing breed id speed += speciesState[BattlePetState.StatSpeed];
return;
float health = breedState[BattlePetState.StatStamina];
float power = breedState[BattlePetState.StatPower];
float speed = breedState[BattlePetState.StatSpeed];
// modify stats depending on species - not all pets have this
var speciesState = _battlePetSpeciesStates.LookupByKey(PacketInfo.Species);
if (speciesState != null)
{
health += speciesState[BattlePetState.StatStamina];
power += speciesState[BattlePetState.StatPower];
speed += speciesState[BattlePetState.StatSpeed];
}
// modify stats by quality
foreach (var battlePetBreedQuality in CliDB.BattlePetBreedQualityStorage.Values)
{
if (battlePetBreedQuality.QualityEnum == PacketInfo.Quality)
{
health *= battlePetBreedQuality.StateMultiplier;
power *= battlePetBreedQuality.StateMultiplier;
speed *= battlePetBreedQuality.StateMultiplier;
break;
}
// TOOD: add check if pet has existing quality
}
// scale stats depending on level
health *= PacketInfo.Level;
power *= PacketInfo.Level;
speed *= PacketInfo.Level;
// set stats
// round, ceil or floor? verify this
PacketInfo.MaxHealth = (uint)((Math.Round(health / 20) + 100));
PacketInfo.Power = (uint)(Math.Round(power / 100));
PacketInfo.Speed = (uint)(Math.Round(speed / 100));
} }
public BattlePetStruct PacketInfo; // modify stats by quality
public long NameTimestamp; foreach (var battlePetBreedQuality in CliDB.BattlePetBreedQualityStorage.Values)
public DeclinedName DeclinedName; {
public BattlePetSaveInfo SaveInfo; if (battlePetBreedQuality.QualityEnum == PacketInfo.Quality)
{
health *= battlePetBreedQuality.StateMultiplier;
power *= battlePetBreedQuality.StateMultiplier;
speed *= battlePetBreedQuality.StateMultiplier;
break;
}
// TOOD: add check if pet has existing quality
}
// scale stats depending on level
health *= PacketInfo.Level;
power *= PacketInfo.Level;
speed *= PacketInfo.Level;
// set stats
// round, ceil or floor? verify this
PacketInfo.MaxHealth = (uint)((Math.Round(health / 20) + 100));
PacketInfo.Power = (uint)(Math.Round(power / 100));
PacketInfo.Speed = (uint)(Math.Round(speed / 100));
} }
public BattlePetStruct PacketInfo;
public long NameTimestamp;
public DeclinedName DeclinedName;
public BattlePetSaveInfo SaveInfo;
} }
} }
@@ -33,7 +33,6 @@ namespace Game.Chat
_guidGenerator = new ObjectGuidGenerator(HighGuid.ChatChannel); _guidGenerator = new ObjectGuidGenerator(HighGuid.ChatChannel);
} }
/*static*/
public static void LoadFromDB() public static void LoadFromDB()
{ {
if (!WorldConfig.GetBoolValue(WorldCfg.PreserveCustomChannels)) if (!WorldConfig.GetBoolValue(WorldCfg.PreserveCustomChannels))
+1 -1
View File
@@ -271,7 +271,7 @@ namespace Game.Combat
{ {
_owner.AddUnitFlag(UnitFlags.InCombat); _owner.AddUnitFlag(UnitFlags.InCombat);
_owner.AtEnterCombat(); _owner.AtEnterCombat();
if (_owner.IsCreature()) if (!_owner.IsCreature())
_owner.AtEngage(GetAnyTarget()); _owner.AtEngage(GetAnyTarget());
} }
else else
@@ -1210,7 +1210,7 @@ namespace Game.Entities
public UpdateField<uint> MaxItemLevel = new(96, 106); public UpdateField<uint> MaxItemLevel = new(96, 106);
public UpdateField<int> AzeriteItemLevel = new(96, 107); public UpdateField<int> AzeriteItemLevel = new(96, 107);
public UpdateField<uint> WildBattlePetLevel = new(96, 108); public UpdateField<uint> WildBattlePetLevel = new(96, 108);
public UpdateField<int> BattlePetCompanionExperience = new(96, 109); public UpdateField<uint> BattlePetCompanionExperience = new(96, 109);
public UpdateField<uint> BattlePetCompanionNameTimestamp = new(96, 110); public UpdateField<uint> BattlePetCompanionNameTimestamp = new(96, 110);
public UpdateField<int> InteractSpellID = new(96, 111); public UpdateField<int> InteractSpellID = new(96, 111);
public UpdateField<int> ScaleDuration = new(96, 112); public UpdateField<int> ScaleDuration = new(96, 112);
@@ -1403,7 +1403,7 @@ namespace Game.Entities
data.WriteUInt32(MaxItemLevel); data.WriteUInt32(MaxItemLevel);
data.WriteInt32(AzeriteItemLevel); data.WriteInt32(AzeriteItemLevel);
data.WriteUInt32(WildBattlePetLevel); data.WriteUInt32(WildBattlePetLevel);
data.WriteInt32(BattlePetCompanionExperience); data.WriteUInt32(BattlePetCompanionExperience);
data.WriteUInt32(BattlePetCompanionNameTimestamp); data.WriteUInt32(BattlePetCompanionNameTimestamp);
data.WriteInt32(InteractSpellID); data.WriteInt32(InteractSpellID);
data.WriteInt32(ScaleDuration); data.WriteInt32(ScaleDuration);
@@ -1944,7 +1944,7 @@ namespace Game.Entities
} }
if (changesMask[109]) if (changesMask[109])
{ {
data.WriteInt32(BattlePetCompanionExperience); data.WriteUInt32(BattlePetCompanionExperience);
} }
if (changesMask[110]) if (changesMask[110])
{ {
+1 -1
View File
@@ -4847,7 +4847,7 @@ namespace Game.Entities
void SendTameFailure(PetTameResult result) void SendTameFailure(PetTameResult result)
{ {
PetTameFailure petTameFailure = new(); PetTameFailure petTameFailure = new();
petTameFailure.Result = result; petTameFailure.Result = (byte)result;
SendPacket(petTameFailure); SendPacket(petTameFailure);
} }
+2 -2
View File
@@ -44,7 +44,7 @@ namespace Game
[WorldPacketHandler(ClientOpcodes.BattlePetSetBattleSlot)] [WorldPacketHandler(ClientOpcodes.BattlePetSetBattleSlot)]
void HandleBattlePetSetBattleSlot(BattlePetSetBattleSlot battlePetSetBattleSlot) void HandleBattlePetSetBattleSlot(BattlePetSetBattleSlot battlePetSetBattleSlot)
{ {
BattlePetMgr.BattlePet pet = GetBattlePetMgr().GetPet(battlePetSetBattleSlot.PetGuid); BattlePet pet = GetBattlePetMgr().GetPet(battlePetSetBattleSlot.PetGuid);
if (pet != null) if (pet != null)
{ {
BattlePetSlot slot = GetBattlePetMgr().GetSlot((BattlePetSlots)battlePetSetBattleSlot.Slot); BattlePetSlot slot = GetBattlePetMgr().GetSlot((BattlePetSlots)battlePetSetBattleSlot.Slot);
@@ -82,7 +82,7 @@ namespace Game
return; return;
} }
BattlePetMgr.BattlePet battlePet = petOwner.ToPlayer().GetSession().GetBattlePetMgr().GetPet(queryBattlePetName.BattlePetID); BattlePet battlePet = petOwner.ToPlayer().GetSession().GetBattlePetMgr().GetPet(queryBattlePetName.BattlePetID);
if (battlePet == null) if (battlePet == null)
{ {
SendPacket(response); SendPacket(response);
@@ -0,0 +1,42 @@
/*
* Copyright (C) 2012-2020 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Game.Entities;
namespace Game.Miscellaneous
{
/// Only returns true for the given attacker's current victim, if any
public class IsVictimOf : ICheck<WorldObject>
{
WorldObject _victim;
public IsVictimOf(Unit attacker)
{
_victim = attacker?.GetVictim();
}
public bool Invoke(WorldObject obj)
{
return obj != null && (_victim == obj);
}
}
}
-4
View File
@@ -2784,10 +2784,6 @@ namespace Game.Spells
if (unitTarget != null && unitCaster != null) if (unitTarget != null && unitCaster != null)
unitCaster.CastSpell(unitTarget, Convert.ToBoolean(RandomHelper.IRand(0, 1)) ? (uint)damage : 52505, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); unitCaster.CastSpell(unitTarget, Convert.ToBoolean(RandomHelper.IRand(0, 1)) ? (uint)damage : 52505, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId));
return; return;
case 53110: // Devour Humanoid
if (unitTarget != null)
unitTarget.CastSpell(m_caster, (uint)damage, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId));
return;
case 57347: // Retrieving (Wintergrasp RP-GG pickup spell) case 57347: // Retrieving (Wintergrasp RP-GG pickup spell)
{ {
if (unitTarget == null || !unitTarget.IsTypeId(TypeId.Unit) || !m_caster.IsTypeId(TypeId.Player)) if (unitTarget == null || !unitTarget.IsTypeId(TypeId.Unit) || !m_caster.IsTypeId(TypeId.Player))
-34
View File
@@ -214,40 +214,6 @@ namespace Scripts.World.ItemScripts
} }
} }
[Script]
class item_pile_fake_furs : ItemScript
{
public item_pile_fake_furs() : base("item_pile_fake_furs") { }
public override bool OnUse(Player player, Item item, SpellCastTargets targets, ObjectGuid castId)
{
GameObject go = null;
foreach (var id in GameObjectIds.CaribouTraps)
{
go = player.FindNearestGameObject(id, 5.0f);
if (go)
break;
}
if (!go)
return false;
if (go.FindNearestCreature(CreatureIds.NesingwaryTrapper, 10.0f, true) || go.FindNearestCreature(CreatureIds.NesingwaryTrapper, 10.0f, false) || go.FindNearestGameObject(GameObjectIds.HighQualityFur, 2.0f))
return true;
go.GetClosePoint(out float x, out float y, out float z, go.GetCombatReach() / 3, 7.0f);
go.SummonGameObject(GameObjectIds.HighQualityFur, go, Quaternion.CreateFromRotationMatrix(Extensions.fromEulerAnglesZYX(go.GetOrientation(), 0.0f, 0.0f)), 1);
TempSummon summon = player.SummonCreature(CreatureIds.NesingwaryTrapper, x, y, z, go.GetOrientation(), TempSummonType.DeadDespawn, 1000);
if (summon)
{
summon.SetVisible(false);
summon.SetReactState(ReactStates.Passive);
summon.SetImmuneToPC(true);
}
return false;
}
}
[Script] [Script]
class item_petrov_cluster_bombs : ItemScript class item_petrov_cluster_bombs : ItemScript
{ {