Add noClip command (replacing the collision filter)
This commit is contained in:
parent
3a0370a94b
commit
eee219f537
3 changed files with 164 additions and 0 deletions
|
@ -127,6 +127,10 @@ namespace BuildingTools
|
||||||
{
|
{
|
||||||
new Player(PlayerType.Local).AngularVelocity += new float3(x, y, z);
|
new Player(PlayerType.Local).AngularVelocity += new float3(x, y, z);
|
||||||
}).Build();
|
}).Build();
|
||||||
|
var noClip = new NoClipCommand();
|
||||||
|
GameEngineManager.AddGameEngine(noClip);
|
||||||
|
CommandBuilder.Builder("noClip", "Allows you to go through blocks. Run again to disable.")
|
||||||
|
.Action(noClip.Toggle).Build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetBlockInfo()
|
private string GetBlockInfo()
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
<AssemblyName>BuildingTools</AssemblyName>
|
<AssemblyName>BuildingTools</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
@ -35,6 +36,7 @@
|
||||||
<Compile Include="BuildingTools.cs" />
|
<Compile Include="BuildingTools.cs" />
|
||||||
<Compile Include="BlockSelections.cs" />
|
<Compile Include="BlockSelections.cs" />
|
||||||
<Compile Include="CommandUtils.cs" />
|
<Compile Include="CommandUtils.cs" />
|
||||||
|
<Compile Include="NoClipCommand.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="0Harmony, Version=2.0.1.0, Culture=neutral, PublicKeyToken=null">
|
<Reference Include="0Harmony, Version=2.0.1.0, Culture=neutral, PublicKeyToken=null">
|
||||||
|
|
158
BuildingTools/NoClipCommand.cs
Normal file
158
BuildingTools/NoClipCommand.cs
Normal file
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue