diff --git a/player_controller/PlayerController.tscn b/player_controller/PlayerController.tscn index 0db82c24..7df61d80 100644 --- a/player_controller/PlayerController.tscn +++ b/player_controller/PlayerController.tscn @@ -272,9 +272,7 @@ collision_mask = 256 DashSpeed = 0.2 PostDashSpeed = 30.0 -[node name="WeaponRoot" type="Node3D" parent="."] - -[node name="WeaponSystem" parent="WeaponRoot" instance=ExtResource("29_wv70j")] +[node name="WeaponSystem" parent="." instance=ExtResource("29_wv70j")] transform = Transform3D(1, 0, 0, 0, 0.173648, -0.984808, 0, 0.984808, 0.173648, 0.45268, 1.44035, -0.692528) mass = 10.0 gravity_scale = 3.0 diff --git a/player_controller/Scripts/PlayerController.cs b/player_controller/Scripts/PlayerController.cs index 2ece0dea..9c22e842 100644 --- a/player_controller/Scripts/PlayerController.cs +++ b/player_controller/Scripts/PlayerController.cs @@ -46,7 +46,6 @@ public partial class PlayerController : CharacterBody3D, public DashSystem DashSystem; public CollisionShape3D StandingCollider; public CollisionShape3D SlideCollider; - public Node3D WeaponRoot; public WeaponSystem WeaponSystem; public WallHugSystem WallHugSystem; public PlayerUi PlayerUi; @@ -309,6 +308,8 @@ public partial class PlayerController : CharacterBody3D, private StateChartState _onWallHanging; private StateChartState _onWallRunning; + private Transition _onDashEnded; + private Transition _onJumpFromWall; private Transition _onJumpFromWallFalling; private Transition _onLeaveWallFromRun; @@ -342,8 +343,7 @@ public partial class PlayerController : CharacterBody3D, Node3D cameraSmooth = GetNode("HeadSystem/CameraSmooth"); // Movement stuff - WeaponRoot = GetNode("WeaponRoot"); - WeaponSystem = GetNode("WeaponRoot/WeaponSystem"); + WeaponSystem = GetNode("WeaponSystem"); MantleSystem = GetNode("HeadSystem/MantleSystem"); StandingCollider = GetNode("StandingCollider"); SlideCollider = GetNode("SlideCollider"); @@ -384,6 +384,7 @@ public partial class PlayerController : CharacterBody3D, _airGlidingDoubleJump = StateChartState.Of(GetNode("StateChart/Root/Movement/Sliding/AirGlideDoubleJumpEnabled")); _onGroundSlideJump = Transition.Of(GetNode("StateChart/Root/Movement/Sliding/GroundSlide/OnJump")); _onAirGlideDoubleJump = Transition.Of(GetNode("StateChart/Root/Movement/Sliding/AirGlideDoubleJumpEnabled/OnJump")); + _onDashEnded = Transition.Of(GetNode("StateChart/Root/Movement/Dashing/OnDashEnded")); // _actionHanging = StateChartState.Of(GetNode("StateChart/Root/Actions/Hanging")); _powerExpired = StateChartState.Of(GetNode("StateChart/Root/PowerReserve/Expired")); @@ -495,6 +496,9 @@ public partial class PlayerController : CharacterBody3D, _onWallHanging.StatePhysicsProcessing += HandleWallHanging; _onWallRunning.StatePhysicsProcessing += HandleWallRunning; + _onWallHanging.StateExited += RecoverWeapon; + _onDashEnded.Taken += RecoverWeapon; + _onJumpFromWall.Taken += OnJumpFromWall; _onJumpFromWallFalling.Taken += OnJumpFromWall; _onLeaveWallFromRun.Taken += OnLeaveWallFromRun; @@ -542,9 +546,9 @@ public partial class PlayerController : CharacterBody3D, if (TutorialDone) return; - RemoveChild(WeaponRoot); - GetTree().GetRoot().CallDeferred(Node.MethodName.AddChild, WeaponRoot); - WeaponRoot.CallDeferred(Node3D.MethodName.SetGlobalPosition, TutorialWeaponTarget.GlobalPosition); + RemoveChild(WeaponSystem); + GetTree().GetRoot().CallDeferred(Node.MethodName.AddChild, WeaponSystem); + WeaponSystem.CallDeferred(Node3D.MethodName.SetGlobalPosition, TutorialWeaponTarget.GlobalPosition); WeaponSystem.CallDeferred(WeaponSystem.MethodName.PlaceWeaponForTutorial, TutorialWeaponTarget.GlobalPosition); } @@ -820,10 +824,6 @@ public partial class PlayerController : CharacterBody3D, FovMultiplier: _fovChangeMultiplier); HeadSystem.LookAround(lookAroundInputs); } - public void RotateWeaponWithPlayer() - { - WeaponRoot.SetRotation(HeadSystem.Rotation); - } public Vector3 GetGlobalForwardFacingVector() { return Transform.Basis * HeadSystem.Transform.Basis * Vector3.Forward; @@ -1554,9 +1554,6 @@ public partial class PlayerController : CharacterBody3D, } public void HandleAiming(float delta) { - if (WeaponSystem.InHandState.Active) - RotateWeaponWithPlayer(); - DashIndicatorMeshCylinder.Height = DashSystem.PlannedLocation.DistanceTo(GlobalPosition); DashIndicatorNode.LookAt(DashSystem.PlannedLocation); @@ -1624,7 +1621,8 @@ public partial class PlayerController : CharacterBody3D, public void ThrowWeapon() { _playerState.SendEvent("cancel_aim"); - RemoveChildNode(WeaponRoot); + RemoveChildNode(WeaponSystem); + HeadSystem.HideWeapon(); var weaponTargetLocation = DashSystem.HasHit ? DashSystem.CollisionPoint : DashSystem.PlannedLocation; WeaponSystem.ThrowWeapon( @@ -1635,7 +1633,10 @@ public partial class PlayerController : CharacterBody3D, } public void RecoverWeapon() { - RecoverChildNode(WeaponRoot); + if (WeaponSystem.GetParent() == this) return; + + HeadSystem.ShowWeapon(); + RecoverChildNode(WeaponSystem); WeaponSystem.ResetWeapon(); } @@ -1688,8 +1689,6 @@ public partial class PlayerController : CharacterBody3D, var isPlantedUnderPlatform = WeaponSystem.IsPlantedUnderPlatform(); var shouldDashToHanging = isPlantedOnWall || isPlantedUnderPlatform; - RecoverWeapon(); - var resultingEvent = shouldDashToHanging ? "dash_to_planted" : "dash_finished"; _playerState.SendEvent(resultingEvent); } @@ -1705,8 +1704,6 @@ public partial class PlayerController : CharacterBody3D, MoveSlideAndHandleStairs((float) delta); MantleSystem.ProcessMantle(_grounded.Active); - if (WeaponSystem.InHandState.Active) - RotateWeaponWithPlayer(); if (WeaponSystem.InHandState.Active && !_aiming.Active && TutorialDone) { DashIndicatorMesh.Visible = false; diff --git a/systems/head/HeadSystem.cs b/systems/head/HeadSystem.cs index 31cff15b..096c2c1c 100644 --- a/systems/head/HeadSystem.cs +++ b/systems/head/HeadSystem.cs @@ -184,6 +184,15 @@ public partial class HeadSystem : Node3D _camera.Fov = Mathf.Lerp(_camera.Fov, targetFov, (float) delta * FovChangeSpeed); } + public void HideWeapon() + { + _fpRig.Visible = false; + } + public void ShowWeapon() + { + _fpRig.Visible = true; + } + public float ComputeCameraInclineFactor(Vector3 direction) { var forward = GetForwardHorizontalVector().Normalized(); diff --git a/systems/weapon/WeaponSystem.cs b/systems/weapon/WeaponSystem.cs index 904abd37..489d10c1 100644 --- a/systems/weapon/WeaponSystem.cs +++ b/systems/weapon/WeaponSystem.cs @@ -28,6 +28,7 @@ public partial class WeaponSystem : RigidBody3D private TweenQueueSystem _tweenQueueSystem; private Transform3D _startTransform; + private Transform3D _startMeshTransform; private Vector3 _throwDirection; public Vector3 PlantLocation { get; set; } @@ -36,7 +37,6 @@ public partial class WeaponSystem : RigidBody3D public MeshInstance3D WeaponLocationIndicator { get; set; } public StandardMaterial3D WeaponLocationIndicatorMaterial { get; set; } public MeshInstance3D WeaponMesh { get; set; } - public StandardMaterial3D WeaponMaterial { get; set; } public void Init(Node3D head, Camera3D camera) { @@ -53,7 +53,7 @@ public partial class WeaponSystem : RigidBody3D WeaponLocationIndicatorMaterial = WeaponLocationIndicator.GetActiveMaterial(0) as StandardMaterial3D; WeaponMesh = GetNode("Weapon"); - WeaponMaterial = WeaponMesh.GetActiveMaterial(0) as StandardMaterial3D; + _startMeshTransform = WeaponMesh.Transform; _tweenQueueSystem = GetNode("TweenQueueSystem"); _tweenQueueSystem.Init(this); @@ -71,16 +71,14 @@ public partial class WeaponSystem : RigidBody3D public void WeaponLeft() { Visible = true; - WeaponLocationIndicator.Visible = true; - WeaponMaterial!.UseFovOverride = false; + // WeaponLocationIndicator.Visible = true; EmitSignalWeaponThrown(); } public void WeaponBack() { Visible = false; - WeaponLocationIndicator.Visible = false; - WeaponMaterial!.UseFovOverride = true; + // WeaponLocationIndicator.Visible = false; EmitSignalWeaponRetrieved(); } @@ -96,7 +94,7 @@ public partial class WeaponSystem : RigidBody3D { _weaponState.SendEvent("throw"); - WeaponLocationIndicatorMaterial.StencilColor = new Color(1f, 1f, 1f); + // WeaponLocationIndicatorMaterial.StencilColor = new Color(1f, 1f, 1f); _throwDirection = (end - GlobalPosition).Normalized(); PlantLocation = collisionLocation; @@ -120,10 +118,11 @@ public partial class WeaponSystem : RigidBody3D { _weaponState.SendEvent("plant"); - WeaponLocationIndicatorMaterial.StencilColor = new Color(1f, 0.2f, 0.2f); + // WeaponLocationIndicatorMaterial.StencilColor = new Color(1f, 0.2f, 0.2f); Freeze = true; GlobalPosition = PlantLocation; + WeaponMesh.Transform = _startMeshTransform; LookAt(GlobalTransform.Origin + PlantNormal, Vector3.Up, true); } @@ -151,11 +150,12 @@ public partial class WeaponSystem : RigidBody3D } } - public override void _PhysicsProcess(double _delta) + public override void _Process(double delta) { if (!FlyingState.Active) return; - LookAt(GlobalTransform.Origin + LinearVelocity.Normalized(), Vector3.Up, false); + WeaponMesh.Rotation = new Vector3(WeaponMesh.Rotation.X, WeaponMesh.Rotation.Y + (float) delta * 100, WeaponMesh.Rotation.Z); + //LookAt(GlobalTransform.Origin + LinearVelocity.Normalized(), Vector3.Up, false); } public bool IsPlantedUnderPlatform()