脚本编写 - Karlin-Z/KodakkuAssistScript GitHub Wiki

当仅靠单纯的条件判断无法实现复杂逻辑,需要更细致的条件判断与执行逻辑时,可以使用脚本功能来进行功能的编写。

实际上脚本功能是触发器功能的完全上位替代,即使是简单的功能,为了后续的扩展性,也推荐使用脚本功能实现。(以上是笔者的偏见)

[TOC]

书写格式

使用 C#编程语言编写,所以需要具有最基础的 C#基础知识。可以通过阅读 Microsoft 的官方文档学习。

由作者提供的SimpleScript是一个简单的示例。推荐结合注释阅读。

一个最简单的脚本应该包括以下内容:

  • 引用命名空间
  • 实现了AttributeScriptType的脚本本体类(Class)
    • 类属性
    • 类方法

引用命名空间

using System;
using KodakkuAssist.Module.GameEvent;
using KodakkuAssist.Script;
using KodakkuAssist.Module.GameEvent.Struct;
using KodakkuAssist.Module.Draw;
using System.Windows.Forms;

根据自己脚本的需求增减。

脚本本体类

类定义

[ScriptType(name: "SimpleScript", territorys: [], guid: "d3b6a9b4-1e0e-4e0c-b7c7-ff1fce0e6cf2", version:"0.0.0.1", author:"Karlin")]
public class SimpleScript{}
  • 定义 SimpleScript,并为其实现 ScriptType,动态编译器将编译实现了该Attribute的类,并创建其实例用于匹配 GameEvent。可设置的属性如下:
    • guid(必选),string,设置该脚本的唯一标识符,如果多个脚本的相同,则会被视为是同一个脚本,书写时应该确保脚本 GUID 的唯一。
    • name(可选),string,脚本显示的名称。
    • territorys(可选),int[],该Script生效区域TerritoryId数组,如果留空则默认所有区域可用
    • version(可选),string,设置脚本版本,在线版本将会与在线库比较用于提示更新
    • author(可选),string,用于显示作者信息及在线库文件命名。

类属性(Property)

[UserSetting(note:"This is a test Property")]
public int prop1 { get; set; } = 1;
[UserSetting("Another Test Property")]
public bool prop1 { get; set; } = false;
int n = 0;
  • 用户设置属性
    • 实现了Attribute UserSetting 的属性(如prop1,prop2)将被标记为用户设置属性,用户可以在插件设置界面设置,用于用户自定义设置脚本行为。
    • note(可选),string,用于向用户说明该项设置的作用或用作其他提示
  • 脚本内部变量(如 n),用于脚本内部计算,如计数、计时、保存阶段、保存各种整蛊参数、保存各种机制对应的固定坐标等。

更复杂的例子可以看KodakkuAssistScript/07-DawnTrail/极佐拉加.cs at main · Karlin-Z/KodakkuAssistScript,或许能为你提供一些灵感。

类方法(Method)

public void Init(ScriptAccessory accessory)
{
    n = 0;
}
  • 初始化方法。脚本管理器会在战斗结束,区域重置,区域切换等情况下调用脚本内名为 Init 的方法,若不定义将执行空方法。
  • 方法必须拥有参数 ScriptAccessory,用于访问本插件提供的数据,详情见ScriptAccessory
