static bool Prefix(CharDollBase __instance, UnitEntityData player) { var tr = Harmony12.Traverse.Create(__instance); tr.Property("CurrentUnit").SetValue(player); if (__instance.CurrentUnit == null) { return(false); } foreach (EquipSlotBase slot in tr.Property("SlotList").GetValue <List <EquipSlotBase> >()) { slot.Clear(); slot.SetupInfo(player.Body); if (player.Descriptor.IsPet) { if (!allowed_slots.Contains(slot.Type)) { if (!slot.Slot.Lock) { slot.Slot.Lock.Retain(); } if (!slot.HasItem) { slot.ItemImage.color = new UnityEngine.Color(1.0f, 1.0f, 1.0f, 0.3f); } } else { if (slot.Slot.Lock) { slot.Slot.Lock.Release(); } } } } if (tr.Property("Room").GetValue() != null) { tr.Property("Room").Method("SetupInfo", player).GetValue(); } if (tr.Property("DollWeaponSets").GetValue() == null) { return(false); } if (player.Descriptor.IsPet) {//remove additional weapon sets for (int i = 1; i < player.Body.HandsEquipmentSets.Count; i++) { player.Body.HandsEquipmentSets[i] = player.Body.HandsEquipmentSets[0]; } } tr.Field("m_DollWeaponSets").Method("SetupInfo", player.Body).GetValue(); return(false); }
static bool Prefix(CharDollBase __instance, UnitEntityData player) { var tr = Harmony12.Traverse.Create(__instance); tr.Property("CurrentUnit").SetValue(player); if (__instance.CurrentUnit == null) { return(false); } bool is_phantom = player.Descriptor.Progression.GetClassLevel(Phantom.phantom_class) > 0; bool is_eidolon = player.Descriptor.Progression.GetClassLevel(Eidolon.eidolon_class) > 0; bool is_animal = player.Descriptor.Progression.GetClassLevel(Common.animal_class) > 0 || player.Descriptor.Progression.GetClassLevel(Common.dragon_class) > 0; bool is_humanoid = player.Descriptor.Progression.IsArchetype(Archetypes.UndeadLord.corpse_companion_archetype); bool is_serpentine = player.Descriptor.Progression.IsArchetype(Eidolon.serpentine_archetype); bool is_biped = (is_eidolon && !player.Descriptor.Progression.IsArchetype(Eidolon.quadruped_archetype) && !is_serpentine) || is_phantom || is_humanoid; ; EquipSlotBase.SlotType[] allowed_slots = new EquipSlotBase.SlotType[0]; bool no_slot_limitation = false; if (is_humanoid) { no_slot_limitation = true; } else if (is_phantom) { allowed_slots = allowed_slots_phantom; } else if (is_serpentine) { allowed_slots = allowed_slots_serpentine; } else if (is_animal) { allowed_slots = allowed_slots_animal; } else if (!is_biped) { allowed_slots = allowed_slots_not_biped_eidolon; } else { allowed_slots = allowed_slots_eidolon; } foreach (EquipSlotBase slot in tr.Property("SlotList").GetValue <List <EquipSlotBase> >()) { slot.Clear(); slot.SetupInfo(player.Body); if (player.Descriptor.IsPet && !no_slot_limitation) { if (!allowed_slots.Contains(slot.Type)) { if (!slot.Slot.Lock) { slot.Slot.Lock.Retain(); } if (!slot.HasItem) { slot.ItemImage.color = new UnityEngine.Color(1.0f, 1.0f, 1.0f, 0.3f); } } else { if (slot.Slot.Lock) { slot.Slot.Lock.Release(); } } } } if (tr.Property("Room").GetValue() != null) { tr.Property("Room").Method("SetupInfo", player).GetValue(); } if (tr.Property("DollWeaponSets").GetValue() == null) { return(false); } if (player.Descriptor.IsPet && (!is_biped)) {//remove additional weapon sets for (int i = 1; i < player.Body.HandsEquipmentSets.Count; i++) { if (player.Body.HandsEquipmentSets[i].PrimaryHand?.MaybeItem != player.Body.HandsEquipmentSets[0].PrimaryHand?.MaybeItem || player.Body.HandsEquipmentSets[i].SecondaryHand?.MaybeItem != player.Body.HandsEquipmentSets[0].SecondaryHand?.MaybeItem) { player.Body.HandsEquipmentSets[i] = player.Body.HandsEquipmentSets[0].CloneObject(); } } } tr.Field("m_DollWeaponSets").Method("SetupInfo", player.Body).GetValue(); return(false); }
static bool Prefix(CharDollBase __instance, UnitEntityData player) { var tr = Harmony12.Traverse.Create(__instance); tr.Property("CurrentUnit").SetValue(player); if (__instance.CurrentUnit == null) { return(false); } bool is_serpentine = player.Descriptor.Progression.IsArchetype(Eidolon.serpentine_archetype); bool is_biped = player.Blueprint.GetComponent <Eidolon.EidolonComponent>() != null && !player.Descriptor.Progression.IsArchetype(Eidolon.quadruped_archetype) && !is_serpentine; EquipSlotBase.SlotType[] allowed_slots; if (is_serpentine) { allowed_slots = allowed_slots_serpentine; } else if (!is_biped) { allowed_slots = allowed_slots_animal; } else { allowed_slots = allowed_slots_eidolon; } foreach (EquipSlotBase slot in tr.Property("SlotList").GetValue <List <EquipSlotBase> >()) { slot.Clear(); slot.SetupInfo(player.Body); if (player.Descriptor.IsPet) { if (!allowed_slots.Contains(slot.Type)) { if (!slot.Slot.Lock) { slot.Slot.Lock.Retain(); } if (!slot.HasItem) { slot.ItemImage.color = new UnityEngine.Color(1.0f, 1.0f, 1.0f, 0.3f); } } else { if (slot.Slot.Lock) { slot.Slot.Lock.Release(); } } } } if (tr.Property("Room").GetValue() != null) { tr.Property("Room").Method("SetupInfo", player).GetValue(); } if (tr.Property("DollWeaponSets").GetValue() == null) { return(false); } if (player.Descriptor.IsPet && !is_biped) {//remove additional weapon sets for (int i = 1; i < player.Body.HandsEquipmentSets.Count; i++) { player.Body.HandsEquipmentSets[i] = player.Body.HandsEquipmentSets[0]; } } tr.Field("m_DollWeaponSets").Method("SetupInfo", player.Body).GetValue(); return(false); }