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,11 +40,12 @@ public class DesignBase
|
|||
}
|
||||
|
||||
/// <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;
|
||||
ApplyCustomize = customizeFlags & CustomizeFlagExtensions.AllRelevant;
|
||||
Application.Equip = equipFlags & EquipFlagExtensions.All;
|
||||
Application.BonusItem = bonusFlags & BonusExtensions.All;
|
||||
Application.Meta = 0;
|
||||
CustomizeSet = SetCustomizationSet(customize);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -330,6 +330,12 @@ public class DesignEditor(
|
|||
|
||||
_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))
|
||||
ChangeCrest(design, slot, other.DesignData.Crest(slot));
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ using Glamourer.GameData;
|
|||
using Glamourer.Gui.Customization;
|
||||
using Glamourer.Gui.Equipment;
|
||||
using Glamourer.Gui.Materials;
|
||||
using Glamourer.Gui.Tabs.ActorTab;
|
||||
using Glamourer.Interop;
|
||||
using Glamourer.State;
|
||||
using ImGuiNET;
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ public sealed class CharaFile
|
|||
public DesignData Data = new();
|
||||
public CustomizeFlag ApplyCustomize;
|
||||
public EquipFlag ApplyEquip;
|
||||
public BonusItemFlag ApplyBonus;
|
||||
|
||||
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.ApplyCustomize = ParseCustomize(jObj, ref ret.Data.Customize);
|
||||
ret.ApplyEquip = ParseEquipment(items, jObj, ref ret.Data);
|
||||
ret.ApplyBonus = ParseBonusItems(items, jObj, ref ret.Data);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -45,6 +47,13 @@ public sealed class CharaFile
|
|||
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)
|
||||
{
|
||||
var jTok = jObj[property];
|
||||
|
|
@ -61,6 +70,8 @@ public sealed class CharaFile
|
|||
|
||||
data.SetItem(slot, item);
|
||||
data.SetStain(slot, new StainIds(dye));
|
||||
if (slot is EquipSlot.MainHand)
|
||||
data.SetItem(EquipSlot.OffHand, items.GetDefaultOffhand(item));
|
||||
flags |= slot.ToFlag();
|
||||
flags |= slot.ToStainFlag();
|
||||
}
|
||||
|
|
@ -84,6 +95,26 @@ public sealed class CharaFile
|
|||
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)
|
||||
{
|
||||
CustomizeFlag ret = 0;
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ public class ImportService(CustomizeService _customizations, IDragDropManager _d
|
|||
var file = CharaFile.CharaFile.ParseData(_items, text, Path.GetFileNameWithoutExtension(path));
|
||||
|
||||
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)
|
||||
{
|
||||
|
|
@ -95,7 +95,7 @@ public class ImportService(CustomizeService _customizations, IDragDropManager _d
|
|||
throw new Exception();
|
||||
|
||||
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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue