1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
extends State
enum ManCannonStates { INITIAL, OPERATE_CANNON, MOVE_TO_CANNON, FIND_CANNONBALL }
var ai_substate: int
var path_requested: bool = false
var retry_timer: float = 0.0
var searching_for: String
var cannon: NetMachine
# Corresponds to the `_process()` callback.
func update(delta: float) -> void:
retry_timer -= delta
# Virtual function. Corresponds to the `_physics_process()` callback.
func physics_update(_delta: float) -> void:
match ai_substate:
ManCannonStates.INITIAL:
_state_initial()
ManCannonStates.MOVE_TO_CANNON:
_state_move_to_cannon()
ManCannonStates.FIND_CANNONBALL:
_state_find_cannonball()
ManCannonStates.OPERATE_CANNON:
_state_operate_cannon()
func _state_initial() -> void:
if cannon.loaded:
change_substate(ManCannonStates.MOVE_TO_CANNON)
else:
change_substate(ManCannonStates.FIND_CANNONBALL)
func _state_move_to_cannon() -> void:
if !path_requested:
#CharacterAIManager.request_find_path(owner, Vector3.ZERO, true, cannon.get_node("AINavPoint"))
owner.ai_set_path_target(cannon.get_node("AINavPoint").global_transform.origin)
owner.ai_set_look_status(cannon.steer_area, "TRACK")
path_requested = true
if (owner.global_transform.origin - cannon.get_node("AINavPoint").global_transform.origin).length_squared() > 4:
owner.ai_set_path_target(cannon.get_node("AINavPoint").global_transform.origin)
if retry_timer <= 0 and owner.use_ray.is_colliding():
if owner.use_ray.get_collider() == cannon.steer_area:
owner.use_held = false
owner.initiate_use()
if !cannon.loaded:
owner.use_held = true
retry_timer = 3.1
if owner.machine == cannon:
owner.ai_set_look_status(null, "NONE")
retry_timer = 1.0
change_substate(ManCannonStates.OPERATE_CANNON)
func _state_find_cannonball() -> void:
#CHECK FOR BALL BOX FIRST! /setaistate Player ManCannon
if !path_requested:
CharacterAIManager.request_find_object(owner, "BallBarrel", 50, true)
searching_for = "BallBarrel"
path_requested = true
#if !path_requested:
# CharacterAIManager.request_find_object(owner, "Cannonball", 50, false)
# searching_for = "Cannonball"
# path_requested = true
if owner.use_ray.is_colliding():
if owner.use_ray.get_collider().name.begins_with("UseArea") and owner.use_ray.get_collider().get_parent().name.begins_with(searching_for):
owner.initiate_use()
#cannonball found
if owner.inventory["cannonball"] > 0:
change_substate(ManCannonStates.MOVE_TO_CANNON)
func _state_operate_cannon() -> void:
if owner.machine != cannon: #if control lost
if is_instance_valid(cannon):
change_substate(ManCannonStates.MOVE_TO_CANNON)
else:
state_machine.transition_to("Idle")
return
if retry_timer <= 0.0:
cannon.attack1()
owner.initiate_use()
change_substate(ManCannonStates.FIND_CANNONBALL)
func change_substate(to: int):
path_requested = false
ai_substate = to
func enter(msg := {}) -> void:
retry_timer = 0
ai_substate = ManCannonStates.INITIAL
if "cannon" in msg.keys():
cannon = msg["cannon"]
else:
if owner.ai_target_machine != null:
cannon = owner.ai_target_machine
return
var bodies = owner.get_node("AISearchArea").get_overlapping_bodies()
for body in bodies:
if body.name.begins_with("Cannon"):
cannon = body
return
#if cannon not found
print("cannon not found")
state_machine.transition_to("Idle")
func exit() -> void:
pass
|