コード例 #1
0
            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);
                    }
                }
            }
コード例 #2
0
            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;
                                }
                            }
                        }
                    }
                }
            }
コード例 #3
0
        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);
        }
コード例 #4
0
        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");
        }
コード例 #5
0
            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);
            }
コード例 #6
0
            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);
        }
コード例 #8
0
        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))));
        }
コード例 #9
0
        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);
            }
        }
コード例 #10
0
        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);
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        public void applyFrameworkColor(Pawn pawn)
        {
            CompAndroidState cas = pawn.ATCompState;

            if (cas == null)
            {
                return;
            }

            //Renouvellement délais de rouille
            cas.clearRusted();
        }
コード例 #14
0
            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);
                }
            }
コード例 #15
0
        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);
            }
        }
コード例 #16
0
            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);
                }
            }
コード例 #17
0
            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);
                        }
                    }
                }
            }
コード例 #18
0
        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));
        }
コード例 #19
0
 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);
     }
 }
コード例 #20
0
            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);
            }
コード例 #21
0
        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);
        }
コード例 #22
0
        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));
            }
        }
コード例 #23
0
            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);
                }
            }
コード例 #24
0
            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;
                        }
                    }
                }
            }
コード例 #25
0
        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);
        }
コード例 #26
0
        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);
            }
        }
コード例 #27
0
            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;
                    }
                }
            }
コード例 #28
0
            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;
                    }
                }
            }
コード例 #29
0
        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();
                }
            }
        }
コード例 #30
0
        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);
        }