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
}
}
}