public static void Listener(MentalStateDef stateDef, string reason, bool forceWake, bool causedByMood, Pawn otherPawn, bool transitionSilently, Pawn ___pawn, MentalStateHandler __instance, ref bool __result) { if (__result && ___pawn.IsSurrogateAndroid()) { CompAndroidState cas = ___pawn.TryGetComp <CompAndroidState>(); if (cas == null || cas.surrogateController == null) { return; } CompSurrogateOwner cso = cas.surrogateController.TryGetComp <CompSurrogateOwner>(); if (cso.skyCloudHost != null) { CompSkyCloudCore csc = cso.skyCloudHost.TryGetComp <CompSkyCloudCore>(); if (csc == null) { return; } //Ajout a une liste de minds boudant avec timeout csc.setMentalBreak(cas.surrogateController); } } }
public static void Listener(ref bool __result, RecipeDef __instance) { if (Utils.curSelPatientDrawMedOperationsTab != null) { if ((Utils.curSelPatientDrawMedOperationsTab is Pawn)) { CompAndroidState cas = Utils.curSelPatientDrawMedOperationsTab.ATCompState; if (cas != null) { //Si androide surrogate on va virer la possibilité d'ajouter des VX chips if (cas.isSurrogate) { if (Utils.ExceptionVXNeuralChipSurgery.Contains(__instance.defName)) { __result = false; } } else { //Sinon si pas surrogate et que le recipe en question est à destination des surrogates on le squeeze if (Utils.ExceptionArtificialBrainsSurgery.Contains(__instance.defName)) { __result = false; } } } } } }
public override void ApplyOnPawn(Pawn pawn, BodyPartRecord part, Pawn billDoer, List <Thing> ingredients, Bill bill) { CompAndroidState cas = pawn.TryGetComp <CompAndroidState>(); if (cas == null) { return; } //Le cas echeant on deconnecte le controlleur s'il y en a un if (cas.surrogateController != null) { CompSurrogateOwner cso = cas.surrogateController.TryGetComp <CompSurrogateOwner>(); if (cso != null) { cso.disconnectControlledSurrogate(pawn); } } //On définis le fait qu'il ne sagit plus d'un surrogate mais d'un blank neural net andorid cas.isSurrogate = false; Hediff he = pawn.health.hediffSet.GetFirstHediffOfDef(Utils.hediffNoHost); if (he != null) { pawn.health.RemoveHediff(he); } cas.isBlankAndroid = true; pawn.health.AddHediff(Utils.hediffBlankAndroid); }
public void setMentalBreak(Pawn mind) { if (!storedMinds.Contains(mind) || inMentalBreak.ContainsKey(mind)) { return; } //Arret du mental state mind.mindState.Reset(); //Si surrogate founris resolution du controleur if (mind.IsSurrogateAndroid()) { CompAndroidState cas = mind.ATCompState; if (cas == null || cas.surrogateController == null) { return; } mind = cas.surrogateController; } //Arret des activitées stopMindActivities(mind); inMentalBreak[mind] = Rand.Range(Settings.minDurationMentalBreakOfDigitisedMinds, Settings.maxDurationMentalBreakOfDigitisedMinds) * 2500; Utils.playVocal("soundDefSkyCloudMindQuarantineMentalState"); }
private static FloatMenuOption GetFailureReason(Building_Bed bed, Pawn myPawn) { if (!myPawn.CanReach(bed, PathEndMode.InteractionCell, Danger.Some, false, TraverseMode.ByPawn)) { return(new FloatMenuOption("CannotUseNoPath".Translate(), null, MenuOptionPriority.Default, null, null, 0f, null, null)); } if (bed.Spawned && bed.Map.gameConditionManager.ConditionIsActive(GameConditionDefOf.SolarFlare)) { return(new FloatMenuOption("CannotUseSolarFlare".Translate(), null, MenuOptionPriority.Default, null, null, 0f, null, null)); } if (!bed.TryGetComp <CompPowerTrader>().PowerOn) { return(new FloatMenuOption("CannotUseNoPower".Translate(), null, MenuOptionPriority.Default, null, null, 0f, null, null)); } if (!Utils.ExceptionAndroidList.Contains(myPawn.def.defName)) { return(new FloatMenuOption("ATPP_CanOnlyBeUsedByAndroid".Translate(), null, MenuOptionPriority.Default, null, null, 0f, null, null)); } CompAndroidState ca = myPawn.TryGetComp <CompAndroidState>(); if (ca == null || !ca.UseBattery) { return(new FloatMenuOption("ATPP_CannotUseBecauseNotInBatteryMode".Translate(), null, MenuOptionPriority.Default, null, null, 0f, null, null)); } return(null); }
public static void Listener(Faction newFaction, Pawn recruiter, Pawn __instance) { try { if (__instance == null) { return; } //Si surrogate on le deconnecte et on clear le controlleur (SI pas faisant suite à un piratage) CompAndroidState cas = __instance.TryGetComp <CompAndroidState>(); if (cas != null && cas.isSurrogate && cas.externalController != null && newFaction != null && newFaction.IsPlayer && !(Find.DesignatorManager.SelectedDesignator != null && Find.DesignatorManager.SelectedDesignator is Designator_SurrogateToHack)) { if (cas.surrogateController != null) { //On affiche une notif Find.LetterStack.ReceiveLetter("ATPP_LetterTraitorOffline".Translate(), "ATPP_LetterTraitorOfflineDesc".Translate(__instance.LabelShortCap), LetterDefOf.NegativeEvent); //Le cas echeant on le deconnecte if (cas.surrogateController.TryGetComp <CompSurrogateOwner>() != null) { cas.surrogateController.TryGetComp <CompSurrogateOwner>().disconnectControlledSurrogate(null); } } //On vire l'external controller cas.externalController = null; } } catch (Exception e) { Log.Message("[ATPP] Pawn.SetFaction " + e.Message + " " + e.StackTrace); } }
public override void ApplyOnPawn(Pawn pawn, BodyPartRecord part, Pawn billDoer, List<Thing> ingredients, Bill bill) { CompAndroidState cas = pawn.TryGetComp<CompAndroidState>(); if (cas == null) return; cas.customColor = (int)AndroidPaintColor.Orange; this.applyFrameworkColor(pawn); }
private static bool shouldSkipCurrentMemory(ThoughtDef memDef, MemoryThoughtHandler __instance) { CompAndroidState cas = __instance.pawn.TryGetComp <CompAndroidState>(); return((Utils.IgnoredThoughtsByAllAndroids.Contains(memDef.defName) && Utils.ExceptionAndroidList.Contains(__instance.pawn.def.defName)) || Utils.lastButcheredPawnIsAndroid || (cas != null && cas.isSurrogate && cas.surrogateController == null) || Utils.pawnCurrentlyControlRemoteSurrogate(__instance.pawn) || (Utils.IgnoredThoughtsByBasicAndroids.Contains(memDef.defName) && (Utils.ExceptionAndroidListBasic.Contains(__instance.pawn.def.defName) || __instance.pawn.story.traits.HasTrait(Utils.traitSimpleMinded)))); }
public static void Apply(Pawn user) { CompAndroidState cas = user.TryGetComp <CompAndroidState>(); if (cas != null) { int CGT = Find.TickManager.TicksGame; cas.frameworkNaniteEffectGTStart = CGT; cas.frameworkNaniteEffectGTEnd = CGT + (Rand.Range(Settings.minHoursNaniteFramework, Settings.maxHoursNaniteFramework) * 2500); } }
protected void applyFrameworkColor(Pawn pawn) { CompAndroidState cas = pawn.TryGetComp <CompAndroidState>(); if (cas == null) { return; } //Renouvellement délais de rouille cas.clearRusted(); }
public override void ApplyOnPawn(Pawn pawn, BodyPartRecord part, Pawn billDoer, List <Thing> ingredients, Bill bill) { CompAndroidState cas = pawn.ATCompState; if (cas == null) { return; } cas.customColor = (int)AndroidPaintColor.Purple; this.applyFrameworkColor(pawn); }
public override AcceptanceReport CanDesignateThing(Thing t) { base.CanDesignateThing(t); if (t is Pawn) { Pawn cp = (Pawn)t; CompSkyMind csm = cp.TryGetComp <CompSkyMind>(); CompAndroidState cas = cp.ATCompState; //Si pas clone ou clone deja utilisé on degage if (cas == null || !cas.isSurrogate || cas.surrogateController != null || csm.Infected != -1) { return(false); } if (!Utils.GCATPP.isConnectedToSkyMind(cp)) { //Tentative connection au skymind if (!Utils.GCATPP.connectUser(cp)) { return(false); } } target = cp; kindOfTarget = 1; return(true); } else if (fromSkyCloud && (t.def.thingClass == typeof(Building_Turret) || t.def.thingClass.IsSubclassOf(typeof(Building_Turret)))) { Building build = (Building)t; CompRemotelyControlledTurret crt = t.TryGetComp <CompRemotelyControlledTurret>(); if (crt != null && crt.controller == null && !t.IsBrokenDown() && t.TryGetComp <CompPowerTrader>().PowerOn) { if (!Utils.GCATPP.isConnectedToSkyMind(t)) { //Tentative connection au skymind if (!Utils.GCATPP.connectUser(t)) { return(false); } } target = t; kindOfTarget = 2; return(true); } } return(false); }
public void applyFrameworkColor(Pawn pawn) { CompAndroidState cas = pawn.ATCompState; if (cas == null) { return; } //Renouvellement délais de rouille cas.clearRusted(); }
public static bool Listener(Pawn __instance, DamageInfo?dinfo, Hediff exactCulprit = null) { try { if (__instance.IsSurrogateAndroid()) { Utils.insideKillFuncSurrogate = true; //Si c'est un surrogate controllé temporaire alors on le restitue a sa faction CompSkyMind csm = __instance.TryGetComp <CompSkyMind>(); if (csm != null) { //Log.Message("Restitution surrogate a sa faction"); csm.tempHackingEnding(); } } //disconnect killed user Utils.GCATPP.disconnectUser(__instance); //Log.Message("YOU KILLED "+__instance.LabelCap); //Is surrogate android used ? if (__instance.IsSurrogateAndroid(true)) { //Obtention controlleur CompAndroidState cas = __instance.TryGetComp <CompAndroidState>(); if (cas == null) { return(true); } //Arret du mode de control chez le controller CompSurrogateOwner cso = cas.surrogateController.TryGetComp <CompSurrogateOwner>(); cso.stopControlledSurrogate(__instance, false, false, true); //On reset les données pour une potentiel futur resurection cas.resetInternalState(); } //Log.Message("YOU KILLED END"); Utils.insideKillFuncSurrogate = false; return(true); } catch (Exception e) { Log.Message("[ATPP] Pawn.Kill(Error) : " + e.Message + " - " + e.StackTrace); if (__instance.IsSurrogateAndroid()) { Utils.insideKillFuncSurrogate = false; } return(true); } }
public static void QEE_Building_GrowerBase_get_CraftingProgressPercentPostfix(Building __instance, ref float __result) { try { string BUID = __instance.GetUniqueLoadID(); //Si plus de refgerence au pawnBeingGrown (suite a un rechargement) on essait de reresoudre ce dernier if (Utils.GCATPP.VatGrowerLastPawnIsTX.ContainsKey(BUID) && Utils.GCATPP.VatGrowerLastPawnIsTX[BUID] && !Utils.GCATPP.VatGrowerLastPawnInProgress.ContainsKey(BUID)) { Utils.GCATPP.VatGrowerLastPawnInProgress[BUID] = (Pawn)Traverse.Create(__instance).Field("pawnBeingGrown").GetValue(); } //Si le GS chargé dans le VAT est un exosquelette d'androide TX alors pas de reduction if (Utils.GCATPP.VatGrowerLastPawnInProgress.ContainsKey(BUID) && Utils.GCATPP.VatGrowerLastPawnInProgress[BUID] != null) { CompAndroidState cas = Utils.GCATPP.VatGrowerLastPawnInProgress[BUID].TryGetComp <CompAndroidState>(); if (cas != null) { if (cas.forcedDamageLevel != 2 && __result <= 0.45f) { Traverse.Create(__instance).Field("renderTexture").SetValue(null); cas.isAndroidWithSkin = true; cas.forcedDamageLevel = 2; cas.checkTXWithSkinFacialTextureUpdate(); } else if (cas.forcedDamageLevel != 1 && (__result > 0.45f && __result <= 0.85f)) { Traverse.Create(__instance).Field("renderTexture").SetValue(null); cas.isAndroidWithSkin = true; cas.forcedDamageLevel = 1; cas.checkTXWithSkinFacialTextureUpdate(); } else if (cas.forcedDamageLevel != -2 && __result > 0.85f) { Traverse.Create(__instance).Field("renderTexture").SetValue(null); cas.isAndroidWithSkin = true; cas.forcedDamageLevel = -2; cas.checkTXWithSkinFacialTextureUpdate(); } } __result = 1.0f; } } catch (Exception e) { Log.Message("[ATPP] QEE_Building_GrowerBase_get_CraftingProgressPercentPostfix " + e.Message + " " + e.StackTrace); } }
public static void Listener(Hediff hediff, Pawn ___pawn) { //Si il sagit d'une VX0 if (hediff.def.defName == "ATPP_HediffVX0Chip") { CompAndroidState cas = ___pawn.TryGetComp <CompAndroidState>(); if (cas == null) { return; } //Mort de l'hote ___pawn.Kill(null, null); } }
private static void addInactiveSurrogates(ref List <Pawn> lst, Map map, bool M7) { foreach (var p in map.mapPawns.AllPawns) { if (p.Faction == Faction.OfPlayer) { CompAndroidState cas = p.TryGetComp <CompAndroidState>(); if (cas != null && cas.isSurrogate && cas.surrogateController == null && !cas.isOrganic && (!M7 || (p.def.defName == Utils.M7))) { lst.Add(p); } } } }
public override bool CanBeUsedBy(Pawn p, out string failReason) { if (!Utils.ExceptionAndroidList.Contains(p.def.defName)) { failReason = "ATPP_CanOnlyBeUsedByAndroid".Translate(); return(false); } CompAndroidState cas = p.TryGetComp <CompAndroidState>(); if (cas != null && cas.frameworkNaniteEffectGTEnd != -1) { failReason = ""; return(false); } return(base.CanBeUsedBy(p, out failReason)); }
public static void Listener(Pawn pawn, ref bool __result) { try { if (pawn.Faction == Faction.OfPlayer) { CompAndroidState cas = pawn.ATCompState; if (cas != null && pawn.health != null && pawn.health.summaryHealth.SummaryHealthPercent >= 0.80f && cas.isSurrogate && cas.surrogateController == null && pawn.ownership != null && pawn.ownership.OwnedBed != null) //&& ReachabilityUtility.CanReach(pawn, pawn.ownership.OwnedBed, PathEndMode.OnCell, Danger.Deadly)) { __result = false; } } } catch (Exception e) { Log.Message("[ATPP] HealthAIUtility.ShouldSeekMedicalRest " + e.Message + " " + e.StackTrace); } }
public static bool ListenerPrefix(Pawn pawn, Thing t, bool forced, ref bool __result, WorkGiver_FeedPatient __instance) { //On va en plus checker si le eater est pas un android chargé sur un wireless powergrid pas de feed patients co Pawn pawn2 = t as Pawn; if (pawn2 != null && pawn2.IsAndroidTier()) { CompAndroidState cas = pawn2.TryGetComp <CompAndroidState>(); if (cas != null) { if (cas.connectedLWPNActive && cas.connectedLWPN != null) { __result = false; return(false); } } } return(true); }
public override AcceptanceReport CanDesignateThing(Thing t) { base.CanDesignateThing(t); CompAndroidState cas = t.ATCompState; if (Prefs.DevMode == true) { Log.Message("Hacking pawn " + t + " with " + cas == null ? "null" : "not null"); } if (cas == null || !cas.isSurrogate || t.Faction == Faction.OfPlayer) { return(false); } target = (Pawn)t; return(true); }
public static void Listener(Pawn pawn, ref Job __result) { if (!pawn.IsAndroidTier()) { return; } if (Utils.ExceptionAndroidCanReloadWithPowerList.Contains(pawn.def.defName)) { CompAndroidState ca = pawn.GetComp <CompAndroidState>(); if (ca == null || !pawn.Spawned || !ca.UseBattery || pawn.Drafted) { return; } if (Utils.POWERPP_LOADED && ca.connectedLWPNActive && ca.connectedLWPN != null) { __result = null; return; } Building rsb = Utils.GCATPP.getFreeReloadStation(pawn.Map, pawn); if (rsb == null) { __result = null; return; } CompReloadStation rs = rsb.TryGetComp <CompReloadStation>(); if (rs == null) { __result = null; return; } __result = new Job( DefDatabase <JobDef> .GetNamed("ATPP_GoReloadBattery"), new LocalTargetInfo(rs.getFreeReloadPlacePos(pawn)), new LocalTargetInfo(rsb)); } }
public static void Listener(Pawn ___pawn, DamageInfo?dinfo, Hediff hediff) { try { // Deconnexion of Is surrogate android used et que appartenant au joueur ====>>>> POUR eviter les problemes de reminescence fantome de surrogates d'autres factions dans des Lord qui reste a cause du fait que le MakeDown les enleves de la liste mais le disconnect va essayer de relancer un CONNECT (dans le cadre des surrogates externes) if (___pawn.IsSurrogateAndroid(true) && ___pawn.Faction.IsPlayer) { //Obtention controlleur CompAndroidState cas = ___pawn.ATCompState; if (cas == null) { return; } //Arret du mode de control chez le controller CompSurrogateOwner cso = cas.surrogateController.ATCompSurrogateOwner; cso.stopControlledSurrogate(null); } } catch (Exception e) { Log.Message("[ATPP] Pawn_HealthTracker.MakeDowned : " + e.Message + " - " + e.StackTrace); } }
public static void Listener(MapPawns __instance, ref bool __result, List<Pawn> ___pawnsSpawned) { //Si retour pas true alors check s'il y a de la correction a faire if (!__result) { for (int i = 0; i < ___pawnsSpawned.Count; i++) { var pawnSpawned = ___pawnsSpawned[i]; if (pawnSpawned == null) continue; CompAndroidState cas = pawnSpawned.TryGetComp<CompAndroidState>(); //Si pawn non décédé mais est un surrogate inactif if (!pawnSpawned.Dead && pawnSpawned.Faction != null && pawnSpawned.Faction.IsPlayer && cas != null && cas.isSurrogate && cas.externalController == null) { __result = true; return; } } } }
public override AcceptanceReport CanDesignateThing(Thing t) { base.CanDesignateThing(t); if (!(t is Pawn)) { return(false); } Pawn cp = (Pawn)t; CompAndroidState cas = cp.TryGetComp <CompAndroidState>(); //Si pas clone ou clone deja utilisé on degage if (cas == null || !cas.isSurrogate || cp.Faction == Faction.OfPlayer) { return(false); } target = cp; return(true); }
public void Spawn() { try { Utils.forceGeneratedAndroidToBeDefaultPainted = true; PawnGenerationRequest request = new PawnGenerationRequest(Spawnprops.Pawnkind, Faction.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, true, 1f, false, true, false, false, false, false, false, false, 0f, null, 0f, null, null, null, null); Pawn blankAndroid = PawnGenerator.GeneratePawn(request); GenSpawn.Spawn(blankAndroid, this.parent.Position, this.parent.Map, WipeMode.Vanish); blankAndroid.health.AddHediff(Utils.hediffBlankAndroid); CompAndroidState cas = blankAndroid.TryGetComp <CompAndroidState>(); cas.isBlankAndroid = true; Utils.initBodyAsSurrogate(blankAndroid, false); string sn = ""; if (blankAndroid.def.defName == Utils.T3) { sn = "T3"; } else if (blankAndroid.def.defName == Utils.T4) { sn = "T4"; } blankAndroid.Name = new NameTriple("", sn, ""); Utils.forceGeneratedAndroidToBeDefaultPainted = false; //Utils.GCATPP.pushSurrogateAndroid(surrogate); } catch (Exception e) { Log.Message("Blank Android Spawn Error : " + e.Message + " " + e.StackTrace); } }
public static void Listener(Pawn butcher, float efficiency, Corpse __instance, ref IEnumerable <Thing> __result) { Utils.lastButcheredPawnIsAndroid = false; //Si Surrogate T4 butcherisé alors on supprime le IA-Core des produits if (__instance.InnerPawn != null && __instance.InnerPawn.def.defName == Utils.T4 && __instance.InnerPawn.ATCompState != null && __result != null) { CompAndroidState cas = __instance.InnerPawn.ATCompState; if (cas.isSurrogate) { List <Thing> res = new List <Thing>(); foreach (var r in __result.ToList()) { if (r.def != null && r.def.defName != "AIPersonaCore") { res.Add(r); } } __result = res; } } }
public static void Listener(Pawn victim, DamageInfo?dinfo) { try { if (victim.IsSurrogateAndroid()) { Utils.insideKillFuncSurrogate = true; } //Deconnecte le tué Utils.GCATPP.disconnectUser(victim); //Log.Message("YOU KILLED "+__instance.LabelCap); //Is surrogate android used ? if (victim.IsSurrogateAndroid(true)) { //Obtention controlleur CompAndroidState cas = victim.TryGetComp <CompAndroidState>(); if (cas == null) { return; } //Arret du mode de control chez le controller CompSurrogateOwner cso = cas.surrogateController.TryGetComp <CompSurrogateOwner>(); cso.stopControlledSurrogate(victim); } //Log.Message("YOU KILLED END"); Utils.insideKillFuncSurrogate = false; } catch (Exception e) { Log.Message("[ATPP] TaleUtility.Notify_PawnDied(Error) : " + e.Message + " - " + e.StackTrace); if (victim.IsSurrogateAndroid()) { Utils.insideKillFuncSurrogate = false; } } }
public static void QEE_BUildingPawnVatGrower_TryExtractProductPostfix(Building __instance, Pawn actor, bool __result) { string BUID = __instance.GetUniqueLoadID(); if (TargetGSequencer != null && __result) { Thing target = null; //Recherche et destruction du sequence de genome TX si succés TryExtractProduct for (int i = 0; i < __instance.Map.listerThings.AllThings.Count; i++) { Thing el = __instance.Map.listerThings.AllThings[i]; if (el != null && el.GetUniqueLoadID() == TargetGSequencer) { target = el; break; } } if (target != null) { //Si surrogate on va traficoter le pawnBeingGrown pour être un surrogate string source = (string)Traverse.Create(target).Field("sourceName").GetValue(); if (source.Contains("(surrogate)", StringComparison.CurrentCultureIgnoreCase)) { CompAndroidState cas = Utils.GCATPP.VatGrowerLastPawnInProgress[BUID].TryGetComp <CompAndroidState>(); if (cas != null) { Utils.initBodyAsSurrogate(Utils.GCATPP.VatGrowerLastPawnInProgress[BUID]); cas.initAsSurrogate(); Utils.setSurrogateName(Utils.GCATPP.VatGrowerLastPawnInProgress[BUID]); } } target.Destroy(); } } }
private FloatMenuOption GetFailureReason(Pawn myPawn) { if (!myPawn.CanReach(this, PathEndMode.InteractionCell, Danger.Some, false, TraverseMode.ByPawn)) { return(new FloatMenuOption("CannotUseNoPath".Translate(), null, MenuOptionPriority.Default, null, null, 0f, null, null)); } if (base.Spawned && base.Map.gameConditionManager.ConditionIsActive(GameConditionDefOf.SolarFlare)) { return(new FloatMenuOption("CannotUseSolarFlare".Translate(), null, MenuOptionPriority.Default, null, null, 0f, null, null)); } if (!this.TryGetComp <CompPowerTrader>().PowerOn) { return(new FloatMenuOption("CannotUseNoPower".Translate(), null, MenuOptionPriority.Default, null, null, 0f, null, null)); } if (!Utils.ExceptionAndroidList.Contains(myPawn.def.defName)) { return(new FloatMenuOption("ATPP_CanOnlyBeUsedByAndroid".Translate(), null, MenuOptionPriority.Default, null, null, 0f, null, null)); } CompAndroidState ca = myPawn.ATCompState; if (ca == null || !ca.UseBattery) { return(new FloatMenuOption("ATPP_CannotUseBecauseNotInBatteryMode".Translate(), null, MenuOptionPriority.Default, null, null, 0f, null, null)); } CompReloadStation rs = this.TryGetComp <CompReloadStation>(); int nb = rs.getNbAndroidReloading(true); if (nb >= 8) { return(new FloatMenuOption("ATPP_CannotUseEveryPlaceUsed".Translate(), null, MenuOptionPriority.Default, null, null, 0f, null, null)); } return(null); }