コード例 #1
0
        public static void DeconstructDropStuff(Thing oldThing)
        {
            if (Current.ProgramState != ProgramState.Playing)
            {
                return;
            }

            ThingDef oldDef   = oldThing.def;
            ThingDef stuffDef = oldThing.Stuff;

            //preferably GenLeaving.DoLeavingsFor here, but don't want to drop non-stuff things.
            if (GenLeaving.CanBuildingLeaveResources(oldThing, DestroyMode.Deconstruct))
            {
                int count      = TotalStuffNeeded(oldDef, stuffDef);
                int leaveCount = GetBuildingResourcesLeaveCalculator(oldThing, DestroyMode.Deconstruct)(count);
                if (leaveCount > 0)
                {
                    Thing leftThing = ThingMaker.MakeThing(stuffDef);
                    leftThing.stackCount = leaveCount;
#pragma warning disable CS0618 // Type or member is obsolete
                    GenDrop.TryDropSpawn(leftThing, oldThing.Position, oldThing.Map, ThingPlaceMode.Near, out Thing dummyThing);
#pragma warning restore CS0618 // Type or member is obsolete
                }
            }
        }
コード例 #2
0
        public static void DoLeavingsFor(Thing diedThing, Map map, DestroyMode mode, CellRect leavingsRect, Predicate <IntVec3> nearPlaceValidator = null, List <Thing> listOfLeavingsOut = null)
        {
            if (Current.ProgramState != ProgramState.Playing && mode != DestroyMode.Refund)
            {
                return;
            }
            switch (mode)
            {
            case DestroyMode.Vanish:
            case DestroyMode.QuestLogic:
                return;

            case DestroyMode.KillFinalize:
            {
                if (diedThing.def.filthLeaving == null)
                {
                    break;
                }
                for (int i = leavingsRect.minZ; i <= leavingsRect.maxZ; i++)
                {
                    for (int j = leavingsRect.minX; j <= leavingsRect.maxX; j++)
                    {
                        FilthMaker.TryMakeFilth(new IntVec3(j, 0, i), map, diedThing.def.filthLeaving, Rand.RangeInclusive(1, 3));
                    }
                }
                break;
            }
            }
            ThingOwner <Thing> thingOwner = new ThingOwner <Thing>();

            if (mode == DestroyMode.KillFinalize && diedThing.def.killedLeavings != null)
            {
                for (int k = 0; k < diedThing.def.killedLeavings.Count; k++)
                {
                    Thing thing = ThingMaker.MakeThing(diedThing.def.killedLeavings[k].thingDef);
                    thing.stackCount = diedThing.def.killedLeavings[k].count;
                    thingOwner.TryAdd(thing);
                }
            }
            if (CanBuildingLeaveResources(diedThing, mode))
            {
                Frame frame = diedThing as Frame;
                if (frame != null)
                {
                    for (int num = frame.resourceContainer.Count - 1; num >= 0; num--)
                    {
                        int num2 = GetBuildingResourcesLeaveCalculator(diedThing, mode)(frame.resourceContainer[num].stackCount);
                        if (num2 > 0)
                        {
                            frame.resourceContainer.TryTransferToContainer(frame.resourceContainer[num], thingOwner, num2);
                        }
                    }
                    frame.resourceContainer.ClearAndDestroyContents();
                }
                else
                {
                    List <ThingDefCountClass> list = diedThing.CostListAdjusted();
                    for (int l = 0; l < list.Count; l++)
                    {
                        ThingDefCountClass thingDefCountClass = list[l];
                        int num3 = GetBuildingResourcesLeaveCalculator(diedThing, mode)(thingDefCountClass.count);
                        if (num3 > 0 && mode == DestroyMode.KillFinalize && thingDefCountClass.thingDef.slagDef != null)
                        {
                            int count = thingDefCountClass.thingDef.slagDef.smeltProducts.First((ThingDefCountClass pro) => pro.thingDef == ThingDefOf.Steel).count;
                            int a     = num3 / count;
                            a = Mathf.Min(a, diedThing.def.Size.Area / 2);
                            for (int m = 0; m < a; m++)
                            {
                                thingOwner.TryAdd(ThingMaker.MakeThing(thingDefCountClass.thingDef.slagDef));
                            }
                            num3 -= a * count;
                        }
                        if (num3 > 0)
                        {
                            Thing thing2 = ThingMaker.MakeThing(thingDefCountClass.thingDef);
                            thing2.stackCount = num3;
                            thingOwner.TryAdd(thing2);
                        }
                    }
                }
            }
            List <IntVec3> list2 = leavingsRect.Cells.InRandomOrder().ToList();
            int            num4  = 0;

            while (thingOwner.Count > 0)
            {
                if (mode == DestroyMode.KillFinalize && !map.areaManager.Home[list2[num4]])
                {
                    thingOwner[0].SetForbidden(value: true, warnOnFail: false);
                }
                if (!thingOwner.TryDrop(thingOwner[0], list2[num4], map, ThingPlaceMode.Near, out var lastResultingThing, null, nearPlaceValidator))
                {
                    Log.Warning(string.Concat("Failed to place all leavings for destroyed thing ", diedThing, " at ", leavingsRect.CenterCell));
                    break;
                }
                listOfLeavingsOut?.Add(lastResultingThing);
                num4++;
                if (num4 >= list2.Count)
                {
                    num4 = 0;
                }
            }
        }
