diff --git a/config/attack_box/box_large.tres b/config/attack_box/box_large.tres index c82d7e7..16ed6ec 100644 --- a/config/attack_box/box_large.tres +++ b/config/attack_box/box_large.tres @@ -11,3 +11,4 @@ shape = SubResource("BoxShape3D_87jhu") offset = Vector2(1, 0.4) is_throw = false is_direct = false +is_hit_self = false diff --git a/config/attack_box/box_mid.tres b/config/attack_box/box_mid.tres index 0f412e5..e94cc64 100644 --- a/config/attack_box/box_mid.tres +++ b/config/attack_box/box_mid.tres @@ -11,3 +11,4 @@ shape = SubResource("BoxShape3D_87jhu") offset = Vector2(0.8, 0.4) is_throw = false is_direct = false +is_hit_self = false diff --git a/config/attack_box/box_normal.tres b/config/attack_box/box_normal.tres index 522f82d..1b7476f 100644 --- a/config/attack_box/box_normal.tres +++ b/config/attack_box/box_normal.tres @@ -11,3 +11,4 @@ shape = SubResource("BoxShape3D_87jhu") offset = Vector2(0.6, 0.4) is_throw = false is_direct = false +is_hit_self = false diff --git a/config/attack_box/box_small.tres b/config/attack_box/box_small.tres index f267548..17ea0a2 100644 --- a/config/attack_box/box_small.tres +++ b/config/attack_box/box_small.tres @@ -11,3 +11,4 @@ shape = SubResource("BoxShape3D_87jhu") offset = Vector2(0.4, 0.4) is_throw = false is_direct = false +is_hit_self = false diff --git a/config/attack_box/circle_foot.tres b/config/attack_box/circle_foot.tres index e2b2cdd..eaedfec 100644 --- a/config/attack_box/circle_foot.tres +++ b/config/attack_box/circle_foot.tres @@ -11,3 +11,4 @@ shape = SubResource("CylinderShape3D_78ng8") offset = Vector2(0, 0) is_throw = false is_direct = false +is_hit_self = false diff --git a/config/attack_box/circle_large.tres b/config/attack_box/circle_large.tres index 6fe2eb3..204140b 100644 --- a/config/attack_box/circle_large.tres +++ b/config/attack_box/circle_large.tres @@ -12,3 +12,4 @@ shape = SubResource("CylinderShape3D_pmh6g") offset = Vector2(0, 0) is_throw = false is_direct = false +is_hit_self = false diff --git a/config/attack_box/circle_mid.tres b/config/attack_box/circle_mid.tres index 7cf411e..3cf3270 100644 --- a/config/attack_box/circle_mid.tres +++ b/config/attack_box/circle_mid.tres @@ -12,3 +12,4 @@ shape = SubResource("CylinderShape3D_pmh6g") offset = Vector2(0, 0) is_throw = false is_direct = false +is_hit_self = false diff --git a/config/character/bullet_hero01_short_stab01.tres b/config/character/bullet_hero01_short_stab01.tres index 82df9a5..f64e872 100644 --- a/config/character/bullet_hero01_short_stab01.tres +++ b/config/character/bullet_hero01_short_stab01.tres @@ -1,7 +1,7 @@ [gd_resource type="Resource" script_class="CharacterCfg" load_steps=9 format=3 uid="uid://cb4q16lmqwbin"] [ext_resource type="PackedScene" uid="uid://bei75ysjq2pi4" path="res://scene/ai/bullet_simple.tscn" id="1_3q8i1"] -[ext_resource type="Resource" uid="uid://ckbf40c75bfqf" path="res://config/attack/sharp_normal_hit_up.tres" id="2_m73qf"] +[ext_resource type="Resource" uid="uid://d3mcp8sf6qbmd" path="res://config/attack/sharp_normal_hit.tres" id="2_3q8i1"] [ext_resource type="Resource" uid="uid://decgfcx2xsj8i" path="res://config/attack_box/circle_mid.tres" id="3_3q8i1"] [ext_resource type="Resource" uid="uid://iv8g1x3bkxvv" path="res://config/character_move/fast_fly.tres" id="4_2bsgq"] [ext_resource type="Resource" uid="uid://dpajmgrlaytah" path="res://config/character_mp/normal.tres" id="5_gsbwd"] @@ -22,7 +22,7 @@ mp = ExtResource("5_gsbwd") ai_behavior_tree = ExtResource("1_3q8i1") hp_max = 100.0 attack = 1.0 -attack1 = ExtResource("2_m73qf") +attack1 = ExtResource("2_3q8i1") attack1_box = ExtResource("3_3q8i1") sub_character_auto_create = false material_on = 0 diff --git a/config/character/bullet_hero01_soul_hit01.tres b/config/character/bullet_hero01_soul_hit01.tres index a4c8f66..1ae0d48 100644 --- a/config/character/bullet_hero01_soul_hit01.tres +++ b/config/character/bullet_hero01_soul_hit01.tres @@ -1,10 +1,11 @@ -[gd_resource type="Resource" script_class="CharacterCfg" load_steps=8 format=3 uid="uid://d3mafsovw1mko"] +[gd_resource type="Resource" script_class="CharacterCfg" load_steps=9 format=3 uid="uid://d3mafsovw1mko"] [ext_resource type="Resource" uid="uid://ckbf40c75bfqf" path="res://config/attack/sharp_normal_hit_up.tres" id="1_at6jo"] +[ext_resource type="PackedScene" uid="uid://bei75ysjq2pi4" path="res://scene/ai/bullet_simple.tscn" id="1_m7qit"] [ext_resource type="Resource" uid="uid://bld0vhuhgydm8" path="res://config/attack_box/direct.tres" id="2_780us"] [ext_resource type="Resource" uid="uid://iv8g1x3bkxvv" path="res://config/character_move/fast_fly.tres" id="3_cx00u"] [ext_resource type="Resource" uid="uid://dpajmgrlaytah" path="res://config/character_mp/normal.tres" id="4_alws1"] -[ext_resource type="Script" path="res://script/config/character_cfg.gd" id="5_4n1ni"] +[ext_resource type="Script" uid="uid://dt3chi1tgnaef" path="res://script/config/character_cfg.gd" id="5_4n1ni"] [ext_resource type="Resource" uid="uid://h1curvk64vm3" path="res://config/character_shield/none.tres" id="6_u7wv4"] [ext_resource type="Resource" uid="uid://5jes0p152akr" path="res://config/character_stun/none.tres" id="7_txgsx"] @@ -18,6 +19,7 @@ move = ExtResource("3_cx00u") shield = ExtResource("6_u7wv4") stun = ExtResource("7_txgsx") mp = ExtResource("4_alws1") +ai_behavior_tree = ExtResource("1_m7qit") hp_max = 100.0 attack = 1.0 attack1 = ExtResource("1_at6jo") diff --git a/config/skill_player_weapon/hero01_long_stab02.tres b/config/skill_player_weapon/hero01_long_stab02.tres index 2d1a303..9fe4a50 100644 --- a/config/skill_player_weapon/hero01_long_stab02.tres +++ b/config/skill_player_weapon/hero01_long_stab02.tres @@ -19,9 +19,7 @@ break_level = 0 is_charging = false attack1 = ExtResource("1_2k8jp") attack1_box = ExtResource("2_1jdoh") -attack1_with_pause_frame = false attack1_with_stop = false -attack2_with_pause_frame = false attack2_with_stop = false mp_cost = 0 mp_sub_cost = false diff --git a/config/skill_player_weapon/hero01_short_skill01.tres b/config/skill_player_weapon/hero01_short_skill01.tres index 73d0ebe..01185c7 100644 --- a/config/skill_player_weapon/hero01_short_skill01.tres +++ b/config/skill_player_weapon/hero01_short_skill01.tres @@ -15,9 +15,7 @@ stance_from = 1 stance_to = 30 break_level = 3 is_charging = false -attack1_with_pause_frame = false attack1_with_stop = false -attack2_with_pause_frame = false attack2_with_stop = false mp_cost = 0 mp_sub_cost = false diff --git a/config/skill_player_weapon/hero01_short_stab01.tres b/config/skill_player_weapon/hero01_short_stab01.tres index 201956d..0403dcf 100644 --- a/config/skill_player_weapon/hero01_short_stab01.tres +++ b/config/skill_player_weapon/hero01_short_stab01.tres @@ -21,17 +21,15 @@ break_level = 3 is_charging = false attack1 = ExtResource("1_5n6sn") attack1_box = ExtResource("2_67ngl") -attack1_with_pause_frame = false attack1_with_stop = false -attack2_with_pause_frame = false attack2_with_stop = false mp_cost = 0 mp_sub_cost = false free_lock = false ignore_push = true with_stop = false -is_lock_x = true -is_lock_x_move = true +is_lock_x = false +is_lock_x_move = false range = 0.0 warn_type = 0 sprite_frames = ExtResource("5_kk2vu") diff --git a/scene/ai/bullet_simple.tscn b/scene/ai/bullet_simple.tscn index 833d385..70b89ab 100644 --- a/scene/ai/bullet_simple.tscn +++ b/scene/ai/bullet_simple.tscn @@ -1,24 +1,59 @@ -[gd_scene load_steps=6 format=3 uid="uid://bei75ysjq2pi4"] +[gd_scene load_steps=9 format=3 uid="uid://bei75ysjq2pi4"] [ext_resource type="Script" uid="uid://mvwcxqcetiqp" path="res://addons/beehave/nodes/beehave_tree.gd" id="1_7oi2o"] +[ext_resource type="Script" uid="uid://dcqq2mursvw5m" path="res://addons/beehave/nodes/decorators/succeeder.gd" id="3_08et5"] [ext_resource type="Script" uid="uid://cugftmuc8v30c" path="res://addons/beehave/nodes/composites/sequence.gd" id="3_i33jf"] -[ext_resource type="Script" uid="uid://cnw25wdsd3c76" path="res://script/ai/action/action_wait.gd" id="5_onfb3"] +[ext_resource type="Script" uid="uid://csd1yh0ruy3yu" path="res://script/ai/action/action_wait_tick.gd" id="3_qy88u"] +[ext_resource type="Script" uid="uid://b3ulieg4i8ivy" path="res://script/ai/action/action_check_hit_character.gd" id="6_jq3ry"] [ext_resource type="Script" uid="uid://ddcaceywxwt20" path="res://script/ai/action/action_attack1.gd" id="6_oqib4"] +[ext_resource type="Script" uid="uid://bhxaiqao7nkth" path="res://script/ai/action/action_check_hit_wall.gd" id="8_qnf6p"] [ext_resource type="Script" uid="uid://ci3tg5fkdn16f" path="res://script/ai/action/action_destroy.gd" id="11_i4mx4"] [node name="BeehaveTree" type="Node" node_paths=PackedStringArray("blackboard")] script = ExtResource("1_7oi2o") -blackboard = NodePath("@Node@25322") +blackboard = NodePath("@Node@25116") [node name="SequenceComposite" type="Node" parent="."] script = ExtResource("3_i33jf") -[node name="ActionWait" type="Node" parent="SequenceComposite"] -script = ExtResource("5_onfb3") -wait_time = 0.05 +[node name="AlwaysSucceedDecorator" type="Node" parent="SequenceComposite"] +script = ExtResource("3_08et5") +metadata/_custom_type_script = ExtResource("3_08et5") -[node name="ActionAttack1" type="Node" parent="SequenceComposite"] +[node name="保持攻击" type="Node" parent="SequenceComposite/AlwaysSucceedDecorator"] +script = ExtResource("3_i33jf") + +[node name="ActionWaitTick" type="Node" parent="SequenceComposite/AlwaysSucceedDecorator/保持攻击"] +script = ExtResource("3_qy88u") +metadata/_custom_type_script = ExtResource("3_qy88u") + +[node name="ActionAttack1" type="Node" parent="SequenceComposite/AlwaysSucceedDecorator/保持攻击"] script = ExtResource("6_oqib4") -[node name="ActionDestroy" type="Node" parent="SequenceComposite"] +[node name="AlwaysSucceedDecorator2" type="Node" parent="SequenceComposite"] +script = ExtResource("3_08et5") +metadata/_custom_type_script = ExtResource("3_08et5") + +[node name="检测命中角色并销毁" type="Node" parent="SequenceComposite/AlwaysSucceedDecorator2"] +script = ExtResource("3_i33jf") + +[node name="ActionCheckHitCharacter" type="Node" parent="SequenceComposite/AlwaysSucceedDecorator2/检测命中角色并销毁"] +script = ExtResource("6_jq3ry") +metadata/_custom_type_script = ExtResource("6_jq3ry") + +[node name="ActionDestroy" type="Node" parent="SequenceComposite/AlwaysSucceedDecorator2/检测命中角色并销毁"] +script = ExtResource("11_i4mx4") + +[node name="AlwaysSucceedDecorator3" type="Node" parent="SequenceComposite"] +script = ExtResource("3_08et5") +metadata/_custom_type_script = ExtResource("3_08et5") + +[node name="检测命中墙壁并销毁" type="Node" parent="SequenceComposite/AlwaysSucceedDecorator3"] +script = ExtResource("3_i33jf") + +[node name="ActionCheckHitWall" type="Node" parent="SequenceComposite/AlwaysSucceedDecorator3/检测命中墙壁并销毁"] +script = ExtResource("8_qnf6p") +metadata/_custom_type_script = ExtResource("8_qnf6p") + +[node name="ActionDestroy" type="Node" parent="SequenceComposite/AlwaysSucceedDecorator3/检测命中墙壁并销毁"] script = ExtResource("11_i4mx4") diff --git a/scene/ai/bullet_simple_penetrat.tscn b/scene/ai/bullet_simple_penetrat.tscn index 9b4f458..c6d27f5 100644 --- a/scene/ai/bullet_simple_penetrat.tscn +++ b/scene/ai/bullet_simple_penetrat.tscn @@ -7,7 +7,7 @@ [node name="BeehaveTree" type="Node" node_paths=PackedStringArray("blackboard")] script = ExtResource("1_6wcp2") -blackboard = NodePath("@Node@25321") +blackboard = NodePath("@Node@25116") [node name="SequenceComposite" type="Node" parent="."] script = ExtResource("2_0p8p1") diff --git a/scene/ai/monster01.tscn b/scene/ai/monster01.tscn index d7bf365..f6128e6 100644 --- a/scene/ai/monster01.tscn +++ b/scene/ai/monster01.tscn @@ -1,17 +1,17 @@ [gd_scene load_steps=9 format=3 uid="uid://r4o07ns0q8rg"] -[ext_resource type="Script" path="res://addons/beehave/nodes/beehave_tree.gd" id="1_bbyao"] -[ext_resource type="Script" path="res://addons/beehave/nodes/composites/sequence.gd" id="2_04nig"] -[ext_resource type="Script" path="res://script/ai/action/action_find_target.gd" id="3_c43ds"] -[ext_resource type="Script" path="res://addons/beehave/nodes/composites/selector.gd" id="4_hf0vc"] -[ext_resource type="Script" path="res://script/ai/action_role_check/action_role_check_is.gd" id="5_niu75"] -[ext_resource type="Script" path="res://script/ai/action_with_target/action_move_to.gd" id="6_l7hec"] -[ext_resource type="Script" path="res://script/ai/action_with_target/action_cast_skill.gd" id="7_up57t"] -[ext_resource type="Script" path="res://script/ai/action/action_wait.gd" id="8_pkgji"] +[ext_resource type="Script" uid="uid://mvwcxqcetiqp" path="res://addons/beehave/nodes/beehave_tree.gd" id="1_bbyao"] +[ext_resource type="Script" uid="uid://cugftmuc8v30c" path="res://addons/beehave/nodes/composites/sequence.gd" id="2_04nig"] +[ext_resource type="Script" uid="uid://d1cbkwu2v41cf" path="res://script/ai/action/action_find_target.gd" id="3_c43ds"] +[ext_resource type="Script" uid="uid://casy048cfvo0l" path="res://addons/beehave/nodes/composites/selector.gd" id="4_hf0vc"] +[ext_resource type="Script" uid="uid://dswopca1g8ewi" path="res://script/ai/action_role_check/action_role_check_is.gd" id="5_niu75"] +[ext_resource type="Script" uid="uid://dq21r8kmyo51u" path="res://script/ai/action_with_target/action_move_to.gd" id="6_l7hec"] +[ext_resource type="Script" uid="uid://dalb13ecr5sx1" path="res://script/ai/action_with_target/action_cast_skill.gd" id="7_up57t"] +[ext_resource type="Script" uid="uid://cnw25wdsd3c76" path="res://script/ai/action/action_wait.gd" id="8_pkgji"] [node name="BeehaveTree" type="Node" node_paths=PackedStringArray("blackboard")] script = ExtResource("1_bbyao") -blackboard = NodePath("@Node@19482") +blackboard = NodePath("@Node@25117") [node name="SequenceComposite" type="Node" parent="."] script = ExtResource("2_04nig") diff --git a/script/_global/struct.gd.uid b/script/_global/struct.gd.uid new file mode 100644 index 0000000..56d0580 --- /dev/null +++ b/script/_global/struct.gd.uid @@ -0,0 +1 @@ +uid://b3d1xvbgttiq7 diff --git a/script/ai/action/action_check_hit_character.gd b/script/ai/action/action_check_hit_character.gd new file mode 100644 index 0000000..19f464e --- /dev/null +++ b/script/ai/action/action_check_hit_character.gd @@ -0,0 +1,8 @@ +extends Action +class_name ActionCheckHitCharacter + +func run(character: Character, blackboard: Blackboard) -> int: + if character.get_status("is_hit_character"): + return SUCCESS + return FAILURE + diff --git a/script/ai/action/action_check_hit_character.gd.uid b/script/ai/action/action_check_hit_character.gd.uid new file mode 100644 index 0000000..6df7475 --- /dev/null +++ b/script/ai/action/action_check_hit_character.gd.uid @@ -0,0 +1 @@ +uid://b3ulieg4i8ivy diff --git a/script/ai/action/action_check_hit_wall.gd b/script/ai/action/action_check_hit_wall.gd new file mode 100644 index 0000000..fd6827b --- /dev/null +++ b/script/ai/action/action_check_hit_wall.gd @@ -0,0 +1,8 @@ +extends Action +class_name ActionCheckHitWall + +func run(character: Character, blackboard: Blackboard) -> int: + if character.get_status("is_hit_wall"): + return SUCCESS + return FAILURE + diff --git a/script/ai/action/action_check_hit_wall.gd.uid b/script/ai/action/action_check_hit_wall.gd.uid new file mode 100644 index 0000000..7280a7e --- /dev/null +++ b/script/ai/action/action_check_hit_wall.gd.uid @@ -0,0 +1 @@ +uid://bhxaiqao7nkth diff --git a/script/ai/action/action_wait.gd b/script/ai/action/action_wait.gd index 79b643e..da6032b 100644 --- a/script/ai/action/action_wait.gd +++ b/script/ai/action/action_wait.gd @@ -11,4 +11,4 @@ func run(character: Character, blackboard: Blackboard) -> int: if wait_time_left >= wait_time: wait_time_left = 0 return SUCCESS - return RUNNING + return FAILURE diff --git a/script/ai/action/action_wait_tick.gd b/script/ai/action/action_wait_tick.gd new file mode 100644 index 0000000..a75a006 --- /dev/null +++ b/script/ai/action/action_wait_tick.gd @@ -0,0 +1,13 @@ +extends Action +class_name ActionWaitTick + +var wait_time: float = 0.1 +var wait_time_left: float + + +func run(character: Character, blackboard: Blackboard) -> int: + wait_time_left += get_physics_process_delta_time() + if wait_time_left >= wait_time: + wait_time_left = 0 + return SUCCESS + return FAILURE diff --git a/script/ai/action/action_wait_tick.gd.uid b/script/ai/action/action_wait_tick.gd.uid new file mode 100644 index 0000000..704ddd9 --- /dev/null +++ b/script/ai/action/action_wait_tick.gd.uid @@ -0,0 +1 @@ +uid://csd1yh0ruy3yu diff --git a/script/character/battle.gd b/script/character/battle.gd index 0cfbe30..9cc9b77 100644 --- a/script/character/battle.gd +++ b/script/character/battle.gd @@ -70,6 +70,7 @@ func add_attack(attack_info: Struct.AttackInfo) -> void: func on_attack_character(result: Character, attack_info: Struct.AttackInfo) -> void: if attack_info.attack_box.is_hit_self != (result.team() == character.team()): return + status.is_hit_character = true var hit_result: Struct.HitResultInfo = settle(character.id(), result.id(), attack_info) on_attack_hit(hit_result) diff --git a/script/character/move.gd b/script/character/move.gd index 40dee7b..9fd153d 100644 --- a/script/character/move.gd +++ b/script/character/move.gd @@ -119,15 +119,15 @@ func update_move_effect(delta): func update_move_check(delta) -> bool: var velocity: Vector3 = character.velocity character.move_and_slide() - if status.is_stagger: - var collision_count: int = character.get_slide_collision_count() - if collision_count > 0: - var normal: Vector3 = Vector3.ZERO - for i in collision_count: - var collision: KinematicCollision3D = character.get_slide_collision(i) - normal += collision.get_normal() - normal = normal.normalized() - var normal_speed: float = velocity.dot(normal) + var collision_count: int = character.get_slide_collision_count() + if collision_count > 0: + var normal: Vector3 = Vector3.ZERO + for i in collision_count: + var collision: KinematicCollision3D = character.get_slide_collision(i) + normal += collision.get_normal() + normal = normal.normalized() + var normal_speed: float = velocity.dot(normal) + if status.is_stagger: if normal_speed < -6 and normal.y >= 0: #墙体互动 Global.effect_mgr.cast_particle(ResourceManager.particle_hit_ground_heavy, character.pos(), normal) @@ -145,8 +145,10 @@ func update_move_check(delta) -> bool: character.velocity = velocity - normal * normal_speed * 1.5 character.add_buff("floating", -1) Global.camera_mgr.effect_shake(0.1) - if normal.y == 0: - return true + if normal.y == 0: + if not status.is_stagger: + status.is_hit_wall = true + return true return false diff --git a/script/character/skill.gd b/script/character/skill.gd index 8a793b9..2d4443e 100644 --- a/script/character/skill.gd +++ b/script/character/skill.gd @@ -175,6 +175,8 @@ func break_skill(): status.is_charging = false status.charging_level = 0 status.skill_action_key = "" + status.is_hit_character = false + status.is_hit_wall = false status.set_skill_break_level_add(0) buff.remove_buff("charging") battle_attack_area.set_active(false) diff --git a/script/character/status.gd b/script/character/status.gd index fb8664d..209a54d 100644 --- a/script/character/status.gd +++ b/script/character/status.gd @@ -83,6 +83,8 @@ var skill_dir: Vector2 #技能释放方向 var skill_move_dir: Vector2 #技能位移方向 var skill_action_key: String #技能输入指令 var skill_repeat_count: int #技能重复释放次数 +var is_hit_character: bool #是否击中角色 +var is_hit_wall: bool #是否移动击中墙 @export var skill_move_speed: float #技能位移速度 @export var skill_float_speed: float #技能y位移速度