[ScriptMethod(name: "Test StartCasting",eventType: EventTypeEnum.StartCasting,eventCondition: ["ActionId:133"])]
public void PrintInfo(Event @event, ScriptAccessory accessory)
{
    // 此处写条件被触发时,执行的语句
    n++;
    accessory.Method.SendChat($"{@event["SourceId"]} {n}-th use the Medica II");
}
  • 脚本方法,必须拥有参数 Event ScriptAccessory,用于匹配日志,完成脚本的各项功能,在脚本类内所有实现了Attribute ScriptMethod 的方法将在每一条游戏日志产生时以ScriptMethod定义的值匹配,若匹配成功则以该条事件执行该方法。
  • ScriptMethod定义时,包含如下值:
    • eventType(必选),EventTypeEnum,该方法匹配的日志类型,具体日志类型可以参见日志类型。上文中将匹配StartCasting类型的日志。
    • name(可选),string,向用户展示的该方法的名称。
    • eventCondition(可选),string[],设置方法匹配的日志所具有的属性,以:分隔属性名称和属性值,留空则将匹配所有eventType,属性值有如下两种匹配方式。
      • 固定值,如 ActionId:133 ,将匹配ActionId133的条目。
      • 正则表达式,在属性值前添加regex:以使用正则模式匹配,如ActionId:regex:13[34],将匹配ActionId133 134 1133等值的条目。正则表达式书写规则请参见正则表达式
    • userControl(可选),bool,设置该方法是否在用户侧显示并可以被用户手动关闭,留空则为true,如果你有一些方法如分P,战斗信息收集等脚本运行所需且被用户手动关闭会导致脚本运行出错的方法,请将该项标记为false,确保其不会被用户手动关闭。
  • Event,用于访问触发该方法的游戏事件的详细信息,如上文 @event["SourceId"] 将获取触发事件的 SourceId,所有获取的数据均为string请自行处理,具体各事件具有哪些属性请使用插件的GameEvent页面点击某一具体日志条目展开查看。
  • ScriptAccessory,用于访问本插件提供的数据,详情见ScriptAccessory

简单示例说明

由作者提供的SimpleScript是一个简单的示例。推荐结合注释阅读。

其中三条可触发的方法,PrintInfoDrawCircleUnconfigurableMethod,分别实现了:

  • PrintInfo:发送聊天(也可执行文本指令)
  • DrawCircle:绘图
  • UnconfigurableMethod:不在用户侧显示、不可被用户关闭的方法。

PrintInfo:发送聊天(也可执行文本指令)

[ScriptMethod(name: "Test StartCasting",eventType: EventTypeEnum.StartCasting,eventCondition: ["ActionId:133"])]
public void PrintInfo(Event @event, ScriptAccessory accessory)
{
    n++;
    accessory.Method.SendChat($"{@event["SourceId"]} {n}-th use the Medica II");
}
  • PrintInfo:发送聊天(也可执行文本指令)
    • name(脚本名):Test StartCasting
    • eventType(事件类型):EventTypeEnum.StartCasting(开始读条)
    • eventCondition(事件条件):满足当ActionID(技能 ID)为133(医济)时执行PrintInfo
    • PrintInfo:为计数 n 并输出聊天“爷这是第几次医济”(此描述经过艺术加工)

DrawCircle:绘图

[ScriptMethod(name: "Test Draw", eventType: EventTypeEnum.ActionEffect,eventCondition: ["ActionId:124"])]
public void DrawCircle(Event @event, ScriptAccessory accessory)
{
    var prop = accessory.Data.GetDefaultDrawProperties();
    prop.Owner = Convert.ToUInt32(@event["SourceId"],16);
    prop.DestoryAt = 2000;
    prop.Color=accessory.Data.DefaultSafeColor;
    accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, prop);
}
  • DrawCircle:绘图
    • name(脚本名):Test Draw
    • eventType(事件类型):EventTypeEnum.ActionEffect(技能效果)
    • eventCondition(事件条件):满足当ActionID(技能 ID)为124(不知道)时执行DrawCircle
    • DrawCircle:设置了该特效师的所有者,销毁时间,颜色,并发送绘制。

更加复杂的特效可参考KodakkuAssistScript/07-DawnTrail/M1s.cs at main · Karlin-Z/KodakkuAssistScript

UnconfigurableMethod:不在用户侧显示、不可被用户关闭关闭的方法。

[ScriptMethod(name: "Unconfigurable Method", eventType: EventTypeEnum.ActionEffect,eventCondition: ["ActionId:124"],userControl:false)]
public void UnconfigurableMethod(Event @event, ScriptAccessory accessory)
{
    accessory.Log.Debug($"The unconfigurable method has been triggered.");
}
  • UnconfigurableMethod:不在用户侧显示、不可被用户关闭的方法。
    • name(脚本名):Unconfigurable Method(不给用户控制权的方法)
    • eventType(事件类型):EventTypeEnum.ActionEffect(技能效果)
    • userControlfalse则用户侧不显示且用户侧不可禁用。
    • eventCondition (事件条件):满足当ActionID(技能 ID)为124(不知道)时执行UnconfigurableMethod。此处逻辑为输出日志,实际使用时请用于一些不可告人的内部逻辑的处理。

#Todo