using System; using HutongGames.PlayMaker; using UnityEngine; namespace MSCO { /// /// Gemeinsame Kasse: Ändert sich das Geld (globale Variable "PlayerMoney") bei einem Spieler, /// wird nur die Änderung verschickt und bei allen anderen dazugerechnet. So gehen gleichzeitige /// Einkäufe/Einnahmen nicht verloren, und niemand überschreibt den Kontostand eines anderen. /// public class MoneySync { const string MoneyVariable = "PlayerMoney"; const float MinChange = 0.01f; FsmFloat money; float last; bool tracking; float pending; // Änderungen, die ankamen, bevor das Geld aus dem Spielstand geladen war /// Szenenwechsel / Verbindungsende. public void Reset() { money = null; tracking = false; pending = 0f; } /// /// Erst beobachten, wenn das Spiel fertig geladen ist - sonst würde das Laden des /// Kontostands aus dem Spielstand als "Einnahme" verschickt. /// public void Begin() { if (tracking) return; money = FsmVariables.GlobalVariables.FindFsmFloat(MoneyVariable); if (money == null) return; money.Value += pending; pending = 0f; last = money.Value; tracking = true; } public void Update(Action send) { if (!tracking || money == null) return; float delta = money.Value - last; if (Mathf.Abs(delta) < MinChange) return; last = money.Value; send(MsgType.MoneyDelta, NetSession.Build(w => w.Write(delta))); } /// Änderung von einem anderen Spieler (oder vom Server) dazurechnen. public void Apply(float delta) { if (!tracking || money == null) { pending += delta; return; } money.Value += delta; last += delta; // nicht als eigene Änderung zurückschicken } } }