diff --git a/Client/MirScenes/Dialogs/BuffDialog.cs b/Client/MirScenes/Dialogs/BuffDialog.cs index efa5c19c2..98a786298 100644 --- a/Client/MirScenes/Dialogs/BuffDialog.cs +++ b/Client/MirScenes/Dialogs/BuffDialog.cs @@ -1,4 +1,4 @@ -using Client.MirControls; +using Client.MirControls; using Client.MirGraphics; using Client.MirSounds; @@ -7,6 +7,7 @@ namespace Client.MirScenes.Dialogs public class BuffDialog : MirImageControl { public List Buffs = new List(); + public int BaseImageIndex { get; set; } = 20; protected MirButton _expandCollapseButton; protected MirLabel _buffCountLabel; @@ -29,7 +30,7 @@ public BuffDialog() { Index = 20; Library = Libraries.Prguse2; - Movable = false; + Movable = true; Size = new Size(44, 34); Location = new Point(Settings.ScreenWidth - 170, 0); Sort = true; @@ -214,7 +215,7 @@ private void UpdateWindow() { _buffCount = _buffList.Count; - var baseImage = 20; + var baseImage = BaseImageIndex; var heightOffset = Location.Y; //foreach (var dialog in GameScene.Scene.BuffDialogs) @@ -255,7 +256,7 @@ private void UpdateWindow() { var oldWidth = Size.Width; - Index = 20; + Index = baseImage; var newX = Location.X - Size.Width + oldWidth; var newY = heightOffset; @@ -560,7 +561,7 @@ public PoisonBuffDialog() { Index = 40; Library = Libraries.Prguse2; - Movable = false; + Movable = true; Size = new Size(44, 34); Location = new Point(Settings.ScreenWidth - 170, 0); Sort = true; @@ -836,7 +837,7 @@ private void UpdateWindow() { _buffCount = _buffList.Count; - var baseImage = 20; + var baseImage = 40; var heightOffset = 36; if (_buffCount > 0 && Settings.ExpandedBuffWindow) @@ -867,7 +868,7 @@ private void UpdateWindow() { var oldWidth = Size.Width; - Index = 20; + Index = 40; var newX = Location.X - Size.Width + oldWidth; var newY = heightOffset; diff --git a/Client/MirScenes/GameScene.cs b/Client/MirScenes/GameScene.cs index b71d7aebf..a838a852a 100644 --- a/Client/MirScenes/GameScene.cs +++ b/Client/MirScenes/GameScene.cs @@ -6158,6 +6158,7 @@ private void HeroInformation(S.HeroInformation p) Parent = this, Visible = true, Location = new Point(Settings.ScreenWidth - 170, 80), + BaseImageIndex = 40, GetExpandedParameter = () => { return Settings.ExpandedHeroBuffWindow; }, SetExpandedParameter = (value) => { Settings.ExpandedHeroBuffWindow = value; } }; diff --git a/Server/MirDatabase/HeroInfo.cs b/Server/MirDatabase/HeroInfo.cs index f6bf47564..e794c541e 100644 --- a/Server/MirDatabase/HeroInfo.cs +++ b/Server/MirDatabase/HeroInfo.cs @@ -79,6 +79,17 @@ public override void Load(BinaryReader reader, int version, int customVersion) magic.CastTime = int.MinValue; Magics.Add(magic); } + + // Buff persistence (matches player CharacterInfo.Buffs) + if (version > 116) + { + count = reader.ReadInt32(); + for (int i = 0; i < count; i++) + { + Buff buff = new Buff(reader, version, customVersion); + Buffs.Add(buff); + } + } if (version > 99) { @@ -137,6 +148,13 @@ public override void Save(BinaryWriter writer) Magics[i].Save(writer); } + // Buff persistence (matches player CharacterInfo.Buffs) + writer.Write(Buffs.Count); + for (int i = 0; i < Buffs.Count; i++) + { + Buffs[i].Save(writer); + } + writer.Write(AutoPot); writer.Write(Grade); writer.Write(HPItemIndex); diff --git a/Server/MirEnvir/Envir.cs b/Server/MirEnvir/Envir.cs index 13e5f8a3d..9a3d6b7bf 100644 --- a/Server/MirEnvir/Envir.cs +++ b/Server/MirEnvir/Envir.cs @@ -53,7 +53,7 @@ public class Envir public static object LoadLock = new object(); public const int MinVersion = 60; - public const int Version = 116; + public const int Version = 117; public const int CustomVersion = 0; public static readonly string DatabasePath = Path.Combine(".", "Server.MirDB"); public static readonly string AccountPath = Path.Combine(".", "Server.MirADB"); diff --git a/Server/MirObjects/HeroObject.cs b/Server/MirObjects/HeroObject.cs index d8bec8a73..011beacf8 100644 --- a/Server/MirObjects/HeroObject.cs +++ b/Server/MirObjects/HeroObject.cs @@ -149,6 +149,7 @@ protected override void Load(CharacterInfo info, MirConnection connection) if (Level == 0) NewCharacter(); RefreshStats(); + RefreshNameColour(); SendInfo(); switch (HP) @@ -1201,6 +1202,7 @@ private void SendInfo() { ObjectID = ObjectID, Name = Name, + NameColour = NameColour, Class = Class, Gender = Gender, Level = Level, diff --git a/Server/MirObjects/PlayerObject.cs b/Server/MirObjects/PlayerObject.cs index 4f48b1471..44a54a5fe 100644 --- a/Server/MirObjects/PlayerObject.cs +++ b/Server/MirObjects/PlayerObject.cs @@ -1845,6 +1845,9 @@ public override Color GetNameColour(HumanObject human) { if (human == null) return NameColour; + // Heroes have a fixed, server-defined colour (do not apply PK/brown/warzone logic). + if (human is HeroObject hero) return hero.NameColour; + if (human is PlayerObject player) { if (player.PKPoints >= 200) @@ -14486,6 +14489,9 @@ public void SealHero() if (Hero != null) { + // Sealing (marbling) a hero should wipe all buffs so they can't be stored/traded with remaining durations. + CurrentHero.Buffs?.Clear(); + DespawnHero(); Info.HeroSpawned = false; Enqueue(new S.UpdateHeroSpawnState { State = HeroSpawnState.None }); diff --git a/Shared/ServerPackets.cs b/Shared/ServerPackets.cs index e6a4f4ff9..53bc344b6 100644 --- a/Shared/ServerPackets.cs +++ b/Shared/ServerPackets.cs @@ -4707,6 +4707,7 @@ protected override void ReadPacket(BinaryReader reader) { ObjectID = reader.ReadUInt32(); Name = reader.ReadString(); + NameColour = Color.FromArgb(reader.ReadInt32()); Class = (MirClass)reader.ReadByte(); Gender = (MirGender)reader.ReadByte(); Level = reader.ReadUInt16(); @@ -4756,6 +4757,7 @@ protected override void WritePacket(BinaryWriter writer) { writer.Write(ObjectID); writer.Write(Name); + writer.Write(NameColour.ToArgb()); writer.Write((byte)Class); writer.Write((byte)Gender); writer.Write(Level);