From 5b81a886e4b0be8b59cf3b0ea51e86b96f32cca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?An=C4=B1lcan?= Date: Thu, 2 Jan 2020 01:19:48 +0300 Subject: [PATCH] feat(tsl): add random N players selector to REFLECT action Closes #18 --- gradle.properties | 2 +- .../tslanguage/action/ReflectAction.java | 39 +++++++++++++++++-- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/gradle.properties b/gradle.properties index f0de4bd..c091803 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ org.gradle.daemon=false mod_id=twitchspawn mod_group=net.programmer.igoodie -mod_version=0.4.16 +mod_version=0.4.17 minecraft_version=1.12.2 forge_version=14.23.3.2655 diff --git a/src/main/java/net/programmer/igoodie/twitchspawn/tslanguage/action/ReflectAction.java b/src/main/java/net/programmer/igoodie/twitchspawn/tslanguage/action/ReflectAction.java index ad75a54..de0b7c5 100644 --- a/src/main/java/net/programmer/igoodie/twitchspawn/tslanguage/action/ReflectAction.java +++ b/src/main/java/net/programmer/igoodie/twitchspawn/tslanguage/action/ReflectAction.java @@ -10,11 +10,13 @@ import java.util.Arrays; import java.util.Collections; +import java.util.LinkedList; import java.util.List; public class ReflectAction extends TSLAction { private boolean reflectEveryone; + private int reflectRandomN; private List reflectedUsers; private TSLAction action; @@ -25,17 +27,25 @@ public ReflectAction(List words) throws TSLSyntaxError { throw new TSLSyntaxError("Invalid length of words: " + words); // "REFLECT %% REFLECT %% ..." is not allowed - if (words.get(1).equalsIgnoreCase(TSLActionKeyword.ofClass(getClass()))) + String reflectActionName = TSLActionKeyword.ofClass(getClass()); + if (words.stream().anyMatch(word -> word.equalsIgnoreCase(reflectActionName))) throw new TSLSyntaxError("Cannot have a cyclic REFLECT rule."); String usersRaw = words.get(0); if (usersRaw.equals("*")) { this.reflectEveryone = true; + this.reflectRandomN = 0; + this.reflectedUsers = null; + + } else if (usersRaw.matches("\\d+")) { + this.reflectEveryone = false; + this.reflectRandomN = parseInt(usersRaw); this.reflectedUsers = null; } else { this.reflectEveryone = false; + this.reflectRandomN = 0; this.reflectedUsers = Arrays.asList(usersRaw.split(",\\s*")); } @@ -50,9 +60,7 @@ protected void performAction(EntityPlayerMP player, EventArguments args) { action.process(args); // Select where to reflect - List reflectedUsers = this.reflectEveryone - ? Arrays.asList(player.getServer().getOnlinePlayerNames()) - : this.reflectedUsers; + List reflectedUsers = getReflectedPlayers(player); // Reflect to selected users reflectedUsers.forEach(username -> { @@ -79,6 +87,29 @@ protected void performAction(EntityPlayerMP player, EventArguments args) { }); } + private List getReflectedPlayers(EntityPlayerMP player) { + if (this.reflectEveryone) { + return Arrays.asList(player.getServer().getOnlinePlayerNames()); + } + + if (this.reflectRandomN != 0) { + List reflectedPlayers = new LinkedList<>(); + List onlinePlayers = new LinkedList<>(Arrays.asList(player.getServer().getOnlinePlayerNames())); + + for (int i = 0; i < reflectRandomN; i++) { + if (onlinePlayers.size() == 0) break; + + int index = (int) (Math.random() * onlinePlayers.size()); + String selectedPlayer = onlinePlayers.remove(index); + reflectedPlayers.add(selectedPlayer); + } + + return reflectedPlayers; + } + + return this.reflectedUsers; + } + private void reflectAction(EntityPlayerMP player, EventArguments args) { action.reflectedUser = player;