67 lines
2.1 KiB
C#
67 lines
2.1 KiB
C#
using System;
|
|
using HutongGames.PlayMaker;
|
|
using UnityEngine;
|
|
|
|
namespace MSCO
|
|
{
|
|
/// <summary>
|
|
/// 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.
|
|
/// </summary>
|
|
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
|
|
|
|
/// <summary>Szenenwechsel / Verbindungsende.</summary>
|
|
public void Reset()
|
|
{
|
|
money = null;
|
|
tracking = false;
|
|
pending = 0f;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Erst beobachten, wenn das Spiel fertig geladen ist - sonst würde das Laden des
|
|
/// Kontostands aus dem Spielstand als "Einnahme" verschickt.
|
|
/// </summary>
|
|
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<MsgType, byte[]> 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)));
|
|
}
|
|
|
|
/// <summary>Änderung von einem anderen Spieler (oder vom Server) dazurechnen.</summary>
|
|
public void Apply(float delta)
|
|
{
|
|
if (!tracking || money == null)
|
|
{
|
|
pending += delta;
|
|
return;
|
|
}
|
|
money.Value += delta;
|
|
last += delta; // nicht als eigene Änderung zurückschicken
|
|
}
|
|
}
|
|
}
|