コード例 #1
0
        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;
                    }
                }
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
            }
        }
コード例 #5
0
        /*
         * 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));
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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;
                    }
                }
            }
        }
コード例 #9
0
            internal void <> m__0(Thing splitPiece, IThingHolder originalHolder)
            {
                Thing item = splitPiece.TryMakeMinified();

                CaravanInventoryUtility.FindPawnToMoveInventoryTo(item, this.pawns, null, null).inventory.innerContainer.TryAdd(item, true);
            }
コード例 #10
0
        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);
        }
コード例 #11
0
 private bool CheckItems(Caravan caravan, ThingDef thingDef, int count)
 {
     return(CaravanInventoryUtility.HasThings(caravan, thingDef, count));
 }
コード例 #12
0
        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);
        }
コード例 #13
0
ファイル: StartUp.cs プロジェクト: Juanfrank/SRTS-Expanded
    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
          };
        }
      }
    }
コード例 #14
0
        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);
        }
コード例 #15
0
 public static IEnumerable <IChargeSource> FindSources(Caravan caravan)
 {
     return(FindSources(CaravanInventoryUtility.AllInventoryItems(caravan), true));
 }