Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Yeqi99/MagicPaper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

223 Commits

Repository files navigation

MagicPaper

MagicPaper 是 Magic 的 proof-of-use integration:它证明 Magic 可以把 Paper / Folia 服务器能力转化为可组合、可执行、可被 Agent 理解的语义。

MagicPaper 是 Magic 脚本语言在 Minecraft Paper / Folia 服务器中的实现。它把 Paper 服务器核心能力、常用插件能力和服务器业务逻辑封装成 Magic 语义,让服主或开发者可以用更短的文本编排 GUI、触发器、计时器、物品、Buff、经济、权限、技能等功能。

MagicPaper 的定位不是单纯的"技能插件"或"GUI 插件",而是一个基于 Magic 的服务器功能编排层。复杂能力仍然由 Java 和第三方插件提供,MagicPaper 负责把这些能力注册成语义,使同样的文本量能够表达更多逻辑,并让第三方可以快速接入这一套语言。

当前状态

当前实现包含:

  • 基于 Magic 的脚本执行器,可同时启用 Magic 系统语义和 MagicPaper 领域语义。
  • Paper / Folia 任务执行语义,支持同步与异步执行。
  • 配置型魔咒、.m 源文件导入、服务器启动执行、事件触发执行、定时执行。
  • GUI 系统,支持分页、按钮脚本、动态数据按钮。
  • 物品系统,支持 NBT、Lore 模板、变量刷新、属性、镶嵌孔、物品触发魔咒。
  • Buff、冷却、BossBar、粒子、实体、坐标、药水、Yaml、随机等基础模块。
  • PlaceholderAPI、LuckPerms、Vault、PlayerPoints、MythicMobs、ItemsAdder、ProtocolLib、AbolethPlus、MMOItems、EpicCraftingsPlus、AuthMe、Adyeshach、RemoteKeyboardBukkit、BungeeCord 等可选接入。
  • 面向第三方插件的 API:注册语义、注册触发器、注册计时器、执行魔咒、访问上下文、GUI、Buff、冷却和魔法物品。

插件面向 Paper / Folia 服务端实现,软依赖均为可选挂钩;不安装对应插件时,只影响对应语义能力。

与 Magic 的关系

Magic 是语言核心;MagicPaper 是 Minecraft 环境实现,也是 Magic 当前最直接的 proof-of-use integration。

MagicPaper 启动时会创建 MagicManager,并根据 config.yml 中的开关注册语义:

extended-syntax:
 system: true
 paper: true
  • system: true 注册 Magic 内置语义,如变量、计算、控制流、容器、输入输出。
  • paper: true 注册 MagicPaper 语义,如玩家、物品、GUI、触发器、经济、权限、技能等。

这意味着第三方插件也可以把自己的能力注册成 Magic 语义,让 MagicPaper 成为不同插件之间的低成本编排层。

构建与安装

构建需要 Java 和 Maven:

mvn package

构建产物位于 target/。将生成的 Jar 放入服务器 plugins/ 目录后启动服务器即可。

首次启动时,如果 config.ymldefault-file: true,插件会释放默认配置和示例文件。

作为依赖接入时,可以使用 MagicPaper 的 Maven 坐标;具体版本号以你发布或本地安装的构建为准:

<dependency>
 <groupId>cn.originmc.plugins</groupId>
 <artifactId>MagicPaper</artifactId>
 <version>${magicpaper.version}</version>
</dependency>

MagicPaper 依赖 Magic 语言核心;作为开发依赖时可按同样方式引入 Magic:

<dependency>
 <groupId>cn.origincraft.magic</groupId>
 <artifactId>Magic</artifactId>
 <version>${magic.version}</version>
</dependency>

项目 pom.xml 中已经包含 Paper、Folia、PlaceholderAPI、NBTAPI、ProtocolLib、MythicMobs、ItemsAdder、Vault、PlayerPoints 等仓库与依赖配置。

配置目录

插件数据目录中的主要文件夹:

MagicPaper/
 config.yml 插件总配置
 lang/ 语言文件
 magic/ YAML 格式魔咒,可由命令、触发器、计时器、GUI 调用
 import/ 启动时导入到上下文的 .m 源文件
 onload/ 服务器启动后执行的 .m 源文件
 trigger/ 事件触发器配置
 timer/ 定时器配置
 gui/ GUI 配置
 item-format/ 物品 Lore 解析模板
 attribute/ 属性配置
 data/ 公共数据

一个最小魔咒文件示例:

spell:
 - stap(HelloWorld)
display: "HelloWorld"
description:
 - "Send a message to all online players"

一个触发器配置示例:

execute-spell:
 - HelloWorld

一个计时器配置示例:

type: paper
later: 20
interval: 20
execute-spell:
 - HelloWorld

场景脚本示例

仓库的 examples/ 目录提供了几类可拷贝到 MagicPaper 配置体系中的 .m 场景脚本:

