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.
		
		
		
		
		
			
	
	
		
			
				
					
						
							|  |  |  | @tool | 
					
						
							|  |  |  | extends ActionWithTarget | 
					
						
							|  |  |  | class_name ActionCastSkill | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func run_with_target(character: Character, target: Character) -> BT.Status: | 
					
						
							|  |  |  | 	var skill: Skill = character.skill | 
					
						
							|  |  |  | 	var character_status: Status = character.status | 
					
						
							|  |  |  | 	var dir: Vector2 = target.pos2D() - character.pos2D() | 
					
						
							|  |  |  | 	var dist: float = dir.length() | 
					
						
							|  |  |  | 	if character_status.is_skill_running: | 
					
						
							|  |  |  | 		if int(character_status.break_level) < Enum.EBreakLevel.Break: | 
					
						
							|  |  |  | 			if dist < 0.5: | 
					
						
							|  |  |  | 				character.move_to(-dir) | 
					
						
							|  |  |  | 			elif dist > 2: | 
					
						
							|  |  |  | 				character.move_to(dir) | 
					
						
							|  |  |  | 			return RUNNING | 
					
						
							|  |  |  | 	for skill_cfg: SkillCfg in skill.skill_dict.values(): | 
					
						
							|  |  |  | 		#检查姿态 | 
					
						
							|  |  |  | 		var stance_from: int = skill_cfg.stance_from | 
					
						
							|  |  |  | 		var check_any_ground: bool = (stance_from == Enum.EStance.GroundAny) and character_status.is_on_floor | 
					
						
							|  |  |  | 		var check_any_air: bool = (stance_from == Enum.EStance.AirAny) and not character_status.is_on_floor | 
					
						
							|  |  |  | 		var check_any: bool = (stance_from == Enum.EStance.Any) or check_any_ground or check_any_air | 
					
						
							|  |  |  | 		if (stance_from != int(character_status.stance)) and not check_any: | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		#检查距离 | 
					
						
							|  |  |  | 		if dist > skill_cfg.range: | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		#检查远程最小释放距离 | 
					
						
							|  |  |  | 		if dist < skill_cfg.range - 2: | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		#施放技能条件检查 | 
					
						
							|  |  |  | 		if not skill.cast_skill_check(skill_cfg, character_status.break_level): | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		#施放技能扣除mp | 
					
						
							|  |  |  | 		if not skill.cast_skill_mp_cost(skill_cfg): | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		skill.cast_skill(skill_cfg, dir) | 
					
						
							|  |  |  | 		return SUCCESS | 
					
						
							|  |  |  | 	return FAILURE |