来自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类型的玩家数据