codename_B's list of plugins under 50 lines of code AKA the under 50 challenge

Discussion in 'Resources' started by codename_B, Aug 23, 2011.

Thread Status:
Not open for further replies.
  1. Offline

    codename_B

    Here I am compiling a list of super simple plugins (maximum 50 lines). Use this for amusement, for learning, or whatever, but please do not release these plugins, or anything based on them. That is my one clause.

    Give
    the most lightweight /give plugin ever - 47 lines

    25/08/2011 - codename_B

    Show Spoiler

    Code:
    package de.bananaco.give;
    import java.util.*;
    import org.bukkit.*;
    import org.bukkit.command.*;
    import org.bukkit.entity.Player;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.plugin.java.JavaPlugin;
    public class Give extends JavaPlugin {
        public void onDisable() {
            System.out.println("[Give] Disabled");
        }
        public void onEnable() {
            System.out.println("[Give] Enabled");
        }
        public List<Material> closestMatches(String input) {
            ArrayList<Material> matchList = new ArrayList<Material>();
            for (Material mat : Material.values())
                if (mat.name().replace("_", " ").toLowerCase().equals(input.toLowerCase()) || String.valueOf(mat.getId()).equals(input))
                    return Arrays.asList(mat);
                else if (mat.name().replace("_", " ").toLowerCase().contains(input.toLowerCase()))
                    matchList.add(mat);
            return matchList;
        }
        public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
            if (args.length > 0 && sender instanceof Player && (((Player) sender).isOp() || ((Player) sender).hasPermission("give.stuff"))) {
                String[] inputs = Arrays.toString(args).replace(",", "").replace("[", "").replace("]", "").split(":");;
                String input = inputs[0];
                int data = inputs.length > 2 ? Integer.parseInt(inputs[2]) : 0, amount = inputs.length > 1 ? Integer.parseInt(inputs[1]) : 64;
                List<Material> matList = closestMatches(input);
                String[] matArray = new String[matList.size()];
                for (int i = 0; i < matList.size(); i++)
                matArray[i] = matList.get(i).name().toLowerCase().replace("_", " ");
                if (matList.size() > 1) {
                    sender.sendMessage(ChatColor.RED+"[Give] "+ChatColor.WHITE+"Did you mean:");
                    sender.sendMessage(Arrays.toString(matArray).replace("[", "").replace("]", ""));
                } else if (matList.size() == 1) {
                    sender.sendMessage(ChatColor.RED+"[Give] "+ChatColor.WHITE+"Placing " + amount + " " + matList.get(0).name().toLowerCase().replace("_", " ") + (data == 0 ? "" : ":" + data) + " in your inventory!");
                    ((Player) sender).getInventory().addItem(new ItemStack(matList.get(0), amount, (short) 0, (byte) data));
                }
                else
                    sender.sendMessage(ChatColor.RED+"[Give] "+ChatColor.WHITE+"I don't know what you want!");
                return true;
            }
            sender.sendMessage("Nope.");
            return true;
        }
    }
    


    ChatBlock
    players can't talk or see the chat unless they have permission - 29 lines

    24/08/2011 - escape

    Show Spoiler

    Code:
    package me.escape.chatBlock;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Event.*;
    import org.bukkit.event.player.*;
    import org.bukkit.permissions.*;
    import org.bukkit.plugin.java.JavaPlugin;
    import static java.lang.System.out;
    
    public class Under50ChatBlock extends JavaPlugin {
        public void onDisable() {
            out.println("[Under50ChatBlock] disabled!");
        }
        public void onEnable() {
            getServer().getPluginManager().addPermission(new Permission("ChatBlock.Chat", PermissionDefault.FALSE));
            getServer().getPluginManager().registerEvent(Type.PLAYER_CHAT, new PlayerListener() {
                @Override
                public void onPlayerChat(PlayerChatEvent event) {
                    event.setCancelled(true);
                    if(!event.getPlayer().hasPermission("ChatBlock.Chat")) return;
                    for(Player p : getServer().getOnlinePlayers()) {
                        if(p.hasPermission("ChatBlock.Chat"))
                            p.sendMessage(event.getPlayer().getName() + ": " + event.getMessage());
                    }
                    out.println('<' + event.getPlayer().getName() + "> " + event.getMessage());
                }
            }, Priority.Highest, this);
            out.println("[Under50ChatBlock] enabled!");
        }
    }
     


    BananaBonus
    a simple configurable daily login bonus - 45 lines

    24/08/2011 - codename_B

    Show Spoiler

    Code:
    package de.bananaco.bonus;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import org.bukkit.ChatColor;
    import org.bukkit.event.Event.*;
    import org.bukkit.event.player.*;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.util.config.Configuration;
    import com.iConomy.iConomy;
    public class BananaBonus extends JavaPlugin {
        @Override
        public void onDisable() {
            System.out.println("[BananaBonus] "+"Disabled");
        }
        @Override
        public void onEnable() {
            getServer().getPluginManager().registerEvent(Type.PLAYER_TELEPORT, new PlayerLoginListener(getConfiguration()), Priority.Monitor, this);
            System.out.println("[BananaBonus] "+"Enabled");
        }
    }
    class PlayerLoginListener extends PlayerListener {
        private Configuration c;
        public PlayerLoginListener(Configuration c) {
            c.load();
            c.setProperty("bonus", c.getDouble("bonus", 1000));
            c.save();
            this.c = c;
        }
        public void onPlayerTeleport(PlayerTeleportEvent event) {
            String date = new SimpleDateFormat("yy/MM/dd").format(Calendar.getInstance().getTime());
            if(event.getPlayer().hasPermission("bananabonus.get") && (!c.getString("players."+event.getPlayer().getName(),"").equals(date)))
            try {
            double bonus = c.getDouble("bonus", 1000);
            iConomy.getAccount(event.getPlayer().getName()).getHoldings().add(bonus);
            c.setProperty("players."+event.getPlayer().getName(), date);
            c.save();
            event.getPlayer().sendMessage(ChatColor.AQUA+"--"+ChatColor.GREEN+"You earned "+bonus+" for playing today "+date+ChatColor.AQUA+"--");
            } catch (Exception e) {
            System.err.println("[BananaBonus] "+"iConomy not installed!");
            }
            }
    }
    


    Economy
    simple balance-in-hand economy plugin - 37 lines

    24/08/2011 - codename_B
    Show Spoiler

    Code:
    package de.bananaco.eco;
    import java.io.File;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.util.config.Configuration;
    public class Economy extends JavaPlugin {
        private static EconomyFunctions eco;
        @Override
        public void onLoad() {
            eco = new EconomyFunctions(new Configuration(new File("plugins/Economy/data.yml")));
        }
        @Override
        public void onDisable() {
            System.out.println("[Economy] Disabled");
        }
        @Override
        public void onEnable() {
            System.out.println("[Economy] Enabled");
        }
        public static EconomyFunctions getEconomyFunctions() {
        return eco;
        }
    }
    class EconomyFunctions {
        private final Configuration c;
        EconomyFunctions(Configuration c) {
            this.c=c;
            c.setProperty("default-balance",c.getDouble("default-balance",50.0));
            c.save();
        }
        public void setBalance(String player, double balance) {
            c.setProperty("players."+player+".balance", balance);
            c.save();
        }
        public double getBalance(String player) {
            return c.getDouble("player."+player+".balance", c.getDouble("default-balance", 50));
        }
    }
    


    SimpleCuboid
    cuboiding in under 50 lines - 48 lines

    24/08/2011 - s1mpl3x
    Show Spoiler

    Code:
    package me.simplex.trololol;
    import java.util.HashMap;
    import org.bukkit.Location;
    import org.bukkit.event.Event.*;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.*;
    import org.bukkit.plugin.java.JavaPlugin;
    public class Cuboid extends JavaPlugin {
        private HashMap<String, BlockStorage> startedCuboids = new HashMap<String, BlockStorage>();
        public void onDisable() {}
        public void onEnable() {
            getServer().getPluginManager().registerEvent(Type.PLAYER_INTERACT, new Listener(), Priority.Normal, this);
            System.out.println("[Cuboid] Enabled.");
        }
        private class Listener extends PlayerListener{
            public void onPlayerInteract(PlayerInteractEvent event) {
                if(!(event.getPlayer().getItemInHand().getTypeId() ==  280) && !(event.getAction().equals(Action.RIGHT_CLICK_BLOCK)))  return;
                if(startedCuboids.containsKey(event.getPlayer().getName())){
                    BlockStorage bs = startedCuboids.get(event.getPlayer().getName());
                    bs.loc2 = event.getClickedBlock().getLocation();
                    int start_x = Math.min(bs.loc1.getBlockX(), bs.loc2.getBlockX());
                    int start_y = Math.min(bs.loc1.getBlockY(), bs.loc2.getBlockY());
                    int start_z = Math.min(bs.loc1.getBlockZ(), bs.loc2.getBlockZ());
                    int end_x     = Math.max(bs.loc1.getBlockX(), bs.loc2.getBlockX());
                    int end_y     = Math.max(bs.loc1.getBlockY(), bs.loc2.getBlockY());
                    int end_z     = Math.max(bs.loc1.getBlockZ(), bs.loc2.getBlockZ());
                    for (int x = start_x; x <= end_x; x++) {
                        for (int y = start_y; y <= end_y; y++) {
                            for (int z = start_z; z <= end_z; z++) {
                                bs.loc1.getWorld().getBlockAt(x, y,  z).setTypeIdAndData(bs.loc1.getBlock().getTypeId(),  bs.loc1.getBlock().getData(), false);
                            }
                        }
                    }
                    startedCuboids.remove(event.getPlayer().getName());
                    event.getPlayer().sendMessage("Cuboid builded.  "+"start: ["+start_x+"|"+start_y+"|"+start_z+"] end:  ["+end_x+"|"+end_y+"|"+end_z+"]");
                }
                else {
                    BlockStorage newCubeoid = new BlockStorage();
                    newCubeoid.loc1 = event.getClickedBlock().getLocation();
                    startedCuboids.put(event.getPlayer().getName(), newCubeoid);
                    event.getPlayer().sendMessage("Got Block 1. Now Rightclick Block 2");
                }
            }
        }
        private class BlockStorage{
            public Location loc1, loc2;
        }
    }
    


    Help
    help from a flatfile - 45 lines

    24/08/2011 - codename_B
    Show Spoiler

    Code:
    package de.bananaco.help;
    import java.io.*;
    import java.util.ArrayList;
    import org.bukkit.ChatColor;
    import org.bukkit.command.*;
    import org.bukkit.plugin.java.JavaPlugin;
    public class Help extends JavaPlugin {
        public ArrayList<String> message = new ArrayList<String>();
        public void log(Object input) {
            System.out.println("[Help] " + String.valueOf(input));
        }
        @Override
        public void onDisable() {
            log("Disabled");
        }
        @Override
        public void onEnable() {
            readHelp();
            log("Enabled.");
        }
        public void readHelp() {
            try {
                File help = new File("help.txt");
                if (!help.exists())
                    help.createNewFile();
                BufferedReader br = new BufferedReader(new InputStreamReader(
                        new DataInputStream(new FileInputStream(help))));
                String strLine;
                while ((strLine = br.readLine()) != null) {
                    message.add(strLine);
                }
                br.close();
                log("help.txt read successfully!");
            } catch (Exception e) {
                log("help.txt could not be read!");
            }
        }
        public boolean onCommand(CommandSender sender, Command cmd,
                String commandLabel, String[] args) {
            sender.sendMessage(ChatColor.AQUA+"--"+ChatColor.GREEN+"Help"+ChatColor.AQUA+"--");
            for(String m : message)
            sender.sendMessage(m);
            return true;
        }
    }
    


    ThatOneGodmodePlugin
    permissions based godmode - 34 lines

    24/08/2011 - krinsdeath
    Show Spoiler

    Code:
    package net.krinsoft.thatonegodmodeplugin;
    
    import org.bukkit.entity.Player;
    import org.bukkit.event.Event.Priority;
    import org.bukkit.event.Event.Type;
    import org.bukkit.event.entity.EntityDamageEvent;
    import org.bukkit.event.entity.EntityListener;
    import org.bukkit.plugin.java.JavaPlugin;
    
    /**
     *
     * @author krinsdeath
     */
    public class GodMode extends JavaPlugin {
    
        @Override
        public void onEnable() {
            getServer().getPluginManager().registerEvent(Type.ENTITY_DAMAGE, new EntityListener() {
                @Override
                public void onEntityDamage(EntityDamageEvent event) {
                    if (event.getEntity() instanceof Player && ((Player)event.getEntity()).hasPermission("krinmode.use")) {
                        event.setCancelled(true);
                    }
                }
            }, Priority.Lowest, this);
            getServer().getLogger().info("[KrinMode] KrinMode v1.0 by krinsdeath enabled.");
        }
    
        @Override
        public void onDisable() {
            getServer().getLogger().info("[KrinMode] KrinMode v1.0 disabled.");
        }
    }
    


    MicroNordic
    microfied nordic gen - 50 lines

    24/08/2011 - s1mpl3x
    Show Spoiler

    Code:
    package me.simplex.trololol;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Random;
    import org.bukkit.*;
    import org.bukkit.generator.*;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.util.noise.SimplexOctaveGenerator;
    public class JungleLOL extends JavaPlugin {
        public void onDisable() {}
        public void onEnable() {}
        public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) {
            return new Generator();
        }
        private class Generator extends ChunkGenerator{
            public byte[] generate(World world, Random random, int x_chunk, int z_chunk) {
                byte[] ret = new byte[32768];
                SimplexOctaveGenerator noisegen = new SimplexOctaveGenerator(world.getSeed(), 4);
                for (int x = 0; x < 16; x++) {
                    for (int z = 0; z < 16; z++) {
                        double noiz = 25+noisegen.noise((x+x_chunk*16)/100.0f, (z+z_chunk*16)/100.0f, 0.5, 0.5)*15;
                        for (int y = 0; y < noiz; y++) {
                            if (y == 0)
                                ret[(x * 16 + z) * 128 + y] = 7;
                            else if (y >= noiz-1)
                                ret[(x * 16 + z) * 128 + y] = 2;
                            else
                                ret[(x * 16 + z) * 128 + y] = 1;
                        }
                    }
                }
                return ret;
            }
            public List<BlockPopulator> getDefaultPopulators(World world) {
                LinkedList<BlockPopulator> ret = new LinkedList<BlockPopulator>();
                ret.add(new Populator());
                return ret;
            }
            public boolean canSpawn(World world, int x, int z) {
                return true;
            }
        }
        private class Populator extends BlockPopulator{
            public void populate(World w, Random r, Chunk s) {
                int x = r.nextInt(16)+s.getX()*16;
                int z = r.nextInt(16)+s.getZ()*16;
                w.generateTree(new Location(w, x, w.getHighestBlockYAt(x, z), z), TreeType.BIG_TREE);
            }
        }
    }
    


    WGEN
    simple rolling hills - 48 lines

    23/08/2011 - codename_B
    Show Spoiler

    Code:
    package de.bananaco.wgen;
    import java.util.Random;
    import org.bukkit.World;
    import org.bukkit.generator.ChunkGenerator;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.util.noise.SimplexOctaveGenerator;
    public class WGEN extends JavaPlugin {
        public void log(Object input) {
            System.out.println("[WGEN] "+String.valueOf(input));
        }
        @Override
        public void onDisable() {
            log("Disabled");
        }
        @Override
        public void onEnable() {
            log("Enabled");
        }
        @Override
        public ChunkGenerator getDefaultWorldGenerator(String w, String i) {
            return new GEN();
        }
    }
    class GEN extends ChunkGenerator {
            public boolean canSpawn(World world, int x, int z) {
                return true;
            }
        @Override
        public byte[] generate(World world, Random random, int chunkX, int chunkZ) {
            byte[] b = new byte[16*16*128];
            SimplexOctaveGenerator gen =  new SimplexOctaveGenerator(new Random(world.getSeed()), 8);
            gen.setScale(1/64.0);
            for (int x=0; x<16; x++)
                        for (int z=0; z<16; z++){
                            double noise = gen.noise(x+chunkX*16, z+chunkZ*16, 0.5, 0.5)*16;
                            for(int y=0; y<32+noise; y++){
                                if(y==0)
                                b[(x * 16 + z) * 128 + y] = (byte)  7;
                                else
                                b[(x * 16 + z) * 128 + y] = (byte)  1;
                            }
                        }
            return b;
            }
    }
    


    List
    everyone can use the /list command - 29 lines

    23/08/2011 - codename_B
    Show Spoiler

    Code:
    package de.bananaco.list;
    import java.util.*;
    import org.bukkit.ChatColor;
    import org.bukkit.command.*;
    import org.bukkit.entity.Player;
    import org.bukkit.plugin.java.JavaPlugin;
    public class List extends JavaPlugin {
        public Random rand;
        public void log(Object input) {
            System.out.println("[List] "+String.valueOf(input));
        }
        public boolean onCommand(CommandSender sender, Command cmd,
                String commandLabel, String[] args) {
            Player[] players = getServer().getOnlinePlayers();
            String[] playernames = new String[players.length];
            for(int i=0; i<players.length; i++)
                playernames[i] = ChatColor.getByCode(rand.nextInt(15))+players[i].getName();
            sender.sendMessage(ChatColor.getByCode(rand.nextInt(15))+"Online Players:");
            sender.sendMessage(Arrays.toString(playernames).replace("[", "").replace("]", ""));
            return true;
        }
        @Override
        public void onDisable() {
            log("Disabled");
        }
        @Override
        public void onEnable() {
            rand = new Random(1);
            log("Enabled");
        }
    }
      


    SaysWho
    see who used /say - 27 lines

    23/08/2011 - ChrizC
    Show Spoiler

    Code:
      package net.gb.chrizc.sayswho;
      import org.bukkit.Bukkit;
      import org.bukkit.ChatColor;
      import org.bukkit.plugin.java.JavaPlugin;
      import org.bukkit.event.Event;
      import org.bukkit.event.Event.Priority;
      import org.bukkit.event.player.*;
      public class SaysWho extends JavaPlugin {
          @Override
          public void onDisable() {
              System.out.println("[SaysWho] disabled.");
          }
          @Override
          public void onEnable() {
              getServer().getPluginManager().registerEvent(Event.Type.PLAYER_COMMAND_PREPROCESS, new playerListener(), Priority.Highest, this);
              System.out.println("[SaysWho] version v" + this.getDescription().getVersion() + " is enabled.");
          }
          class playerListener extends PlayerListener {
              @Override
              public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) {
                  if((event.getPlayer().isOp()) && (event.getMessage().startsWith("/say")) && (event.getMessage().length() > 5)) {
                      event.setCancelled(true);
                      Bukkit.getServer().broadcastMessage(ChatColor.LIGHT_PURPLE + "[Server] " + event.getMessage().replace("/say ", "") + " [from " + event.getPlayer().getName() + "]");
                  }
              }
          }
      }
      


    Seeds
    harvest seeds from tilling dirt - 31 lines

    24/08/2011 - ChrizC
    Show Spoiler

    Code:
      package net.gb.chrizc.seeds;
      import java.util.Random;
      import org.bukkit.Location;
      import org.bukkit.Material;
      import org.bukkit.event.Event.*;
      import org.bukkit.event.*;
      import org.bukkit.event.block.Action;
      import org.bukkit.event.player.*;
      import org.bukkit.inventory.ItemStack;
      import org.bukkit.plugin.java.JavaPlugin;
      public class Seeds extends JavaPlugin {
          @Override
          public void onDisable() {
              System.out.println("[Seeds] disabled.");
          }
          @Override
          public void onEnable() {
              getServer().getPluginManager().registerEvent(Event.Type.PLAYER_INTERACT, new playerListener(), Priority.Normal, this);
              System.out.println( "[Seeds] version v" + this.getDescription().getVersion() + " is enabled." );
          }
          class playerListener extends PlayerListener {
              @Override
              public void onPlayerInteract(PlayerInteractEvent event) {
                  if ((event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) && (event.getClickedBlock().getTypeId() == 3) && (event.getPlayer().getItemInHand().getType() == Material.WOOD_HOE || event.getPlayer().getItemInHand().getType() == Material.STONE_HOE || event.getPlayer().getItemInHand().getType() == Material.IRON_HOE || event.getPlayer().getItemInHand().getType() == Material.DIAMOND_HOE || event.getPlayer().getItemInHand().getType() == Material.GOLD_HOE)) {
                      if (new Random().nextInt(100) <= 20) {
                          event.getClickedBlock().getWorld().dropItemNaturally(new Location(event.getClickedBlock().getWorld(), event.getClickedBlock().getX(), event.getClickedBlock().getY() + 1, event.getClickedBlock().getZ()), new ItemStack(Material.SEEDS, 1));
                      }
                  }
              }
          }
      }
      


    Godmode
    Godmode, for everyone, all the time - 23 lines

    24/04/2011 - NuclearW
    Show Spoiler

    Code:
      package sl.nuclearw.under50god;
      import java.util.logging.Logger;
      import org.bukkit.entity.Player;
      import org.bukkit.event.Event;
      import org.bukkit.event.entity.EntityDamageEvent;
      import org.bukkit.event.entity.EntityListener;
      import org.bukkit.plugin.java.JavaPlugin;
      public class under50god extends JavaPlugin {
          @Override
          public void onEnable() {
               this.getServer().getPluginManager().registerEvent(Event.Type.ENTITY_DAMAGE,   new entityListener(), Event.Priority.Highest, this);
              Logger.getLogger("Minecraft").info("Under 50 - God loaded");
          }
          @Override
          public void onDisable() {
              Logger.getLogger("Minecraft").info("Under 50 - God unloaded");
          }
      }
      class entityListener extends EntityListener {
          public void onEntityDamage(EntityDamageEvent event) {
              event.setCancelled((event.getEntity() instanceof Player) ? true : false);
          }
       }


    Under50ConsoleLikeChat
    make console behave more like chat, now smaller - 32 lines.

    24/08/2011 - NuclearW
    Show Spoiler

    Code:
      package sl.nuclearw.under50clc;
      import java.util.logging.Logger;
      import org.bukkit.event.Event;
      import org.bukkit.event.server.ServerCommandEvent;
      import org.bukkit.event.server.ServerListener;
      import org.bukkit.plugin.PluginManager;
      import org.bukkit.plugin.java.JavaPlugin;
      public class clc extends JavaPlugin {
          private final clcServerListener serverListener = new clcServerListener();
          Logger log = Logger.getLogger("Minecraft");
         @Override
          public void onEnable() {
              PluginManager pm = getServer().getPluginManager();
              pm.registerEvent(Event.Type.SERVER_COMMAND, serverListener, Event.Priority.Low, this);
              log.info("[ConsoleLikeChat] Version "+this.getDescription().getVersion()+" enabled.");
          }
         @Override
          public void onDisable() {
              log.info("[ConsoleLikeChat] Version "+this.getDescription().getVersion()+" disabled.");
          }
      }
      class clcServerListener extends ServerListener {
          public void onServerCommand(ServerCommandEvent event) {
              String cmd = event.getCommand();
              if(cmd.startsWith("/")) {
                  cmd = cmd.substring(1);
              } else {
                  cmd = "say "+cmd;
              }
              event.setCommand(cmd);
          }
       }
      
     
  2. Offline

    NuclearW

    Because I know you are a fan of them @codename_B

    Godmode
    Godmode, for everyone, all the time. 21 lines
    Code:
    package sl.nuclearw.under50god;
    import java.util.logging.Logger;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Event;
    import org.bukkit.event.entity.EntityDamageEvent;
    import org.bukkit.event.entity.EntityListener;
    import org.bukkit.plugin.java.JavaPlugin;
    public class under50god extends JavaPlugin {
        public void onEnable() {
            this.getServer().getPluginManager().registerEvent(Event.Type.ENTITY_DAMAGE,  new entityListener(), Event.Priority.Highest, this);
            Logger.getLogger("Minecraft").info("Under 50 - God loaded");
        }
        public void onDisable() {
            Logger.getLogger("Minecraft").info("Under 50 - God unloaded");
        }
    }
    class entityListener extends EntityListener {
        public void onEntityDamage(EntityDamageEvent event) {
            event.setCancelled((event.getEntity() instanceof Player) ? true : false);
        }
    }
     
    gomeow likes this.
  3. Offline

    codename_B

    Beautiful - adding to OP :D
     
    GrandmaJam likes this.
  4. Offline

    NuclearW

    Noticed my plugin ConsoleLikeChat is already pretty small, so I under50-ized it. Also should provide a good example of the new server command event, for the unknowing it fires for console on any command. Think PLAYER_CHAT_PREPROCESS for console.

    Under50ConsoleLikeChat
    ConsoleLikeChat, under 50. Make console behave more like chat, now smaller. 30 lines.
    Code:
    package sl.nuclearw.under50clc;
    import java.util.logging.Logger;
    import org.bukkit.event.Event;
    import org.bukkit.event.server.ServerCommandEvent;
    import org.bukkit.event.server.ServerListener;
    import org.bukkit.plugin.PluginManager;
    import org.bukkit.plugin.java.JavaPlugin;
    public class clc extends JavaPlugin {
        private final clcServerListener serverListener = new clcServerListener();
        Logger log = Logger.getLogger("Minecraft");
        public void onEnable() {
            PluginManager pm = getServer().getPluginManager();
            pm.registerEvent(Event.Type.SERVER_COMMAND, serverListener, Event.Priority.Low, this);
            log.info("[ConsoleLikeChat] Version "+this.getDescription().getVersion()+" enabled.");
        }
        public void onDisable() {
            log.info("[ConsoleLikeChat] Version "+this.getDescription().getVersion()+" disabled.");
        }
    }
    class clcServerListener extends ServerListener {
        public void onServerCommand(ServerCommandEvent event) {
            String cmd = event.getCommand();
            if(cmd.startsWith("/")) {
                cmd = cmd.substring(1);
            } else {
                cmd = "say "+cmd;
            }
            event.setCommand(cmd);
        }
    }
     
    MrBluebear3 likes this.
  5. Offline

    codename_B

    Added :D
     
  6. Offline

    s1mpl3x

    Code:
    package me.simplex.trololol;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Random;
    import org.bukkit.*;
    import org.bukkit.generator.*;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.util.noise.SimplexOctaveGenerator;
    public class JungleLOL extends JavaPlugin {
        public void onDisable() {}
        public void onEnable() {}
        public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) {
            return new Generator();
        }
        private class Generator extends ChunkGenerator{
            public byte[] generate(World world, Random random, int x_chunk, int z_chunk) {
                byte[] ret = new byte[32768];
                SimplexOctaveGenerator noisegen = new SimplexOctaveGenerator(world.getSeed(), 4);
                for (int x = 0; x < 16; x++) {
                    for (int z = 0; z < 16; z++) {
                        double noiz = 25+noisegen.noise((x+x_chunk*16)/100.0f, (z+z_chunk*16)/100.0f, 0.5, 0.5)*15;
                        for (int y = 0; y < noiz; y++) {
                            if (y == 0)
                                ret[(x * 16 + z) * 128 + y] = 7;
                            else if (y >= noiz-1)
                                ret[(x * 16 + z) * 128 + y] = 2;
                            else
                                ret[(x * 16 + z) * 128 + y] = 1;
                        }
                    }
                }
                return ret;
            }
            public List<BlockPopulator> getDefaultPopulators(World world) {
                LinkedList<BlockPopulator> ret = new LinkedList<BlockPopulator>();
                ret.add(new Populator());
                return ret;
            }
            public boolean canSpawn(World world, int x, int z) {
                return true;
            }
        }
        private class Populator extends BlockPopulator{
            public void populate(World w, Random r, Chunk s) {
                int x = r.nextInt(16)+s.getX()*16;
                int z = r.nextInt(16)+s.getZ()*16;
                w.generateTree(new Location(w, x, w.getHighestBlockYAt(x, z), z), TreeType.BIG_TREE);
            }
        }
    }
    stripped hard but it works :D
    @codename_B wouldn't your generator stuck cause of the spawn location?
    Anyway, mine haz shiny trees!!11

    Tested it, the plugin works, exactly 50 lines more or less :rolleyes:
     
  7. Offline

    DrBowe

    I'm surprised that no one's being cheap enough to use 'import org.bukkit.*' :p
     
  8. Offline

    cereal

    That's the first thought that crossed my mind! Hey, if it works there is nothing wrong with that.
     
    GrandmaJam likes this.
  9. Offline

    krinsdeath

    That One God Mode Plugin - Permissions capable - 37 lines including plugin.yml
    Code:
    package net.krinsoft.thatonegodmodeplugin;
    
    import org.bukkit.entity.Player;
    import org.bukkit.event.Event.Priority;
    import org.bukkit.event.Event.Type;
    import org.bukkit.event.entity.EntityDamageEvent;
    import org.bukkit.event.entity.EntityListener;
    import org.bukkit.plugin.java.JavaPlugin;
    
    /**
     * 
     * @author krinsdeath
     */
    public class GodMode extends JavaPlugin {
    
        @Override
        public void onEnable() {
            getServer().getPluginManager().registerEvent(Type.ENTITY_DAMAGE, new EntityListener() {
                @Override
                public void onEntityDamage(EntityDamageEvent event) {
                    if (event.getEntity() instanceof Player && ((Player)event.getEntity()).hasPermission("krinmode.use")) {
                        event.setCancelled(true);
                    }
                }
            }, Priority.Lowest, this);
            getServer().getLogger().info("[KrinMode] KrinMode v1.0 by krinsdeath enabled.");
        }
    
        @Override
        public void onDisable() {
            getServer().getLogger().info("[KrinMode] KrinMode v1.0 disabled.");
        }
    }
    
    plugin.yml
    Code:
    name: KrinMode
    main: net.krinsoft.thatonegodmodeplugin.GodMode
    version: 1.0
    author: krinsdeath
    
     
  10. Offline

    undeadmach1ne

    great thread for a noob to have a poke around in. thanks codename_B and all contributors <3
     
  11. Offline

    zhuowei

    I tried to minimize my existing plugin, PigGrinder, and I came up with this stupid submission that probably doesn't fit the criteria:
    Show Spoiler
    Code:
    package net.zhuoweizhang.piggrinder;import java.util.*;import org.bukkit.*;import org.bukkit.command.*;
    import org.bukkit.event.*;import org.bukkit.entity.*;import org.bukkit.inventory.*;
    import org.bukkit.plugin.*;import org.bukkit.plugin.java.*;import org.bukkit.util.config.*;
    import org.bukkit.event.player.*;import org.getspout.spoutapi.*;import org.getspout.spoutapi.player.*;
    public class PigGrinderPlugin extends JavaPlugin {Recipe gRecipe; 
    Material gMat;short gMetadata;int gDelay;int gAmount;boolean gExplode;float gExplodePower;
    String gTexURL;double gYVel;final PGPL pListen = new PGPL(this);
    final List<PGT> tasks = new ArrayList<PGT>();public void onEnable() {
    Configuration config = getConfiguration();Material mat = Material.matchMaterial(config.getString(
    "material", "BUCKET"));if (mat != null)gMat = mat;gMetadata = (short) config.getInt("metadata", 70);
    gDelay = config.getInt("delay", 5);gAmount = config.getInt("amount", 20);
    gExplode = config.getBoolean("explode", true);gExplodePower = (float) config.getDouble("explodepower", 1.0);
    gTexURL = config.getString("textureurl", "http://cloud.github.com/downloads/zhuowei/PigGrinder/" +
    "pig_grinder_texture.png");gYVel = config.getDouble("yvelocity", 0.25);config.save();this.getServer().
    getPluginManager().registerEvent(Event.Type.PLAYER_INTERACT_ENTITY, pListen, Event.Priority.Normal, this);
    gRecipe = new ShapedRecipe(new ItemStack(gMat, 1, gMetadata)).shape("bib", "iri", "bib").
    setIngredient('b', Material.CLAY_BRICK).setIngredient('i', Material.IRON_INGOT).setIngredient('r',
    Material.REDSTONE);getServer().addRecipe(gRecipe);try {SpoutManager.getItemManager().setItemName(
    gMat, gMetadata, "Grinder");}catch(Error err) {}catch(Exception e) {}}public void 
    onDisable() {getServer().getScheduler().cancelTasks(this);}PGT grind(Pig pig) {
    PGT task = new PGT(pig, gAmount);int taskId = getServer().getScheduler().
    scheduleSyncRepeatingTask(this, task, gDelay, gDelay);task.taskId = taskId;tasks.add(task);
    return task;}class PGT implements Runnable {Pig pig;int amount;
    int taskId = 0;public PGT(Pig pig, int amount) {this.pig = pig;this.amount = amount;
    try {AppearanceManager m = SpoutManager.getAppearanceManager();for (Player p: pig.getServer().
    getOnlinePlayers()) {m.setEntitySkin(SpoutManager.getPlayer(p), pig, gTexURL);}}catch(
    Error err) {}}public void run() {if (pig.isDead()) {Bukkit.getServer().getScheduler().
    cancelTask(taskId);if (tasks.contains(this)) {tasks.remove(this);}return;}Material pd = (pig.
    getFireTicks() > 0 ? Material.GRILLED_PORK : Material.PORK);World world = pig.getWorld();Location loc
     = pig.getLocation();Item item = world.dropItemNaturally(loc, new ItemStack(pd, 1));item.setVelocity(
    item.getVelocity().setY(item.getVelocity().getY() + gYVel));amount--;if (amount <= 0) {pig.remove();
    if (gExplode) {world.createExplosion(loc, gExplodePower);}Bukkit.getServer().getScheduler().
    cancelTask(taskId);if (tasks.contains(this)) {tasks.remove(this);}}}}private class PGPL extends 
    PlayerListener {PigGrinderPlugin plugin;public PGPL(PigGrinderPlugin plugin) {this.plugin = plugin;}
    public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {if (event.isCancelled() ||
     !(event.getRightClicked() instanceof Pig)) {return;}ItemStack tool = event.getPlayer().getItemInHand();
    if (tool == null || !tool.getType().equals(plugin.gMat) || tool.getDurability() != plugin.gMetadata)
     {return;}Pig pig = (Pig) event.getRightClicked();for (PigGrinderPlugin.PGT task: plugin.tasks) {
    if (task.pig.equals(pig)) {return;}}event.setCancelled(true);event.getPlayer().setItemInHand(new ItemStack(
    plugin.gMat, tool.getAmount() - 1, plugin.gMetadata));plugin.grind(pig);}}}
    

    I tested and it still worked, though.
    Edit: now only 40 lines -- one line shorter.
     
    chasechocolate likes this.
  12. Offline

    codename_B

    Wow.... I'd have to check line length there :p it's not exactly following your standard formatting ;)

    So if would, damnit! :O I'll have to update mine when I add yours, thanks!

    woot added a new one :D

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Oct 29, 2015
    Royal_Soda likes this.
  13. Offline

    s1mpl3x

    Code:
    package me.simplex.trololol;
    import java.util.HashMap;
    import org.bukkit.Location;
    import org.bukkit.event.Event.*;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.*;
    import org.bukkit.plugin.java.JavaPlugin;
    public class Cuboid extends JavaPlugin {
        private HashMap<String, BlockStorage> startedCuboids = new HashMap<String, BlockStorage>();
        public void onDisable() {}
        public void onEnable() {
            getServer().getPluginManager().registerEvent(Type.PLAYER_INTERACT, new Listener(), Priority.Normal, this);
            System.out.println("[Cuboid] Enabled.");
        }
        private class Listener extends PlayerListener{
            public void onPlayerInteract(PlayerInteractEvent event) {
                if(!(event.getPlayer().getItemInHand().getTypeId() == 280) && !(event.getAction().equals(Action.RIGHT_CLICK_BLOCK))) return;
                if(startedCuboids.containsKey(event.getPlayer().getName())){
                    BlockStorage bs = startedCuboids.get(event.getPlayer().getName());
                    bs.loc2 = event.getClickedBlock().getLocation();
                    int start_x = Math.min(bs.loc1.getBlockX(), bs.loc2.getBlockX());
                    int start_y = Math.min(bs.loc1.getBlockY(), bs.loc2.getBlockY());
                    int start_z = Math.min(bs.loc1.getBlockZ(), bs.loc2.getBlockZ());
                    int end_x     = Math.max(bs.loc1.getBlockX(), bs.loc2.getBlockX());
                    int end_y     = Math.max(bs.loc1.getBlockY(), bs.loc2.getBlockY());
                    int end_z     = Math.max(bs.loc1.getBlockZ(), bs.loc2.getBlockZ());
                    for (int x = start_x; x <= end_x; x++) {
                        for (int y = start_y; y <= end_y; y++) {
                            for (int z = start_z; z <= end_z; z++) {
                                bs.loc1.getWorld().getBlockAt(x, y, z).setTypeIdAndData(bs.loc1.getBlock().getTypeId(), bs.loc1.getBlock().getData(), false);
                            }
                        }
                    }
                    startedCuboids.remove(event.getPlayer().getName());
                    event.getPlayer().sendMessage("Cuboid builded. "+"start: ["+start_x+"|"+start_y+"|"+start_z+"] end: ["+end_x+"|"+end_y+"|"+end_z+"]");
                }
                else {
                    BlockStorage newCubeoid = new BlockStorage();
                    newCubeoid.loc1 = event.getClickedBlock().getLocation();
                    startedCuboids.put(event.getPlayer().getName(), newCubeoid);
                    event.getPlayer().sendMessage("Got Block 1. Now Rightclick Block 2");
                }
            }
        }
        private class BlockStorage{
            public Location loc1, loc2;
        }
    }
    cuboid tool in 48 lines.

    edit meh could have used block instead of location... whatever
     
  14. Offline

    codename_B

    Oh wow, now thats getting impressive :D

    @s1mpl3x why not compile the jars and provide links so people who want the plugins can dl? :)
     
  15. Offline

    iffa

    Code:java
    1. package me.iffa.fucking.useless.plugin.of.doom.and.evil.why.are.you.reading.dis.dude;
    2. import org.bukkit.plugin.java.JavaPlugin;
    3. public class Empty extends JavaPlugin {
    4. @Override
    5. public void onDisable() {
    6. }
    7. @Override
    8. public void onEnable() {
    9. }
    10. }

    A very useful nothing plugin, only 12 lines! Syntax adds 2 lines.
     
  16. Offline

    s1mpl3x

  17. Offline

    codename_B

    Where bonus points are awarded for functionality, you get none.
     
  18. Offline

    iffa

    lol
     
  19. Offline

    codename_B

    Ah hell why not :p released /list and /help
     
  20. Offline

    escape

    ChatBlock: Players can't talk or see the chat unless they have the permission (ChatBlock.Chat): 29 lines.
    Code:java
    1. package me.escape.chatBlock;
    2. import org.bukkit.entity.Player;
    3. import org.bukkit.event.Event.*;
    4. import org.bukkit.event.player.*;
    5. import org.bukkit.permissions.*;
    6. import org.bukkit.plugin.java.JavaPlugin;
    7. import static java.lang.System.out;
    8.  
    9. public class Under50ChatBlock extends JavaPlugin {
    10. public void onDisable() {
    11. out.println("[Under50ChatBlock] disabled!");
    12. }
    13. public void onEnable() {
    14. getServer().getPluginManager().addPermission(new Permission("ChatBlock.Chat", PermissionDefault.FALSE));
    15. getServer().getPluginManager().registerEvent(Type.PLAYER_CHAT, new PlayerListener() {
    16. @Override
    17. public void onPlayerChat(PlayerChatEvent event) {
    18. event.setCancelled(true);
    19. if(!event.getPlayer().hasPermission("ChatBlock.Chat")) return;
    20. for(Player p : getServer().getOnlinePlayers()) {
    21. if(p.hasPermission("ChatBlock.Chat"))
    22. p.sendMessage(event.getPlayer().getName() + ": " + event.getMessage());
    23. }
    24. out.println('<' + event.getPlayer().getName() + "> " + event.getMessage());
    25. }
    26. }, Priority.Highest, this);
    27. out.println("[Under50ChatBlock] enabled!");
    28. }
    29. }
    30.  
     
    Deleted user likes this.
  21. Offline

    codename_B

    Nice one! Will be adding to the list shortly :D
     
  22. Offline

    escape

    Oh and here's the jar if anyone wants it.
     
  23. Offline

    zml2008

    SuperPick: provides a superpick to players with permission and calls events for superpick block breaks. ~38 lines.
    Code:java
    1.  
    2. package com.zml.superpick;
    3.  
    4. import org.bukkit.event.block.*;
    5. import org.bukkit.event.player.*;
    6. import org.bukkit.inventory.ItemStack;
    7. import org.bukkit.plugin.java.JavaPlugin;
    8. import org.bukkit.event.Event.*;
    9.  
    10. public class SuperPickPlugin extends JavaPlugin {
    11.  
    12. public void onDisable() {
    13. System.out.println("SuperPick now disabled");
    14. }
    15. public void onEnable() {
    16. getServer().getPluginManager().registerEvent(
    17. Type.PLAYER_INTERACT, new PL(), Priority.Normal, this);
    18. System.out.println("SuperPick now enabled.");
    19. }
    20.  
    21. public class PL extends PlayerListener {
    22. public void onPlayerInteract(PlayerInteractEvent e) {
    23. if (e.getAction() == Action.LEFT_CLICK_BLOCK
    24. && e.getPlayer().hasPermission("superpick.use") && e.hasItem()) {
    25. int id = e.getItem().getTypeId();
    26. if (!(id == 270 || id == 274 || id == 278 || id == 285)) return;
    27. BlockBreakEvent bbe = new BlockBreakEvent(e.getClickedBlock(), e.getPlayer());
    28. getServer().getPluginManager().callEvent(bbe);
    29. if (!bbe.isCancelled()) {
    30. e.getPlayer().getWorld().dropItemNaturally(e.getPlayer().getLocation(),
    31. new ItemStack((e.getClickedBlock().getType())));
    32. e.getClickedBlock().setTypeId(0);
    33. e.setCancelled(true);
    34. }
    35. }
    36. }
    37. }
    38. }
     
  24. Offline

    Taco

    Plugin name: NothingPlugin
    What it does: Absolutely nothing.

    The genius code behind this masterpiece:
    Code:java
    1. import org.bukkit.plugin.java.JavaPlugin;
    2. public class NothingPlugin extends JavaPlugin { public void onDisable() {} public void onEnable() {} }
     
    Deleted user likes this.
  25. Offline

    zml2008

    iffa beat you to that
     
    DreadTank27 likes this.
  26. Offline

    codename_B

    Where bonus points are awarded for functionality, you get none.
     
  27. Offline

    Taco

    I didn't even read the contents of the thread. Sorry if he already made this.

    Well, this won't throw a single error. Yet... It won't do a bloody thing.
     
  28. Offline

    zhuowei

    CheeseMaker: 49 lines. (And I tried to stay within the spirit of the rule this time.)
    Code:
    package net.zhuoweizhang.cheesemaker;
    
    import org.bukkit.*;
    import org.bukkit.event.*;
    import org.bukkit.event.block.*;
    import org.bukkit.event.player.*;
    import org.bukkit.entity.*;
    import org.bukkit.inventory.*;
    import org.bukkit.plugin.PluginManager;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.util.config.Configuration;
    
    import org.getspout.spoutapi.SpoutManager;
    
    public class CheeseMakerPlugin extends JavaPlugin {
    
    	short cheeseMetadata;int cheeseHeal;final CheeseMakerPlayerListener playerListener = new CheeseMakerPlayerListener();
    
    	@Override
    	public void onEnable() {
    		Configuration config = getConfiguration();cheeseMetadata = (short) config.getInt("metadata", 16);
    		cheeseHeal = config.getInt("heal", 2);config.save();
    		this.getServer().getPluginManager().registerEvent(Event.Type.PLAYER_INTERACT, playerListener, Event.Priority.Normal, this);
    		Recipe recipe = new FurnaceRecipe(new ItemStack(Material.MILK_BUCKET, 1, cheeseMetadata), Material.MILK_BUCKET);
    		getServer().addRecipe(recipe);
    		try {
    			SpoutManager.getItemManager().setItemName(Material.MILK_BUCKET, cheeseMetadata, "Molten Cheese");
    		}
    		catch(Throwable e) {}
    	}
    
    	public void onDisable() {
    	}
    
    	private class CheeseMakerPlayerListener extends PlayerListener {
    		public void onPlayerInteract(PlayerInteractEvent event) {
    			if (event.isCancelled() || !(event.getAction().equals(Action.RIGHT_CLICK_AIR) ||
    				event.getAction().equals(Action.RIGHT_CLICK_BLOCK))) {
    				return;
    			}
    			ItemStack item = event.getItem(); Player player = event.getPlayer();
    			if (item == null || !item.getType().equals(Material.MILK_BUCKET) || item.getDurability() != cheeseMetadata) {
    				return;
    			}
    			event.setCancelled(true); item.setType(Material.BUCKET); item.setDurability((short)0);
    			player.setHealth(player.getHealth() + cheeseHeal > 20 ? 20 : player.getHealth() + cheeseHeal);
    		}
    	}
    }
    
    Cook buckets of milk in a furnace to get cheese in a bucket, which you can eat by right-clicking on the ground with it. (Uses Spout if available to name the molten cheese)
    Bugs: You must right-click a block to eat(drink?) cheese; You can't right-click air with it. I don't know why this happens. (Maybe buckets, when right-clicking air, does not pass an event to plugins?)
    Update: Now on dev.bukkit.org! CheeseMaker
     
  29. Offline

    codename_B

    LAWL XD That's pretty cute

    Give
    simple /give command with better options

    WIP - 25/08/2011 - codename_B
    Show Spoiler

    Code:
    package de.bananaco.give;
    import java.util.*;
    import org.bukkit.*;
    import org.bukkit.command.*;
    import org.bukkit.entity.Player;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class Give extends JavaPlugin {
        public void onDisable() {
            System.out.println("[Give] Disabled");
        }
        public void onEnable() {
            System.out.println("[Give] Enabled");
        }
        public List<Material> closestMatches(String input) {
            ArrayList<Material> matchList = new ArrayList<Material>();
            for (Material mat : Material.values())
                if (mat.name().replace("_", " ").toLowerCase().equals(input.toLowerCase()) || String.valueOf(mat.getId()).equals(input)) {
                    matchList.clear();
                    matchList.add(mat);
                    return matchList;
                } else if (mat.name().replace("_", " ").toLowerCase().contains(input.toLowerCase()))
                    matchList.add(mat);
            return matchList;
        }
        public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
            if (args.length > 0 && sender instanceof Player) {
                String[] inputs = Arrays.toString(args).replace(",", "").replace("[", "").replace("]", "").split(":");;
                String input = inputs[0];
                int data = inputs.length > 2 ? Integer.parseInt(inputs[2]) : 0, amount = inputs.length > 1 ? Integer.parseInt(inputs[1]) : 64;
                List<Material> matList = closestMatches(input);
                if (matList.size() > 1) {
                    String[] matArray = new String[matList.size()];
                    for (int i = 0; i < matList.size(); i++)
                    matArray[i] = matList.get(i).name().toLowerCase().replace("_", " ");
                    sender.sendMessage(ChatColor.RED+"[Give] "+ChatColor.WHITE+"Did you mean:");
                    sender.sendMessage(Arrays.toString(matArray).replace("[", "").replace("]", ""));
                } else if (matList.size() == 1) {
                    sender.sendMessage(ChatColor.RED+"[Give] "+ChatColor.WHITE+"You want " + amount + " " + matList.get(0).name().toLowerCase().replace("_", " ") + (data == 0 ? "" : ":" + data) + "!");
                    ((Player) sender).getInventory().addItem(new ItemStack(matList.get(0), amount, (short) 0, (byte) data));
                }
                else
                    sender.sendMessage(ChatColor.RED+"[Give] "+ChatColor.WHITE+"I don't know what you want!");
                return true;
            }
            return false;
        }
    }
    


    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Oct 29, 2015
  30. Offline

    zhuowei

    Great /give command, and I like the extra touches of giving autocorrect options and defaulting to 64 blocks and 1 tool per /give command, but where's the MySQL support? :p
     
Thread Status:
Not open for further replies.

Share This Page