examples/
 01-onload-broadcast.m 服务器启动广播
 02-player-join-welcome.m 玩家触发器欢迎语
 03-cooldown-jump.m 冷却保护的大跳技能
 04-open-example-gui.m 打开默认 GUI
 05-give-named-reward.m 发放命名物品奖励

这些示例展示 MagicPaper 如何把"玩家、物品、GUI、冷却、Buff、广播"等服务器能力压缩成短语义。带 self 的脚本适合放在玩家事件触发器、物品触发魔咒或 /magicpaper words ... [player] 这类玩家上下文中执行。

命令

主命令为 /magicpaper,别名为 /mp,基础权限为 magicpaper.command

/magicpaper reload
/magicpaper reloadall
/magicpaper spells
/magicpaper words <words> [player]
/magicpaper spell <spell> [player]
/magicpaper publicwords <words>
/magicpaper publicspell <spell>
/magicpaper functions
/magicpaper functioninfo <function>
/magicpaper triggers
/magicpaper onload
/magicpaper boreremove <address> <index>
/magicpaper restart
/magicpaper coding
/magicpaper gui <id> [player]
/magicpaper clearguidata <id> [player]
/magicpaper updateguidata <id> [player]
/magicpaper lookailas <function>

说明:

  • wordspublicwords 用于直接执行一行 Magic 语义;命令参数中的逗号会被替换为空格。
  • spellpublicspell 用于执行 magic/ 目录中载入的魔咒。
  • public* 使用全局上下文;普通执行会创建临时上下文并导入 import/ 内容。
  • functioninfo 会从当前已注册的 ArgsFunction 读取参数说明。
  • lookailas 是当前代码中的命令拼写,用于查看语义别名。

编码模式

/magicpaper coding 可以切换玩家聊天编码模式。玩家需要 OP 或 magicpaper.coding 权限。

快捷执行:

!m<Magic语句> 在临时上下文执行
!pm<Magic语句> 在全局上下文执行
!clear 清空 Coding 临时上下文

进入编码模式后,普通聊天会被写入当前代码缓冲区。可用关键字:

go 执行当前缓冲区
clear 清空当前缓冲区
look 查看当前缓冲区
spell <spell1> <spell2> 执行已配置魔咒
save <id> <display> <desc> 保存当前缓冲区为 magic/<id>.yml

当前模块

触发器

触发器用于在事件发生时执行魔咒。当前内置触发器包括:

  • 服务器:ServerOnLoadServerOnEnableServerOnDisable
  • 玩家:PlayerJoinPlayerInteractPlayerDropPlayerBreakPlayerPlacePlayerTeleportAsyncPlayerChatPlayerRespawn
  • 实体与物品:EntityDamageItemDrop
  • 计时器:Timer
  • 可选挂钩:BungeeCordMessagePlayerKeyboardEpicCraftingsPreCraftEpicCraftingsCraftEpicCraftingsPlaceClick

也可以通过 MagicPaperAPI.registerTrigger(...) 注册自定义触发器。

计时器

计时器是按固定 tick 间隔执行魔咒的特殊触发器。当前支持 Paper 与 Folia 两类计时器,并可通过语义动态创建:

  • paperTimer() / ptimer()
  • foliaTimer() / ftimer()
  • addToTimer() / att()

GUI

GUI 系统支持配置菜单、分页、按钮点击执行魔咒,以及动态数据按钮。典型语义包括:

  • guiOpen() / opengui()
  • guiPreviousPage() / ppage()
  • guiNextPage() / npage()
  • guiDataClear() / cleargui()
  • guiUpdate() / upgui()
  • onlinePlayerButtons() / pbuttons()

物品

物品系统是 MagicPaper 的核心模块之一,当前支持:

  • 获取、给予、设置玩家物品。
  • 修改名称、类型、数量、CustomModelData、耐久、附魔、隐藏标签。
  • 读取和写入 NBT。
  • Lore 行增删查、变量解析、模板刷新。
  • 自定义属性写入、属性读取、属性缓存。
  • 物品镶嵌孔、支持镶嵌地址、添加/移除镶嵌物。
  • 主手物品触发魔咒。
  • 物品序列化与反序列化。

常见语义包括 item()itemGivePlayer()itemSetPlayer()itemNBTAdd()itemNBTGet()itemSetName()newItem()refreshVar()itemAttributeSet()itemBoreSet()addItemToBore()removeItemFromBore()itemAddSpell()mergeNBT()

Buff 与冷却

Buff 模块用于给目标添加有持续时间的状态;冷却模块用于限制行为频率。

  • buffAdd()
  • buffTimeGet()
  • addCoolDown() / addcd()
  • checkCoolDown() / checkcd()
  • gocd()
  • getcd()

Placeholder 与变量映射

MagicPaper 注册了 PlaceholderAPI 扩展,可通过以下形式取值:

%magic_spell_name%

也可以在 Magic 中使用:

  • placeholderAPI() / papi()
  • papiStr()

