using System.Collections.Generic; using System.IO; using HutongGames.PlayMaker; namespace MSCO { /// /// Bedürfnisse pro Spieler (Hunger, Durst, Stress, Harndrang, Müdigkeit, Schmutz): Im gemeinsamen Spielstand gibt es /// sie nur einmal - ohne das hätte jeder beim Beitreten die Werte desjenigen, der den Spielstand zuletzt hochgeladen /// hat. Deshalb schickt jeder seine eigenen Werte regelmäßig an den Server, der sie pro Spieler speichert und beim /// nächsten Beitreten zurückgibt. /// public static class PlayerNeeds { public static readonly string[] Names = { "PlayerHunger", "PlayerThirst", "PlayerStress", "PlayerUrine", "PlayerFatigue", "PlayerDirtiness" }; /// Eigene Werte: int n, je [string Name, float Wert]. null, wenn das Spiel sie (noch) nicht hat. public static byte[] Build() { var values = new List>(); foreach (string name in Names) { FsmFloat f = FsmVariables.GlobalVariables.FindFsmFloat(name); if (f != null && !float.IsNaN(f.Value) && !float.IsInfinity(f.Value)) values.Add(new KeyValuePair(name, f.Value)); } if (values.Count == 0) return null; return NetSession.Build(w => { w.Write(values.Count); foreach (KeyValuePair v in values) { w.Write(v.Key); w.Write(v.Value); } }); } /// Gespeicherte Werte vom Server übernehmen (Format wie Build). public static int Apply(BinaryReader r) { int count = r.ReadInt32(); int applied = 0; for (int i = 0; i < count; i++) { string name = r.ReadString(); float value = r.ReadSingle(); if (System.Array.IndexOf(Names, name) < 0 || float.IsNaN(value) || float.IsInfinity(value)) continue; FsmFloat f = FsmVariables.GlobalVariables.FindFsmFloat(name); if (f == null) continue; f.Value = value; applied++; } return applied; } } }