From 95afe4b2acf0e28912ca5e886614ff14de09a84e Mon Sep 17 00:00:00 2001 From: herb143 Date: Thu, 9 Jun 2011 00:54:36 -0400 Subject: [PATCH 01/20] basic files --- README | 1 + plugin.yml | 3 +++ src/me/hgilman/Curse/Curse.java | 21 +++++++++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 plugin.yml create mode 100644 src/me/hgilman/Curse/Curse.java diff --git a/README b/README index e69de29..1c85052 100644 --- a/README +++ b/README @@ -0,0 +1 @@ +This plugin for Minecraft servers running Bukkit allows admins to "curse" a player, making their lives... unpleasant. \ No newline at end of file diff --git a/plugin.yml b/plugin.yml new file mode 100644 index 0000000..f06b35b --- /dev/null +++ b/plugin.yml @@ -0,0 +1,3 @@ +name: Curse +main: me.hgilman.Curse.Curse +version: 0.5 \ No newline at end of file diff --git a/src/me/hgilman/Curse/Curse.java b/src/me/hgilman/Curse/Curse.java new file mode 100644 index 0000000..12965f7 --- /dev/null +++ b/src/me/hgilman/Curse/Curse.java @@ -0,0 +1,21 @@ +package me.hgilman.Curse; + +import java.util.logging.Logger; +import org.bukkit.plugin.java.JavaPlugin; + +public class Curse extends JavaPlugin { + + Logger log = Logger.getLogger("Minecraft"); // Get the logger. + + public void onEnable() + { + log.info("Curse plugin enabled."); + } + + + public void onDisable() + { + log.info("Curse plugin disabled."); + } + +} From d0f94847b79a4f0c8b5cf177fb7f595ea4241ad3 Mon Sep 17 00:00:00 2001 From: herb143 Date: Thu, 9 Jun 2011 01:57:40 -0400 Subject: [PATCH 02/20] got the loading/unloading working --- plugin.yml | 7 +- src/me/hgilman/Curse/Curse.java | 158 ++++++++++++++++++- src/me/hgilman/Curse/CurseBlockListener.java | 33 ++++ 3 files changed, 191 insertions(+), 7 deletions(-) create mode 100644 src/me/hgilman/Curse/CurseBlockListener.java diff --git a/plugin.yml b/plugin.yml index f06b35b..2665ce6 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,3 +1,8 @@ name: Curse main: me.hgilman.Curse.Curse -version: 0.5 \ No newline at end of file +version: 0.5 +commands: + curse: + description: Makes the player's life... unpleasant. + usage: | + /curse \ No newline at end of file diff --git a/src/me/hgilman/Curse/Curse.java b/src/me/hgilman/Curse/Curse.java index 12965f7..b1bc526 100644 --- a/src/me/hgilman/Curse/Curse.java +++ b/src/me/hgilman/Curse/Curse.java @@ -1,21 +1,167 @@ package me.hgilman.Curse; +import java.util.HashMap; import java.util.logging.Logger; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.lang.String; +import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.event.Event; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.ChatColor; +import me.hgilman.Curse.CurseBlockListener; public class Curse extends JavaPlugin { - + + private HashMap cursedPlayers = new HashMap(); // The cursedPlayers hashmap. + + private final CurseBlockListener blockListener = new CurseBlockListener(this); + Logger log = Logger.getLogger("Minecraft"); // Get the logger. - + public void onEnable() - { + { + log.info("Curse plugin enabling..."); + + PluginManager pm = this.getServer().getPluginManager(); + + pm.registerEvent(Event.Type.BLOCK_PLACE, blockListener, Event.Priority.Normal, this); + + new File("plugins/Curse").mkdir(); + File playersFile = new File("plugins/Curse/CursedPlayers.dat"); + + if(!(playersFile.exists())) + { + try + { + playersFile.createNewFile(); + } + catch (IOException ex) + { + ex.printStackTrace(); //explained below. + } + } + else + { + cursedPlayers = load("plugins/Curse/CursedPlayers.dat"); + } + + + + log.info("Curse plugin enabled."); } - - + + public void onDisable() { + save(cursedPlayers, "plugins/Curse/CursedPlayers.dat"); + log.info("Curse plugin disabled."); } - + + public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){ + + if(cmd.getName().equalsIgnoreCase("curse")){ // If the player typed /curse then do the following... + if (sender instanceof Player) // If they're a player... + { + if (sender.isOp()) // TODO: Replace with permissions. + { + if (args.length == 0) // If they didn't give an arg... + { + sender.sendMessage("Error! You must specify a player."); + return false; + } + else if (this.getServer().getPlayer(args[0]) != null) + { + if (!(cursedPlayers.containsKey(this.getServer().getPlayer(args[0]).getName()))) // If the player was not on the list. + { + cursedPlayers.put(this.getServer().getPlayer(args[0]).getName(), true); + sender.sendMessage("Cursed " + this.getServer().getPlayer(args[0]).getName() + "."); + } + else if (!(cursedPlayers.get(this.getServer().getPlayer(args[0]).getName()).booleanValue())) // If they wre not cursed. + { + cursedPlayers.put(this.getServer().getPlayer(args[0]).getName(), true); + sender.sendMessage("Cursed " + this.getServer().getPlayer(args[0]).getName() + "."); + } + else + { + cursedPlayers.put(this.getServer().getPlayer(args[0]).getName(), false); + sender.sendMessage("Uncursed " + this.getServer().getPlayer(args[0]).getName() + "."); + } + } + else // They gave input, but it was bad. + { + sender.sendMessage("Error! Invalid input!"); + sender.sendMessage(ChatColor.DARK_PURPLE + "Note that at this time offline players cannot be cursed."); + return false; + } + } + else + { + return false; + } + } + else + { + sender.sendMessage("This command can only be used ingame."); + return false; + } + + + + return true; + } //If this has happened the function will break and return true. if this hasn't happened the a value of false will be returned. + return false; } + + public HashMap getCursedPlayers() + { + return cursedPlayers; + } + + public void save(HashMap pluginEnabled, String path) + { + try{ + ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path)); + oos.writeObject(pluginEnabled); + oos.flush(); + oos.close(); + //Handle I/O exceptions + }catch(Exception e){ + e.printStackTrace(); + } + } + + @SuppressWarnings("unchecked") + public HashMap load(String path) + { + try + { + + ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path)); + Object result = ois.readObject(); + //you can feel free to cast result to HashMap if you know there's that HashMap in the file + return (HashMap)result; + + + } + catch(Exception e) + { + + e.printStackTrace(); + } + return null; + } + + + + + } diff --git a/src/me/hgilman/Curse/CurseBlockListener.java b/src/me/hgilman/Curse/CurseBlockListener.java new file mode 100644 index 0000000..91f8db1 --- /dev/null +++ b/src/me/hgilman/Curse/CurseBlockListener.java @@ -0,0 +1,33 @@ +package me.hgilman.Curse; + +import org.bukkit.event.block.BlockListener; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.Material; + + +public class CurseBlockListener extends BlockListener { + + public static Curse plugin; + + public CurseBlockListener(Curse instance) + { + + plugin = instance; + } + + public void onBlockPlace (BlockPlaceEvent event) + { + Block placedBlock = event.getBlock(); + Player placingPlayer = event.getPlayer(); + boolean cursed = plugin.getCursedPlayers().get(placingPlayer.getName()).booleanValue(); // Whether or not they are cursed. + + if (cursed) + { + placedBlock.setType(Material.WOOL); + } + + } + +} From ab89594e5cf90eebeb87dc46927859fc1c9232fe Mon Sep 17 00:00:00 2001 From: herb143 Date: Thu, 9 Jun 2011 13:55:05 -0400 Subject: [PATCH 03/20] added lightning effect --- src/me/hgilman/Curse/Curse.java | 85 ++++++++++++++----- src/me/hgilman/Curse/CurseBlockListener.java | 3 +- src/me/hgilman/Curse/CursePlayerListener.java | 29 +++++++ .../Curse/RunnableStrikeLightningEffect.java | 27 ++++++ 4 files changed, 123 insertions(+), 21 deletions(-) create mode 100644 src/me/hgilman/Curse/CursePlayerListener.java create mode 100644 src/me/hgilman/Curse/RunnableStrikeLightningEffect.java diff --git a/src/me/hgilman/Curse/Curse.java b/src/me/hgilman/Curse/Curse.java index b1bc526..071e50d 100644 --- a/src/me/hgilman/Curse/Curse.java +++ b/src/me/hgilman/Curse/Curse.java @@ -1,6 +1,7 @@ package me.hgilman.Curse; import java.util.HashMap; +import java.util.Random; import java.util.logging.Logger; import java.io.File; import java.io.FileInputStream; @@ -36,7 +37,7 @@ public void onEnable() new File("plugins/Curse").mkdir(); File playersFile = new File("plugins/Curse/CursedPlayers.dat"); - + if(!(playersFile.exists())) { try @@ -50,19 +51,24 @@ public void onEnable() } else { - cursedPlayers = load("plugins/Curse/CursedPlayers.dat"); + setCursedPlayers(load("plugins/Curse/CursedPlayers.dat")); + } + + Player[] onlinePlayers = this.getServer().getOnlinePlayers(); + for (int i = 0; i < onlinePlayers.length; i++) // For every online player... + { + if (isCursed(onlinePlayers[i])) // If the player is cursed... + { + newLightningStrike(onlinePlayers[i]); // Schedule a new lightning strike event. + } } - - - log.info("Curse plugin enabled."); } - public void onDisable() { - save(cursedPlayers, "plugins/Curse/CursedPlayers.dat"); + save(getCursedPlayers(), "plugins/Curse/CursedPlayers.dat"); log.info("Curse plugin disabled."); } @@ -79,23 +85,23 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, sender.sendMessage("Error! You must specify a player."); return false; } - else if (this.getServer().getPlayer(args[0]) != null) + else if (this.getServer().getPlayer(args[0]) != null) // If the input matched a player... { - if (!(cursedPlayers.containsKey(this.getServer().getPlayer(args[0]).getName()))) // If the player was not on the list. - { - cursedPlayers.put(this.getServer().getPlayer(args[0]).getName(), true); - sender.sendMessage("Cursed " + this.getServer().getPlayer(args[0]).getName() + "."); - } - else if (!(cursedPlayers.get(this.getServer().getPlayer(args[0]).getName()).booleanValue())) // If they wre not cursed. + + Player targetPlayer = this.getServer().getPlayer(args[0]); + + if (isCursed(targetPlayer)) // If the player is cursed... { - cursedPlayers.put(this.getServer().getPlayer(args[0]).getName(), true); - sender.sendMessage("Cursed " + this.getServer().getPlayer(args[0]).getName() + "."); + uncursePlayer(targetPlayer); // Uncurse the player. + sender.sendMessage("Uncursed " + targetPlayer.getName() + "."); + } - else + else // If they are not cursed. { - cursedPlayers.put(this.getServer().getPlayer(args[0]).getName(), false); - sender.sendMessage("Uncursed " + this.getServer().getPlayer(args[0]).getName() + "."); + cursePlayer(targetPlayer); // Curse the player. + sender.sendMessage("Cursed " + targetPlayer.getName() + "."); } + } else // They gave input, but it was bad. { @@ -126,6 +132,11 @@ public HashMap getCursedPlayers() return cursedPlayers; } + public void setCursedPlayers(HashMap newCursedPlayers) + { + cursedPlayers = newCursedPlayers; + } + public void save(HashMap pluginEnabled, String path) { try{ @@ -160,8 +171,44 @@ public HashMap load(String path) return null; } + public boolean isCursed(Player player) + { + if (!(getCursedPlayers().containsKey(player.getName()))) // If the player was not on the list... + { + return false; + } + + else if (this.getCursedPlayers().get(player.getName()).booleanValue()) // If they're cursed... + { + return true; + } + else + { + return false; // If they're on the list but are not cursed... + } + } + + public void cursePlayer(Player player) // Curses the player. + { + getCursedPlayers().put(player.getName(), true); + newLightningStrike(player); // Schedule a new lightning strike. + } + + public void uncursePlayer(Player player) + { + getCursedPlayers().put(player.getName(), false); // Uncurses the player. + } + + public void newLightningStrike(Player player) // Schedules a new lightningstrike effect on the player. + { + Random generator = new Random(); + int nextStrikeTicks = generator.nextInt(1200); + double nextStrikeSeconds = nextStrikeTicks / 20; + player.getServer().getScheduler().scheduleSyncDelayedTask(this, new RunnableStrikeLightningEffect(this, player), nextStrikeTicks); + log.info("Scheduled lightning strike effect for " + player.getName() + " in " + nextStrikeSeconds + " seconds."); + } } diff --git a/src/me/hgilman/Curse/CurseBlockListener.java b/src/me/hgilman/Curse/CurseBlockListener.java index 91f8db1..36cc46f 100644 --- a/src/me/hgilman/Curse/CurseBlockListener.java +++ b/src/me/hgilman/Curse/CurseBlockListener.java @@ -21,9 +21,8 @@ public void onBlockPlace (BlockPlaceEvent event) { Block placedBlock = event.getBlock(); Player placingPlayer = event.getPlayer(); - boolean cursed = plugin.getCursedPlayers().get(placingPlayer.getName()).booleanValue(); // Whether or not they are cursed. - if (cursed) + if (plugin.isCursed(placingPlayer)) // If the player is cursed. { placedBlock.setType(Material.WOOL); } diff --git a/src/me/hgilman/Curse/CursePlayerListener.java b/src/me/hgilman/Curse/CursePlayerListener.java new file mode 100644 index 0000000..1a842d5 --- /dev/null +++ b/src/me/hgilman/Curse/CursePlayerListener.java @@ -0,0 +1,29 @@ +package me.hgilman.Curse; + +import org.bukkit.event.player.PlayerListener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.entity.Player; + + +public class CursePlayerListener extends PlayerListener { + + public static Curse plugin; + + public CursePlayerListener(Curse instance) + { + + plugin = instance; + } + + public void onPlayerJoin (PlayerJoinEvent event) + { + Player player = event.getPlayer(); + + if(plugin.isCursed(player)) // If the player is cursed... + { + plugin.newLightningStrike(player); // Schedule a new lightning strike on them. + } + + } + +} diff --git a/src/me/hgilman/Curse/RunnableStrikeLightningEffect.java b/src/me/hgilman/Curse/RunnableStrikeLightningEffect.java new file mode 100644 index 0000000..2d2747d --- /dev/null +++ b/src/me/hgilman/Curse/RunnableStrikeLightningEffect.java @@ -0,0 +1,27 @@ +package me.hgilman.Curse; + +import org.bukkit.entity.Player; + +public class RunnableStrikeLightningEffect implements Runnable { + + private Curse plugin; + private Player player; + + + public RunnableStrikeLightningEffect(Curse instance, Player playerInstance) + { + plugin = instance; + player = playerInstance; + } + + public void run() + { + if(plugin.isCursed(player) && player.isOnline()) // If the player is cursed and online... + { + player.getWorld().strikeLightningEffect(player.getLocation()); // Strike the lightning effect at the player's location. + plugin.newLightningStrike(player); // Schedule a new lightning strike. + } + + } + +} From 90dad17a1ef99f7f2317ae92c2882721bfd2894a Mon Sep 17 00:00:00 2001 From: herb143 Date: Fri, 10 Jun 2011 23:57:54 -0400 Subject: [PATCH 04/20] added text garbling --- src/me/hgilman/Curse/Curse.java | 4 ++ src/me/hgilman/Curse/CursePlayerListener.java | 11 ++++ src/me/hgilman/Curse/CurseTranslator.java | 58 +++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 src/me/hgilman/Curse/CurseTranslator.java diff --git a/src/me/hgilman/Curse/Curse.java b/src/me/hgilman/Curse/Curse.java index 071e50d..2d7825f 100644 --- a/src/me/hgilman/Curse/Curse.java +++ b/src/me/hgilman/Curse/Curse.java @@ -24,6 +24,7 @@ public class Curse extends JavaPlugin { private HashMap cursedPlayers = new HashMap(); // The cursedPlayers hashmap. private final CurseBlockListener blockListener = new CurseBlockListener(this); + private final CursePlayerListener playerListener = new CursePlayerListener(this); Logger log = Logger.getLogger("Minecraft"); // Get the logger. @@ -34,6 +35,9 @@ public void onEnable() PluginManager pm = this.getServer().getPluginManager(); pm.registerEvent(Event.Type.BLOCK_PLACE, blockListener, Event.Priority.Normal, this); + pm.registerEvent(Event.Type.PLAYER_JOIN, playerListener, Event.Priority.Normal, this); + pm.registerEvent(Event.Type.PLAYER_CHAT, playerListener, Event.Priority.Normal, this); + new File("plugins/Curse").mkdir(); File playersFile = new File("plugins/Curse/CursedPlayers.dat"); diff --git a/src/me/hgilman/Curse/CursePlayerListener.java b/src/me/hgilman/Curse/CursePlayerListener.java index 1a842d5..278d7d3 100644 --- a/src/me/hgilman/Curse/CursePlayerListener.java +++ b/src/me/hgilman/Curse/CursePlayerListener.java @@ -2,7 +2,10 @@ import org.bukkit.event.player.PlayerListener; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerChatEvent; import org.bukkit.entity.Player; +import org.bukkit.ChatColor; +import me.hgilman.Curse.CurseTranslator; public class CursePlayerListener extends PlayerListener { @@ -26,4 +29,12 @@ public void onPlayerJoin (PlayerJoinEvent event) } + public void onPlayerChat(PlayerChatEvent event) + { + if (plugin.isCursed(event.getPlayer())) // If the player in question is cursed... + { + event.setMessage(ChatColor.LIGHT_PURPLE + new CurseTranslator(event.getMessage()).getTranslation()); + } + } + } diff --git a/src/me/hgilman/Curse/CurseTranslator.java b/src/me/hgilman/Curse/CurseTranslator.java new file mode 100644 index 0000000..4d181ef --- /dev/null +++ b/src/me/hgilman/Curse/CurseTranslator.java @@ -0,0 +1,58 @@ +package me.hgilman.Curse; + +import java.util.StringTokenizer; + +public class CurseTranslator { + + private static char[] vowels ={'a', 'e', 'i', 'o', 'u'}; + private StringTokenizer tokenizer; + private String word; + private String returnValue; + + public CurseTranslator(String text) + { + tokenizer = new StringTokenizer(text); + + while(tokenizer.hasMoreTokens()) + { + word = tokenizer.nextToken(); + if (returnValue != null) + { + returnValue = returnValue + " " + shifter(word); + } + else + { + returnValue = shifter(word); + } + } + } + + private static String shifter(String text) + { + // text = tokenizer.nextToken(); + int length = text.length(); + // System.out.println(length); + for(int x = 0; x < vowels.length; x++) + { + if(text.charAt(0) == vowels[x]) + { + // System.out.println("vowel found"); + text+="yay"; + return text; + } + } + //System.out.println("flag1"); + text += text.charAt(0); + //System.out.println("0 pos is" + text.charAt(0)); + + text = text.substring(1, length); + text+="ay"; + return text; + } + + public String getTranslation() + { + return returnValue; + } + +} From 7eb09df03b86e677841ef5f2d6c3f02905839a4f Mon Sep 17 00:00:00 2001 From: 1000000000 Date: Sat, 28 Jan 2012 22:42:38 -0500 Subject: [PATCH 05/20] Updated to new event model --- .classpath | 11 +++++++++++ .gitignore | 1 + .project | 17 +++++++++++++++++ src/me/hgilman/Curse/Curse.java | 6 ++---- src/me/hgilman/Curse/CurseBlockListener.java | 6 ++++-- src/me/hgilman/Curse/CursePlayerListener.java | 7 +++++-- 6 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 .classpath create mode 100644 .gitignore create mode 100644 .project diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..9df195d --- /dev/null +++ b/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c5e82d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +bin \ No newline at end of file diff --git a/.project b/.project new file mode 100644 index 0000000..6630e2a --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + Curse + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/src/me/hgilman/Curse/Curse.java b/src/me/hgilman/Curse/Curse.java index 2d7825f..1762dd4 100644 --- a/src/me/hgilman/Curse/Curse.java +++ b/src/me/hgilman/Curse/Curse.java @@ -12,7 +12,6 @@ import java.lang.String; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.event.Event; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -34,9 +33,8 @@ public void onEnable() PluginManager pm = this.getServer().getPluginManager(); - pm.registerEvent(Event.Type.BLOCK_PLACE, blockListener, Event.Priority.Normal, this); - pm.registerEvent(Event.Type.PLAYER_JOIN, playerListener, Event.Priority.Normal, this); - pm.registerEvent(Event.Type.PLAYER_CHAT, playerListener, Event.Priority.Normal, this); + pm.registerEvents(blockListener, this); + pm.registerEvents(playerListener, this); new File("plugins/Curse").mkdir(); diff --git a/src/me/hgilman/Curse/CurseBlockListener.java b/src/me/hgilman/Curse/CurseBlockListener.java index 36cc46f..0a0ecb5 100644 --- a/src/me/hgilman/Curse/CurseBlockListener.java +++ b/src/me/hgilman/Curse/CurseBlockListener.java @@ -1,13 +1,14 @@ package me.hgilman.Curse; -import org.bukkit.event.block.BlockListener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.Material; -public class CurseBlockListener extends BlockListener { +public class CurseBlockListener implements Listener { public static Curse plugin; @@ -17,6 +18,7 @@ public CurseBlockListener(Curse instance) plugin = instance; } + @EventHandler public void onBlockPlace (BlockPlaceEvent event) { Block placedBlock = event.getBlock(); diff --git a/src/me/hgilman/Curse/CursePlayerListener.java b/src/me/hgilman/Curse/CursePlayerListener.java index 278d7d3..9e72836 100644 --- a/src/me/hgilman/Curse/CursePlayerListener.java +++ b/src/me/hgilman/Curse/CursePlayerListener.java @@ -1,6 +1,7 @@ package me.hgilman.Curse; -import org.bukkit.event.player.PlayerListener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerChatEvent; import org.bukkit.entity.Player; @@ -8,7 +9,7 @@ import me.hgilman.Curse.CurseTranslator; -public class CursePlayerListener extends PlayerListener { +public class CursePlayerListener implements Listener { public static Curse plugin; @@ -18,6 +19,7 @@ public CursePlayerListener(Curse instance) plugin = instance; } + @EventHandler public void onPlayerJoin (PlayerJoinEvent event) { Player player = event.getPlayer(); @@ -29,6 +31,7 @@ public void onPlayerJoin (PlayerJoinEvent event) } + @EventHandler public void onPlayerChat(PlayerChatEvent event) { if (plugin.isCursed(event.getPlayer())) // If the player in question is cursed... From e3e34d390b976eb8bd8c750a773baa2cd94965b2 Mon Sep 17 00:00:00 2001 From: 1000000000 Date: Wed, 12 Sep 2012 08:27:12 -0400 Subject: [PATCH 06/20] modified .gitignore --- .gitignore | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c5e82d7..9e14e66 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ -bin \ No newline at end of file +/bin +/.classpath +/.project +/.settings +.DS_Store From ae8ec360f76ee597ad85de52b8e8e99dfca7e957 Mon Sep 17 00:00:00 2001 From: 1000000000 Date: Wed, 12 Sep 2012 08:28:36 -0400 Subject: [PATCH 07/20] Made CurseTranslator create way better pig latin --- src/me/hgilman/Curse/CurseTranslator.java | 31 +++++++++++++++-------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/me/hgilman/Curse/CurseTranslator.java b/src/me/hgilman/Curse/CurseTranslator.java index 4d181ef..d86ccdf 100644 --- a/src/me/hgilman/Curse/CurseTranslator.java +++ b/src/me/hgilman/Curse/CurseTranslator.java @@ -1,14 +1,21 @@ package me.hgilman.Curse; +import java.util.Arrays; import java.util.StringTokenizer; public class CurseTranslator { - private static char[] vowels ={'a', 'e', 'i', 'o', 'u'}; + private static char[] vowels = {'a', 'e', 'i', 'o', 'u'}; + private static char[] extendedVowels = {'a', 'e', 'i', 'o', 'u', 'y'}; private StringTokenizer tokenizer; private String word; private String returnValue; + static { + Arrays.sort(vowels); + Arrays.sort(extendedVowels); + } + public CurseTranslator(String text) { tokenizer = new StringTokenizer(text); @@ -30,22 +37,24 @@ public CurseTranslator(String text) private static String shifter(String text) { // text = tokenizer.nextToken(); - int length = text.length(); // System.out.println(length); - for(int x = 0; x < vowels.length; x++) - { - if(text.charAt(0) == vowels[x]) - { + if(Arrays.binarySearch(vowels, text.charAt(0)) >= 0) { // System.out.println("vowel found"); text+="yay"; return text; - } + } else if(text.toLowerCase().charAt(0) == 'q' && text.toLowerCase().charAt(1) == 'u') { + text = text.substring(2); + text += "quay"; + return text; } - //System.out.println("flag1"); + int i = 1; text += text.charAt(0); - //System.out.println("0 pos is" + text.charAt(0)); - - text = text.substring(1, length); + for(; Arrays.binarySearch(extendedVowels, text.charAt(i)) < 0; i++) { + //System.out.println("flag1"); + text += text.charAt(i); + //System.out.println("0 pos is" + text.charAt(0)); + } + text = text.substring(i); text+="ay"; return text; } From 702b683a45008d140d6542e5643e656b59eae88d Mon Sep 17 00:00:00 2001 From: 1000000000 Date: Wed, 12 Sep 2012 08:29:09 -0400 Subject: [PATCH 08/20] Added a TranslatorTester to test CurseTranslator --- src/me/hgilman/Curse/TranslatorTester.java | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/me/hgilman/Curse/TranslatorTester.java diff --git a/src/me/hgilman/Curse/TranslatorTester.java b/src/me/hgilman/Curse/TranslatorTester.java new file mode 100644 index 0000000..c356a5a --- /dev/null +++ b/src/me/hgilman/Curse/TranslatorTester.java @@ -0,0 +1,24 @@ +package me.hgilman.Curse; + +import java.util.Scanner; + +public class TranslatorTester { + + private static Scanner in = new Scanner(System.in); + /** + * @param args + */ + public static void main(String[] args) { + System.out.println("Translator Tester is ready"); + System.out.println("Type your input or \"!quit!\" to quit"); + String input = in.nextLine(); + while(!input.equalsIgnoreCase("!quit!")) { + CurseTranslator ct = new CurseTranslator(input); + System.out.println("Input: \"" + input + "\""); + System.out.println("Output: \"" + ct.getTranslation() + "\""); + input = in.nextLine(); + } + System.out.println("Translator Tester has been quit"); + } + +} From 8dfc15fc48f064bd63c8605c71b3848e89289b59 Mon Sep 17 00:00:00 2001 From: 1000000000 Date: Wed, 12 Sep 2012 08:29:38 -0400 Subject: [PATCH 09/20] Included Permissions in curse command in plugin.yml --- plugin.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugin.yml b/plugin.yml index 2665ce6..b6c67e2 100644 --- a/plugin.yml +++ b/plugin.yml @@ -4,5 +4,6 @@ version: 0.5 commands: curse: description: Makes the player's life... unpleasant. - usage: | - /curse \ No newline at end of file + permission: curse.curse + permission-message: "" + usage: / From 0cbd739a43f5bb6a640fef53cce5221cebfe5dc5 Mon Sep 17 00:00:00 2001 From: 1000000000 Date: Wed, 12 Sep 2012 08:30:17 -0400 Subject: [PATCH 10/20] A few improvements --- src/me/hgilman/Curse/Curse.java | 4 +++- src/me/hgilman/Curse/CursePlayerListener.java | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/me/hgilman/Curse/Curse.java b/src/me/hgilman/Curse/Curse.java index 1762dd4..ce73c24 100644 --- a/src/me/hgilman/Curse/Curse.java +++ b/src/me/hgilman/Curse/Curse.java @@ -155,11 +155,13 @@ public void save(HashMap pluginEnabled, String path) @SuppressWarnings("unchecked") public HashMap load(String path) { + ObjectInputStream ois = null; try { - ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path)); + ois = new ObjectInputStream(new FileInputStream(path)); Object result = ois.readObject(); + ois.close(); //you can feel free to cast result to HashMap if you know there's that HashMap in the file return (HashMap)result; diff --git a/src/me/hgilman/Curse/CursePlayerListener.java b/src/me/hgilman/Curse/CursePlayerListener.java index 9e72836..ae8e48c 100644 --- a/src/me/hgilman/Curse/CursePlayerListener.java +++ b/src/me/hgilman/Curse/CursePlayerListener.java @@ -3,7 +3,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.entity.Player; import org.bukkit.ChatColor; import me.hgilman.Curse.CurseTranslator; @@ -32,7 +32,7 @@ public void onPlayerJoin (PlayerJoinEvent event) } @EventHandler - public void onPlayerChat(PlayerChatEvent event) + public void onPlayerChat(AsyncPlayerChatEvent event) { if (plugin.isCursed(event.getPlayer())) // If the player in question is cursed... { From ce7ca9d4b78a5cae26af96fa3f8ac9619d87c6c1 Mon Sep 17 00:00:00 2001 From: 1000000000 Date: Wed, 12 Sep 2012 22:07:23 -0400 Subject: [PATCH 11/20] Removed extra files --- .classpath | 11 ----------- .project | 17 ----------------- 2 files changed, 28 deletions(-) delete mode 100644 .classpath delete mode 100644 .project diff --git a/.classpath b/.classpath deleted file mode 100644 index 9df195d..0000000 --- a/.classpath +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/.project b/.project deleted file mode 100644 index 6630e2a..0000000 --- a/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - Curse - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - From 194c1370cc2004973295db1688e360238b822153 Mon Sep 17 00:00:00 2001 From: 1000000000 Date: Wed, 12 Sep 2012 22:08:22 -0400 Subject: [PATCH 12/20] tiny modification to .gitignore --- .gitignore | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 9e14e66..59d1bad 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ /bin -/.classpath -/.project -/.settings +.classpath +.project +.settings/ .DS_Store + From 57ab13f863ddffe8e2e790f79abe5d82d3cc1f3b Mon Sep 17 00:00:00 2001 From: 1000000000 Date: Thu, 13 Sep 2012 07:56:41 -0400 Subject: [PATCH 13/20] Small Things, mostly in onCommand --- src/me/hgilman/Curse/Curse.java | 74 ++++++++++++++------------------- 1 file changed, 31 insertions(+), 43 deletions(-) diff --git a/src/me/hgilman/Curse/Curse.java b/src/me/hgilman/Curse/Curse.java index ce73c24..3d3729d 100644 --- a/src/me/hgilman/Curse/Curse.java +++ b/src/me/hgilman/Curse/Curse.java @@ -16,6 +16,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.ChatColor; + import me.hgilman.Curse.CurseBlockListener; public class Curse extends JavaPlugin { @@ -76,58 +77,45 @@ public void onDisable() } public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){ - - if(cmd.getName().equalsIgnoreCase("curse")){ // If the player typed /curse then do the following... - if (sender instanceof Player) // If they're a player... - { - if (sender.isOp()) // TODO: Replace with permissions. + if (sender instanceof Player) // If they're a player... + { + if (args.length == 0) // If they didn't give an arg... { - if (args.length == 0) // If they didn't give an arg... - { - sender.sendMessage("Error! You must specify a player."); - return false; - } - else if (this.getServer().getPlayer(args[0]) != null) // If the input matched a player... + sender.sendMessage("Error! You must specify a player."); + return false; + } + else if (this.getServer().getPlayer(args[0]) != null) // If the input matched a player... + { + + Player targetPlayer = this.getServer().getPlayer(args[0]); + + if (isCursed(targetPlayer)) // If the player is cursed... { - - Player targetPlayer = this.getServer().getPlayer(args[0]); - - if (isCursed(targetPlayer)) // If the player is cursed... - { - uncursePlayer(targetPlayer); // Uncurse the player. - sender.sendMessage("Uncursed " + targetPlayer.getName() + "."); - - } - else // If they are not cursed. - { - cursePlayer(targetPlayer); // Curse the player. - sender.sendMessage("Cursed " + targetPlayer.getName() + "."); - } - + uncursePlayer(targetPlayer); // Uncurse the player. + sender.sendMessage("Uncursed " + targetPlayer.getName() + "."); + } - else // They gave input, but it was bad. + else // If they are not cursed. { - sender.sendMessage("Error! Invalid input!"); - sender.sendMessage(ChatColor.DARK_PURPLE + "Note that at this time offline players cannot be cursed."); - return false; + cursePlayer(targetPlayer); // Curse the player. + sender.sendMessage("Cursed " + targetPlayer.getName() + "."); } + } - else + else // They gave input, but it was bad. { + sender.sendMessage("Error! Invalid input!"); + sender.sendMessage(ChatColor.DARK_PURPLE + "Note that at this time offline players cannot be cursed."); return false; } - } - else - { - sender.sendMessage("This command can only be used ingame."); - return false; - } - - - - return true; - } //If this has happened the function will break and return true. if this hasn't happened the a value of false will be returned. - return false; } + } + else + { + sender.sendMessage("This command can only be used ingame."); + return false; + } + return true; + } public HashMap getCursedPlayers() { From 1d4c752c1837a4572405c75c767f5d73a804f89f Mon Sep 17 00:00:00 2001 From: Louis Date: Thu, 13 Sep 2012 09:03:06 -0300 Subject: [PATCH 14/20] Small changes to plugin.yml --- plugin.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin.yml b/plugin.yml index b6c67e2..d519840 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,9 +1,9 @@ name: Curse main: me.hgilman.Curse.Curse -version: 0.5 +version: 1.0 commands: curse: description: Makes the player's life... unpleasant. permission: curse.curse - permission-message: "" + permission-message: You dont't have permission to curse someone usage: / From 15296d874e3904836f2b516d6755a1ab972c7178 Mon Sep 17 00:00:00 2001 From: Louis Date: Thu, 13 Sep 2012 09:04:21 -0300 Subject: [PATCH 15/20] Added to README --- README | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README b/README index 1c85052..a5f7c57 100644 --- a/README +++ b/README @@ -1 +1,3 @@ -This plugin for Minecraft servers running Bukkit allows admins to "curse" a player, making their lives... unpleasant. \ No newline at end of file +This plugin for Minecraft servers running Bukkit allows admins to "curse" a player, making their lives... unpleasant. + +Note: TranslatorTester is only for testing purposes and is not important in the actual running of the plugin. \ No newline at end of file From c120b97dfdf3ba14a5d9c81791bfe8406aed0946 Mon Sep 17 00:00:00 2001 From: 1000000000 Date: Thu, 13 Sep 2012 13:02:08 -0400 Subject: [PATCH 16/20] Made CurseTranslator use java's regex instead of StringTokenizer rather than loop appending to a string it now uses a string builder --- src/me/hgilman/Curse/CurseTranslator.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/me/hgilman/Curse/CurseTranslator.java b/src/me/hgilman/Curse/CurseTranslator.java index d86ccdf..b985b30 100644 --- a/src/me/hgilman/Curse/CurseTranslator.java +++ b/src/me/hgilman/Curse/CurseTranslator.java @@ -1,15 +1,16 @@ package me.hgilman.Curse; import java.util.Arrays; -import java.util.StringTokenizer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class CurseTranslator { private static char[] vowels = {'a', 'e', 'i', 'o', 'u'}; private static char[] extendedVowels = {'a', 'e', 'i', 'o', 'u', 'y'}; - private StringTokenizer tokenizer; + Matcher matcher; private String word; - private String returnValue; + private StringBuilder returnValue; static { Arrays.sort(vowels); @@ -18,18 +19,18 @@ public class CurseTranslator { public CurseTranslator(String text) { - tokenizer = new StringTokenizer(text); + matcher = Pattern.compile(" [A-Za-z]+").matcher(text); - while(tokenizer.hasMoreTokens()) + while(matcher.find()) { - word = tokenizer.nextToken(); + word = matcher.group().substring(1); if (returnValue != null) { - returnValue = returnValue + " " + shifter(word); + returnValue.append(" " + shifter(word)); } else { - returnValue = shifter(word); + returnValue = new StringBuilder(shifter(word)); } } } @@ -61,7 +62,7 @@ private static String shifter(String text) public String getTranslation() { - return returnValue; + return returnValue.toString(); } } From 64279718ac28a5eddaac279bc17a2db8c6e52acd Mon Sep 17 00:00:00 2001 From: 1000000000 Date: Thu, 13 Sep 2012 19:30:46 -0400 Subject: [PATCH 17/20] Fixed Existing regex bugs and added support for a lot of foreign characters --- src/me/hgilman/Curse/CurseTranslator.java | 24 +++++++++-------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/me/hgilman/Curse/CurseTranslator.java b/src/me/hgilman/Curse/CurseTranslator.java index b985b30..86f9660 100644 --- a/src/me/hgilman/Curse/CurseTranslator.java +++ b/src/me/hgilman/Curse/CurseTranslator.java @@ -6,11 +6,11 @@ public class CurseTranslator { - private static char[] vowels = {'a', 'e', 'i', 'o', 'u'}; - private static char[] extendedVowels = {'a', 'e', 'i', 'o', 'u', 'y'}; + private static char[] vowels = {'a', '', '', '', '', '', 'e', '', '', '', '', 'i', '', '', '', '', 'o', '', '', '', '', '', 'u', '', '', '', ''}; + private static char[] extendedVowels = {'a', '', '', '', '', '', 'e', '', '', '', '', 'i', '', '', '', '', 'o', '', '', '', '', '', 'u', '', '', '', '', '', 'y'}; Matcher matcher; private String word; - private StringBuilder returnValue; + private StringBuilder returnValue = new StringBuilder(); static { Arrays.sort(vowels); @@ -19,24 +19,18 @@ public class CurseTranslator { public CurseTranslator(String text) { - matcher = Pattern.compile(" [A-Za-z]+").matcher(text); - - while(matcher.find()) + matcher = Pattern.compile("(^|[^\\pL]+)(\\pL+|&)").matcher(text); //matches all sequences of alphabetic characters preceded by + //a non-alphabetic character, I add the space to the front of + while(matcher.find()) //the text to make sure it sees the first word { - word = matcher.group().substring(1); - if (returnValue != null) - { - returnValue.append(" " + shifter(word)); - } - else - { - returnValue = new StringBuilder(shifter(word)); - } + word = matcher.group(2); + returnValue.append(matcher.group(1) + shifter(word)); } } private static String shifter(String text) { + if(text.length() < 1) return text; // text = tokenizer.nextToken(); // System.out.println(length); if(Arrays.binarySearch(vowels, text.charAt(0)) >= 0) { From 3a48d1c77647301a87bf362b7cd9b233cf42a560 Mon Sep 17 00:00:00 2001 From: 1000000000 Date: Thu, 13 Sep 2012 19:31:18 -0400 Subject: [PATCH 18/20] Small Modification to TranslatorTester --- src/me/hgilman/Curse/TranslatorTester.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/me/hgilman/Curse/TranslatorTester.java b/src/me/hgilman/Curse/TranslatorTester.java index c356a5a..8773398 100644 --- a/src/me/hgilman/Curse/TranslatorTester.java +++ b/src/me/hgilman/Curse/TranslatorTester.java @@ -13,8 +13,8 @@ public static void main(String[] args) { System.out.println("Type your input or \"!quit!\" to quit"); String input = in.nextLine(); while(!input.equalsIgnoreCase("!quit!")) { - CurseTranslator ct = new CurseTranslator(input); System.out.println("Input: \"" + input + "\""); + CurseTranslator ct = new CurseTranslator(input); System.out.println("Output: \"" + ct.getTranslation() + "\""); input = in.nextLine(); } From 711f8a200c76a702141a81ddfb040e593b718ae3 Mon Sep 17 00:00:00 2001 From: Louis Date: Thu, 13 Sep 2012 20:40:57 -0300 Subject: [PATCH 19/20] Really small version nitpicking --- plugin.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.yml b/plugin.yml index d519840..4d545de 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,6 +1,6 @@ name: Curse main: me.hgilman.Curse.Curse -version: 1.0 +version: 1.0.0 commands: curse: description: Makes the player's life... unpleasant. From 49fef89dbd372212af9a5262a5b2b4abeb75f493 Mon Sep 17 00:00:00 2001 From: 1000000000 Date: Fri, 14 Sep 2012 12:17:36 -0400 Subject: [PATCH 20/20] Fixed small translator bug and updated plugin.yml --- plugin.yml | 2 +- src/me/hgilman/Curse/CurseTranslator.java | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/plugin.yml b/plugin.yml index 4d545de..9541103 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,6 +1,6 @@ name: Curse main: me.hgilman.Curse.Curse -version: 1.0.0 +version: 1.0.1 commands: curse: description: Makes the player's life... unpleasant. diff --git a/src/me/hgilman/Curse/CurseTranslator.java b/src/me/hgilman/Curse/CurseTranslator.java index 86f9660..6fc4f2a 100644 --- a/src/me/hgilman/Curse/CurseTranslator.java +++ b/src/me/hgilman/Curse/CurseTranslator.java @@ -10,6 +10,7 @@ public class CurseTranslator { private static char[] extendedVowels = {'a', '', '', '', '', '', 'e', '', '', '', '', 'i', '', '', '', '', 'o', '', '', '', '', '', 'u', '', '', '', '', '', 'y'}; Matcher matcher; private String word; + private String nonwordStuff; private StringBuilder returnValue = new StringBuilder(); static { @@ -19,18 +20,19 @@ public class CurseTranslator { public CurseTranslator(String text) { - matcher = Pattern.compile("(^|[^\\pL]+)(\\pL+|&)").matcher(text); //matches all sequences of alphabetic characters preceded by + matcher = Pattern.compile("([^\\pL]+)|(\\pL+)").matcher(text); //matches all sequences of alphabetic characters preceded by //a non-alphabetic character, I add the space to the front of while(matcher.find()) //the text to make sure it sees the first word { word = matcher.group(2); - returnValue.append(matcher.group(1) + shifter(word)); + nonwordStuff = matcher.group(1); + returnValue.append((nonwordStuff != null ? nonwordStuff : "") + shifter(word)); } } private static String shifter(String text) { - if(text.length() < 1) return text; + if(text == null || text.length() < 1) return ""; // text = tokenizer.nextToken(); // System.out.println(length); if(Arrays.binarySearch(vowels, text.charAt(0)) >= 0) { @@ -43,10 +45,10 @@ private static String shifter(String text) return text; } int i = 1; - text += text.charAt(0); + text += text.toLowerCase().charAt(0); for(; Arrays.binarySearch(extendedVowels, text.charAt(i)) < 0; i++) { //System.out.println("flag1"); - text += text.charAt(i); + text += text.toLowerCase().charAt(i); //System.out.println("0 pos is" + text.charAt(0)); } text = text.substring(i);