Files
megakoop/Game/Scripts/Networking/NetworkMessages.cs
2025-10-26 14:17:31 +01:00

256 lines
8.4 KiB
C#

using System;
using UnityEngine;
namespace MegaKoop.Game.Networking
{
public enum NetworkMessageType : byte
{
Heartbeat = 0,
LobbyState = 1,
PlayerInput = 2,
CharacterTransform = 3,
WeaponFire = 4,
HealthSync = 5,
ProjectileSpawn = 6,
ProjectileImpact = 7
}
public enum ProjectileImpactKind : byte
{
Hero = 0,
Enemy = 1
}
public readonly struct NetworkMessage
{
public readonly NetworkMessageType Type;
public readonly byte[] Payload;
public readonly ulong Sender;
public NetworkMessage(NetworkMessageType type, byte[] payload, ulong sender)
{
Type = type;
Payload = payload;
Sender = sender;
}
}
public readonly struct PlayerInputMessage
{
public readonly int NetworkId;
public readonly Vector2 MoveInput;
public readonly bool JumpPressed;
public PlayerInputMessage(int networkId, Vector2 moveInput, bool jumpPressed)
{
NetworkId = networkId;
MoveInput = moveInput;
JumpPressed = jumpPressed;
}
public static byte[] Serialize(PlayerInputMessage message)
{
using var writer = new NetworkWriter();
writer.Write(message.NetworkId);
writer.Write(message.MoveInput.x);
writer.Write(message.MoveInput.y);
writer.Write(message.JumpPressed);
return writer.ToArray();
}
public static PlayerInputMessage Deserialize(byte[] buffer)
{
using var reader = new NetworkReader(buffer);
int id = reader.ReadInt();
float moveX = reader.ReadFloat();
float moveY = reader.ReadFloat();
bool jump = reader.ReadBool();
return new PlayerInputMessage(id, new Vector2(moveX, moveY), jump);
}
}
public readonly struct CharacterTransformMessage
{
public readonly int NetworkId;
public readonly Vector3 Position;
public readonly Quaternion Rotation;
public readonly Vector3 Velocity;
public CharacterTransformMessage(int networkId, Vector3 position, Quaternion rotation, Vector3 velocity)
{
NetworkId = networkId;
Position = position;
Rotation = rotation;
Velocity = velocity;
}
public static byte[] Serialize(CharacterTransformMessage message)
{
using var writer = new NetworkWriter();
writer.Write(message.NetworkId);
writer.Write(message.Position);
writer.Write(message.Rotation);
writer.Write(message.Velocity);
return writer.ToArray();
}
public static CharacterTransformMessage Deserialize(byte[] buffer)
{
using var reader = new NetworkReader(buffer);
int id = reader.ReadInt();
Vector3 position = reader.ReadVector3();
Quaternion rotation = reader.ReadQuaternion();
Vector3 velocity = reader.ReadVector3();
return new CharacterTransformMessage(id, position, rotation, velocity);
}
}
public readonly struct WeaponFireMessage
{
public readonly int NetworkId;
public readonly int WeaponIndex;
public readonly Vector3 MuzzlePosition;
public readonly Vector3 Direction;
public readonly float Timestamp;
public WeaponFireMessage(int networkId, int weaponIndex, Vector3 muzzlePosition, Vector3 direction, float timestamp)
{
NetworkId = networkId;
WeaponIndex = weaponIndex;
MuzzlePosition = muzzlePosition;
Direction = direction;
Timestamp = timestamp;
}
public static byte[] Serialize(WeaponFireMessage message)
{
using var writer = new NetworkWriter();
writer.Write(message.NetworkId);
writer.Write(message.WeaponIndex);
writer.Write(message.MuzzlePosition);
writer.Write(message.Direction);
writer.Write(message.Timestamp);
return writer.ToArray();
}
public static WeaponFireMessage Deserialize(byte[] buffer)
{
using var reader = new NetworkReader(buffer);
int networkId = reader.ReadInt();
int index = reader.ReadInt();
Vector3 muzzle = reader.ReadVector3();
Vector3 direction = reader.ReadVector3();
float time = reader.ReadFloat();
return new WeaponFireMessage(networkId, index, muzzle, direction, time);
}
}
public readonly struct HealthSyncMessage
{
public readonly int NetworkId;
public readonly float NormalizedHealth;
public HealthSyncMessage(int networkId, float normalizedHealth)
{
NetworkId = networkId;
NormalizedHealth = normalizedHealth;
}
public static byte[] Serialize(HealthSyncMessage message)
{
using var writer = new NetworkWriter();
writer.Write(message.NetworkId);
writer.Write(message.NormalizedHealth);
return writer.ToArray();
}
public static HealthSyncMessage Deserialize(byte[] buffer)
{
using var reader = new NetworkReader(buffer);
int id = reader.ReadInt();
float normalized = reader.ReadFloat();
return new HealthSyncMessage(id, normalized);
}
}
public readonly struct ProjectileSpawnMessage
{
public readonly int NetworkId;
public readonly int WeaponIndex;
public readonly Vector3 Position;
public readonly Vector3 Direction;
public readonly float Speed;
public readonly float Life;
public readonly float Damage;
public ProjectileSpawnMessage(int networkId, int weaponIndex, Vector3 position, Vector3 direction, float speed, float life, float damage)
{
NetworkId = networkId;
WeaponIndex = weaponIndex;
Position = position;
Direction = direction;
Speed = speed;
Life = life;
Damage = damage;
}
public static byte[] Serialize(ProjectileSpawnMessage message)
{
using var writer = new NetworkWriter();
writer.Write(message.NetworkId);
writer.Write(message.WeaponIndex);
writer.Write(message.Position);
writer.Write(message.Direction);
writer.Write(message.Speed);
writer.Write(message.Life);
writer.Write(message.Damage);
return writer.ToArray();
}
public static ProjectileSpawnMessage Deserialize(byte[] buffer)
{
using var reader = new NetworkReader(buffer);
int networkId = reader.ReadInt();
int index = reader.ReadInt();
Vector3 position = reader.ReadVector3();
Vector3 direction = reader.ReadVector3();
float speed = reader.ReadFloat();
float life = reader.ReadFloat();
float damage = reader.ReadFloat();
return new ProjectileSpawnMessage(networkId, index, position, direction, speed, life, damage);
}
}
public readonly struct ProjectileImpactMessage
{
public readonly ProjectileImpactKind Kind;
public readonly Vector3 Position;
public readonly Vector3 Normal;
public ProjectileImpactMessage(ProjectileImpactKind kind, Vector3 position, Vector3 normal)
{
Kind = kind;
Position = position;
Normal = normal;
}
public static byte[] Serialize(ProjectileImpactMessage message)
{
using var writer = new NetworkWriter();
writer.Write((byte)message.Kind);
writer.Write(message.Position);
writer.Write(message.Normal);
return writer.ToArray();
}
public static ProjectileImpactMessage Deserialize(byte[] buffer)
{
using var reader = new NetworkReader(buffer);
ProjectileImpactKind kind = (ProjectileImpactKind)reader.ReadByte();
Vector3 position = reader.ReadVector3();
Vector3 normal = reader.ReadVector3();
return new ProjectileImpactMessage(kind, position, normal);
}
}
}