示例#1
0
        public static List <Thing> genericContentsHeader(Building_Storage storage, out string header, out string tooltip)
        {
            headerStringB.Length = 0;
            listOfStoredItems.Clear();
            tooltip = null;
            bool  flagUseStackInsteadOfItem = false; // "3/4 Items" vs "3/4 Stacks"
            float itemsTotalMass            = 0;     // not Bulk here
            int   numCells = 0;

            foreach (IntVec3 storageCell in storage.AllSlotCells())
            {
                foreach (Thing t in storage.Map.thingGrid.ThingsListAt(storageCell))
                {
                    if (t.Spawned && t.def.EverStorable(false))
                    {
                        listOfStoredItems.Add(t);
                        itemsTotalMass += t.GetStatValue(StatDefOf.Mass, true) * (float)t.stackCount;
                        if (t.def.stackLimit > 1)
                        {
                            flagUseStackInsteadOfItem = true;
                        }
                    }
                }
                numCells++;
            }
            // 4/8 stacks with total mass of 12kg (as above)
            headerStringB.Append("LWM.ContentsHeaderMax"
                                 .Translate(listOfStoredItems.Count,
                                            // 3 stacks or 3 items:
                                            (flagUseStackInsteadOfItem?"LWM.XStacks":"LWM.XItems").Translate(numCells),
                                            StatDefOf.Mass, itemsTotalMass.ToString("0.##")));
            AddPawnReservationsHeader(storage);
            header = headerStringB.ToString();
            return(listOfStoredItems);
        }
示例#2
0
        static void AddPawnReservationsHeader(Building_Storage storage)
        {
            List <Pawn> pwns = storage.Map.mapPawns.SpawnedPawnsInFaction(Faction.OfPlayer);

            if (pwns.Count > 0)
            {
                listOfReservingPawns.Clear();
                foreach (IntVec3 c in storage.AllSlotCells())
                {
                    Pawn p = storage.Map.reservationManager.FirstRespectedReserver(c, pwns[0]);
                    if (p != null)
                    {
                        // (p can possibly be animals)
                        listOfReservingPawns.Add(p.LabelShort);
                    }
                }
                if (listOfReservingPawns.Count > 0)
                {
                    headerStringB.Append('\n');
                    if (listOfReservingPawns.Count == 1)
                    {
                        headerStringB.Append("LWM.ContentsHeaderPawnUsing".Translate(listOfReservingPawns[0]));
                    }
                    else
                    {
                        headerStringB.Append("LWM.ContentsHeaderPawnsUsing".Translate(
                                                 String.Join(", ", listOfReservingPawns.ToArray())));
                    }
                }
            }
        } // end checking pawn reservations
        public static void Postfix(Building_Storage __instance, Map map)
        {
            CompDeepStorage cds;

            if ((cds = __instance.GetComp <CompDeepStorage>()) == null)
            {
                return;
            }

            foreach (var cell in __instance.AllSlotCells())
            {
                var list = map.thingGrid.ThingsListAt(cell);
                var alreadyFoundItemOnTop = false;
                for (var i = list.Count - 1; i >= 0; i--)
                {
                    var thing = list[i];
                    if (!thing.Spawned || !thing.def.EverStorable(false))
                    {
                        continue;                                                               // don't make people walking past be invisible...
                    }
                    if (cds.cdsProps.overlayType != GuiOverlayType.Normal || !cds.showContents) // Remove gui overlay - this includes number of stackabe item, quality, etc
                    {
                        map.listerThings.ThingsInGroup(ThingRequestGroup.HasGUIOverlay).Remove(thing);
                    }
                    if (thing.def.drawerType != DrawerType.MapMeshOnly)
                    {
                        if (!alreadyFoundItemOnTop)
                        {
                            Utils.TopThingInDeepStorage.Add(thing);
                        }
                        if (!cds.showContents)
                        {
                            map.dynamicDrawManager.DeRegisterDrawable(thing);
                        }
                    }

                    alreadyFoundItemOnTop = true; // it's true now, one way or another!

                    if (!cds.showContents)
                    {
                        map.tooltipGiverList.Notify_ThingDespawned(thing);                    // should this go with guioverlays?
                    }
                    // Don't need to thing.DirtyMapMesh(map); because of course it's dirty on spawn setup ;p
                } // end cell

                // Now put the DSU at the top of the ThingsList here:
                list.Remove(__instance);
                list.Add(__instance);
            }
        }