# 快速开始

Noble SDK 提供了一套功能强大的游戏开发工具集,让开发者可以轻松创建各种游戏脚本和插件。本文将指导您如何安装并开始使用 Noble SDK。

# 安装

  1. 下载最新版本的 Noble SDK
  2. 将解压后的文件放置到您的项目目录中
  3. 包含 Noble.h 头文件到您的项目中
#include "Noble.h"

# 初始化 SDK

首先,您需要初始化 SDK 并注册您的插件。

// 初始化SDK,创建一个英雄插件
Noble::Init(PluginType::Champion, "我的第一个脚本", { "Annie", "Ashe" });

# 注册事件

Noble SDK 提供了丰富的事件系统,您可以注册回调函数来响应游戏中的各种事件。

// 声明事件回调函数
void OnLoad();
void OnUnload();
void OnUpdate();
void OnDraw();
void OnSpellCast(AIBaseClient* sender, SpellCastInfo const& args);
void OnNewPath(AIBaseClient* sender, std::vector<Vector> const& path, bool isDash, float dashSpeed);

// 注册事件
void RegisterEvents() {
    // 注册核心事件
    Event::OnLoad::Add(OnLoad);
    Event::OnUnload::Add(OnUnload);
    Event::OnUpdate::Add(OnUpdate);
    Event::OnDraw::Add(OnDraw);
    
    // 注册游戏事件
    Event::OnSpellCast::Add(OnSpellCast);
    Event::OnNewPath::Add(OnNewPath);
}

# 创建菜单

为您的脚本创建一个用户友好的配置菜单。

Menu* mainMenu;
MenuOption* comboKey;
MenuOption* useQ;
MenuOption* useW;
MenuOption* useE;
MenuOption* useR;

void CreateMenu() {
    // 创建主菜单
    mainMenu = Menu::Create("我的第一个脚本");
    
    // 添加连招设置
    Menu* comboMenu = mainMenu->AddMenu("连招设置");
    comboKey = comboMenu->AddHotKey("连招按键", 0x20); // 空格键
    useQ = comboMenu->AddCheckBox("使用 Q", true);
    useW = comboMenu->AddCheckBox("使用 W", true);
    useE = comboMenu->AddCheckBox("使用 E", true);
    useR = comboMenu->AddCheckBox("使用 R", true);
}

# 实现连招系统

下面是一个简单的连招系统实现,展示了如何检测按键并施放技能。

// 定义技能
Spell Q, W, E, R;

// 初始化技能
void InitializeSpells() {
    Q = Spell(eSpellSlot::Q, 625.f);
    Q.SetTargetted(0.25f, 1400.f);
    
    W = Spell(eSpellSlot::W, 600.f);
    W.SetSkillshot(0.25f, 100.f, 2000.f, false, eSkillshotType::SkillshotCone);
    
    E = Spell(eSpellSlot::E, 425.f);
    E.SetSkillshot(0.25f, 200.f, FLT_MAX, false, eSkillshotType::SkillshotCircle);
    
    R = Spell(eSpellSlot::R, 600.f);
    R.SetSkillshot(0.25f, 250.f, FLT_MAX, false, eSkillshotType::SkillshotCircle);
}

// 执行连招
void ExecuteCombo() {
    // 获取目标
    AIBaseClient* target = TargetSelector::GetTarget(900.f, eDamageType::Magical);
    if (!target) return;
    
    // 使用R技能
    if (useR->GetBoolean() && R.IsReady() && target->GetHealthPercent() <= 40.f) {
        R.Cast(target);
    }
    
    // 使用E技能
    if (useE->GetBoolean() && E.IsReady()) {
        E.Cast(target);
    }
    
    // 使用Q技能
    if (useQ->GetBoolean() && Q.IsReady()) {
        Q.Cast(target);
    }
    
    // 使用W技能
    if (useW->GetBoolean() && W.IsReady()) {
        W.Cast(target);
    }
}

// 更新事件处理
void OnUpdate() {
    // 检查连招键是否按下
    if (comboKey->GetBoolean()) {
        ExecuteCombo();
    }
}

# 完整示例

以下是一个完整的示例,展示了如何创建一个简单的脚本,实现注册事件和执行连招:

#include "Noble.h"

// 全局变量
Menu* mainMenu;
MenuOption* comboKey;
MenuOption* useQ;
MenuOption* useW;
MenuOption* useE;
MenuOption* useR;
Spell Q, W, E, R;

