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 } } }
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; } } }
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); }
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); }
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); } }