instanciating explosion on slam
Some checks failed
Create tag and build when new code gets to main / BumpTag (push) Has been cancelled
Create tag and build when new code gets to main / Test (push) Has been cancelled
Create tag and build when new code gets to main / Export (push) Has been cancelled

This commit is contained in:
2026-01-26 16:34:18 +01:00
parent d79ca44972
commit 2fdc9c7ca8
13 changed files with 122 additions and 32 deletions

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=66 format=3 uid="uid://bei4nhkf8lwdo"]
[gd_scene load_steps=67 format=3 uid="uid://bei4nhkf8lwdo"]
[ext_resource type="Script" uid="uid://bbbrf5ckydfna" path="res://player_controller/Scripts/PlayerController.cs" id="1_poq2x"]
[ext_resource type="PackedScene" uid="uid://cf3rrgr1imvv4" path="res://scenes/path/path.tscn" id="2_6lejt"]
@@ -12,6 +12,7 @@
[ext_resource type="Resource" uid="uid://ccrb5xsnphc8" path="res://systems/inputs/base_mode/rotate_floorplane.tres" id="5_4u7i3"]
[ext_resource type="PackedScene" uid="uid://hpsg4fqwrx1u" path="res://components/damage/CDamageable.tscn" id="5_jb43f"]
[ext_resource type="Resource" uid="uid://f3vs6l4m623s" path="res://systems/inputs/base_mode/move_left.tres" id="5_q14ux"]
[ext_resource type="PackedScene" uid="uid://duju3atqgltkg" path="res://scenes/enemies/explosion.tscn" id="5_ue7xq"]
[ext_resource type="Resource" uid="uid://dyru7mxo121w6" path="res://player_controller/resources/player_normal_damage_mod.tres" id="6_cmijs"]
[ext_resource type="Resource" uid="uid://t612lts1wi1s" path="res://systems/inputs/base_mode/move_right.tres" id="6_q7bng"]
[ext_resource type="Script" uid="uid://cwbvxlfvmocc1" path="res://player_controller/Scripts/StairsSystem.cs" id="7_bmt5a"]
@@ -112,6 +113,7 @@ RDamage = SubResource("Resource_cb2lu")
RKnockback = SubResource("Resource_abfq8")
RHealth = SubResource("Resource_ue7xq")
TargetingDistance = 5.0
Explosion = ExtResource("5_ue7xq")
WalkSpeed = 7.5
AccelerationFloor = 4.0
DecelerationFloor = 3.0

View File

