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
		
	
		
		
			
		
	
	
			50 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			GDScript
		
	
| 
											2 years ago
										 | 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 |