Make sure palettes are updated if colors are toggled in game runtime

And fix MutablePalette's not getting updated
This commit is contained in:
Gustas
2023-08-11 11:29:31 +03:00
committed by Matthias Mailänder
parent 5fc36bd45f
commit 239891070d
5 changed files with 15 additions and 8 deletions

View File

@@ -85,7 +85,10 @@ namespace OpenRA.Graphics
public void ReplacePalette(string name, IPalette p)
{
if (mutablePalettes.ContainsKey(name))
{
palettes[name] = new ImmutablePalette(p);
CopyPaletteToBuffer(indices[name], mutablePalettes[name] = new MutablePalette(p));
}
else if (palettes.ContainsKey(name))
CopyPaletteToBuffer(indices[name], palettes[name] = new ImmutablePalette(p));
else

View File

@@ -62,10 +62,7 @@ namespace OpenRA.Graphics
foreach (var pal in world.TraitDict.ActorsWithTrait<ILoadsPalettes>())
pal.Trait.LoadPalettes(this);
foreach (var p in world.Players)
UpdatePalettesForPlayer(p.InternalName, p.Color, false);
Player.SetupRelationshipColors(world.Players, world.LocalPlayer);
Player.SetupRelationshipColors(world.Players, world.LocalPlayer, this, true);
palette.Initialize();

View File

@@ -14,6 +14,7 @@ using System.Collections.Generic;
using System.Linq;
using Eluant;
using Eluant.ObjectBinding;
using OpenRA.Graphics;
using OpenRA.Network;
using OpenRA.Primitives;
using OpenRA.Scripting;
@@ -252,10 +253,13 @@ namespace OpenRA
/// <summary>Returns <see cref="color"/>, ignoring player relationship colors.</summary>
public static Color GetColor(Player p) => p.color;
public static void SetupRelationshipColors(Player[] players, Player viewer)
public static void SetupRelationshipColors(Player[] players, Player viewer, WorldRenderer worldRenderer, bool firstRun)
{
foreach (var p in players)
{
p.Color = PlayerRelationshipColor(p, viewer);
worldRenderer.UpdatePalettesForPlayer(p.InternalName, p.Color, !firstRun);
}
}
public static Color PlayerRelationshipColor(Player player, Player viewer)

View File

@@ -10,6 +10,7 @@
#endregion
using System.Collections.Generic;
using OpenRA.Graphics;
using OpenRA.Mods.Common.Lint;
using OpenRA.Widgets;
@@ -19,18 +20,20 @@ namespace OpenRA.Mods.Common.Widgets.Logic.Ingame
public class TogglePlayerStanceColorHotkeyLogic : SingleHotkeyBaseLogic
{
readonly World world;
readonly WorldRenderer worldRenderer;
[ObjectCreator.UseCtor]
public TogglePlayerStanceColorHotkeyLogic(Widget widget, World world, ModData modData, Dictionary<string, MiniYaml> logicArgs)
public TogglePlayerStanceColorHotkeyLogic(Widget widget, World world, WorldRenderer worldRenderer, ModData modData, Dictionary<string, MiniYaml> logicArgs)
: base(widget, modData, "TogglePlayerStanceColorKey", "WORLD_KEYHANDLER", logicArgs)
{
this.world = world;
this.worldRenderer = worldRenderer;
}
protected override bool OnHotkeyActivated(KeyInput e)
{
Game.Settings.Game.UsePlayerStanceColors ^= true;
Player.SetupRelationshipColors(world.Players, world.LocalPlayer);
Player.SetupRelationshipColors(world.Players, world.LocalPlayer, worldRenderer, false);
return true;
}

View File

@@ -152,7 +152,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
cb.OnClick = () =>
{
gs.UsePlayerStanceColors = cb.IsChecked() ^ true;
Player.SetupRelationshipColors(world.Players, world.LocalPlayer);
Player.SetupRelationshipColors(world.Players, world.LocalPlayer, worldRenderer, false);
};
if (panel.GetOrNull<CheckboxWidget>("PAUSE_SHELLMAP_CHECKBOX") != null)