@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