// 初始化技能
void InitializeSpells() {
    Q = Spell(eSpellSlot::Q, 625.f);
    Q.SetTargetted(0.25f, 1400.f);
    
    W = Spell(eSpellSlot::W, 600.f);
    W.SetSkillshot(0.25f, 100.f, 2000.f, false, eSkillshotType::SkillshotCone);
    
    E = Spell(eSpellSlot::E, 425.f);
    E.SetSkillshot(0.25f, 200.f, FLT_MAX, false, eSkillshotType::SkillshotCircle);
    
    R = Spell(eSpellSlot::R, 600.f);
    R.SetSkillshot(0.25f, 250.f, FLT_MAX, false, eSkillshotType::SkillshotCircle);
}

// 创建菜单
void CreateMenu() {
    // 创建主菜单
    mainMenu = Menu::Create("我的第一个脚本");
    
    // 添加连招设置
    Menu* comboMenu = mainMenu->AddMenu("连招设置");
    comboKey = comboMenu->AddHotKey("连招按键", 0x20); // 空格键
    useQ = comboMenu->AddCheckBox("使用 Q", true);
    useW = comboMenu->AddCheckBox("使用 W", true);
    useE = comboMenu->AddCheckBox("使用 E", true);
    useR = comboMenu->AddCheckBox("使用 R", true);
}

// 执行连招
void ExecuteCombo() {
    // 获取目标
    AIBaseClient* target = TargetSelector::GetTarget(900.f, eDamageType::Magical);
    if (!target) return;
    
    // 使用R技能
    if (useR->GetBoolean() && R.IsReady() && target->GetHealthPercent() <= 40.f) {
        R.Cast(target);
    }
    
    // 使用E技能
    if (useE->GetBoolean() && E.IsReady()) {
        E.Cast(target);
    }
    
    // 使用Q技能
    if (useQ->GetBoolean() && Q.IsReady()) {
        Q.Cast(target);
    }
    
    // 使用W技能
    if (useW->GetBoolean() && W.IsReady()) {
        W.Cast(target);
    }
}

// 加载事件
void OnLoad() {
    Console::Add("脚本已加载!");
    InitializeSpells();
    CreateMenu();
}

// 卸载事件
void OnUnload() {
    Console::Add("脚本已卸载!");
}

// 更新事件
void OnUpdate() {
    // 检查连招键是否按下
    if (comboKey->GetBoolean()) {
        ExecuteCombo();
    }
}

// 绘制事件
void OnDraw() {
    AIBaseClient* player = ObjectManager::Player();
    
    // 绘制技能范围
    if (Q.IsReady()) {
        Drawing::DrawCircle(player->Position(), Q.Range(), MAKE_COLOR(255, 0, 0, 100));
    }
    
    if (W.IsReady()) {
        Drawing::DrawCircle(player->Position(), W.Range(), MAKE_COLOR(0, 255, 0, 100));
    }
    
    if (E.IsReady()) {
        Drawing::DrawCircle(player->Position(), E.Range(), MAKE_COLOR(0, 0, 255, 100));
    }
    
    if (R.IsReady()) {
        Drawing::DrawCircle(player->Position(), R.Range(), MAKE_COLOR(255, 255, 0, 100));
    }
}

// 技能释放事件
void OnSpellCast(AIBaseClient* sender, SpellCastInfo const& args) {
    // 判断是否是自己
    if (sender->IsMe()) {
        Console::Add("我释放了技能: %s", args.Name);
    }
}

// 路径更新事件
void OnNewPath(AIBaseClient* sender, std::vector<Vector> const& path, bool isDash, float dashSpeed) {
    // 判断是否是敌方英雄且正在冲刺
    if (sender->IsEnemy() && sender->IsHero() && isDash) {
        Console::Add("敌方英雄 %s 正在冲刺!", sender->ChampionName());
    }
}

// 注册事件
void RegisterEvents() {
    Event::OnLoad::Add(OnLoad);
    Event::OnUnload::Add(OnUnload);
    Event::OnUpdate::Add(OnUpdate);
    Event::OnDraw::Add(OnDraw);
    Event::OnSpellCast::Add(OnSpellCast);
    Event::OnNewPath::Add(OnNewPath);
}

// 插件入口函数
PLUGIN_API void OnPluginStart() {
    // 初始化SDK
    Noble::Init(PluginType::Champion, "我的第一个脚本", { "Annie", "Ashe" });
    
    // 注册事件
    RegisterEvents();
}

通过以上步骤,您已经创建了一个完整的脚本,它可以:

  1. 初始化SDK并注册插件
  2. 创建用户界面
  3. 注册各种游戏事件
  4. 实现连招系统

您可以基于此示例进一步扩展,添加更多功能和自定义逻辑,以满足您的需求。