166 lines
3.3 KiB
C#
166 lines
3.3 KiB
C#
using System;
|
|
|
|
using Unity.Mathematics;
|
|
|
|
using GamecraftModdingAPI.Players;
|
|
using GamecraftModdingAPI.Utility;
|
|
|
|
namespace GamecraftModdingAPI
|
|
{
|
|
public class Player
|
|
{
|
|
// static functionality
|
|
private static PlayerEngine playerEngine = new PlayerEngine();
|
|
|
|
public static bool Exists(PlayerType player)
|
|
{
|
|
switch (player)
|
|
{
|
|
case PlayerType.Remote:
|
|
return playerEngine.GetRemotePlayer() != uint.MaxValue;
|
|
case PlayerType.Local:
|
|
return playerEngine.GetLocalPlayer() != uint.MaxValue;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static bool Exists(uint player)
|
|
{
|
|
return playerEngine.ExistsById(player);
|
|
}
|
|
|
|
public Player(uint id)
|
|
{
|
|
this.Id = id;
|
|
if (!Exists(id))
|
|
{
|
|
throw new InvalidOperationException($"No player with id {id} exists");
|
|
}
|
|
this.Type = playerEngine.GetLocalPlayer() == id ? PlayerType.Local : PlayerType.Remote;
|
|
}
|
|
|
|
public Player(PlayerType player)
|
|
{
|
|
uint localId = playerEngine.GetLocalPlayer();
|
|
switch (player)
|
|
{
|
|
case PlayerType.Local:
|
|
this.Id = playerEngine.GetLocalPlayer();
|
|
break;
|
|
case PlayerType.Remote:
|
|
this.Id = playerEngine.GetRemotePlayer();
|
|
break;
|
|
}
|
|
if (this.Id == uint.MaxValue)
|
|
{
|
|
throw new InvalidOperationException($"No player of {player} type exists");
|
|
}
|
|
this.Type = player;
|
|
}
|
|
|
|
// object fields & properties
|
|
|
|
public PlayerType Type { get; }
|
|
|
|
public uint Id { get; private set; }
|
|
|
|
public float3 Position
|
|
{
|
|
get
|
|
{
|
|
return playerEngine.GetLocation(Id);
|
|
}
|
|
|
|
set
|
|
{
|
|
playerEngine.SetLocation(Id, value, false);
|
|
}
|
|
}
|
|
|
|
public quaternion Rotation
|
|
{
|
|
get
|
|
{
|
|
return playerEngine.GetRotation(Id);
|
|
}
|
|
|
|
set
|
|
{
|
|
playerEngine.SetRotation(Id, value);
|
|
}
|
|
}
|
|
|
|
public float3 Velocity
|
|
{
|
|
get
|
|
{
|
|
return playerEngine.GetLinearVelocity(Id);
|
|
}
|
|
|
|
set
|
|
{
|
|
playerEngine.SetLinearVelocity(Id, value);
|
|
}
|
|
}
|
|
|
|
public float3 AngularVelocity
|
|
{
|
|
get
|
|
{
|
|
return playerEngine.GetAngularVelocity(Id);
|
|
}
|
|
|
|
set
|
|
{
|
|
playerEngine.SetAngularVelocity(Id, value);
|
|
}
|
|
}
|
|
|
|
public float Mass
|
|
{
|
|
get
|
|
{
|
|
return 1f / playerEngine.GetMass(Id).InverseMass;
|
|
}
|
|
|
|
set
|
|
{
|
|
playerEngine.SetInverseMass(Id, 1f / value);
|
|
}
|
|
}
|
|
|
|
private float _ping = -1f;
|
|
|
|
public float Ping
|
|
{
|
|
get
|
|
{
|
|
float? temp = playerEngine.GetLastPingTime(Id, Type);
|
|
if (temp.HasValue)
|
|
{
|
|
_ping = temp.Value;
|
|
}
|
|
return _ping;
|
|
}
|
|
}
|
|
|
|
// object methods
|
|
|
|
public void Teleport(float x, float y, float z, bool relative = true, bool exitSeat = true)
|
|
{
|
|
float3 location = new float3(x, y, z);
|
|
if (relative)
|
|
{
|
|
location += playerEngine.GetLocation(Id);
|
|
}
|
|
playerEngine.SetLocation(Id, location, exitSeat: exitSeat);
|
|
}
|
|
|
|
// internal methods
|
|
|
|
public static void Init()
|
|
{
|
|
Utility.GameEngineManager.AddGameEngine(playerEngine);
|
|
}
|
|
}
|
|
}
|