根据向量相似度分析,与 'DrawIcons, ColonistBarColonistDrawer' 最相关的代码定义如下: --- **文件路径 (精确匹配):** `C:\Steam\steamapps\common\RimWorld\Data\dll1.6\RimWorld\ColonistBarColonistDrawer.txt` ```csharp public class ColonistBarColonistDrawer { private struct IconDrawCall { public Texture2D texture; public string tooltip; public Color? color; public IconDrawCall(Texture2D texture, string tooltip = null, Color? color = null) { this.texture = texture; this.tooltip = tooltip; this.color = color; } } private Dictionary pawnLabelsCache = new Dictionary(); private static readonly Texture2D MoodBGTex = SolidColorMaterials.NewSolidColorTexture(new Color(0.4f, 0.47f, 0.53f, 0.44f)); private static readonly Texture2D MoodAtlas = ContentFinder.Get("UI/Widgets/SubtleGradient"); private static readonly Texture2D DeadColonistTex = ContentFinder.Get("UI/Misc/DeadColonist"); private static readonly Texture2D Icon_FormingCaravan = ContentFinder.Get("UI/Icons/ColonistBar/FormingCaravan"); private static readonly Texture2D Icon_MentalStateNonAggro = ContentFinder.Get("UI/Icons/ColonistBar/MentalStateNonAggro"); private static readonly Texture2D Icon_MentalStateAggro = ContentFinder.Get("UI/Icons/ColonistBar/MentalStateAggro"); private static readonly Texture2D Icon_MedicalRest = ContentFinder.Get("UI/Icons/ColonistBar/MedicalRest"); private static readonly Texture2D Icon_Sleeping = ContentFinder.Get("UI/Icons/ColonistBar/Sleeping"); private static readonly Texture2D Icon_Fleeing = ContentFinder.Get("UI/Icons/ColonistBar/Fleeing"); private static readonly Texture2D Icon_Attacking = ContentFinder.Get("UI/Icons/ColonistBar/Attacking"); private static readonly Texture2D Icon_Idle = ContentFinder.Get("UI/Icons/ColonistBar/Idle"); private static readonly Texture2D Icon_Burning = ContentFinder.Get("UI/Icons/ColonistBar/Burning"); private static readonly Texture2D Icon_Inspired = ContentFinder.Get("UI/Icons/ColonistBar/Inspired"); private static readonly Texture2D MoodGradient = ContentFinder.Get("UI/Widgets/MoodGradient"); public static readonly Vector2 PawnTextureSize = new Vector2(ColonistBar.BaseSize.x - 2f, 75f); public static readonly Vector3 PawnTextureCameraOffset = new Vector3(0f, 0f, 0.3f); public const float PawnTextureCameraZoom = 1.28205f; private const float PawnTextureHorizontalPadding = 1f; private static readonly float BaseIconAreaWidth = PawnTextureSize.x; private static readonly float BaseIconMaxSize = 20f; private const float BaseGroupFrameMargin = 12f; public const float DoubleClickTime = 0.5f; public const float FactionIconSpacing = 2f; public const float IdeoRoleIconSpacing = 2f; public const float SlaveIconSpacing = 2f; private const float MoodGradientHeight = 35f; private static List tmpIconsToDraw = new List(); private ColonistBar ColonistBar => Find.ColonistBar; public void DrawColonist(Rect rect, Pawn colonist, Map pawnMap, bool highlight, bool reordering) { float alpha = ColonistBar.GetEntryRectAlpha(rect); bool num = Prefs.VisibleMood && colonist.needs?.mood != null && colonist.mindState.mentalBreaker.CanDoRandomMentalBreaks && !colonist.Dead && !colonist.Downed; MoodThreshold moodThreshold = MoodThresholdExtensions.CurrentMoodThresholdFor(colonist); Color color = moodThreshold.GetColor(); color.a *= alpha; ApplyEntryInAnotherMapAlphaFactor(pawnMap, ref alpha); if (reordering) { alpha *= 0.5f; } Color color3 = (GUI.color = new Color(1f, 1f, 1f, alpha)); if (num && alpha >= 1f) { float num2 = moodThreshold.EdgeExpansion(); if (num2 > 0f) { GUI.color = color; Widgets.DrawAtlas(rect.ExpandedBy(num2), MoodAtlas); GUI.color = color3; } } GUI.DrawTexture(rect, ColonistBar.BGTex); if (colonist.needs != null && colonist.needs.mood != null) { Rect position = rect.ContractedBy(2f); float num3 = position.height * colonist.needs.mood.CurLevelPercentage; position.yMin = position.yMax - num3; position.height = num3; GUI.DrawTexture(position, MoodBGTex); } if (num && alpha >= 1f) { float transparency = ((moodThreshold < MoodThreshold.Major) ? 0.1f : 0.15f); Widgets.DrawBoxSolid(rect, moodThreshold.GetColor().ToTransparent(transparency)); } if (highlight) { int thickness = ((rect.width <= 22f) ? 2 : 3); GUI.color = Color.white; Widgets.DrawBox(rect, thickness); GUI.color = color3; } Rect rect2 = rect.ContractedBy(-2f * ColonistBar.Scale); if ((colonist.Dead ? Find.Selector.SelectedObjects.Contains(colonist.Corpse) : Find.Selector.SelectedObjects.Contains(colonist)) && !WorldRendererUtility.WorldSelected) { DrawSelectionOverlayOnGUI(colonist, rect2); } else if (WorldRendererUtility.WorldSelected && colonist.IsCaravanMember() && Find.WorldSelector.IsSelected(colonist.GetCaravan())) { DrawCaravanSelectionOverlayOnGUI(colonist.GetCaravan(), rect2); } GUI.DrawTexture(GetPawnTextureRect(rect.position), PortraitsCache.Get(colonist, PawnTextureSize, Rot4.South, PawnTextureCameraOffset, 1.28205f)); if (num) { Rect rect3 = rect.ContractedBy(1f); Widgets.BeginGroup(rect3); Rect position2 = rect3.AtZero(); position2.yMin = position2.yMax - 35f; GUI.color = color; GUI.DrawTexture(position2, MoodGradient); GUI.color = color3; Widgets.EndGroup(); } GUI.color = new Color(1f, 1f, 1f, alpha * 0.8f); DrawIcons(rect, colonist); GUI.color = color3; if (colonist.Dead) { GUI.DrawTexture(rect, DeadColonistTex); } float num4 = 4f * ColonistBar.Scale; Vector2 pos = new Vector2(rect.center.x, rect.yMax - num4); GenMapUI.DrawPawnLabel(colonist, pos, alpha, rect.width + ColonistBar.SpaceBetweenColonistsHorizontal - 2f, pawnLabelsCache); Text.Font = GameFont.Small; GUI.color = Color.white; } private Rect GroupFrameRect(int group) { float num = 99999f; float num2 = 0f; float num3 = 0f; List entries = ColonistBar.Entries; List drawLocs = ColonistBar.DrawLocs; for (int i = 0; i < entries.Count; i++) { if (entries[i].group == group) { num = Mathf.Min(num, drawLocs[i].x); num2 = Mathf.Max(num2, drawLocs[i].x + ColonistBar.Size.x); num3 = Mathf.Max(num3, drawLocs[i].y + ColonistBar.Size.y); } } return new Rect(num, 0f, num2 - num, num3 - 0f).ContractedBy(-12f * ColonistBar.Scale); } public void DrawGroupFrame(int group) { Rect position = GroupFrameRect(group); Map map = ColonistBar.Entries.Find((ColonistBar.Entry x) => x.group == group).map; float num = ((map == null) ? ((!WorldRendererUtility.WorldSelected) ? 0.75f : 1f) : ((map == Find.CurrentMap && !WorldRendererUtility.WorldSelected) ? 1f : 0.75f)); Widgets.DrawRectFast(position, new Color(0.5f, 0.5f, 0.5f, 0.4f * num)); } private void ApplyEntryInAnotherMapAlphaFactor(Map map, ref float alpha) { if (map == null) { if (!WorldRendererUtility.WorldSelected) { alpha = Mathf.Min(alpha, 0.4f); } } else if (map != Find.CurrentMap || WorldRendererUtility.WorldSelected) { alpha = Mathf.Min(alpha, 0.4f); } } public void HandleClicks(Rect rect, Pawn colonist, int reorderableGroup, out bool reordering) { if (Event.current.type == EventType.MouseDown && Event.current.button == 0 && Event.current.clickCount == 2 && Mouse.IsOver(rect)) { Event.current.Use(); CameraJumper.TryJump(colonist); } reordering = ReorderableWidget.Reorderable(reorderableGroup, rect, useRightButton: true); if (Event.current.type == EventType.MouseDown && Event.current.button == 1 && Mouse.IsOver(rect)) { Event.current.Use(); } } public void HandleGroupFrameClicks(int group) { Rect rect = GroupFrameRect(group); if (Event.current.type == EventType.MouseUp && Event.current.button == 0 && Mouse.IsOver(rect) && !ColonistBar.AnyColonistOrCorpseAt(UI.MousePositionOnUIInverted)) { bool worldSelected = WorldRendererUtility.WorldSelected; if ((!worldSelected && !Find.Selector.dragBox.IsValidAndActive) || (worldSelected && !Find.WorldSelector.dragBox.IsValidAndActive)) { Find.Selector.dragBox.active = false; Find.WorldSelector.dragBox.active = false; ColonistBar.Entry entry = ColonistBar.Entries.Find((ColonistBar.Entry x) => x.group == group); Map map = entry.map; if (map == null) { if (WorldRendererUtility.WorldSelected) { CameraJumper.TrySelect(entry.pawn); } else { CameraJumper.TryJumpAndSelect(entry.pawn); } } else { if (!CameraJumper.TryHideWorld() && Find.CurrentMap != map) { SoundDefOf.MapSelected.PlayOneShotOnCamera(); } Current.Game.CurrentMap = map; } } } if (Event.current.type == EventType.MouseDown && Event.current.button == 1 && Mouse.IsOver(rect)) { Event.current.Use(); } } public void Notify_RecachedEntries() { pawnLabelsCache.Clear(); } public void ClearLabelCache() { pawnLabelsCache.Clear(); } public Rect GetPawnTextureRect(Vector2 pos) { float x = pos.x; float y = pos.y; Vector2 vector = PawnTextureSize * ColonistBar.Scale; return new Rect(x + 1f, y - (vector.y - ColonistBar.Size.y) - 1f, vector.x, vector.y).ContractedBy(1f); } private void DrawIcons(Rect rect, Pawn colonist) { if (colonist.Dead) { return; } tmpIconsToDraw.Clear(); bool flag = false; if (colonist.CurJob != null) { JobDef def = colonist.CurJob.def; if (def == JobDefOf.AttackMelee || def == JobDefOf.AttackStatic) { flag = true; } else if (def == JobDefOf.Wait_Combat && colonist.stances.curStance is Stance_Busy stance_Busy && stance_Busy.focusTarg.IsValid) { flag = true; } } if (colonist.IsFormingCaravan()) { tmpIconsToDraw.Add(new IconDrawCall(Icon_FormingCaravan, "ActivityIconFormingCaravan".Translate())); } if (colonist.InAggroMentalState) { tmpIconsToDraw.Add(new IconDrawCall(Icon_MentalStateAggro, colonist.MentalStateDef.LabelCap)); } else if (colonist.InMentalState) { tmpIconsToDraw.Add(new IconDrawCall(Icon_MentalStateNonAggro, colonist.MentalStateDef.LabelCap)); } else if (colonist.InBed() && colonist.CurrentBed().Medical) { tmpIconsToDraw.Add(new IconDrawCall(Icon_MedicalRest, "ActivityIconMedicalRest".Translate())); } else { if (colonist.CurJob != null && colonist.jobs.curDriver.asleep) { goto IL_01c5; } if (colonist.GetCaravan() != null) { Pawn_NeedsTracker needs = colonist.needs; if (needs != null && needs.rest?.Resting == true) { goto IL_01c5; } } if (colonist.CurJob != null && colonist.CurJob.def == JobDefOf.FleeAndCower) { tmpIconsToDraw.Add(new IconDrawCall(Icon_Fleeing, "ActivityIconFleeing".Translate())); } else if (flag) { tmpIconsToDraw.Add(new IconDrawCall(Icon_Attacking, "ActivityIconAttacking".Translate())); } else if (colonist.mindState.IsIdle && GenDate.DaysPassed >= 1) { tmpIconsToDraw.Add(new IconDrawCall(Icon_Idle, "ActivityIconIdle".Translate())); } } goto IL_02b4; IL_01c5: tmpIconsToDraw.Add(new IconDrawCall(Icon_Sleeping, "ActivityIconSleeping".Translate())); goto IL_02b4; IL_02b4: if (colonist.IsBurning()) { tmpIconsToDraw.Add(new IconDrawCall(Icon_Burning, "ActivityIconBurning".Translate())); } if (colonist.Inspired) { tmpIconsToDraw.Add(new IconDrawCall(Icon_Inspired, colonist.InspirationDef.LabelCap)); } if (colonist.IsSlaveOfColony) { tmpIconsToDraw.Add(new IconDrawCall(colonist.guest.GetIcon())); } else { bool flag2 = false; if (colonist.Ideo != null) { Ideo ideo = colonist.Ideo; Precept_Role role = ideo.GetRole(colonist); if (role != null) { tmpIconsToDraw.Add(new IconDrawCall(role.Icon, null, ideo.Color)); flag2 = true; } } if (!flag2) { Faction faction = null; if (colonist.HasExtraMiniFaction()) { faction = colonist.GetExtraMiniFaction(); } else if (colonist.HasExtraHomeFaction()) { faction = colonist.GetExtraHomeFaction(); } if (faction != null) { tmpIconsToDraw.Add(new IconDrawCall(faction.def.FactionIcon, null, faction.Color)); } } } float num = Mathf.Min(BaseIconAreaWidth / (float)tmpIconsToDraw.Count, BaseIconMaxSize) * ColonistBar.Scale; Vector2 pos = new Vector2(rect.x + 1f, rect.yMax - num - 1f); foreach (IconDrawCall item in tmpIconsToDraw) { GUI.color = item.color ?? Color.white; DrawIcon(item.texture, ref pos, num, item.tooltip); GUI.color = Color.white; } } private void DrawIcon(Texture2D icon, ref Vector2 pos, float iconSize, string tooltip = null) { Rect rect = new Rect(pos.x, pos.y, iconSize, iconSize); GUI.DrawTexture(rect, icon); if (tooltip != null) { TooltipHandler.TipRegion(rect, tooltip); } pos.x += iconSize; } private void DrawSelectionOverlayOnGUI(Pawn colonist, Rect rect) { Thing target = colonist; if (colonist.Dead) { target = colonist.Corpse; } SelectionDrawerUtility.DrawSelectionOverlayOnGUI(target, rect, 0.4f * ColonistBar.Scale, 20f * ColonistBar.Scale); } private void DrawCaravanSelectionOverlayOnGUI(Caravan caravan, Rect rect) { SelectionDrawerUtility.DrawSelectionOverlayOnGUI(caravan, rect, 0.4f * ColonistBar.Scale, 20f * ColonistBar.Scale); } } ``` --- **文件路径:** `C:\Steam\steamapps\common\RimWorld\Data\dll1.6\RimWorld\ColonistBar.txt` **相似度:** 0.7704 ```csharp public class ColonistBar { public struct Entry { public Pawn pawn; public Map map; public int group; public Action reorderAction; public Action extraDraggedItemOnGUI; public Entry(Pawn pawn, Map map, int group) { this.pawn = pawn; this.map = map; this.group = group; reorderAction = delegate(int from, int to) { Find.ColonistBar.Reorder(from, to, group); }; extraDraggedItemOnGUI = delegate(int index, Vector2 dragStartPos) { Find.ColonistBar.DrawColonistMouseAttachment(index, dragStartPos, group); }; } } public ColonistBarColonistDrawer drawer = new ColonistBarColonistDrawer(); private ColonistBarDrawLocsFinder drawLocsFinder = new ColonistBarDrawLocsFinder(); private List cachedEntries = new List(); private List cachedDrawLocs = new List(); private List cachedReorderableGroups = new List(); private float cachedScale = 1f; private bool entriesDirty = true; private List colonistsToHighlight = new List(); public static readonly Texture2D BGTex = Command.BGTex; public static readonly Vector2 BaseSize = new Vector2(48f, 48f); public const float BaseSelectedTexJump = 20f; public const float BaseSelectedTexScale = 0.4f; public const float EntryInAnotherMapAlpha = 0.4f; public const float BaseSpaceBetweenGroups = 25f; public const float BaseSpaceBetweenColonistsHorizontal = 24f; public const float BaseSpaceBetweenColonistsVertical = 32f; private const float WeaponIconOffsetScaleFactor = 1.05f; private const float WeaponIconScaleFactor = 0.75f; private static List tmpPawns = new List(); private static List tmpMaps = new List(); private static List tmpCaravans = new List(); private static List tmpColonistsInOrder = new List(); private static List> tmpColonistsWithMap = new List>(); private static List tmpColonists = new List(); private static List tmpMapColonistsOrCorpsesInScreenRect = new List(); private static List tmpCaravanPawns = new List(); public List Entries { get { CheckRecacheEntries(); return cachedEntries; } } private bool ShowGroupFrames { get { List entries = Entries; int num = -1; for (int i = 0; i < entries.Count; i++) { num = Mathf.Max(num, entries[i].group); } return num >= 1; } } public float Scale => cachedScale; public List DrawLocs => cachedDrawLocs; public Vector2 Size => BaseSize * Scale; public float SpaceBetweenColonistsHorizontal => 24f * Scale; private bool Visible { get { if (UI.screenWidth < 800 || UI.screenHeight < 500) { return false; } if (Find.TilePicker.Active) { return false; } return true; } } public void MarkColonistsDirty() { entriesDirty = true; } public void ColonistBarOnGUI() { if (!Visible) { return; } if (Event.current.type != EventType.Layout) { List entries = Entries; int num = -1; bool showGroupFrames = ShowGroupFrames; int value = -1; for (int i = 0; i < cachedDrawLocs.Count; i++) { Rect rect = new Rect(cachedDrawLocs[i].x, cachedDrawLocs[i].y, Size.x, Size.y); Entry entry = entries[i]; bool flag = num != entry.group; num = entry.group; if (Event.current.type == EventType.Repaint) { if (flag) { value = ReorderableWidget.NewGroup(entry.reorderAction, ReorderableDirection.Horizontal, new Rect(0f, 0f, UI.screenWidth, UI.screenHeight), SpaceBetweenColonistsHorizontal, entry.extraDraggedItemOnGUI); } cachedReorderableGroups[i] = value; } bool reordering; if (entry.pawn != null) { drawer.HandleClicks(rect, entry.pawn, cachedReorderableGroups[i], out reordering); } else { reordering = false; } if (Event.current.type != EventType.Repaint) { continue; } if (flag && showGroupFrames) { drawer.DrawGroupFrame(entry.group); } if (entry.pawn != null) { drawer.DrawColonist(rect, entry.pawn, entry.map, colonistsToHighlight.Contains(entry.pawn), reordering); ThingWithComps thingWithComps = entry.pawn.equipment?.Primary; if ((Prefs.ShowWeaponsUnderPortraitMode == ShowWeaponsUnderPortraitMode.Always || (Prefs.ShowWeaponsUnderPortraitMode == ShowWeaponsUnderPortraitMode.WhileDrafted && entry.pawn.Drafted)) && thingWithComps != null && thingWithComps.def.IsWeapon) { Widgets.ThingIcon(new Rect(rect.x, rect.y + rect.height * 1.05f, rect.width, rect.height).ScaledBy(0.75f), thingWithComps, 1f, null, stackOfOne: true); } } } num = -1; if (showGroupFrames) { for (int j = 0; j < cachedDrawLocs.Count; j++) { Entry entry2 = entries[j]; bool num2 = num != entry2.group; num = entry2.group; if (num2) { drawer.HandleGroupFrameClicks(entry2.group); } } } } if (Event.current.type == EventType.Repaint) { colonistsToHighlight.Clear(); } } private void CheckRecacheEntries() { if (!entriesDirty) { return; } entriesDirty = false; cachedEntries.Clear(); int num = 0; if (Find.PlaySettings.showColonistBar) { tmpMaps.Clear(); tmpMaps.AddRange(Find.Maps); tmpMaps.SortBy((Map x) => !x.IsPlayerHome, (Map x) => x.uniqueID); for (int i = 0; i < tmpMaps.Count; i++) { tmpPawns.Clear(); tmpPawns.AddRange(tmpMaps[i].mapPawns.FreeColonists); tmpPawns.AddRange(tmpMaps[i].mapPawns.ColonySubhumansControllable); List list = tmpMaps[i].listerThings.ThingsInGroup(ThingRequestGroup.Corpse); for (int j = 0; j < list.Count; j++) { if (!list[j].IsDessicated()) { Pawn innerPawn = ((Corpse)list[j]).InnerPawn; if (innerPawn != null && innerPawn.IsColonist) { tmpPawns.Add(innerPawn); } } } IReadOnlyList allPawnsSpawned = tmpMaps[i].mapPawns.AllPawnsSpawned; for (int k = 0; k < allPawnsSpawned.Count; k++) { if (allPawnsSpawned[k].carryTracker.CarriedThing is Corpse corpse && !corpse.IsDessicated() && corpse.InnerPawn.IsColonist) { tmpPawns.Add(corpse.InnerPawn); } } foreach (Pawn tmpPawn in tmpPawns) { if (tmpPawn.playerSettings.displayOrder == -9999999) { tmpPawn.playerSettings.displayOrder = Mathf.Max(tmpPawns.MaxBy((Pawn p) => p.playerSettings.displayOrder).playerSettings.displayOrder, 0) + 1; } } PlayerPawnsDisplayOrderUtility.Sort(tmpPawns); foreach (Pawn tmpPawn2 in tmpPawns) { cachedEntries.Add(new Entry(tmpPawn2, tmpMaps[i], num)); } if (!tmpPawns.Any()) { cachedEntries.Add(new Entry(null, tmpMaps[i], num)); } num++; } tmpCaravans.Clear(); tmpCaravans.AddRange(Find.WorldObjects.Caravans); tmpCaravans.SortBy((Caravan x) => x.ID); for (int l = 0; l < tmpCaravans.Count; l++) { if (!tmpCaravans[l].IsPlayerControlled) { continue; } tmpPawns.Clear(); tmpPawns.AddRange(tmpCaravans[l].PawnsListForReading); PlayerPawnsDisplayOrderUtility.Sort(tmpPawns); for (int m = 0; m < tmpPawns.Count; m++) { if (tmpPawns[m].IsColonist || tmpPawns[m].IsColonySubhumanPlayerControlled) { cachedEntries.Add(new Entry(tmpPawns[m], null, num)); } } num++; } } cachedReorderableGroups.Clear(); foreach (Entry cachedEntry in cachedEntries) { _ = cachedEntry; cachedReorderableGroups.Add(-1); } drawer.Notify_RecachedEntries(); tmpPawns.Clear(); tmpMaps.Clear(); tmpCaravans.Clear(); drawLocsFinder.CalculateDrawLocs(cachedDrawLocs, out cachedScale, num); } public float GetEntryRectAlpha(Rect rect) { if (Messages.CollidesWithAnyMessage(rect, out var messageAlpha)) { return Mathf.Lerp(1f, 0.2f, messageAlpha); } return 1f; } public void Highlight(Pawn pawn) { if (Visible && !colonistsToHighlight.Contains(pawn)) { colonistsToHighlight.Add(pawn); } } public void Reorder(int from, int to, int entryGroup) { int num = 0; Pawn pawn = null; Pawn pawn2 = null; Pawn pawn3 = null; for (int i = 0; i < cachedEntries.Count; i++) { if (cachedEntries[i].group == entryGroup && cachedEntries[i].pawn != null) { if (num == from) { pawn = cachedEntries[i].pawn; } if (num == to) { pawn2 = cachedEntries[i].pawn; } pawn3 = cachedEntries[i].pawn; num++; } } if (pawn == null) { return; } int num2 = pawn2?.playerSettings.displayOrder ?? (pawn3.playerSettings.displayOrder + 1); for (int j = 0; j < cachedEntries.Count; j++) { Pawn pawn4 = cachedEntries[j].pawn; if (pawn4 == null) { continue; } if (pawn4.playerSettings.displayOrder == num2) { if (pawn2 != null && cachedEntries[j].group == entryGroup) { pawn4.playerSettings.displayOrder++; } } else if (pawn4.playerSettings.displayOrder > num2) { pawn4.playerSettings.displayOrder++; } else { pawn4.playerSettings.displayOrder--; } } pawn.playerSettings.displayOrder = num2; MarkColonistsDirty(); MainTabWindowUtility.NotifyAllPawnTables_PawnsChanged(); } public void DrawColonistMouseAttachment(int index, Vector2 dragStartPos, int entryGroup) { Pawn pawn = null; Vector2 vector = default(Vector2); int num = 0; for (int i = 0; i < cachedEntries.Count; i++) { if (cachedEntries[i].group == entryGroup && cachedEntries[i].pawn != null) { if (num == index) { pawn = cachedEntries[i].pawn; vector = cachedDrawLocs[i]; break; } num++; } } if (pawn != null) { RenderTexture iconTex = PortraitsCache.Get(pawn, ColonistBarColonistDrawer.PawnTextureSize, Rot4.South, ColonistBarColonistDrawer.PawnTextureCameraOffset, 1.28205f); Rect rect = new Rect(vector.x, vector.y, Size.x, Size.y); Rect pawnTextureRect = drawer.GetPawnTextureRect(rect.position); pawnTextureRect.position += Event.current.mousePosition - dragStartPos; Rect? customRect = pawnTextureRect; GenUI.DrawMouseAttachment(iconTex, "", 0f, default(Vector2), customRect); } } public bool AnyColonistOrCorpseAt(Vector2 pos) { if (!TryGetEntryAt(pos, out var entry)) { return false; } return entry.pawn != null; } public bool TryGetEntryAt(Vector2 pos, out Entry entry) { List drawLocs = DrawLocs; List entries = Entries; Vector2 size = Size; for (int i = 0; i < drawLocs.Count; i++) { if (new Rect(drawLocs[i].x, drawLocs[i].y, size.x, size.y).Contains(pos)) { entry = entries[i]; return true; } } entry = default(Entry); return false; } public List GetColonistsInOrder() { List entries = Entries; tmpColonistsInOrder.Clear(); for (int i = 0; i < entries.Count; i++) { if (entries[i].pawn != null) { tmpColonistsInOrder.Add(entries[i].pawn); } } return tmpColonistsInOrder; } public List ColonistsOrCorpsesInScreenRect(Rect rect) { List drawLocs = DrawLocs; List entries = Entries; Vector2 size = Size; tmpColonistsWithMap.Clear(); for (int i = 0; i < drawLocs.Count; i++) { if (rect.Overlaps(new Rect(drawLocs[i].x, drawLocs[i].y, size.x, size.y))) { Pawn pawn = entries[i].pawn; if (pawn != null) { Thing first = ((!pawn.Dead || pawn.Corpse == null || !pawn.Corpse.SpawnedOrAnyParentSpawned) ? ((Thing)pawn) : ((Thing)pawn.Corpse)); tmpColonistsWithMap.Add(new Pair(first, entries[i].map)); } } } if (WorldRendererUtility.WorldSelected && tmpColonistsWithMap.Any((Pair x) => x.Second == null)) { tmpColonistsWithMap.RemoveAll((Pair x) => x.Second != null); } else if (tmpColonistsWithMap.Any((Pair x) => x.Second == Find.CurrentMap)) { tmpColonistsWithMap.RemoveAll((Pair x) => x.Second != Find.CurrentMap); } tmpColonists.Clear(); for (int j = 0; j < tmpColonistsWithMap.Count; j++) { tmpColonists.Add(tmpColonistsWithMap[j].First); } tmpColonistsWithMap.Clear(); return tmpColonists; } public List MapColonistsOrCorpsesInScreenRect(Rect rect) { tmpMapColonistsOrCorpsesInScreenRect.Clear(); if (!Visible) { return tmpMapColonistsOrCorpsesInScreenRect; } List list = ColonistsOrCorpsesInScreenRect(rect); for (int i = 0; i < list.Count; i++) { if (list[i].Spawned) { tmpMapColonistsOrCorpsesInScreenRect.Add(list[i]); } } return tmpMapColonistsOrCorpsesInScreenRect; } public List CaravanMembersInScreenRect(Rect rect) { tmpCaravanPawns.Clear(); if (!Visible) { return tmpCaravanPawns; } List list = ColonistsOrCorpsesInScreenRect(rect); for (int i = 0; i < list.Count; i++) { if (list[i] is Pawn pawn && pawn.IsCaravanMember()) { tmpCaravanPawns.Add(pawn); } } return tmpCaravanPawns; } public List CaravanMembersCaravansInScreenRect(Rect rect) { tmpCaravans.Clear(); if (!Visible) { return tmpCaravans; } List list = CaravanMembersInScreenRect(rect); for (int i = 0; i < list.Count; i++) { tmpCaravans.Add(list[i].GetCaravan()); } return tmpCaravans; } public Caravan CaravanMemberCaravanAt(Vector2 at) { if (!Visible) { return null; } if (ColonistOrCorpseAt(at) is Pawn pawn && pawn.IsCaravanMember()) { return pawn.GetCaravan(); } return null; } public Thing ColonistOrCorpseAt(Vector2 pos) { if (!Visible) { return null; } if (!TryGetEntryAt(pos, out var entry)) { return null; } Pawn pawn = entry.pawn; if (pawn != null && pawn.Dead && pawn.Corpse != null && pawn.Corpse.SpawnedOrAnyParentSpawned) { return pawn.Corpse; } return pawn; } } ```