用途包括按玩家状态返回不同文本、把战斗力映射为聊天颜色、把经济余额映射为称号等。

数据实体与 YAML

数据实体当前默认使用 YAML 存储,配置中预留了数据库连接字段。YAML 语义包括:

  • yamlManager() / yamlm()
  • newYaml() / nyaml()
  • yamlGet() / yamlg()
  • yamlSet() / yamls()
  • yamlSave()
  • yamlSaveAll()
  • hasyaml()
  • hasyamlkey()

常用对象与行为

对象语义:

  • player() / p()
  • location() / loc()
  • item()
  • entity()
  • bossbar()
  • component() / minimsg()
  • potion()
  • particle()

行为语义:

  • consoleCommand() / ccommand()
  • playerCommand() / pcommand()
  • senderToPlayer() / stp()
  • senderToAllPlayer() / stap()
  • playerTeleport() / ptp()
  • playerAsyncTeleport() / patp()
  • updateInventory() / upinv()
  • actionMsg()
  • playerCloseInv() / closeinv()
  • potionAdd()

第三方插件挂钩

当前代码中已经包含以下挂钩能力:

  • LuckPerms:Meta 设置、临时 Meta、Meta 读取、权限判断。
  • PlaceholderAPI:变量解析、整句解析、Magic 占位符扩展。
  • Vault:余额读取、增加、扣除、判断是否足够。
  • PlayerPoints:点券读取、增加、设置、扣除、判断是否足够。
  • MythicMobs:释放技能、生成生物,并包含 MythicMobs 监听扩展。
  • ItemsAdder:获取自定义物品、放置自定义方块。
  • AbolethPlus:数据读取、写入、编辑、过期时间、物品存取。
  • AuthMe:登录状态判断。
  • EpicCraftingsPlus:合成相关触发器。
  • RemoteKeyboardBukkit:键盘触发器。
  • ProtocolLib:物品变量刷新等发包层支持。
  • MMOItems、Adyeshach、BungeeCord:相关 Hook 与辅助能力。

第三方 API

主要入口是 MagicPaperAPI。当前 API 支持:

  • registerFunction(PaperFunction function, String... aliases):注册 MagicPaper 语义。
  • registerTrigger(MagicPaperTrigger trigger):注册触发器。
  • registerTimer(String id, MagicTimer timer):注册计时器。
  • getSpell(...) / getSpells() / isSpell(...):读取已载入魔咒。
  • execute(...):执行魔咒或单行语义。
  • createNormalContext() / createSpellContext(...) / getMainContext():创建和访问上下文。
  • getCoolDownManager()addCoolDown(...)getCoolDown(...):冷却操作。
  • getMagicItem(...):包装 Bukkit ItemStack
  • hasMagicBuff(...)getMagicBuffs(...)getMagicBuffTime(...)getMagicBuff(...):Buff 查询。
  • openGui(...)addGuiSetting(...):GUI 操作。

新增语义时,优先继承 PaperFunction;如果不依赖 Bukkit/Paper,也可以继承 Magic 原生的 ArgsFunctionOnlyStringFunction

一个最小示例

magic/HelloWorld.yml:

spell:
 - stap(HelloWorld)
display: "HelloWorld"
description:
 - "Send a message to all players"

命令执行:

/magicpaper spell HelloWorld

直接执行一行语义:

/magicpaper words stap(HelloWorld)

在聊天中快捷执行:

!mstap(HelloWorld)

设计理念

MagicPaper 的核心思想是让服务器功能变成可组合语义。

传统插件往往把"什么时候触发、对谁触发、触发什么、如何变化"写死在配置或代码里。MagicPaper 希望把这些拆开:

  • 事件由触发器提供。
  • 时间由计时器提供。
  • 环境对象由 Paper 语义提供。
  • 第三方能力由 Hook 语义提供。
  • 具体逻辑由 Magic 文本编排。

这样,复杂 Java 代码可以沉淀为稳定语义,普通使用者只需要组合这些语义即可完成服务器玩法。

未来预期

  • 继续完善语义文档生成,让 /magicpaper functioninfo、README 与源码保持一致。
  • 稳定 Paper/Folia 执行模型,减少不同服务端调度差异带来的使用成本。
  • 扩展数据实体存储,补全数据库实现与持久化策略。
  • 强化 GUI、物品、触发器和 Buff 的组合能力,让它们成为可复用的服务器功能模块。
  • 提供更清晰的第三方接入规范,使其他插件能快速把能力注册成 Magic 语义。
  • 与 MagicRedis 等实际项目一起验证 Magic 在非 Minecraft 场景中的表达能力。
  • 在样本足够时探索自然语言到 Magic 语义的转换,让中文或其他自然语言可以生成对应魔咒。

开源协议

本项目采用 GNU GPL-3.0 许可证。使用、修改和分发本项目代码时,请遵循 GPL-3.0 的相关要求。

Packages

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /