internal static void RefuelPawnOnCaravan(Pawn pawn, Caravan caravan) { if (pawn.needs.rest.CurLevel > 0.4) { return; } var fuel = caravan.AllThings.FirstOrDefault(t => t.def == RSDefOf.RSPowerCell); if (fuel == null) { return; } var owner = CaravanInventoryUtility.GetOwnerOf(caravan, fuel); var amount = Math.Min(fuel.stackCount, 6); if (fuel.stackCount > amount) { fuel.stackCount -= amount; } else { owner.inventory.innerContainer.Remove(fuel); } pawn.needs.rest.CurLevel += amount / 10f; }
public static bool TryGetBestWater(Caravan caravan, Pawn forPawn, out Thing water, out Pawn owner) { var inventoryThings = CaravanInventoryUtility.AllInventoryItems(caravan); Thing foundThing = null; var bestScore = float.MinValue; // キャラバンの全所持品をチェック foreach (var thing in inventoryThings) { // それが飲めるものかどうか if (!CanNowGetWater(thing, forPawn)) { continue; } var waterScore = GetWaterScore(thing); // 今まで見つけたベストスコアを超えたか if (bestScore >= waterScore) { continue; } foundThing = thing; bestScore = waterScore; } if (foundThing != null) { // 何かしらの水が見つかった water = foundThing; // 水が個人の所持品に含まれている場合は持ち主が誰かを調べておく owner = CaravanInventoryUtility.GetOwnerOf(caravan, foundThing); return(true); } water = null; owner = null; return(false); }
public static bool TryGetBestArt(Caravan caravan, out Thing thing, out Pawn owner) { thing = null; List <Thing> list = CaravanInventoryUtility.AllInventoryItems(caravan); float num = 0f; foreach (Thing current in list) { if (current.GetInnerIfMinified().GetStatValue(StatDefOf.Beauty) > num && (current.GetInnerIfMinified().TryGetComp <CompArt>()?.Props?.canBeEnjoyedAsArt ?? false)) { thing = current; } } if (thing != null) { owner = CaravanInventoryUtility.GetOwnerOf(caravan, thing); return(true); } owner = null; return(false); }
private bool DockBoatTransferPawns() { DockedBoat dockedBoat = (DockedBoat)WorldObjectMaker.MakeWorldObject(WorldObjectDefOfShips.DockedBoat); dockedBoat.Tile = caravan.Tile; float randomInRange = Rand.Range(2f, 4f) + (50 * (1 - caravan.PawnsListForReading.Where(x => HelperMethods.IsShip(x)).Max(x => x.GetComp <CompShips>().Props.visibility))); dockedBoat.GetComponent <TimeoutComp>().StartTimeout(Mathf.CeilToInt(randomInRange * 60000)); List <Pawn> boats = caravan.PawnsListForReading.Where(x => HelperMethods.IsShip(x)).ToList(); List <Pawn> pawns = caravan.PawnsListForReading.Where(x => !HelperMethods.IsShip(x)).ToList(); if (caravan.PawnsListForReading.Where(x => !HelperMethods.IsShip(x)).Count() <= 0) { return(false); } foreach (TransferableOneWay t in this.transferables) { TransferableUtility.TransferNoSplit(t.things, t.CountToTransfer, delegate(Thing thing, int numToTake) { Pawn ownerOf = CaravanInventoryUtility.GetOwnerOf(this.caravan, thing); if (ownerOf is null) { return; } CaravanInventoryUtility.MoveInventoryToSomeoneElse(ownerOf, thing, pawns, boats, numToTake); }, true, true); } for (int i = caravan.pawns.Count - 1; i >= 0; i--) { Pawn p = caravan.PawnsListForReading[i]; if (HelperMethods.IsShip(p)) { dockedBoat.dockedBoats.TryAddOrTransfer(p, false); } } Find.WorldObjects.Add(dockedBoat); return(true); }
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; } } } }
private void exchangeOfGoods(Caravan caravan) { //Pawn bestNegotiator = CaravanVisitUtility.BestNegotiator(caravan); ThingOwner <Thing> сontainer = new ThingOwner <Thing>(); Dialog_TradeOnline form = null; if (сaravanOnline.OnlineWObject == null) { Log.Error("OCity_Caravan_LOGNoData".Translate()); return; } var goods = GameUtils.GetAllThings(caravan); form = new Dialog_TradeOnline(goods , сaravanOnline.OnlinePlayerLogin , сaravanOnline.OnlineWObject.FreeWeight , () => { if (!SessionClientController.Data.BackgroundSaveGameOff) { var select = form.GetSelect(); bool selectAllCaravan = caravan.PawnsListForReading.Count == select.Count(s => s.Key is Pawn); if (selectAllCaravan) { Log.Message("OCity_Caravan_LOGSwap".Translate()); select = new Dictionary <Thing, int>(); foreach (var pawn in caravan.PawnsListForReading) { foreach (var item in pawn.inventory.innerContainer.ToDictionary(t => t, t => t.stackCount)) { select.Add(item.Key, item.Value); } select.Add(pawn, 1); pawn.inventory.innerContainer.Clear(); } } //передаем выбранные товары из caravan к другому игроку в сaravanOnline var sendThings = new List <ThingEntry>(); foreach (var pair in select) { var thing = pair.Key; var numToTake = pair.Value; if (thing is Pawn) { var pawn = thing as Pawn; //если отдали пешку, то выкладываем все другим и удаляемся из каравана var things = pawn.inventory.innerContainer.ToList(); pawn.inventory.innerContainer.Clear(); GameUtils.DeSpawnSetupOnCaravan(caravan, pawn); foreach (var thin in things) { var p = CaravanInventoryUtility.FindPawnToMoveInventoryTo(thin, caravan.PawnsListForReading, null); if (p != null) { p.inventory.innerContainer.TryAdd(thin, true); } } } sendThings.Add(ThingEntry.CreateEntry(thing, numToTake)); } if (selectAllCaravan) { //удаляем пешку из игры foreach (var pawn in caravan.PawnsListForReading) { GameUtils.PawnDestroy(pawn); } Find.WorldObjects.Remove(caravan); } else { foreach (var pair in select) { var thing = pair.Key; var numToTake = pair.Value; if (thing is Pawn) { var pawn = thing as Pawn; //удаляем пешку из игры GameUtils.PawnDestroy(pawn); } else { //если отдали вешь, то находим кто её тащит и убираем с него Pawn ownerOf = CaravanInventoryUtility.GetOwnerOf(caravan, thing); ownerOf.inventory.innerContainer.TryTransferToContainer(thing, сontainer, numToTake); } } } //После передачи сохраняем, чтобы нельзя было обузить, после чего передаем вещи SessionClientController.SaveGameNowSingleAndCommandSafely( (connect) => { return(connect.SendThings(sendThings , SessionClientController.My.Login , сaravanOnline.OnlinePlayerLogin , сaravanOnline.OnlineWObject.ServerId , сaravanOnline.Tile )); }, null, null); //если не удалось отправить письмо, то жопа так как сейв уже прошел } }); Find.WindowStack.Add(form); }
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 != USCMDefOf.RRY_USCM_DropshipUD4L) { 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 == USCMDefOf.RRY_USCM_DropshipUD4L) { Command_Action launch = new Command_Action(); launch.defaultLabel = "CommandSendShuttle".Translate(); launch.defaultDesc = "CommandSendShuttleDesc".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 <CompUSCMDropship>().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 = "USCM_Dropship_CommandAddFuel".Translate(); addFuel.defaultDesc = "USCM_Dropship_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("USCM_Dropship_AddFuelDoneMsg".Translate(fcont, comprf.Fuel), MessageTypeDefOf.PositiveEvent, false); } else { Messages.Message("USCM_Dropship_NoFuelMsg".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; } } } }
public override void Arrived(Caravan caravan) { if (mode == "exchangeOfGoods") { //Pawn bestNegotiator = CaravanVisitUtility.BestNegotiator(caravan); ThingOwner <Thing> сontainer = new ThingOwner <Thing>(); Dialog_TradeOnline form = null; if (сaravanOnline.OnlineWObject == null) { Log.Error("OCity_Caravan_LOGNoData".Translate()); return; } var goods = CaravanInventoryUtility.AllInventoryItems(caravan).ToList().Concat( caravan.PawnsListForReading .Cast <Thing>() ).ToList(); form = new Dialog_TradeOnline(goods , сaravanOnline.OnlinePlayerLogin , сaravanOnline.OnlineWObject.FreeWeight , () => { var select = form.GetSelect(); bool selectAllCaravan = caravan.PawnsListForReading.Count == select.Count(s => s.Key is Pawn); if (selectAllCaravan) { Log.Message("OCity_Caravan_LOGSwap".Translate()); select = new Dictionary <Thing, int>(); foreach (var pawn in caravan.PawnsListForReading) { foreach (var item in pawn.inventory.innerContainer.ToDictionary(t => t, t => t.stackCount)) { select.Add(item.Key, item.Value); } select.Add(pawn, 1); pawn.inventory.innerContainer.Clear(); } } //передаем выбранные товары из caravan к другому игроку в сaravanOnline var sendThings = new List <ThingEntry>(); foreach (var pair in select) { var thing = pair.Key; var numToTake = pair.Value; if (thing is Pawn) { var pawn = thing as Pawn; //если отдали пешку, то выкладываем все другим и удаляемся из каравана var things = pawn.inventory.innerContainer.ToList(); pawn.inventory.innerContainer.Clear(); GameUtils.DeSpawnSetupOnCaravan(caravan, pawn); foreach (var thin in things) { var p = CaravanInventoryUtility.FindPawnToMoveInventoryTo(thin, caravan.PawnsListForReading, null); if (p != null) { p.inventory.innerContainer.TryAdd(thin, true); } } } sendThings.Add(new ThingEntry(thing, numToTake)); } SessionClientController.Command((connect) => { connect.SendThings(sendThings , SessionClientController.My.Login , сaravanOnline.OnlinePlayerLogin , сaravanOnline.OnlineWObject.ServerId , сaravanOnline.Tile ); }); if (selectAllCaravan) { //удаляем пешку из игры foreach (var pawn in caravan.PawnsListForReading) { pawn.Destroy(DestroyMode.Vanish); } Find.WorldObjects.Remove(caravan); } else { foreach (var pair in select) { var thing = pair.Key; var numToTake = pair.Value; if (thing is Pawn) { var pawn = thing as Pawn; //удаляем пешку из игры pawn.Destroy(DestroyMode.Vanish); //Find.WorldPawns.RemovePawn(pawn); не проверенное не полное удаление, если её вернут назад } else { //если отдали вешь, то находим кто её тащит и убираем с него Pawn ownerOf = CaravanInventoryUtility.GetOwnerOf(caravan, thing); ownerOf.inventory.innerContainer.TryTransferToContainer(thing, сontainer, numToTake); } } } }); Find.WindowStack.Add(form); } }
public static IEnumerable<Gizmo> LaunchAndBombGizmosPassthrough(IEnumerable<Gizmo> __result, Caravan __instance) { IEnumerator<Gizmo> enumerator = __result.GetEnumerator(); while (enumerator.MoveNext()) { var element = enumerator.Current; yield return element; if ((element as Command_Action)?.defaultLabel == "CommandSettle".Translate() && __instance.PawnsListForReading.Any(x => x.inventory.innerContainer.Any(y => y.TryGetComp<CompLaunchableSRTS>() != null))) { float massUsage = 0f; Thing srts = null; foreach (Pawn p in __instance.PawnsListForReading) { foreach (Thing t in p.inventory?.innerContainer) { if (t.TryGetComp<CompLaunchableSRTS>() != null) srts = t; else { massUsage += t.GetStatValue(StatDefOf.Mass, true) * t.stackCount; } } massUsage += p.GetStatValue(StatDefOf.Mass, true); massUsage -= MassUtility.InventoryMass(p) * p.stackCount; } yield return new Command_Action { defaultLabel = "CommandLaunchGroup".Translate(), defaultDesc = "CommandLaunchGroupDesc".Translate(), icon = Tex2D.LaunchSRTS, alsoClickIfOtherInGroupClicked = false, action = delegate () { if (massUsage > SRTSMod.GetStatFor<float>(srts.def.defName, StatName.massCapacity)) Messages.Message("TooBigTransportersMassUsage".Translate(), MessageTypeDefOf.RejectInput, false); else srts.TryGetComp<CompLaunchableSRTS>().WorldStartChoosingDestination(__instance); } }; /* Not Yet Implemented */ /*yield return new Command_Action { defaultLabel = "BombTarget".Translate(), defaultDesc = "BombTargetDesc".Translate(), icon = TexCommand.Attack, action = delegate () { if(SRTSMod.mod.settings.passengerLimits) { if(__instance.PawnsListForReading.Count < SRTSMod.GetStatFor<int>(srts.def.defName, StatName.minPassengers)) { Messages.Message("NotEnoughPilots".Translate(), MessageTypeDefOf.RejectInput, false); return; } else if(__instance.PawnsListForReading.Count > SRTSMod.GetStatFor<int>(srts.def.defName, StatName.maxPassengers)) { Messages.Message("TooManyPilots".Translate(), MessageTypeDefOf.RejectInput, false); return; } } FloatMenuOption carpetBombing = new FloatMenuOption("CarpetBombing".Translate(), delegate () { srts.TryGetComp<CompBombFlyer>().bombType = BombingType.carpet; srts.TryGetComp<CompBombFlyer>().StartChoosingWorldDestinationBomb(__instance); }); FloatMenuOption preciseBombing = new FloatMenuOption("PreciseBombing".Translate(), delegate () { srts.TryGetComp<CompBombFlyer>().bombType = BombingType.precise; srts.TryGetComp<CompBombFlyer>().StartChoosingWorldDestinationBomb(__instance); }); Find.WindowStack.Add(new FloatMenuGizmo(new List<FloatMenuOption>() { carpetBombing, preciseBombing }, srts, srts.LabelCap, UI.MouseMapPosition())); } };*/ Command_Action RefuelSRTS = new Command_Action() { defaultLabel = "CommandAddFuelSRTS".Translate(srts.TryGetComp<CompRefuelable>().parent.Label), defaultDesc = "CommandAddFuelDescSRTS".Translate(), icon = Tex2D.FuelSRTS, alsoClickIfOtherInGroupClicked = false, action = delegate () { bool flag = false; int count = 0; 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 = srts.TryGetComp<CompRefuelable>().Props.fuelCapacity - srts.TryGetComp<CompRefuelable>().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); srts.TryGetComp<CompRefuelable>().GetType().GetField("fuel", BindingFlags.Instance | BindingFlags.NonPublic).SetValue((object)srts.TryGetComp<CompRefuelable>(), (object)(float)((double)srts.TryGetComp<CompRefuelable>().Fuel + (double)count)); flag = true; break; } } if (flag) Messages.Message("AddFuelSRTSCaravan".Translate(count, srts.LabelCap), MessageTypeDefOf.PositiveEvent, false); else Messages.Message("NoFuelSRTSCaravan".Translate(), MessageTypeDefOf.RejectInput, false); } }; if (srts.TryGetComp<CompRefuelable>().IsFull) RefuelSRTS.Disable(); yield return RefuelSRTS; yield return new Gizmo_MapRefuelableFuelStatus { nowFuel = srts.TryGetComp<CompRefuelable>().Fuel, maxFuel = srts.TryGetComp<CompRefuelable>().Props.fuelCapacity, compLabel = srts.TryGetComp<CompRefuelable>().Props.FuelGizmoLabel }; } } }