Skip to content
This repository has been archived by the owner on Nov 29, 2020. It is now read-only.

Latest commit

 

History

History
84 lines (57 loc) · 3.47 KB

xian-zhi-zhi-ling-zhi-hang-shi-jian.md

File metadata and controls

84 lines (57 loc) · 3.47 KB

限制指令执行时间

背景:玩家赢得了彩票/奖励,胜利者并不在线,但是我们想把奖励给他。

奖励命令为

/give %user_name% minecraft:cookie 5

我们必须用 %user_name% 占位符,因为只有这个才能指定离线玩家。如果我们用了 %player_name% ,就无法指定离线玩家,也就是偏离了我们的本意了。关于PlaceholderAPI的安装,请看这里或者是mcbbs你倒是自己找找啊!

延迟到胜利者上线的指令:

/cu execute whenOnline %user_name% *give %user_name% minecraft:cookie 5

这样是可以实现的,但是如果你只想让胜利者在接下来的三天内上线才能拿到奖励的话,就得用 /cu execute if "*cu is before <timestamp>" "..."指令:

/cu execute whenOnline %user_name% *cu execute if "*cu is before <时间戳>" "*give %user_name% minecraft:cookie 5"

但是我们怎么得到时间戳呢?我们可以使用一个 JavaScript placeholder

下面是一个我们的用例:

config/placeholderapi/javascript/timestamp.js

function isEmpty(string) {
  return (!string || 0 === string.length());
}

function toNumberOrZero(string) {
  return isEmpty(string) ? 0 : parseInt(string);
}

with(new JavaImporter(java.lang, java.time, java.time.temporal, java.util, java.util.regex, java.text)) {
  var duration = args[0];
  var now = Instant.now();

  var durationRegex = Pattern.compile("(?:(\\d+)d)?(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?(?:(\\d+)ms)?");

  var matcher = durationRegex.matcher(duration);

  if (!matcher.find()) {
    throw new IllegalArgumentException("'" + duration + "' isn't a valid duration! Use something like '3d2h12m30s800ms'")
  }

  var days = toNumberOrZero(matcher.group(1));
  var hours = toNumberOrZero(matcher.group(2));
  var minutes = toNumberOrZero(matcher.group(3));
  var seconds = toNumberOrZero(matcher.group(4));
  var milliseconds = toNumberOrZero(matcher.group(5));

  var time = now
    .plus(days, ChronoUnit.DAYS)
    .plus(hours, ChronoUnit.HOURS)
    .plus(minutes, ChronoUnit.MINUTES)
    .plus(seconds, ChronoUnit.SECONDS)
    .plus(milliseconds, ChronoUnit.MILLIS);

  var format = new SimpleDateFormat("HH:mm:ss.SSS-dd.MM.yyyy");
  out = format.format(java.util.Date.from(time));
}

(翻译者不会写js,找翻译者莫得用处!) 所以现在占位符 %javascript_timestamp% 使用了一个duration语句然后返回一个 <时间戳> ,这个 <时间戳> 可以被 afterbefore 调用。

这是我们的最终命令:

/cu execute whenOnline %user_name% *cu execute if "*cu is before %javascript_timestamp_3d%" "*give %user_name% minecraft:cookie 5""

我们可以把这个指令放到任何地方使用,例如手动使用,命令方块,或者用一个命令别称qwq。

如果我们想用命令别称调用这个指令,我们必须指定胜利者玩家。 我们想要的别称是 /reward <player> 。我们用 /cu execute parsed ... 指令来将玩家放入指令。

aliases {
    "reward {0}" {
        commands=[
            "*cu execute parsed {0} *cu execute whenOnline %user_name% *cu execute if \"*cu is before %javascript_timestamp_3d%\" \"*give %user_name% minecraft:cookie 5\""
        ]
        permission="admin.give-reward"
    }
}