upd
This commit is contained in:
parent
a6f2e43c49
commit
160429eae6
@ -54539,7 +54539,7 @@
|
||||
m_hipBoneName = "pelvis"
|
||||
m_flHipBoneTranslationScale = 1.0
|
||||
m_nEffectedBoneCount = 3
|
||||
m_flMaxImpactForce = 250.0
|
||||
m_flMaxImpactForce = 310.0
|
||||
m_flMinImpactForce = 50.0
|
||||
m_flWhipImpactScale = 1.0
|
||||
m_flCounterRotationScale = 0.6
|
||||
|
||||
@ -1,30 +1,42 @@
|
||||
Layer0 {
|
||||
shader "shaders/complex.shader"
|
||||
//---- PBR ----
|
||||
F_SPECULAR "1"
|
||||
//---- Ambient Occlusion ----
|
||||
g_flAmbientOcclusionDirectDiffuse "0.000"
|
||||
g_flAmbientOcclusionDirectSpecular "0.000"
|
||||
TextureAmbientOcclusion "materials/default/default_ao.tga"
|
||||
//---- Color ----
|
||||
g_flModelTintAmount "1.000"
|
||||
g_vColorTint "[1.000000 1.000000 1.000000 1.000000]"
|
||||
TextureColor "textures/building/taras-petrenko-map_0002_base_color.png"
|
||||
//---- Normal ----
|
||||
TextureNormal "textures/building/taras-petrenko-map_0001_nrml_norm.png"
|
||||
//---- Roughness ----
|
||||
g_flRoughnessScaleFactor "0.500000"
|
||||
TextureRoughness "textures/building/roughness.png"
|
||||
//---- Metalness ----
|
||||
g_flMetalness "0.000000"
|
||||
//---- Fade ----
|
||||
g_flFadeExponent "1.000"
|
||||
//---- Fog ----
|
||||
g_bFogEnabled "1"
|
||||
//---- Texture Coordinates ----
|
||||
g_nScaleTexCoordUByModelScaleAxis "0"
|
||||
g_nScaleTexCoordVByModelScaleAxis "0"
|
||||
g_vTexCoordOffset "[0.000 0.000]"
|
||||
g_vTexCoordScale "[1.000 1.000]"
|
||||
g_vTexCoordScrollSpeed "[0.000 0.000]"
|
||||
// THIS FILE IS AUTO-GENERATED
|
||||
|
||||
Layer0
|
||||
{
|
||||
shader "shaders/complex.shader"
|
||||
|
||||
//---- PBR ----
|
||||
F_SPECULAR 1
|
||||
|
||||
//---- Ambient Occlusion ----
|
||||
g_flAmbientOcclusionDirectDiffuse "0.000"
|
||||
g_flAmbientOcclusionDirectSpecular "0.000"
|
||||
TextureAmbientOcclusion "materials/default/default_ao.tga"
|
||||
|
||||
//---- Color ----
|
||||
g_flModelTintAmount "1.000"
|
||||
g_vColorTint "[1.000000 1.000000 1.000000 1.000000]"
|
||||
TextureColor "textures/building/taras-petrenko-map_0002_base_color.png"
|
||||
|
||||
//---- Fade ----
|
||||
g_flFadeExponent "1.000"
|
||||
|
||||
//---- Fog ----
|
||||
g_bFogEnabled "1"
|
||||
|
||||
//---- Metalness ----
|
||||
g_flMetalness "0.000"
|
||||
|
||||
//---- Normal ----
|
||||
TextureNormal "textures/building/taras-petrenko-map_0001_nrml_norm.png"
|
||||
|
||||
//---- Roughness ----
|
||||
g_flRoughnessScaleFactor "0.500"
|
||||
TextureRoughness "textures/building/roughness.png"
|
||||
|
||||
//---- Texture Coordinates ----
|
||||
g_nScaleTexCoordUByModelScaleAxis "0"
|
||||
g_nScaleTexCoordVByModelScaleAxis "0"
|
||||
g_vTexCoordOffset "[0.000 0.000]"
|
||||
g_vTexCoordScale "[1.000 1.000]"
|
||||
g_vTexCoordScrollSpeed "[0.000 0.000]"
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
56
Code/AI/Enemy.Footsteps.cs
Normal file
56
Code/AI/Enemy.Footsteps.cs
Normal file
@ -0,0 +1,56 @@
|
||||
public sealed partial class Enemy
|
||||
{
|
||||
public bool DebugFootsteps = false;
|
||||
public bool EnableFootstepSounds = true;
|
||||
private TimeSince _timeSinceStep;
|
||||
|
||||
private void OnFootstepEvent( SceneModel.FootstepEvent e )
|
||||
{
|
||||
if ( EnableFootstepSounds && !(_timeSinceStep < 0.2f) )
|
||||
{
|
||||
_timeSinceStep = 0f;
|
||||
PlayFootstepSound( e.Transform.Position, e.Volume, e.FootId );
|
||||
}
|
||||
}
|
||||
|
||||
[Rpc.Broadcast]
|
||||
public void PlayFootstepSound( Vector3 worldPosition, float volume, int foot )
|
||||
{
|
||||
SceneTrace trace = Scene.Trace;
|
||||
Vector3 from = worldPosition + WorldRotation.Up * 10f;
|
||||
Vector3 to = worldPosition + WorldRotation.Down * 20f;
|
||||
SceneTraceResult sceneTraceResult = trace.Ray( in from, in to ).IgnoreGameObjectHierarchy( GameObject ).Run();
|
||||
if ( !sceneTraceResult.Hit || sceneTraceResult.Surface == null )
|
||||
{
|
||||
if ( DebugFootsteps )
|
||||
{
|
||||
DebugOverlay.Sphere( new Sphere( worldPosition, volume ), Color.Red, 10f, default, overlay: true );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
SoundEvent soundEvent = ResourceLibrary.Get<SoundEvent>( (foot == 0)
|
||||
? sceneTraceResult.Surface.Sounds.FootLeft
|
||||
: sceneTraceResult.Surface.Sounds.FootRight );
|
||||
if ( soundEvent == null )
|
||||
{
|
||||
if ( DebugFootsteps )
|
||||
{
|
||||
DebugOverlay.Sphere( new Sphere( worldPosition, volume ), Color.Orange, 10f, default, overlay: true );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
SoundHandle soundHandle = GameObject.PlaySound( soundEvent, 0f );
|
||||
// soundHandle.TargetMixer = FootstepMixer.GetOrDefault();
|
||||
// soundHandle.Volume *= volume * FootstepVolume;
|
||||
if ( DebugFootsteps )
|
||||
{
|
||||
DebugOverlay.Sphere( new Sphere( worldPosition, volume ), default, 10f, default, overlay: true );
|
||||
DebugOverlay.Text( worldPosition, soundEvent.ResourceName ?? "", 14f, TextFlag.LeftTop, default, 10f,
|
||||
default );
|
||||
}
|
||||
}
|
||||
}
|
||||
54
Code/Gravity/InteractTeleporter.cs
Normal file
54
Code/Gravity/InteractTeleporter.cs
Normal file
@ -0,0 +1,54 @@
|
||||
namespace Sandbox.Gravity;
|
||||
|
||||
public sealed class InteractTeleporter : Component, Component.ITriggerListener
|
||||
{
|
||||
[Property] public GameObject ToPosGameObject { get; set; }
|
||||
|
||||
[Property, Sync] public List<Dedugan> Players { get; set; } = new();
|
||||
|
||||
public void OnTriggerEnter( Collider other )
|
||||
{
|
||||
var otherEntity = other.GameObject;
|
||||
if ( otherEntity.Components.TryGet<Dedugan>( out var controller ) )
|
||||
{
|
||||
Players.Add( controller );
|
||||
}
|
||||
}
|
||||
|
||||
public void OnTriggerExit( Collider other )
|
||||
{
|
||||
var otherEntity = other.GameObject;
|
||||
|
||||
if ( otherEntity.Components.TryGet<Dedugan>( out var controller ) )
|
||||
{
|
||||
Players.Remove( controller );
|
||||
}
|
||||
}
|
||||
|
||||
public void TeleportAll()
|
||||
{
|
||||
foreach ( var controller in Players )
|
||||
{
|
||||
Teleport( controller );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[Rpc.Broadcast]
|
||||
public void Teleport( Dedugan controller )
|
||||
{
|
||||
controller.OverrideGravity = WorldRotation.Down;
|
||||
controller.GameObject.WorldPosition = ToPosGameObject.WorldPosition;
|
||||
controller.EyeAngles = new Angles( 0, ToPosGameObject.WorldRotation.Yaw(), 0 ).ToRotation();
|
||||
controller.Renderer.LocalRotation = new Angles( 0, ToPosGameObject.WorldRotation.Yaw(), 0 ).ToRotation();
|
||||
}
|
||||
|
||||
[Rpc.Broadcast]
|
||||
public void Teleport( Dedugan controller, Vector3 toPos )
|
||||
{
|
||||
controller.OverrideGravity = WorldRotation.Down;
|
||||
controller.GameObject.WorldPosition = toPos;
|
||||
controller.EyeAngles = new Angles( 0, ToPosGameObject.WorldRotation.Yaw(), 0 ).ToRotation();
|
||||
controller.Renderer.LocalRotation = new Angles( 0, ToPosGameObject.WorldRotation.Yaw(), 0 ).ToRotation();
|
||||
}
|
||||
}
|
||||
@ -12,8 +12,6 @@ public sealed class Teleporter : Component, Component.ITriggerListener
|
||||
// [Property] public bool ResetGravity { get; set; } = false;
|
||||
// [Property] public bool NormalGravity { get; set; } = true;
|
||||
|
||||
|
||||
|
||||
[Property] public GravityType gravityType { get; set; } = GravityType.Down;
|
||||
|
||||
public void OnTriggerEnter( Collider other )
|
||||
|
||||
@ -1,6 +1,4 @@
|
||||
using Sandbox;
|
||||
|
||||
public sealed partial class Dedugan
|
||||
public sealed partial class Dedugan
|
||||
{
|
||||
void UpdateCustomAnimations()
|
||||
{
|
||||
|
||||
@ -1,11 +1,27 @@
|
||||
public sealed partial class Dedugan
|
||||
using Sandbox.Citizen;
|
||||
|
||||
public sealed partial class Dedugan
|
||||
{
|
||||
private float anotherPivot;
|
||||
private Vector3 pivotOffset;
|
||||
private void RotateCamera()
|
||||
{
|
||||
if ( Input.Keyboard.Pressed( "Q" ) )
|
||||
{
|
||||
anotherPivot = 40f;
|
||||
}
|
||||
|
||||
if ( Input.Keyboard.Pressed( "E" ) )
|
||||
{
|
||||
anotherPivot = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (RagdollController.Enabled)
|
||||
{
|
||||
var offset = RagdollController.WorldRotation.Up * 20f - Camera.WorldRotation.Forward * 200f;
|
||||
Camera.WorldPosition = Vector3.Lerp(Camera.WorldPosition, RagdollController.WorldPosition + offset, Time.Delta * 5f);
|
||||
var off = RagdollController.WorldRotation.Up * 20f - Camera.WorldRotation.Forward * 200f;
|
||||
Camera.WorldPosition = Vector3.Lerp(Camera.WorldPosition, RagdollController.WorldPosition + off, Time.Delta * 5f);
|
||||
Camera.LocalRotation = Rotation.Lerp(Camera.LocalRotation, EyeAngles.ToRotation(), Time.Delta * 2f);
|
||||
}
|
||||
else
|
||||
@ -15,11 +31,22 @@
|
||||
// Camera.LocalPosition = offset * Camera.LocalRotation;
|
||||
|
||||
Camera.LocalRotation = EyeAngles.ToRotation();
|
||||
var pivotOffset = CameraPivot.LocalRotation.Backward * CamOffsetX;
|
||||
|
||||
|
||||
var localPitchOffset = Camera.LocalRotation.Down * MathF.Max( 0f, EyeAngles.pitch ) * 0.32f +
|
||||
Camera.LocalRotation.Backward * MathF.Max( 0f, EyeAngles.pitch ) * 0.7f +
|
||||
Camera.LocalRotation.Up * MathF.Min( 0f, EyeAngles.pitch ) * 0.5f +
|
||||
Camera.LocalRotation.Backward * MathF.Min( 0f, EyeAngles.pitch ) * 0.8f;
|
||||
Camera.LocalRotation.Backward * MathF.Min( 0f, EyeAngles.pitch ) * 0.8f +
|
||||
Camera.LocalRotation.Right * -anotherPivot;
|
||||
|
||||
if ( AnimationHelper.HoldType == CitizenAnimationHelper.HoldTypes.Pistol )
|
||||
{
|
||||
pivotOffset = CameraPivot.LocalRotation.Backward * CamOffsetX * 0.5f + CameraPivot.LocalRotation.Up * 8f;
|
||||
}
|
||||
else
|
||||
{
|
||||
pivotOffset = CameraPivot.LocalRotation.Backward * CamOffsetX;
|
||||
}
|
||||
|
||||
var offset = (CameraPivot.LocalPosition + pivotOffset ) * EyeAngles.ToRotation() + localPitchOffset;
|
||||
Camera.LocalPosition = offset;
|
||||
|
||||
56
Code/Player/Dedugan.Footsteps.cs
Normal file
56
Code/Player/Dedugan.Footsteps.cs
Normal file
@ -0,0 +1,56 @@
|
||||
public sealed partial class Dedugan
|
||||
{
|
||||
public bool DebugFootsteps = false;
|
||||
public bool EnableFootstepSounds = true;
|
||||
private TimeSince _timeSinceStep;
|
||||
|
||||
private void OnFootstepEvent( SceneModel.FootstepEvent e )
|
||||
{
|
||||
if ( Controller.IsOnGround && EnableFootstepSounds && !(_timeSinceStep < 0.2f) )
|
||||
{
|
||||
_timeSinceStep = 0f;
|
||||
PlayFootstepSound( e.Transform.Position, e.Volume, e.FootId );
|
||||
}
|
||||
}
|
||||
|
||||
[Rpc.Broadcast]
|
||||
public void PlayFootstepSound( Vector3 worldPosition, float volume, int foot )
|
||||
{
|
||||
SceneTrace trace = Scene.Trace;
|
||||
Vector3 from = worldPosition + WorldRotation.Up * 10f;
|
||||
Vector3 to = worldPosition + WorldRotation.Down * 20f;
|
||||
SceneTraceResult sceneTraceResult = trace.Ray( in from, in to ).IgnoreGameObjectHierarchy( GameObject ).Run();
|
||||
if ( !sceneTraceResult.Hit || sceneTraceResult.Surface == null )
|
||||
{
|
||||
if ( DebugFootsteps )
|
||||
{
|
||||
DebugOverlay.Sphere( new Sphere( worldPosition, volume ), Color.Red, 10f, default, overlay: true );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
SoundEvent soundEvent = ResourceLibrary.Get<SoundEvent>( (foot == 0)
|
||||
? sceneTraceResult.Surface.Sounds.FootLeft
|
||||
: sceneTraceResult.Surface.Sounds.FootRight );
|
||||
if ( soundEvent == null )
|
||||
{
|
||||
if ( DebugFootsteps )
|
||||
{
|
||||
DebugOverlay.Sphere( new Sphere( worldPosition, volume ), Color.Orange, 10f, default, overlay: true );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
SoundHandle soundHandle = GameObject.PlaySound( soundEvent, 0f );
|
||||
// soundHandle.TargetMixer = FootstepMixer.GetOrDefault();
|
||||
// soundHandle.Volume *= volume * FootstepVolume;
|
||||
if ( DebugFootsteps )
|
||||
{
|
||||
DebugOverlay.Sphere( new Sphere( worldPosition, volume ), default, 10f, default, overlay: true );
|
||||
DebugOverlay.Text( worldPosition, soundEvent.ResourceName ?? "", 14f, TextFlag.LeftTop, default, 10f,
|
||||
default );
|
||||
}
|
||||
}
|
||||
}
|
||||
26
Code/Player/Dedugan.Hit.cs
Normal file
26
Code/Player/Dedugan.Hit.cs
Normal file
@ -0,0 +1,26 @@
|
||||
using System.Threading.Tasks;
|
||||
|
||||
public sealed partial class Dedugan
|
||||
{
|
||||
[Rpc.Broadcast]
|
||||
public void ReportHit( Vector3 dir, int boneIndex, int damage = 10 )
|
||||
{
|
||||
Renderer.Set( "hit", true );
|
||||
Renderer.Set( "hit_bone", boneIndex );
|
||||
Renderer.Set( "hit_direction", dir );
|
||||
Renderer.Set( "hit_offset", dir );
|
||||
Renderer.Set( "hit_strength", 1 );
|
||||
|
||||
Health -= damage;
|
||||
if ( Health <= 0 )
|
||||
{
|
||||
_ = RunReportHitAsync();
|
||||
}
|
||||
}
|
||||
|
||||
private async Task RunReportHitAsync()
|
||||
{
|
||||
await GameTask.DelaySeconds( 0.1f );
|
||||
RagdollController.Enabled = true;
|
||||
}
|
||||
}
|
||||
@ -5,215 +5,212 @@ using System.Linq;
|
||||
|
||||
public sealed partial class Dedugan : Component
|
||||
{
|
||||
public Component Pressed { get; set; }
|
||||
public bool EnablePressing { get; set; } = true;
|
||||
public Component Hovered { get; set; }
|
||||
public Component Pressed { get; set; }
|
||||
public bool EnablePressing { get; set; } = true;
|
||||
public Component Hovered { get; set; }
|
||||
|
||||
[Sync(SyncFlags.Interpolate)]
|
||||
public Vector3 TracedHitPos { get; set; }
|
||||
[Sync]
|
||||
public bool CameraTraceIsHit { get; set; }
|
||||
public Vector3 TracedHitNormal { get; set; }
|
||||
[Sync( SyncFlags.Interpolate )] public Vector3 TracedHitPos { get; set; }
|
||||
[Sync] public bool CameraTraceIsHit { get; set; }
|
||||
public Vector3 TracedHitNormal { get; set; }
|
||||
|
||||
// private TimeSince HoldTime = 0;
|
||||
// private bool Holding = false;
|
||||
// private bool HoldingInteractionHappened = false;
|
||||
// private TimeSince HoldTime = 0;
|
||||
// private bool Holding = false;
|
||||
// private bool HoldingInteractionHappened = false;
|
||||
|
||||
void InteractionsUpdate()
|
||||
{
|
||||
if (!EnablePressing)
|
||||
{
|
||||
// Holding = false;
|
||||
// HoldingInteractionHappened = false;
|
||||
return;
|
||||
}
|
||||
void InteractionsUpdate()
|
||||
{
|
||||
if ( !EnablePressing )
|
||||
{
|
||||
// Holding = false;
|
||||
// HoldingInteractionHappened = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Pressed.IsValid())
|
||||
{
|
||||
UpdatePressed();
|
||||
}
|
||||
else
|
||||
{
|
||||
UpdateHovered();
|
||||
}
|
||||
}
|
||||
if ( Pressed.IsValid() )
|
||||
{
|
||||
UpdatePressed();
|
||||
}
|
||||
else
|
||||
{
|
||||
UpdateHovered();
|
||||
}
|
||||
|
||||
private void UpdatePressed()
|
||||
{
|
||||
bool flag = Input.Down("use");
|
||||
if ( Input.Pressed( "Ragdoll" ) )
|
||||
{
|
||||
Health = 100;
|
||||
}
|
||||
}
|
||||
|
||||
if (flag && Pressed.Components.TryGet<IPressable>(out var pressable))
|
||||
{
|
||||
flag = pressable.Pressing(new IPressable.Event
|
||||
{
|
||||
Ray = new Ray(Camera.WorldPosition, EyeAngles.ToRotation().Forward),
|
||||
Source = this
|
||||
});
|
||||
}
|
||||
private void UpdatePressed()
|
||||
{
|
||||
bool flag = Input.Down( "use" );
|
||||
|
||||
if (GetDistanceFromGameObject(Pressed.GameObject, Camera.WorldPosition) > InteractDistance)
|
||||
{
|
||||
flag = false;
|
||||
}
|
||||
if ( flag && Pressed.Components.TryGet<IPressable>( out var pressable ) )
|
||||
{
|
||||
flag = pressable.Pressing( new IPressable.Event
|
||||
{
|
||||
Ray = new Ray( Camera.WorldPosition, EyeAngles.ToRotation().Forward ), Source = this
|
||||
} );
|
||||
}
|
||||
|
||||
if (!flag)
|
||||
{
|
||||
StopPressing();
|
||||
}
|
||||
}
|
||||
if ( GetDistanceFromGameObject( Pressed.GameObject, Camera.WorldPosition ) > InteractDistance )
|
||||
{
|
||||
flag = false;
|
||||
}
|
||||
|
||||
private void UpdateHovered()
|
||||
{
|
||||
SwitchHovered(TryGetLookedAt());
|
||||
if ( !flag )
|
||||
{
|
||||
StopPressing();
|
||||
}
|
||||
}
|
||||
|
||||
if (Hovered is IPressable pressable)
|
||||
{
|
||||
pressable.Look(new IPressable.Event
|
||||
{
|
||||
Ray = new Ray(Camera.WorldPosition, EyeAngles.ToRotation().Forward),
|
||||
Source = this
|
||||
});
|
||||
}
|
||||
private void UpdateHovered()
|
||||
{
|
||||
SwitchHovered( TryGetLookedAt() );
|
||||
|
||||
if (Input.Down("use"))
|
||||
{
|
||||
StartPressing(Hovered);
|
||||
}
|
||||
}
|
||||
if ( Hovered is IPressable pressable )
|
||||
{
|
||||
pressable.Look( new IPressable.Event
|
||||
{
|
||||
Ray = new Ray( Camera.WorldPosition, EyeAngles.ToRotation().Forward ), Source = this
|
||||
} );
|
||||
}
|
||||
|
||||
public void StartPressing(Component obj)
|
||||
{
|
||||
StopPressing();
|
||||
if (!obj.IsValid())
|
||||
{
|
||||
ISceneEvent<PlayerController.IEvents>.PostToGameObject(GameObject, x => x.FailPressing());
|
||||
return;
|
||||
}
|
||||
if ( Input.Down( "use" ) )
|
||||
{
|
||||
StartPressing( Hovered );
|
||||
}
|
||||
}
|
||||
|
||||
var component = obj.Components.Get<IPressable>(FindMode.EnabledInSelfAndDescendants);
|
||||
if (component != null)
|
||||
{
|
||||
var pressEvent = new IPressable.Event
|
||||
{
|
||||
Ray = new Ray(Camera.WorldPosition, EyeAngles.ToRotation().Forward),
|
||||
Source = this
|
||||
};
|
||||
public void StartPressing( Component obj )
|
||||
{
|
||||
StopPressing();
|
||||
if ( !obj.IsValid() )
|
||||
{
|
||||
ISceneEvent<PlayerController.IEvents>.PostToGameObject( GameObject, x => x.FailPressing() );
|
||||
return;
|
||||
}
|
||||
|
||||
if (!component.CanPress(pressEvent))
|
||||
{
|
||||
ISceneEvent<PlayerController.IEvents>.PostToGameObject(GameObject, x => x.FailPressing());
|
||||
return;
|
||||
}
|
||||
var component = obj.Components.Get<IPressable>( FindMode.EnabledInSelfAndDescendants );
|
||||
if ( component != null )
|
||||
{
|
||||
var pressEvent = new IPressable.Event
|
||||
{
|
||||
Ray = new Ray( Camera.WorldPosition, EyeAngles.ToRotation().Forward ), Source = this
|
||||
};
|
||||
|
||||
component.Press(pressEvent);
|
||||
}
|
||||
if ( !component.CanPress( pressEvent ) )
|
||||
{
|
||||
ISceneEvent<PlayerController.IEvents>.PostToGameObject( GameObject, x => x.FailPressing() );
|
||||
return;
|
||||
}
|
||||
|
||||
Pressed = obj;
|
||||
component.Press( pressEvent );
|
||||
}
|
||||
|
||||
if (Pressed.IsValid())
|
||||
{
|
||||
ISceneEvent<PlayerController.IEvents>.PostToGameObject(GameObject, x => x.StartPressing(Pressed));
|
||||
}
|
||||
}
|
||||
Pressed = obj;
|
||||
|
||||
public void StopPressing()
|
||||
{
|
||||
if (Pressed.IsValid())
|
||||
{
|
||||
ISceneEvent<PlayerController.IEvents>.PostToGameObject(GameObject, x => x.StopPressing(Pressed));
|
||||
if ( Pressed.IsValid() )
|
||||
{
|
||||
ISceneEvent<PlayerController.IEvents>.PostToGameObject( GameObject, x => x.StartPressing( Pressed ) );
|
||||
}
|
||||
}
|
||||
|
||||
if (Pressed is IPressable pressable)
|
||||
{
|
||||
pressable.Release(new IPressable.Event
|
||||
{
|
||||
Ray = new Ray(Camera.WorldPosition, EyeAngles.ToRotation().Forward),
|
||||
Source = this
|
||||
});
|
||||
}
|
||||
public void StopPressing()
|
||||
{
|
||||
if ( Pressed.IsValid() )
|
||||
{
|
||||
ISceneEvent<PlayerController.IEvents>.PostToGameObject( GameObject, x => x.StopPressing( Pressed ) );
|
||||
|
||||
Pressed = null;
|
||||
}
|
||||
}
|
||||
if ( Pressed is IPressable pressable )
|
||||
{
|
||||
pressable.Release( new IPressable.Event
|
||||
{
|
||||
Ray = new Ray( Camera.WorldPosition, EyeAngles.ToRotation().Forward ), Source = this
|
||||
} );
|
||||
}
|
||||
|
||||
private void SwitchHovered(Component obj)
|
||||
{
|
||||
var e = new IPressable.Event
|
||||
{
|
||||
Ray = new Ray(Camera.WorldPosition, EyeAngles.ToRotation().Forward),
|
||||
Source = this
|
||||
};
|
||||
Pressed = null;
|
||||
}
|
||||
}
|
||||
|
||||
if (Hovered == obj)
|
||||
{
|
||||
if (Hovered is IPressable pressable)
|
||||
pressable.Look(e);
|
||||
return;
|
||||
}
|
||||
private void SwitchHovered( Component obj )
|
||||
{
|
||||
var e = new IPressable.Event
|
||||
{
|
||||
Ray = new Ray( Camera.WorldPosition, EyeAngles.ToRotation().Forward ), Source = this
|
||||
};
|
||||
|
||||
if (Hovered is IPressable oldPressable)
|
||||
oldPressable.Blur(e);
|
||||
if ( Hovered == obj )
|
||||
{
|
||||
if ( Hovered is IPressable pressable )
|
||||
pressable.Look( e );
|
||||
return;
|
||||
}
|
||||
|
||||
Hovered = obj;
|
||||
if ( Hovered is IPressable oldPressable )
|
||||
oldPressable.Blur( e );
|
||||
|
||||
if (Hovered is IPressable newPressable)
|
||||
{
|
||||
newPressable.Hover(e);
|
||||
newPressable.Look(e);
|
||||
}
|
||||
}
|
||||
Hovered = obj;
|
||||
|
||||
private Component TryGetLookedAt()
|
||||
{
|
||||
for (float num = 0f; num <= 4f; num += 2f)
|
||||
{
|
||||
var from = Scene.Camera.WorldPosition + Scene.Camera.WorldRotation.Forward;
|
||||
var to = from + Scene.Camera.WorldRotation.Forward * (InteractDistance - num);
|
||||
var trace = Scene.Trace.Ray(from, to).IgnoreGameObjectHierarchy(GameObject).Radius(num).Run();
|
||||
if ( Hovered is IPressable newPressable )
|
||||
{
|
||||
newPressable.Hover( e );
|
||||
newPressable.Look( e );
|
||||
}
|
||||
}
|
||||
|
||||
TracedHitPos = trace.Hit ? trace.HitPosition : trace.EndPosition;
|
||||
CameraTraceIsHit = trace.Hit;
|
||||
TracedHitNormal = trace.Normal;
|
||||
private Component TryGetLookedAt()
|
||||
{
|
||||
for ( float num = 0f; num <= 4f; num += 2f )
|
||||
{
|
||||
var from = Scene.Camera.WorldPosition + Scene.Camera.WorldRotation.Forward;
|
||||
var to = from + Scene.Camera.WorldRotation.Forward * (InteractDistance - num);
|
||||
var trace = Scene.Trace.Ray( from, to ).IgnoreGameObjectHierarchy( GameObject ).Radius( num ).Run();
|
||||
|
||||
if (!trace.Hit || !trace.GameObject.IsValid()) continue;
|
||||
TracedHitPos = trace.Hit ? trace.HitPosition : trace.EndPosition;
|
||||
CameraTraceIsHit = trace.Hit;
|
||||
TracedHitNormal = trace.Normal;
|
||||
|
||||
Component foundComponent = null;
|
||||
if ( !trace.Hit || !trace.GameObject.IsValid() ) continue;
|
||||
|
||||
ISceneEvent<PlayerController.IEvents>.PostToGameObject(GameObject, x =>
|
||||
{
|
||||
foundComponent = x.GetUsableComponent(trace.GameObject) ?? foundComponent;
|
||||
});
|
||||
Component foundComponent = null;
|
||||
|
||||
if (foundComponent.IsValid()) return foundComponent;
|
||||
ISceneEvent<PlayerController.IEvents>.PostToGameObject( GameObject, x =>
|
||||
{
|
||||
foundComponent = x.GetUsableComponent( trace.GameObject ) ?? foundComponent;
|
||||
} );
|
||||
|
||||
foreach (var component in trace.GameObject.Components.GetAll<IPressable>())
|
||||
{
|
||||
if (component.CanPress(new IPressable.Event
|
||||
{
|
||||
Ray = new Ray(Camera.WorldPosition, EyeAngles.ToRotation().Forward),
|
||||
Source = this
|
||||
}))
|
||||
{
|
||||
return component as Component;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( foundComponent.IsValid() ) return foundComponent;
|
||||
|
||||
return null;
|
||||
}
|
||||
foreach ( var component in trace.GameObject.Components.GetAll<IPressable>() )
|
||||
{
|
||||
if ( component.CanPress( new IPressable.Event
|
||||
{
|
||||
Ray = new Ray( Camera.WorldPosition, EyeAngles.ToRotation().Forward ), Source = this
|
||||
} ) )
|
||||
{
|
||||
return component as Component;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private float GetDistanceFromGameObject(GameObject obj, Vector3 point)
|
||||
{
|
||||
Vector3 closest = obj.WorldPosition;
|
||||
float minDist = Vector3.DistanceBetween(closest, point);
|
||||
return null;
|
||||
}
|
||||
|
||||
foreach (var col in Pressed.GetComponentsInChildren<Collider>())
|
||||
{
|
||||
Vector3 cp = col.FindClosestPoint(point);
|
||||
float dist = Vector3.DistanceBetween(cp, point);
|
||||
if (dist < minDist)
|
||||
minDist = dist;
|
||||
}
|
||||
private float GetDistanceFromGameObject( GameObject obj, Vector3 point )
|
||||
{
|
||||
Vector3 closest = obj.WorldPosition;
|
||||
float minDist = Vector3.DistanceBetween( closest, point );
|
||||
|
||||
return minDist;
|
||||
}
|
||||
foreach ( var col in Pressed.GetComponentsInChildren<Collider>() )
|
||||
{
|
||||
Vector3 cp = col.FindClosestPoint( point );
|
||||
float dist = Vector3.DistanceBetween( cp, point );
|
||||
if ( dist < minDist )
|
||||
minDist = dist;
|
||||
}
|
||||
|
||||
return minDist;
|
||||
}
|
||||
}
|
||||
|
||||
50
Code/Player/Dedugan.Player.cs
Normal file
50
Code/Player/Dedugan.Player.cs
Normal file
@ -0,0 +1,50 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Sandbox;
|
||||
partial class Dedugan
|
||||
{
|
||||
public static IReadOnlyList<Dedugan> All => InternalPlayers;
|
||||
public static List<Dedugan> InternalPlayers = new List<Dedugan>();
|
||||
|
||||
public static Dedugan Local { get; set; }
|
||||
|
||||
private Guid _guid;
|
||||
public static Dedugan FindLocalPlayer() => Local;
|
||||
|
||||
[Sync( SyncFlags.FromHost )]
|
||||
public Guid ConnectionID
|
||||
{
|
||||
get => _guid;
|
||||
set
|
||||
{
|
||||
_guid = value;
|
||||
Connection = Connection.Find( _guid );
|
||||
|
||||
if ( _guid == Connection.Local.Id )
|
||||
{
|
||||
Local = this;
|
||||
// ILocalPlayerEvent.Post( x => x.OnInitialized() );
|
||||
}
|
||||
|
||||
InternalPlayers.RemoveAll( x => !x.IsValid() );
|
||||
if ( !InternalPlayers.Contains( this ) )
|
||||
InternalPlayers.Add( this );
|
||||
}
|
||||
}
|
||||
|
||||
public Connection Connection { get; private set; }
|
||||
|
||||
public ulong SteamID => Connection.SteamId;
|
||||
public string Name => Connection.DisplayName;
|
||||
|
||||
public void SetupConnection( Connection connection )
|
||||
{
|
||||
ConnectionID = connection.Id;
|
||||
GameObject.Name = $"{Name} / {SteamID}";
|
||||
}
|
||||
|
||||
public static Dedugan GetByID( Guid id )
|
||||
=> InternalPlayers.FirstOrDefault( x => x.ConnectionID == id );
|
||||
|
||||
}
|
||||
51
Code/Player/Dedugan.Weapons.cs
Normal file
51
Code/Player/Dedugan.Weapons.cs
Normal file
@ -0,0 +1,51 @@
|
||||
using Sandbox.Citizen;
|
||||
using Sandbox.Weapons;
|
||||
|
||||
public sealed partial class Dedugan
|
||||
{
|
||||
[Property] public GameObject Gun { get; set; }
|
||||
[Sync] private bool InAds { get; set; } = false;
|
||||
|
||||
private Weapon _weapon { get; set; }
|
||||
|
||||
void WeaponStart()
|
||||
{
|
||||
_weapon = Gun.Components.Get<Weapon>(FindMode.EverythingInSelfAndDescendants );
|
||||
|
||||
Log.Info( $"_weapon: {_weapon}, Network.IsOwner: {Network.IsOwner}" );
|
||||
}
|
||||
|
||||
[Rpc.Broadcast]
|
||||
void Attack()
|
||||
{
|
||||
Renderer.Set( "b_attack", true );
|
||||
}
|
||||
|
||||
void WeaponUpdate()
|
||||
{
|
||||
if ( InAds )
|
||||
{
|
||||
AnimationHelper.Handedness = CitizenAnimationHelper.Hand.Right;
|
||||
AnimationHelper.HoldType = CitizenAnimationHelper.HoldTypes.Pistol;
|
||||
|
||||
Gun.Enabled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
AnimationHelper.Handedness = CitizenAnimationHelper.Hand.Both;
|
||||
AnimationHelper.HoldType = CitizenAnimationHelper.HoldTypes.None;
|
||||
|
||||
Gun.Enabled = false;
|
||||
}
|
||||
|
||||
if ( !Network.IsOwner ) return;
|
||||
|
||||
InAds = Input.Down( "Attack2" );
|
||||
|
||||
if ( Input.Pressed( "Attack1" ) && InAds )
|
||||
{
|
||||
_weapon.Attack();
|
||||
Attack();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -8,22 +8,23 @@ public sealed partial class Dedugan : Component
|
||||
[RequireComponent] public ShrimpleCharacterController.ShrimpleCharacterController Controller { get; set; }
|
||||
[RequireComponent] public CitizenAnimationHelper AnimationHelper { get; set; }
|
||||
// [Property] public SkinnedModelRenderer Anim {get; set;}
|
||||
|
||||
|
||||
public SkinnedModelRenderer Renderer { get; set; }
|
||||
[Property] public GameObject Camera { get; set; }
|
||||
[Property] public GameObject CameraPivot { get; set; }
|
||||
|
||||
[Property][Range(1f, 200f, 1f)] public float CamOffsetX { get; set; }
|
||||
[Property][Range(50f, 1200f, 10f)] public float WalkSpeed { get; set; } = 100f;
|
||||
[Property][Range(100f, 1500f, 20f)] public float RunSpeed { get; set; } = 300f;
|
||||
[Property][Range(25f, 1100f, 5f)] public float DuckSpeed { get; set; } = 50f;
|
||||
[Property][Range(200f, 1500f, 20f)] public float JumpStrength { get; set; } = 350f;
|
||||
[Property][Range(10f, 500f, 10f)] public float InteractDistance { get; set; } = 350f;
|
||||
[Property] [Range( 1f, 200f, 1f )] public float CamOffsetX { get; set; }
|
||||
[Property] [Range( 50f, 1200f, 10f )] public float WalkSpeed { get; set; } = 100f;
|
||||
[Property] [Range( 100f, 1500f, 20f )] public float RunSpeed { get; set; } = 300f;
|
||||
[Property] [Range( 25f, 1100f, 5f )] public float DuckSpeed { get; set; } = 50f;
|
||||
[Property] [Range( 200f, 1500f, 20f )] public float JumpStrength { get; set; } = 350f;
|
||||
[Property] [Range( 10f, 500f, 10f )] public float InteractDistance { get; set; } = 350f;
|
||||
|
||||
[Sync] public Angles NetworkedEyeAngles { get; set; }
|
||||
public Angles EyeAngles { get; set; }
|
||||
[Sync] private float IsDucking { get; set; } = 0f;
|
||||
[Sync] public bool IsDancing { get; set; } = false;
|
||||
[Sync] public int Health { get; set; } = 100;
|
||||
private RagdollController RagdollController { get; set; }
|
||||
|
||||
public Vector3 OverrideGravity { get; set; } = Vector3.Zero;
|
||||
@ -34,65 +35,79 @@ public sealed partial class Dedugan : Component
|
||||
private Vector3 _right = Vector3.Right;
|
||||
|
||||
private Vector3 _wishDirection;
|
||||
|
||||
protected override void OnStart()
|
||||
{
|
||||
WeaponStart();
|
||||
|
||||
RagdollController = Components.Get<RagdollController>();
|
||||
Renderer = Components.Get<SkinnedModelRenderer>(FindMode.EverythingInSelfAndDescendants);
|
||||
Renderer = Components.Get<SkinnedModelRenderer>( FindMode.EverythingInSelfAndDescendants );
|
||||
|
||||
var cameraComponent = Camera.GetComponent<CameraComponent>();
|
||||
var listener = Components.Get<AudioListener>(true);
|
||||
cameraComponent.Enabled = false;
|
||||
listener.Enabled = false;
|
||||
|
||||
if ( !Network.IsOwner ) return;
|
||||
|
||||
if (!Network.IsOwner) return;
|
||||
cameraComponent.Enabled = true;
|
||||
listener.Enabled = true;
|
||||
|
||||
if ( Renderer is null )
|
||||
return;
|
||||
|
||||
Renderer.OnFootstepEvent += OnFootstepEvent;
|
||||
}
|
||||
|
||||
protected override void OnUpdate()
|
||||
{
|
||||
if (Network.IsOwner)
|
||||
UpdateCustomAnimations();
|
||||
WeaponUpdate();
|
||||
if ( Network.IsOwner )
|
||||
{
|
||||
EyeAngles += Input.AnalogLook;
|
||||
EyeAngles = EyeAngles.WithPitch(MathX.Clamp(EyeAngles.pitch, -89f, 89f));
|
||||
EyeAngles = EyeAngles.WithPitch( MathX.Clamp( EyeAngles.pitch, -89f, 89f ) );
|
||||
NetworkedEyeAngles = EyeAngles;
|
||||
|
||||
var targetRotation = Rotation.LookAt(Rotation.FromYaw(EyeAngles.yaw).Forward, -_directionToAxis);
|
||||
|
||||
var targetRotation = Rotation.LookAt( Rotation.FromYaw( EyeAngles.yaw ).Forward, -_directionToAxis );
|
||||
var currentForward = Renderer.LocalRotation.Forward;
|
||||
float angleDiff = currentForward.Angle(targetRotation.Forward);
|
||||
|
||||
if (angleDiff > 15f && Controller.Velocity.Length > 10f)
|
||||
float angleDiff = currentForward.Angle( targetRotation.Forward );
|
||||
|
||||
if ( angleDiff > 15f && Controller.Velocity.Length > 10f )
|
||||
{
|
||||
Renderer.LocalRotation = Rotation.Slerp(Renderer.LocalRotation, Rotation.FromYaw(EyeAngles.yaw), Time.Delta * 3f);
|
||||
Renderer.LocalRotation = Rotation.Slerp( Renderer.LocalRotation, Rotation.FromYaw( EyeAngles.yaw ),
|
||||
Time.Delta * 3f );
|
||||
}
|
||||
|
||||
|
||||
RotateCamera();
|
||||
InteractionsUpdate();
|
||||
}
|
||||
else
|
||||
{
|
||||
EyeAngles = NetworkedEyeAngles;
|
||||
|
||||
var targetRotation = Rotation.LookAt(Rotation.FromYaw(EyeAngles.yaw).Forward, -_directionToAxis);
|
||||
|
||||
var targetRotation = Rotation.LookAt( Rotation.FromYaw( EyeAngles.yaw ).Forward, -_directionToAxis );
|
||||
var currentForward = Renderer.LocalRotation.Forward;
|
||||
float angleDiff = currentForward.Angle(targetRotation.Forward);
|
||||
|
||||
if (angleDiff > 15f && Controller.Velocity.Length > 10f)
|
||||
float angleDiff = currentForward.Angle( targetRotation.Forward );
|
||||
|
||||
if ( angleDiff > 15f && Controller.Velocity.Length > 10f )
|
||||
{
|
||||
Renderer.LocalRotation = Rotation.Slerp(Renderer.LocalRotation, Rotation.FromYaw(EyeAngles.yaw), Time.Delta * 3f);
|
||||
Renderer.LocalRotation = Rotation.Slerp( Renderer.LocalRotation, Rotation.FromYaw( EyeAngles.yaw ),
|
||||
Time.Delta * 3f );
|
||||
}
|
||||
|
||||
|
||||
// Renderer.LocalRotation = Rotation.Slerp(Renderer.LocalRotation, Rotation.FromYaw(EyeAngles.yaw), Time.Delta * 5f);
|
||||
|
||||
|
||||
Camera.LocalRotation = EyeAngles.ToRotation();
|
||||
var pivotOffset = CameraPivot.LocalRotation.Backward * CamOffsetX;
|
||||
var localPitchOffset = Camera.LocalRotation.Down * MathF.Max( 0f, EyeAngles.pitch ) * 0.32f +
|
||||
Camera.LocalRotation.Backward * MathF.Max( 0f, EyeAngles.pitch ) * 0.7f +
|
||||
Camera.LocalRotation.Up * MathF.Min( 0f, EyeAngles.pitch ) * 0.5f +
|
||||
Camera.LocalRotation.Backward * MathF.Min( 0f, EyeAngles.pitch ) * 0.8f;
|
||||
|
||||
var offset = (CameraPivot.LocalPosition + pivotOffset ) * EyeAngles.ToRotation() + localPitchOffset;
|
||||
Camera.LocalRotation.Backward * MathF.Min( 0f, EyeAngles.pitch ) * 0.8f;
|
||||
|
||||
var offset = (CameraPivot.LocalPosition + pivotOffset) * EyeAngles.ToRotation() + localPitchOffset;
|
||||
Camera.LocalPosition = offset;
|
||||
}
|
||||
|
||||
UpdateCustomAnimations();
|
||||
}
|
||||
|
||||
protected override void OnFixedUpdate()
|
||||
|
||||
@ -7,11 +7,19 @@ public class PlayerDresser : Component, Component.INetworkSpawn
|
||||
[Property]
|
||||
public SkinnedModelRenderer BodyRenderer { get; set; }
|
||||
|
||||
// public void OnNetworkSpawn( Connection owner )
|
||||
// {
|
||||
// Log.Info( $"Hello {owner.Name}" );
|
||||
// var clothing = new ClothingContainer();
|
||||
// clothing.Deserialize( owner.GetUserData( "avatar" ) );
|
||||
// clothing.Apply( BodyRenderer );
|
||||
// }
|
||||
|
||||
public void OnNetworkSpawn( Connection owner )
|
||||
{
|
||||
{
|
||||
Log.Info( $"Hello {owner.Name}" );
|
||||
var clothing = new ClothingContainer();
|
||||
clothing.Deserialize( owner.GetUserData( "avatar" ) );
|
||||
var clothing = ClothingContainer.CreateFromJson( owner.GetUserData( "avatar" ) );
|
||||
clothing.Height = 1;
|
||||
clothing.Apply( BodyRenderer );
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,48 +1,58 @@
|
||||
using Sandbox;
|
||||
|
||||
public sealed class RagdollController : Component
|
||||
{
|
||||
[Group("Setup"), Order(-100), Property] public ModelPhysics bodyPhysics { get; set; }
|
||||
[Group("Setup"), Order(-100), Property] public SkinnedModelRenderer bodyRenderer { get; set; }
|
||||
[Group("Config"), Order(0), Property] public bool isLocked { get; set; }
|
||||
|
||||
// [Property] public Collider Collider;
|
||||
[Group( "Setup" ), Order( -100 ), Property]
|
||||
public ModelPhysics bodyPhysics { get; private set; }
|
||||
|
||||
[Group( "Setup" ), Order( -100 ), Property]
|
||||
public SkinnedModelRenderer bodyRenderer { get; private set; }
|
||||
|
||||
[Group( "Config" ), Order( 0 ), Property]
|
||||
public bool isLocked { get; set; }
|
||||
|
||||
[Sync]
|
||||
public new bool Enabled
|
||||
{
|
||||
get => bodyPhysics.Enabled;
|
||||
private set
|
||||
get => bodyPhysics.IsValid() && bodyPhysics.Enabled;
|
||||
set
|
||||
{
|
||||
bodyPhysics.Enabled = value;
|
||||
bodyPhysics.MotionEnabled = value;
|
||||
bodyRenderer.UseAnimGraph = !value;
|
||||
if ( bodyPhysics.IsValid() )
|
||||
{
|
||||
bodyPhysics.Enabled = value;
|
||||
bodyPhysics.MotionEnabled = value;
|
||||
bodyRenderer.UseAnimGraph = !value;
|
||||
}
|
||||
// Collider.Enabled = !value;
|
||||
|
||||
|
||||
if ( !value )
|
||||
{
|
||||
WorldPosition = bodyRenderer.WorldPosition;
|
||||
bodyRenderer.LocalPosition = Vector3.Zero;
|
||||
|
||||
bodyRenderer.ClearParameters();
|
||||
bodyRenderer.ClearPhysicsBones();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// protected override void OnStart()
|
||||
// {
|
||||
// Collider = GetComponent<Collider>();
|
||||
//
|
||||
// Log.Info(Collider.Enabled);
|
||||
// }
|
||||
|
||||
protected override void OnUpdate()
|
||||
{
|
||||
if ( Network.IsOwner )
|
||||
{
|
||||
if (Input.Pressed( "Ragdoll" ))
|
||||
if ( Input.Pressed( "Ragdoll" ) )
|
||||
{
|
||||
Enabled = !Enabled;
|
||||
}
|
||||
|
||||
if ( Enabled )
|
||||
{
|
||||
// Components.GetInChildren<SkinnedModelRenderer>().GameObject.WorldPosition += Vector3.Forward;
|
||||
bodyPhysics.WorldPosition += Vector3.Forward * Time.Delta * 100f;
|
||||
// GameObject.WorldPosition += Vector3.Forward;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var bodyLock = new PhysicsLock();
|
||||
bodyLock.Pitch = isLocked;
|
||||
bodyLock.Yaw = isLocked;
|
||||
@ -50,7 +60,7 @@ public sealed class RagdollController : Component
|
||||
bodyLock.X = isLocked;
|
||||
bodyLock.Y = isLocked;
|
||||
bodyLock.Z = isLocked;
|
||||
|
||||
|
||||
bodyPhysics.Locking = bodyLock;
|
||||
bodyPhysics.MotionEnabled = !isLocked;
|
||||
WorldPosition = bodyRenderer.WorldPosition;
|
||||
|
||||
@ -9,8 +9,8 @@ public sealed class DSPReverb : Component, Component.ITriggerListener
|
||||
{
|
||||
[Property] public MixerHandle TargetMixer { get; set; }
|
||||
[Property] public DspPresetHandle Preset { get; set; }
|
||||
[Property] [Range(0f, 10f, 0.1f)] public float FadeDuration { get; set; } = 1f;
|
||||
[Property] public BBox Bounds { get; set; } = new BBox(Vector3.One * -100f, Vector3.One * 100f);
|
||||
[Property] [Range( 0f, 10f, 0.1f )] public float FadeDuration { get; set; } = 1f;
|
||||
[Property] public BBox Bounds { get; set; } = new BBox( Vector3.One * -100f, Vector3.One * 100f );
|
||||
|
||||
private DspProcessor _processor;
|
||||
private BoxCollider _triggerCollider;
|
||||
@ -28,63 +28,79 @@ public sealed class DSPReverb : Component, Component.ITriggerListener
|
||||
_triggerCollider.Center = Bounds.Center;
|
||||
}
|
||||
|
||||
public void OnTriggerEnter(Collider other)
|
||||
public void OnTriggerEnter( Collider other )
|
||||
{
|
||||
_cts?.Cancel();
|
||||
_cts = new CancellationTokenSource();
|
||||
|
||||
if(_processor != null) { TargetMixer.Get().RemoveProcessor(_processor);}
|
||||
|
||||
_processor = new DspProcessor(Preset.Name);
|
||||
_processor.Mix = 0f;
|
||||
TargetMixer.Get().AddProcessor(_processor);
|
||||
|
||||
_ = UpdateMixAsync(1f);
|
||||
if ( other.Components.TryGet<Dedugan>( out Dedugan dedugan ) )
|
||||
{
|
||||
if ( dedugan.Connection == Dedugan.Local.Connection )
|
||||
{
|
||||
_cts?.Cancel();
|
||||
_cts = new CancellationTokenSource();
|
||||
|
||||
if ( _processor != null ) { TargetMixer.Get().RemoveProcessor( _processor ); }
|
||||
|
||||
_processor = new DspProcessor( Preset.Name );
|
||||
_processor.Mix = 0f;
|
||||
TargetMixer.Get().AddProcessor( _processor );
|
||||
|
||||
_processor.Mix = 1f;
|
||||
// _ = UpdateMixAsync(1f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async Task UpdateMixAsync(float targetMix)
|
||||
private async Task UpdateMixAsync( float targetMix )
|
||||
{
|
||||
float startMix = _processor.Mix;
|
||||
float elapsed = FadeDuration * ((targetMix == 0f || startMix == 0f) ? 0f : Math.Min(startMix / targetMix, 1f));
|
||||
float elapsed = FadeDuration *
|
||||
((targetMix == 0f || startMix == 0f) ? 0f : Math.Min( startMix / targetMix, 1f ));
|
||||
float lastTime = Time.Now;
|
||||
|
||||
while (elapsed < FadeDuration && !_cts.IsCancellationRequested)
|
||||
while ( elapsed < FadeDuration && !_cts.IsCancellationRequested )
|
||||
{
|
||||
await Task.FixedUpdate();
|
||||
|
||||
|
||||
float delta = Time.Now - lastTime;
|
||||
elapsed += delta;
|
||||
|
||||
float t = Math.Clamp(elapsed / FadeDuration, 0f, 1f);
|
||||
_processor.Mix = Math.Clamp(startMix + (targetMix - startMix) * t, 0f, 1f);
|
||||
|
||||
|
||||
float t = Math.Clamp( elapsed / FadeDuration, 0f, 1f );
|
||||
_processor.Mix = Math.Clamp( startMix + (targetMix - startMix) * t, 0f, 1f );
|
||||
|
||||
lastTime = Time.Now;
|
||||
}
|
||||
|
||||
if (!_cts.IsCancellationRequested)
|
||||
|
||||
if ( !_cts.IsCancellationRequested )
|
||||
{
|
||||
_processor.Mix = targetMix;
|
||||
}
|
||||
}
|
||||
|
||||
public void OnTriggerExit(Collider other)
|
||||
public void OnTriggerExit( Collider other )
|
||||
{
|
||||
_cts?.Cancel();
|
||||
_cts = new CancellationTokenSource();
|
||||
|
||||
_ = UpdateMixAsync(0f).ContinueWith( (_) =>
|
||||
if ( other.Components.TryGet<Dedugan>( out Dedugan dedugan ) )
|
||||
{
|
||||
if (_processor == null) return;
|
||||
|
||||
TargetMixer.Get().RemoveProcessor(_processor);
|
||||
_processor = null;
|
||||
} );
|
||||
if ( dedugan.Connection == Dedugan.Local.Connection )
|
||||
{
|
||||
_cts?.Cancel();
|
||||
_cts = new CancellationTokenSource();
|
||||
|
||||
_processor.Mix = 0f;
|
||||
}
|
||||
}
|
||||
|
||||
// _ = UpdateMixAsync(0f).ContinueWith( (_) =>
|
||||
// {
|
||||
// if (_processor == null) return;
|
||||
//
|
||||
// TargetMixer.Get().RemoveProcessor(_processor);
|
||||
// _processor = null;
|
||||
// } );
|
||||
}
|
||||
|
||||
protected override void DrawGizmos()
|
||||
{
|
||||
base.DrawGizmos();
|
||||
Gizmo.Draw.Color = Color.Green;
|
||||
Gizmo.Draw.LineBBox(Bounds);
|
||||
Gizmo.Draw.LineBBox( Bounds );
|
||||
}
|
||||
}
|
||||
|
||||
13
Code/UI/ChatHistory.cs
Normal file
13
Code/UI/ChatHistory.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Sandbox;
|
||||
|
||||
public static class ChatHistory
|
||||
{
|
||||
public static List<Chat.Entry> Entries { get; private set; } = new();
|
||||
|
||||
public static void Add(ulong steamid, string author, string message)
|
||||
{
|
||||
Entries.Add(new Chat.Entry(steamid, author, message, 0.0f));
|
||||
}
|
||||
}
|
||||
55
Code/UI/TeleportMazeButton.cs
Normal file
55
Code/UI/TeleportMazeButton.cs
Normal file
@ -0,0 +1,55 @@
|
||||
using Sandbox.Gravity;
|
||||
|
||||
namespace Sandbox.UI;
|
||||
|
||||
[Icon( "skip_next" )]
|
||||
public sealed class TeleportMazeButton : InteractionButton
|
||||
{
|
||||
[Property] public Maze Maze { get; set; }
|
||||
[Property] public InteractTeleporter Teleporter { get; set; }
|
||||
|
||||
int maxAttempts = 30;
|
||||
|
||||
public override bool Press( IPressable.Event e )
|
||||
{
|
||||
base.Press( e );
|
||||
if ( Maze.IsValid() )
|
||||
{
|
||||
Maze.RpcRequestMaze();
|
||||
}
|
||||
|
||||
DoTeleport();
|
||||
return true;
|
||||
}
|
||||
|
||||
private async void DoTeleport()
|
||||
{
|
||||
int attempt = 0;
|
||||
|
||||
if ( Maze.IsValid() )
|
||||
{
|
||||
while ( !Maze.IsReady && attempt < maxAttempts )
|
||||
{
|
||||
await Task.Delay( 1000 );
|
||||
attempt++;
|
||||
}
|
||||
|
||||
if ( Maze.IsReady )
|
||||
{
|
||||
// Teleporter.TeleportAll();
|
||||
foreach ( var player in Teleporter.Players )
|
||||
{
|
||||
Teleporter.Teleport( player, Maze.GetRandomCellPosition() );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Warning( "Maze was not ready in time. Teleport aborted." );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Teleporter.TeleportAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
103
Code/Weapons/Weapon.cs
Normal file
103
Code/Weapons/Weapon.cs
Normal file
@ -0,0 +1,103 @@
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Sandbox.Weapons;
|
||||
|
||||
public sealed class Weapon : Component
|
||||
{
|
||||
[Property] public SkinnedModelRenderer GunRenderer { get; private set; }
|
||||
[Property] public GameObject BulletOut { get; private set; }
|
||||
[Property] public GameObject MuzzleLight { get; private set; }
|
||||
|
||||
[Property] public GameObject particlePrefab { get; set; }
|
||||
[Property] public GameObject bloodParticle { get; set; }
|
||||
|
||||
[Property] public DecalDefinition ImpactDecal { get; set; }
|
||||
[Property] public SoundEvent ImpactSound { get; set; }
|
||||
|
||||
private SoundPointComponent _sound;
|
||||
|
||||
protected override void OnStart()
|
||||
{
|
||||
_sound = GameObject.GetComponent<SoundPointComponent>( true );
|
||||
}
|
||||
|
||||
public void Attack()
|
||||
{
|
||||
AttackEffects();
|
||||
|
||||
Vector3 startPos = Scene.Camera.WorldPosition;
|
||||
Vector3 dir = Scene.Camera.WorldRotation.Forward;
|
||||
float maxDistance = 1000f;
|
||||
|
||||
var tr = Scene.Trace
|
||||
.Ray( startPos, startPos + dir * maxDistance )
|
||||
.IgnoreGameObjectHierarchy( Dedugan.Local.GameObject )
|
||||
.WithoutTags( "weapon" )
|
||||
.UseHitboxes()
|
||||
.Run();
|
||||
|
||||
Log.Info( Dedugan.Local.GameObject );
|
||||
|
||||
if (tr.Hit && tr.Hitbox != null)
|
||||
{
|
||||
var components = tr.GameObject.Components;
|
||||
var boneIndex = tr.Hitbox.Bone.Index;
|
||||
|
||||
// Log.Info($"{tr.GameObject.Name} attacked");
|
||||
|
||||
var dedugan = components.Get<Dedugan>();
|
||||
var enemy = components.Get<Enemy>();
|
||||
|
||||
if (dedugan.IsValid() || enemy.IsValid())
|
||||
{
|
||||
CreateHitEffects(tr.EndPosition, tr.Normal, true);
|
||||
}
|
||||
|
||||
if (dedugan.IsValid())
|
||||
{
|
||||
dedugan.ReportHit(dir, boneIndex);
|
||||
}
|
||||
|
||||
if (enemy.IsValid())
|
||||
{
|
||||
enemy.ReportHit(dir, boneIndex);
|
||||
Log.Info(boneIndex);
|
||||
}
|
||||
}
|
||||
else if ( tr.Hitbox == null )
|
||||
{
|
||||
CreateHitEffects( tr.EndPosition, tr.Normal );
|
||||
}
|
||||
}
|
||||
|
||||
[Rpc.Broadcast]
|
||||
private void CreateHitEffects( Vector3 position, Vector3 normal, bool blood = false )
|
||||
{
|
||||
var rot = Rotation.LookAt( normal );
|
||||
DestroyAsync(
|
||||
blood
|
||||
? bloodParticle.Clone( position, rot )
|
||||
: particlePrefab.Clone( position, rot ), 0.5f );
|
||||
}
|
||||
|
||||
async void DestroyAsync( GameObject go, float delay )
|
||||
{
|
||||
await GameTask.DelaySeconds( delay );
|
||||
go.Destroy();
|
||||
}
|
||||
|
||||
[Rpc.Broadcast]
|
||||
public void AttackEffects()
|
||||
{
|
||||
_sound?.StartSound();
|
||||
MuzzleLight.Enabled = true;
|
||||
GunRenderer.Set( "Fire", true );
|
||||
_ = AttackEffectsAsync();
|
||||
}
|
||||
|
||||
private async Task AttackEffectsAsync()
|
||||
{
|
||||
await GameTask.DelaySeconds( 0.05f );
|
||||
MuzzleLight.Enabled = false;
|
||||
}
|
||||
}
|
||||
@ -1,4 +0,0 @@
|
||||
[
|
||||
"package.base",
|
||||
"package.trend.clothing_dresser"
|
||||
]
|
||||
Binary file not shown.
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<doc>
|
||||
<assembly>
|
||||
<name>package.trend.clothing_dresser</name>
|
||||
</assembly>
|
||||
<members>
|
||||
</members>
|
||||
</doc>
|
||||
@ -1 +0,0 @@
|
||||
1.0.84525
|
||||
@ -1,16 +0,0 @@
|
||||
|
||||
using Sandbox;
|
||||
using System.Collections.Generic;
|
||||
|
||||
[Icon( "checkroom" )]
|
||||
[Category( "Citizen" )]
|
||||
public sealed class ClothingDresser : Component, Component.ExecuteInEditor
|
||||
{
|
||||
public Dictionary<GameObject, Clothing> EnabledClothing { get; set; } = new();
|
||||
|
||||
|
||||
protected override void OnUpdate()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup />
|
||||
</Project>
|
||||
@ -1,182 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Editor;
|
||||
using Sandbox;
|
||||
using Application = Editor.Application;
|
||||
|
||||
public class ClothesList : ListView
|
||||
{
|
||||
private readonly ClothingDresser Dresser;
|
||||
|
||||
|
||||
public ClothesList( Widget parent, ClothingDresser dresser, IEnumerable<Clothing> clothingFilter ) : base( parent )
|
||||
{
|
||||
Instance = this;
|
||||
|
||||
ItemContextMenu = ShowItemContext;
|
||||
ItemClicked = OnItemClicked;
|
||||
MinimumHeight = 500;
|
||||
//ItemAlign = Sandbox.UI.Align.SpaceBetween;
|
||||
|
||||
Dresser = dresser;
|
||||
|
||||
ItemSize = new Vector2( 96, 114 );
|
||||
|
||||
if ( clothingFilter != null && clothingFilter.Any() )
|
||||
{
|
||||
BuildItems( clothingFilter );
|
||||
}
|
||||
}
|
||||
|
||||
public static ClothesList Instance { get; private set; }
|
||||
|
||||
protected void OnItemClicked( object obj )
|
||||
{
|
||||
if ( obj is not Clothing entry )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var citizen = Dresser.Components.Get<SkinnedModelRenderer>();
|
||||
var asset = AssetSystem.FindByPath( entry.ResourcePath );
|
||||
|
||||
if ( Dresser.EnabledClothing.ContainsValue( entry ) )
|
||||
{
|
||||
var clothingEntry = Dresser.EnabledClothing.Where( x => x.Value == entry ).FirstOrDefault();
|
||||
|
||||
clothingEntry.Key.Destroy();
|
||||
Dresser.EnabledClothing.Remove( clothingEntry.Key );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( entry.SlotsUnder == Clothing.Slots.Skin )
|
||||
{
|
||||
if ( entry.SkinMaterial != null && entry.EyesMaterial != null )
|
||||
{
|
||||
citizen.SetMaterialOverride( Material.Load( entry.SkinMaterial ), "skin" );
|
||||
citizen.SetMaterialOverride( Material.Load( entry.EyesMaterial ), "eyes" );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var clonedClothing = Dresser.Scene.CreateObject();
|
||||
clonedClothing.Parent = Dresser.GameObject;
|
||||
clonedClothing.Name = $"Clothing - {asset.Name}";
|
||||
|
||||
var cloth = clonedClothing.Components.Create<SkinnedModelRenderer>();
|
||||
cloth.Model = Model.Load( entry.Model );
|
||||
|
||||
cloth.BoneMergeTarget = citizen;
|
||||
cloth.Tags.Add( "clothing" );
|
||||
|
||||
//Log.Info( $"{cloth.GameObject.Id}, {entry.Title}" );
|
||||
Dresser?.EnabledClothing.Add( cloth.GameObject, entry );
|
||||
}
|
||||
|
||||
private void ShowItemContext( object obj )
|
||||
{
|
||||
if ( obj is not Clothing entry )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var m = new Menu();
|
||||
|
||||
if ( Dresser.EnabledClothing.ContainsValue( entry ) )
|
||||
{
|
||||
m.AddOption( "Remove Clothing", "checkroom", () =>
|
||||
{
|
||||
var clothingEntry = Dresser.EnabledClothing.Where( x => x.Value == entry ).FirstOrDefault();
|
||||
|
||||
clothingEntry.Key.Destroy();
|
||||
Dresser.EnabledClothing.Remove( clothingEntry.Key );
|
||||
} );
|
||||
}
|
||||
|
||||
m.AddOption( "Open In Editor", "edit", () =>
|
||||
{
|
||||
var asset = AssetSystem.FindByPath( entry.ResourcePath );
|
||||
asset?.OpenInEditor();
|
||||
} );
|
||||
|
||||
m.OpenAt( Application.CursorPosition );
|
||||
}
|
||||
|
||||
public void BuildItems( IEnumerable<object> objects )
|
||||
{
|
||||
SetItems( objects );
|
||||
}
|
||||
|
||||
protected override void PaintItem( VirtualWidget item )
|
||||
{
|
||||
var rect = item.Rect.Shrink( 0, 0, 0, 15 );
|
||||
|
||||
if ( item.Object is not Clothing clothing )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Paint.Antialiasing = true;
|
||||
Paint.TextAntialiasing = true;
|
||||
|
||||
var asset = AssetSystem.FindByPath( clothing.ResourcePath );
|
||||
|
||||
if ( asset is null )
|
||||
{
|
||||
Paint.SetDefaultFont();
|
||||
Paint.SetPen( Color.Red );
|
||||
Paint.DrawText( item.Rect.Shrink( 2 ), "<ERROR>" );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( Dresser.EnabledClothing.ContainsValue( clothing ) )
|
||||
{
|
||||
Paint.ClearPen();
|
||||
Paint.SetBrush( item.Hovered ? Theme.Red.WithAlpha( 0.10f ) : Theme.Green.WithAlpha( 0.10f ) );
|
||||
Paint.SetPen( item.Hovered ? Theme.Red.WithAlpha( 0.50f ) : Theme.Green.WithAlpha( 0.90f ) );
|
||||
Paint.DrawRect( item.Rect.Shrink( 2 ), 3 );
|
||||
}
|
||||
|
||||
if ( Paint.HasMouseOver )
|
||||
{
|
||||
Paint.SetBrush( Theme.Blue.WithAlpha( item.Selected ? 0.2f : 0.2f ) );
|
||||
Paint.ClearPen();
|
||||
Paint.DrawRect( item.Rect, 4 );
|
||||
}
|
||||
|
||||
var pixmap = asset.GetAssetThumb();
|
||||
|
||||
Paint.ClearPen();
|
||||
Paint.SetBrush( Theme.White.WithAlpha( 0.01f ) );
|
||||
Paint.SetPen( Theme.White.WithAlpha( 0.05f ) );
|
||||
Paint.DrawRect( item.Rect.Shrink( 2 ), 3 );
|
||||
|
||||
Paint.Draw( item.Rect.Shrink( item.Hovered ? 2 : 6 ), pixmap );
|
||||
|
||||
|
||||
var textRect = rect.Shrink( 4 );
|
||||
textRect.Top = textRect.Top + 50;
|
||||
textRect.Top = textRect.Top + 25;
|
||||
|
||||
Paint.ClearPen();
|
||||
Paint.SetBrush( Theme.Black.WithAlpha( 0.5f ) );
|
||||
Paint.DrawRect( textRect, 0.0f );
|
||||
|
||||
Paint.Antialiasing = true;
|
||||
|
||||
Paint.SetPen( Theme.White, 2.0f );
|
||||
Paint.ClearBrush();
|
||||
Paint.SetFont( "Roboto Condensed", 9, 700 );
|
||||
Paint.DrawText( textRect, clothing.Title );
|
||||
}
|
||||
|
||||
protected override void OnPaint()
|
||||
{
|
||||
Paint.ClearPen();
|
||||
Paint.SetBrush( Theme.ControlBackground );
|
||||
Paint.DrawRect( LocalRect, 4 );
|
||||
|
||||
base.OnPaint();
|
||||
}
|
||||
}
|
||||
@ -1,116 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Editor;
|
||||
using Sandbox;
|
||||
using Sandbox.UI;
|
||||
using Button = Editor.Button;
|
||||
using Checkbox = Editor.Checkbox;
|
||||
|
||||
[CustomEditor( typeof(ClothingDresser) )]
|
||||
public class ClothingDresserEditor : ComponentEditorWidget
|
||||
{
|
||||
public ClothingDresserEditor( SerializedObject obj ) : base( obj )
|
||||
{
|
||||
Layout = Layout.Column();
|
||||
Layout.Margin = new Margin( 15, 5 );
|
||||
|
||||
var tabBar = new SegmentedControl( this );
|
||||
tabBar.SetSizeMode( SizeMode.Flexible, SizeMode.CanShrink );
|
||||
tabBar.FixedHeight = 35f;
|
||||
|
||||
var row = Layout.AddRow();
|
||||
row.Add( tabBar );
|
||||
|
||||
var categories = Enum.GetValues<Clothing.ClothingCategory>();
|
||||
|
||||
foreach ( var category in categories )
|
||||
{
|
||||
tabBar.AddOption( category.ToString() );
|
||||
}
|
||||
|
||||
tabBar.OnSelectedChanged += tab =>
|
||||
{
|
||||
if ( tab == "None" )
|
||||
{
|
||||
ClothesList.BuildItems( AllClothing );
|
||||
return;
|
||||
}
|
||||
|
||||
ClothesList.BuildItems( AllClothing.Where( x => x.Category.ToString() == tab ) );
|
||||
};
|
||||
|
||||
|
||||
var dresser = SerializedObject.Targets.FirstOrDefault() as ClothingDresser;
|
||||
|
||||
var secondRow = Layout.AddRow();
|
||||
|
||||
Filter = new LineEdit();
|
||||
Filter.PlaceholderText = "Filter..";
|
||||
Filter.FixedHeight = 30f;
|
||||
Filter.TextEdited += text =>
|
||||
{
|
||||
if ( !string.IsNullOrEmpty( text ) )
|
||||
{
|
||||
// Log.Info( text );
|
||||
SearchQuery = text;
|
||||
ClothesList.BuildItems( AllClothing.Where( x =>
|
||||
x.Title.Contains( SearchQuery, StringComparison.OrdinalIgnoreCase ) ) );
|
||||
return;
|
||||
}
|
||||
|
||||
ClothesList.BuildItems( AllClothing );
|
||||
};
|
||||
|
||||
|
||||
var resetClothing = new Button( "Reset Clothing" );
|
||||
resetClothing.Icon = "refresh";
|
||||
resetClothing.Tint = new Color( 179, 72, 64 );
|
||||
resetClothing.SetStyles( "font-size: 13px; padding: 8px;" );
|
||||
|
||||
resetClothing.Clicked = () =>
|
||||
{
|
||||
foreach ( var kv in dresser?.EnabledClothing )
|
||||
{
|
||||
kv.Key.Destroy();
|
||||
}
|
||||
|
||||
dresser?.EnabledClothing.Clear();
|
||||
};
|
||||
|
||||
var checkbox = new Checkbox();
|
||||
checkbox.SetStyles( "padding: 10px;" );
|
||||
checkbox.Text = "Show Enabled";
|
||||
checkbox.Toggled += () =>
|
||||
{
|
||||
if ( checkbox.Value )
|
||||
{
|
||||
ClothesList.BuildItems( AllClothing.Where( x => dresser.EnabledClothing.ContainsValue( x ) ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
ClothesList.BuildItems( AllClothing );
|
||||
}
|
||||
};
|
||||
|
||||
secondRow.Margin = new Margin( 0, 10 );
|
||||
secondRow.Add( Filter );
|
||||
secondRow.Add( checkbox );
|
||||
secondRow.AddStretchCell();
|
||||
secondRow.Add( resetClothing );
|
||||
|
||||
ClothesList = new ClothesList( null, dresser, AllClothing );
|
||||
|
||||
var tlayout = Layout.AddColumn();
|
||||
tlayout.Spacing = 8;
|
||||
tlayout.Add( ClothesList );
|
||||
}
|
||||
|
||||
public static List<Clothing> AllClothing => ResourceLibrary.GetAll<Clothing>().ToList();
|
||||
|
||||
public static LineEdit Filter { get; set; }
|
||||
|
||||
public ClothesList ClothesList { get; set; }
|
||||
|
||||
public static string SearchQuery { get; set; } = string.Empty;
|
||||
}
|
||||
@ -1,18 +0,0 @@
|
||||
using Sandbox;
|
||||
|
||||
[TestClass]
|
||||
public partial class LibraryTests
|
||||
{
|
||||
[TestMethod]
|
||||
public void SceneTest()
|
||||
{
|
||||
var scene = new Scene();
|
||||
using ( scene.Push() )
|
||||
{
|
||||
var go = new GameObject();
|
||||
|
||||
Assert.AreEqual( 1, scene.Directory.GameObjectCount );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,11 +0,0 @@
|
||||
global using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
[TestClass]
|
||||
public class TestInit
|
||||
{
|
||||
[AssemblyInitialize]
|
||||
public static void ClassInitialize( TestContext context )
|
||||
{
|
||||
Sandbox.Application.InitUnitTest();
|
||||
}
|
||||
}
|
||||
@ -1,15 +0,0 @@
|
||||
{
|
||||
"Title": "Clothing Dresser",
|
||||
"Type": "library",
|
||||
"Org": "trend",
|
||||
"Ident": "clothing_dresser",
|
||||
"Schema": 1,
|
||||
"IncludeSourceFiles": false,
|
||||
"Resources": null,
|
||||
"PackageReferences": [],
|
||||
"EditorReferences": null,
|
||||
"IsWhitelistDisabled": false,
|
||||
"Metadata": {
|
||||
"CsProjName": ""
|
||||
}
|
||||
}
|
||||
@ -5,7 +5,8 @@
|
||||
"world": "Collide",
|
||||
"trigger": "Trigger",
|
||||
"ladder": "Ignore",
|
||||
"water": "Trigger"
|
||||
"water": "Trigger",
|
||||
"bullet": "Unset"
|
||||
},
|
||||
"Pairs": [
|
||||
{
|
||||
@ -27,6 +28,16 @@
|
||||
"a": "playerclip",
|
||||
"b": "solid",
|
||||
"r": "Collide"
|
||||
},
|
||||
{
|
||||
"a": "bullet",
|
||||
"b": "bullet",
|
||||
"r": "Collide"
|
||||
},
|
||||
{
|
||||
"a": "trigger",
|
||||
"b": "bullet",
|
||||
"r": "Collide"
|
||||
}
|
||||
],
|
||||
"__guid": "bffdb0d0-4697-4620-835d-d355784ea964",
|
||||
|
||||
@ -3,22 +3,40 @@
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssert_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fcdd7996c168e4e71a26a18071188e963140000_003F79_003F09b4d72b_003FAssert_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAudioProcessor_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb259d6161b344f3994a9007e79ffb76e727000_003F8e_003Ff5fe4067_003FAudioProcessor_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ABaseSoundComponent_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F473df774ec844d1eb1dafe31862610eb433000_003F03_003Fc9a9d7b5_003FBaseSoundComponent_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ABoneCollection_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa2b91d29af2c4b9ba9c9da5883394d0b2bf200_003F9e_003Fc306079d_003FBoneCollection_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACameraComponent_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F7fe4327051628686a94d2cc1b9ff1879c75a7e2316fc87922f74cf3cb3e59a_003FCameraComponent_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACharacterController_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F473df774ec844d1eb1dafe31862610eb433000_003Ff4_003Ff6cf3340_003FCharacterController_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACollider_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F473df774ec844d1eb1dafe31862610eb433000_003Fe2_003F95542f09_003FCollider_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AComponent_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F473df774ec844d1eb1dafe31862610eb433000_003F72_003Ff5d9e547_003FComponent_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADspProcessor_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb259d6161b344f3994a9007e79ffb76e727000_003Ffb_003F1e5434fb_003FDspProcessor_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADspVolume_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F473df774ec844d1eb1dafe31862610eb433000_003Fda_003Fdddba176_003FDspVolume_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AGameObject_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F473df774ec844d1eb1dafe31862610eb433000_003F1a_003F3c96fd87_003FGameObject_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AGameObject_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F328f546fb3d12ef21bd156bebb44e876ae17ebd8f1bfe0d68a6a5a5980cfc9_003FGameObject_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AGameObject_002EDestroy_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F25a01333d5e9c794e14abd1de0d5d6345cd7e4ca1bb7586d37d8aaf61c18f_003FGameObject_002EDestroy_002Ecs_002Fz_003A2_002D1/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AGameObject_002EDestroy_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F7c1e5ce5ab10ff4a2bb6b255131e72c4f315fef8072b35c3219f7e6d4d974f_003FGameObject_002EDestroy_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AGameResource_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb259d6161b344f3994a9007e79ffb76e727000_003F8e_003Fecbfca7a_003FGameResource_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AGame_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F1c9070f543f8ffe8ee48d0dd7f25c3e16dd1f41e9bdcd55e79d1c8ee83cd55_003FGame_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpResponseMessage_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F4cfeb8b377bc81e1fbb5f7d7a02492cb6ac23e88c8c9d7155944f0716f3d4b_003FHttpResponseMessage_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AINode_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fcdd7996c168e4e71a26a18071188e963140000_003F8a_003F9318c033_003FINode_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AITriggerListener_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F91267c659ad2fe5bee8a69aa0e63fc6ea19d7ac94fa5bc2ee37675e5a521c_003FITriggerListener_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ALineRenderer_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F473df774ec844d1eb1dafe31862610eb433000_003F7e_003Fa47fb19c_003FLineRenderer_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMesh_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa2b91d29af2c4b9ba9c9da5883394d0b2bf200_003F19_003F6b235317_003FMesh_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMixer_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb259d6161b344f3994a9007e79ffb76e727000_003F90_003Fb5c57f61_003FMixer_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AModelBuilder_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa2b91d29af2c4b9ba9c9da5883394d0b2bf200_003F14_003F0d55b5af_003FModelBuilder_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AModelHitboxes_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F473df774ec844d1eb1dafe31862610eb433000_003Fa9_003F5106ca8b_003FModelHitboxes_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AModelHitboxes_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F835ea7f1e0b2cc664cd06c7399cd76a437ad26d262b2c9ebde78a87cbdafe6_003FModelHitboxes_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AModelPhysics_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F473df774ec844d1eb1dafe31862610eb433000_003Fa4_003Ffd7d4a36_003FModelPhysics_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AModelPhysics_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F92bf9bbf66ae1f54445ffc8fd441e65cd2b36c4162e21bfb32d25f9d29334d91_003FModelPhysics_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AModel_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa2b91d29af2c4b9ba9c9da5883394d0b2bf200_003F9d_003F45f34be4_003FModel_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANavMesh_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa2b91d29af2c4b9ba9c9da5883394d0b2bf200_003F90_003F5b19e900_003FNavMesh_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APhysicsBody_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa2b91d29af2c4b9ba9c9da5883394d0b2bf200_003F83_003F79b53dac_003FPhysicsBody_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARay_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fcdd7996c168e4e71a26a18071188e963140000_003F68_003Fed78b2d5_003FRay_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AResourceLibrary_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb259d6161b344f3994a9007e79ffb76e727000_003Fb5_003F072d37f4_003FResourceLibrary_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARigidbodyFlags_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F473df774ec844d1eb1dafe31862610eb433000_003F2e_003Fd4632dba_003FRigidbodyFlags_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARigidbody_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F473df774ec844d1eb1dafe31862610eb433000_003F55_003Fc86ceaad_003FRigidbody_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASceneTrace_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F473df774ec844d1eb1dafe31862610eb433000_003F23_003F2911a771_003FSceneTrace_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AScene_002ETrace_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F3c972827b18f468b89d806d1145b8865319c0b2c01144dda44b5b43ae2f9bb_003FScene_002ETrace_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASkinnedModelRenderer_002EBones_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fa7411ef5cf1d23681eb046498bf46886d8e60a0bd484664426bfacb759a81_003FSkinnedModelRenderer_002EBones_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASkinnedModelRenderer_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F473df774ec844d1eb1dafe31862610eb433000_003F78_003Fd854339f_003FSkinnedModelRenderer_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASoundEvent_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb259d6161b344f3994a9007e79ffb76e727000_003F5f_003F9ff69285_003FSoundEvent_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASoundHandle_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb259d6161b344f3994a9007e79ffb76e727000_003F58_003F780d4494_003FSoundHandle_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
@ -28,4 +46,5 @@
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASound_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb259d6161b344f3994a9007e79ffb76e727000_003F76_003F66594b07_003FSound_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATaskSource_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F473df774ec844d1eb1dafe31862610eb433000_003F8b_003Fdeeb5f11_003FTaskSource_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATriggerActionComponent_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F473df774ec844d1eb1dafe31862610eb433000_003Fdc_003Fc3ba20f2_003FTriggerActionComponent_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AVertex_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa2b91d29af2c4b9ba9c9da5883394d0b2bf200_003F66_003Fdfd9a75e_003FVertex_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AWorldPanel_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F473df774ec844d1eb1dafe31862610eb433000_003F1a_003F5313bfbb_003FWorldPanel_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>
|
||||
Loading…
x
Reference in New Issue
Block a user