本篇教程由作者设定未经允许禁止转载。

主页

自定义主菜单是一个MOD,允许你使用json文件编辑minecraft主菜单。

它允许你添加或删除元素,如按钮和标签,也增加了一些新的东西,你可以添加到你的菜单,如整个自定义gui。

它的配置文件应该是这样的:(这是默认配置文件)

{
    "images":
    {
        "title":
        {
            "image" : "custommainmenu:textures/gui/minecraft.png",
            "posX" : -137,
            "posY" : 30,
            "width" : 512,
            "height" : 512,
            "alignment" : "top_center"
        }
    },
   
    "buttons":
    {
        "singleplayer":
        {
            "text" : "menu.singleplayer",
            "posX" : -100,
            "posY" : 48,
            "width" : 200,
            "height" : 20,
            "action" :
            {
                "type" : "openGui",
                "gui" : "singleplayer"
            }
        },
       
        "multiplayer":
        {
            "text" : "menu.multiplayer",
            "posX" : -100,
            "posY" : 72,
            "width" : 200,
            "height" : 20,
            "action" :
            {
                "type" : "openGui",
                "gui" : "multiplayer"
            }
        },
       
        "mods":
        {
            "text" : "Mods",
            "posX" : -100,
            "posY" : 96,
            "width" : 200,
            "height" : 20,
            "action" :
            {
                "type" : "openGui",
                "gui" : "mods"
            }
        },
           
        "options":
        {
            "text" : "menu.options",
            "posX" : -100,
            "posY" : 132,
            "width" : 98,
            "height" : 20,
            "action" :
            {
                "type" : "openGui",
                "gui" : "options"
            }
        },
       
        "quit":
        {
            "text" : "menu.quit",
            "posX" : 2,
            "posY" : 132,
            "width" : 98,
            "height" : 20,
            "action" :
            {
                "type" : "quit"
            }
        },
       
        "language":
        {
            "text" : "",
            "posX" : -124,
            "posY" : 132,
            "width" : 20,
            "height" : 20,
            "action" :
            {
                "type" : "openGui",
                "gui" : "languages"
            }
        },
       
        "refresh":
        {
            "text" : "",
            "posX" : -154,
            "posY" : 132,
            "width" : 20,
            "height" : 20,
            "texture" : "custommainmenu:textures/gui/buttons.png",
            "action" :
            {
                "type" : "refresh"
            }
        }
    },
   
    "texts":
    {
        "mojang":
        {
            "text" : "Copyright Mojang AB. Do not distribute!",
            "posX" : -197,
            "posY" : -10,
            "color" : -1,
            "alignment" : "bottom_right"
        },
       
        "fml":
        {
            "text" : "",
            "posX" : 2,
            "posY" : -50,
            "color" : -1,
            "alignment" : "bottom_left"
        }
    },
   
    "other":
    {
        "splash-text":
        {
            "posX" : 90,
            "posY" : 70,
            "color" : -256,
            "alignment" : "top_center",
            "texts" : "file:minecraft:texts/splashes.txt"
        },
       
        "panorama":
        {
            "images" : "minecraft:textures/gui/title/background/panorama_%c.png",
            "animate" : true,
            "animationSpeed" : 1,
            "blur" : true,
            "gradient" : true
        }
    }
}


按钮

按钮在被按下时执行动作。它们可以打开gui(也可以是自定义的gui),例如连接到一个服务器,打开一个链接或加载一个特定的世界。

注意:如果你要做一个200*100的按钮,那么你在ps里面就要创建一个200*200的画布,在配置文件的width调为200,height调为100,

因为它类似于会将你的按钮等分成上下两部分,上一半是没有鼠标悬浮的状态,下一半是鼠标悬浮的状态

举个栗子:

"singleplayer":{
      "text":"menu.singleplayer",
      "texture":"mainmenu:shortbutton.png",
      "posX":-100,
      "posY":-8,
      "width":98,
      "height":20,
      "imageWidth":98,
      "imageHeight":20,
      "alignment":"center",
      "action":{
           "type":"openGui",
           "gui":"singleplayer"
           }
},

可选属性

posX:按钮的X坐标

posY:按钮的Y坐标 

width:按钮的宽度

height:按钮的高度。

imageWidth:按钮在图像中的宽度(默认为高度)。 

imageHeight:按钮在图像中的高度(默认为宽度)。
texture : (可选)一个资源位置,它将被用作这个按钮的自定义纹理。该图像必须包含一个正常的和一个悬停版本的按钮。这是一个200x20按钮的例子。