コード例 #3
0
        public static bool Prefix(Thing diedThing, Map map, DestroyMode mode, CellRect leavingsRect,
                                  Predicate <IntVec3> nearPlaceValidator = null, List <Thing> listOfLeavingsOut = null)
        {
            switch (diedThing.def.defName)
            {
            case "RFFConcreteDoor":
            case "RFFConcreteAutodoor":
            case "RFFPlasticreteDoor":
            case "RFFPlasticreteAutodoor":
            case "RFFConcreteWall":
            case "RFFReinforcedConcreteWall":
            case "RFFPlasticreteWall":
            case "RFFConcreteEmbrasure":
            case "RFFPlasticreteEmbrasure":
            case "RBB_DeepBridge":
            case "RBB_DeepBridge_Stone":
            {
                var list    = leavingsRect.Cells.InRandomOrder().ToList();
                var leaving = ThingMaker.MakeThing(ThingDef.Named("CrushedRocks"));
                GenPlace.TryPlaceThing(leaving, list[0], map, ThingPlaceMode.Near);
                if (diedThing.def.defName == "RFFConcreteDoor")
                {
                    var leaving2 = ThingMaker.MakeThing(ThingDefOf.Steel);
                    leaving2.stackCount = Rand.RangeInclusive(2, 4);
                    GenPlace.TryPlaceThing(leaving2, list[0], map, ThingPlaceMode.Near);
                }

                if (diedThing.def.defName == "RFFConcreteAutodoor")
                {
                    var leaving2 = ThingMaker.MakeThing(ThingDefOf.Steel);
                    leaving2.stackCount = Rand.RangeInclusive(2, 4);
                    GenPlace.TryPlaceThing(leaving2, list[0], map, ThingPlaceMode.Near);
                    var leaving3 = ThingMaker.MakeThing(ThingDefOf.ChunkSlagSteel);
                    leaving3.stackCount = Rand.RangeInclusive(2, 3);
                    GenPlace.TryPlaceThing(leaving3, list[0], map, ThingPlaceMode.Near);
                    var leaving4 = ThingMaker.MakeThing(ThingDefOf.ComponentIndustrial);
                    if (Rand.Value < 0.75f)
                    {
                        GenPlace.TryPlaceThing(leaving4, list[0], map, ThingPlaceMode.Near);
                    }
                }

                if (diedThing.def.defName == "RFFPlasticreteDoor")
                {
                    var leaving2 = ThingMaker.MakeThing(ThingDefOf.Steel);
                    leaving2.stackCount = Rand.RangeInclusive(3, 5);
                    GenPlace.TryPlaceThing(leaving2, list[0], map, ThingPlaceMode.Near);
                    var leaving3 = ThingMaker.MakeThing(ThingDefOf.Plasteel);
                    leaving3.stackCount = Rand.RangeInclusive(2, 4);
                    GenPlace.TryPlaceThing(leaving3, list[0], map, ThingPlaceMode.Near);
                }

                if (diedThing.def.defName == "RFFPlasticreteAutodoor")
                {
                    var leaving2 = ThingMaker.MakeThing(ThingDefOf.Steel);
                    leaving2.stackCount = Rand.RangeInclusive(2, 4);
                    GenPlace.TryPlaceThing(leaving2, list[0], map, ThingPlaceMode.Near);
                    var leaving3 = ThingMaker.MakeThing(ThingDefOf.ChunkSlagSteel);
                    leaving3.stackCount = Rand.RangeInclusive(2, 3);
                    GenPlace.TryPlaceThing(leaving3, list[0], map, ThingPlaceMode.Near);
                    var leaving4 = ThingMaker.MakeThing(ThingDefOf.Plasteel);
                    leaving4.stackCount = Rand.RangeInclusive(2, 4);
                    GenPlace.TryPlaceThing(leaving4, list[0], map, ThingPlaceMode.Near);
                    var leaving5 = ThingMaker.MakeThing(ThingDefOf.ComponentIndustrial);
                    if (Rand.Value < 0.75f)
                    {
                        GenPlace.TryPlaceThing(leaving5, list[0], map, ThingPlaceMode.Near);
                    }
                }

                if (diedThing.def.defName == "RFFReinforcedConcreteWall" ||
                    diedThing.def.defName == "RFFConcreteEmbrasure")
                {
                    var leaving2 = ThingMaker.MakeThing(ThingDefOf.Steel);
                    if (Rand.Value < 0.75f)
                    {
                        GenPlace.TryPlaceThing(leaving2, list[0], map, ThingPlaceMode.Near);
                    }
                }

                if (diedThing.def.defName == "RFFPlasticreteWall" ||
                    diedThing.def.defName == "RFFPlasticreteEmbrasure")
                {
                    var leaving2 = ThingMaker.MakeThing(ThingDefOf.Steel);
                    leaving2.stackCount = Rand.RangeInclusive(1, 3);
                    GenPlace.TryPlaceThing(leaving2, list[0], map, ThingPlaceMode.Near);
                    var leaving3 = ThingMaker.MakeThing(ThingDefOf.Plasteel);
                    leaving3.stackCount = Rand.RangeInclusive(1, 3);
                    GenPlace.TryPlaceThing(leaving3, list[0], map, ThingPlaceMode.Near);
                }

                if (!diedThing.def.defName.Contains("DeepBridge"))
                {
                    return(false);
                }

                var thingCountClasses = diedThing.CostListAdjusted();
                foreach (var thingCountClass in thingCountClasses)
                {
                    if (thingCountClass.thingDef.defName == "RFFConcrete")
                    {
                        continue;
                    }

                    var buildingResourcesLeaveCalculator =
                        GetBuildingResourcesLeaveCalculator(diedThing, mode)(thingCountClass.count);
                    if (buildingResourcesLeaveCalculator <= 0)
                    {
                        continue;
                    }

                    var thing1 = ThingMaker.MakeThing(thingCountClass.thingDef);
                    thing1.stackCount = buildingResourcesLeaveCalculator;
                    GenPlace.TryPlaceThing(thing1, list[0], map, ThingPlaceMode.Near);
                }

                return(false);
            }
            }

            return(true);
        }
