You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
1.3 KiB
GDScript

extends Node3D
class_name Buff
@onready var character = (get_owner() as Character)
@onready var status = (%Status as Status)
class BuffInfo:
var name : String
var duration : float
var buff_map = {} #命中信息
func _process(delta):
for buff_name in buff_map:
var buff_info = buff_map[buff_name]
if buff_info.duration == -1:
trigger_buff_effect(buff_info.name,"update")
else:
buff_info.duration -= delta
if buff_info.duration <= 0:
trigger_buff_effect(buff_info.name,"end")
buff_map.erase(buff_name)
else:
trigger_buff_effect(buff_info.name,"update")
func trigger_buff_effect(buff_name:String,trigger_name:String):
var function_name = "on_%s_%s" % [trigger_name,buff_name]
if has_method(function_name):
call(function_name)
func has_buff(buff_name:String) -> bool:
return buff_name in buff_map
func add_buff(buff_name:String,duration:float):
if buff_name in buff_map:
buff_map[buff_name].duration = duration
else:
var new_buff = BuffInfo.new()
new_buff.name = buff_name
new_buff.duration = duration
buff_map[buff_name] = new_buff
trigger_buff_effect(buff_name,"start")
#==具体实现==
func on_end_hit_back():status.hit_back_speed = 0
func on_end_hit_up():status.hit_up_speed = 0
func on_start_stagger():status.is_stagger = true
func on_end_stagger():status.is_stagger = false
func on_end_stun():status.is_stun = false