Interactable/Items/BearTrap.cs
using System;
using static Sandbox.Services.Inventory;
namespace CryptidHunt;
public sealed class BearTrap : Item, Component.ITriggerListener
{
protected override void OnUpdate()
{
base.OnUpdate();
if ( Player.Instance?.Holding != this ) return;
if ( Player.Instance.LockInputs ) return;
var trace = Player.Instance.InteractTrace;
var position = trace.EndPosition - trace.Normal * 5f;
var rotation = Rotation.LookAt( trace.Hit ? trace.Normal : Vector3.Up ) * Rotation.FromPitch( 90f );
var canPlace = trace.Hit && Vector3.Dot( trace.Normal, Vector3.Up ) > 0.8f;
DebugOverlay.Model( Model.Model, canPlace ? Color.Green.WithAlpha( 0.7f ) : Color.Red.WithAlpha( 0.7f ), Time.Delta, new Transform( position, rotation ) );
}
public override void Attack( Player player )
{
var trace = Player.Instance.InteractTrace;
if ( !trace.Hit || Vector3.Dot( trace.Normal, Vector3.Up ) <= 0.8f ) return;
GameObject.Enabled = true;
WorldPosition = trace.EndPosition - trace.Normal * 5f;
WorldRotation = Rotation.LookAt( trace.Normal ) * Rotation.FromPitch( 90f );
foreach ( var collider in Components.GetAll<BoxCollider>( FindMode.EverythingInSelfAndDescendants ) )
collider.Enabled = true;
player.Remove( this );
Sound.Play( "beartrap_set", WorldPosition );
}
public void OnTriggerEnter( Collider other )
{
if ( !Active ) return;
if ( !other.Components.TryGet<Polewik>( out var polewik, FindMode.EnabledInSelf ) ) return;
polewik.HP -= 10f;
Sound.Play( "beartrap_trigger", WorldPosition );
GameObject.Destroy();
}
}