Files
MSCO/MoneySync.cs
2026-09-26 19:37:28 +02:00

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