public override float GetWidth(float maxWidth) { GoldfishModule pawnMemory = GoldfishModule.GetGoldfishForPawn(parent); //if (pawnMemory == null) // return 75; int biggerCount = Math.Max(rangedWeapons.Count + calcUnmatchedRangedWeapons(pawnMemory, parent), meleeWeapons.Count + calcUnmatchedMeleeWeapons(pawnMemory, parent) + 1); float width = ContentPadding * 2 + (IconSize * biggerCount) + IconGap * (biggerCount - 1) + LockPanelWidth; return(Math.Min(width, maxWidth)); }
public override float GetWidth(float maxWidth) { GoldfishModule pawnMemory = GoldfishModule.GetGoldfishForPawn(parent); //if (pawnMemory == null) // return 75; int biggerCount = Math.Max( carriedRangedWeapons.Count() + countMissingRangedWeapons(pawnMemory, parent), carriedMeleeWeapons.Count() + countMissingMeleeWeapons(pawnMemory, parent) + 1 ); float width = SelectorPanelWidth + ContentPadding + (IconSize * biggerCount) + IconGap * (biggerCount - 1) + ContentPadding; return(Math.Min(Math.Max(width, MinGizmoSize), maxWidth)); }
protected override IEnumerable <Toil> MakeNewToils() { yield return(Toils_Reserve.Reserve(TargetIndex.A, 1, -1, null)); yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.ClosestTouch).FailOnDespawnedNullOrForbidden(TargetIndex.A)); yield return(new Toil { initAction = delegate { ThingWithComps thingWithComps = (ThingWithComps)this.job.targetA.Thing; ThingWithComps thingWithComps2; if (thingWithComps.def.stackLimit > 1 && thingWithComps.stackCount > 1) { thingWithComps2 = (ThingWithComps)thingWithComps.SplitOff(1); } else { thingWithComps2 = thingWithComps; thingWithComps2.DeSpawn(); } bool success = this.pawn.inventory.innerContainer.TryAdd(thingWithComps2); if (thingWithComps.def.soundInteract != null) { thingWithComps.def.soundInteract.PlayOneShot(new TargetInfo(this.pawn.Position, this.pawn.Map, false)); } if (success) { GoldfishModule pawnMemory = GoldfishModule.GetGoldfishForPawn(this.pawn); if (pawnMemory == null) { return; } if (MemorizeOnPickup) { pawnMemory.InformOfAddedSidearm(thingWithComps2); } } }, defaultCompleteMode = ToilCompleteMode.Instant }); Toil onFinish = OnFinish(); if (onFinish != null) { yield return(onFinish); } }
public static Job TryGiveJobStatic(Pawn pawn, bool inCombat) { if (RestraintsUtility.InRestraints(pawn)) { return(null); } { //SetNextTryTick(pawn, Find.TickManager.TicksGame + UnityEngine.Random.Range(PickupCheckIntervalMin, PickupCheckIntervalMax)); Pawn_EquipmentTracker equipment = pawn.equipment; if (equipment == null) { return(null); } GoldfishModule pawnMemory = GoldfishModule.GetGoldfishForPawn(pawn); if (pawnMemory == null) { return(null); } WeaponAssingment.reequipPrimaryIfNeededAndAvailable(pawn, pawnMemory); foreach (string wepName in pawnMemory.weapons) { ThingDef def = DefDatabase <ThingDef> .GetNamedSilentFail(wepName); if (def == null) { continue; } if (!pawn.hasWeaponSomewhere(wepName)) { float maxDist = 1000f; if (pawn.Faction != Faction.OfPlayer || inCombat) { maxDist = 30f; } List <Thing> matchingWeapons = pawn.Map.listerThings.ThingsOfDef(def); Thing thing = GenClosest.ClosestThing_Global_Reachable(pawn.Position, pawn.Map, matchingWeapons, PathEndMode.OnCell, TraverseParms.For(pawn), maxDist, (Thing t) => !t.IsForbidden(pawn) && pawn.CanReserve(t), (Thing t) => SimpleSidearms.ReEquipBest ? t.GetStatValue(StatDefOf.MeleeWeapon_AverageDPS, false) : 0); if (thing == null) { continue; } if (!inCombat) { return(new Job(SidearmsDefOf.EquipSecondary, thing)); } else { return(new Job(SidearmsDefOf.EquipSecondaryCombat, thing, pawn.Position)); } } } return(null); } }
public override GizmoResult GizmoOnGUI(Vector2 topLeft, float maxWidth) { interactionWeaponIsDuplicate = false; interactionWeapon = null; interactionWeaponType = null; var gizmoRect = new Rect(topLeft.x, topLeft.y, GetWidth(maxWidth), MinGizmoSize); if (Mouse.IsOver(gizmoRect)) { LessonAutoActivator.TeachOpportunity(SidearmsDefOf.Concept_SimpleSidearmsBasic, OpportunityType.Important); } var contentRect = gizmoRect.ContractedBy(ContentPadding); Widgets.DrawWindowBackground(gizmoRect); GoldfishModule pawnMemory = GoldfishModule.GetGoldfishForPawn(parent); int i = 0; { Dictionary <ThingStuffPair, int> dupeCounters = new Dictionary <ThingStuffPair, int>(); var rangedWeapons = carriedRangedWeapons.ToList(); rangedWeapons.SortStable((a, b) => { return((int)((b.MarketValue - a.MarketValue) * 1000)); }); for (i = 0; i < rangedWeapons.Count(); i++) { ThingStuffPair weaponMemory = rangedWeapons[i].toThingStuffPair(); if (!dupeCounters.ContainsKey(weaponMemory)) { dupeCounters[weaponMemory] = 0; } bool isDupe = dupeCounters[weaponMemory] > 0; var iconOffset = new Vector2((IconSize * i) + IconGap * (i - 1) + SelectorPanelWidth, 0); DrawIconForWeapon(parent, pawnMemory, rangedWeapons[i], isDupe, contentRect, iconOffset); dupeCounters[weaponMemory]++; } } int j = 0; if (pawnMemory != null) { Dictionary <ThingStuffPair, int> dupeCounters = new Dictionary <ThingStuffPair, int>(); var rangedWeaponMemoriesSorted = rangedWeaponMemories.ToList(); rangedWeaponMemoriesSorted.SortStable((a, b) => { return((int)((b.Price - a.Price) * 1000)); }); foreach (ThingStuffPair weaponMemory in rangedWeaponMemoriesSorted) { if (!dupeCounters.ContainsKey(weaponMemory)) { dupeCounters[weaponMemory] = 0; } if (!parent.hasWeaponSomewhere(weaponMemory, dupeCounters[weaponMemory])) { bool isDupe = dupeCounters[weaponMemory] > 0; var iconOffset = new Vector2((IconSize * (i + j)) + IconGap * ((i + j) - 1) + SelectorPanelWidth, 0); DrawIconForWeaponMemory(parent, pawnMemory, weaponMemory, isDupe, contentRect, iconOffset); j++; } dupeCounters[weaponMemory]++; } } { Dictionary <ThingStuffPair, int> dupeCounters = new Dictionary <ThingStuffPair, int>(); var meleeWeapons = carriedMeleeWeapons.ToList(); meleeWeapons.SortStable((a, b) => { return((int)((b.MarketValue - a.MarketValue) * 1000)); }); for (i = 0; i < meleeWeapons.Count(); i++) { ThingStuffPair weaponMemory = meleeWeapons[i].toThingStuffPair(); if (!dupeCounters.ContainsKey(weaponMemory)) { dupeCounters[weaponMemory] = 0; } bool isDupe = dupeCounters[weaponMemory] > 0; var iconOffset = new Vector2((IconSize * i) + IconGap * (i - 1) + SelectorPanelWidth, IconSize + IconGap); DrawIconForWeapon(parent, pawnMemory, meleeWeapons[i], isDupe, contentRect, iconOffset); dupeCounters[weaponMemory]++; } } j = 0; if (pawnMemory != null) { Dictionary <ThingStuffPair, int> dupeCounters = new Dictionary <ThingStuffPair, int>(); var meleeWeaponMemoriesSorted = meleeWeaponMemories.ToList(); meleeWeaponMemoriesSorted.SortStable((a, b) => { return((int)((b.Price - a.Price) * 1000)); }); foreach (ThingStuffPair weaponMemory in meleeWeaponMemoriesSorted) { if (!dupeCounters.ContainsKey(weaponMemory)) { dupeCounters[weaponMemory] = 0; } if (!parent.hasWeaponSomewhere(weaponMemory, dupeCounters[weaponMemory])) { bool isDupe = dupeCounters[weaponMemory] > 0; var iconOffset = new Vector2((IconSize * (i + j)) + IconGap * ((i + j) - 1) + SelectorPanelWidth, IconSize + IconGap); DrawIconForWeaponMemory(parent, pawnMemory, weaponMemory, isDupe, contentRect, iconOffset); dupeCounters[weaponMemory]++; j++; } } } var unarmedIconOffset = new Vector2((IconSize * (i + j)) + IconGap * ((i + j) - 1) + SelectorPanelWidth, IconSize + IconGap); DrawIconForUnarmed(parent, pawnMemory, contentRect, unarmedIconOffset); Rect selectorPanel = new Rect(gizmoRect.x + ContentPadding, gizmoRect.y + ContentPadding, SelectorPanelWidth - ContentPadding * 2, MinGizmoSize - ContentPadding * 2); DrawPreferenceSelector(parent, pawnMemory, selectorPanel); UIHighlighter.HighlightOpportunity(gizmoRect, "SidearmList"); if (parent.IsColonistPlayerControlled && !parent.story.DisabledWorkTagsBackstoryAndTraits.OverlapsWithOnAnyWorkType(WorkTags.Violent)) { DrawGizmoLabel(defaultLabel, gizmoRect); } else { DrawGizmoLabel(defaultLabel + " (godmode)", gizmoRect); } return(interactedWith != SidearmsListInteraction.None ? new GizmoResult(GizmoState.Interacted, Event.current) : new GizmoResult(GizmoState.Clear)); }
public void handleInteraction(SidearmsListInteraction interaction, Event ev) { GoldfishModule pawnMemory = GoldfishModule.GetGoldfishForPawn(parent); if (pawnMemory == null) { return; } var dropMode = parent.Drafted ? DroppingModeEnum.Combat : DroppingModeEnum.Calm; if (ev.button == LEFT_CLICK) { switch (interaction) { case SidearmsListInteraction.SelectorRanged: PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsPreference, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.primaryWeaponMode = GoldfishModule.PrimaryWeaponMode.Ranged; break; case SidearmsListInteraction.SelectorSkill: PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsPreference, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.primaryWeaponMode = GoldfishModule.PrimaryWeaponMode.BySkill; break; case SidearmsListInteraction.SelectorMelee: PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsPreference, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.primaryWeaponMode = GoldfishModule.PrimaryWeaponMode.Melee; break; case SidearmsListInteraction.Weapon: Thing weapon = interactionWeapon; ThingStuffPair weaponType = weapon.toThingStuffPair(); if (parent.Drafted) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedDrafted, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.SetWeaponAsForced(weaponType, true); if (parent.equipment.Primary != weapon && weapon is ThingWithComps) { WeaponAssingment.equipSpecificWeaponTypeFromInventory(parent, weaponType, MiscUtils.shouldDrop(dropMode), false); } } else if (pawnMemory.DefaultRangedWeapon == weaponType || pawnMemory.PreferredMeleeWeapon == weaponType) { if (weaponType.thing.IsRangedWeapon) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedRanged, KnowledgeAmount.SpecificInteraction); } else { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedMelee, KnowledgeAmount.SpecificInteraction); } PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.SetWeaponAsForced(weaponType, false); if (parent.equipment.Primary != weapon && weapon is ThingWithComps) { WeaponAssingment.equipSpecificWeaponTypeFromInventory(parent, weaponType, MiscUtils.shouldDrop(dropMode), false); } } else { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); if (weaponType.thing.IsRangedWeapon) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedRanged, KnowledgeAmount.SpecificInteraction); pawnMemory.SetRangedWeaponTypeAsDefault(weaponType); } else { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedMelee, KnowledgeAmount.SpecificInteraction); pawnMemory.SetMeleeWeaponTypeAsPreferred(weaponType); } } break; case SidearmsListInteraction.WeaponMemory: ThingStuffPair weaponMemory = interactionWeaponType.Value; if (parent.Drafted) { //allow nothing } else { if (weaponMemory.thing.IsRangedWeapon) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedRanged, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.SetRangedWeaponTypeAsDefault(weaponMemory); } else { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedMelee, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.SetMeleeWeaponTypeAsPreferred(weaponMemory); } } break; case SidearmsListInteraction.Unarmed: if (parent.Drafted) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedDrafted, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.SetUnarmedAsForced(true); if (parent.equipment.Primary != null) { WeaponAssingment.equipSpecificWeapon(parent, null, MiscUtils.shouldDrop(dropMode), false); } } else if (pawnMemory.PreferredUnarmed) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedMelee, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.SetUnarmedAsForced(false); if (parent.equipment.Primary != null) { WeaponAssingment.equipSpecificWeapon(parent, null, MiscUtils.shouldDrop(dropMode), false); } } else { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedMelee, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.SetUnarmedAsPreferredMelee(); } break; case SidearmsListInteraction.None: default: return; break; } } else if (ev.button == RIGHT_CLICK) { switch (interaction) { case SidearmsListInteraction.SelectorRanged: case SidearmsListInteraction.SelectorSkill: case SidearmsListInteraction.SelectorMelee: break; case SidearmsListInteraction.Weapon: Thing weapon = interactionWeapon; ThingStuffPair weaponType = weapon.toThingStuffPair(); if (interactionWeaponIsDuplicate) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SidearmsDropping, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); WeaponAssingment.dropSidearm(parent, weapon, true); } else { if (parent.Drafted) { if (pawnMemory.ForcedWeaponWhileDrafted == weaponType) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedDrafted, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.UnsetForcedWeapon(true); } } else { if (pawnMemory.ForcedWeapon == weaponType) { if (weaponType.thing.IsRangedWeapon) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedRanged, KnowledgeAmount.SpecificInteraction); } else { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedMelee, KnowledgeAmount.SpecificInteraction); } PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.UnsetForcedWeapon(false); } else if (weaponType.thing.IsRangedWeapon & pawnMemory.DefaultRangedWeapon == weaponType) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedRanged, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.UnsetRangedWeaponDefault(); } else if (pawnMemory.PreferredMeleeWeapon == weaponType) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedMelee, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.UnsetMeleeWeaponPreference(); } else { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SidearmsDropping, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); WeaponAssingment.dropSidearm(parent, weapon, true); } } } break; case SidearmsListInteraction.WeaponMemory: ThingStuffPair weaponMemory = interactionWeaponType.Value; if (interactionWeaponIsDuplicate) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SidearmsMissing, KnowledgeAmount.SmallInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.ForgetSidearmMemory(weaponMemory); } else { if (parent.Drafted) { if (pawnMemory.ForcedWeaponWhileDrafted == weaponMemory) { if (weaponMemory.thing.IsRangedWeapon) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedRanged, KnowledgeAmount.SpecificInteraction); } else { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedMelee, KnowledgeAmount.SpecificInteraction); } PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.UnsetForcedWeapon(true); } } else { if (pawnMemory.ForcedWeapon == weaponMemory) { if (weaponMemory.thing.IsRangedWeapon) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedRanged, KnowledgeAmount.SpecificInteraction); } else { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedMelee, KnowledgeAmount.SpecificInteraction); } PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.UnsetForcedWeapon(false); } else if (weaponMemory.thing.IsRangedWeapon & pawnMemory.DefaultRangedWeapon == weaponMemory) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedRanged, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.UnsetRangedWeaponDefault(); } else if (pawnMemory.PreferredMeleeWeapon == weaponMemory) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedMelee, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.UnsetMeleeWeaponPreference(); } else { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SidearmsMissing, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.ForgetSidearmMemory(weaponMemory); } } } break; case SidearmsListInteraction.Unarmed: if (parent.Drafted && pawnMemory.ForcedUnarmedWhileDrafted) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedDrafted, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.UnsetUnarmedAsForced(true); } else if (pawnMemory.ForcedUnarmed) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedMelee, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.UnsetUnarmedAsForced(false); } else if (pawnMemory.PreferredUnarmed) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsAdvancedMelee, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); pawnMemory.UnsetMeleeWeaponPreference(); } break; case SidearmsListInteraction.None: default: return; break; } } }
private void iconClickAction(int buttonID) { if (interactedWeapon != null) { Thing toSwapTo; if (interactedRanged) { if (buttonID == 0) { toSwapTo = interactedWeapon; if (GoldfishModule.GetGoldfishForPawn(parent) != null && toSwapTo.def.defName.Equals(GoldfishModule.GetGoldfishForPawn(parent).primary)) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SidearmsPrimary, KnowledgeAmount.Total); } WeaponAssingment.weaponSwapSpecific(parent, toSwapTo, true, MiscUtils.shouldDrop(DroppingModeEnum.UserForced), false); SwapControlsHandler handler = SwapControlsHandler.GetHandlerForPawn(parent); if (handler.autoLockOnManualSwap) { handler.currentWeaponLocked = true; } PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SidearmsInInventory, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); } else if (buttonID == 1) { WeaponAssingment.dropSidearm(parent, interactedWeapon); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SidearmsInInventory, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); } } else { if (buttonID == 0) { toSwapTo = interactedWeapon; if (GoldfishModule.GetGoldfishForPawn(parent) != null && toSwapTo.def.defName.Equals(GoldfishModule.GetGoldfishForPawn(parent).primary)) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SidearmsPrimary, KnowledgeAmount.Total); } WeaponAssingment.weaponSwapSpecific(parent, toSwapTo, true, MiscUtils.shouldDrop(DroppingModeEnum.UserForced), false); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SidearmsInInventory, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); } else if (buttonID == 1) { WeaponAssingment.dropSidearm(parent, interactedWeapon); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SidearmsInInventory, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); } } } else if (interactedWeaponMemory != null) { if (interactedRanged) { if (buttonID == 0) { } else if (buttonID == 1) { WeaponAssingment.forgetSidearmMemory(parent, interactedWeaponMemory); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SidearmsMissing, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); } } else { if (buttonID == 0) { } else if (buttonID == 1) { WeaponAssingment.forgetSidearmMemory(parent, interactedWeaponMemory); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SidearmsMissing, KnowledgeAmount.SpecificInteraction); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); } } } else if (interactedUnarmed == true) { if (buttonID == 0) { WeaponAssingment.weaponSwapSpecific(parent, null, true, MiscUtils.shouldDrop(DroppingModeEnum.UserForced), false); PlayerKnowledgeDatabase.KnowledgeDemonstrated(SidearmsDefOf.Concept_SimpleSidearmsBasic, KnowledgeAmount.SmallInteraction); } } }
public override GizmoResult GizmoOnGUI(Vector2 topLeft) { var gizmoRect = new Rect(topLeft.x, topLeft.y, Width, MinGizmoSize); if (Mouse.IsOver(gizmoRect)) { LessonAutoActivator.TeachOpportunity(SidearmsDefOf.Concept_SimpleSidearmsBasic, OpportunityType.Important); } var contentRect = gizmoRect.ContractedBy(ContentPadding); Widgets.DrawWindowBackground(gizmoRect); var globalInteracted = false; interactedWeapon = null; interactedWeaponMemory = null; interactedRanged = false; interactedUnarmed = false; GoldfishModule pawnMemory = GoldfishModule.GetGoldfishForPawn(parent); //if (pawnMemory == null) // return new GizmoResult(GizmoState.Clear); int i = 0; for (i = 0; i < rangedWeapons.Count; i++) { var iconOffset = new Vector2((IconSize * i) + IconGap * (i - 1) + LockPanelWidth, 0); bool interacted = DrawIconForWeapon(pawnMemory, rangedWeapons[i], contentRect, iconOffset); if (interacted) { interactedWeapon = rangedWeapons[i]; } if (interacted) { interactedRanged = true; } globalInteracted |= interacted; } int j = 0; if (pawnMemory != null) { foreach (ThingDef def in rangedWeaponMemories) { if (!parent.hasWeaponSomewhere(def)) { var iconOffset = new Vector2((IconSize * (i + j)) + IconGap * ((i + j) - 1) + LockPanelWidth, 0); bool interacted = DrawIconForWeaponMemory(pawnMemory, def, contentRect, iconOffset); if (interacted) { interactedWeaponMemory = def; } if (interacted) { interactedRanged = true; } globalInteracted |= interacted; j++; } } } for (i = 0; i < meleeWeapons.Count; i++) { var iconOffset = new Vector2((IconSize * i) + IconGap * (i - 1) + LockPanelWidth, IconSize + IconGap); bool interacted = DrawIconForWeapon(pawnMemory, meleeWeapons[i], contentRect, iconOffset); if (interacted) { interactedWeapon = meleeWeapons[i]; } if (interacted) { interactedRanged = false; } globalInteracted |= interacted; } j = 0; if (pawnMemory != null) { foreach (ThingDef def in meleeWeaponMemories) { if (!parent.hasWeaponSomewhere(def)) { var iconOffset = new Vector2((IconSize * (i + j)) + IconGap * ((i + j) - 1) + LockPanelWidth, IconSize + IconGap); bool interacted = DrawIconForWeaponMemory(pawnMemory, def, contentRect, iconOffset); if (interacted) { interactedWeaponMemory = def; } if (interacted) { interactedRanged = false; } globalInteracted |= interacted; j++; } } } var unarmedIconOffset = new Vector2((IconSize * (i + j)) + IconGap * ((i + j) - 1) + LockPanelWidth, IconSize + IconGap); interactedUnarmed = DrawIconForUnarmed(parent, contentRect, unarmedIconOffset); globalInteracted |= interactedUnarmed; Rect locksPanel = new Rect(gizmoRect.x + ContentPadding, gizmoRect.y, LockPanelWidth - ContentPadding, MinGizmoSize); //locksPanel = locksPanel.ContractedBy(LockPanelPadding); SwapControlsHandler handler = SwapControlsHandler.GetHandlerForPawn(parent); Rect lockPanel = new Rect(locksPanel.x, locksPanel.y + (locksPanel.height / 2f) - locksPanel.width - LockIconsOffset, locksPanel.width, locksPanel.width); Rect locklockPanel = new Rect(locksPanel.x, locksPanel.y + (locksPanel.height / 2f) + LockIconsOffset, locksPanel.width, locksPanel.width); DrawLock(handler, lockPanel); UIHighlighter.HighlightOpportunity(lockPanel, "SidearmListButton"); DrawLocklock(handler, locklockPanel); UIHighlighter.HighlightOpportunity(locklockPanel, "SidearmListButton"); UIHighlighter.HighlightOpportunity(gizmoRect, "SidearmList"); DrawGizmoLabel(defaultLabel, gizmoRect); return(globalInteracted ? new GizmoResult(GizmoState.Interacted, Event.current) : new GizmoResult(GizmoState.Clear)); }
public static Job TryGiveJobStatic(Pawn pawn, bool inCombat) { if (RestraintsUtility.InRestraints(pawn)) { return(null); } { //SetNextTryTick(pawn, Find.TickManager.TicksGame + UnityEngine.Random.Range(PickupCheckIntervalMin, PickupCheckIntervalMax)); Pawn_EquipmentTracker equipment = pawn.equipment; if (equipment == null) { return(null); } GoldfishModule pawnMemory = GoldfishModule.GetGoldfishForPawn(pawn); if (pawnMemory == null) { return(null); } WeaponAssingment.reequipPrimaryIfNeededAndAvailable(pawn, pawnMemory); foreach (string wepName in pawnMemory.weapons) { ThingDef def = DefDatabase <ThingDef> .GetNamedSilentFail(wepName); if (def == null) { continue; } if (!pawn.hasWeaponSomewhere(wepName)) { ThingRequest request = new ThingRequest(); request.singleDef = def; float maxDist = 1000f; if (pawn.Faction != Faction.OfPlayer || inCombat) { maxDist = 30f; } Thing thing = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, request, PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), maxDist, (Thing x) => (!x.IsForbidden(pawn)) && pawn.CanReserve(x, 1, -1, null, false)); if (thing == null) { continue; } if (!inCombat) { return(new Job(SidearmsDefOf.EquipSecondary, thing)); } else { return(new Job(SidearmsDefOf.EquipSecondaryCombat, thing, pawn.Position)); } } } return(null); } }
public static Job TryGiveJobStatic(Pawn pawn, bool inCombat) { if (RestraintsUtility.InRestraints(pawn)) { return(null); } else { Pawn_EquipmentTracker equipment = pawn.equipment; if (equipment == null) { return(null); } GoldfishModule pawnMemory = GoldfishModule.GetGoldfishForPawn(pawn); if (pawnMemory == null) { return(null); } if (SimpleSidearms.ToolAutoSwitch && ((Find.TickManager.TicksGame - pawnMemory.delayIdleSwitchTimestamp) < 60)) { return(null); } WeaponAssingment.equipBestWeaponFromInventoryByPreference(pawn, Globals.DroppingModeEnum.Calm); if (pawnMemory.RememberedWeapons is null) { Log.Warning("pawnMemory of " + pawn.Label + " is missing remembered weapons"); } Dictionary <ThingDefStuffDefPair, int> dupeCounters = new Dictionary <ThingDefStuffDefPair, int>(); foreach (ThingDefStuffDefPair weaponMemory in pawnMemory.RememberedWeapons) { if (!dupeCounters.ContainsKey(weaponMemory)) { dupeCounters[weaponMemory] = 0; } if (!pawn.hasWeaponSomewhere(weaponMemory, dupeCounters[weaponMemory])) { float maxDist = 1000f; if (pawn.Faction != Faction.OfPlayer) { maxDist = 30f; } if (inCombat) { maxDist = 12f; } IEnumerable <Thing> matchingWeapons = pawn.Map.listerThings.ThingsOfDef(weaponMemory.thing).Where(t => t.Stuff == weaponMemory.stuff); Thing thing = GenClosest.ClosestThing_Global_Reachable(pawn.Position, pawn.Map, matchingWeapons, PathEndMode.OnCell, TraverseParms.For(pawn), maxDist, (Thing t) => !t.IsForbidden(pawn) && pawn.CanReserve(t), (Thing t) => SimpleSidearms.ReEquipBest ? t.GetStatValue(StatDefOf.MeleeWeapon_AverageDPS, false) : 0); //this works properly because better ranged weapons also happen to be better at pistolwhipping //okay past me, WHAT? Why? if (thing == null) { continue; } if (!inCombat) { return(JobMaker.MakeJob(SidearmsDefOf.ReequipSecondary, thing)); } else { return(JobMaker.MakeJob(SidearmsDefOf.ReequipSecondaryCombat, thing, pawn.Position)); } } dupeCounters[weaponMemory]++; } return(null); } }
protected override Job TryGiveJob(Pawn pawn) { //Log.Message("retrieval precheck for " + pawn.LabelShort); if (pawn.Faction != Faction.OfPlayer) { return(null); } if (pawn.Drafted) { return(null); } /*if (Find.TickManager.TicksGame > GetNextTryTick(pawn)) * { * return null; * } * else*/ { //SetNextTryTick(pawn, Find.TickManager.TicksGame + UnityEngine.Random.Range(PickupCheckIntervalMin, PickupCheckIntervalMax)); //Log.Message("retrieval check for " + pawn.LabelShort); Pawn_EquipmentTracker equipment = pawn.equipment; if (equipment == null) { return(null); } GoldfishModule pawnMemory = GoldfishModule.GetGoldfishForPawn(pawn); if (pawnMemory == null) { return(null); } WeaponAssingment.reequipPrimaryIfNeededAndAvailable(pawn, pawnMemory); foreach (string wepName in pawnMemory.weapons) { //Log.Message("checking "+wepName); ThingDef def = DefDatabase <ThingDef> .GetNamedSilentFail(wepName); if (def == null) { continue; } if (!pawn.hasWeaponSomewhere(wepName)) { //Log.Message("looking for"); ThingRequest request = new ThingRequest(); request.singleDef = def; Thing thing = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, request, PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 1000f, (Thing x) => (!x.IsForbidden(pawn)) && pawn.CanReserve(x, 1, -1, null, false)); if (thing == null) { continue; } return(new Job(SidearmsJobDefOf.EquipSecondary, thing)); } } return(null); } }