예제 #1
0
        // Token: 0x06000028 RID: 40 RVA: 0x00002CB8 File Offset: 0x00000EB8
        public void DoJumpJet(Pawn Pilot, IntVec3 targCell)
        {
            JPRotatePilot(Pilot, targCell, out var angle);
            if (JPSkyFallType == null)
            {
                JPSkyFallType = "SFJetPack";
            }

            var JPSF = DefDatabase <ThingDef> .GetNamed(JPSkyFallType, false);

            if (JPSF == null)
            {
                JPSF = DefDatabase <ThingDef> .GetNamed("SFJetPack");

                JPSkyFallType = "SFJetPack";
            }

            var SFspeed = JPSF.skyfaller.speed;

            if (SFspeed <= 0f)
            {
                SFspeed = 1f;
            }

            var distance   = Pilot.Position.DistanceTo(targCell);
            var timeToLand = (int)(distance / SFspeed);

            angle += 270f;
            if (angle >= 360f)
            {
                angle -= 360f;
            }

            int fuelUsed;

            if (Settings.UseCarry)
            {
                fuelUsed = (int)Math.Floor(distance * JPFuelRate /
                                           JPWeightUtility.JPCarryFactor(Pilot, def, JPFuelItem));
            }
            else
            {
                fuelUsed = (int)Math.Floor(distance * JPFuelRate);
            }

            JPFuelAmount -= fuelUsed;
            var skyfaller = SkyfallerMaker.SpawnSkyfaller(JPSF, targCell, Pilot.Map);

            skyfaller.ticksToImpact = timeToLand;
            skyfaller.angle         = angle;
            JPPilotIsDrafted        = Pilot.Drafted;
            Pilot.DeSpawn();
            skyfaller.innerContainer.TryAdd(Pilot, false);
        }
예제 #2
0
        // Token: 0x0600002A RID: 42 RVA: 0x00002E28 File Offset: 0x00001028
        internal bool FlightCellCheck(Pawn pilot, IntVec3 tCell, int fuel, float fRate, float minJump, float maxJump,
                                      out string cantReason)
        {
            cantReason = "";
            if (!tCell.InBounds(pilot.Map))
            {
                cantReason = "JetPack.JumpReasonInvalid".Translate();
                return(false);
            }

            if (JPOnCooldown)
            {
                cantReason = "JetPack.JumpReasonOnCooldown".Translate();
                return(false);
            }

            if (!pilot.CanReserve(tCell))
            {
                cantReason = "JetPack.JumpReasonReserved".Translate();
                return(false);
            }

            if (tCell.Roofed(pilot.Map))
            {
                if (!Settings.RoofPunch)
                {
                    cantReason = "JetPack.JumpReasonRoofed".Translate();
                    return(false);
                }

                var chkSKF = DefDatabase <ThingDef> .GetNamed(JPSkyFallType, false);

                if (chkSKF == null || !chkSKF.skyfaller.hitRoof)
                {
                    cantReason =
                        "JetPack.JumpReasonSFNotRPunch".Translate(
                            chkSKF?.label.CapitalizeFirst());
                    return(false);
                }
            }

            if (!tCell.Walkable(pilot.Map))
            {
                cantReason = "JetPack.JumpReasonNotWalk".Translate();
                return(false);
            }

            if (tCell.GetDangerFor(pilot, pilot.Map) == Danger.Deadly)
            {
                cantReason = "JetPack.JumpReasonDeadly".Translate();
                return(false);
            }

            var distance = pilot.Position.DistanceTo(tCell);

            if (distance < minJump)
            {
                cantReason = "JetPack.JumpReasonMinRange".Translate(((int)minJump).ToString());
                return(false);
            }

            if (distance > maxJump)
            {
                cantReason = "JetPack.JumpReasonMaxRange".Translate(((int)maxJump).ToString());
                return(false);
            }

            if (fRate <= 0f)
            {
                cantReason = "JetPack.JumpFuelRateInvalid".Translate(fRate.ToString());
                return(false);
            }

            float distCanJump;

            if (Settings.UseCarry)
            {
                distCanJump = fuel / fRate * JPWeightUtility.JPCarryFactor(pilot, def, JPFuelItem);
            }
            else
            {
                distCanJump = fuel / fRate;
            }

            if (distCanJump > maxJump)
            {
                distCanJump = maxJump;
            }

            if (!(distCanJump < distance))
            {
                return(true);
            }

            cantReason = "JetPack.JumpNotEnoughfuel".Translate();
            return(false);
        }
예제 #3
0
        // Token: 0x0600002A RID: 42 RVA: 0x00002E28 File Offset: 0x00001028
        internal bool FlightCellCheck(Pawn pilot, IntVec3 tCell, int fuel, float fRate, float minJump, float maxJump, out string cantReason)
        {
            cantReason = "";
            if (!GenGrid.InBounds(tCell, pilot.Map))
            {
                cantReason = Translator.Translate("JetPack.JumpReasonInvalid");
                return(false);
            }
            if (this.JPOnCooldown)
            {
                cantReason = Translator.Translate("JetPack.JumpReasonOnCooldown");
                return(false);
            }
            if (!ReservationUtility.CanReserve(pilot, tCell, 1, -1, null, false))
            {
                cantReason = Translator.Translate("JetPack.JumpReasonReserved");
                return(false);
            }
            if (GridsUtility.Roofed(tCell, pilot.Map))
            {
                if (!Settings.RoofPunch)
                {
                    cantReason = Translator.Translate("JetPack.JumpReasonRoofed");
                    return(false);
                }
                ThingDef chkSKF = DefDatabase <ThingDef> .GetNamed(this.JPSkyFallType, false);

                if (chkSKF == null || !chkSKF.skyfaller.hitRoof)
                {
                    cantReason = TranslatorFormattedStringExtensions.Translate("JetPack.JumpReasonSFNotRPunch", (chkSKF != null) ? GenText.CapitalizeFirst(chkSKF.label) : null);
                    return(false);
                }
            }
            if (!GenGrid.Walkable(tCell, pilot.Map))
            {
                cantReason = Translator.Translate("JetPack.JumpReasonNotWalk");
                return(false);
            }
            if (DangerUtility.GetDangerFor(tCell, pilot, pilot.Map) == Danger.Deadly)
            {
                cantReason = Translator.Translate("JetPack.JumpReasonDeadly");
                return(false);
            }
            float distance = IntVec3Utility.DistanceTo(pilot.Position, tCell);

            if (distance < minJump)
            {
                cantReason = TranslatorFormattedStringExtensions.Translate("JetPack.JumpReasonMinRange", ((int)minJump).ToString());
                return(false);
            }
            if (distance > maxJump)
            {
                cantReason = TranslatorFormattedStringExtensions.Translate("JetPack.JumpReasonMaxRange", ((int)maxJump).ToString());
                return(false);
            }
            if (fRate <= 0f)
            {
                cantReason = TranslatorFormattedStringExtensions.Translate("JetPack.JumpFuelRateInvalid", fRate.ToString());
                return(false);
            }
            float distCanJump;

            if (Settings.UseCarry)
            {
                distCanJump = (float)fuel / fRate * JPWeightUtility.JPCarryFactor(pilot, this.def, this.JPFuelItem);
            }
            else
            {
                distCanJump = (float)fuel / fRate;
            }
            if (distCanJump > maxJump)
            {
                distCanJump = maxJump;
            }
            if (distCanJump < distance)
            {
                cantReason = Translator.Translate("JetPack.JumpNotEnoughfuel");
                return(false);
            }
            return(true);
        }