@@ -1,13 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Godot;
using GodotStateCharts;
using Movementtests.addons.godot_state_charts.csharp;
using Movementtests.interfaces;
using Movementtests.systems;
using Movementtests.player_controller.Scripts;
using Movementtests.systems.damage;
using RustyOptions;
public partial class PlayerController : CharacterBody3D,
@@ -82,12 +80,16 @@ public partial class PlayerController : CharacterBody3D,
[Export] public RKnockback RKnockback { get; set; }
[Export] public RHealth RHealth { get; set; }
[ExportGroup("Targeting")]
[Export(PropertyHint.Range, "0,20,0.1,or_greater")]
public float TargetingDistance { get; set; } = 10.0f;
[Export(PropertyHint.Range, "0,20,0.1,or_greater")]
public float TargetInRangeDistance { get; set; } = 5.0f;
[ExportGroup("Instantiation")]
[Export]
public PackedScene Explosion { get; set; }
// Movement stuff
[ExportCategory("Movement")]
[ExportGroup("Ground")]
@@ -231,7 +233,7 @@ public partial class PlayerController : CharacterBody3D,
///////////////////////////
// Stairs and shit
private float _lastFrameWasOnFloor = -Mathf.Inf;
private const int NUM_OF_HEAD_COLLISION_DETECTORS = 4;
private const int NumOfHeadCollisionDetectors = 4;
private RayCast3D[] _headCollisionDetectors;
private AudioStreamPlaybackInteractive _audioStream;
@@ -398,8 +400,8 @@ public partial class PlayerController : CharacterBody3D,
SlidingEnemyDetector = GetNode<Area3D>("SlidingEnemyDetector");
RayCast3D stairsBelowRayCast3D = GetNode<RayCast3D>("StairsBelowRayCast3D");
RayCast3D stairsAheadRayCast3D = GetNode<RayCast3D>("StairsAheadRayCast3D");
_headCollisionDetectors = new RayCast3D[NUM_OF_HEAD_COLLISION_DETECTORS];
for (int i = 0; i < NUM_OF_HEAD_COLLISION_DETECTORS; i++)
_headCollisionDetectors = new RayCast3D[NumOfHeadCollisionDetectors];
for (int i = 0; i < NumOfHeadCollisionDetectors; i++)
{
_headCollisionDetectors[i] = GetNode<RayCast3D>(
"HeadCollisionDetectors/HeadCollisionDetector" + i);
@@ -428,8 +430,8 @@ public partial class PlayerController : CharacterBody3D,
}
if (RKnockback != null) CKnockback!.RKnockback = RKnockback;
CDamageable.DamageTaken += (source, record) => ReduceHealth(source, record);
CDamageable.DamageTaken += RegisterKnockback;
CDamageable.DamageTaken += (damageable, record) => ReduceHealth(damageable, record);
CDamageable.DamageTaken += (damageable, record) => RegisterKnockback(new KnockbackRecord(record));
CHealth.HealthDepleted += Kill;
// State management
@@ -448,7 +450,6 @@ 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"));
// _actionHanging = StateChartState.Of(GetNode("StateChart/Root/Actions/Hanging"));
_powerExpired = StateChartState.Of(GetNode("StateChart/Root/PowerReserve/Expired"));
_powerRecharging = StateChartState.Of(GetNode("StateChart/Root/PowerReserve/AtLeastOneCharge"));
@@ -765,7 +766,7 @@ public partial class PlayerController : CharacterBody3D,
}
private bool IsHeadTouchingCeiling()
{
for (int i = 0; i < NUM_OF_HEAD_COLLISION_DETECTORS; i++)
for (int i = 0; i < NumOfHeadCollisionDetectors; i++)
{
if (_headCollisionDetectors[i].IsColliding())
{
@@ -1595,6 +1596,11 @@ public partial class PlayerController : CharacterBody3D,
{
HeadSystem.OnGetHit();
_audioStream!.SwitchToClipByName("slam");
if (Explosion.Instantiate() is not Explosion explosion) return;
explosion.Radius = 10f;
GetTree().GetRoot().AddChild(explosion);
explosion.GlobalPosition = GlobalPosition;
}
///////////////////////////
@@ -1981,7 +1987,7 @@ public partial class PlayerController : CharacterBody3D,
enemyTargetState = PlayerUi.TargetState.TargetDashThrough;
if (_targetObject is IDamageable damageable and IHealthable healthable)
{
var wouldBeDamage = damageable.ComputeDamage(new DamageRecord(this, RDamage));
var wouldBeDamage = damageable.ComputeDamage(new DamageRecord(GlobalPosition, RDamage));
if (wouldBeDamage.Damage.DamageDealt < healthable.CurrentHealth)
enemyTargetState = PlayerUi.TargetState.TargetInRange;
}
@@ -2120,7 +2126,7 @@ public partial class PlayerController : CharacterBody3D,
if (_hitEnemies.Count == 0) return;
foreach (var damageable in _hitEnemies)
damageable.TakeDamage(new DamageRecord(this, RDamage));
damageable.TakeDamage(new DamageRecord(GlobalPosition, RDamage));
_hitEnemies.Clear();
HeadSystem.OnHitTarget();
@@ -2146,9 +2152,9 @@ public partial class PlayerController : CharacterBody3D,
HealthChanged?.Invoke(this, record);
return record;
}
public void RegisterKnockback(IDamageable source, DamageRecord damageRecord)
public void RegisterKnockback(KnockbackRecord knockbackRecord)
{
CKnockback.RegisterKnockback(source, damageRecord);
CKnockback.RegisterKnockback(knockbackRecord);
}
public Vector3 ComputeKnockback()