diff --git a/Source/Framework/Constants/PetConst.cs b/Source/Framework/Constants/PetConst.cs index 29cb841fd..f89a9c57b 100644 --- a/Source/Framework/Constants/PetConst.cs +++ b/Source/Framework/Constants/PetConst.cs @@ -34,11 +34,11 @@ namespace Framework.Constants public enum PetSaveMode { - AsDeleted = -1, // not saved in fact + NotInSlot = -1, // for avoid conflict with stable size grow will use negative value + AsDeleted = -2, // not saved in fact AsCurrent = 0, // in current slot (with player) FirstStableSlot = 1, - LastStableSlot = 4, // last in DB stable slot index (including), all higher have same meaning as PET_SAVE_NOT_IN_SLOT - NotInSlot = 100 // for avoid conflict with stable size grow will use 100 + LastStableSlot = SharedConst.MaxPetStables, // last in DB stable slot index (including), all higher have same meaning as PET_SAVE_NOT_IN_SLOT } public enum PetSpellState diff --git a/Source/Framework/Database/Databases/CharacterDatabase.cs b/Source/Framework/Database/Databases/CharacterDatabase.cs index 63a8d3230..cd87c0cf1 100644 --- a/Source/Framework/Database/Databases/CharacterDatabase.cs +++ b/Source/Framework/Database/Databases/CharacterDatabase.cs @@ -721,7 +721,7 @@ namespace Framework.Database PrepareStatement(CharStatements.UPD_CHAR_PET_NAME, "UPDATE character_pet SET name = ?, renamed = 1 WHERE owner = ? AND id = ?"); PrepareStatement(CharStatements.UPD_CHAR_PET_SLOT_BY_ID, "UPDATE character_pet SET slot = ? WHERE owner = ? AND id = ?"); PrepareStatement(CharStatements.DEL_CHAR_PET_BY_ID, "DELETE FROM character_pet WHERE id = ?"); - PrepareStatement(CharStatements.DEL_CHAR_PET_BY_SLOT, "DELETE FROM character_pet WHERE owner = ? AND (slot = ? OR slot > ?)"); + PrepareStatement(CharStatements.DEL_CHAR_PET_BY_SLOT, "DELETE FROM character_pet WHERE owner = ? AND slot IN (?, ?)"); PrepareStatement(CharStatements.DEL_ALL_PET_SPELLS_BY_OWNER, "DELETE FROM pet_spell WHERE guid in (SELECT id FROM character_pet WHERE owner=?)"); PrepareStatement(CharStatements.UPD_PET_SPECS_BY_OWNER, "UPDATE character_pet SET specialization = 0 WHERE owner=?"); PrepareStatement(CharStatements.INS_PET, "INSERT INTO character_pet (id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, abdata, savetime, CreatedBySpell, PetType, specialization) " + diff --git a/Source/Game/Entities/Pet.cs b/Source/Game/Entities/Pet.cs index c808b5fce..e76ac4c44 100644 --- a/Source/Game/Entities/Pet.cs +++ b/Source/Game/Entities/Pet.cs @@ -457,12 +457,12 @@ namespace Game.Entities trans.Append(stmt); // prevent existence another hunter pet in PET_SAVE_AS_CURRENT and PET_SAVE_NOT_IN_SLOT - if (GetPetType() == PetType.Hunter && (mode == PetSaveMode.AsCurrent || mode > PetSaveMode.LastStableSlot)) + if (GetPetType() == PetType.Hunter && (mode == PetSaveMode.AsCurrent || mode == PetSaveMode.LastStableSlot)) { stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_CHAR_PET_BY_SLOT); stmt.AddValue(0, ownerLowGUID); - stmt.AddValue(1, (byte)PetSaveMode.AsCurrent); - stmt.AddValue(2, (byte)PetSaveMode.LastStableSlot); + stmt.AddValue(1, (short)mode); + stmt.AddValue(2, (short)PetSaveMode.NotInSlot); trans.Append(stmt); } diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index 40d732ec5..7516f8508 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -1558,7 +1558,7 @@ namespace Game.Entities petInfo.Level = result.Read(3); petInfo.Experience = result.Read(4); petInfo.ReactState = (ReactStates)result.Read(5); - PetSaveMode slot = (PetSaveMode)result.Read(6); + PetSaveMode slot = (PetSaveMode)result.Read(6); petInfo.Name = result.Read(7); petInfo.WasRenamed = result.Read(8); petInfo.Health = result.Read(9); diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index 52ebcb22f..d3799f816 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -4833,7 +4833,7 @@ namespace Game.Entities { // Handle removing pet while it is in "temporarily unsummoned" state, for example on mount PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_CHAR_PET_SLOT_BY_ID); - stmt.AddValue(0, (byte)PetSaveMode.NotInSlot); + stmt.AddValue(0, (short)PetSaveMode.NotInSlot); stmt.AddValue(1, GetGUID().GetCounter()); stmt.AddValue(2, m_petStable.CurrentPet.PetNumber); DB.Characters.Execute(stmt);