From 782b2677c099ec5e58b0005f3e08253f0f89c527 Mon Sep 17 00:00:00 2001 From: Mehni <@> Date: Sat, 22 May 2021 22:59:30 +0200 Subject: [PATCH] Updated to 1.2 --- .editorconfig | 274 +++++++++++++++++- 1.1/Assemblies/IHoldMultipleThings.dll | Bin 4608 -> 4608 bytes 1.1/Assemblies/PickUpAndHaul.dll | Bin 32768 -> 32768 bytes About/About.xml | 3 +- Source/PickUpAndHaul/CompHauledToInventory.cs | 4 +- Source/PickUpAndHaul/CompatHelper.cs | 31 ++ Source/PickUpAndHaul/HarmonyPatches.cs | 13 +- .../IHoldMultipleThings_Support.cs | 12 + .../JobDriver_HaulToInventory.cs | 66 ++--- .../JobDriver_UnloadYourHauledInventory.cs | 42 +-- Source/PickUpAndHaul/PawnUnloadChecker.cs | 7 + Source/PickUpAndHaul/PickUpAndHaul.csproj | 24 +- .../WorkGiver_HaulToInventory.cs | 76 +++-- 13 files changed, 436 insertions(+), 116 deletions(-) create mode 100644 Source/PickUpAndHaul/CompatHelper.cs diff --git a/.editorconfig b/.editorconfig index 02652ca..9eb576a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,7 +1,273 @@ -# top-most EditorConfig file +# Remove the line below if you want to inherit .editorconfig settings from higher directories root = true -# 4 space indentation -[*.{cs,xml}] +# C# files +[*.cs] + +#### Core EditorConfig Options #### + +# Severities +dotnet_diagnostic.IDE0016.severity = none +dotnet_diagnostic.IDE0044.severity = none +dotnet_diagnostic.IDE0051.severity = none +dotnet_diagnostic.IDE0055.severity = warning + +dotnet_diagnostic.RCS1036.severity = none +dotnet_diagnostic.RCS1037.severity = none +dotnet_diagnostic.RCS1110.severity = warning +dotnet_diagnostic.RCS1169.severity = none +dotnet_diagnostic.RCS1213.severity = none + +# Indentation and spacing +indent_size = 4 indent_style = space -indent_size = 4 \ No newline at end of file +tab_width = 4 + +# New line preferences +end_of_line = crlf +insert_final_newline = false + +# Organize usings +dotnet_separate_import_directive_groups = false +dotnet_sort_system_directives_first = false +file_header_template = unset + +# this. and Me. preferences +dotnet_style_qualification_for_event = false +dotnet_style_qualification_for_field = false +dotnet_style_qualification_for_method = false +dotnet_style_qualification_for_property = false + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true +dotnet_style_predefined_type_for_member_access = true + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_operators = never_if_unnecessary +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity + +# Expression-level preferences +#IDE0017 +dotnet_style_object_initializer = true +#IDE0028 +dotnet_style_collection_initializer = true +#IDE0032 +dotnet_style_prefer_auto_properties = false +#IDE0033 +dotnet_style_explicit_tuple_names = true +#IDE0037 +dotnet_style_prefer_inferred_tuple_names = true +dotnet_style_prefer_inferred_anonymous_type_member_names = true +#IDE0045 +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +#IDE0046 +dotnet_style_prefer_conditional_expression_over_return = true:silent +#IDE0054 +dotnet_style_prefer_compound_assignment = true +#IDE0058 +csharp_style_unused_value_expression_statement_preference = discard_variable +#IDE0059 +csharp_style_unused_value_assignment_preference = discard_variable + +#IDE0018 +csharp_style_inlined_variable_declaration = false +#IDE0034 +csharp_prefer_simple_default_expression = true:suggestion +#IDE0039 +csharp_style_pattern_local_over_anonymous_function = true +#IDE0042 +csharp_style_deconstructed_variable_declaration = false +#IDE0056 +csharp_style_prefer_index_operator = false:suggestion +#IDE0057 +csharp_style_prefer_range_operator = false:suggestion + +# Null-checking preferences +#IDE0029 +dotnet_style_coalesce_expression = true +#IDE0031 +dotnet_style_null_propagation = true +#IDE0041 +dotnet_style_prefer_is_null_check_over_reference_equality_method = true +#IDE1005 +csharp_style_conditional_delegate_call = true + +# Parameter preferences +#IDE0060 +dotnet_code_quality_unused_parameters = all + +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_prefer_simplified_boolean_expressions = true:suggestion +dotnet_style_prefer_simplified_interpolation = true:suggestion + +# Suppression preferences +dotnet_remove_unnecessary_suppression_exclusions = none + +#### C# Coding Conventions #### + +# var preferences (IDE0007 and IDE0008) +csharp_style_var_elsewhere = false +csharp_style_var_for_built_in_types = false +csharp_style_var_when_type_is_apparent = false + +# Expression-bodied members +#IDE0021 +csharp_style_expression_bodied_constructors = false +#IDE0022 +csharp_style_expression_bodied_methods = false +#IDE0023 and IDE0024 +csharp_style_expression_bodied_operators = false +#IDE0025 +csharp_style_expression_bodied_properties = false +#IDE0026 +csharp_style_expression_bodied_indexers = false +#IDE0027 +csharp_style_expression_bodied_accessors = false +#IDE0053 +csharp_style_expression_bodied_lambdas = false +#IDE0061 +csharp_style_expression_bodied_local_functions = false + +# Pattern matching preferences +#IDE0019 +csharp_style_pattern_matching_over_as_with_null_check = true +#IDE0020 +csharp_style_pattern_matching_over_is_with_cast_check = true +#IDE0066 +csharp_style_prefer_switch_expression = false + +csharp_style_prefer_not_pattern = true:suggestion +csharp_style_prefer_pattern_matching = true:silent + +# Code-block preferences +#IDE0011 +csharp_prefer_braces = true:error +#IDE0063 +csharp_prefer_simple_using_statement = true + +# 'using' directive preferences +csharp_using_directive_placement = outside_namespace + +# Modifier preferences +#IDE0036 +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async +#IDE0040 +dotnet_style_require_accessibility_modifiers = always +#IDE0044 +dotnet_style_readonly_field = false +#IDE0062 +csharp_prefer_static_local_function = true + + +#### C# Formatting Rules #### + +# New line preferences +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_anonymous_types = true + +# Indentation preferences +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents_when_block = false + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = false +csharp_preserve_single_line_statements = false + +#### Naming styles #### + +# Naming rules + +# Namespaces, Classes, Structs, Enums, Properties, Methods, Events, Delegates, Local Functions +dotnet_naming_rule.pascal_case.severity = warning +dotnet_naming_rule.pascal_case.symbols = pascal_case_symbols +dotnet_naming_rule.pascal_case.style = pascal_case_style + +dotnet_naming_symbols.pascal_case_symbols.applicable_kinds = namespace, class, struct, enum, property, method, event, delegate, local_function +dotnet_naming_symbols.pascal_case_symbols.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected, local + +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +# Interfaces +dotnet_naming_rule.interface_should_be_begins_with_i.severity = warning +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface_symbols +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.capitalization = pascal_case + +dotnet_naming_symbols.interface_symbols.applicable_kinds = interface +dotnet_naming_symbols.interface_symbols.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected + +# Private Fields +dotnet_naming_rule.private_members_with_underscore.severity = warning +dotnet_naming_rule.private_members_with_underscore.symbols = private_fields +dotnet_naming_rule.private_members_with_underscore.style = prefix_underscore + +dotnet_naming_style.prefix_underscore.required_prefix = _ +dotnet_naming_style.prefix_underscore.capitalization = camel_case + +dotnet_naming_symbols.private_fields.applicable_kinds = field +dotnet_naming_symbols.private_fields.applicable_accessibilities = private +dotnet_naming_symbols.private_fields.required_modifiers = private + +# Public Fields +dotnet_naming_rule.public_members_fields.severity = warning +dotnet_naming_rule.public_members_fields.symbols = public_fields_symbols +dotnet_naming_rule.public_members_fields.style = public_fields_style + +dotnet_naming_style.public_fields_style.capitalization = camel_case + +dotnet_naming_symbols.public_fields_symbols.applicable_kinds = field +dotnet_naming_symbols.public_fields_symbols.applicable_accessibilities = public +dotnet_naming_symbols.public_fields_symbols.required_modifiers = public + +# Parameters, Type Parameters and Locals +dotnet_naming_rule.parameters_fields.severity = warning +dotnet_naming_rule.parameters_fields.symbols = parameters_symbols +dotnet_naming_rule.parameters_fields.style = parameters_style + +dotnet_naming_style.parameters_symbols.capitalization = camel_case + +dotnet_naming_symbols.parameters_style.applicable_kinds = parameter, type_parameter, local + +# Consts +dotnet_naming_rule.const_fields.severity = warning +dotnet_naming_rule.const_fields.symbols = const_fields +dotnet_naming_rule.const_fields.style = const_style + +dotnet_naming_style.const_style.word_separator = _ +dotnet_naming_style.const_style.capitalization = all_upper + +dotnet_naming_symbols.const_fields.required_modifiers = const \ No newline at end of file diff --git a/1.1/Assemblies/IHoldMultipleThings.dll b/1.1/Assemblies/IHoldMultipleThings.dll index fd50549752d567454006ee8c6bfc6114f0dee1b4..b199bfb6242aaabd8f534a37011dc2c5c1e770c7 100644 GIT binary patch delta 49 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 ZLGW(%+oId$x0U`6_VfQm|6l2W{|zhUOkDr~ diff --git a/About/About.xml b/About/About.xml index f5de76d..859c4fe 100644 --- a/About/About.xml +++ b/About/About.xml @@ -5,6 +5,7 @@
  • 1.0
  • 1.1
  • +
  • 1.2
  • Mehni.PickUpAndHaul @@ -20,7 +21,7 @@ https://ludeon.com/forums/index.php?topic=35832 "Greatest hauling mod ever" - Chicken Plucker - v1.1.0⅓ + v1.1.1⅓ Colonists will gather stuff in their inventory, then haul it all to a stockpile. diff --git a/Source/PickUpAndHaul/CompHauledToInventory.cs b/Source/PickUpAndHaul/CompHauledToInventory.cs index 8a75a28..289e13b 100644 --- a/Source/PickUpAndHaul/CompHauledToInventory.cs +++ b/Source/PickUpAndHaul/CompHauledToInventory.cs @@ -12,10 +12,10 @@ public HashSet GetHashSet() takenToInventory.RemoveWhere(x => x == null); return takenToInventory; } - + public void RegisterHauledItem(Thing thing) { - this.takenToInventory.Add(thing); + takenToInventory.Add(thing); } public override void PostExposeData() diff --git a/Source/PickUpAndHaul/CompatHelper.cs b/Source/PickUpAndHaul/CompatHelper.cs new file mode 100644 index 0000000..10a2ed2 --- /dev/null +++ b/Source/PickUpAndHaul/CompatHelper.cs @@ -0,0 +1,31 @@ +using System; +using Verse; + +namespace PickUpAndHaul +{ + internal class CompatHelper + { + public static bool CeOverweight(Pawn pawn) + { + CombatExtended.CompInventory ceCompInventory = pawn.GetComp(); + float usedWeightByPct = ceCompInventory.currentWeight / ceCompInventory.capacityWeight; + float usedBulkByPct = ceCompInventory.currentBulk / ceCompInventory.capacityBulk; + + return usedBulkByPct >= 0.7f || usedWeightByPct >= 0.8f; + } + + public static int CanFitInInventory(Pawn pawn, Thing thing) + { + CombatExtended.CompInventory ceCompInventory = pawn.GetComp(); + ceCompInventory.CanFitInInventory(thing, out int countToPickUp); + + return countToPickUp; + } + + internal static void UpdateInventory(Pawn pawn) + { + CombatExtended.CompInventory ceCompInventory = pawn.GetComp(); + ceCompInventory.UpdateInventory(); + } + } +} \ No newline at end of file diff --git a/Source/PickUpAndHaul/HarmonyPatches.cs b/Source/PickUpAndHaul/HarmonyPatches.cs index ed7fb91..ce6ab18 100644 --- a/Source/PickUpAndHaul/HarmonyPatches.cs +++ b/Source/PickUpAndHaul/HarmonyPatches.cs @@ -42,14 +42,16 @@ static HarmonyPatches() harmony.Patch(original: AccessTools.Method(typeof(ITab_Pawn_Gear), "DrawThingRow"), transpiler: new HarmonyMethod(typeof(HarmonyPatches), nameof(GearTabHighlightTranspiler))); - Verse.Log.Message("PickUpAndHaul v0.1.1.0⅓ welcomes you to RimWorld with pointless logspam.", true); + Verse.Log.Message("PickUpAndHaul v0.1.1.1⅓ welcomes you to RimWorld with pointless logspam.", true); } private static bool Drop_Prefix(Pawn pawn, Thing thing) { CompHauledToInventory takenToInventory = pawn.TryGetComp(); if (takenToInventory == null) + { return true; + } HashSet carriedThing = takenToInventory.GetHashSet(); @@ -60,7 +62,9 @@ private static void Pawn_InventoryTracker_PostFix(Pawn_InventoryTracker __instan { CompHauledToInventory takenToInventory = __instance.pawn.TryGetComp(); if (takenToInventory == null) + { return; + } HashSet carriedThing = takenToInventory.GetHashSet(); if (carriedThing?.Count > 0) @@ -76,7 +80,9 @@ private static void JobDriver_HaulToCell_PostFix(JobDriver_HaulToCell __instance { CompHauledToInventory takenToInventory = __instance.pawn.TryGetComp(); if (takenToInventory == null) + { return; + } HashSet carriedThing = takenToInventory.GetHashSet(); @@ -144,14 +150,19 @@ public static IEnumerable GearTabHighlightTranspiler(IEnumerabl done = true; } else + { yield return i; + } } } private static Color GetColorForHauled(Pawn pawn, Thing thing) { if (pawn.GetComp()?.GetHashSet().Contains(thing) ?? false) + { return Color.Lerp(Color.grey, Color.red, 0.5f); + } + return Color.white; } } diff --git a/Source/PickUpAndHaul/IHoldMultipleThings_Support.cs b/Source/PickUpAndHaul/IHoldMultipleThings_Support.cs index 016682c..8fd9e39 100644 --- a/Source/PickUpAndHaul/IHoldMultipleThings_Support.cs +++ b/Source/PickUpAndHaul/IHoldMultipleThings_Support.cs @@ -15,11 +15,17 @@ public static bool CapacityAt(Thing thing, IntVec3 storeCell, Map map, out int c .AllComps.FirstOrDefault(x => x is IHoldMultipleThings.IHoldMultipleThings); if (compOfHolding is IHoldMultipleThings.IHoldMultipleThings holderOfThings) + { return holderOfThings.CapacityAt(thing, storeCell, map, out capacity); + } foreach (Thing t in storeCell.GetThingList(map)) + { if (t is IHoldMultipleThings.IHoldMultipleThings holderOfMultipleThings) + { return holderOfMultipleThings.CapacityAt(thing, storeCell, map, out capacity); + } + } return false; } @@ -30,11 +36,17 @@ public static bool StackableAt(Thing thing, IntVec3 storeCell, Map map) .AllComps.FirstOrDefault(x => x is IHoldMultipleThings.IHoldMultipleThings); if (compOfHolding is IHoldMultipleThings.IHoldMultipleThings holderOfThings) + { return holderOfThings.StackableAt(thing, storeCell, map); + } foreach (Thing t in storeCell.GetThingList(map)) + { if (t is IHoldMultipleThings.IHoldMultipleThings holderOfMultipleThings) + { return holderOfMultipleThings.StackableAt(thing, storeCell, map); + } + } return false; } diff --git a/Source/PickUpAndHaul/JobDriver_HaulToInventory.cs b/Source/PickUpAndHaul/JobDriver_HaulToInventory.cs index 80fe3cb..394708d 100644 --- a/Source/PickUpAndHaul/JobDriver_HaulToInventory.cs +++ b/Source/PickUpAndHaul/JobDriver_HaulToInventory.cs @@ -28,8 +28,7 @@ protected override IEnumerable MakeNewToils() Toil nextTarget = Toils_JobTransforms.ExtractNextTargetFromQueue(TargetIndex.A); //also does count yield return nextTarget; - //honestly the workgiver checks for encumbered, so until CE checks are in this is unnecessary - //yield return CheckForOverencumbered();//Probably redundant without CE checks + yield return CheckForOverencumberedForCombatExtended(); Toil gotoThing = new Toil { @@ -54,20 +53,10 @@ protected override IEnumerable MakeNewToils() int countToPickUp = Mathf.Min(job.count, MassUtility.CountToPickUpUntilOverEncumbered(actor, thing)); Log.Message($"{actor} is hauling to inventory {thing}:{countToPickUp}"); - // yo dawg, I heard you like delegates so I put delegates in your delegate, so you can delegate your delegates. - // because compilers don't respect IF statements in delegates and toils are fully iterated over as soon as the job starts. - try + if (ModCompatibilityCheck.CombatExtendedIsActive) { - ((Action)(() => - { - if (ModCompatibilityCheck.CombatExtendedIsActive) - { - //CombatExtended.CompInventory ceCompInventory = actor.GetComp(); - //ceCompInventory.CanFitInInventory(thing, out countToPickUp); - } - }))(); + countToPickUp = CompatHelper.CanFitInInventory(pawn, thing); } - catch (TypeLoadException) { } if (countToPickUp > 0) { @@ -76,19 +65,9 @@ protected override IEnumerable MakeNewToils() actor.inventory.GetDirectlyHeldThings().TryAdd(splitThing, shouldMerge); takenToInventory.RegisterHauledItem(splitThing); - try - { - ((Action)(() => - { - if (ModCompatibilityCheck.CombatExtendedIsActive) - { - //CombatExtended.CompInventory ceCompInventory = actor.GetComp(); - //ceCompInventory.UpdateInventory(); - } - }))(); - } - catch (TypeLoadException) + if (ModCompatibilityCheck.CombatExtendedIsActive) { + CompatHelper.UpdateInventory(pawn); } } @@ -157,34 +136,28 @@ protected override IEnumerable MakeNewToils() yield return wait; } - public Toil CheckForOverencumbered() + /// + /// the workgiver checks for encumbered, this is purely extra for CE + /// + /// + public Toil CheckForOverencumberedForCombatExtended() { Toil toil = new Toil(); + + if (!ModCompatibilityCheck.CombatExtendedIsActive) + { + return toil; + } + toil.initAction = delegate { Pawn actor = toil.actor; Job curJob = actor.jobs.curJob; Thing nextThing = curJob.targetA.Thing; - //float usedBulkByPct = 1f; - //float usedWeightByPct = 1f; - - //try - //{ - // ((Action)(() => - // { - // if (ModCompatibilityCheck.CombatExtendedIsActive) - // { - // CompInventory ceCompInventory = actor.GetComp(); - // usedWeightByPct = ceCompInventory.currentWeight / ceCompInventory.capacityWeight; - // usedBulkByPct = ceCompInventory.currentBulk / ceCompInventory.capacityBulk; - // } - // }))(); - //} - //catch (TypeLoadException) { } - - - if (!(MassUtility.EncumbrancePercent(actor) <= 0.9f /*|| usedBulkByPct >= 0.7f || usedWeightByPct >= 0.8f*/)) + var ceOverweight = CompatHelper.CeOverweight(pawn); + + if (!(MassUtility.EncumbrancePercent(actor) <= 0.9f && !ceOverweight)) { Job haul = HaulAIUtility.HaulToStorageJob(actor, nextThing); if (haul?.TryMakePreToilReservations(actor, false) ?? false) @@ -195,6 +168,7 @@ public Toil CheckForOverencumbered() } } }; + return toil; } } diff --git a/Source/PickUpAndHaul/JobDriver_UnloadYourHauledInventory.cs b/Source/PickUpAndHaul/JobDriver_UnloadYourHauledInventory.cs index 0539126..576a446 100644 --- a/Source/PickUpAndHaul/JobDriver_UnloadYourHauledInventory.cs +++ b/Source/PickUpAndHaul/JobDriver_UnloadYourHauledInventory.cs @@ -9,13 +9,13 @@ namespace PickUpAndHaul { public class JobDriver_UnloadYourHauledInventory : JobDriver { - private int countToDrop = -1; - private int unloadDuration = 3; + private int _countToDrop = -1; + private int _unloadDuration = 3; public override void ExposeData() { base.ExposeData(); - Scribe_Values.Look(ref countToDrop, "countToDrop", -1); + Scribe_Values.Look(ref _countToDrop, "countToDrop", -1); } public override bool TryMakePreToilReservations(bool errorOnFailed) @@ -31,10 +31,12 @@ protected override IEnumerable MakeNewToils() HashSet carriedThing = takenToInventory.GetHashSet(); if (ModCompatibilityCheck.ExtendedStorageIsActive) - unloadDuration = 20; + { + _unloadDuration = 20; + } - Toil wait = Toils_General.Wait(unloadDuration); - Toil celebrate = Toils_General.Wait(unloadDuration); + Toil wait = Toils_General.Wait(_unloadDuration); + Toil celebrate = Toils_General.Wait(_unloadDuration); yield return wait; Toil findSpot = new Toil @@ -44,7 +46,9 @@ protected override IEnumerable MakeNewToils() ThingCount unloadableThing = FirstUnloadableThing(pawn); if (unloadableThing.Count == 0 && carriedThing.Count == 0) + { EndJobWith(JobCondition.Succeeded); + } if (unloadableThing.Count != 0) { @@ -58,7 +62,7 @@ protected override IEnumerable MakeNewToils() { job.SetTarget(TargetIndex.A, unloadableThing.Thing); job.SetTarget(TargetIndex.B, c); - countToDrop = unloadableThing.Thing.stackCount; + _countToDrop = unloadableThing.Thing.stackCount; } } } @@ -80,29 +84,23 @@ protected override IEnumerable MakeNewToils() } if (!pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation) || !thing.def.EverStorable(false)) { - pawn.inventory.innerContainer.TryDrop(thing, ThingPlaceMode.Near, countToDrop, out thing); + pawn.inventory.innerContainer.TryDrop(thing, ThingPlaceMode.Near, _countToDrop, out thing); EndJobWith(JobCondition.Succeeded); carriedThing.Remove(thing); } else { - pawn.inventory.innerContainer.TryTransferToContainer(thing, pawn.carryTracker.innerContainer, countToDrop, out thing); - job.count = countToDrop; + pawn.inventory.innerContainer.TryTransferToContainer(thing, pawn.carryTracker.innerContainer, _countToDrop, out thing); + job.count = _countToDrop; job.SetTarget(TargetIndex.A, thing); carriedThing.Remove(thing); } - try + + if (ModCompatibilityCheck.CombatExtendedIsActive) { - ((Action)(() => - { - if (ModCompatibilityCheck.CombatExtendedIsActive) - { - //CombatExtended.CompInventory ceCompInventory = pawn.GetComp(); - //ceCompInventory.UpdateInventory(); - } - }))(); + CompatHelper.UpdateInventory(pawn); } - catch (TypeLoadException) { } + thing.SetForbidden(false, false); } }; @@ -120,7 +118,9 @@ protected override IEnumerable MakeNewToils() { if (pawn.Map.reservationManager.ReservedBy(job.targetB, pawn, pawn.CurJob) && !ModCompatibilityCheck.HCSKIsActive) + { pawn.Map.reservationManager.Release(job.targetB, pawn, pawn.CurJob); + } } }; yield return releaseReservation; @@ -154,7 +154,9 @@ from straggler in pawn.inventory.innerContainer carriedThings.Remove(thing); foreach (Thing dirtyStraggler in dirtyStragglers) + { return new ThingCount(dirtyStraggler, dirtyStraggler.stackCount); + } } return new ThingCount(thing, thing.stackCount); } diff --git a/Source/PickUpAndHaul/PawnUnloadChecker.cs b/Source/PickUpAndHaul/PawnUnloadChecker.cs index 519dacd..3f9b301 100644 --- a/Source/PickUpAndHaul/PawnUnloadChecker.cs +++ b/Source/PickUpAndHaul/PawnUnloadChecker.cs @@ -13,14 +13,21 @@ public static void CheckIfPawnShouldUnloadInventory(Pawn pawn, bool forced = fal CompHauledToInventory itemsTakenToInventory = pawn.TryGetComp(); if (itemsTakenToInventory == null) + { return; + } HashSet carriedThing = itemsTakenToInventory.GetHashSet(); if (pawn.Faction != Faction.OfPlayer || !pawn.RaceProps.Humanlike) + { return; + } + if (carriedThing == null || carriedThing.Count == 0 || pawn.inventory.innerContainer.Count == 0) + { return; + } if (forced) { diff --git a/Source/PickUpAndHaul/PickUpAndHaul.csproj b/Source/PickUpAndHaul/PickUpAndHaul.csproj index 2e47ac0..1597cde 100644 --- a/Source/PickUpAndHaul/PickUpAndHaul.csproj +++ b/Source/PickUpAndHaul/PickUpAndHaul.csproj @@ -33,11 +33,8 @@ false - - ..\..\..\..\..\..\workshop\content\294100\2009463077\Assemblies\0Harmony.dll - - - ..\..\..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll + + ..\..\..\..\..\..\workshop\content\294100\1631756268\Assemblies\CombatExtended.dll False @@ -51,16 +48,9 @@ - - ..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.dll - False - - - ..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.CoreModule.dll - False - + @@ -72,5 +62,13 @@ + + + 1.2.2900 + + + 2.0.4 + + \ No newline at end of file diff --git a/Source/PickUpAndHaul/WorkGiver_HaulToInventory.cs b/Source/PickUpAndHaul/WorkGiver_HaulToInventory.cs index cf14b9a..1f21e86 100644 --- a/Source/PickUpAndHaul/WorkGiver_HaulToInventory.cs +++ b/Source/PickUpAndHaul/WorkGiver_HaulToInventory.cs @@ -29,10 +29,14 @@ public override bool HasJobOnThing(Pawn pawn, Thing thing, bool forced = false) { //bulky gear (power armor + minigun) so don't bother. if (MassUtility.GearMass(pawn) / MassUtility.Capacity(pawn) >= 0.8f) + { return false; + } if (!GoodThingToHaul(thing, pawn) || !HaulAIUtility.PawnCanAutomaticallyHaulFast(pawn, thing, forced)) + { return false; + } StoragePriority currentPriority = StoreUtility.CurrentStoragePriorityOf(thing); return StoreUtility.TryFindBestBetterStoreCellFor(thing, pawn, pawn.Map, currentPriority, pawn.Faction, out IntVec3 _); @@ -46,22 +50,30 @@ public override Job JobOnThing(Pawn pawn, Thing thing, bool forced = false) { //bulky gear (power armor + minigun) so don't bother. if (MassUtility.GearMass(pawn) / MassUtility.Capacity(pawn) >= 0.8f) + { return null; + } DesignationDef haulUrgentlyDesignation = DefDatabase.GetNamed("HaulUrgentlyDesignation", false); // Misc. Robots compatibility // See https://github.com/catgirlfighter/RimWorld_CommonSense/blob/master/Source/CommonSense11/CommonSense/OpportunisticTasks.cs#L129-L140 - if (pawn.TryGetComp() == null) + if (pawn.TryGetComp() == null) + { return null; + } //This WorkGiver gets hijacked by AllowTool and expects us to urgently haul corpses. if (ModCompatibilityCheck.AllowToolIsActive && thing is Corpse && pawn.Map.designationManager.DesignationOn(thing)?.def == haulUrgentlyDesignation && HaulAIUtility.PawnCanAutomaticallyHaulFast(pawn, thing, forced)) + { return HaulAIUtility.HaulToStorageJob(pawn, thing); + } if (!GoodThingToHaul(thing, pawn) || !HaulAIUtility.PawnCanAutomaticallyHaulFast(pawn, thing, forced)) + { return null; + } StoragePriority currentPriority = StoreUtility.CurrentStoragePriorityOf(thing); if (StoreUtility.TryFindBestBetterStoreCellFor(thing, pawn, pawn.Map, currentPriority, pawn.Faction, out IntVec3 storeCell, true)) @@ -75,8 +87,12 @@ public override Job JobOnThing(Pawn pawn, Thing thing, bool forced = false) List thingList = storeCell.GetThingList(thing.Map); foreach (Thing t in thingList) + { if (t.def == ThingDefOf.Hopper) + { return HaulAIUtility.HaulToStorageJob(pawn, thing); + } + } } } } @@ -88,25 +104,23 @@ public override Job JobOnThing(Pawn pawn, Thing thing, bool forced = false) //https://github.com/Mehni/PickUpAndHaul/pull/18 if (MassUtility.WillBeOverEncumberedAfterPickingUp(pawn, thing, 1)) + { return HaulAIUtility.HaulToStorageJob(pawn, thing); + } //credit to Dingo int capacityStoreCell = CapacityAt(thing, storeCell, pawn.Map); - if (capacityStoreCell == 0) return HaulAIUtility.HaulToStorageJob(pawn, thing); + if (capacityStoreCell == 0) + { + return HaulAIUtility.HaulToStorageJob(pawn, thing); + } Job job = JobMaker.MakeJob(PickUpAndHaulJobDefOf.HaulToInventory, null, storeCell); //Things will be in queues Log.Message($"-------------------------------------------------------------------"); Log.Message($"------------------------------------------------------------------");//different size so the log doesn't count it 2x Log.Message($"{pawn} job found to haul: {thing} to {storeCell}:{capacityStoreCell}, looking for more now"); - //Find extra things than can be hauled to inventory, queue to reserve them - bool isUrgent = ModCompatibilityCheck.AllowToolIsActive && pawn.Map.designationManager.DesignationOn(thing)?.def == haulUrgentlyDesignation; - - bool validatorExtra(Thing t) => - (!isUrgent || pawn.Map.designationManager.DesignationOn(t)?.def == haulUrgentlyDesignation) && - GoodThingToHaul(t, pawn) && HaulAIUtility.PawnCanAutomaticallyHaulFast(pawn, t, false);//forced is false, may differ from first thing - //Find what fits in inventory, set nextThingLeftOverCount to be int nextThingLeftOverCount = 0; @@ -115,28 +129,23 @@ bool validatorExtra(Thing t) => job.targetQueueB = new List(); //more storage; keep in mind the job doesn't use it, but reserve it so you don't over-haul job.countQueue = new List();//thing counts + var ceOverweight = false; - //TODO check CE along with encumberance - //float usedBulkByPct = 1f; - //float usedWeightByPct = 1f; - - //try - //{ - // ((Action)(() => - // { - // if (ModCompatibilityCheck.CombatExtendedIsActive) - // { - // CombatExtended.CompInventory ceCompInventory = pawn.GetComp(); - // usedWeightByPct = ceCompInventory.currentWeight / ceCompInventory.capacityWeight; - // usedBulkByPct = ceCompInventory.currentBulk / ceCompInventory.capacityBulk; - // } - // }))(); - //} - //catch (TypeLoadException) { } + if (ModCompatibilityCheck.CombatExtendedIsActive) + { + ceOverweight = CompatHelper.CeOverweight(pawn); + } float distanceToHaul = (storeCell - thing.Position).LengthHorizontal * SEARCH_FOR_OTHERS_RANGE_FRACTION; float distanceToSearchMore = Math.Max(12f, distanceToHaul); + //Find extra things than can be hauled to inventory, queue to reserve them + bool isUrgent = ModCompatibilityCheck.AllowToolIsActive && pawn.Map.designationManager.DesignationOn(thing)?.def == haulUrgentlyDesignation; + + bool validatorExtra(Thing t) => + (!isUrgent || pawn.Map.designationManager.DesignationOn(t)?.def == haulUrgentlyDesignation) && + GoodThingToHaul(t, pawn) && HaulAIUtility.PawnCanAutomaticallyHaulFast(pawn, t, false);//forced is false, may differ from first thing + List haulables = pawn.Map.listerHaulables.ThingsPotentiallyNeedingHauling() .Where(validatorExtra).ToList(); @@ -155,9 +164,9 @@ bool validatorExtra(Thing t) => if (AllocateThingAtCell(storeCellCapacity, pawn, nextThing, job)) { lastThing = nextThing; - encumberance += AddedEnumberance(pawn, nextThing); + encumberance += AddedEncumberance(pawn, nextThing); - if (encumberance > 1)// || usedBulkByPct >= 0.7f || usedWeightByPct >= 0.8f))//TODO: CE also + if (encumberance > 1 || ceOverweight) { //can't CountToPickUpUntilOverEncumbered here, pawn doesn't actually hold these things yet nextThingLeftOverCount = CountPastCapacity(pawn, nextThing, encumberance); @@ -196,7 +205,9 @@ bool validatorExtra(Thing t) => carryCapacity -= nextThing.stackCount; if (AllocateThingAtCell(storeCellCapacity, pawn, nextThing, job)) + { break; + } if (carryCapacity <= 0) { @@ -236,7 +247,9 @@ public static int CapacityAt(Thing thing, IntVec3 storeCell, Map map) Thing preExistingThing = map.thingGrid.ThingAt(storeCell, thing.def); if (preExistingThing != null) + { capacity = thing.def.stackLimit - preExistingThing.stackCount; + } return capacity; } @@ -272,7 +285,10 @@ public static bool AllocateThingAtCell(Dictionary store Log.Message($"{nextThing} can't stack with allocated cells"); if (job.targetQueueA.NullOrEmpty()) + { job.targetQueueA.Add(nextThing); + } + return false; } } @@ -290,7 +306,9 @@ public static bool AllocateThingAtCell(Dictionary store Log.Message($"{pawn} overdone {storeCell} by {capacityOver}"); if (capacityOver == 0) + { break; //don't find new cell, might not have more of this thing to haul + } StoragePriority currentPriority = StoreUtility.CurrentStoragePriorityOf(nextThing); if (TryFindBestBetterStoreCellFor(nextThing, pawn, map, currentPriority, pawn.Faction, out IntVec3 nextStoreCell)) @@ -336,7 +354,7 @@ public static bool TryFindBestBetterStoreCellFor(Thing thing, Pawn carrier, Map return false; } - public static float AddedEnumberance(Pawn pawn, Thing thing) + public static float AddedEncumberance(Pawn pawn, Thing thing) => thing.stackCount * thing.GetStatValue(StatDefOf.Mass) / MassUtility.Capacity(pawn); public static int CountPastCapacity(Pawn pawn, Thing thing, float encumberance)