diff --git a/GamecraftModdingAPI/FlyCam.cs b/GamecraftModdingAPI/FlyCam.cs
index 15a6aa5..be9955f 100644
--- a/GamecraftModdingAPI/FlyCam.cs
+++ b/GamecraftModdingAPI/FlyCam.cs
@@ -1,26 +1,119 @@
using GamecraftModdingAPI.Players;
+using GamecraftModdingAPI.Utility;
+
+using RobocraftX.Physics;
using Svelto.ECS.EntityStructs;
+using Techblox.FlyCam;
using Unity.Mathematics;
+using UnityEngine;
namespace GamecraftModdingAPI
{
public class FlyCam
{
- private static FlyCamEngine Engine;
+ private static FlyCamEngine Engine = new FlyCamEngine();
public uint Id { get; }
public FlyCam(uint id) => Id = id;
- public unsafe float3 Position
+ ///
+ /// The local player's camera.
+ ///
+ public static FlyCam LocalCamera => new FlyCam(Player.LocalPlayer.Id);
+
+ ///
+ /// The current position of the camera.
+ ///
+ public float3 Position
+ {
+ get => Engine.GetComponent(Id).Get().position;
+ set
+ {
+ Engine.GetComponent(Id).Get().position = value;
+ Engine.GetComponent(Id).Get().position = value;
+ }
+ }
+
+ ///
+ /// The current rotation of the camera.
+ ///
+ public float3 Rotation
+ {
+ get => ((Quaternion) Engine.GetComponent(Id).Get().rotation).eulerAngles;
+ set
+ {
+ Engine.GetComponent(Id).Get().rotation = Quaternion.Euler(value);
+ Engine.GetComponent(Id).Get().rotation = Quaternion.Euler(value);
+ }
+ }
+
+ ///
+ /// The current direction the camera is moving.
+ ///
+ public float3 MovementDirection
+ {
+ get => Engine.GetComponent(Id).Get().movementDirection;
+ set => Engine.GetComponent(Id).Get().movementDirection = value;
+ }
+
+ ///
+ /// Whether the camera (player) is sprinting.
+ ///
+ public bool Sprinting
+ {
+ get => Engine.GetComponent(Id).Get().sprinting;
+ set => Engine.GetComponent(Id).Get().sprinting = value;
+ }
+
+ ///
+ /// The speed setting of the camera.
+ ///
+ public float Speed
+ {
+ get => Engine.GetComponent(Id).Get().speed;
+ set => Engine.GetComponent(Id).Get().speed = value;
+ }
+
+ ///
+ /// The multiplier setting to use when sprinting.
+ ///
+ public float SpeedSprintMultiplier
+ {
+ get => Engine.GetComponent(Id).Get().speedSprintMultiplier;
+ set => Engine.GetComponent(Id).Get().speedSprintMultiplier = value;
+ }
+
+ ///
+ /// The acceleration setting of the camera.
+ ///
+ public float Acceleration
+ {
+ get => Engine.GetComponent(Id).Get().acceleration;
+ set => Engine.GetComponent(Id).Get().acceleration = value;
+ }
+
+ ///
+ /// The current velocity of the camera.
+ ///
+ public float3 Velocity
+ {
+ get => Engine.GetComponent(Id).Get().velocity;
+ set => Engine.GetComponent(Id).Get().velocity = value;
+ }
+
+ ///
+ /// The current angular velocity of the camera.
+ ///
+ public float3 AngularVelocity
{
- get => Engine.GetComponent(Id).Map(pos => &pos->position);
- set => Engine.GetComponent(Id).Map(pos => &pos->position).Set(value);
+ get => Engine.GetComponent(Id).Get().angularVelocity;
+ set => Engine.GetComponent(Id).Get().angularVelocity = value;
}
public static void Init()
{
- Engine = new FlyCamEngine();
+ GameEngineManager.AddGameEngine(Engine);
}
}
}
\ No newline at end of file
diff --git a/GamecraftModdingAPI/OptionalRef.cs b/GamecraftModdingAPI/OptionalRef.cs
deleted file mode 100644
index a1b09cd..0000000
--- a/GamecraftModdingAPI/OptionalRef.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using GamecraftModdingAPI.Blocks;
-using Svelto.DataStructures;
-using Svelto.ECS;
-
-namespace GamecraftModdingAPI
-{
- public struct OptionalRef where T : unmanaged
- {
- private bool exists;
- private NB array;
- private uint index;
-
- private unsafe T* pointer;
-
- public OptionalRef(NB array, uint index)
- {
- exists = true;
- this.array = array;
- this.index = index;
- unsafe
- {
- pointer = null;
- }
- }
-
- public OptionalRef(ref T value)
- {
- unsafe
- {
- fixed(T* p = &value) pointer = p;
- }
-
- exists = true;
- array = default;
- index = default;
- }
-
- public ref T Get()
- {
- unsafe
- {
- if (pointer != null && exists)
- return ref *pointer;
- }
-
- if (exists)
- return ref array[index];
- throw new InvalidOperationException("Calling Get() on an empty OptionalRef");
- }
-
- public T Value
- {
- get
- {
- unsafe
- {
- if (pointer != null && exists)
- return *pointer;
- }
-
- if (exists)
- return array[index];
- return default;
- }
- }
-
- public unsafe void Set(T value) //Can't use properties because it complains that you can't set struct members
- {
- if (pointer != null && exists)
- *pointer = value;
- }
-
- public bool Exists => exists;
-
- public static implicit operator T(OptionalRef opt) => opt.Value;
-
- public static implicit operator bool(OptionalRef opt) => opt.exists;
-
- public delegate ref TR Mapper(ref T component) where TR : unmanaged;
- public unsafe delegate TR* PMapper
(T* component) where TR : unmanaged;
-
- /*public OptionalRef
Map
(Mapper
mapper) where TR : unmanaged =>
- exists ? new OptionalRef
(ref mapper(ref Get())) : new OptionalRef
();*/
-
- /*public OptionalRef
Map
(Expression> expression) where TR : unmanaged
- {
- if (expression.Body.NodeType == ExpressionType.MemberAccess)
- Console.WriteLine(((MemberExpression) expression.Body).Member);
- }*/
-
- public unsafe OptionalRef Map
(PMapper
mapper) where TR : unmanaged =>
- exists ? new OptionalRef
(ref *mapper(pointer)) : new OptionalRef
();
- }
-}
\ No newline at end of file
diff --git a/GamecraftModdingAPI/Player.cs b/GamecraftModdingAPI/Player.cs
index 0bed6a2..8b204d0 100644
--- a/GamecraftModdingAPI/Player.cs
+++ b/GamecraftModdingAPI/Player.cs
@@ -414,6 +414,11 @@ namespace GamecraftModdingAPI
return playerEngine.GetSelectedBlocks(Id);
}
+ ///
+ /// The camera of this player used when building.
+ ///
+ public FlyCam BuildCamera => new FlyCam(Id);
+
public bool Equals(Player other)
{
if (ReferenceEquals(null, other)) return false;
diff --git a/GamecraftModdingAPI/Utility/OptionalRef.cs b/GamecraftModdingAPI/Utility/OptionalRef.cs
new file mode 100644
index 0000000..4ac293d
--- /dev/null
+++ b/GamecraftModdingAPI/Utility/OptionalRef.cs
@@ -0,0 +1,60 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using GamecraftModdingAPI.Blocks;
+using Svelto.DataStructures;
+using Svelto.ECS;
+
+namespace GamecraftModdingAPI
+{
+ public struct OptionalRef where T : unmanaged
+ {
+ private bool exists;
+ private NB array;
+ private uint index;
+
+ public OptionalRef(NB array, uint index)
+ {
+ exists = true;
+ this.array = array;
+ this.index = index;
+ }
+
+ public OptionalRef(ref T value)
+ {
+ exists = true;
+ array = default;
+ index = default;
+ }
+
+ public ref T Get(T def = default)
+ {
+ if (exists)
+ return ref array[index];
+ return ref CompRefCache._default;
+ }
+
+ public bool Exists => exists;
+
+ public static implicit operator T(OptionalRef opt) => opt.Get();
+
+ public static implicit operator bool(OptionalRef opt) => opt.exists;
+
+ /*public delegate ref TR Mapper(ref T component) where TR : unmanaged;
+ public unsafe delegate TR* PMapper
(T* component) where TR : unmanaged;
+
+ public unsafe OptionalRef
Map
(PMapper
mapper) where TR : unmanaged =>
+ exists ? new OptionalRef
(ref *mapper(pointer)) : new OptionalRef
();*/
+
+ ///
+ /// Creates an instance of a struct T that can be referenced.
+ ///
+ /// The struct type to cache
+ private struct CompRefCache where T : unmanaged
+ {
+ public static T _default;
+ }
+ }
+}
\ No newline at end of file