This commit is contained in:
Oscar 2025-06-08 23:43:22 +03:00
parent a6f2e43c49
commit 160429eae6
34 changed files with 5219 additions and 1905 deletions

View File

@ -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

View File

@ -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

View 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 );
}
}
}

View 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();
}
}

View File

@ -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 )

View File

@ -1,6 +1,4 @@
using Sandbox;
public sealed partial class Dedugan
public sealed partial class Dedugan
{
void UpdateCustomAnimations()
{

View File

@ -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;

View 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 );
}
}
}

View 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;
}
}

View File

@ -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;
}
}

View 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 );
}

View 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();
}
}
}

View File

@ -13,17 +13,18 @@ public sealed partial class Dedugan : Component
[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,33 +35,48 @@ 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);
float angleDiff = currentForward.Angle( targetRotation.Forward );
if (angleDiff > 15f && Controller.Velocity.Length > 10f)
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();
@ -70,13 +86,14 @@ public sealed partial class Dedugan : Component
{
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);
float angleDiff = currentForward.Angle( targetRotation.Forward );
if (angleDiff > 15f && Controller.Velocity.Length > 10f)
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);
@ -88,11 +105,9 @@ public sealed partial class Dedugan : Component
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;
var offset = (CameraPivot.LocalPosition + pivotOffset) * EyeAngles.ToRotation() + localPitchOffset;
Camera.LocalPosition = offset;
}
UpdateCustomAnimations();
}
protected override void OnFixedUpdate()

View File

@ -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 );
}
}

View File

@ -1,46 +1,56 @@
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; }
[Group( "Setup" ), Order( -100 ), Property]
public ModelPhysics bodyPhysics { get; private set; }
// [Property] public Collider Collider;
[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();

View File

@ -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 ( 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);}
if ( _processor != null ) { TargetMixer.Get().RemoveProcessor( _processor ); }
_processor = new DspProcessor(Preset.Name);
_processor.Mix = 0f;
TargetMixer.Get().AddProcessor(_processor);
_processor = new DspProcessor( Preset.Name );
_processor.Mix = 0f;
TargetMixer.Get().AddProcessor( _processor );
_ = UpdateMixAsync(1f);
_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;
if ( dedugan.Connection == Dedugan.Local.Connection )
{
_cts?.Cancel();
_cts = new CancellationTokenSource();
TargetMixer.Get().RemoveProcessor(_processor);
_processor = null;
} );
_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
View 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));
}
}

View 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
View 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;
}
}

View File

@ -1,4 +0,0 @@
[
"package.base",
"package.trend.clothing_dresser"
]

View File

@ -1,8 +0,0 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>package.trend.clothing_dresser</name>
</assembly>
<members>
</members>
</doc>

View File

@ -1 +0,0 @@
1.0.84525

View File

@ -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()
{
}
}

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>

View File

@ -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();
}
}

View File

@ -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;
}

View File

@ -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 );
}
}
}

View File

@ -1,11 +0,0 @@
global using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class TestInit
{
[AssemblyInitialize]
public static void ClassInitialize( TestContext context )
{
Sandbox.Application.InitUnitTest();
}
}

View File

@ -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": ""
}
}

View File

@ -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",

View File

@ -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>