来自CRT中关于GameStages的wiki :https://docs.blamejared.com/1.12/zh/Mods/GameStages/GameStages

个人翻译并润色(其实就是啃wiki的时候自己做的笔记,尝试尽可能的通俗化一点,希望帮助到入门新人)


GameSages是一个帮助整合包创建进程系统(阶段系统)的框架(前置)。

各种阶段本身没有什么意义,你需要通过脚本来规定它们能发挥何种用处,比如设置解锁阶段才能解锁物品。

许多mod可以根据玩家是否拥有某个阶段,从而进行配置以做出不同的反应。

 

它是如何工作的

你得先理解这个:你设置阶段的时候不需要像编程语句那样严谨,你可以给它自由的取名,而不是说你得先去官网查查哪些阶段名能用。

你可以根据需要把某个阶段授予玩家。

许多mod可以根据配置,通过检查阶段,来看玩家是否符合要求。

 

有效的阶段名

为了确保你的阶段名有效,其必须满足以下要求。

1.必须为至少一个字符且小于65个字符的字符串。

2.只能包含小写字符。

3.只能包含拉丁字母“0-9”、“_”和“:”。

4.不能包含空格!(可用下划线分割单词)

 

无内鬼,来点指令

/gamestage add <玩家> <阶段> - 为玩家解锁一个阶段。

/gamestage remove <玩家> <阶段> - 移除玩家的一个已解锁阶段。

/gamestage clear <玩家> - 清除玩家解锁的所有阶段。

/gamestage check <玩家> <阶段> - 检查玩家是否解锁了某个阶段。

/gamestage info - 显示您已解锁的所有阶段。

 

 

授予玩家阶段

1.通过指令来授予玩家阶段:

 /gamestage add <玩家> <阶段名>

2.通过任务模组授予玩家阶段:

大多数任务mod允许你把“解锁阶段”作为任务奖励。还可以编写脚本,通过(on)特定的触发因素(triggers)来授予玩家阶段。

 

创建阶段限制

GameStages本身只是个前置,若你想要让玩家“在每个阶段就要有每个阶段的样子”(即限制使用物品、进入维度、制作合成)

那就得交给第三方插件和直接支持阶段的mod了,另外你也可以用CraftTweaker脚本创建的自定义系统(事件系统)。以下是推荐的插件(可见mod百科)

以下是三个常用mod:

1.维度阶段(Dimension Stages)

允许你要求玩家在进入特定的维度之前,需要解锁某个游戏阶段。(比如进入下界)

 

2.物品阶段(Item Stages)

允许你设定一些物品不能被玩家所使用,除非解锁某个游戏阶段。(未解锁阶段的物品会显示Unfamiliar Item)

 

配方阶段(Recipe Stages

在解锁某个阶段之前,让一些合成表没法用。(甚至是在JEI中都找不到)

 

FAQ

问:我想给阶段命名,会不会很麻烦?

答:这是一个常见的误解:总有人以为阶段名是GS制作者预先命名好的,自己不能设置,只能取用这些特定的名称作为阶段名。实际上你可以按你自己的想法整活,不过前提是得符合命名规则。

 

问:能不能多举点例子给爷瞅瞅?

答:GitHub上有老多,并且大多数插件也会在他们的GitHub上提供例子,方便大家整活,这些例子也可以在游戏中通过指令/ct examples自动生成。

 

阶段编辑

与前面的指令相对应,只不过这里是在脚本编辑的

添加阶段

任何时候你都可以使用以下方法添加一个阶段。

player.addGameStage("stage_name");

 

删除阶段

任何时候你都可以使用以下方法删除一个阶段。

player.removeGameStage("stage_name");

 

清除阶段

也可以使用clear清除授予玩家的所有阶段。

player.clearGameStages();

 

检查单个阶段

任何时候你都可以使用以下方法检查是否有某个阶段。

player.hasGameStage("stage_name");  //得到布尔值“TRUE”或“FALSE”


检查多个阶段

也可以检查玩家是否有数组中任意的阶段(至少有数组内一个阶段,就为true)

player.hasAnyGameStages("stage _one", "stage _two", "defeated_boss_a");

//或者

var validStagesForX as string[] = [ "stage_one", "stage_two", "defeated_boss_a" ];
player.hasAnyGameStages(validStagesForX);

你还可以检查玩家是否拥有数组中的所有阶段。(必须有数组内全部阶段,才为true)

player.hasAllGameStages("stage_one", "stage_two", "defeated_boss_a");

//或者

var requiredStagesForX as string[] = [ "stage_one", "stage_two", "defeated_boss_a" ];
player.hasAllGameStages(requiredStagesForX);

举例

(别忘记导包)

import crafttweaker.events.IEventManager; 
import crafttweaker.player.IPlayer;

events.onPlayerLoggedIn(function(event as crafttweaker.event.PlayerLoggedInEvent) {
    var player as IPlayer = event.player;
    
    //player.addGameStage("stage_one");
    //player.sendMessage("You logged in! Here is stage 'one'.");
    //以上是“玩家一登录,就给玩家一个游戏阶段”,不过这样会有很多bug,比如玩家早已有这个阶段,所以可以用if,若无则加
    //所以下面是新的方法
 
    if(!player.hasGameStage("stage_one ")){      //“!”是“没有”、“相反”的意思
        player.addGameStage("stage_one");
 
        player.sendMessage("You logged in! Here is stage 'one'.");
}
        //如果检测到没有阶段stage_one,则添加
});

阶段应当与事件系统相结合,如果没有事件,你将无法得到IPlay类型的玩家数据