|
|
@@ -0,0 +1,158 @@ |
|
|
|
using System; |
|
|
|
using System.Collections; |
|
|
|
using GamecraftModdingAPI; |
|
|
|
using GamecraftModdingAPI.Engines; |
|
|
|
using GamecraftModdingAPI.Utility; |
|
|
|
using RobocraftX.Character; |
|
|
|
using RobocraftX.Character.Camera; |
|
|
|
using RobocraftX.Character.Factories; |
|
|
|
using RobocraftX.Character.Movement; |
|
|
|
using RobocraftX.Common; |
|
|
|
using RobocraftX.Common.Input; |
|
|
|
using RobocraftX.Common.UnityECSWrappers; |
|
|
|
using RobocraftX.UECS; |
|
|
|
using Svelto.ECS; |
|
|
|
using Svelto.Tasks.ExtraLean; |
|
|
|
using Unity.Entities; |
|
|
|
using Unity.Mathematics; |
|
|
|
using Unity.Physics; |
|
|
|
using UnityEngine; |
|
|
|
using Collider = Unity.Physics.Collider; |
|
|
|
using Yield = Svelto.Tasks.Yield; |
|
|
|
|
|
|
|
namespace BuildingTools |
|
|
|
{ |
|
|
|
public class NoClipCommand : IApiEngine |
|
|
|
{ |
|
|
|
private readonly CollisionFilter _collisionFilter = new CollisionFilter |
|
|
|
{ //AddCollidersToRigidBodyEngineUECS._simCubeNoCollisionFilter |
|
|
|
BelongsTo = 0, |
|
|
|
CollidesWith = 239532 |
|
|
|
}; |
|
|
|
|
|
|
|
private EntityManager _entityManager; |
|
|
|
private BlobAssetReference<Collider> _oldCollider; |
|
|
|
private bool _enabled; |
|
|
|
|
|
|
|
private void Enable() |
|
|
|
{ |
|
|
|
if (_entityManager == default) _entityManager = FullGameFields._physicsWorld.EntityManager; |
|
|
|
Logging.CommandLog("Enabling no clip"); |
|
|
|
_oldCollider = ChangeCollider(_collisionFilter, null); |
|
|
|
OnUpdate().RunOn(GamecraftModdingAPI.Tasks.Scheduler.extraLeanRunner); |
|
|
|
_enabled = true; |
|
|
|
Logging.CommandLog("No clip enabled"); |
|
|
|
} |
|
|
|
|
|
|
|
private void Disable() |
|
|
|
{ |
|
|
|
Logging.CommandLog("Disabling no clip"); |
|
|
|
ChangeCollider(null, _oldCollider).Dispose(); //Dispose old (cloned) collider |
|
|
|
_enabled = false; |
|
|
|
Logging.CommandLog("No clip disabled"); |
|
|
|
} |
|
|
|
|
|
|
|
public void Toggle() |
|
|
|
{ |
|
|
|
// ReSharper disable once AssignmentInConditionalExpression |
|
|
|
if (_enabled = !_enabled) Enable(); |
|
|
|
else Disable(); |
|
|
|
} |
|
|
|
|
|
|
|
private IEnumerator OnUpdate() |
|
|
|
{ //ScreenshotTakerCompositionRoot |
|
|
|
while (_enabled) |
|
|
|
{ |
|
|
|
EnsureFlying(); |
|
|
|
//float unscaledDeltaTime = Time.unscaledDeltaTime; |
|
|
|
if (!entitiesDB.Exists<LocalInputEntityStruct>(0U, CommonExclusiveGroups.GameStateGroup)) |
|
|
|
{ |
|
|
|
Disable(); |
|
|
|
yield break; |
|
|
|
} |
|
|
|
|
|
|
|
/*LocalInputEntityStruct localInput = |
|
|
|
entitiesDB.QueryEntity<LocalInputEntityStruct>(0U, |
|
|
|
(ExclusiveGroupStruct) CommonExclusiveGroups.GameStateGroup); |
|
|
|
Vector3 zero = Vector3.zero; |
|
|
|
if (localInput.CheckInputAction(ActionInput.Forward)) |
|
|
|
zero.z = 3f * unscaledDeltaTime; |
|
|
|
if (localInput.CheckInputAction(ActionInput.Backward)) |
|
|
|
zero.z = -3f * unscaledDeltaTime; |
|
|
|
if (localInput.CheckInputAction(ActionInput.Right)) |
|
|
|
zero.x = 3f * unscaledDeltaTime; |
|
|
|
if (localInput.CheckInputAction(ActionInput.Left)) |
|
|
|
zero.x = -3f * unscaledDeltaTime; |
|
|
|
if (localInput.CheckInputAction(ActionInput.Up)) |
|
|
|
zero.y = 3f * unscaledDeltaTime; |
|
|
|
if (localInput.CheckInputAction(ActionInput.Down)) |
|
|
|
zero.y = -3f * unscaledDeltaTime; |
|
|
|
if (localInput.CheckInputAction(ActionInput.Sprint)) |
|
|
|
zero *= 3f; |
|
|
|
var entityViewStruct = |
|
|
|
entitiesDB.QueryUniqueEntity<CharacterCameraTransformEntityViewStruct>( |
|
|
|
(ExclusiveGroupStruct) CameraExclusiveGroups.VisualCameraGroup); |
|
|
|
var rot = entityViewStruct.transformComponent.rotation; //Character camera rotation |
|
|
|
Player.LocalPlayer.Position += (float3) ((Quaternion) rot * zero);*/ |
|
|
|
yield return Yield.It; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private BlobAssetReference<Collider> ChangeCollider(CollisionFilter? newFilter, BlobAssetReference<Collider>? newCollider) |
|
|
|
{ |
|
|
|
foreach (var group in CharacterExclusiveGroups.AllCharacters) |
|
|
|
{ |
|
|
|
if (!entitiesDB.Exists<UECSPhysicsEntityStruct>(new EGID(Player.LocalPlayer.Id, group))) |
|
|
|
continue; |
|
|
|
ref var uecsEntity = |
|
|
|
ref entitiesDB.QueryEntity<UECSPhysicsEntityStruct>(new EGID(Player.LocalPlayer.Id, group)); |
|
|
|
var collider = _entityManager.GetComponentData<PhysicsCollider>(uecsEntity.uecsEntity); |
|
|
|
var oldCollider = collider.Value; |
|
|
|
if (newFilter.HasValue) |
|
|
|
{ |
|
|
|
unsafe |
|
|
|
{ |
|
|
|
var colRef = ColliderUtilityUECS.ClonePhysicsCollider(collider.ColliderPtr, newFilter.Value); |
|
|
|
collider.Value = colRef; |
|
|
|
} |
|
|
|
} |
|
|
|
else if (newCollider.HasValue) |
|
|
|
collider.Value = newCollider.Value; |
|
|
|
_entityManager.SetComponentData(uecsEntity.uecsEntity, collider); |
|
|
|
return oldCollider; |
|
|
|
} |
|
|
|
|
|
|
|
throw new InvalidOperationException("No character physics found!"); |
|
|
|
} |
|
|
|
|
|
|
|
private void EnsureFlying() |
|
|
|
{ |
|
|
|
foreach (ref var ent in entitiesDB.QueryEntities<CharacterMovementEntityStruct>(CharacterExclusiveGroups.AllCharacters).entities) |
|
|
|
{ |
|
|
|
ent.moveState = MovementState.Flying; |
|
|
|
//ent.inputMovement = default; //Don't allow regular movement - doesn't do anything |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/*private void DisableInput(bool disabled) |
|
|
|
{ - Disables way more than movements |
|
|
|
ref var inputDisabled = ref entitiesDB.QueryEntity<PlayerInputDisabledStruct>(CommonExclusiveGroups.GameStateEGID); |
|
|
|
if (disabled) |
|
|
|
inputDisabled.PushMouseAndKeyboard(false); |
|
|
|
else |
|
|
|
inputDisabled.PopMouseAndKeyboard(false); |
|
|
|
}*/ |
|
|
|
|
|
|
|
public void Ready() |
|
|
|
{ |
|
|
|
} |
|
|
|
|
|
|
|
public EntitiesDB entitiesDB { get; set; } |
|
|
|
public void Dispose() |
|
|
|
{ |
|
|
|
} |
|
|
|
|
|
|
|
public string Name { get; } = "BuildingToolsNoClipEngine"; |
|
|
|
public bool isRemovable { get; } = true; |
|
|
|
} |
|
|
|
} |