[CSGOKZ地图制作]如何制作真正的限时板
Da0lang
2021年10月28日 13:11

    引言

    限时板,顾名思义就是只能在上面站一段时间的板子,是检验玩家prekeep能力的最好方法之一,同时也可以用于制作很多好玩的东西。但是,在GOKZ3.0发布以前,很难有方法阻止玩家在限时板子上存点。然而限时板子上存点很大程度上让地图变得更简单无趣了。在研究了kz_unmake的触发之后,才逐渐学会如何阻止玩家在限时板上存点。

    如何制作玩家无法存点的限时板

    应知实体

    1、trigger_multiple 多次触发实体,不再赘述

    2、trigger_teleport  传送实体,懂得都懂

    3、filter_acitvator_name 过滤器

    4、logic_relay 延时实体

    下面将介绍如何制作无法存点的限时板。

     传统意义上而言,限时板实际上是单次板的一种拓展,单次板的制作请看。

    那么限时板实际上就是将单次板的时延 0.07秒提升到一个你想要的限时例如0.7,1.0这样。这样的想法看似很美好,但是实际上的瑕疵就是GOKZ插件的判定是当玩家在一个板子上可站立的时间大于等于0.1秒的时候,那么板子就是可以存点的;当小于0.1秒时,那么插件就会显示你刚刚落在这个板子上,不能存点。这也是为什么多次板/单次板的限时一般都在0.07~0.09秒左右,但是这个时间是根本不可能用在限时板上了,实在是太短了,因此我们将采用另一种方式去实现限时板。

注意:本方法仅适用于线性的多次板环节,就是一个板子到下一个板子,中间没有来回跳的,也不能跳过任何一个板子。

    不能存点的原理

    1、filter_activator_name

    利用该实体中filter mode,Disallow entities that match criteria这一选项,就是符合该过滤器的实体不会被纳入。

    2、logic_relay

    利用该实体的io口的CancelPending来取消对玩家的限时标记。

    演示

    首先我们需要放下一个作为限时板的方块,同时在上面拉上一个触发和传送,触发和传送的大小相同,高度最好高一些,我个人选择的是高度为108,且边缘突出板子4个单位,如图。

限时板块样式

    然后我们需要几个过滤器和一个logic_relay

    首先是用于过滤进入了限时板区域玩家的过滤器filter_activator_name,我将其命名为trer01,并设置过滤器标记名为tr01_start,过滤器模式为disallow,同时,用一个filter_multi将他套住,命名为filter_tr01(便于使用)。

filter_acttivator_name

filter_multi

  紧接着,在trigger_multiple的Outputs中写入如下语句

限时板上的trigger_multiple

   这里的tr01_active 我并没有额外新建一个过滤器来包含这个标志名,因为根本不需要用到它。

   再在trigger_teleport中填入过滤器filter_tr01

trigger_teleport

    这几个步骤的用意就是,当玩家再次走出这个限时板时,就会被标记为tr01_active,根据filter_tr01的设置,除了被标记为tr01_start的玩家,其他任意玩家走入以上这个传送,都会被传送会起点。也就是说,除非被标记为tr01_start,否则就会被传送回去。

     根据这个原理,我们在这个板子前放一块大触发trigger_multiple,用来给予玩家tr01_start的标记。

trigger_multiple给予标记

    这样,就能阻止存点了,那么怎么样才能做到限时呢?

    这里运用一个logic_relay的实体来实现限时功能。放置一个点实体,改为logic_relay,命名为timeRelay,并在Outputs写下如下语句。

logic_relay

    这里的activator的时间,就是限时的时间,后一个default只是进行一个自动重置的功能的实现。那么这个实体可以看到,是Ontrigger进行触发的。我们在限时板上再放一块触发trigger_multiple,并在Output写下如下语句。

限时触发

    这样,我们的限时触发就做好了。来理解一下这一条语句,Ontrigger意为触发这个触发区域时,其实和Onstarttouch差不多,Trigger timedRelay这个logic_relay中储存好的语句,那么储存好的语句其实就是一条实现限时功能的语句。这样限时的功能就实现了。

    但是问题来了,如果玩家在限时的标记被给予到玩家身上时回到了起点,又或者跳到了下一个板子,那么他在到达板子的一瞬间,或者在到达板子之前就会被标记为activator,这样就会出现一个秒传的现象。因此我们需要再大板子前的trigger_multiple中再加入一个语句。

大板子前的trigger_multiple

   这条语句的含义是,当玩家触发了这个触发区域时,就会终止timedRelay语句的执行。这样,当玩家碰到这个触发区域时,就不会被标记为activator,也就不会发生秒传的现象。

    总的而言,整个过程是这样的,玩家在起点起跳,碰到大板子前的触发,首先执行的是终止之前已经存在的限时语句,同时将其标记为tr01,给予玩家进入限时板的权利,当玩家进入限时板的同时,logic_relay开始给玩家计时,若计时内未能走出板子,就会被传送回起点,若走出了板子,就会被标记为tr01_active或activator中的一个,随后变回default,取决于时间的先后顺序。但是这根本不要紧,因为起点没有重置的触发,所以玩家被传送回去后或者通过存读点回去之后只会是tr01_activa,activator,default中的一个,而想要进入限时板区域,必须要通过板子前的大触发,被标记为tr01_start,否则会将玩家直接传送回起点,这样就解决掉了存点偷鸡的问题。

      做好了这一个子系统以后,通过复制粘贴,做出tr02 tr03,就可以作出一个线性的限时板区域。限时房间的原理其实也是如此,自己研究下就能理解了。

       范例vmf

链接:https://pan.baidu.com/s/1uUAzB593tuq1dqsoHz7Bkg 

提取码:wdf1