private static void ForEachAction(Vector3Int position, Bed bed, ref BedStateObject stateObject) { if (bed.Colony == stateObject.Colony && !stateObject.Beds.ContainsKey(bed)) { stateObject.Beds.Add(bed, position); } }
public static void CalculateBeds(Colony colony) { var cs = ColonyState.GetColonyState(colony); if (cs.Difficulty.Name != GameDifficulty.Normal.Name) { BedStateObject bso = new BedStateObject(); bso.Colony = colony; colony.BedTracker.ForeachBedInstance(ForEachAction, ref bso); int happiness = 0; foreach (var bed in bso.Beds) { try { var bedEnd = bed.Value.Position.Add(-1, 0, 0); if (bed.Key.BedType == ColonyBuiltIn.ItemTypes.BEDXP) { bedEnd = bed.Value.Position.Add(1, 0, 0); } else if (bed.Key.BedType == ColonyBuiltIn.ItemTypes.BEDZN) { bedEnd = bed.Value.Position.Add(0, 0, -1); } else if (bed.Key.BedType == ColonyBuiltIn.ItemTypes.BEDZP) { bedEnd = bed.Value.Position.Add(0, 0, 1); } if (!IsHappy(bed.Value.Position, bedEnd)) { happiness -= 1; bed.Value.IsHappy = false; } } catch (Exception ex) { SettlersLogger.LogError(ex); } } CachedHappiness[colony] = happiness; BedCache[colony] = bso; } }
public static void CalculateBeds(Colony colony) { BedStateObject bso = new BedStateObject(); bso.Colony = colony; ServerManager.BlockEntityTracker.BedTracker.Positions.Foreach(ForEachAction, ref bso); Task.Run(() => { int happiness = 0; foreach (var bed in bso.Beds) { var bedEnd = bed.Value.Add(-1, 0, 0); if (bed.Key.BedType == ColonyBuiltIn.ItemTypes.BEDXP) { bedEnd = bed.Value.Add(1, 0, 0); } else if (bed.Key.BedType == ColonyBuiltIn.ItemTypes.BEDZN) { bedEnd = bed.Value.Add(0, 0, -1); } else if (bed.Key.BedType == ColonyBuiltIn.ItemTypes.BEDZP) { bedEnd = bed.Value.Add(0, 0, 1); } if (!IsHappy(bed.Value, bedEnd)) { happiness -= 1; } } CachedHappiness[colony] = happiness; }); }
private static void ForEachAction(Vector3Int position, bool bedIsUsed, BedTracker.Bed bed, ref BedStateObject stateObject) { if (bed.Colony == stateObject.Colony && !stateObject.Beds.ContainsKey(bed)) { stateObject.Beds.Add(bed, new CachedBedState() { Position = position, Taken = bedIsUsed }); } }