コード例 #4
0
 public static bool Prefix(Thing diedThing, Map map, DestroyMode mode, CellRect leavingsRect, Predicate <IntVec3> nearPlaceValidator = null)
 {
     if ((diedThing.def.defName == "RFFConcreteDoor") ||
         (diedThing.def.defName == "RFFConcreteAutodoor") ||
         (diedThing.def.defName == "RFFPlasticreteDoor") ||
         (diedThing.def.defName == "RFFPlasticreteAutodoor") ||
         (diedThing.def.defName == "RFFConcreteWall") ||
         (diedThing.def.defName == "RFFReinforcedConcreteWall") ||
         (diedThing.def.defName == "RFFPlasticreteWall") ||
         (diedThing.def.defName == "RFFConcreteEmbrasure") ||
         (diedThing.def.defName == "RFFPlasticreteEmbrasure") ||
         (diedThing.def.defName == "RBB_DeepBridge") ||
         (diedThing.def.defName == "RBB_DeepBridge_Stone"))
     {
         List <IntVec3> list    = leavingsRect.Cells.InRandomOrder <IntVec3>(null).ToList <IntVec3>();
         Thing          leaving = ThingMaker.MakeThing(ThingDef.Named("CrushedRocks"), null);
         GenPlace.TryPlaceThing(leaving, list[0], map, ThingPlaceMode.Near, null);
         if (diedThing.def.defName == "RFFConcreteDoor")
         {
             Thing leaving2 = ThingMaker.MakeThing(ThingDefOf.Steel, null);
             leaving2.stackCount = Rand.RangeInclusive(2, 4);
             GenPlace.TryPlaceThing(leaving2, list[0], map, ThingPlaceMode.Near, null);
         }
         if (diedThing.def.defName == "RFFConcreteAutodoor")
         {
             Thing leaving2 = ThingMaker.MakeThing(ThingDefOf.Steel, null);
             leaving2.stackCount = Rand.RangeInclusive(2, 4);
             GenPlace.TryPlaceThing(leaving2, list[0], map, ThingPlaceMode.Near, null);
             Thing leaving3 = ThingMaker.MakeThing(ThingDefOf.ChunkSlagSteel, null);
             leaving3.stackCount = Rand.RangeInclusive(2, 3);
             GenPlace.TryPlaceThing(leaving3, list[0], map, ThingPlaceMode.Near, null);
             Thing leaving4 = ThingMaker.MakeThing(ThingDefOf.ComponentIndustrial, null);
             if (Rand.Value < 0.75f)
             {
                 GenPlace.TryPlaceThing(leaving4, list[0], map, ThingPlaceMode.Near, null);
             }
         }
         if (diedThing.def.defName == "RFFPlasticreteDoor")
         {
             Thing leaving2 = ThingMaker.MakeThing(ThingDefOf.Steel, null);
             leaving2.stackCount = Rand.RangeInclusive(3, 5);
             GenPlace.TryPlaceThing(leaving2, list[0], map, ThingPlaceMode.Near, null);
             Thing leaving3 = ThingMaker.MakeThing(ThingDefOf.Plasteel, null);
             leaving3.stackCount = Rand.RangeInclusive(2, 4);
             GenPlace.TryPlaceThing(leaving3, list[0], map, ThingPlaceMode.Near, null);
         }
         if (diedThing.def.defName == "RFFPlasticreteAutodoor")
         {
             Thing leaving2 = ThingMaker.MakeThing(ThingDefOf.Steel, null);
             leaving2.stackCount = Rand.RangeInclusive(2, 4);
             GenPlace.TryPlaceThing(leaving2, list[0], map, ThingPlaceMode.Near, null);
             Thing leaving3 = ThingMaker.MakeThing(ThingDefOf.ChunkSlagSteel, null);
             leaving3.stackCount = Rand.RangeInclusive(2, 3);
             GenPlace.TryPlaceThing(leaving3, list[0], map, ThingPlaceMode.Near, null);
             Thing leaving4 = ThingMaker.MakeThing(ThingDefOf.Plasteel, null);
             leaving4.stackCount = Rand.RangeInclusive(2, 4);
             GenPlace.TryPlaceThing(leaving4, list[0], map, ThingPlaceMode.Near, null);
             Thing leaving5 = ThingMaker.MakeThing(ThingDefOf.ComponentIndustrial, null);
             if (Rand.Value < 0.75f)
             {
                 GenPlace.TryPlaceThing(leaving5, list[0], map, ThingPlaceMode.Near, null);
             }
         }
         if (diedThing.def.defName == "RFFReinforcedConcreteWall" || diedThing.def.defName == "RFFConcreteEmbrasure")
         {
             Thing leaving2 = ThingMaker.MakeThing(ThingDefOf.Steel, null);
             if (Rand.Value < 0.75f)
             {
                 GenPlace.TryPlaceThing(leaving2, list[0], map, ThingPlaceMode.Near, null);
             }
         }
         if (diedThing.def.defName == "RFFPlasticreteWall" || diedThing.def.defName == "RFFPlasticreteEmbrasure")
         {
             Thing leaving2 = ThingMaker.MakeThing(ThingDefOf.Steel, null);
             leaving2.stackCount = Rand.RangeInclusive(1, 3);
             GenPlace.TryPlaceThing(leaving2, list[0], map, ThingPlaceMode.Near, null);
             Thing leaving3 = ThingMaker.MakeThing(ThingDefOf.Plasteel, null);
             leaving3.stackCount = Rand.RangeInclusive(1, 3);
             GenPlace.TryPlaceThing(leaving3, list[0], map, ThingPlaceMode.Near, null);
         }
         if (diedThing.def.defName.Contains("DeepBridge"))
         {
             List <ThingDefCountClass> thingCountClasses = diedThing.CostListAdjusted();
             for (int l = 0; l < thingCountClasses.Count; l++)
             {
                 ThingDefCountClass thingCountClass = thingCountClasses[l];
                 if (thingCountClass.thingDef.defName != "RFFConcrete")
                 {
                     int buildingResourcesLeaveCalculator = GetBuildingResourcesLeaveCalculator(diedThing, mode)(thingCountClass.count);
                     if (buildingResourcesLeaveCalculator > 0)
                     {
                         Thing thing1 = ThingMaker.MakeThing(thingCountClass.thingDef, null);
                         thing1.stackCount = buildingResourcesLeaveCalculator;
                         GenPlace.TryPlaceThing(thing1, list[0], map, ThingPlaceMode.Near, null);
                     }
                 }
             }
         }
         return(false);
     }
     return(true);
 }
