Basic projectile implementation (put sample version in FilthEaterModelView)

This commit is contained in:
2025-10-23 18:50:05 -07:00
parent bc161a58b3
commit f5360adbf1
36 changed files with 1124 additions and 106 deletions

View File

@@ -0,0 +1 @@
uid://bml27mbsd1fip

View File

@@ -95,7 +95,7 @@ public partial class BossTypeA : Enemy, IHaveEngagePlayerBehavior, IHaveFollowBe
{
var target = area.GetOwner();
if (target is IPlayer player)
player.TakeDamage(new AttackData(AttackComponent.TotalAttack, PrimaryAttackElementalType));
player.TakeDamage(new AttackData(AttackComponent.CurrentAttack.Value, PrimaryAttackElementalType));
}
public void StartFight()
@@ -142,5 +142,9 @@ public partial class BossTypeA : Enemy, IHaveEngagePlayerBehavior, IHaveFollowBe
public override void _ExitTree()
{
FollowBehavior.OnVelocityComputed -= OnVelocityComputed;
EngagePlayerBehavior.TakeAction -= PerformAction;
PlayerDetector.BodyEntered -= PlayerDetector_BodyEntered;
PlayerDetector.BodyExited -= PlayerDetector_BodyExited;
}
}

View File

@@ -150,6 +150,9 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
{
_enemyLogic.Stop();
EnemyBinding.Dispose();
HealthComponent.HealthReachedZero -= Die;
HealthComponent.DamageTaken -= TakeHit;
EnemyModelView.HitPlayer -= EnemyModelView_HitPlayer;
}
public virtual void MoveEnemyToNewRoom(IDungeonRoom newRoom)
@@ -182,6 +185,6 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
private void EnemyModelView_HitPlayer(object sender, System.EventArgs e)
{
_player.TakeDamage(new AttackData(AttackComponent.TotalAttack, ElementType.None));
_player.TakeDamage(new AttackData(AttackComponent.CurrentAttack.Value, ElementType.None));
}
}

View File

@@ -67,7 +67,7 @@ public abstract partial class Enemy2D : Enemy
{
var collider = Raycast.GetCollider();
if (collider is IPlayer)
_enemyLogic.Input(new EnemyLogic.Input.Follow());
_enemyLogic.Input(new EnemyLogic.Input.Attack());
}
}
}

View File

@@ -2,6 +2,7 @@
using Chickensoft.Introspection;
using Godot;
using System;
using System.Linq;
namespace Zennysoft.Game.Ma;

View File

@@ -60,4 +60,12 @@ public partial class EngagePlayerBehavior : Node, IEngagePlayerBehavior
rng.Randomize();
return rng.RandfRange(min, max);
}
public void OnExitTree()
{
_actionTimer.Stop();
_acquireTargetTimer.Stop();
_actionTimer.Timeout -= OnAttackTimeout;
_acquireTargetTimer.Timeout -= OnAcquireTargetTimeout;
}
}

View File

@@ -58,4 +58,10 @@ public partial class FollowBehavior : Node3D, IBehavior
var velocity = parent.GlobalPosition.DirectionTo(nextVelocity) * (float)_followSpeed * (float)delta;
EmitSignal(SignalName.OnVelocityComputed, velocity);
}
public void OnExitTree()
{
_thinkTimer.Stop();
_thinkTimer.Timeout -= OnTimeout;
}
}

View File

@@ -88,4 +88,11 @@ public partial class PatrolBehavior : Node3D, IBehavior
}
private void PatrolTimer_Timeout() => SetPatrolTarget();
public void OnExitTree()
{
_patrolTimer.Stop();
_patrolTimer.Timeout -= PatrolTimer_Timeout;
_navigationAgent.WaypointReached -= NavigationAgent_WaypointReached;
}
}

View File

@@ -30,4 +30,14 @@ public partial class Sproingy : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayerB
PlayerDetector.BodyExited += PlayerDetector_BodyExited;
SetPhysicsProcess(true);
}
public override void _ExitTree()
{
PatrolBehavior.OnVelocityComputed -= OnVelocityComputed;
FollowBehavior.OnVelocityComputed -= OnVelocityComputed;
EngagePlayerBehavior.TakeAction -= EngagePlayerBehavior_TakeAction;
EngagePlayerBehavior.AcquireTarget -= EngagePlayerBehavior_AcquireTarget;
PlayerDetector.BodyEntered -= PlayerDetector_BodyEntered;
PlayerDetector.BodyExited -= PlayerDetector_BodyExited;
}
}

View File

