Don't apply old glamourer designs to non-humans.

This commit is contained in:
Ottermandias 2023-07-25 14:36:20 +02:00
parent 3522cf7d7c
commit 46317f1e7f
6 changed files with 19 additions and 17 deletions

View file

@ -45,28 +45,29 @@ public partial class GlamourerIpc
public void ApplyAll(string base64, string characterName) public void ApplyAll(string base64, string characterName)
=> ApplyDesign(_designConverter.FromBase64(base64, true, true), FindActors(characterName)); => ApplyDesign(_designConverter.FromBase64(base64, true, true, out var version), FindActors(characterName), version);
public void ApplyAllToCharacter(string base64, Character? character) public void ApplyAllToCharacter(string base64, Character? character)
=> ApplyDesign(_designConverter.FromBase64(base64, true, true), FindActors(character)); => ApplyDesign(_designConverter.FromBase64(base64, true, true, out var version), FindActors(character), version);
public void ApplyOnlyEquipment(string base64, string characterName) public void ApplyOnlyEquipment(string base64, string characterName)
=> ApplyDesign(_designConverter.FromBase64(base64, false, true), FindActors(characterName)); => ApplyDesign(_designConverter.FromBase64(base64, false, true, out var version), FindActors(characterName), version);
public void ApplyOnlyEquipmentToCharacter(string base64, Character? character) public void ApplyOnlyEquipmentToCharacter(string base64, Character? character)
=> ApplyDesign(_designConverter.FromBase64(base64, false, true), FindActors(character)); => ApplyDesign(_designConverter.FromBase64(base64, false, true, out var version), FindActors(character), version);
public void ApplyOnlyCustomization(string base64, string characterName) public void ApplyOnlyCustomization(string base64, string characterName)
=> ApplyDesign(_designConverter.FromBase64(base64, true, false), FindActors(characterName)); => ApplyDesign(_designConverter.FromBase64(base64, true, false, out var version), FindActors(characterName), version);
public void ApplyOnlyCustomizationToCharacter(string base64, Character? character) public void ApplyOnlyCustomizationToCharacter(string base64, Character? character)
=> ApplyDesign(_designConverter.FromBase64(base64, true, false), FindActors(character)); => ApplyDesign(_designConverter.FromBase64(base64, true, false, out var version), FindActors(character), version);
private void ApplyDesign(DesignBase? design, IEnumerable<ActorIdentifier> actors) private void ApplyDesign(DesignBase? design, IEnumerable<ActorIdentifier> actors, byte version)
{ {
if (design == null) if (design == null)
return; return;
var hasModelId = version >= 3;
_objects.Update(); _objects.Update();
foreach (var id in actors) foreach (var id in actors)
{ {
@ -77,7 +78,7 @@ public partial class GlamourerIpc
continue; continue;
} }
if (state.CanUnlock(0xDEADBEEF)) if ((hasModelId || state.ModelData.ModelId == 0) &&state.CanUnlock(0xDEADBEEF))
{ {
_stateManager.ApplyDesign(design, state, StateChanged.Source.Ipc, 0xDEADBEEF); _stateManager.ApplyDesign(design, state, StateChanged.Source.Ipc, 0xDEADBEEF);
state.Lock(0xDEADBEEF); state.Lock(0xDEADBEEF);

View file

@ -61,14 +61,15 @@ public class DesignConverter
return design; return design;
} }
public DesignBase? FromBase64(string base64, bool customize, bool equip) public DesignBase? FromBase64(string base64, bool customize, bool equip, out byte version)
{ {
var bytes = System.Convert.FromBase64String(base64);
DesignBase ret; DesignBase ret;
version = 0;
try try
{ {
switch (bytes[0]) var bytes = System.Convert.FromBase64String(base64);
version = bytes[0];
switch (version)
{ {
case (byte)'{': case (byte)'{':
var jObj1 = JObject.Parse(Encoding.UTF8.GetString(bytes)); var jObj1 = JObject.Parse(Encoding.UTF8.GetString(bytes));
@ -82,7 +83,7 @@ public class DesignConverter
ret.MigrateBase64(_customize, _items, base64); ret.MigrateBase64(_customize, _items, base64);
break; break;
case Version: case Version:
var version = bytes.DecompressToString(out var decompressed); version = bytes.DecompressToString(out var decompressed);
var jObj2 = JObject.Parse(decompressed); var jObj2 = JObject.Parse(decompressed);
Debug.Assert(version == Version); Debug.Assert(version == Version);
ret = jObj2["Identifier"] != null ret = jObj2["Identifier"] != null

View file

@ -316,7 +316,7 @@ public class ActorPanel
try try
{ {
var text = ImGui.GetClipboardText(); var text = ImGui.GetClipboardText();
var design = _converter.FromBase64(text, true, true) ?? throw new Exception("The clipboard did not contain valid data."); var design = _converter.FromBase64(text, true, true, out _) ?? throw new Exception("The clipboard did not contain valid data.");
_stateManager.ApplyDesign(design, _state!, StateChanged.Source.Manual); _stateManager.ApplyDesign(design, _state!, StateChanged.Source.Manual);
} }
catch (Exception ex) catch (Exception ex)

View file

@ -1038,7 +1038,7 @@ public unsafe class DebugTab : ITab
_version = _clipboardData.Decompress(out _dataUncompressed); _version = _clipboardData.Decompress(out _dataUncompressed);
_textUncompressed = Encoding.UTF8.GetString(_dataUncompressed); _textUncompressed = Encoding.UTF8.GetString(_dataUncompressed);
_json = JObject.Parse(_textUncompressed); _json = JObject.Parse(_textUncompressed);
_tmpDesign = _designConverter.FromBase64(_clipboardText, true, true); _tmpDesign = _designConverter.FromBase64(_clipboardText, true, true, out _);
} }
catch (Exception ex) catch (Exception ex)
{ {

View file

@ -178,7 +178,7 @@ public sealed class DesignFileSystemSelector : FileSystemSelector<Design, Design
if (_clipboardText != null) if (_clipboardText != null)
{ {
var design = _converter.FromBase64(_clipboardText, true, true); var design = _converter.FromBase64(_clipboardText, true, true, out _);
if (design is Design d) if (design is Design d)
_designManager.CreateClone(d, _newName); _designManager.CreateClone(d, _newName);
else if (design != null) else if (design != null)

View file

@ -339,7 +339,7 @@ public class DesignPanel
try try
{ {
var text = ImGui.GetClipboardText(); var text = ImGui.GetClipboardText();
var design = _converter.FromBase64(text, true, true) ?? throw new Exception("The clipboard did not contain valid data."); var design = _converter.FromBase64(text, true, true, out _) ?? throw new Exception("The clipboard did not contain valid data.");
_manager.ApplyDesign(_selector.Selected!, design); _manager.ApplyDesign(_selector.Selected!, design);
} }
catch (Exception ex) catch (Exception ex)