Minecraft Mod 和服务器插件开发
本文最后更新于:2024年12月15日 下午
Minecraft Mod 和服务器插件开发
本文介绍了我的世界 Forge 模组开发和paper服务器插件开发
MC Forge Mod 开发
Minecraft Forge 1.18.2 Mod制作学习笔记 (1) Eclipse开发环境搭建 - 知乎 (zhihu.com)
【Minecraft Forge】从零开始学习1.20.1模组开发 (零):配置开发环境 - dudujerry - 博客园 (cnblogs.com)
其中第3个链接是视频链接,有效,未完待续
p9-数据生成 为什么失败?
看这个教程 文字版 我的世界Minecraft 1.19 Mod开发教程分享-04-增加合成表和方块破坏掉落物 - 哔哩哔哩 (bilibili.com)
最新教程 我的世界·1.20.1·forge Mod教程·ep2·添加物品和添加创造物品栏 - 哔哩哔哩 (bilibili.com)
如何打包 https://www.bilibili.com/read/cv24332474/
报错:server mod list is not compatible,服务器模组列表不兼容。可能是因为调试模式下,examplemod也需要在服务器安装。
将forge服务器所有模组删除后,支持原版客户端登录。
添加方块
blockbench网站 Blockbench
已成功生成自定义方块。
目前的问题:如何确定放置时方块的朝向?
item, block, blockitem。blockitem是用block自动生成的item。
使用了“复制模式”,即整个游戏中所有example_block共享一个example_block实例(地址也相同),存储时只需存储每个block的状态。
官方库映射(反混淆):参见外部库/Gradle:net.minecraftforge:forge:1.20.1-47.2.0_mapped_official_1.20.1
,它实际上位于C:\Users\tgl\.gradle\caches\forge_gradle\minecraft_user_repo\net\minecraftforge\forge\1.20.1-47.2.0_mapped_official_1.20.1
,jar文件用winRAR打开(或者在项目文件夹打开),然后进入
1 |
|
添加物品
物品逻辑能实现,但是材质不显示。经检查是json的“parent”的值写错了。
此外,primogems物品需要对着example_block右键使用,才能出现烤鱼。对着其他方块使用不行。
事件监听
反编译代码位于
1 |
|
事件分为Forge和Fml,后者包括游戏启动等等。
尽量使用Forge的事件,以免跟其他mod冲突。
注册类有3种方法,我推荐最后一种,因为单独放在一个类中
Capability
一开始没效果。
经排查,是自己抄错了几处:
- 感叹号抄错了,导致if判断刚好相反(原本是判断非空)
- “farmxp"抄成"farxp”
这说明Java容错性很强,即使没注册成功,也不报错。
注册命令(添加自己定义指令)
在ForgeEventListener
类中添加静态方法,用来在总线中注册命令
1 |
|
注意其中的GetFarmXpCommand.
是调用了类的静态方法,相当于C++中的GetFarmXpCommand::
。使用前要import相应的类。
类中这样写
1 |
|
GPT的解释
这段Java代码是用于注册自定义命令的一部分,属于Minecraft Forge模组的代码。它通过使用CommandDispatcher类来注册一个名为"farmxp"的命令。
使用
Commands.literal("farmxp")
来指定命令的名称为"farmxp"。然后使用.executes()
方法来指定命令的执行逻辑,该方法接受一个Lambda表达式作为参数。在Lambda表达式中,我们首先使用
context.getSource().getPlayer().getCapability(PlayerFarmXpProvider.PLAYER_FARM_XP_CAPABILITY)
来获取玩家的一个特定能力(capability),即PlayerFarmXpProvider.PLAYER_FARM_XP_CAPABILITY,玩家的农场经验。接着,我们使用
.ifPresent()
方法来检查能力是否存在。如果存在,我们使用context.getSource().sendSuccess()
方法将一条成功消息发送给命令的来源,即玩家。在这里,我们使用了一个Lambda表达式作为参数来动态构建这条消息。消息的内容是"xp:"加上
xp.getXp()
的返回值,其中xp
是获取到的能力实例,.getXp()
是能力实例的一个方法。最后,我们返回整数值0,表示命令执行成功。
这段代码的作用是注册一个自定义命令"farmxp",当玩家输入该命令时,会获取玩家的农场经验并将其发送给玩家。
展示文本
Overlay可以展示信息,但是没有鼠标交互。
Container Gui
计划
能否更改启动界面?增加原神界面。
计划更改为原神UI,添加元素反应系统、元素附着机制、元素视野。
Forge官方文档解析
Getting Started
- mods.toml
/src/main/resources/META-INF/mods.toml
,描述mod信息。例如mod名称、作者、描述、logo等。logo放在/src/main/resources/
中。通配符${}
的内容参见/gradle.properties
,
- 版本号命名规范
1.20.1-1.0.0.0
MCVersion-MajorMod.MajorAPI.Minor.Patch
Core Concepts
Registries
Sides
Physical client & Physical server,指的是通常意义上的客户端和服务器。
Logical client & Logical server:前者是Server Thread,负责运行游戏逻辑,包括实体生成、天气、物理等。后者是Render Thread,负责接受用户输入、传递到logical server,同时负责渲染界面。单人模式下同时存在这两个。
在修改游戏逻辑前,应检查是否在logical server中
MC paper服务器插件开发
教程:插件开发教程目录在控制台打印文字:零基础paper端插件开发教程之一 (qq.com)
中文文档:概览 (Spigot-API 1.20-R0.1-SNAPSHOT API 中文文档) (windit.net)
1.13:水生世界,寻宝时间,完整的海洋系统,海洋之心。此外,扁平化把指令几乎全改了
1.14:劫掠事件
1.15:蜜蜂
1.16:下界,猪灵蛮兵,炽足兽,下界合金。
1.16.5支持java8,
1.16.5/1.16.4只能正版登录。离线登录会被禁止多人游戏选项。但更高版本无此问题。
高版本无法进入低版本服务器,会显示“Outdated Server! It’s still on 1.12.2”
forge下载页面如果加载不出来,可以尝试代理。
forge客户端47.1.0,服务端47.2.0,但仍然可联机。
optifine与原神模组不兼容
安装光影:
Arc Shader For Minecraft 1.20/1.20.2+ | Minecraft Texture | Minecraft Hub
- Download a resource pack, you should get a .zip file
- Open the folder to which you downloaded the file
- Copy the .zip file
- Open Minecraft
- In Minecraft, click on “Options”, then “Resource Packs”
- Choose “Open resource pack folder”
- Paste the file into the resource folder in Minecraft
- Go back to Minecraft, the resource pack should now be listed (if not listed then go to the main menu by pressing Esc and repeat step 5) and you can activate it by choosing it and hitting “Done”. The game will now reload itself.
插件和模组的区别
插件
不创建新材质/GUI,只是修改原版物品数据来更改游戏内容。插件只需服务器安装。
优点是原版客户端都能登录。
模组
有的需要服务器和客户端装,有的辅助类模组(例如背包整理)只需客户端装。
1.12.2 Forge Downloads for Minecraft Forge for Minecraft 1.12.2
Java基础语法
对象
- 字符串
字符串是引用类型,其本质是对象,不是基本数据类型。
1 |
|
字符串是不可变对象,无法修改。
数字转字符串
方法1:
1 |
|
方法2:通过拼接操作
1 |
|
- 对象
对象是引用类型。
1 |
|
world是引用,相当于指针。
1 |
|
location是引用,但它指向一个新创建的Location变量。
Lambda表达式
目的:提高编程效率
将函数作为另一个函数的参数。
基本语法
1 |
|
关注返回值和参数,方法名不重要。
使用->
将参数和实现逻辑分离。
如果lambda体只有一行代码,则可以省略大括号。