|  |  |  | @tool | 
					
						
							|  |  |  | extends AnimationSelectCfg | 
					
						
							|  |  |  | class_name SkillCfg | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @export var name: String | 
					
						
							|  |  |  | @export var skill_animation: Animation | 
					
						
							|  |  |  | @export var range: float | 
					
						
							|  |  |  | @export var free_lock: bool | 
					
						
							|  |  |  | @export var ignore_push: bool | 
					
						
							|  |  |  | @export var attack1: AttackCfg | 
					
						
							|  |  |  | @export var attack1_box: AttackBoxCfg | 
					
						
							|  |  |  | @export var attack2: AttackCfg | 
					
						
							|  |  |  | @export var attack2_box: AttackBoxCfg | 
					
						
							|  |  |  | @export var sub_character: CharacterCfg | 
					
						
							|  |  |  | @export var stance_from: Enum.EStance = Enum.EStance.GroundAny | 
					
						
							|  |  |  | @export var stance_to: Enum.EStance | 
					
						
							|  |  |  | @export var break_level: Enum.EBreakLevel = Enum.EBreakLevel.Break | 
					
						
							|  |  |  | @export var is_charging: bool | 
					
						
							|  |  |  | @export var mp_cost: int | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @export var refresh_animation: bool: | 
					
						
							|  |  |  |     get: return false | 
					
						
							|  |  |  |     set(value): if Engine.is_editor_hint(): check_animation() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var attack_particle: Dictionary = {} | 
					
						
							|  |  |  | var owner: CharacterCfg | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func check_animation() -> bool: | 
					
						
							|  |  |  |     var res_name: String = get_res_name() | 
					
						
							|  |  |  |     var path: String     = "res://resource/skill_animation/%s.tres" % res_name | 
					
						
							|  |  |  |     if sprite_frames == null: | 
					
						
							|  |  |  |         print("未设置技能动画资源") | 
					
						
							|  |  |  |         return false | 
					
						
							|  |  |  |     if animation_name == "": | 
					
						
							|  |  |  |         print("未设置技能动画名") | 
					
						
							|  |  |  |         return false | 
					
						
							|  |  |  |     if !sprite_frames.has_animation(animation_name): | 
					
						
							|  |  |  |         print("技能动画名不存在") | 
					
						
							|  |  |  |         return false | 
					
						
							|  |  |  |     var animation: Animation = ResourceLoader.load(path) as Animation | 
					
						
							|  |  |  |     if not animation: | 
					
						
							|  |  |  |         animation = Animation.new() | 
					
						
							|  |  |  |         animation.resource_name = res_name | 
					
						
							|  |  |  |     Util.refresh_animation_by_sprite_frames(path, sprite_frames, animation_name, animation) | 
					
						
							|  |  |  |     Util.refresh_animation_lib() | 
					
						
							|  |  |  |     skill_animation = load(path) | 
					
						
							|  |  |  |     return true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func get_attack1()->AttackCfg: return attack1 if attack1 else ResourceManager.cfg_attack_normal | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func get_attack1_box()->AttackBoxCfg: return attack1_box if attack1_box else ResourceManager.cfg_attack_box_normal | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func get_attack2()->AttackCfg: return attack2 if attack2 else ResourceManager.cfg_attack_normal | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func get_attack2_box()->AttackBoxCfg: return attack2_box if attack2_box else ResourceManager.cfg_attack_box_normal | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func get_attack_particle(index: int)->Resource: | 
					
						
							|  |  |  |     var res_name: String   = get_res_name() | 
					
						
							|  |  |  |     var path_index: String = "res://scene/effect/particle/%s_%d.tscn" % [res_name, index] | 
					
						
							|  |  |  |     if ResourceLoader.exists(path_index): | 
					
						
							|  |  |  |         attack_particle[index] = load(path_index) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         var path_default: String = "res://scene/effect/particle/%s.tscn" % res_name | 
					
						
							|  |  |  |         if ResourceLoader.exists(path_default): | 
					
						
							|  |  |  |             attack_particle[index] = load(path_default) | 
					
						
							|  |  |  |     if index in attack_particle: | 
					
						
							|  |  |  |         return attack_particle[index] | 
					
						
							|  |  |  |     return null | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func get_owner() -> CharacterCfg: | 
					
						
							|  |  |  |     if not owner: | 
					
						
							|  |  |  |         var owner_name: String = get_res_name().split("_")[0] | 
					
						
							|  |  |  |         var path: String       = "res://config/character/%s.tres" % owner_name | 
					
						
							|  |  |  |         if ResourceLoader.exists(path): | 
					
						
							|  |  |  |             owner = load(path) as CharacterCfg | 
					
						
							|  |  |  |     return owner |