mirror of
https://github.com/Ottermandias/Glamourer.git
synced 2025-12-12 18:27:24 +01:00
Add bonus item import from .chara files, fix small bugs when applying designs.
This commit is contained in:
parent
1f1b04bdfe
commit
be9c3eab40
5 changed files with 46 additions and 9 deletions
|
|
@ -40,13 +40,14 @@ public class DesignBase
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Used when importing .cma or .chara files. </summary>
|
/// <summary> Used when importing .cma or .chara files. </summary>
|
||||||
internal DesignBase(CustomizeService customize, in DesignData designData, EquipFlag equipFlags, CustomizeFlag customizeFlags)
|
internal DesignBase(CustomizeService customize, in DesignData designData, EquipFlag equipFlags, CustomizeFlag customizeFlags, BonusItemFlag bonusFlags)
|
||||||
{
|
{
|
||||||
_designData = designData;
|
_designData = designData;
|
||||||
ApplyCustomize = customizeFlags & CustomizeFlagExtensions.AllRelevant;
|
ApplyCustomize = customizeFlags & CustomizeFlagExtensions.AllRelevant;
|
||||||
Application.Equip = equipFlags & EquipFlagExtensions.All;
|
Application.Equip = equipFlags & EquipFlagExtensions.All;
|
||||||
Application.Meta = 0;
|
Application.BonusItem = bonusFlags & BonusExtensions.All;
|
||||||
CustomizeSet = SetCustomizationSet(customize);
|
Application.Meta = 0;
|
||||||
|
CustomizeSet = SetCustomizationSet(customize);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal DesignBase(DesignBase clone)
|
internal DesignBase(DesignBase clone)
|
||||||
|
|
|
||||||
|
|
@ -330,6 +330,12 @@ public class DesignEditor(
|
||||||
|
|
||||||
_forceFullItemOff = false;
|
_forceFullItemOff = false;
|
||||||
|
|
||||||
|
foreach (var slot in BonusExtensions.AllFlags)
|
||||||
|
{
|
||||||
|
if (other.DoApplyBonusItem(slot))
|
||||||
|
ChangeBonusItem(design, slot, other.DesignData.BonusItem(slot));
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var slot in Enum.GetValues<CrestFlag>().Where(other.DoApplyCrest))
|
foreach (var slot in Enum.GetValues<CrestFlag>().Where(other.DoApplyCrest))
|
||||||
ChangeCrest(design, slot, other.DesignData.Crest(slot));
|
ChangeCrest(design, slot, other.DesignData.Crest(slot));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ using Glamourer.GameData;
|
||||||
using Glamourer.Gui.Customization;
|
using Glamourer.Gui.Customization;
|
||||||
using Glamourer.Gui.Equipment;
|
using Glamourer.Gui.Equipment;
|
||||||
using Glamourer.Gui.Materials;
|
using Glamourer.Gui.Materials;
|
||||||
using Glamourer.Gui.Tabs.ActorTab;
|
|
||||||
using Glamourer.Interop;
|
using Glamourer.Interop;
|
||||||
using Glamourer.State;
|
using Glamourer.State;
|
||||||
using ImGuiNET;
|
using ImGuiNET;
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ public sealed class CharaFile
|
||||||
public DesignData Data = new();
|
public DesignData Data = new();
|
||||||
public CustomizeFlag ApplyCustomize;
|
public CustomizeFlag ApplyCustomize;
|
||||||
public EquipFlag ApplyEquip;
|
public EquipFlag ApplyEquip;
|
||||||
|
public BonusItemFlag ApplyBonus;
|
||||||
|
|
||||||
public static CharaFile ParseData(ItemManager items, string data, string? name = null)
|
public static CharaFile ParseData(ItemManager items, string data, string? name = null)
|
||||||
{
|
{
|
||||||
|
|
@ -24,6 +25,7 @@ public sealed class CharaFile
|
||||||
ret.Name = jObj["Nickname"]?.ToObject<string>() ?? name ?? "New Design";
|
ret.Name = jObj["Nickname"]?.ToObject<string>() ?? name ?? "New Design";
|
||||||
ret.ApplyCustomize = ParseCustomize(jObj, ref ret.Data.Customize);
|
ret.ApplyCustomize = ParseCustomize(jObj, ref ret.Data.Customize);
|
||||||
ret.ApplyEquip = ParseEquipment(items, jObj, ref ret.Data);
|
ret.ApplyEquip = ParseEquipment(items, jObj, ref ret.Data);
|
||||||
|
ret.ApplyBonus = ParseBonusItems(items, jObj, ref ret.Data);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -45,6 +47,13 @@ public sealed class CharaFile
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static BonusItemFlag ParseBonusItems(ItemManager items, JObject jObj, ref DesignData data)
|
||||||
|
{
|
||||||
|
BonusItemFlag ret = 0;
|
||||||
|
ParseBonus(items, jObj, "Glasses", "GlassesId", BonusItemFlag.Glasses, ref data, ref ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
private static void ParseWeapon(ItemManager items, JObject jObj, string property, EquipSlot slot, ref DesignData data, ref EquipFlag flags)
|
private static void ParseWeapon(ItemManager items, JObject jObj, string property, EquipSlot slot, ref DesignData data, ref EquipFlag flags)
|
||||||
{
|
{
|
||||||
var jTok = jObj[property];
|
var jTok = jObj[property];
|
||||||
|
|
@ -61,6 +70,8 @@ public sealed class CharaFile
|
||||||
|
|
||||||
data.SetItem(slot, item);
|
data.SetItem(slot, item);
|
||||||
data.SetStain(slot, new StainIds(dye));
|
data.SetStain(slot, new StainIds(dye));
|
||||||
|
if (slot is EquipSlot.MainHand)
|
||||||
|
data.SetItem(EquipSlot.OffHand, items.GetDefaultOffhand(item));
|
||||||
flags |= slot.ToFlag();
|
flags |= slot.ToFlag();
|
||||||
flags |= slot.ToStainFlag();
|
flags |= slot.ToStainFlag();
|
||||||
}
|
}
|
||||||
|
|
@ -84,6 +95,26 @@ public sealed class CharaFile
|
||||||
flags |= slot.ToStainFlag();
|
flags |= slot.ToStainFlag();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void ParseBonus(ItemManager items, JObject jObj, string property, string subProperty, BonusItemFlag slot,
|
||||||
|
ref DesignData data, ref BonusItemFlag flags)
|
||||||
|
{
|
||||||
|
var id = jObj[property]?[subProperty]?.ToObject<int>();
|
||||||
|
if (id is null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (id is 0)
|
||||||
|
{
|
||||||
|
data.SetBonusItem(slot, BonusItem.Empty(slot));
|
||||||
|
flags |= slot;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!items.DictBonusItems.TryGetValue((BonusItemId)id.Value, out var item) || item.Slot != slot)
|
||||||
|
return;
|
||||||
|
|
||||||
|
data.SetBonusItem(slot, item);
|
||||||
|
flags |= slot;
|
||||||
|
}
|
||||||
|
|
||||||
private static CustomizeFlag ParseCustomize(JObject jObj, ref CustomizeArray customize)
|
private static CustomizeFlag ParseCustomize(JObject jObj, ref CustomizeArray customize)
|
||||||
{
|
{
|
||||||
CustomizeFlag ret = 0;
|
CustomizeFlag ret = 0;
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ public class ImportService(CustomizeService _customizations, IDragDropManager _d
|
||||||
var file = CharaFile.CharaFile.ParseData(_items, text, Path.GetFileNameWithoutExtension(path));
|
var file = CharaFile.CharaFile.ParseData(_items, text, Path.GetFileNameWithoutExtension(path));
|
||||||
|
|
||||||
name = file.Name;
|
name = file.Name;
|
||||||
design = new DesignBase(_customizations, file.Data, file.ApplyEquip, file.ApplyCustomize);
|
design = new DesignBase(_customizations, file.Data, file.ApplyEquip, file.ApplyCustomize, file.ApplyBonus);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|
@ -95,7 +95,7 @@ public class ImportService(CustomizeService _customizations, IDragDropManager _d
|
||||||
throw new Exception();
|
throw new Exception();
|
||||||
|
|
||||||
name = file.Name;
|
name = file.Name;
|
||||||
design = new DesignBase(_customizations, file.Data, EquipFlagExtensions.All, CustomizeFlagExtensions.AllRelevant);
|
design = new DesignBase(_customizations, file.Data, EquipFlagExtensions.All, CustomizeFlagExtensions.AllRelevant, 0);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue