using Godot; using System; using System.Collections.Generic; using RustyOptions; namespace Movementtests.systems; [GlobalClass, Icon("res://assets/ui/IconGodotNode/node_3D/icon_wall.png")] public partial class WallHugSystem : Node3D { [Signal] public delegate void WallDetectedEventHandler(); private List _raycasts; public Option WallHugLocation { get; private set; } = Option.None; public Option WallHugNormal { get; private set; } = Option.None; public void Init() { _raycasts = new List(); _raycasts.Add(GetNode("front")); _raycasts.Add(GetNode("front2")); _raycasts.Add(GetNode("back")); _raycasts.Add(GetNode("back2")); _raycasts.Add(GetNode("left")); _raycasts.Add(GetNode("left2")); _raycasts.Add(GetNode("right")); _raycasts.Add(GetNode("right2")); } public override void _PhysicsProcess(double delta) { base._PhysicsProcess(delta); CheckWallHugging(); if (IsWallHugging()) EmitSignal(SignalName.WallDetected); } public void CheckWallHugging() { foreach (RayCast3D raycast in _raycasts) { if (raycast.IsColliding() && Math.Abs(raycast.GetCollisionNormal().Y) < 0.3f) { WallHugLocation = raycast.GetCollisionPoint().Some(); WallHugNormal = raycast.GetCollisionNormal().Some(); return; } } WallHugLocation = Option.None; WallHugNormal = Option.None; } public bool IsWallHugging() { return !WallHugLocation.IsNone; } }