@@ -23,11 +23,23 @@ public partial class FilthEater : Enemy2D, IHavePatrolBehavior, IHaveEngagePlaye
PatrolBehavior.HomePosition = GlobalPosition;
PatrolBehavior.OnVelocityComputed += OnVelocityComputed;
FollowBehavior.OnVelocityComputed += OnVelocityComputed;
EngagePlayerBehavior.TakeAction += EngagePlayerBehavior_TakeAction;
EngagePlayerBehavior.TakeAction += PerformAction;
EngagePlayerBehavior.AcquireTarget += EngagePlayerBehavior_AcquireTarget;
_enemyLogic.Input(new EnemyLogic.Input.Patrol());
PlayerDetector.BodyEntered += PlayerDetector_BodyEntered;
PlayerDetector.BodyExited += PlayerDetector_BodyExited;
SetPhysicsProcess(true);
}
public override void PerformAction() => EnemyModelView.PlaySecondaryAttackAnimation();
public override void _ExitTree()
{
PatrolBehavior.OnVelocityComputed -= OnVelocityComputed;
FollowBehavior.OnVelocityComputed -= OnVelocityComputed;
EngagePlayerBehavior.TakeAction -= EngagePlayerBehavior_TakeAction;
EngagePlayerBehavior.AcquireTarget -= EngagePlayerBehavior_AcquireTarget;
PlayerDetector.BodyEntered -= PlayerDetector_BodyEntered;
PlayerDetector.BodyExited -= PlayerDetector_BodyExited;
}
}

View File