コード例 #5
0
        public static void DoLeavingsFor(Thing diedThing, Map map, DestroyMode mode, CellRect leavingsRect, Predicate <IntVec3> nearPlaceValidator = null)
        {
            if (Current.ProgramState == ProgramState.Playing || mode == DestroyMode.Refund)
            {
                switch (mode)
                {
                case DestroyMode.Vanish:
                    return;

                case DestroyMode.KillFinalize:
                    if (diedThing.def.filthLeaving != null)
                    {
                        for (int i = leavingsRect.minZ; i <= leavingsRect.maxZ; i++)
                        {
                            for (int j = leavingsRect.minX; j <= leavingsRect.maxX; j++)
                            {
                                IntVec3 c = new IntVec3(j, 0, i);
                                FilthMaker.MakeFilth(c, map, diedThing.def.filthLeaving, Rand.RangeInclusive(1, 3));
                            }
                        }
                    }
                    break;
                }
                ThingOwner <Thing> thingOwner = new ThingOwner <Thing>();
                if (mode == DestroyMode.KillFinalize && diedThing.def.killedLeavings != null)
                {
                    for (int k = 0; k < diedThing.def.killedLeavings.Count; k++)
                    {
                        Thing thing = ThingMaker.MakeThing(diedThing.def.killedLeavings[k].thingDef);
                        thing.stackCount = diedThing.def.killedLeavings[k].count;
                        thingOwner.TryAdd(thing);
                    }
                }
                if (CanBuildingLeaveResources(diedThing, mode))
                {
                    Frame frame = diedThing as Frame;
                    if (frame != null)
                    {
                        for (int num = frame.resourceContainer.Count - 1; num >= 0; num--)
                        {
                            int num2 = GetBuildingResourcesLeaveCalculator(diedThing, mode)(frame.resourceContainer[num].stackCount);
                            if (num2 > 0)
                            {
                                frame.resourceContainer.TryTransferToContainer(frame.resourceContainer[num], thingOwner, num2);
                            }
                        }
                        frame.resourceContainer.ClearAndDestroyContents();
                    }
                    else
                    {
                        List <ThingDefCountClass> list = diedThing.CostListAdjusted();
                        for (int l = 0; l < list.Count; l++)
                        {
                            ThingDefCountClass thingDefCountClass = list[l];
                            int num3 = GetBuildingResourcesLeaveCalculator(diedThing, mode)(thingDefCountClass.count);
                            if (num3 > 0 && mode == DestroyMode.KillFinalize && thingDefCountClass.thingDef.slagDef != null)
                            {
                                int count = thingDefCountClass.thingDef.slagDef.smeltProducts.First((ThingDefCountClass pro) => pro.thingDef == ThingDefOf.Steel).count;
                                int num4  = num3 / 2 / 8;
                                for (int m = 0; m < num4; m++)
                                {
                                    thingOwner.TryAdd(ThingMaker.MakeThing(thingDefCountClass.thingDef.slagDef));
                                }
                                num3 -= num4 * count;
                            }
                            if (num3 > 0)
                            {
                                Thing thing2 = ThingMaker.MakeThing(thingDefCountClass.thingDef);
                                thing2.stackCount = num3;
                                thingOwner.TryAdd(thing2);
                            }
                        }
                    }
                }
                List <IntVec3> list2 = leavingsRect.Cells.InRandomOrder().ToList();
                int            num5  = 0;
                while (true)
                {
                    if (thingOwner.Count <= 0)
                    {
                        return;
                    }
                    if (mode == DestroyMode.KillFinalize && !map.areaManager.Home[list2[num5]])
                    {
                        thingOwner[0].SetForbidden(value: true, warnOnFail: false);
                    }
                    ThingOwner <Thing> thingOwner2    = thingOwner;
                    Thing          thing3             = thingOwner[0];
                    IntVec3        dropLoc            = list2[num5];
                    ThingPlaceMode mode2              = ThingPlaceMode.Near;
                    Thing          lastResultingThing = default(Thing);
                    if (!thingOwner2.TryDrop(thing3, dropLoc, map, mode2, out lastResultingThing, null, nearPlaceValidator))
                    {
                        break;
                    }
                    num5++;
                    if (num5 >= list2.Count)
                    {
                        num5 = 0;
                    }
                }
                Log.Warning("Failed to place all leavings for destroyed thing " + diedThing + " at " + leavingsRect.CenterCell);
            }
        }