text : 按钮上显示的文本(一个语言键(即lang中的条目)或只是普通文本)

hoverText : 当用户悬停在按钮上时显示的文本(一个语言键或只是普通文本)。

normalTextColor : (可选)一个rgb颜色的整数,用于显示按钮的正常文本颜色。 

hoverTextColor : (可选)一个rgb颜色的整数,用于显示鼠标在按钮上方时的文本颜色。 

pressSound : (可选)一个资源位置,指向该按钮在被按下时发出的声音

hoverSound : (可选) 指向该按钮在悬停时发出的声音的资源位置

tooltip : (可选)当用户悬停在此按钮上时,将显示的工具提示文本。

action : (可选) 当按钮被点击时将做什么,更多信息见Actions。 

wrappedButton :(可选) 按钮ID,更多信息请参考Wrapped Buttons。
alignment : (可选) 参见对齐方式的信息

textOffsetX/Y(可选)。按钮的文字将被偏移这个数量。


按钮动作

当用户点击一个按钮或一个文本时,就会执行动作。有各种不同的,可以简单地打开GUI,连接到服务器,或加载一个世界。它的格式如下

"action": {
   "type": "类型",
   "属性": "值"
}

type:动作的类型,有效值是:openLink, openGui, quit, refresh, connectToServer, loadWorld, openFolder

如下:

openLink:

-link:要打开的链接

"action":{
      "type":"openLink",
      "link":"https://www.feed-the-beast.com"
}


openGui:

-gui:应该打开的GUI(界面)这可以是一个自定义的GUI例如(custom.CUSTOM_GUI_NAME),

也可以是一个原版的gui如(每个是什么自己试吧)

(mainmenu, mods, singleplayer, singleplayer.createworld, multiplayer, credits, languages, realms, options, options.ressourcepacks, options.skinsettings, options.snooper, options.sounds, options.video, options.controls, options.manyplayer)

"action":{
        "type":"openGui",
        "gui":"languages"
}


connectToServer:

-ip:要连接的服务器的IP

"action":{
      "type":"connectToServer",
      "ip":"127.0.0.1"
}


loadWorld:

-dirName: 保存的目录名称(在saves文件夹中)。

-saveName: 并非真正必要,在加载世界时可能会在某些对话框中出现保存的名称。

"action":{
      "type":"loadWorld",
      "dirName":"新的世界"
}


openFolder:

-folderName:然后是应该被打开的文件夹的名字。(使用.minecraft文件夹作为根文件夹)

"action":{
      "type":"openFolder",
      "folderName":"config"
}


quit和refresh不需要任何额外的属性。(你只需要这样)

"action":{
      "type":"quit",
      }


其他mod按钮

自定义主菜单默认删除了所有由其他mods(Open Eye、Version Checker、Tabula)添加的按钮,因为无法像原版按钮那样控制它们。

使用包裹的按钮,你可以创建模仿其功能的按钮。为了让它们发挥作用,你需要找出你想重新添加的按钮的ID,

查看你最新的fml客户端日志并搜索 "wrapped button",所有被移除的mod按钮都被记录了它们各自的按钮ID。



文本

一般来说,所有在gui上可见的文本(标签、按钮、文本)都可以用3种不同的方式定义。

 1.从一个资源中加载

"splash-text": { "posX": 90, "posY": 70, "color": -256, "alignment": "top_center", "text": "file:minecraft:text/splashes.txt" }

file: 后面是文本应该被加载的文件的资源位置。 

2.从一个URL中加载(web: 后面是文本应该被加载的URL)

"changelog": { "text": "web:http://pastebin.com/raw.php?i=MmSCr6zV", "posX": 2, "posY": 0, "color": -1, "alignment": "left_center" }

3.静态文本

 "mojang": { "text": "Copyright Mojang AB. 请勿分发!", "posX": -197, "posY": -10, "color": -1, "alignment": "bottom_right" }

