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; } } } }
private static void DropToWorldObjectDo(WorldObject place, List <ThingEntry> things, string from, string text) { GlobalTargetInfo ti = new GlobalTargetInfo(place); var factionPirate = SessionClientController.Data.FactionPirate; if (MainHelper.DebugMode) { Loger.Log("Mail================================================= {"); } if (place is Settlement && ((Settlement)place).Map != null) { var map = ((Settlement)place).Map; var cell = GameUtils.GetTradeCell(map); ti = new GlobalTargetInfo(cell, map); Thing thinXZ; foreach (var thing in things) { if (MainHelper.DebugMode) { Loger.Log("Mail------------------------------------------------- {" + Environment.NewLine + thing.Data + Environment.NewLine + "Mail------------------------------------------------- }" + Environment.NewLine); } var thin = PrepareSpawnThingEntry(thing, factionPirate); if (MainHelper.DebugMode) { Loger.Log("Spawn..."); } if (thin is Pawn) { GenSpawn.Spawn((Pawn)thin, cell, map); } else { GenDrop.TryDropSpawn(thin, cell, map, ThingPlaceMode.Near, out thinXZ, null); } if (MainHelper.DebugMode) { Loger.Log("Spawn...OK"); } } } else if (place is Caravan) { var pawns = (place as Caravan).PawnsListForReading; foreach (var thing in things) { /* * thing.SetFaction(factionColonistLoadID, factionPirateLoadID); * var thin = thing.CreateThing(false); */ var thin = PrepareSpawnThingEntry(thing, factionPirate); if (thin is Pawn) { (place as Caravan).AddPawn(thin as Pawn, true); GameUtils.SpawnSetupOnCaravan(thin as Pawn); } else { var p = CaravanInventoryUtility.FindPawnToMoveInventoryTo(thin, pawns, null); if (p != null) { p.inventory.innerContainer.TryAdd(thin, true); } } } } if (MainHelper.DebugMode) { Loger.Log("Mail================================================= }"); } Find.LetterStack.ReceiveLetter("OCity_UpdateWorld_Trade".Translate() , text , LetterDefOf.PositiveEvent , ti , null); }
private static bool AnyPawnOutOfWater(Caravan c, out string worstDehydrationText) { // キャラバンの全所持品の水アイテムリスト作成 var tmpInvWater = CaravanInventoryUtility.AllInventoryItems(c).FindAll(t => t.CanGetWater()); var allFoundWaterItem = true; // キャラバン内の全ポーンをチェック foreach (var pawn in c.PawnsListForReading) { // 水分要求なし→水不要 if (pawn.needs.Water() == null) { continue; } // 心情ステータス無し、キャラバンの地形に水がある→アイテムがなくても水は飲める if (pawn.needs.mood == null && c.GetWaterTerrainType() != WaterTerrainType.NoWater) { continue; } // そのポーンが飲める水があるなら良し if (tmpInvWater.Exists(t => CanEverGetWater(t.def))) { continue; } // 適切な水アイテムを見つけられなかったポーンがいる allFoundWaterItem = false; break; } if (allFoundWaterItem) { // 全ポーンが水アイテムを見つけた // →脱水症状のテキストは不要 worstDehydrationText = null; return(false); } // 適切なアイテムを見つけられなかったポーンがいる // →全ポーンの脱水症状をチェックして最悪の状態を調査、そのテキストを取得 var maxHediffStageIndex = -1; string maxHediffText = null; foreach (var pawn in c.PawnsListForReading) { // 脱水症状の健康状態を持っているか var hediff = pawn.health.hediffSet.GetFirstHediffOfDef(MizuDef.Hediff_Dehydration); if (hediff == null) { continue; } if (maxHediffText != null && maxHediffStageIndex >= hediff.CurStageIndex) { continue; } // 最悪状態なら更新 maxHediffStageIndex = hediff.CurStageIndex; maxHediffText = hediff.LabelCap; } // 最悪の脱水症状テキストを返す worstDehydrationText = maxHediffText; return(true); }
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); } }
/* * Based on the Caravan's resources, Pawns & the road's cost (modified by terrain) : * - Determine the amount of work done in a tick * - Consume the caravan's resources * - Return whether or not the Caravan must now stop because it ran out of resources * - NOTE : Does this need to be here ? Maybe better in Mod.cs * Returns TRUE if work finished * CALLED FROM : CompTick() of WorldObjectComp_Caravan */ public static bool DoSomeWork(Caravan caravan, RoadConstructionSite site, out bool noMoreResources) { var caravanComp = caravan.GetComponent <WorldObjectComp_Caravan>(); var siteComp = site.GetComponent <WorldObjectComp_ConstructionSite>(); _ = site.roadDef.GetModExtension <DefModExtension_RotR_RoadDef>(); noMoreResources = false; var useISR2G = caravanComp.UseISR2G(); var available = new Dictionary <string, int>(); var needed = new Dictionary <string, int>(); var ratio = new Dictionary <string, float>(); float ratio_final = 1; //RoadsOfTheRim.DebugLog("[RotR] DEBUG ========== doSomeWork() =========="); //RoadsOfTheRim.DebugLog("[RotR] DEBUG ISR2G set to "+useISR2G); if (DebugSettings.godMode) { return(siteComp.FinishWork(caravan)); } if (caravanComp.CaravanCurrentState() != CaravanState.ReadyToWork) { DebugLog("[RotR] DEBUG : doSomeWork() failed because the caravan can't work."); return(false); } // Percentage of total work that can be done in this batch, might be 0 if no pawn was found with enough skill var amountOfWork = caravanComp.AmountOfWork(true); // Work was 0 (not enough skill) if (Math.Abs(amountOfWork) < double.Epsilon) { Messages.Message("RoadsOfTheRim_CaravanNoWork".Translate(caravan.Name, site.roadDef.label), MessageTypeDefOf.RejectInput); caravanComp.StopWorking(); return(false); } // calculate material present in the caravan foreach (var resourceName in DefModExtension_RotR_RoadDef.allResources) { available[resourceName] = 0; } foreach (var aThing in CaravanInventoryUtility.AllInventoryItems(caravan)) { foreach (var resourceName in DefModExtension_RotR_RoadDef.allResources) { if (IsThis(aThing.def, resourceName)) { available[resourceName] += aThing.stackCount; } } } // What percentage of work will remain after amountOfWork is done ? var percentOfWorkLeftToDoAfter = (siteComp.GetLeft("Work") - amountOfWork) / siteComp.GetCost("Work"); // The amount of each resource left to spend in total is : percentOfWorkLeftToDoAfter * {this resource cost} // Materials that would be needed to do that much work foreach (var resourceName in DefModExtension_RotR_RoadDef.allResources) { needed[resourceName] = (int)Math.Round(siteComp.GetLeft(resourceName) - (percentOfWorkLeftToDoAfter * siteComp.GetCost(resourceName))); // Check if there's enough material to go through this batch. Materials with a cost of 0 are always OK // Don't check when ISR2G is in use for this resource, don't check for work if (DefModExtension_RotR_RoadDef.GetInSituModifier(resourceName, useISR2G) || resourceName == "Work") { continue; } ratio[resourceName] = needed[resourceName] == 0 ? 1f : Math.Min(available[resourceName] / (float)needed[resourceName], 1f); if (ratio[resourceName] < ratio_final) { ratio_final = ratio[resourceName]; } } // The caravan didn't have enough resources for a full batch of work. Use as much as we can then stop working if (ratio_final < 1f) { Messages.Message("RoadsOfTheRim_CaravanNoResource".Translate(caravan.Name, site.roadDef.label), MessageTypeDefOf.RejectInput); foreach (var resourceName in DefModExtension_RotR_RoadDef.allResources) { needed[resourceName] = (int)(needed[resourceName] * ratio_final); } caravanComp.StopWorking(); } //RoadsOfTheRim.DebugLog("[RotR] ISR2G DEBUG ratio final = " + ratio_final); // Consume resources from the caravan _ = site.roadDef.defName == "DirtPathBuilt"; // Always consider resources have been consumed when the road is a dirt path foreach (var aThing in CaravanInventoryUtility.AllInventoryItems(caravan)) { foreach (var resourceName in DefModExtension_RotR_RoadDef.allResources) { if (!DefModExtension_RotR_RoadDef.GetInSituModifier(resourceName, useISR2G)) { if (needed[resourceName] <= 0 || !IsThis(aThing.def, resourceName)) { continue; //RoadsOfTheRim.DebugLog("[RotR] ISR2G consumption DEBUG =" + resourceName + " Qty consumed = " + amountUsed); } var amountUsed = aThing.stackCount > needed[resourceName] ? needed[resourceName] : aThing.stackCount; aThing.stackCount -= amountUsed; // Reduce how much of this resource is needed needed[resourceName] -= amountUsed; siteComp.ReduceLeft(resourceName, amountUsed); } else { if (needed[resourceName] <= 0) { continue; } //RoadsOfTheRim.DebugLog("[RotR] ISR2G consumption DEBUG =" + resourceName + " Qty freely awarded = " + needed[resourceName]); siteComp.ReduceLeft(resourceName, needed[resourceName]); needed[resourceName] = 0; } } if (aThing.stackCount == 0) { aThing.Destroy(); } } caravanComp.TeachPawns(ratio_final); // Pawns learn some construction // HARDCODED : ISR2G divides work done by 4 , AISR2G by 2 for all roads except dirt path if (useISR2G > 0 && site.roadDef.defName != "DirtPathBuilt") { amountOfWork = amountOfWork * 0.25f * useISR2G; } // Update amountOfWork based on the actual ratio worked & finally reducing the work & resources left amountOfWork = ratio_final * amountOfWork; return(siteComp.UpdateProgress(amountOfWork, caravan)); }
public static void CheckVision(Pawn pawn) { // Basically a copy of the function in PawnObserver if (!pawn.health.capacities.CapableOf(PawnCapacityDefOf.Sight) || pawn.needs.mood == null) { return; } // caravans have some different management Caravan caravan = pawn.GetCaravan(); if (caravan != null) { // inside caravan // see other foreach (Pawn potentialOther in caravan.PawnsListForReading) { Find.World.GetComponent <FriendshipMemoryGlobalTracker>().Notify_PhysicalSightOccured(pawn, potentialOther); } // see dead foreach (Thing thing in CaravanInventoryUtility.AllInventoryItems(caravan)) { Corpse potentialCorpse = thing as Corpse; if (potentialCorpse != null) { Pawn deadPawn = potentialCorpse.InnerPawn; Find.World.GetComponent <FriendshipMemoryGlobalTracker>().Notify_PhysicalSightOfCorpseOccured(pawn, deadPawn); } } return; } Map map = pawn.Map; if (map == null) { return; } MapPawns pawns = pawn.Map.mapPawns; IntVec3 selfPosition = pawn.Position; // seen alive foreach (Pawn potentialOther in pawns.AllPawnsSpawned) { if (GenSight.LineOfSight(selfPosition, potentialOther.Position, map, skipFirstCell: true)) { // can see! float distanceSq = selfPosition.DistanceToSquared(potentialOther.Position); if (distanceSq > 25) { // distance radius > 5, excluded continue; } Find.World.GetComponent <FriendshipMemoryGlobalTracker>().Notify_PhysicalSightOccured(pawn, potentialOther); } } // seen corpse for (int i = 0; (float)i < 100f; i++) { IntVec3 intVec = pawn.Position + GenRadial.RadialPattern[i]; if (!intVec.InBounds(map) || !GenSight.LineOfSight(intVec, pawn.Position, map, skipFirstCell: true)) { continue; } List <Thing> thingList = intVec.GetThingList(map); for (int j = 0; j < thingList.Count; j++) { Corpse potentialCorpse = thingList[j] as Corpse; if (potentialCorpse != null) { Pawn deadPawn = potentialCorpse.InnerPawn; Find.World.GetComponent <FriendshipMemoryGlobalTracker>().Notify_PhysicalSightOfCorpseOccured(pawn, deadPawn); } } } // tick the stuff Find.World.GetComponent <FriendshipMemoryGlobalTracker>().GetFriendshipMemoryTrackerForSubject(pawn)?.Notify_TickOnce(TickIntervalVision); }
public static bool PlayerOrQuestRewardHas(ThingDef thingDef, int count = 1) { if (count <= 0) { return(true); } int num = 0; List <Map> maps = Find.Maps; for (int i = 0; i < maps.Count; i++) { if (count == 1) { if (maps[i].listerThings.ThingsOfDef(thingDef).Count > 0) { return(true); } continue; } num += Mathf.Max(maps[i].resourceCounter.GetCount(thingDef), maps[i].listerThings.ThingsOfDef(thingDef).Count); if (num >= count) { return(true); } } List <Caravan> caravans = Find.WorldObjects.Caravans; for (int j = 0; j < caravans.Count; j++) { if (!caravans[j].IsPlayerControlled) { continue; } List <Thing> list = CaravanInventoryUtility.AllInventoryItems(caravans[j]); for (int k = 0; k < list.Count; k++) { if (list[k].def == thingDef) { num += list[k].stackCount; if (num >= count) { return(true); } } } } List <Site> sites = Find.WorldObjects.Sites; for (int l = 0; l < sites.Count; l++) { for (int m = 0; m < sites[l].parts.Count; m++) { SitePart sitePart = sites[l].parts[m]; if (sitePart.things == null) { continue; } for (int n = 0; n < sitePart.things.Count; n++) { if (sitePart.things[n].def == thingDef) { num += sitePart.things[n].stackCount; if (num >= count) { return(true); } } } } DefeatAllEnemiesQuestComp component = sites[l].GetComponent <DefeatAllEnemiesQuestComp>(); if (component == null) { continue; } ThingOwner rewards = component.rewards; for (int num2 = 0; num2 < rewards.Count; num2++) { if (rewards[num2].def == thingDef) { num += rewards[num2].stackCount; if (num >= count) { return(true); } } } } return(false); }
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].TryGetComp <CompLaunchableSRTS>() == null) { 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].TryGetComp <CompLaunchableSRTS>() != null) { 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 <CompLaunchableSRTS>().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; } } } }
internal void <> m__0(Thing splitPiece, IThingHolder originalHolder) { Thing item = splitPiece.TryMakeMinified(); CaravanInventoryUtility.FindPawnToMoveInventoryTo(item, this.pawns, null, null).inventory.innerContainer.TryAdd(item, true); }
public static bool PlayerOrQuestRewardHas(ThingFilter thingFilter) { ThingRequest bestThingRequest = thingFilter.BestThingRequest; List <Map> maps = Find.Maps; for (int i = 0; i < maps.Count; i++) { List <Thing> list = maps[i].listerThings.ThingsMatching(bestThingRequest); for (int j = 0; j < list.Count; j++) { if (thingFilter.Allows(list[j])) { return(true); } } } List <Caravan> caravans = Find.WorldObjects.Caravans; for (int k = 0; k < caravans.Count; k++) { if (!caravans[k].IsPlayerControlled) { continue; } List <Thing> list2 = CaravanInventoryUtility.AllInventoryItems(caravans[k]); for (int l = 0; l < list2.Count; l++) { if (thingFilter.Allows(list2[l])) { return(true); } } } List <Site> sites = Find.WorldObjects.Sites; for (int m = 0; m < sites.Count; m++) { for (int n = 0; n < sites[m].parts.Count; n++) { SitePart sitePart = sites[m].parts[n]; if (sitePart.things == null) { continue; } for (int num = 0; num < sitePart.things.Count; num++) { if (thingFilter.Allows(sitePart.things[num])) { return(true); } } } DefeatAllEnemiesQuestComp component = sites[m].GetComponent <DefeatAllEnemiesQuestComp>(); if (component == null) { continue; } ThingOwner rewards = component.rewards; for (int num2 = 0; num2 < rewards.Count; num2++) { if (thingFilter.Allows(rewards[num2])) { return(true); } } } return(false); }
private bool CheckItems(Caravan caravan, ThingDef thingDef, int count) { return(CaravanInventoryUtility.HasThings(caravan, thingDef, count)); }
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 , () => { 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)); } SessionClientController.Command((connect) => { connect.SendThings(sendThings , SessionClientController.My.Login , сaravanOnline.OnlinePlayerLogin , сaravanOnline.OnlineWObject.ServerId , сaravanOnline.Tile ); }); 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); } } } //После передачи сохраняем, чтобы нельзя было обузить if (!SessionClientController.Data.BackgroundSaveGameOff) { SessionClientController.SaveGameNow(true); } }); 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 }; } } }
private static void DropToWorldObjectDo(WorldObject place, List <ThingEntry> things, string from, string text) { GlobalTargetInfo ti = new GlobalTargetInfo(place); var factionColonistLoadID = Find.FactionManager.OfPlayer.GetUniqueLoadID(); var factionPirate = Find.FactionManager.AllFactions.FirstOrDefault(f => f.def.defName == "Pirate") ?? Find.FactionManager.OfAncientsHostile; var factionPirateLoadID = factionPirate.GetUniqueLoadID(); if (MainHelper.DebugMode) { Loger.Log("Mail================================================= {"); } if (place is Settlement && ((Settlement)place).Map != null) { var cell = GameUtils.GetTradeCell(((Settlement)place).Map); ti = new GlobalTargetInfo(cell, ((Settlement)place).Map); Thing thinXZ; foreach (var thing in things) { if (MainHelper.DebugMode) { Loger.Log("Mail------------------------------------------------- {" + Environment.NewLine + thing.Data + Environment.NewLine + "Mail------------------------------------------------- }" + Environment.NewLine); } var prisoner = thing.SetFaction(factionColonistLoadID, factionPirateLoadID); Thing thin; thin = thing.CreateThing(false); if (MainHelper.DebugMode) { Loger.Log("SetFaction..."); } if (thin.def.CanHaveFaction) { if (prisoner && thin is Pawn) { thin.SetFaction(factionPirate); var p = thin as Pawn; p.guest.SetGuestStatus(factionPirate, true); } else { thin.SetFaction(Find.FactionManager.OfPlayer); } } if (MainHelper.DebugMode) { Loger.Log("Spawn..."); } var map = ((Settlement)place).Map; if (thin is Pawn) { GenSpawn.Spawn((Pawn)thin, cell, map); } else { GenDrop.TryDropSpawn(thin, cell, map, ThingPlaceMode.Near, out thinXZ, null); } if (MainHelper.DebugMode) { Loger.Log("Spawn...OK"); } } } else if (place is Caravan) { var pawns = (place as Caravan).PawnsListForReading; foreach (var thing in things) { thing.SetFaction(factionColonistLoadID, factionPirateLoadID); var thin = thing.CreateThing(false); if (thin is Pawn) { (place as Caravan).AddPawn(thin as Pawn, true); GameUtils.SpawnSetupOnCaravan(thin as Pawn); } else { var p = CaravanInventoryUtility.FindPawnToMoveInventoryTo(thin, pawns, null); if (p != null) { p.inventory.innerContainer.TryAdd(thin, true); } } } } if (MainHelper.DebugMode) { Loger.Log("Mail================================================= }"); } Find.LetterStack.ReceiveLetter("OCity_UpdateWorld_Trade".Translate() , text , LetterDefOf.PositiveEvent , ti , null); }
public static IEnumerable <IChargeSource> FindSources(Caravan caravan) { return(FindSources(CaravanInventoryUtility.AllInventoryItems(caravan), true)); }