gd: some weapon planting and dashing
This commit is contained in:
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user