Skip to content

Commit

Permalink
Add /easy-sign-used <player> <count> to reset announce and max.
Browse files Browse the repository at this point in the history
  • Loading branch information
totemo committed Apr 1, 2019
1 parent 3e4228e commit 1d38775
Show file tree
Hide file tree
Showing 4 changed files with 147 additions and 71 deletions.
66 changes: 66 additions & 0 deletions src/main/java/nu/nerd/easysigns/CommandHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,17 @@
import java.util.Map;
import java.util.stream.Collectors;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;

import nu.nerd.easysigns.actions.AnnounceAction;
import nu.nerd.easysigns.actions.MaxAction;
import nu.nerd.easysigns.actions.SignAction;

public class CommandHandler implements TabExecutor {
Expand All @@ -31,6 +35,7 @@ public CommandHandler() {
plugin.getCommand("easy-sign-reorder").setExecutor(this);
plugin.getCommand("easy-sign-copy").setExecutor(this);
plugin.getCommand("easy-sign-paste").setExecutor(this);
plugin.getCommand("easy-sign-used").setExecutor(this);
}

@Override
Expand Down Expand Up @@ -61,6 +66,9 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String
case "easy-sign-paste":
pasteSign(sender, args);
break;
case "easy-sign-used":
usedSign(sender, args);
break;
}
return true;
}
Expand Down Expand Up @@ -342,6 +350,63 @@ private void pasteSign(CommandSender sender, String[] args) {
player.sendMessage(ChatColor.LIGHT_PURPLE + "Sign actions pasted.");
}

/**
* Handle /easy-sign-used <player> <count>.
*/
private void usedSign(CommandSender sender, String[] args) {
if (args.length != 2) {
sender.sendMessage(ChatColor.RED + "Invalid arguments. Usage: /easy-sign-used <player> <count>");
return;
}

Player creator = (Player) sender;
Block looking = creator.getTargetBlock(null, 5);
if (!plugin.isSign(looking)) {
sender.sendMessage(ChatColor.RED + "That isn't a sign.");
return;
}
if (!plugin.isEasySign(looking)) {
sender.sendMessage(ChatColor.RED + "No EasySign actions are assigned to that sign.");
return;
}

OfflinePlayer player = Bukkit.getOfflinePlayer(args[0]);
if (!player.isOnline() && !player.hasPlayedBefore()) {
sender.sendMessage(ChatColor.RED + "That player has not been seen before.");
return;
}

int count = -1;
try {
count = Integer.parseInt(args[1]);
} catch (IllegalArgumentException ex) {
}
if (count < 0) {
sender.sendMessage(ChatColor.RED + "The count must be zero or greater.");
return;
}

SignData sign = SignData.load(looking);
boolean changed = false;
for (SignAction action : sign.getActions()) {
if (action.getName().equals("announce")) {
boolean signUsed = (count != 0);
((AnnounceAction) action).setUsed(player.getUniqueId(), signUsed);
sender.sendMessage(ChatColor.GOLD + "The announce action now records " + player.getName() +
" as having " + (signUsed ? "used" : "never used") + " the sign.");
changed = true;
} else if (action.getName().equals("max")) {
((MaxAction) action).setTimesUsed(player.getUniqueId(), count);
sender.sendMessage(ChatColor.GOLD + "The use count for " + player.getName() + " was set to " + count + ".");
changed = true;
}
}

if (!changed) {
sender.sendMessage(ChatColor.GOLD + "No sign actions were affected.");
}
}

