gd: some weapon planting and dashing

This commit is contained in:
2025-06-07 17:42:39 +02:00
parent 82cc25ddd3
commit 55f036f725
6 changed files with 145 additions and 15 deletions

View File

@ -1,4 +1,5 @@
using Godot;
using GodotStateCharts;
namespace Movementtests.systems;
@ -9,6 +10,11 @@ public partial class WeaponSystem : RigidBody3D
[Export(PropertyHint.Range, "0,0.2,0.01,or_greater")]
public float StraightThrowDuration { get; set; } = 0.1f;
private StateChart _weaponState;
public StateChartState InHandState;
public StateChartState FlyingState;
public StateChartState PlantedState;
private Node3D _head;
private ShapeCast3D _dashCast3D;
private Camera3D _camera;
@ -19,21 +25,31 @@ public partial class WeaponSystem : RigidBody3D
private Vector3 _throwDirection;
private Vector3 _plantLocation;
private Vector3 _plantNormal;
public Vector3 PlayerDashLocation { get; set; }
public void Init(Node3D head, Camera3D camera)
{
_head = head;
_camera = camera;
_weaponState = StateChart.Of(GetNode("StateChart"));
InHandState = StateChartState.Of(GetNode("StateChart/Root/InHand"));
FlyingState = StateChartState.Of(GetNode("StateChart/Root/Flying"));
PlantedState = StateChartState.Of(GetNode("StateChart/Root/Planted"));
_tweenQueueSystem = GetNode<TweenQueueSystem>("TweenQueueSystem");
_tweenQueueSystem.Init(this);
_startTransform = Transform;
Freeze = true;
BodyEntered += OnThrownWeaponReachesGround;
}
public void ThrowWeapon(Vector3 end, bool hasHit, Vector3 collisionLocation, Vector3 collisionNormal)
{
_weaponState.SendEvent("throw");
_throwDirection = (end - GlobalPosition).Normalized();
_plantLocation = collisionLocation;
_plantNormal = collisionNormal;
@ -54,6 +70,7 @@ public partial class WeaponSystem : RigidBody3D
public void PlantWeaponInWall()
{
_weaponState.SendEvent("plant");
Freeze = true;
GlobalPosition = _plantLocation;
LookAt(GlobalTransform.Origin + _plantNormal, Vector3.Up, true);
@ -61,6 +78,7 @@ public partial class WeaponSystem : RigidBody3D
public void ResetWeapon()
{
_weaponState.SendEvent("recover");
Transform = _startTransform;
Freeze = true;
}
@ -68,10 +86,12 @@ public partial class WeaponSystem : RigidBody3D
public override void _IntegrateForces(PhysicsDirectBodyState3D state)
{
base._IntegrateForces(state);
PlayerDashLocation = GlobalPosition;
if (!Freeze && state.GetContactCount() > 0)
{
_plantLocation = state.GetContactLocalPosition(0);
_plantNormal = state.GetContactLocalNormal(0);
PlayerDashLocation = _plantLocation + _plantNormal * 0.1f;
}
}