@@ -24,6 +24,8 @@ Description = "This guy grosses me out."
metadata/_custom_type_script = ExtResource("4_5eid5")
[sub_resource type="CylinderShape3D" id="CylinderShape3D_qbmfg"]
height = 1.5
radius = 3.0
[node name="FilthEater" type="CharacterBody3D"]
process_mode = 1
@@ -71,6 +73,7 @@ collision_layer = 0
collision_mask = 34
[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerDetector"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.179932, 0)
shape = SubResource("CylinderShape3D_qbmfg")
[node name="Components" type="Node3D" parent="."]

View File

@@ -1,8 +1,9 @@
[gd_scene load_steps=302 format=3 uid="uid://bup8c4x1na3aw"]
[gd_scene load_steps=354 format=3 uid="uid://bup8c4x1na3aw"]
[ext_resource type="Script" uid="uid://cvr1qimxpignl" path="res://src/enemy/EnemyModelView2D.cs" id="1_718m1"]
[ext_resource type="Script" uid="uid://dlsgyx4i1jmp3" path="res://src/enemy/EnemyLoreInfo.cs" id="2_krqul"]
[ext_resource type="Texture2D" uid="uid://bdar3daydbkge" path="res://src/enemy/enemy_types/03. filth_eater/animations/SWIPE/Layer 1.png" id="2_vpn42"]
[ext_resource type="Script" uid="uid://ctshiyffvt4y5" path="res://src/system/AttackDataResource.cs" id="3_4h5gj"]
[ext_resource type="Texture2D" uid="uid://o214hr614jit" path="res://src/enemy/enemy_types/03. filth_eater/animations/SWIPE/Layer 2.png" id="3_7tggm"]
[ext_resource type="Texture2D" uid="uid://hyipatqsvukp" path="res://src/enemy/enemy_types/03. filth_eater/animations/SWIPE/Layer 3.png" id="4_usgpm"]
[ext_resource type="Texture2D" uid="uid://sgj8yf8vsocq" path="res://src/enemy/enemy_types/03. filth_eater/animations/SWIPE/Layer 4.png" id="5_ovibr"]
@@ -197,6 +198,8 @@
[ext_resource type="AnimationNodeStateMachine" uid="uid://cbq8xog50cjjy" path="res://src/enemy/animation_state_machines/PrimaryAttackStateMachine.tres" id="195_5cwnl"]
[ext_resource type="AnimationNodeStateMachine" uid="uid://clybvwx3itfeo" path="res://src/enemy/animation_state_machines/SecondaryAttackStateMachine.tres" id="196_e0gee"]
[ext_resource type="AnimationNodeStateMachine" uid="uid://cy2ngl55c0rws" path="res://src/enemy/animation_state_machines/WalkingStateMachine.tres" id="197_mno7m"]
[ext_resource type="Texture2D" uid="uid://wqjql5n24h1l" path="res://src/vfx/Enemy/BLUE_FLAME.png" id="198_mno7m"]
[ext_resource type="Script" uid="uid://cqm6u7qa8japr" path="res://src/system/Projectile.cs" id="199_4h5gj"]
[sub_resource type="Resource" id="Resource_pyy2h"]
script = ExtResource("2_krqul")
@@ -204,6 +207,12 @@ Name = "Filth Eater"
Description = "yuck"
metadata/_custom_type_script = "uid://dlsgyx4i1jmp3"
[sub_resource type="Resource" id="Resource_e5pq0"]
script = ExtResource("3_4h5gj")
Damage = 10
ElementType = 0
metadata/_custom_type_script = "uid://ctshiyffvt4y5"
[sub_resource type="ViewportTexture" id="ViewportTexture_7tggm"]
viewport_path = NodePath("Sprite3D/SubViewportContainer/SubViewport")
@@ -1582,40 +1591,38 @@ tracks/1/keys = {
"update": 0,
"values": [0, 39]
}
tracks/2/type = "value"
tracks/2/type = "animation"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/2/path = NodePath("attack VFX/attack VFX animplayer")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 1.75453, 2.16781),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
tracks/3/type = "animation"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("attack VFX/attack VFX animplayer")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"clips": PackedStringArray("[stop]", "attack", "[stop]"),
"times": PackedFloat32Array(0, 0.833333, 3.16667)
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("OmniLight3D:light_energy")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("OmniLight3D:light_energy")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0.833333, 1.91667, 2, 2.16667),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [0.0, 10.0, 500.0, 0.0]
}
tracks/4/type = "animation"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Attack Objects/Projectile1/Bullet/AnimationPlayer")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"clips": PackedStringArray("Fire"),
"times": PackedFloat32Array(1.91667)
}
[sub_resource type="Animation" id="Animation_7a6is"]
resource_name = "secondary_attack_back"
@@ -2341,10 +2348,420 @@ _data = {
&"attack": SubResource("Animation_nmlvd")
}
[sub_resource type="Resource" id="Resource_mno7m"]
script = ExtResource("3_4h5gj")
Damage = 7
ElementType = 4
metadata/_custom_type_script = "uid://ctshiyffvt4y5"
[sub_resource type="AtlasTexture" id="AtlasTexture_xrn7e"]
atlas = ExtResource("198_mno7m")
region = Rect2(1024, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_8qeb2"]
atlas = ExtResource("198_mno7m")
region = Rect2(1536, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_q8n6h"]
atlas = ExtResource("198_mno7m")
region = Rect2(2048, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_brbcy"]
atlas = ExtResource("198_mno7m")
region = Rect2(2560, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_dftoy"]
atlas = ExtResource("198_mno7m")
region = Rect2(3072, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_8u0x2"]
atlas = ExtResource("198_mno7m")
region = Rect2(3584, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_fqqmc"]
atlas = ExtResource("198_mno7m")
region = Rect2(4096, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_b1lif"]
atlas = ExtResource("198_mno7m")
region = Rect2(4608, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_f7ayv"]
atlas = ExtResource("198_mno7m")
region = Rect2(5120, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_2y7ln"]
atlas = ExtResource("198_mno7m")
region = Rect2(5632, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_311ch"]
atlas = ExtResource("198_mno7m")
region = Rect2(6144, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_60ajf"]
atlas = ExtResource("198_mno7m")
region = Rect2(6656, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_qcv8t"]
atlas = ExtResource("198_mno7m")
region = Rect2(7168, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_ym3vo"]
atlas = ExtResource("198_mno7m")
region = Rect2(7680, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_5fqo7"]
atlas = ExtResource("198_mno7m")
region = Rect2(8192, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_w2bwt"]
atlas = ExtResource("198_mno7m")
region = Rect2(8704, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_qm55s"]
atlas = ExtResource("198_mno7m")
region = Rect2(9216, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_rdrim"]
atlas = ExtResource("198_mno7m")
region = Rect2(9728, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_kli1f"]
atlas = ExtResource("198_mno7m")
region = Rect2(10240, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_dif4r"]
atlas = ExtResource("198_mno7m")
region = Rect2(10752, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_4mwd1"]
atlas = ExtResource("198_mno7m")
region = Rect2(11264, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_npl5k"]
atlas = ExtResource("198_mno7m")
region = Rect2(11776, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_obbx1"]
atlas = ExtResource("198_mno7m")
region = Rect2(12288, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_4o8yi"]
atlas = ExtResource("198_mno7m")
region = Rect2(12800, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_kk4df"]
atlas = ExtResource("198_mno7m")
region = Rect2(13312, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_a212s"]
atlas = ExtResource("198_mno7m")
region = Rect2(13824, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_ddop6"]
atlas = ExtResource("198_mno7m")
region = Rect2(14336, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_bsamt"]
atlas = ExtResource("198_mno7m")
region = Rect2(14848, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_lcs75"]
atlas = ExtResource("198_mno7m")
region = Rect2(15360, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_sv0jq"]
atlas = ExtResource("198_mno7m")
region = Rect2(15872, 0, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_ap565"]
atlas = ExtResource("198_mno7m")
region = Rect2(0, 502, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_x7xwk"]
atlas = ExtResource("198_mno7m")
region = Rect2(512, 502, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_gf7y0"]
atlas = ExtResource("198_mno7m")
region = Rect2(1024, 502, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_n3cae"]
atlas = ExtResource("198_mno7m")
region = Rect2(1536, 502, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_s3abf"]
atlas = ExtResource("198_mno7m")
region = Rect2(2048, 502, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_ldl6g"]
atlas = ExtResource("198_mno7m")
region = Rect2(2560, 502, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_ysnl1"]
atlas = ExtResource("198_mno7m")
region = Rect2(3072, 502, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_l6jiv"]
atlas = ExtResource("198_mno7m")
region = Rect2(3584, 502, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_ra6k7"]
atlas = ExtResource("198_mno7m")
region = Rect2(4096, 502, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_chxxr"]
atlas = ExtResource("198_mno7m")
region = Rect2(4608, 502, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_1cxo4"]
atlas = ExtResource("198_mno7m")
region = Rect2(5120, 502, 512, 502)
[sub_resource type="AtlasTexture" id="AtlasTexture_sx8e2"]
atlas = ExtResource("198_mno7m")
region = Rect2(5632, 502, 512, 502)
[sub_resource type="SpriteFrames" id="SpriteFrames_brsyt"]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_xrn7e")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_8qeb2")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_q8n6h")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_brbcy")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_dftoy")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_8u0x2")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_fqqmc")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_b1lif")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_f7ayv")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_2y7ln")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_311ch")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_60ajf")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_qcv8t")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ym3vo")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_5fqo7")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_w2bwt")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_qm55s")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_rdrim")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_kli1f")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_dif4r")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_4mwd1")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_npl5k")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_obbx1")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_4o8yi")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_kk4df")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_a212s")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ddop6")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_bsamt")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_lcs75")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_sv0jq")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ap565")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_x7xwk")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_gf7y0")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_n3cae")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_s3abf")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ldl6g")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ysnl1")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_l6jiv")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ra6k7")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_chxxr")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_1cxo4")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_sx8e2")
}],
"loop": true,
"name": &"default",
"speed": 24.0
}]
[sub_resource type="SphereShape3D" id="SphereShape3D_kct8n"]
[sub_resource type="Animation" id="Animation_8qeb2"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("..:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0, 0, 0)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("../ProjectileHitbox:monitoring")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath(".:visible")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="Animation" id="Animation_xrn7e"]
resource_name = "fire"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("..:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0, 0, 10)]
}
tracks/1/type = "audio"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("../AudioStreamPlayer3D")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": null
}],
"times": PackedFloat32Array(0.0333333)
}
tracks/1/use_blend = true
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("../ProjectileHitbox:monitoring")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.0333333, 1),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [false, true, false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".:visible")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.0333333, 1),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [false, true, false]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_q8n6h"]
_data = {
&"Fire": SubResource("Animation_xrn7e"),
&"RESET": SubResource("Animation_8qeb2")
}
[node name="EnemyModelView" type="Node3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.97683, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0)
script = ExtResource("1_718m1")
EnemyLoreInfo = SubResource("Resource_pyy2h")
AttackData = SubResource("Resource_e5pq0")
[node name="Sprite3D" type="Sprite3D" parent="."]
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 0.0862446, 0)
@@ -2411,3 +2828,36 @@ libraries = {
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.546972)
light_color = Color(0.837456, 0.93601, 0.775258, 1)
omni_attenuation = 0.2
[node name="Attack Objects" type="Node3D" parent="."]
[node name="Projectile1" type="Node3D" parent="Attack Objects"]
script = ExtResource("199_4h5gj")
AttackData = SubResource("Resource_mno7m")
[node name="Bullet" type="Node3D" parent="Attack Objects/Projectile1"]
[node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="Attack Objects/Projectile1/Bullet"]
visible = false
offset = Vector2(0, 150)
billboard = 1
sprite_frames = SubResource("SpriteFrames_brsyt")
autoplay = "default"
frame_progress = 0.79063
[node name="ProjectileHitbox" type="Area3D" parent="Attack Objects/Projectile1/Bullet"]
unique_name_in_owner = true
collision_layer = 0
collision_mask = 64
monitoring = false
[node name="CollisionShape3D" type="CollisionShape3D" parent="Attack Objects/Projectile1/Bullet/ProjectileHitbox"]
shape = SubResource("SphereShape3D_kct8n")
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="Attack Objects/Projectile1/Bullet"]
[node name="AnimationPlayer" type="AnimationPlayer" parent="Attack Objects/Projectile1/Bullet"]
root_node = NodePath("../AnimatedSprite3D")
libraries = {
&"": SubResource("AnimationLibrary_q8n6h")
}

View File

@@ -21,8 +21,8 @@ public partial class EnemyLogic
OnDetach(() =>
{
var enemy = Get<IEnemy>();
if (enemy is IHaveFollowBehavior patrolEnemy)
patrolEnemy.FollowBehavior.StopFollow();
if (enemy is IHaveFollowBehavior followEnemy)
followEnemy.FollowBehavior.StopFollow();
});
}