关于基岩版的Mod问题:基岩版MC里有Mod吗?_bilibili
现在MCreator功能还不错(用这个不用写代码)自定义生物、维度甚至是粒子效果都有了。如果模组主要是往游戏里加东西,不怎么改原版游戏机制,且体量不大,是可以考虑的。但真正想要做好还得要老老实实写代码。
Java版(除MCreator)开发学习路线
0. 如果有这些会更轻松
- 具有基本的英语能力(如词汇3k+)
- 了解基础的数学知识(中学水平够用)
- 具有一定的编程思维或理科思维,不然有可能学不太明白Java
1. Java基础
初学者可看《Java从入门到精通》、菜鸟教程
- 基本语法:变量和数据类型、运算符、条件、循环、函数等
- 类和面向对象(精髓)(封装、继承、多态、抽象类和接口、枚举类等)
- Number和Math类、String和StringBuffer、Stream&File&IO、各种容器
- 泛型、注解、Java8新特性、异常、线程等
Java不算难,如果学过任何一门编程语言会更轻松,尤其是C/C++/C#
特别注意 Java8新特性、泛型,不少初学者搞不太懂,影响开发
推荐Java8新特性通俗详解专栏
2. API
学完基础之后,可以做模组了。建议先跟着教学视频一步步走,等会做一些基本的东西之后,再看官方文档
想进阶必须要看官方文档、游戏和其他模组作者的代码
初学者不好理解/忽略的点:
服务端和客户端的概念
MC游戏端分为两个端:服务端(Server)和客户端(Client)
这样做主要是为了多人游戏考虑
- 服务端主要负责游戏逻辑处理
- 客户端主要负责画面和音效
两个端之间需要通信,通过S2C(Server To Client)和C2S(Client To Server)
即使是单人本地游戏,两个端都会运作
Mixin
用于修改游戏代码
Fabric Mixin参考:Mixin Examples [Fabric Wiki]
初学者容易弄不明白,可以看这篇文章搞定
常用注解
@Shadow
:影射原来的类的成员,用于引用原类的变量或方法
@Unique
:表示该成员不是原来类的,而是自己写的(如果Mixin类的成员未加任何注解,则会覆盖原类的成员)
@Inject
:向代码注入内容
CallbackInfo
cancel()
无返回值取消get/setReturnValue
获取和更改返回值
@Redirect
:重定向(替换)方法调用
@ModifyArg
:修改调用某方法的参数
AccessWidener
不知道(Neo)Forge是否有
用于拓宽类内私有/保护成员的访问权限
本人Fabric开发经验分享
IDE
搭建 / 配置开发环境
Forge搭建可直接下载@耗子的离线包(百度搜)
Fabric看这篇,注意事项:
1. 强烈推荐IntelliJ IDEA
2. 重中之重:一定要安装Java17(+) JDK!!,否则环境搭建失败
3. fabric-example-mod
- build.properties
- 选择稳定版下载
- 有主类路径,不要填错,否则main找不到游戏报错
- 修改LICENSE、README.md
Could not execute entrypoint stage 'main' due to errors
修改fabric.mod.json / 注册物品问题——详见错误日志
项目文件夹
- fabric-example-mod的license要改
- 如果intellij 卡在Scanning files to index... Scanning library 'Gradle: commons-io' 那就多次重启软件
重新加载资源和依赖项
——发现Minecraft Client / Server冒“×”的解决方法
或右上角Minecraft Client - Edit - Build and run第一行 (依赖项存在的情况下,可以通过Gradle - Tasks - Fabric - runClient是否能成功运行来检验)
导出Mod
Gradle(右上角大象图标) - Tasks - build - build
API
Mixin
@Unique注解
org.spongepowered.asm.mixin.Unique
This annotation, when applied to a member method or field in a mixin, indicates that the member
should never overwrite a matching member in the target class. This indicates that the member differs from the normal "overlay-like" behaviour of mixins in general, and should only ever be added to the target. For public fields, the annotation has no effect.
AccessWidener
用于直接访问反编译源码中的非
public
对象
- fabric.mod.json添加
... "accessWidener": "your_mod_id_here.accesswidener ", ...
- build.gradle手动添加
- xxx has protected/private access in xxx 选择
Copy AW entry
,则可快速生成access widener表达式 - 如果显示另一个程序正在使用或文件占用
- 在运行
ValidateAccessWidener
前重启IntelliJ IDEA
,如果无效再重启电脑 - 可能是access widener语法错误,而不是显示的问题本身,如方法名和参数类型之间不要忘了隔开
- field descriptors参考
Descriptor | Primitive | Description |
---|---|---|
B | byte | signed byte |
C | char | Unicode character code point in the Basic Multilingual Plane, encoded with UTF-16 |
D | double | double-precision floating-point value |
F | float | single-precision floating-point value |
I | int | signed integer |
J | long | signed long integer |
L_ClassName_; | reference | an instance of ClassName |
S | short | signed short |
Z | boolean | true or false |
[ | reference | one array dimension |
修改构造函数
构造函数:注意不能mixin到super前面,否则报错退出
@Inject(method = "<init>", at = @At("TAIL"))
资源包
改变色调
图像 - 调整 - 可选颜色
获取音效+处理
- 英:freesound.org 查看网页原代码,搜索.wav .mp3 .ogg
- 中:tosound.com
- 音效包制作
- 音频压缩
语言
教程 制作自定义语言包:从入门到入完门 (转载备份)
indexes文件选一个,如json
这六个翻译神器可真猛,秒杀一众翻译软件,好用到犯规!
百度和谷歌垃圾,推荐DeepL,带AI,中翻英依然强(但目前2023韩语、捷克语不太好用?)
JsonBuddy Desktop与BabelEdit翻译language.json语言文件简要教程
暂时用不上
查找语言简称:使用必应搜索 颜文字和转义换行符翻译容易出问题
联机
Connection refused: no further information
将端口开放为25565