From 255b87f991c59719f341d72ef23aa3bd5e613c2f Mon Sep 17 00:00:00 2001 From: Minimata Date: Fri, 16 Jan 2026 18:35:58 +0100 Subject: [PATCH] basic interface and no success trying to use them in a Tool script --- interfaces/spawnable/ISpawnable.cs | 8 +++ interfaces/spawnable/ISpawnable.cs.uid | 1 + maps/GYMs/enemies.tscn | 13 +++- player_controller/PlayerController.tscn | 15 ++++- player_controller/Scripts/PlayerController.cs | 15 ++++- scenes/enemies/FirstEnemy.cs | 14 ++++- scenes/spawners/Spawner.cs | 62 +++++++++++++++++++ scenes/spawners/Spawner.cs.uid | 1 + scenes/spawners/spawner.tscn | 10 +++ 9 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 interfaces/spawnable/ISpawnable.cs create mode 100644 interfaces/spawnable/ISpawnable.cs.uid create mode 100644 scenes/spawners/Spawner.cs create mode 100644 scenes/spawners/Spawner.cs.uid create mode 100644 scenes/spawners/spawner.tscn diff --git a/interfaces/spawnable/ISpawnable.cs b/interfaces/spawnable/ISpawnable.cs new file mode 100644 index 00000000..4b6b1671 --- /dev/null +++ b/interfaces/spawnable/ISpawnable.cs @@ -0,0 +1,8 @@ +using Godot; + + +interface ISpawnable +{ + Resource GetSpawnInitResource(); + void TestMethod(); +} \ No newline at end of file diff --git a/interfaces/spawnable/ISpawnable.cs.uid b/interfaces/spawnable/ISpawnable.cs.uid new file mode 100644 index 00000000..0a0fe297 --- /dev/null +++ b/interfaces/spawnable/ISpawnable.cs.uid @@ -0,0 +1 @@ +uid://bethuw2c1at8o diff --git a/maps/GYMs/enemies.tscn b/maps/GYMs/enemies.tscn index a615784b..b0716bcf 100644 --- a/maps/GYMs/enemies.tscn +++ b/maps/GYMs/enemies.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=11 format=3 uid="uid://q7uc1h2jpbd2"] +[gd_scene load_steps=13 format=3 uid="uid://q7uc1h2jpbd2"] [ext_resource type="PackedScene" uid="uid://bei4nhkf8lwdo" path="res://player_controller/PlayerController.tscn" id="1_62kkh"] [ext_resource type="Material" uid="uid://31aulub2nqov" path="res://assets/greybox/m_greybox.tres" id="2_3uydm"] [ext_resource type="PackedScene" uid="uid://dxt0e2ugmttqq" path="res://scenes/enemies/first_enemy.tscn" id="3_3uydm"] [ext_resource type="Script" uid="uid://b2vdwkiqauhk3" path="res://scenes/enemies/EnemyInitInputs.cs" id="4_nd7vd"] +[ext_resource type="PackedScene" uid="uid://c305mfrtumcyq" path="res://scenes/spawners/spawner.tscn" id="5_8fd2t"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_0xm2m"] sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1) @@ -42,6 +43,11 @@ script = ExtResource("4_nd7vd") Speed = 6.4 metadata/_custom_type_script = "uid://b2vdwkiqauhk3" +[sub_resource type="Resource" id="Resource_caohq"] +script = ExtResource("4_nd7vd") +Speed = 3.1 +metadata/_custom_type_script = "uid://b2vdwkiqauhk3" + [node name="Main" type="Node3D"] [node name="Player" parent="." instance=ExtResource("1_62kkh")] @@ -122,3 +128,8 @@ Inputs = SubResource("Resource_7m3bq") transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0, -16.83681) Target = NodePath("../Player") Inputs = SubResource("Resource_sysok") + +[node name="Spawner" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("5_8fd2t")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 3.5, -16.5) +Inputs = SubResource("Resource_caohq") +Target = NodePath("../Player") diff --git a/player_controller/PlayerController.tscn b/player_controller/PlayerController.tscn index e5246fae..082fa339 100644 --- a/player_controller/PlayerController.tscn +++ b/player_controller/PlayerController.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=50 format=3 uid="uid://bei4nhkf8lwdo"] +[gd_scene load_steps=51 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"] @@ -49,6 +49,8 @@ height = 1.7 [sub_resource type="SphereShape3D" id="SphereShape3D_6lejt"] radius = 0.45 +[sub_resource type="SphereShape3D" id="SphereShape3D_q14ux"] + [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_nodcl"] transparency = 1 albedo_color = Color(0, 0.627451, 0.6313726, 0.49019608) @@ -164,6 +166,17 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.6, 0) MantleEndLocationDistanceFromWall = 0.3 MantleHeightCastStart = 2.5 +[node name="WeaponHitbox" type="Area3D" parent="HeadSystem"] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.6, 0) +collision_layer = 0 +collision_mask = 16 +monitorable = false + +[node name="CollisionShape3D" type="CollisionShape3D" parent="HeadSystem/WeaponHitbox"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, -1) +shape = SubResource("SphereShape3D_q14ux") + [node name="StairsSystem" type="Node3D" parent="."] script = ExtResource("7_bmt5a") diff --git a/player_controller/Scripts/PlayerController.cs b/player_controller/Scripts/PlayerController.cs index bae461b2..f0942b5a 100644 --- a/player_controller/Scripts/PlayerController.cs +++ b/player_controller/Scripts/PlayerController.cs @@ -52,6 +52,7 @@ public partial class PlayerController : CharacterBody3D public ShapeCast3D GroundDetector; public ShapeCast3D CeilingDetector; public RayCast3D DirectGroundDetector; + public Area3D WeaponHitbox; // Inspector stuff [Export] public Marker3D TutorialWeaponTarget; @@ -353,6 +354,8 @@ public partial class PlayerController : CharacterBody3D var playerShape = StandingCollider.GetShape() as CapsuleShape3D; _playerHeight = playerShape!.Height; _playerRadius = playerShape.Radius; + + WeaponHitbox = GetNode("%WeaponHitbox"); // State management _playerState = StateChart.Of(GetNode("StateChart")); @@ -1572,10 +1575,20 @@ public partial class PlayerController : CharacterBody3D /////////////////////////// public void OnInputHitPressed() { - if (_aiming.Active) + if (_aiming.Active && WeaponSystem.InHandState.Active) { ThrowWeapon(); } + + if (WeaponSystem.InHandState.Active) + { + var bodies = WeaponHitbox.GetOverlappingBodies(); + foreach (var body in bodies) + { + if(body is ISpawnable spawnable) + spawnable.TestMethod(); + } + } } /////////////////////////// diff --git a/scenes/enemies/FirstEnemy.cs b/scenes/enemies/FirstEnemy.cs index 950d4db3..655db471 100644 --- a/scenes/enemies/FirstEnemy.cs +++ b/scenes/enemies/FirstEnemy.cs @@ -2,7 +2,9 @@ using Godot; using System; using Movementtests.player_controller.Scripts; -public partial class FirstEnemy : CharacterBody3D + +[GlobalClass] +public partial class FirstEnemy : CharacterBody3D, ISpawnable { [Export] public Node3D Target { get; set; } @@ -17,6 +19,16 @@ public partial class FirstEnemy : CharacterBody3D _wallInFrontRayCast = GetNode("WallInFrontRayCast"); } + public Resource GetSpawnInitResource() + { + return Inputs; + } + + public void TestMethod() + { + GD.Print("I'm an enemy"); + } + public override void _PhysicsProcess(double delta) { var target = Target.GlobalPosition; diff --git a/scenes/spawners/Spawner.cs b/scenes/spawners/Spawner.cs new file mode 100644 index 00000000..47d1a22c --- /dev/null +++ b/scenes/spawners/Spawner.cs @@ -0,0 +1,62 @@ +using Godot; +using System; + +[Tool] +public partial class Spawner : Node3D +{ + [Export(PropertyHint.NodeType)] + public PackedScene SceneToSpawn { get; set; } + + [Export] + public Resource Inputs; + [Export] + public Node3D Target { get; set; } + + [Export(PropertyHint.Range, "0.1, 100, 0.1, or_greater")] + public float SpawnInterval { get; set; } = 1.0f; + [Export] + public bool IsActiveOnStart { get; set; } = true; + + private float _spawnTimer; + private bool _isActive; + + public override void _Ready() + { + _isActive = IsActiveOnStart && !Engine.IsEditorHint(); // Keep it inactive in Editor + _spawnTimer = SpawnInterval; + } + + public override void _Process(double delta) + { + if (!_isActive) return; + + _spawnTimer -= (float) delta; + if (_spawnTimer <= 0) Spawn(); + } + + public void Spawn() + { + if (SceneToSpawn == null || !SceneToSpawn.CanInstantiate()) return; + + var spawnedInstance = SceneToSpawn.Instantiate() as FirstEnemy; + if (spawnedInstance == null) return; + + spawnedInstance.Inputs = Inputs as EnemyInitInputs; + spawnedInstance.Target = Target; + GetTree().GetCurrentScene().AddChild(spawnedInstance); + spawnedInstance.GlobalPosition = GlobalPosition; + + _spawnTimer = SpawnInterval; + } + + public void StartSpawning() + { + _isActive = true; + _spawnTimer = SpawnInterval; + } + + public void StopSpawning() + { + _isActive = false; + } +} diff --git a/scenes/spawners/Spawner.cs.uid b/scenes/spawners/Spawner.cs.uid new file mode 100644 index 00000000..86c96b07 --- /dev/null +++ b/scenes/spawners/Spawner.cs.uid @@ -0,0 +1 @@ +uid://djyspwixi01j5 diff --git a/scenes/spawners/spawner.tscn b/scenes/spawners/spawner.tscn new file mode 100644 index 00000000..d2a84b89 --- /dev/null +++ b/scenes/spawners/spawner.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://c305mfrtumcyq"] + +[ext_resource type="Script" uid="uid://djyspwixi01j5" path="res://scenes/spawners/Spawner.cs" id="1_2otbo"] +[ext_resource type="PackedScene" uid="uid://dxt0e2ugmttqq" path="res://scenes/enemies/first_enemy.tscn" id="2_2otbo"] + +[node name="Spawner" type="Node3D"] +script = ExtResource("1_2otbo") +SceneToSpawn = ExtResource("2_2otbo") + +[node name="Marker3D" type="Marker3D" parent="."]