/**
* Print the big help text block when /easy-sign is run with no arguments
*/
Expand Down Expand Up @@ -372,6 +437,7 @@ private void addActionCommandHelpText(CommandSender sender) {
sender.sendMessage(String.format(cmdFmt, "/easy-sign-remove", "Remove a single action from a sign."));
sender.sendMessage(String.format(cmdFmt, "/easy-sign-reorder", "Move an action from one position to another."));
sender.sendMessage(String.format(cmdFmt, "/easy-sign-delete", "Remove all actions from a sign."));
sender.sendMessage(String.format(cmdFmt, "/easy-sign-used <player> <count>", "Record that <player> has used a sign <count> times."));

// Colors
sender.sendMessage(ChatColor.translateAlternateColorCodes('&',
Expand Down
46 changes: 26 additions & 20 deletions src/main/java/nu/nerd/easysigns/actions/AnnounceAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@

import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

import org.bukkit.ChatColor;
import org.bukkit.configuration.ConfigurationSection;
Expand Down Expand Up @@ -67,38 +70,41 @@ public Map<String, Object> serialize() {
return map;
}

private boolean hasUsed(Player player) {
String[] used = (String[]) BlockStoreApi.getBlockMeta(sign.getBlock(), EasySigns.instance, "announce");
if (used != null) {
for (String id : used) {
if (id.equalsIgnoreCase(player.getUniqueId().toString())) {
return true;
}
}
}
return false;
public boolean hasUsed(UUID playerUUID) {
String uuidString = playerUUID.toString();
return getAnnouncedUUIDs().contains(uuidString);
}

private void setUsed(Player player) {
String[] newUsed;
String[] oldUsed = (String[]) BlockStoreApi.getBlockMeta(sign.getBlock(), EasySigns.instance, "announce");
if (oldUsed != null && oldUsed.length > 0) {
newUsed = Arrays.copyOf(oldUsed, oldUsed.length + 1);
newUsed[newUsed.length - 1] = player.getUniqueId().toString();
public void setUsed(UUID playerUUID, boolean used) {
String uuidString = playerUUID.toString();
Set<String> announced = getAnnouncedUUIDs();
if (used) {
announced.add(uuidString);
} else {
newUsed = new String[] { player.getUniqueId().toString() };
announced.remove(uuidString);
}
BlockStoreApi.setBlockMeta(sign.getBlock(), EasySigns.instance, "announce", newUsed);
BlockStoreApi.setBlockMeta(sign.getBlock(), EasySigns.instance, "announce", announced.toArray(new String[announced.size()]));
}

@Override
public void action(Player player) {
if (!hasUsed(player)) {
UUID playerUUID = player.getUniqueId();
if (!hasUsed(playerUUID)) {
player.getServer().broadcastMessage(message.replace("%s", player.getName()));
setUsed(player);
setUsed(playerUUID, true);
} else {
player.sendMessage(ChatColor.GREEN + "[SIGN] " + ChatColor.WHITE + "You can only announce here once!");
}
}

/**
* Return the set of UUIDs (as Strings) of players that have triggered this
* action.
*
* @return the non-null set of UUID Strings.
*/
private Set<String> getAnnouncedUUIDs() {
String[] used = (String[]) BlockStoreApi.getBlockMeta(sign.getBlock(), EasySigns.instance, "announce");
return used != null ? new HashSet<>(Arrays.asList(used)) : new HashSet<>();
}
}
98 changes: 47 additions & 51 deletions src/main/java/nu/nerd/easysigns/actions/MaxAction.java
Original file line number Diff line number Diff line change
@@ -1,120 +1,116 @@
package nu.nerd.easysigns.actions;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import net.sothatsit.blockstore.BlockStoreApi;
import nu.nerd.easysigns.EasySigns;
import nu.nerd.easysigns.SignData;
import org.bukkit.ChatColor;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;

import java.util.HashMap;
import java.util.Map;
import net.sothatsit.blockstore.BlockStoreApi;
import nu.nerd.easysigns.EasySigns;
import nu.nerd.easysigns.SignData;

public class MaxAction extends SignAction {


private SignData sign;
private final SignData sign;
private int uses;
boolean valid = true;


public MaxAction(SignData sign, String[] args) {
this.sign = sign;
try {
uses = Integer.parseInt(args[0]);
} catch (IndexOutOfBoundsException|IllegalArgumentException ex) {
} catch (IndexOutOfBoundsException | IllegalArgumentException ex) {
valid = false;
}
}


public MaxAction(SignData sign, ConfigurationSection attributes) {
this.sign = sign;
this.uses = attributes.getInt("uses");
}


@Override
public String getName() {
return "max";
}


@Override
public String getUsage() {
return "<uses>";
}


@Override
public String getHelpText() {
return "Allows the sign to be used <uses> times and no more. No other commands will be run once limit is reached.";
}


@Override
public String toString() {
return String.format("%s %d", getName(), uses);
}


@Override
public boolean isValid() {
return valid;
}


@Override
public Map<String, Object> serialize() {
Map<String, Object> map = new HashMap<>();
map.put("uses", uses);
return map;
}


private int timesUsed(Player player) {
FileConfiguration yaml = new YamlConfiguration();
try {
String str = (String) BlockStoreApi.getBlockMeta(sign.getBlock(), EasySigns.instance, "max");
if (str == null) return 0;
yaml.loadFromString(str);
} catch (InvalidConfigurationException ex) {
ex.printStackTrace();
}
return yaml.getInt(player.getUniqueId().toString(), 0);
public int getTimesUsed(UUID playerUUID) {
FileConfiguration uses = loadUseMap();
return uses.getInt(playerUUID.toString(), 0);
}


private void incrementUsed(Player player) {
FileConfiguration yaml = new YamlConfiguration();
try {
String str = (String) BlockStoreApi.getBlockMeta(sign.getBlock(), EasySigns.instance, "max");
if (str != null) {
yaml.loadFromString(str);
}
int times = yaml.getInt(player.getUniqueId().toString(), 0);
yaml.set(player.getUniqueId().toString(), times + 1);
BlockStoreApi.setBlockMeta(sign.getBlock(), EasySigns.instance, "max", yaml.saveToString());
} catch (InvalidConfigurationException ex) {
ex.printStackTrace();
}
public void setTimesUsed(UUID playerUUID, int count) {
FileConfiguration uses = loadUseMap();
uses.set(playerUUID.toString(), count);
BlockStoreApi.setBlockMeta(sign.getBlock(), EasySigns.instance, "max", uses.saveToString());
}


@Override
public boolean shouldExit(Player player) {
//don't process further actions if the player has used this sign already
return timesUsed(player) > uses;
return getTimesUsed(player.getUniqueId()) > uses;
}


@Override
public void action(Player player) {
int pTimes = timesUsed(player);
if (pTimes <= uses) {
incrementUsed(player);
pTimes++;
UUID playerUUID = player.getUniqueId();
int times = getTimesUsed(playerUUID);
if (times <= uses) {
setTimesUsed(playerUUID, ++times);
}
if (pTimes > uses) {
if (times > uses) {
player.sendMessage(String.format("%sMaximum uses reached! (%d)", ChatColor.GREEN, uses));
}
}


/**
* Load the YAML-encoded map from player UUID (String) to use count, which
* is stored in the block meta.
*
* @return the YAML map of use counts by player UUID string.
*/
private FileConfiguration loadUseMap() {
FileConfiguration config = new YamlConfiguration();
try {
String str = (String) BlockStoreApi.getBlockMeta(sign.getBlock(), EasySigns.instance, "max");
if (str != null) {
config.loadFromString(str);
}
} catch (InvalidConfigurationException ex) {
ex.printStackTrace();
}
return config;
}
}
8 changes: 8 additions & 0 deletions src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ permissions:
easysigns.commands.easy-sign-reorder: true
easysigns.commands.easy-sign-copy: true
easysigns.commands.easy-sign-paste: true
easysigns.commands.easy-sign-used: true
easysigns.commands.easy-sign:
description: Access to the /easy-sign command
easysigns.commands.easy-sign-delete:
Expand All @@ -32,6 +33,8 @@ permissions:
description: Access to the /easy-sign-copy command
easysigns.commands.easy-sign-paste:
description: Access to the /easy-sign-paste command
easysigns.commands.easy-sign-used:
description: Access to the /easy-sign-used command


commands:
Expand Down Expand Up @@ -70,3 +73,8 @@ commands:
description: Paste the copied sign actions to a new block.
permission: easysigns.commands.easy-sign-paste
permission-message: You don't have permission to do that.
easy-sign-used:
usage: /easy-sign-used <player> <count>
description: Record that <player> has used a sign <count> times.
permission: easysigns.commands.easy-sign-used
permission-message: You don't have permission to do that.

0 comments on commit 1d38775

Please sign in to comment.