305822437
本帖最后由 305822437 于 2018-2-26 17:49 编辑

关于检测玩家是否结束潜行
作为萌新可能写的不太好,请见谅.请问还有没有更好的解决方法?

创建计分板
  1. scoreboard objectives add Ram dummy
  2. scoreboard objectives add M dummy
  3. scoreboard objectives add sneakT stat.sneakTime
复制代码
fill高频
  1. <font color="#ff0000">fill ~ ~-1 ~ ~ ~-1 ~-2 redstone_block
  2. fill ~ ~1 ~ ~ ~1 ~-2 air</font>
复制代码


进行检测
  1. scoreboard players add @a[score_sneakT_min=1] M 1
  2. scoreboard players operation @a[score_Ram_min=0] Ram = @a[score_Ram_min=0] sneakT
  3. scoreboard players operation @a Ram -= @a M
  4. scoreboard players set @a[score_Ram=-1] M -1
复制代码

解析:
  1. scoreboard players add @a[score_sneakT_min=1] M 1
复制代码
用于模拟潜行加分

  1. scoreboard players operation @a[score_Ram_min=0] Ram = @a[score_Ram_min=0] sneakT
复制代码
Ram作为临时存储器

  1. scoreboard players operation @a Ram -= @a M
复制代码


不停地比较Ram[sneakT]与模拟潜行的大小,判断潜行是否结束
  1. <font color="black">scoreboard players set @a[score_Ram=-1] M -1</font>
复制代码


[增强容错]


  1. testfor @a[score_Ram=-1]
  2. scoreboard players test ……
复制代码

输出


  1. scoreboard players set @a sneakT 0
复制代码


归零





305822437
本帖最后由 305822437 于 2018-2-26 17:54 编辑



乱码修复好了,不过这排版简直不忍直视

305822437
305822437 发表于 2018-2-26 16:22
输出那段好像乱码了
想了一天,脑袋疼

见谅后面的?请无视,不知道哪来的

⊙v⊙
本帖最后由 ⊙v⊙ 于 2018-2-26 17:19 编辑

好像看懂了...
/scoreboard objectives add ifsneak stat.sneakTime
/scoreboard objectives setdisplay sidebar ifsneak

下面这条紫cb高频
/scoreboard players set @a[score_ifsneak_min=1] ifsneak 0刚才没写完...
紫色cb后面接个绿cb,条件约束,用于给玩家+Tag


放另一个紫cb,检测ifsneak=0且有Tag的玩家,使其执行去Tag。后接一个条件绿。
只用到一个stat.sneakTime板,和一个Tag
3个cb和一个输出用的绿cb...


反正无论怎么想,你用dummy检测sneakTime还模拟,基本是多余的。

看后面的楼层...

305822437
⊙v⊙ 发表于 2018-2-26 16:47
M(dummy)=stat.sneakTime
Ram(dummy)=stat.sneakTime
M(dummy)-Ram(dummy)=0

嗯,归〇忘写了。

但是stat.sneakTime不会主动归0呀,必须主动归0为下一次检测做准备
但是主动归0就必须知道你有没有退出潜行
这几条命令的作用就在这

305822437
本帖最后由 305822437 于 2018-2-26 17:33 编辑
⊙v⊙ 发表于 2018-2-26 16:47
好像看懂了...
/scoreboard objectives add ifsneak stat.sneakTime
/scoreboard objectives setdisplay si ...
好像不行,试了下绿CB会不停的触发


305822437
⊙v⊙ 发表于 2018-2-26 16:47
好像看懂了...
/scoreboard objectives add ifsneak stat.sneakTime
/scoreboard objectives setdisplay si ...

但是这样不还是潜行中就有输出了吗,
/scoreboard players set @a[score_ifsneak_min=1] ifsneak 0
只要ifsneak≥1【在潜行中】。ifsneak就会在0、1不停的波动
给玩家+Tag还是相当与把未结束潜行的玩家涵括进去了呀
后面再检测几乎就无意义了呀

⊙v⊙
305822437 发表于 2018-2-25 23:34
但是这样不还是潜行中就有输出了吗,
/scoreboard players set @a[score_ifsneak_min=1] ifsneak 0
只要if ...

是吗...那就这样
if sneak>=1, tag add s
if sneak=0 tag=s, say 输出
if sneak=0 tag=s, tag remove s
set sneak 0
这个顺序...
写在function里吧,已经不会用cb了...
这次应没错了



305822437
⊙v⊙ 发表于 2018-2-26 18:31
是吗...那就这样
if sneak>=1, tag add s
if sneak=0 tag=s, say 输出

sneak不会主动归零是最大的问题,这个问题不解决
if sneak=0这个条件就行不通了

