Core/Player: Extend action button value to uint64 to be able to hold battle pet guids
Port From (https://github.com/TrinityCore/TrinityCore/commit/f67cd38312014b13624dcb5fe1d117dac4892b7d)
This commit is contained in:
@@ -676,7 +676,7 @@ namespace Game.Entities
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
byte button = result.Read<byte>(0);
|
byte button = result.Read<byte>(0);
|
||||||
uint action = result.Read<uint>(1);
|
ulong action = result.Read<ulong>(1);
|
||||||
byte type = result.Read<byte>(2);
|
byte type = result.Read<byte>(2);
|
||||||
|
|
||||||
ActionButton ab = AddActionButton(button, action, type);
|
ActionButton ab = AddActionButton(button, action, type);
|
||||||
@@ -684,7 +684,7 @@ namespace Game.Entities
|
|||||||
ab.uState = ActionButtonUpdateState.UnChanged;
|
ab.uState = ActionButtonUpdateState.UnChanged;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.Player, " ...at loading, and will deleted in DB also");
|
Log.outError(LogFilter.Player, $"Player::_LoadActions: Player '{GetName()}' ({GetGUID()}) has an invalid action button (Button: {button}, Action: {action}, Type: {type}). It will be deleted at next save. This can be due to a player changing their talents.");
|
||||||
|
|
||||||
// Will deleted in DB at next save (it can create data until save but marked as deleted)
|
// Will deleted in DB at next save (it can create data until save but marked as deleted)
|
||||||
m_actionButtons[button] = new ActionButton();
|
m_actionButtons[button] = new ActionButton();
|
||||||
|
|||||||
@@ -413,8 +413,10 @@ namespace Game.Entities
|
|||||||
uState = ActionButtonUpdateState.New;
|
uState = ActionButtonUpdateState.New;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ActionButtonType GetButtonType() { return (ActionButtonType)((packedData & 0xFFFFFFFF00000000) >> 56); }
|
public ActionButtonType GetButtonType() { return (ActionButtonType)((packedData & 0xFF00000000000000) >> 56); }
|
||||||
public uint GetAction() { return (uint)(packedData & 0x00000000FFFFFFFF); }
|
|
||||||
|
public ulong GetAction() { return (packedData & 0x00FFFFFFFFFFFFFF); }
|
||||||
|
|
||||||
public void SetActionAndType(ulong action, ActionButtonType type)
|
public void SetActionAndType(ulong action, ActionButtonType type)
|
||||||
{
|
{
|
||||||
ulong newData = action | ((ulong)type << 56);
|
ulong newData = action | ((ulong)type << 56);
|
||||||
|
|||||||
@@ -1327,39 +1327,39 @@ namespace Game.Entities
|
|||||||
return (byte)_CUFProfiles.Count(p => p != null);
|
return (byte)_CUFProfiles.Count(p => p != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsActionButtonDataValid(byte button, uint action, uint type)
|
bool IsActionButtonDataValid(byte button, ulong action, uint type)
|
||||||
{
|
{
|
||||||
if (button >= PlayerConst.MaxActionButtons)
|
if (button >= PlayerConst.MaxActionButtons)
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.Player, "Action {0} not added into button {1} for player {2} (GUID: {3}): button must be < {4}", action, button, GetName(), GetGUID(), PlayerConst.MaxActionButtons);
|
Log.outError(LogFilter.Player, $"Player::IsActionButtonDataValid: Action {action} not added into button {button} for player {GetName()} ({GetGUID()}): button must be < {PlayerConst.MaxActionButtons}");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action >= PlayerConst.MaxActionButtonActionValue)
|
if (action >= PlayerConst.MaxActionButtonActionValue)
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.Player, "Action {0} not added into button {1} for player {2} (GUID: {3}): action must be < {4}", action, button, GetName(), GetGUID(), PlayerConst.MaxActionButtonActionValue);
|
Log.outError(LogFilter.Player, $"Player::IsActionButtonDataValid: Action {action} not added into button {button} for player {GetName()} ({GetGUID()}): action must be < {PlayerConst.MaxActionButtonActionValue}");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ((ActionButtonType)type)
|
switch ((ActionButtonType)type)
|
||||||
{
|
{
|
||||||
case ActionButtonType.Spell:
|
case ActionButtonType.Spell:
|
||||||
if (!Global.SpellMgr.HasSpellInfo(action, Difficulty.None))
|
if (!Global.SpellMgr.HasSpellInfo((uint)action, Difficulty.None))
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.Player, "Spell action {0} not added into button {1} for player {2} (GUID: {3}): spell not exist", action, button, GetName(), GetGUID());
|
Log.outError(LogFilter.Player, $"Player::IsActionButtonDataValid: Spell action {action} not added into button {button} for player {GetName()} ({GetGUID()}): spell not exist");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!HasSpell(action))
|
if (!HasSpell((uint)action))
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.Player, "Spell action {0} not added into button {1} for player {2} (GUID: {3}): player don't known this spell", action, button, GetName(), GetGUID());
|
Log.outError(LogFilter.Player, $"Player::IsActionButtonDataValid: Spell action {action} not added into button {button} for player {GetName()} ({GetGUID()}): player don't known this spell");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ActionButtonType.Item:
|
case ActionButtonType.Item:
|
||||||
if (Global.ObjectMgr.GetItemTemplate(action) == null)
|
if (Global.ObjectMgr.GetItemTemplate((uint)action) == null)
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.Player, "Item action {0} not added into button {1} for player {2} (GUID: {3}): item not exist", action, button, GetName(), GetGUID());
|
Log.outError(LogFilter.Player, $"Player::IsActionButtonDataValid: Item action {action} not added into button {button} for player {GetName()} ({GetGUID()}): item not exist");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1376,13 +1376,13 @@ namespace Game.Entities
|
|||||||
var mount = CliDB.MountStorage.LookupByKey(action);
|
var mount = CliDB.MountStorage.LookupByKey(action);
|
||||||
if (mount == null)
|
if (mount == null)
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.Player, "Mount action {0} not added into button {1} for player {2} ({3}): mount does not exist", action, button, GetName(), GetGUID().ToString());
|
Log.outError(LogFilter.Player, $"Player::IsActionButtonDataValid: Mount action {action} not added into button {button} for player {GetName()} ({GetGUID()}): mount does not exist");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!HasSpell(mount.SourceSpellID))
|
if (!HasSpell(mount.SourceSpellID))
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.Player, "Mount action {0} not added into button {1} for player {2} ({3}): Player does not know this mount", action, button, GetName(), GetGUID().ToString());
|
Log.outError(LogFilter.Player, $"Player::IsActionButtonDataValid: Mount action {action} not added into button {button} for player {GetName()} ({GetGUID()}): Player does not know this mount");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1392,14 +1392,16 @@ namespace Game.Entities
|
|||||||
case ActionButtonType.Eqset:
|
case ActionButtonType.Eqset:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Log.outError(LogFilter.Player, "Unknown action type {0}", type);
|
Log.outError(LogFilter.Player, $"Unknown action type {type}");
|
||||||
return false; // other cases not checked at this moment
|
return false; // other cases not checked at this moment
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetMultiActionBars(byte mask) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.MultiActionBars), mask); }
|
public void SetMultiActionBars(byte mask) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.MultiActionBars), mask); }
|
||||||
public ActionButton AddActionButton(byte button, uint action, uint type)
|
|
||||||
|
public ActionButton AddActionButton(byte button, ulong action, uint type)
|
||||||
{
|
{
|
||||||
if (!IsActionButtonDataValid(button, action, type))
|
if (!IsActionButtonDataValid(button, action, type))
|
||||||
return null;
|
return null;
|
||||||
@@ -1413,7 +1415,7 @@ namespace Game.Entities
|
|||||||
// set data and update to CHANGED if not NEW
|
// set data and update to CHANGED if not NEW
|
||||||
ab.SetActionAndType(action, (ActionButtonType)type);
|
ab.SetActionAndType(action, (ActionButtonType)type);
|
||||||
|
|
||||||
Log.outDebug(LogFilter.Player, "Player '{0}' Added Action '{1}' (type {2}) to Button '{3}'", GetGUID().ToString(), action, type, button);
|
Log.outDebug(LogFilter.Player, $"Player::AddActionButton: Player '{GetName()}' ({GetGUID()}) added action '{action}' (type {type}) to button '{button}'");
|
||||||
return ab;
|
return ab;
|
||||||
}
|
}
|
||||||
public void RemoveActionButton(byte _button)
|
public void RemoveActionButton(byte _button)
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ namespace Game
|
|||||||
[WorldPacketHandler(ClientOpcodes.SetActionButton)]
|
[WorldPacketHandler(ClientOpcodes.SetActionButton)]
|
||||||
void HandleSetActionButton(SetActionButton packet)
|
void HandleSetActionButton(SetActionButton packet)
|
||||||
{
|
{
|
||||||
uint action = packet.GetButtonAction();
|
ulong action = packet.GetButtonAction();
|
||||||
uint type = packet.GetButtonType();
|
uint type = packet.GetButtonType();
|
||||||
|
|
||||||
if (packet.Action == 0)
|
if (packet.Action == 0)
|
||||||
|
|||||||
@@ -160,10 +160,10 @@ namespace Game.Networking.Packets
|
|||||||
Index = _worldPacket.ReadUInt8();
|
Index = _worldPacket.ReadUInt8();
|
||||||
}
|
}
|
||||||
|
|
||||||
public uint GetButtonAction() { return (uint)(Action & 0x00000000FFFFFFFF); }
|
public uint GetButtonAction() { return (uint)(Action & 0x00FFFFFFFFFFFFFF); }
|
||||||
public uint GetButtonType() { return (uint)((Action & 0xFFFFFFFF00000000) >> 56); }
|
public uint GetButtonType() { return (uint)((Action & 0xFF00000000000000) >> 56); }
|
||||||
|
|
||||||
public ulong Action; // two packed public uint (action and type)
|
public ulong Action; // two packed values (action and type)
|
||||||
public byte Index;
|
public byte Index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4909,7 +4909,7 @@ namespace Game.Spells
|
|||||||
|
|
||||||
//! Action button data is unverified when it's set so it can be "hacked"
|
//! Action button data is unverified when it's set so it can be "hacked"
|
||||||
//! to contain invalid spells, so filter here.
|
//! to contain invalid spells, so filter here.
|
||||||
uint spell_id = ab.GetAction();
|
uint spell_id = (uint)ab.GetAction();
|
||||||
if (spell_id == 0)
|
if (spell_id == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|||||||
@@ -459,7 +459,7 @@ CREATE TABLE `character_action` (
|
|||||||
`guid` bigint unsigned NOT NULL DEFAULT '0',
|
`guid` bigint unsigned NOT NULL DEFAULT '0',
|
||||||
`spec` tinyint unsigned NOT NULL DEFAULT '0',
|
`spec` tinyint unsigned NOT NULL DEFAULT '0',
|
||||||
`button` tinyint unsigned NOT NULL DEFAULT '0',
|
`button` tinyint unsigned NOT NULL DEFAULT '0',
|
||||||
`action` int unsigned NOT NULL DEFAULT '0',
|
`action` bigint unsigned NOT NULL DEFAULT '0',
|
||||||
`type` tinyint unsigned NOT NULL DEFAULT '0',
|
`type` tinyint unsigned NOT NULL DEFAULT '0',
|
||||||
PRIMARY KEY (`guid`,`spec`,`button`)
|
PRIMARY KEY (`guid`,`spec`,`button`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
@@ -3676,7 +3676,8 @@ INSERT INTO `updates` VALUES
|
|||||||
('2022_07_14_00_characters.sql','2EAD57D77FC39F6678F2D2A7D9C24046E6B836D8','ARCHIVED','2022-07-14 21:44:35',0),
|
('2022_07_14_00_characters.sql','2EAD57D77FC39F6678F2D2A7D9C24046E6B836D8','ARCHIVED','2022-07-14 21:44:35',0),
|
||||||
('2022_07_25_00_characters.sql','3159BB2F3C346A7881920AB2B1F8108247CF13EE','ARCHIVED','2022-07-25 18:44:10',0),
|
('2022_07_25_00_characters.sql','3159BB2F3C346A7881920AB2B1F8108247CF13EE','ARCHIVED','2022-07-25 18:44:10',0),
|
||||||
('2022_08_19_00_characters.sql','1C076A24F2B48F32E8EF835C01F8907CA9E86491','ARCHIVED','2022-08-19 23:43:01',0),
|
('2022_08_19_00_characters.sql','1C076A24F2B48F32E8EF835C01F8907CA9E86491','ARCHIVED','2022-08-19 23:43:01',0),
|
||||||
('2022_08_21_00_characters.sql','1D75688392FBDA18CD8494F32CF682DCB49642EC','ARCHIVED','2022-08-21 00:02:03',0);
|
('2022_08_21_00_characters.sql','1D75688392FBDA18CD8494F32CF682DCB49642EC','ARCHIVED','2022-08-21 00:02:03',0),
|
||||||
|
('2022_09_18_00_characters.sql','A7DF0C1F0E074F3E63A6CDD0AF873A1F3DC33B29','RELEASED','2022-09-18 21:48:42',0);
|
||||||
/*!40000 ALTER TABLE `updates` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `updates` ENABLE KEYS */;
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
ALTER TABLE `character_action` MODIFY `action` bigint unsigned NOT NULL DEFAULT 0;
|
||||||
Reference in New Issue
Block a user