From b611b3028ab4b99f72997f6c79d94686bc1a588e Mon Sep 17 00:00:00 2001 From: Hazzer Date: Wed, 3 Nov 2021 21:40:57 +0100 Subject: [PATCH] 2.7.3 release candidate --- 1.3/Assemblies/Locks.dll | Bin 41472 -> 44544 bytes 1.3/Patches/AddCompLockSoS2.xml | 26 ++++++++++ 1.3/Patches/AddInspectTabSoS2.xml | 26 ++++++++++ About/About.xml | 6 ++- Languages/English/Keyed/Keys.xml | 75 +++++++++++++++------------- README.md | 2 +- Source/CompatibilityPatches/SoS2.cs | 71 ++++++++++++++++++++++++++ Source/ITab_Lock.cs | 18 ++++++- Source/Initialization.cs | 1 + Source/LockState.cs | 59 ++++++++++++---------- Source/LockUtility.cs | 22 ++++++-- Source/Locks.csproj | 7 +++ changelog.txt | 6 +++ 13 files changed, 250 insertions(+), 69 deletions(-) create mode 100644 1.3/Patches/AddCompLockSoS2.xml create mode 100644 1.3/Patches/AddInspectTabSoS2.xml create mode 100644 Source/CompatibilityPatches/SoS2.cs diff --git a/1.3/Assemblies/Locks.dll b/1.3/Assemblies/Locks.dll index 2872f0d5f9d2cda2448741d2c54a4ab98643eb1e..5d2b5aa6595747fe8c1f985024c7debc71b428bc 100644 GIT binary patch delta 21054 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 + + + +
  • Save Our Ship 2
  • +
    + + /Defs/ThingDef[thingClass = "Building_ShipAirlock"]/comps + + /Defs/ThingDef[thingClass = "Building_ShipAirlock"] + + +
  • + + + + + /Defs/ThingDef[thingClass = "Building_ShipAirlock"]/comps + +
  • + + + + + + \ No newline at end of file diff --git a/1.3/Patches/AddInspectTabSoS2.xml b/1.3/Patches/AddInspectTabSoS2.xml new file mode 100644 index 0000000..45e6870 --- /dev/null +++ b/1.3/Patches/AddInspectTabSoS2.xml @@ -0,0 +1,26 @@ + + + + +
  • Save Our Ship 2
  • + + + /Defs/ThingDef[thingClass = "Building_ShipAirlock"]/inspectorTabs + + /Defs/ThingDef[thingClass = "Building_ShipAirlock"] + + +
  • Locks.ITab_Lock
  • +
    +
    +
    + + /Defs/ThingDef[thingClass = "Building_ShipAirlock"]/inspectorTabs + +
  • Locks.ITab_Lock
  • +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/About/About.xml b/About/About.xml index 0000f77..b620dcd 100644 --- a/About/About.xml +++ b/About/About.xml @@ -11,6 +11,10 @@ avius.locks
  • brrainz.harmony
  • +
  • haplo.miscellaneous.robots
  • +
  • kentington.saveourship2
  • +
  • linkolas.linkabledoors
  • +
  • jecrell.doorsexpanded
  • @@ -20,5 +24,5 @@ https://github.com/pardeike/HarmonyRimWorld/releases/latest
  • - Version 2.7.2\nThis addon adds Lock command on every door.\n - Left-click to lock toggle.\n - Right click for more options\n - Alternatively you can use "Lock" inspector tab\n\nNote: Door lock must be flicked by colonist. + Version 2.7.3\nThis addon adds Lock command on every door.\n - Left-click to lock toggle.\n - Right click for more options\n - Alternatively you can use "Lock" inspector tab\n\nNote: Door lock must be flicked by colonist. diff --git a/Languages/English/Keyed/Keys.xml b/Languages/English/Keyed/Keys.xml index 3d79e37..fdf2faa 100644 --- a/Languages/English/Keyed/Keys.xml +++ b/Languages/English/Keyed/Keys.xml @@ -1,42 +1,47 @@ - Lock - When unlocked all pawn will be allowed to use this door.\n[Right click for more options] + Lock + When unlocked all pawn will be allowed to use this door.\n[Right click for more options] - Door - locked - unlocked - changing... + Door + locked + unlocked + changing... - Locked - When unlocked door settings do not apply, therefore all humanoids capable of opening doors can pass. - Visitors allowed - When disabled, allies and traders will not be allowed to pass through this door. This setting do not apply when owners are set. - Pet door - When enabled small animals, like dogs can pass through door. This setting is not required for doors without owners. - Pens door - When enabled, pens animals can't pass through the door. Some doors may not block animals (e.g. Animal Flap). Check "roamerCanOpen" in defs. - Owners - Change lock in order to apply settings! - - Lock - Unlock - Allow visitors to use - Forbid visitors from using - Add pet door - Remove pet door - Set as pens door - Remove pens door - Set owners - Clear owners - - Lock does not belong to {0} + Locked + When unlocked door settings do not apply, therefore all humanoids capable of opening doors can pass. + Visitors allowed + When disabled, allies and traders will not be allowed to pass through this door. This setting do not apply when owners are set. + Pet door + When enabled small animals, like dogs can pass through door. This setting is not required for doors without owners. + Pens door + When enabled, pens animals can't pass through the door. Some doors may not block animals (e.g. Animal Flap). Check "roamerCanOpen" in defs. + Slaves allowed + When disabled slaves are not allowed to pass through this door. This setting do not apply when owners are set. + Animals allowed + When disabled all animals will not be allowed to pass through this door. This setting is checked after pens and pet door settings. - Locks can't be changed - Some locks can't be changed, because owners of those locks do not perform flick jobs:\n\n{0} - Some locks can't be changed, because owners of those locks do not perform flick jobs. + Owners + Change lock in order to apply settings! - Cancel - Copy - Paste + Lock + Unlock + Allow visitors to use + Forbid visitors from using + Add pet door + Remove pet door + Set as pens door + Remove pens door + Set owners + Clear owners + + Lock does not belong to {0} + + Locks can't be changed + Some locks can't be changed, because owners of those locks do not perform flick jobs:\n\n{0} + Some locks can't be changed, because owners of those locks do not perform flick jobs. + + Cancel + Copy + Paste \ No newline at end of file diff --git a/README.md b/README.md index 9eaf120..8badf8e 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@

    - v2.7.2 + v2.7.3

    diff --git a/Source/CompatibilityPatches/SoS2.cs b/Source/CompatibilityPatches/SoS2.cs new file mode 100644 index 0000000..406d1a7 --- /dev/null +++ b/Source/CompatibilityPatches/SoS2.cs @@ -0,0 +1,71 @@ +using HarmonyLib; +using Locks.HarmonyPatches; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Locks.CompatibilityPatches +{ + class SoS2 + { + public static void Init() + { + var mod = LoadedModManager.RunningMods.FirstOrDefault(m => m.Name == "Save Our Ship 2"); + if (mod != null) + { + var doorDef = AccessTools.Method("Building_ShipAirlock:PawnCanOpen"); + if (doorDef != null) + { + var harmony = new Harmony("Harmony_Locks_SoS2"); + harmony.Patch(doorDef, transpiler: new HarmonyMethod(typeof(SoS2).GetMethod("AirLockTranspiler"))); + Log.Message("Locks: SoS2 patched"); + } + else + { + Log.Error("Locks: mod SoS2 found but cant find airlock to patch"); + } + } + else + { + Log.Message("Locks: SoS2 not found "); + } + } + + public static IEnumerable AirLockTranspiler(ILGenerator gen, MethodBase mBase, IEnumerable instr) + { + OpCode[] codeToFind = + { + OpCodes.Ldarg_1, + OpCodes.Call, + OpCodes.Stloc_0 + + }; + + string[] labelToFind = + { + "", + "Verse.AI.Group.Lord GetLord(Verse.Pawn)", + "" + }; + int step = 0; + foreach (CodeInstruction codeInst in instr) + { + yield return codeInst; + if (HPatcher.IsFragment(codeToFind, labelToFind, codeInst, ref step)) + { + yield return new CodeInstruction(OpCodes.Ldarg_0); + yield return new CodeInstruction(OpCodes.Ldarg_1); + yield return new CodeInstruction(OpCodes.Call, typeof(LockUtility).GetMethod("PawnCanOpen")); + yield return new CodeInstruction(OpCodes.Ret); + } + } + + } + + } +} diff --git a/Source/ITab_Lock.cs b/Source/ITab_Lock.cs index 61509b9..8ac2500 100644 --- a/Source/ITab_Lock.cs +++ b/Source/ITab_Lock.cs @@ -17,7 +17,7 @@ public class ITab_Lock : ITab private static readonly Vector2 WinSize = new Vector2(310f + WindowGap, ButtonsHeight + OwnersWindowHeight + OwnersTitleHeight + MainSettingsHeight + WindowGap + 2 * Spacing + WarningHeight); private const float ButtonsHeight = 25f; private const float WindowGap = 15f; - private const float MainSettingsHeight = 4 * 32f; + private const float MainSettingsHeight = 6 * 32f; private const float OwnersTitleHeight = 24f; private const float OwnersWindowHeight = 200f; private const float WarningHeight = 24f; @@ -28,6 +28,8 @@ public class ITab_Lock : ITab private bool vistitorsAllowed; private bool petDoor; private bool pensDoor; + private bool slaveDoor; + private bool animalsAllowed; private Thing lastSelectedThing; @@ -75,12 +77,20 @@ protected override void FillTab() listing.Begin(upperSettingsRect); if (Data.WantedState.IsVisible(nameof(LockState.locked))) listing.CheckboxLabeled("Locks_ITabLocked".Translate(), ref locked, "Locks_ITabLockedDesc".Translate()); + if (Data.WantedState.IsVisible(nameof(LockState.allowSlave))) + { + listing.CheckboxLabeled("Locks_ITabSlaveDoors".Translate(), ref slaveDoor, "Locks_ITabSlaveDoorsDesc".Translate()); + } if (Data.WantedState.IsVisible(nameof(LockState.mode))) listing.CheckboxLabeled("Locks_ITabVisitorsAllowed".Translate(), ref vistitorsAllowed, "Locks_ITabVisitorsAllowedDesc".Translate()); if (Data.WantedState.IsVisible(nameof(LockState.petDoor))) listing.CheckboxLabeled("Locks_ITabPetDoor".Translate(), ref petDoor, "Locks_ITabPetDoorDesc".Translate()); if (Data.WantedState.IsVisible(nameof(LockState.pensDoor))) listing.CheckboxLabeled("Locks_ITabPensDoor".Translate(), ref pensDoor, "Locks_ITabPensDoorDesc".Translate()); + if (Data.WantedState.IsVisible(nameof(LockState.allowAnimals))) + { + listing.CheckboxLabeled("Locks_ITabAnimalAllowed".Translate(), ref animalsAllowed, "Locks_ITabAnimalAllowedDesc".Translate()); + } listing.End(); if (Data.WantedState.IsVisible(nameof(LockState.owners))) @@ -145,6 +155,8 @@ private void UpdateSettings() Data.WantedState.mode = vistitorsAllowed ? LockMode.Allies : LockMode.Colony; Data.WantedState.petDoor = petDoor; Data.WantedState.pensDoor = pensDoor; + Data.WantedState.allowSlave = slaveDoor; + Data.WantedState.allowAnimals = animalsAllowed; if (Data.NeedChange) LockUtility.UpdateLockDesignation(SelDoor); } @@ -158,9 +170,11 @@ private void UpdateSettings() public override void OnOpen() { locked = Data.WantedState.locked; - vistitorsAllowed = Data.WantedState.mode == LockMode.Allies ? true : false; + vistitorsAllowed = Data.WantedState.mode == LockMode.Allies; petDoor = Data.WantedState.petDoor; pensDoor = Data.WantedState.pensDoor; + slaveDoor = Data.WantedState.allowSlave; + animalsAllowed = Data.WantedState.allowAnimals; } private void OwnerCheckbox(Rect rect, Pawn pawn) diff --git a/Source/Initialization.cs b/Source/Initialization.cs index ed897b6..a46d158 100644 --- a/Source/Initialization.cs +++ b/Source/Initialization.cs @@ -13,6 +13,7 @@ static Initialization() HarmonyPatches.HPatcher.Init(); CompatibilityPatches.ClutterStructure.Init(); CompatibilityPatches.DoorsExpanded.Init(); + CompatibilityPatches.SoS2.Init(); } } } diff --git a/Source/LockState.cs b/Source/LockState.cs index 0ccb830..91569cc 100644 --- a/Source/LockState.cs +++ b/Source/LockState.cs @@ -16,17 +16,23 @@ public struct LockState { public LockMode mode; public bool locked; + public bool allowSlave; public bool petDoor; public bool pensDoor; + public bool allowAnimals; public List owners; - public LockState(LockMode mode, bool locked, bool petDoor, bool pensDoor, List owners) + public LockState(LockMode mode, bool locked, bool petDoor, bool pensDoor, List owners, + bool allowSlave = true, bool allowAnimals = true) { this.mode = mode; this.locked = locked; this.petDoor = petDoor; this.pensDoor = pensDoor; this.owners = owners; + + this.allowSlave = allowSlave; + this.allowAnimals = allowAnimals; } public void CopyFrom(LockState copy) @@ -37,60 +43,57 @@ public void CopyFrom(LockState copy) pensDoor = copy.pensDoor; owners.Clear(); owners.AddRange(copy.owners); + + allowSlave = copy.allowSlave; + allowAnimals = copy.allowAnimals; } public static bool operator ==(LockState a, LockState b) { if (a.mode != b.mode) + { return false; + } if (a.locked != b.locked) + { return false; + } if (a.petDoor != b.petDoor) - return false; - if (a.pensDoor != b.pensDoor) - return false; - foreach (var p in a.owners) - if (!b.owners.Contains(p)) - return false; - foreach (var p in b.owners) - if (!a.owners.Contains(p)) - return false; - return true; - } - - public static bool operator !=(LockState a, LockState b) - { - if (a.mode != b.mode) { - return true; + return false; } - if (a.locked != b.locked) + if (a.pensDoor != b.pensDoor) { - return true; + return false; } - if (a.petDoor != b.petDoor) + if (a.allowSlave != b.allowSlave) { - return true; + return false; } - if (a.pensDoor != b.pensDoor) + if (a.allowAnimals != b.allowAnimals) { - return true; + return false; } foreach (var p in a.owners) { if (!b.owners.Contains(p)) { - return true; + return false; } } foreach (var p in b.owners) { if (!a.owners.Contains(p)) { - return true; + return false; } } - return false; + return true; + } + + public static bool operator !=(LockState a, LockState b) + { + return !(a == b); } public bool Private @@ -107,6 +110,10 @@ public void ExposeData(String postfix) Scribe_Values.Look(ref locked, $"Locks_LockData_Locked_{postfix}", true, false); Scribe_Values.Look(ref petDoor, $"Locks_LockData_PetDoor_{postfix}", false, false); Scribe_Values.Look(ref pensDoor, $"Locks_LockData_PensDoor_{postfix}", false, false); + + Scribe_Values.Look(ref allowSlave, $"Locks_LockData_SlaveDoor_{postfix}", true, false); + Scribe_Values.Look(ref allowAnimals, $"Locks_LockData_NonAnimalDoor_{postfix}", true, false); + Scribe_Collections.Look(ref owners, $"Locks_LockData_Owners_{postfix}", LookMode.Reference); } } diff --git a/Source/LockUtility.cs b/Source/LockUtility.cs index e2c49ea..4063173 100644 --- a/Source/LockUtility.cs +++ b/Source/LockUtility.cs @@ -1,4 +1,5 @@ -using RimWorld; +using Locks.CompatibilityPatches; +using RimWorld; using System; using System.Collections.Generic; using System.Linq; @@ -78,14 +79,23 @@ public static bool PawnCanOpen(ThingWithComps door, Pawn p) { return true; } - + if (!respectedState.allowAnimals && p.RaceProps != null && p.RaceProps.Animal) + { + return false; + } if (respectedState.Private && !respectedState.owners.Contains(p)) - { return false; } + { + return false; + } - if (p.Faction == door.Faction && !p.IsPrisoner) + if (p.Faction == door.Faction && !p.IsPrisoner && !p.IsSlave) { return true; } + if (!respectedState.allowSlave && p.Faction == door.Faction && p.IsSlave) + { + return false; + } bool guestCondition = !p.IsPrisoner || p.HostFaction != door.Faction; if (respectedState.mode == LockMode.Allies && guestCondition) { @@ -146,6 +156,10 @@ public static bool IsVisible(this LockState state, string propertyName) return true; case nameof(LockState.owners): return state.locked; + case nameof(LockState.allowAnimals): + return state.locked; + case nameof(LockState.allowSlave): + return state.locked; default: return true; } diff --git a/Source/Locks.csproj b/Source/Locks.csproj index 368f10d..833a55e 100644 --- a/Source/Locks.csproj +++ b/Source/Locks.csproj @@ -73,6 +73,7 @@ + @@ -107,6 +108,9 @@ Patches\AddCompLockLinkableDoors.xml + + Patches\AddCompLockSoS2.xml + Patches\AddInspectTab.xml @@ -116,6 +120,9 @@ Patches\AddInspectTabLockLinkableDoors.xml + + Patches\AddInspectTabSoS2.xml + Organizer\About.xml diff --git a/changelog.txt b/changelog.txt index 8b9cbb9..ebead9d 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,4 +1,10 @@ Changelog: +2.7.3 +- Add German translation (https://github.com/thephluxer) +- Add Italian transaltion - not complete (https://github.com/StoneNimRod) +- New option "Slaves allowed" for doors +- New option "Animals allowed" for doors +- Compatibility patches for SoS2 (I dont use this mod so any feedback welcome) 2.7.2 - Add compatibility with Linkable Doors 2.7.1