顺便问下为啥会显示函数错误,格式已经是UTF-8无BOM了,函数也用/reload更新了

305822437
本帖最后由 305822437 于 2018-2-26 19:46 编辑
⊙v⊙ 发表于 2018-2-26 18:31
是吗...那就这样
if sneak>=1, tag add s
if sneak=0 tag=s, say 输出

function能用if...else...吗,能用的话好像有个很简单的方法

⊙v⊙
305822437 发表于 2018-2-26 01:20
sneak不会主动归零是最大的问题,这个问题不解决
if sneak=0这个条件就行不通了

你自己开后台看,估计是哪条命令写错,整个mcfunction就当了...

此t不潜行,没有标签。
潜行时获得标签,此t末尾分数归0。

下一t
依然潜行时sneak依然大于0,跳过输出,分数归0。但如果停止潜行了,由于上t被设0,这t也是0,
输出,去tag。

应该是这样...具体行不行得通,我明天试完告诉你...



其实除了tag我想到了个更省脑的办法...sneak时设玩家dummy记分板3分。持续高频此dummy减1分。没有sneak时此dummy减至0分,0分输出...。要只执行一次的就减至-1分,0分输出...

说到底只是想告诉你...用dummy仿stat.sneakTime,相减,复杂了

kongbaiyo
这个版本里已经不用fill高频了
紫色命令方块就是高频了

305822437
⊙v⊙ 发表于 2018-2-26 19:49
你自己开后台看,估计是哪条命令写错,整个mcfunction就当了...

此t不潜行,没有标签。

我也知道复杂了,想的我脑袋疼
但我昨天只想出来这个思路,就着手试了下。
function今天才接触到

305822437
kongbaiyo 发表于 2018-2-26 19:50
这个版本里已经不用fill高频了
紫色命令方块就是高频了

可能我看的教程比较老旧了

305822437
⊙v⊙ 发表于 2018-2-26 19:49
你自己开后台看,估计是哪条命令写错,整个mcfunction就当了...

此t不潜行,没有标签。

execute @a[score_sneakT_min=1] ~ ~ ~ scoreboard players set @s sneakT 0
execute @a[score_sneakT_min=1] ~ ~ ~ scoreboard players tag @s add s
execute @a[score_sneakT=0,tag=s] ~ ~ ~ say 输出
execute @a[score_sneakT=0,tag=s] ~ ~ ~ scoreboard players tag @s remove s

是这么书写吗

Sssss...
现在1.9以上可以不需要fill高频了
有更快的高频

305822437
Sssss... 发表于 2018-2-26 23:12
现在1.9以上可以不需要fill高频了
有更快的高频

更快的高频是什么?

⊙v⊙
本帖最后由 ⊙v⊙ 于 2018-2-26 17:37 编辑

运行一次
  1. scoreboard objectives add ifsneak minecraft.custom:minecraft.sneak_time
复制代码

让玩家执行,高频以下function内容...
  1. execute if entity @s[scores={ifsneak=1..}] run tag @s add s
  2. execute if entity @s[scores={ifsneak=0},tag=s] run say 输出
  3. execute if entity @s[scores={ifsneak=0},tag=s] run tag @s remove s
  4. scoreboard players set @s ifsneak 0
复制代码
原谅我太懒直接用1.13命令格式...
1.12的...
  1. scoreboard objectives add ifsneak stat.sneakTime
复制代码

左到右分别是
  1. execute @p[score_ifsneak_min=1] ~ ~ ~ scoreboard players tag @s add s
  2. execute @p[score_ifsneak_min=0,score_ifsneak=0,tag=s] ~ ~ ~ say 输出
  3. execute @p[score_ifsneak_min=0,score_ifsneak=0,tag=s] ~ ~ ~ scoreboard players tag @s remove s
  4. scoreboard players set @p ifsneak 0
复制代码



305822437
⊙v⊙ 发表于 2018-2-27 11:13
运行一次

让玩家执行,高频以下function内容...

可行,谢谢

305822437
本帖最后由 305822437 于 2018-2-27 15:18 编辑
继续做我的地图去

305822437
⊙v⊙ 发表于 2018-2-27 11:13
运行一次

让玩家执行,高频以下function内容...

用其他函数调用它的时候好像有些bug
和16楼的bug类似

☆娜娜★
赞                              赞

夏君竹
刚刚需要用到这个,就在论坛看到了,谢谢

305822437
夏君竹 发表于 2019-3-18 22:39
刚刚需要用到这个,就在论坛看到了,谢谢

不用谢呐,我也是找了好久找不到,然后自己想。想出来就发出来了,顺便交流下有没有更好的思路。

第一页 上一页 下一页 最后一页