From 5bfd0b7f1092c5410be5d28d573c67c411e652e7 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Fri, 28 May 2021 02:12:54 +0200 Subject: [PATCH] Integrate FlyCam class into Player Using QueryEntityOptional directly with the player properties Character structs are camera structs in build mode The FlyCam rotation is not updated in build mode, only the camera is --- TechbloxModdingAPI/FlyCam.cs | 132 -------- TechbloxModdingAPI/Main.cs | 1 - TechbloxModdingAPI/Player.FlyCamSettings.cs | 51 +++ TechbloxModdingAPI/Player.cs | 183 +++++----- TechbloxModdingAPI/Players/FlyCamEngine.cs | 39 --- .../Players/PlayerBuildingMode.cs | 3 +- TechbloxModdingAPI/Players/PlayerEngine.cs | 319 ++---------------- TechbloxModdingAPI/TechbloxModdingAPI.csproj | 1 + 8 files changed, 163 insertions(+), 566 deletions(-) delete mode 100644 TechbloxModdingAPI/FlyCam.cs create mode 100644 TechbloxModdingAPI/Player.FlyCamSettings.cs delete mode 100644 TechbloxModdingAPI/Players/FlyCamEngine.cs diff --git a/TechbloxModdingAPI/FlyCam.cs b/TechbloxModdingAPI/FlyCam.cs deleted file mode 100644 index edf0691..0000000 --- a/TechbloxModdingAPI/FlyCam.cs +++ /dev/null @@ -1,132 +0,0 @@ -using RobocraftX.Physics; -using Svelto.ECS; -using Svelto.ECS.EntityStructs; -using Techblox.FlyCam; -using TechbloxModdingAPI.Blocks; -using TechbloxModdingAPI.Players; -using TechbloxModdingAPI.Utility; -using Unity.Mathematics; -using UnityEngine; - -namespace TechbloxModdingAPI -{ - public class FlyCam : EcsObjectBase - { - private static FlyCamEngine Engine = new FlyCamEngine(); - - public override EGID Id { get; } - - public FlyCam(uint id) => Id = new EGID(id, Techblox.FlyCam.FlyCam.Group); - - /// - /// 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(this).position; - set - { - Engine.GetComponent(this).position = value; - Engine.GetComponent(this).position = value; - } - } - - /// - /// The current rotation of the camera. - /// - public float3 Rotation - { - get => ((Quaternion) Engine.GetComponent(this).rotation).eulerAngles; - set - { - Engine.GetComponent(this).rotation = Quaternion.Euler(value); - Engine.GetComponent(this).rotation = Quaternion.Euler(value); - } - } - - /// - /// The current direction the camera is moving. - /// - public float3 MovementDirection - { - get => Engine.GetComponent(this).movementDirection; - set => Engine.GetComponent(this).movementDirection = value; - } - - /// - /// Whether the camera (player) is sprinting. - /// - public bool Sprinting - { - get => Engine.GetComponent(this).sprinting; - set => Engine.GetComponent(this).sprinting = value; - } - - /// - /// The speed setting of the camera. - /// - public float Speed - { - get => Engine.GetComponent(this).speed; - set => Engine.GetComponent(this).speed = value; - } - - /// - /// The multiplier setting to use when sprinting. - /// - public float SpeedSprintMultiplier - { - get => Engine.GetComponent(this).speedSprintMultiplier; - set => Engine.GetComponent(this).speedSprintMultiplier = value; - } - - /// - /// The acceleration setting of the camera. - /// - public float Acceleration - { - get => Engine.GetComponent(this).acceleration; - set => Engine.GetComponent(this).acceleration = value; - } - - /// - /// The current velocity of the camera. - /// - public float3 Velocity - { - get => Engine.GetComponent(this).velocity; - set => Engine.GetComponent(this).velocity = value; - } - - /// - /// The current angular velocity of the camera. - /// - public float3 AngularVelocity - { - get => Engine.GetComponent(this).angularVelocity; - set => Engine.GetComponent(this).angularVelocity = value; - } - - /// - /// The player's selected block ID in their hand. - /// - /// The selected block. - public BlockIDs SelectedBlock => (BlockIDs)Engine.GetSelectedBlock(this); - - /// - /// The player's selected block color in their hand. - /// - /// The selected block's color. - public BlockColor SelectedColor => new BlockColor(Engine.GetSelectedColor(this)); - - public static void Init() - { - GameEngineManager.AddGameEngine(Engine); - } - } -} \ No newline at end of file diff --git a/TechbloxModdingAPI/Main.cs b/TechbloxModdingAPI/Main.cs index af25bde..a390021 100644 --- a/TechbloxModdingAPI/Main.cs +++ b/TechbloxModdingAPI/Main.cs @@ -71,7 +71,6 @@ namespace TechbloxModdingAPI Input.FakeInput.Init(); // init object-oriented classes Player.Init(); - FlyCam.Init(); Block.Init(); BlockGroup.Init(); Wire.Init(); diff --git a/TechbloxModdingAPI/Player.FlyCamSettings.cs b/TechbloxModdingAPI/Player.FlyCamSettings.cs new file mode 100644 index 0000000..b947477 --- /dev/null +++ b/TechbloxModdingAPI/Player.FlyCamSettings.cs @@ -0,0 +1,51 @@ +using RobocraftX.Physics; +using Svelto.ECS; +using Svelto.ECS.EntityStructs; +using Techblox.FlyCam; +using TechbloxModdingAPI.Blocks; +using TechbloxModdingAPI.Players; +using TechbloxModdingAPI.Utility; +using Unity.Mathematics; +using UnityEngine; + +namespace TechbloxModdingAPI +{ + public partial class Player + { + /// + /// Whether the camera (player) is sprinting. + /// + public bool Sprinting + { + get => playerEngine.GetCharacterStruct(Id).Get().sprinting; + set => playerEngine.GetCharacterStruct(Id).Get().sprinting = value; + } + + /// + /// The speed setting of the camera. + /// + public float Speed + { + get => playerEngine.GetCharacterStruct(Id).Get().speed; + set => playerEngine.GetCharacterStruct(Id).Get().speed = value; + } + + /// + /// The multiplier setting to use when sprinting. + /// + public float SpeedSprintMultiplier + { + get => playerEngine.GetCharacterStruct(Id).Get().speedSprintMultiplier; + set => playerEngine.GetCharacterStruct(Id).Get().speedSprintMultiplier = value; + } + + /// + /// The acceleration setting of the camera. + /// + public float Acceleration + { + get => playerEngine.GetCharacterStruct(Id).Get().acceleration; + set => playerEngine.GetCharacterStruct(Id).Get().acceleration = value; + } + } +} \ No newline at end of file diff --git a/TechbloxModdingAPI/Player.cs b/TechbloxModdingAPI/Player.cs index 7d37f9b..02e28f5 100644 --- a/TechbloxModdingAPI/Player.cs +++ b/TechbloxModdingAPI/Player.cs @@ -1,17 +1,23 @@ using System; +using RobocraftX.Character; using Unity.Mathematics; using RobocraftX.Common; using RobocraftX.Common.Players; +using RobocraftX.Physics; using Svelto.ECS; +using Techblox.Camera; +using Techblox.FlyCam; using TechbloxModdingAPI.Blocks; using TechbloxModdingAPI.Players; +using TechbloxModdingAPI.Utility; +using UnityEngine; namespace TechbloxModdingAPI { /// /// An in-game player character. Any Leo you see is a player. /// - public class Player : IEquatable, IEquatable + public partial class Player : IEquatable, IEquatable { // static functionality private static PlayerEngine playerEngine = new PlayerEngine(); @@ -123,50 +129,33 @@ namespace TechbloxModdingAPI /// The position. public float3 Position { - get - { - return playerEngine.GetLocation(Id); - } - - set - { - playerEngine.SetLocation(Id, value, false); - } - } + get => playerEngine.GetCharacterStruct(Id).Get().position; + set => playerEngine.SetLocation(Id, value, false); + } /// /// The player's current rotation. /// /// The rotation. public float3 Rotation - { - get - { - return playerEngine.GetRotation(Id); - } - - set - { - playerEngine.SetRotation(Id, value); - } - } + { + get => ((Quaternion) (GameState.IsBuildMode() + ? playerEngine.GetCameraStruct(Id).Get().rotation + : playerEngine.GetCharacterStruct(Id).Get().rotation)).eulerAngles; + set => _ = GameState.IsBuildMode() + ? playerEngine.GetCameraStruct(Id).Get().rotation = quaternion.Euler(value) + : playerEngine.GetCharacterStruct(Id).Get().rotation = quaternion.Euler(value); + } /// /// The player's current velocity. /// /// The velocity. public float3 Velocity - { - get - { - return playerEngine.GetLinearVelocity(Id); - } - - set - { - playerEngine.SetLinearVelocity(Id, value); - } - } + { + get => playerEngine.GetCharacterStruct(Id).Get().velocity; + set => playerEngine.GetCharacterStruct(Id).Get().velocity = value; + } /// /// The player's current angular velocity. @@ -174,36 +163,18 @@ namespace TechbloxModdingAPI /// The angular velocity. public float3 AngularVelocity { - get - { - return playerEngine.GetAngularVelocity(Id); - } - - set - { - playerEngine.SetAngularVelocity(Id, value); - } + get => playerEngine.GetCharacterStruct(Id).Get().angularVelocity; + set => playerEngine.GetCharacterStruct(Id).Get().angularVelocity = value; } /// /// The player's mass. /// /// The mass. - public float Mass - { - get - { - return 1f / playerEngine.GetMass(Id).InverseMass; - } - - // FIXME: Setting mass doesn't do anything - /*set - { - playerEngine.SetInverseMass(Id, 1f / value); - }*/ - } + public float Mass => + 1f / playerEngine.GetCharacterStruct(Id).Get().physicsMass.InverseMass; - private float _ping = -1f; + private float _ping = -1f; /// /// The player's latest network ping time. @@ -213,10 +184,10 @@ namespace TechbloxModdingAPI { get { - float? temp = playerEngine.GetLastPingTime(Id, Type); - if (temp.HasValue) + var opt = playerEngine.GetPlayerStruct(Id, Type); + if (opt) { - _ping = temp.Value; + _ping = opt.Get().lastPingTimeSinceLevelLoad ?? _ping; } return _ping; } @@ -227,14 +198,15 @@ namespace TechbloxModdingAPI /// /// The initial health. public float InitialHealth - { - get => playerEngine.GetInitialHealth(Id); + { + get + { + var opt = playerEngine.GetCharacterStruct(Id); + return opt ? opt.Get().initialHealth : -1f; + } - set - { - playerEngine.SetInitialHealth(Id, value); - } - } + set => playerEngine.GetCharacterStruct(Id).Get().initialHealth = value; + } /// /// The player's current health in Simulation (aka Time Running) mode. @@ -242,12 +214,13 @@ namespace TechbloxModdingAPI /// The current health. public float CurrentHealth { - get => playerEngine.GetCurrentHealth(Id); + get + { + var opt = playerEngine.GetCharacterStruct(Id); + return opt ? opt.Get().currentHealth : -1f; + } - set - { - playerEngine.DamagePlayer(Id, CurrentHealth - value); - } + set => playerEngine.GetCharacterStruct(Id).Get().currentHealth = value; } /// @@ -255,14 +228,20 @@ namespace TechbloxModdingAPI /// /// true if damageable; otherwise, false. public bool Damageable - { - get => playerEngine.GetDamageable(Id); + { + get + { + var opt = playerEngine.GetCharacterStruct(Id); + return opt.Get().canTakeDamageStat; + } - set - { - playerEngine.SetDamageable(Id, value); - } - } + set + { + ref var healthStruct = ref playerEngine.GetCharacterStruct(Id).Get(); + healthStruct.canTakeDamage = value; + healthStruct.canTakeDamageStat = value; + } + } /// /// The player's lives when initially entering Simulation (aka Time Running) mode. @@ -270,9 +249,13 @@ namespace TechbloxModdingAPI /// The initial lives. public uint InitialLives { - get => playerEngine.GetInitialLives(Id); + get + { + var opt = playerEngine.GetCharacterStruct(Id); + return opt ? opt.Get().initialLives : uint.MaxValue; + } - set => playerEngine.SetInitialLives(Id, value); + set => playerEngine.GetCharacterStruct(Id).Get().initialLives = value; } /// @@ -281,19 +264,23 @@ namespace TechbloxModdingAPI /// The current lives. public uint CurrentLives { - get => playerEngine.GetCurrentLives(Id); + get + { + var opt = playerEngine.GetCharacterStruct(Id); + return opt ? opt.Get().currentLives : uint.MaxValue; + } - set => playerEngine.SetCurrentLives(Id, value); + set => playerEngine.GetCharacterStruct(Id).Get().currentLives = value; } - /// + /*/// /// Whether the Game Over screen is displayed for the player. /// /// true if game over; otherwise, false. public bool GameOver { get => playerEngine.GetGameOverScreen(Id); - } + }*/ /// /// Whether the player is dead. @@ -313,7 +300,8 @@ namespace TechbloxModdingAPI { get { - return BuildCamera.SelectedBlock; + var optstruct = playerEngine.GetCharacterStruct(Id); + return optstruct ? (BlockIDs) optstruct.Get().SelectedDBPartID : BlockIDs.Invalid; } } @@ -325,7 +313,8 @@ namespace TechbloxModdingAPI { get { - return BuildCamera.SelectedColor; + var optstruct = playerEngine.GetCharacterStruct(Id); + return optstruct ? new BlockColor(optstruct.Get().indexInPalette) : BlockColors.Default; } } @@ -337,7 +326,8 @@ namespace TechbloxModdingAPI { get { - return new BlockColor(playerEngine.GetSelectedColor(Id)); + var optstruct = playerEngine.GetCharacterStruct(Id); + return optstruct ? new BlockColor(optstruct.Get().indexInPalette) : BlockColors.Default; } } @@ -346,9 +336,11 @@ namespace TechbloxModdingAPI /// public Blueprint SelectedBlueprint { - get => playerEngine.GetPlayerStruct(Id, out LocalBlueprintInputStruct lbis) - ? new Blueprint(lbis.selectedBlueprintId) - : null; + get + { + var lbiso = playerEngine.GetPlayerStruct(Id, Type); + return lbiso ? new Blueprint(lbiso.Get().selectedBlueprintId) : null; + } set => BlockGroup._engine.SelectBlueprint(value?.Id ?? uint.MaxValue); } @@ -356,7 +348,7 @@ namespace TechbloxModdingAPI /// The player's mode in time stopped mode, determining what they place. /// public PlayerBuildingMode BuildingMode => (PlayerBuildingMode) playerEngine - .GetCharacterStruct(Id, out _).timeStoppedContext; + .GetCharacterStruct(Id).Get().timeStoppedContext; // object methods @@ -373,7 +365,7 @@ namespace TechbloxModdingAPI float3 location = new float3(x, y, z); if (relative) { - location += playerEngine.GetLocation(Id); + location += Position; } playerEngine.SetLocation(Id, location, exitSeat: exitSeat); } @@ -395,7 +387,7 @@ namespace TechbloxModdingAPI /// Returns the rigid body the player is currently looking at during simulation. /// /// The maximum distance from the player (default is the player's building reach) - /// The block or null if not found + /// The body or null if not found public SimBody GetSimBodyLookedAt(float maxDistance = -1f) { var egid = playerEngine.GetThingLookedAt(Id, maxDistance); @@ -413,11 +405,6 @@ namespace TechbloxModdingAPI 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/TechbloxModdingAPI/Players/FlyCamEngine.cs b/TechbloxModdingAPI/Players/FlyCamEngine.cs deleted file mode 100644 index 7cad252..0000000 --- a/TechbloxModdingAPI/Players/FlyCamEngine.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Svelto.ECS; -using Techblox.FlyCam; -using TechbloxModdingAPI.Engines; -using TechbloxModdingAPI.Utility; - -namespace TechbloxModdingAPI.Players -{ - public class FlyCamEngine : IApiEngine - { - public void Ready() - { - } - - public EntitiesDB entitiesDB { get; set; } - public void Dispose() - { - } - - public string Name => "TechbloxModdingAPIFlyCamEngine"; - public bool isRemovable => false; - - public ref T GetComponent(FlyCam cam) where T : unmanaged, IEntityComponent - { - return ref entitiesDB.QueryEntityOrDefault(cam); - } - - public ushort GetSelectedBlock(FlyCam cam) - { - var oc = entitiesDB.QueryEntityOptional(cam); - return oc ? (ushort) oc.Get().SelectedDBPartID : ushort.MaxValue; - } - - public byte GetSelectedColor(FlyCam cam) - { - var oc = entitiesDB.QueryEntityOptional(cam); - return oc ? oc.Get().indexInPalette : (byte) 255; - } - } -} \ No newline at end of file diff --git a/TechbloxModdingAPI/Players/PlayerBuildingMode.cs b/TechbloxModdingAPI/Players/PlayerBuildingMode.cs index 383e1af..5e75555 100644 --- a/TechbloxModdingAPI/Players/PlayerBuildingMode.cs +++ b/TechbloxModdingAPI/Players/PlayerBuildingMode.cs @@ -5,6 +5,7 @@ BlockMode, ColourMode, ConfigMode, - BlueprintMode + BlueprintMode, + MaterialMode } } \ No newline at end of file diff --git a/TechbloxModdingAPI/Players/PlayerEngine.cs b/TechbloxModdingAPI/Players/PlayerEngine.cs index b4df628..f5fbb26 100644 --- a/TechbloxModdingAPI/Players/PlayerEngine.cs +++ b/TechbloxModdingAPI/Players/PlayerEngine.cs @@ -21,6 +21,7 @@ using HarmonyLib; using RobocraftX.Common; using Svelto.ECS.DataStructures; using TechbloxModdingAPI.Engines; +using TechbloxModdingAPI.Utility; namespace TechbloxModdingAPI.Players { @@ -98,17 +99,6 @@ namespace TechbloxModdingAPI.Players || entitiesDB.Exists(playerId, PlayersExclusiveGroups.RemotePlayers); } - public float3 GetLocation(uint playerId) - { - if (entitiesDB == null) return float3.zero; - ref var rbes = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - return rbes.position; - } - return float3.zero; - } - public bool SetLocation(uint playerId, float3 location, bool exitSeat = true) { if (entitiesDB == null) return false; @@ -131,233 +121,6 @@ namespace TechbloxModdingAPI.Players return false; } - public float3 GetRotation(uint playerId) - { - if (entitiesDB == null) return float3.zero; - ref var rbes = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - return ((Quaternion) rbes.rotation).eulerAngles; - } - return default(float3); - } - - public bool SetRotation(uint playerId, float3 value) - { - if (entitiesDB == null) return false; - ref var rbes = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - Quaternion q = rbes.rotation; - q.eulerAngles = value; - rbes.rotation = q; - return true; - } - return false; - } - - public float3 GetLinearVelocity(uint playerId) - { - if (entitiesDB == null) return float3.zero; - ref var rbes = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - return rbes.velocity; - } - return float3.zero; - } - - public bool SetLinearVelocity(uint playerId, float3 value) - { - if (entitiesDB == null) return false; - ref var rbes = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - rbes.velocity = value; - return true; - } - return false; - } - - public float3 GetAngularVelocity(uint playerId) - { - if (entitiesDB == null) return float3.zero; - ref var rbes = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - return rbes.angularVelocity; - } - return float3.zero; - } - - public bool SetAngularVelocity(uint playerId, float3 value) - { - if (entitiesDB == null) return false; - ref var rbes = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - rbes.angularVelocity = value; - return true; - } - return false; - } - - public PhysicsMass GetMass(uint playerId) - { - if (entitiesDB == null) return default(PhysicsMass); - ref var rbes = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - return rbes.physicsMass; - } - return default(PhysicsMass); - } - - public bool SetInverseMass(uint playerId, float inverseMass) - { - if (entitiesDB == null) return false; - ref var rbes = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - rbes.physicsMass.InverseInertia = inverseMass; - return true; - } - return false; - } - - public float? GetLastPingTime(uint playerId, PlayerType type) - { - if (entitiesDB == null) return null; - EGID egid = new EGID(playerId, PlayerGroupFromEnum(type)); - if (entitiesDB.Exists(egid)) - { - //return entitiesDB.QueryEntity(egid).lastPingTimeSinceLevelLoad; - TODO - } - return null; - } - - public float GetInitialHealth(uint playerId) - { - if (entitiesDB == null) return 0; - ref var c = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - return c.initialHealth; - } - return -1f; - } - - public bool SetInitialHealth(uint playerId, float val) - { - if (entitiesDB == null) return false; - ref var c = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - c.initialHealth = val; - return true; - } - return false; - } - - public float GetCurrentHealth(uint playerId) - { - if (entitiesDB == null) return 0; - ref var c = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - return c.currentHealth; - } - return -1f; - } - - public bool SetCurrentHealth(uint playerId, float val) - { - if (entitiesDB == null) return false; - ref var c = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - c.currentHealth = val; - return true; - } - return false; - } - - public bool DamagePlayer(uint playerId, float amount) - { - if (entitiesDB == null) return false; - return SetCurrentHealth(playerId, GetCurrentHealth(playerId) - amount); - } - - public bool GetDamageable(uint playerId) - { - if (entitiesDB == null) return false; - ref var c = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - return c.canTakeDamageStat; - } - return false; - } - - public bool SetDamageable(uint playerId, bool val) - { - if (entitiesDB == null) return false; - ref var ches = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - ches.canTakeDamage = val; - ches.canTakeDamage = val; - return true; - } - return false; - } - - public uint GetInitialLives(uint playerId) - { - if (entitiesDB == null) return 0; - ref var c = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - return c.initialLives; - } - return uint.MaxValue; - } - - public bool SetInitialLives(uint playerId, uint val) - { - if (entitiesDB == null) return false; - ref var c = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - c.initialLives = val; - return true; - } - return false; - } - - public uint GetCurrentLives(uint playerId) - { - if (entitiesDB == null) return 0; - ref var c = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - return c.currentLives; - } - return uint.MaxValue; - } - - public bool SetCurrentLives(uint playerId, uint val) - { - if (entitiesDB == null) return false; - ref var c = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - c.currentLives = val; - return true; - } - return false; - } - public bool GetGameOverScreen(uint playerId) { if (entitiesDB == null) return false; @@ -372,78 +135,44 @@ namespace TechbloxModdingAPI.Players return entitiesDB.Exists(playerId, CharacterExclusiveGroups.DeadCharacters); } - public int GetSelectedBlock(uint playerId) - { - if (entitiesDB == null) return 0; - ref var c = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - return c.SelectedDBPartID; - } - return ushort.MaxValue; - } - - public byte GetSelectedColor(uint playerId) - { - if (entitiesDB == null) return 0; - ref var c = ref GetCharacterStruct(playerId, out bool exists); - if (exists) - { - return c.indexInPalette; - } - return 255; - } - // reusable methods [MethodImpl(MethodImplOptions.AggressiveInlining)] - private ExclusiveGroup PlayerGroupFromEnum(PlayerType type) + public OptionalRef GetCharacterStruct(uint playerId) where T : unmanaged, IEntityComponent { - return type == PlayerType.Local ? PlayersExclusiveGroups.LocalPlayers : PlayersExclusiveGroups.RemotePlayers; + if (GameState.IsBuildMode()) + return entitiesDB.QueryEntityOptional(new EGID(playerId, Techblox.FlyCam.FlyCam.Group)); + + var characterGroups = CharacterExclusiveGroups.AllCharacters; + for (int i = 0; i < characterGroups.count; i++) + { + EGID egid = new EGID(playerId, characterGroups[i]); + var opt = entitiesDB.QueryEntityOptional(egid); + if (opt.Exists) + return opt; + } + + return new OptionalRef(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ref T GetCharacterStruct(uint playerId, out bool exists) where T : unmanaged, IEntityComponent + public OptionalRef GetPlayerStruct(uint playerId, PlayerType type) where T : unmanaged, IEntityComponent { - var characterGroups = CharacterExclusiveGroups.AllCharacters; - for (int i = 0; i < characterGroups.count; i++) - { - EGID egid = new EGID(playerId, characterGroups[i]); - if (entitiesDB.Exists(egid)) - { - exists = true; - return ref entitiesDB.QueryEntity(egid); - } - } - - exists = false; - T[] arr = new T[1]; - return ref arr[0]; //Return default value + var playerGroup = type == PlayerType.Local ? PlayersExclusiveGroups.LocalPlayers : PlayersExclusiveGroups.RemotePlayers; + EGID egid = new EGID(playerId, playerGroup); + return entitiesDB.QueryEntityOptional(egid); } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool GetPlayerStruct(uint playerId, out T s) where T : unmanaged, IEntityComponent + public OptionalRef GetCameraStruct(uint playerId) where T : unmanaged, IEntityComponent { - var playerGroups = PlayersExclusiveGroups.AllPlayers; - for (int i = 0; i < playerGroups.count; i++) - { - EGID egid = new EGID(playerId, playerGroups[i]); - if (entitiesDB.Exists(egid)) - { - s = entitiesDB.QueryEntity(egid); - return true; - } - } - s = default; - return false; + return entitiesDB.QueryEntityOptional(new EGID(playerId, CameraExclusiveGroups.CameraGroup)); } public EGID GetThingLookedAt(uint playerId, float maxDistance = -1f) { - if (!entitiesDB.TryQueryMappedEntities( - CameraExclusiveGroups.CameraGroup, out var mapper)) - return EGID.Empty; - mapper.TryGetEntity(playerId, out CharacterCameraRayCastEntityStruct rayCast); + var opt = GetCameraStruct(playerId); + if (!opt) return EGID.Empty; + CharacterCameraRayCastEntityStruct rayCast = opt; float distance = maxDistance < 0 ? GhostBlockUtils.GetBuildInteractionDistance(entitiesDB, rayCast, GhostBlockUtils.GhostCastMethod.GhostCastProportionalToBlockSize) diff --git a/TechbloxModdingAPI/TechbloxModdingAPI.csproj b/TechbloxModdingAPI/TechbloxModdingAPI.csproj index 8af0a13..ca99746 100644 --- a/TechbloxModdingAPI/TechbloxModdingAPI.csproj +++ b/TechbloxModdingAPI/TechbloxModdingAPI.csproj @@ -8,6 +8,7 @@ https://git.exmods.org/modtainers/GamecraftModdingAPI en-CA true + 8