4.如果你想为你所使用的文本类型指定额外的属性(比如网络文本的刷新时间间隔文本的刷新间隔是以刻度为单位的,必须>=60(3秒)。

"label": { "text": { "type": "web", "url": "URL", "refreshInterval": 60 }, "posX": 0, "posY": 80, ... }


属性:

posX:标签的X坐标

posY:标签的Y坐标

color:文本颜色的rgb整数(颜色代码覆盖这个)。

hoverColor:(可选)一个rgb整数,当用户将鼠标悬停在文本上时,该文本的颜色(颜色代码覆盖此)。

text: 应该显示的文本(可以包含颜色代码)。

hoverText:用户在其上悬停时的文本(可以包含颜色代码

anchor:(可选)可以是 "开始"(默认)、"中间 "或 "结束"。使得文本向左、向中或向右对齐。

action: (可选)当用户点击标签时,将执行什么动作?

alignment(对齐):(可选)参见对齐方式的信息

fontSize(字体大小):(可选)文本的大小,1是默认的,2是2倍的大小。

pressSound: (可选)一个资源位置,指向该文本在按下时发出的声音

hoverSound: (可选)指向该文本在悬停时发出的声音的资源位置



图片

它们可以是来自本地文件夹或来自网络。

图片只能用png格式。

举个栗子:

"images":{
      "title":
      {
          "image" : "custommainmenu:textures/gui/minecraft.png",
          "posX" : -137,
          "posY" : 30,
          "width" : 512,
          "height" : 512,
          "alignment" : "top_center"
      }
},

属性

posX : 图像的X坐标 

posY:图像的Y坐标 

width:图像的宽度 

height:图像的高度 

image:实际图像的资源位置

hoverImage : 当用户悬停在图像上时,该图像的资源位置 

alignment : (可选)参见对齐方式的信息 

slideshow:(可选),见Slideshow


如果要使用网络图片像这样写

"image":{
     "image": "web:https://example.com/xxx.png",
     "posX":40,
     "posY":20,
     "width":64,
     "height":64,
     "alignment":"top_left"
}


要使用本地图片,你需要使用Resource Loader mod!

ps:其实使用压缩包打开modassets\custommainmenu\textures\gui\放这里,可以,然后像这样"image" : "custommainmenu:textures/gui/xxx.png"



背景

背景分为动态背景和静态背景。

背景属于"other"分区

静态背景:

{
"other":{
        "background":{
            "image":"mainmenu:001.png",
            "mode":"fill"
        }
    }
}

有两个参数可选:

image:【可选】标定着背景图片的地址,注意这个地址写法比较特殊。图片只支持png格式。

mode:【可选】图片的填充模式,有fill, stretch, center, tile四个选项可选。

-fill:适应,保证图片长宽比前提下,尽可能铺满屏幕。会适当裁剪图片。

-stretch:拉伸,尽可能铺满屏幕,如果不合适会强制拉伸图片。

-center:居中,不改变图片大小和比例,依据屏幕大小裁剪图片。

-tile:平铺,重复图片铺满屏幕。


动态背景:

{
"other":{
    "background":{
            "image" : "",
            "slideshow":{
                "images" : ["mainmenu:001.png","mainmenu:002.png","mainmenu:003.png"],
                "displayDuration" : 100,
                "fadeDuration" : 40
            }
        }
    }
}

image:此时为空,但是不可略去不写。

slideshow:添加循环的图片背景。

-images:添加循环的图片地址。

-displayDuration:图片停留时间,单位为tick。

-fadeDuration:转换图片时间,单位为tick。



对齐

什么是对齐方式?

一个元素的对齐方式指定了它在菜单屏幕上的相对位置。为了方便起见,定义了几个对齐方式的预设,不过如果需要的话,你也可以创建一个自定义的对齐方式。(完全不知道怎么自定义)


预设排列方式    (所有项目通用)这个对齐方式真的迷

"top_left"          "top_center"         "top_right"
"left_center"     "center"                "right_center"
"bottom_left"   "bottom_center"  "bottom_right"
"左上"、"中上"、"右上"、
"左中"、"中心"、"右中"、
"左下"、"中下"、"右下"

像这样使用:   "alignment" : "对齐方式"



变量

占位符变量名可能的输出
#date#当地日期Dec 22, 2019
#time#当地时间 (HH:mm)14:09
#mcversion#我的世界版本1.12.2
#fmlversion#FML版本8.0.99.99
#mcpversion#我的世界 Coder Pack 版本9.42
#modsloaded#加载的mod数量231
#modsactive#活跃的mod数量224
#forgeversion#Forge版本14.23.5.2847
#username#玩家名称dimaxiton5

变量不仅可以在 "文本 "字段中使用还可以在任何地方使用

例如:

{
  ...
  "text": "web:https://example.com/logPlayer.php?playerName=#username#",
  "action": {
    "type": "openLink",
    "link": "https://example.com/viewProfile?username=#username#"
  }
}




重要提示

ps:如果你要修改字为中文或者使用§,你必须要将编码转为ANSI,否则会乱码

ps:使用Ctrl+R快捷键刷新配置

ps:posX和posY的正值是向右下偏移

ps:推荐搭配该mod使用Main Menu Scale

最后如果有错或未提到的欢迎在短评提出