online fix

This commit is contained in:
2025-10-27 12:37:18 +01:00
parent 96d50bfad5
commit e6759d6610
281 changed files with 7337 additions and 136 deletions

View File

@@ -12,7 +12,10 @@ namespace MegaKoop.Game.Networking
WeaponFire = 4,
HealthSync = 5,
ProjectileSpawn = 6,
ProjectileImpact = 7
ProjectileImpact = 7,
GameState = 8,
EnemySpawn = 9,
EnemyDespawn = 10
}
public enum ProjectileImpactKind : byte
@@ -252,4 +255,139 @@ namespace MegaKoop.Game.Networking
return new ProjectileImpactMessage(kind, position, normal);
}
}
public enum GameStateEvent : byte
{
Started = 0,
Paused = 1,
Resumed = 2,
Stopped = 3,
WaveAdvanced = 4,
BossSpawned = 5,
Heartbeat = 6
}
public readonly struct GameStateMessage
{
public readonly GameStateEvent Event;
public readonly float Elapsed;
public readonly int CurrentWave;
public readonly int PreviousWave;
public readonly bool IsPaused;
public readonly bool IsRunning;
public readonly string DefinitionId;
public readonly int Count;
public GameStateMessage(GameStateEvent evt, float elapsed, int currentWave, int previousWave, bool isPaused, bool isRunning, string definitionId, int count)
{
Event = evt;
Elapsed = elapsed;
CurrentWave = currentWave;
PreviousWave = previousWave;
IsPaused = isPaused;
IsRunning = isRunning;
DefinitionId = definitionId ?? string.Empty;
Count = count;
}
public static byte[] Serialize(GameStateMessage message)
{
using var writer = new NetworkWriter();
writer.Write((byte)message.Event);
writer.Write(message.Elapsed);
writer.Write(message.CurrentWave);
writer.Write(message.PreviousWave);
writer.Write(message.IsPaused);
writer.Write(message.IsRunning);
writer.Write(message.DefinitionId ?? string.Empty);
writer.Write(message.Count);
return writer.ToArray();
}
public static GameStateMessage Deserialize(byte[] buffer)
{
using var reader = new NetworkReader(buffer);
GameStateEvent evt = (GameStateEvent)reader.ReadByte();
float elapsed = reader.ReadFloat();
int currentWave = reader.ReadInt();
int previousWave = reader.ReadInt();
bool isPaused = reader.ReadBool();
bool isRunning = reader.ReadBool();
string definitionId = reader.ReadString();
int count = reader.ReadInt();
return new GameStateMessage(evt, elapsed, currentWave, previousWave, isPaused, isRunning, definitionId, count);
}
}
public readonly struct EnemySpawnMessage
{
public readonly string DefinitionId;
public readonly Vector3 Position;
public readonly Quaternion Rotation;
public readonly int NetworkId;
public readonly bool IsBoss;
public readonly int WaveIndex;
public readonly float Timestamp;
public EnemySpawnMessage(string definitionId, Vector3 position, Quaternion rotation, int networkId, bool isBoss, int waveIndex, float timestamp)
{
DefinitionId = definitionId ?? string.Empty;
Position = position;
Rotation = rotation;
NetworkId = networkId;
IsBoss = isBoss;
WaveIndex = waveIndex;
Timestamp = timestamp;
}
public static byte[] Serialize(EnemySpawnMessage message)
{
using var writer = new NetworkWriter();
writer.Write(message.DefinitionId ?? string.Empty);
writer.Write(message.Position);
writer.Write(message.Rotation);
writer.Write(message.NetworkId);
writer.Write(message.IsBoss);
writer.Write(message.WaveIndex);
writer.Write(message.Timestamp);
return writer.ToArray();
}
public static EnemySpawnMessage Deserialize(byte[] buffer)
{
using var reader = new NetworkReader(buffer);
string definitionId = reader.ReadString();
Vector3 position = reader.ReadVector3();
Quaternion rotation = reader.ReadQuaternion();
int networkId = reader.ReadInt();
bool isBoss = reader.ReadBool();
int waveIndex = reader.ReadInt();
float timestamp = reader.ReadFloat();
return new EnemySpawnMessage(definitionId, position, rotation, networkId, isBoss, waveIndex, timestamp);
}
}
public readonly struct EnemyDespawnMessage
{
public readonly int NetworkId;
public EnemyDespawnMessage(int networkId)
{
NetworkId = networkId;
}
public static byte[] Serialize(EnemyDespawnMessage message)
{
using var writer = new NetworkWriter();
writer.Write(message.NetworkId);
return writer.ToArray();
}
public static EnemyDespawnMessage Deserialize(byte[] buffer)
{
using var reader = new NetworkReader(buffer);
int id = reader.ReadInt();
return new EnemyDespawnMessage(id);
}
}
}