A feature-rich Minecraft plugin which enhances gaming experience
git clone git://soophie.de/poppy
blob: ba9d66b202df5b6ffafc317f941d3abaeb10441d (15047 bytes)[doc][blame][raw]
1
package poppy;3
import org.bukkit.Bukkit;4
import org.bukkit.ChatColor;5
import org.bukkit.GameMode;6
import org.bukkit.Location;7
import org.bukkit.Material;8
import org.bukkit.NamespacedKey;9
import org.bukkit.World;10
import org.bukkit.WorldCreator;11
import org.bukkit.WorldType;12
import org.bukkit.World.Environment;13
import org.bukkit.block.Block;14
import org.bukkit.block.BlockFace;15
import org.bukkit.command.Command;16
import org.bukkit.command.CommandSender;17
import org.bukkit.entity.Player;18
import org.bukkit.event.EventHandler;19
import org.bukkit.event.Listener;20
import org.bukkit.event.player.PlayerPortalEvent;21
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;22
import org.bukkit.inventory.FurnaceRecipe;23
import org.bukkit.inventory.ItemStack;24
import org.bukkit.inventory.meta.SkullMeta;25
import org.bukkit.inventory.meta.BookMeta;26
import org.bukkit.plugin.Plugin;27
import org.bukkit.plugin.PluginManager;28
import org.bukkit.plugin.java.JavaPlugin;30
import poppy.modules.AutoBreakerModule;31
import poppy.modules.AutoPlacerModule;32
import poppy.modules.AutoWorkbenchModule;33
import poppy.modules.BlockDetectorModule;34
import poppy.modules.CauldronModule;35
import poppy.modules.ChairModule;36
import poppy.modules.DoubleDoorModule;37
import poppy.modules.HopperSorterModule;38
import poppy.modules.CommonModule;39
import poppy.modules.LeavesDecayModule;40
import poppy.modules.SpawnerModule;41
import poppy.modules.PlayerMountModule;44
public class Main extends JavaPlugin implements Listener45
{46
private Plugin plugin;47
private Config config;48
private PluginManager pluginManager;50
private CommonModule commonModule;51
private DoubleDoorModule doubleDoorModule;52
private ChairModule chairModule;53
private AutoWorkbenchModule autoWorkbenchModule;54
private LeavesDecayModule leavesDecayModule;55
private CauldronModule cauldronModule;56
private SpawnerModule spawnerModule;57
private HopperSorterModule hopperSorterModule;58
private AutoPlacerModule autoPlacerModule;59
private AutoBreakerModule autoBreakerModule;60
private PlayerMountModule playerMountModule;61
private BlockDetectorModule blockDetectorModule;63
@Override64
public void onEnable()65
{66
plugin = this;67
config = new Config("config/poppy.yml");69
pluginManager = Bukkit.getPluginManager();71
pluginManager.registerEvents(this, this);73
commonModule = new CommonModule();74
pluginManager.registerEvents(commonModule, this);76
doubleDoorModule = new DoubleDoorModule();77
pluginManager.registerEvents(doubleDoorModule, this);79
chairModule = new ChairModule();80
pluginManager.registerEvents(chairModule, this);82
autoWorkbenchModule = new AutoWorkbenchModule();83
pluginManager.registerEvents(autoWorkbenchModule, this);85
leavesDecayModule = new LeavesDecayModule(this);86
pluginManager.registerEvents(leavesDecayModule, this);88
cauldronModule = new CauldronModule(this);89
pluginManager.registerEvents(cauldronModule, this);91
spawnerModule = new SpawnerModule();92
pluginManager.registerEvents(spawnerModule, this);94
hopperSorterModule = new HopperSorterModule();95
pluginManager.registerEvents(hopperSorterModule, this);97
autoPlacerModule = new AutoPlacerModule(this);98
pluginManager.registerEvents(autoPlacerModule, this);100
autoBreakerModule = new AutoBreakerModule(this);101
pluginManager.registerEvents(autoBreakerModule, this);103
playerMountModule = new PlayerMountModule();104
pluginManager.registerEvents(playerMountModule, this);106
blockDetectorModule = new BlockDetectorModule();107
pluginManager.registerEvents(blockDetectorModule, this);109
NamespacedKey key = new NamespacedKey(this, "leather");110
FurnaceRecipe recipe = new FurnaceRecipe(key, new ItemStack(Material.LEATHER), Material.ROTTEN_FLESH, 1, 200);111
Bukkit.addRecipe(recipe);113
new WorldCreator(Constants.Worlds.BACKROOMS)114
.type(WorldType.FLAT)115
.generateStructures(false)116
.createWorld();118
new WorldCreator(Constants.Worlds.SURVIVAL)119
.type(WorldType.NORMAL)120
.generateStructures(true)121
.createWorld();123
new WorldCreator(Constants.Worlds.SURVIVAL_NETHER)124
.environment(Environment.NETHER)125
.generateStructures(true)126
.createWorld();128
new WorldCreator(Constants.Worlds.SURVIVAL_THE_END)129
.environment(Environment.THE_END)130
.generateStructures(true)131
.createWorld();132
}134
@Override135
public void onDisable()136
{137
chairModule.onDisable();138
}140
@Override141
public boolean onCommand(CommandSender sender, Command command, String label, String[] args)142
{143
if(sender instanceof Player)144
{145
Player player = (Player) sender;147
switch(label)148
{149
case "head":150
return setItemAsHead(player, args);151
case "skull":152
return getSkullForName(player, args);153
case "invsee":154
return openInventoryForPlayer(player, args);155
case "info":156
return openInfoBook(player, args);157
case "spawn":158
return teleportToSpawn(player, args);159
case "home":160
return teleportToHome(player, args);161
case "warp":162
return teleportToWarppoint(player, args);163
case "sethome":164
return setHome(player, args);165
case "setwarp":166
return setWarppoint(player, args);167
case "slime":168
return isSlimeChunk(player, args);169
case "r":170
return doReload(player, args);171
case "up":172
return placeBlockBelow(player, args);173
case "e":174
return openEnderChest(player, args);175
case "enderchest":176
return openEnderChest(player, args);177
case "world":178
return teleportToWorld(player, args);179
case "gm":180
return changeGameMode(player);181
default:182
return false;183
}184
}186
return true;187
}189
@EventHandler190
public void onPlayerPortal(final PlayerPortalEvent event)191
{192
final Player player = event.getPlayer();193
final String worldName = player.getWorld().getName();195
if (event.getCause() == TeleportCause.NETHER_PORTAL)196
{197
if (worldName.equals(Constants.Worlds.SURVIVAL))198
{199
final Location location = new Location(200
Bukkit.getWorld(Constants.Worlds.SURVIVAL_NETHER),201
event.getFrom().getBlockX() / 8,202
event.getFrom().getBlockY(),203
event.getFrom().getBlockZ() / 8204
);205
event.setTo(location);206
}207
else if (worldName.equals(Constants.Worlds.SURVIVAL_NETHER))208
{209
final Location location = new Location(210
Bukkit.getWorld(Constants.Worlds.SURVIVAL),211
event.getFrom().getBlockX() * 8,212
event.getFrom().getBlockY(),213
event.getFrom().getBlockZ() * 8214
);215
event.setTo(location);216
}217
}219
if (event.getCause() == TeleportCause.END_PORTAL)220
{221
if (worldName.equals(Constants.Worlds.SURVIVAL))222
{223
final Location location = new Location(224
Bukkit.getWorld(Constants.Worlds.SURVIVAL_THE_END),225
100,226
50,227
0228
);229
event.setTo(location);231
final Block block = location.getBlock();233
for (int x = block.getX() - 2; x <= block.getX() + 2; x++)234
{235
for (int z = block.getZ() - 2; z <= block.getZ() + 2; z++)236
{237
final Block platformBlock = location.getWorld().getBlockAt(x, block.getY() - 1, z);239
if (platformBlock.getType() != Material.OBSIDIAN)240
{241
platformBlock.setType(Material.OBSIDIAN);242
}244
for (int yMod = 1; yMod <= 3; yMod++)245
{246
final Block b = platformBlock.getRelative(BlockFace.UP, yMod);248
if (b.getType() != Material.AIR)249
{250
b.setType(Material.AIR);251
}252
}253
}254
}255
}256
else if (worldName.equals(Constants.Worlds.SURVIVAL_THE_END))257
{258
event.setTo(Bukkit.getWorld(Constants.Worlds.SURVIVAL).getSpawnLocation());259
}260
}261
}263
private boolean setItemAsHead(final Player player, final String[] args)264
{265
final ItemStack item = player.getInventory().getItemInMainHand();266
final ItemStack head = player.getInventory().getHelmet();268
if(head != null && head.getType().equals(Material.SADDLE))269
{270
player.eject();271
}273
player.getInventory().setHelmet(item);274
player.getInventory().setItemInMainHand((new ItemStack(Material.AIR)));276
if(player.getGameMode() == GameMode.SURVIVAL)277
{278
if(head != null)279
{280
player.getInventory().addItem(head);281
}282
}284
return true;285
}287
@SuppressWarnings("deprecation")288
private boolean getSkullForName(final Player player, final String[] args)289
{290
if(!player.isOp())291
{292
player.sendMessage(Constants.Messages.NOT_ENOUGH_PERMISSION);293
return true;294
}296
if(args.length != 1)297
{298
return false;299
}301
final String name = args[0];302
final ItemStack skull = new ItemStack(Material.PLAYER_HEAD);303
final SkullMeta meta = (SkullMeta) skull.getItemMeta();304
meta.setOwner(name);305
skull.setItemMeta(meta);307
player.getInventory().addItem(skull);309
return true;310
}312
private boolean openInventoryForPlayer(final Player player, final String[] args)313
{314
if(args.length == 0)315
{316
return false;317
}319
if(!player.isOp())320
{321
player.sendMessage(Constants.Messages.NOT_ENOUGH_PERMISSION);322
return true;323
}325
final Player target = Bukkit.getPlayer(args[0]);327
if(target == null)328
{329
player.sendMessage(ChatColor.RED + "Player not found!");330
return true;331
}333
player.openInventory(target.getInventory());335
return true;336
}338
private boolean openInfoBook(final Player player, final String[] args)339
{340
final ItemStack book = new ItemStack(Material.WRITTEN_BOOK);341
final BookMeta meta = (BookMeta) book.getItemMeta();342
meta.setTitle("Info");343
meta.setAuthor("Server");344
meta.setPages(config.getInfoPages());345
book.setItemMeta(meta);347
player.openBook(book);349
return true;350
}352
private boolean teleportToSpawn(final Player player, final String[] args)353
{354
final Location location = Bukkit.getWorld("world").getSpawnLocation();356
if(Utils.travelTo(plugin, player, location))357
{358
player.sendMessage(ChatColor.GRAY + "You've been teleported to spawn.");359
}361
return true;362
}364
private boolean teleportToHome(final Player player, final String[] args)365
{366
final Location location = config.getHome(player);368
if(location == null)369
{370
player.sendMessage(ChatColor.RED + "You've don't have a home point.");371
return true;372
}374
if(Utils.travelTo(plugin, player, location))375
{376
player.sendMessage(ChatColor.GRAY + "You've been teleported to your home.");377
}379
return true;380
}382
private boolean teleportToWarppoint(final Player player, final String[] args)383
{384
if(args.length != 1)385
{386
return false;387
}389
final String name = args[0].toLowerCase();390
final Location location = config.getWarp(name);392
if(location == null)393
{394
player.sendMessage(ChatColor.RED + "Warppoint " + name + " doesn't exist!");395
return true;396
}398
if(Utils.travelTo(plugin, player, location))399
{400
player.sendMessage(ChatColor.GRAY + "You've been teleported to warppoint " + name + ".");401
}403
return true;404
}406
private boolean setHome(final Player player, final String[] args)407
{408
try409
{410
config.setHome(player);411
player.sendMessage(ChatColor.YELLOW + "Home point set.");412
}413
catch(Exception ex)414
{415
player.sendMessage(Constants.Messages.FAILED_TO_SAVE_CONFIG_FILE);416
}418
return true;419
}421
private boolean setWarppoint(final Player player, final String[] args)422
{423
if(args.length != 1)424
{425
return false;426
}428
final String name = args[0].toLowerCase();430
if(!Utils.payFee(player, Material.COMPASS, 1))431
{432
player.sendMessage(ChatColor.RED + "The fee for creating a warppoint is 1 compass!");433
return true;434
}436
try437
{438
if(!config.setWarp(name, player.getLocation()))439
{440
player.sendMessage(ChatColor.RED + "Warppoint " + name + " already exists!");441
return true;442
}444
player.sendMessage(ChatColor.YELLOW + "Warppoint " + name + " set.");445
}446
catch(Exception ex)447
{448
player.sendMessage(Constants.Messages.FAILED_TO_SAVE_CONFIG_FILE);449
}451
return true;452
}454
private boolean isSlimeChunk(final Player player, final String[] args)455
{456
boolean isSlimeChunk = player.getLocation().getChunk().isSlimeChunk();458
if(isSlimeChunk)459
{460
player.sendMessage(ChatColor.YELLOW + "This is a slime chunk!");461
return true;462
}463
else464
{465
player.sendMessage(ChatColor.RED + "This is not a slime chunk!");466
return true;467
}468
}470
private boolean doReload(final Player player, final String[] args)471
{472
player.chat("/reload confirm");473
return true;474
}476
private boolean placeBlockBelow(final Player player, final String[] args)477
{478
Location playerLocation = player.getLocation().clone();479
Block blockBelow = playerLocation.add(0, -1, 0).getBlock();481
if(!Utils.isAir(blockBelow.getType()))482
{483
return false;484
}486
if(!player.isOp())487
{488
player.sendMessage(Constants.Messages.NOT_ENOUGH_PERMISSION);489
return true;490
}492
blockBelow.setType(Material.GLASS);494
return true;495
}497
private boolean openEnderChest(final Player player, final String[] args)498
{499
if(args.length != 0)500
{501
if(!player.isOp())502
{503
player.sendMessage(Constants.Messages.NOT_ENOUGH_PERMISSION);504
return true;505
}507
final Player target = Bukkit.getPlayer(args[0]);509
if(target == null)510
{511
player.sendMessage(ChatColor.RED + "Player not found!");512
return true;513
}515
player.openInventory(target.getEnderChest());517
}518
else519
{520
player.openInventory(player.getEnderChest());521
}523
return true;524
}526
private boolean teleportToWorld(final Player player, final String[] args)527
{528
if (args.length != 1)529
{530
return false;531
}533
final String name = args[0].toLowerCase();534
final World world = Bukkit.getServer().getWorld(name);536
if (world == null)537
{538
player.sendMessage(ChatColor.RED + "World " + name + " doesn't exist!");539
return true;540
}542
player.teleport(world.getSpawnLocation());544
if (world.getName().equals(Constants.Worlds.BACKROOMS))545
{546
player.setGameMode(GameMode.ADVENTURE);547
}548
else549
{550
player.setGameMode(GameMode.SURVIVAL);551
}553
player.sendMessage(ChatColor.GRAY + "You've been teleported to world " + name + ".");555
return true;556
}558
private boolean changeGameMode(final Player player)559
{560
if (!Constants.Worlds.DEFAULT.equals(player.getWorld().getName())) {561
player.sendMessage(ChatColor.RED + "This is not a creative world!");562
return true;563
}565
if (GameMode.SURVIVAL.equals(player.getGameMode()))566
{567
player.setGameMode(GameMode.CREATIVE);568
player.sendMessage(ChatColor.GRAY + "Changed gamemode to creative.");569
}570
else571
{572
player.setGameMode(GameMode.SURVIVAL);573
player.sendMessage(ChatColor.GRAY + "Changed gamemode to survival.");574
}576
return true;577
}578
}