public static void Postfix(Caravan __instance, ref IEnumerable <Gizmo> __result) { float masss = 0.0f; foreach (Pawn pawn in __instance.pawns.InnerListForReading) { for (int index = 0; index < pawn.inventory.innerContainer.Count; ++index) { if (pawn.inventory.innerContainer[index].def.defName != "Building_Helicopter") { masss += pawn.inventory.innerContainer[index].def.BaseMass * (float)pawn.inventory.innerContainer[index].stackCount; } } } foreach (Pawn pawn in __instance.pawns.InnerListForReading) { Pawn_InventoryTracker pinv = pawn.inventory; for (int i = 0; i < pinv.innerContainer.Count; i++) { if (pinv.innerContainer[i].def.defName == "Building_Helicopter") { Command_Action commandAction1 = new Command_Action(); commandAction1.defaultLabel = "CommandLaunchGroup".Translate(); commandAction1.defaultDesc = "CommandLaunchGroupDesc".Translate(); commandAction1.icon = ContentFinder <Texture2D> .Get("UI/Commands/LaunchShip", true); commandAction1.alsoClickIfOtherInGroupClicked = false; commandAction1.action = (Action)(() => { float massCapacity = pinv.innerContainer[i].TryGetComp <CompTransporter>().Props.massCapacity; if ((double)masss <= (double)massCapacity) { pinv.innerContainer[i].TryGetComp <CompLaunchableHelicopter>().WorldStartChoosingDestination(__instance); } else { Messages.Message("TooBigTransportersMassUsage".Translate() + "(" + (object)(float)((double)massCapacity - (double)masss) + "KG)", MessageTypeDefOf.RejectInput, false); } }); List <Gizmo> list = __result.ToList <Gizmo>(); list.Add((Gizmo)commandAction1); Command_Action commandAction2 = new Command_Action(); commandAction2.defaultLabel = "CommandAddFuel".Translate(); commandAction2.defaultDesc = "CommandAddFuelDesc".Translate(); commandAction2.icon = ContentFinder <Texture2D> .Get("Things/Item/Resource/Chemfuel", true); commandAction2.alsoClickIfOtherInGroupClicked = false; commandAction2.action = (Action)(() => { bool flag = false; int count = 0; CompRefuelable comp = pinv.innerContainer[i].TryGetComp <CompRefuelable>(); List <Thing> thingList = CaravanInventoryUtility.AllInventoryItems(__instance); for (int index = 0; index < thingList.Count; ++index) { if (thingList[index].def == ThingDefOf.Chemfuel) { count = thingList[index].stackCount; Pawn ownerOf = CaravanInventoryUtility.GetOwnerOf(__instance, thingList[index]); float num = comp.Props.fuelCapacity - comp.Fuel; if ((double)num < 1.0 && (double)num > 0.0) { count = 1; } if ((double)count * 1.0 >= (double)num) { count = (int)num; } if ((double)thingList[index].stackCount * 1.0 <= (double)count) { thingList[index].stackCount -= count; Thing thing = thingList[index]; ownerOf.inventory.innerContainer.Remove(thing); thing.Destroy(DestroyMode.Vanish); } else if ((uint)count > 0U) { thingList[index].SplitOff(count).Destroy(DestroyMode.Vanish); } comp.GetType().GetField("fuel", BindingFlags.Instance | BindingFlags.NonPublic).SetValue((object)comp, (object)(float)((double)comp.Fuel + (double)count)); flag = true; break; } } if (flag) { Messages.Message("AddFuelDoneMsg".Translate((object)count, (object)comp.Fuel), MessageTypeDefOf.PositiveEvent, false); } else { Messages.Message("NonOilMsg".Translate(), MessageTypeDefOf.RejectInput, false); } }); list.Add((Gizmo)commandAction2); Gizmo_MapRefuelableFuelStatus refuelableFuelStatus = new Gizmo_MapRefuelableFuelStatus() { nowFuel = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Fuel, maxFuel = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Props.fuelCapacity, compLabel = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Props.FuelGizmoLabel }; list.Add((Gizmo)refuelableFuelStatus); __result = (IEnumerable <Gizmo>)list; return; } } } }
public static void Postfix(Caravan __instance, ref IEnumerable <Gizmo> __result) { float masss = 0; foreach (Pawn pawn in __instance.pawns.InnerListForReading) { for (int j = 0; j < pawn.inventory.innerContainer.Count; j++) { if (pawn.inventory.innerContainer[j].def.defName != ("Building_Helicopter")) { masss += (pawn.inventory.innerContainer[j].def.BaseMass * pawn.inventory.innerContainer[j].stackCount); } } } foreach (Pawn pawn in __instance.pawns.InnerListForReading) { Pawn_InventoryTracker pinv = pawn.inventory; for (int i = 0; i < pinv.innerContainer.Count; i++) { if (pinv.innerContainer[i].def.defName == ("Building_Helicopter")) { Command_Action launch = new Command_Action(); launch.defaultLabel = "CommandLaunchGroup".Translate(); launch.defaultDesc = "CommandLaunchGroupDesc".Translate(); launch.icon = ContentFinder <Texture2D> .Get("UI/Commands/LaunchShip", true); launch.alsoClickIfOtherInGroupClicked = false; launch.action = delegate { float maxmass = pinv.innerContainer[i].TryGetComp <CompTransporter>().Props.massCapacity; if (masss <= maxmass) { pinv.innerContainer[i].TryGetComp <CompLaunchableHelicopter>().WorldStartChoosingDestination(__instance); } else { Messages.Message("TooBigTransportersMassUsage".Translate() + "(" + (maxmass - masss) + "KG)", MessageTypeDefOf.RejectInput, false); } }; List <Gizmo> newr = __result.ToList(); newr.Add(launch); Command_Action addFuel = new Command_Action(); addFuel.defaultLabel = "CommandAddFuel".Translate(); addFuel.defaultDesc = "CommandAddFuelDesc".Translate(); addFuel.icon = ContentFinder <Texture2D> .Get("Things/Item/Resource/Chemfuel", true); addFuel.alsoClickIfOtherInGroupClicked = false; addFuel.action = delegate { bool hasAddFuel = false; int fcont = 0; CompRefuelable comprf = pinv.innerContainer[i].TryGetComp <CompRefuelable>(); List <Thing> list = CaravanInventoryUtility.AllInventoryItems(__instance); //pinv.innerContainer.Count for (int j = 0; j < list.Count; j++) { if (list[j].def == ThingDefOf.Chemfuel) { fcont = list[j].stackCount; Pawn ownerOf = CaravanInventoryUtility.GetOwnerOf(__instance, list[j]); float need = comprf.Props.fuelCapacity - comprf.Fuel; if (need < 1f && need > 0) { fcont = 1; } if (fcont * 1f >= need) { fcont = (int)need; } // Log.Warning("f&n is "+fcont+"/"+need); if (list[j].stackCount * 1f <= fcont) { list[j].stackCount -= fcont; Thing thing = list[j]; ownerOf.inventory.innerContainer.Remove(thing); thing.Destroy(DestroyMode.Vanish); } else { if (fcont != 0) { list[j].SplitOff(fcont).Destroy(DestroyMode.Vanish); } } Type crtype = comprf.GetType(); FieldInfo finfo = crtype.GetField("fuel", BindingFlags.NonPublic | BindingFlags.Instance); finfo.SetValue(comprf, comprf.Fuel + fcont); hasAddFuel = true; break; } } if (hasAddFuel) { Messages.Message("AddFuelDoneMsg".Translate(fcont, comprf.Fuel), MessageTypeDefOf.PositiveEvent, false); } else { Messages.Message("NonOilMsg".Translate(), MessageTypeDefOf.RejectInput, false); } }; newr.Add(addFuel); Gizmo_MapRefuelableFuelStatus fuelStat = new Gizmo_MapRefuelableFuelStatus { nowFuel = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Fuel, maxFuel = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Props.fuelCapacity, compLabel = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Props.FuelGizmoLabel }; newr.Add(fuelStat); __result = newr; return; } } } }