core/player/PlayerMouse.cs
using static Sandbox.PhysicsContact;

public class PlayerMouse : Component {
	[Property, ReadOnly] public BasePlayer Owner {get;set;}
	public enum Layer {
		World,
		Interface,
	}
	public enum Button {
		None,
		Swap,
		Weapon,
	}
	public enum Mode {
		Move,
		Interact,
		Shoot
	}
	[Property, ReadOnly] public Layer TargetLayer {get; set;} = Layer.World;
	[Property, ReadOnly] public Button TargetButton {get; set;} = Button.None;
	[Property] public Mode InteractMode {get; set;} = Mode.Move;
	[Property, ReadOnly] public IsoEntity HoveredEntity {get; set;}
	[Property, ReadOnly] public IsoInteractable HoveredInteract {get; set;}
	[Property, ReadOnly] public Vector2 Position => Mouse.Position;

	private bool InNodeOverride = false;
	private Mode LastMode;
	protected override void OnFixedUpdate() {
		base.OnFixedUpdate();
		TargetButton = Button.None;
		TargetLayer = Layer.World;
		var uipos = Position;
		uipos.y -= Screen.Height;
		if (uipos.x > 331 && uipos.y > -173 && uipos.x < 773 && uipos.y < -36)
			TargetButton = Button.Weapon;
		else if (uipos.x > 329 && uipos.y > -276 && uipos.x < 456 && uipos.y < -235)
			TargetButton = Button.Swap;
		if (uipos.x < 495 && uipos.y > -301)
			TargetLayer = Layer.Interface;
		if (uipos.x < 821 && uipos.y > -222)
			TargetLayer = Layer.Interface;
		if (Input.Pressed("attack2") && TargetButton == Button.None) {
			if (InteractMode != Mode.Shoot)
				InteractMode = (Mode)((int)InteractMode + 1);
			else
				InteractMode = Mode.Move;
		}
		if (InNodeOverride)
			InteractMode = LastMode;
		InNodeOverride = false;
		HoveredEntity = null;
		HoveredInteract = null;
		if (Owner.Isometric) {
			var target = Owner.IsoCamera.MouseTarget();
			var ray = new Ray(target + Owner.IsoCamera.WorldRotation.Backward * 512f, Owner.IsoCamera.WorldRotation.Forward);
			if (InteractMode != Mode.Move && Owner.Isometric) {
				var tr = Scene.Trace.Ray(ray, 2048).UsePhysicsWorld(false).UseHitboxes(true).WithTag("entity").Run();
				if (tr.GameObject.IsValid() && tr.GameObject.Components.TryGet<IsoEntity>(out var ent))
					HoveredEntity = ent;
			}
			if (!HoveredEntity.IsValid()) {
				var max = Scene.Trace.Ray(ray, 2048f).WithTag("block_interactable").Run().Fraction * 2048;
				foreach (var interactable in Scene.GetAllComponents<IsoInteractable>()) {
					if (BasePlayer.Local.IsoEntity.Components.Get<NpcMovement>().EntityRoot.Distance(interactable.WorldPosition) > 700)
						continue;
					if (interactable.Box.Trace(ray.ToLocal(interactable.WorldTransform), max, out var _)) {
						HoveredInteract = interactable;
						break;
					}
				}
			}
		}
		if (HoveredInteract.IsValid()) {
			LastMode = InteractMode;
			InNodeOverride = true;
			InteractMode = Mode.Interact;
		}
		if (Input.Pressed("attack1") && HoveredInteract.IsValid()) {
			var m = BasePlayer.Local.IsoEntity.Components.Get<NpcMovement>();
			m.Goal = HoveredInteract.IsoPathGoal.WorldPosition;
			m.OnReachTargetPosition = m.Goal;
			m.OnReachTarget = HoveredInteract.Interact;
			m.Go();
		}
	}
}