A feature-rich Minecraft plugin which enhances gaming experience
git clone git://soophie.de/poppy
blob: ed052148acabdf2beefb45fadea31c279099f424 (14708 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("creative")114
.type(WorldType.FLAT)115
.generateStructures(false)116
.createWorld();118
new WorldCreator("survival")119
.type(WorldType.NORMAL)120
.generateStructures(true)121
.createWorld();123
new WorldCreator("survival_nether")124
.environment(Environment.NETHER)125
.generateStructures(true)126
.createWorld();128
new WorldCreator("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();194
if (event.getCause() == TeleportCause.NETHER_PORTAL);195
{196
if (player.getWorld().getName().equals("survival"))197
{198
event.setTo(new Location(Bukkit.getWorld("survival_nether"), event.getFrom().getBlockX() / 8, event.getFrom().getBlockY(), event.getFrom().getBlockZ() / 8));199
}201
else if (player.getWorld().getName().equals("survival_nether"))202
{203
event.setTo(new Location(Bukkit.getWorld("survival"), event.getFrom().getBlockX() * 8, event.getFrom().getBlockY(), event.getFrom().getBlockZ() * 8));204
}205
}207
// TODO ugly code quick fix only!!!209
if (event.getCause() == TeleportCause.END_PORTAL)210
{211
if (player.getWorld().getName().equals("survival")) {212
Location loc = new Location(Bukkit.getWorld("survival_the_end"), 100, 50, 0);213
event.setTo(loc);214
Block block = loc.getBlock();215
for (int x = block.getX() - 2; x <= block.getX() + 2; x++) {216
for (int z = block.getZ() - 2; z <= block.getZ() + 2; z++) {217
Block platformBlock = loc.getWorld().getBlockAt(x, block.getY() - 1, z);218
if (platformBlock.getType() != Material.OBSIDIAN) {219
platformBlock.setType(Material.OBSIDIAN);220
}221
for (int yMod = 1; yMod <= 3; yMod++) {222
Block b = platformBlock.getRelative(BlockFace.UP, yMod);223
if (b.getType() != Material.AIR) {224
b.setType(Material.AIR);225
}226
}227
}228
}229
} else if (player.getWorld().getName().equals("survival_the_end")) {230
event.setTo(Bukkit.getWorld("survival").getSpawnLocation());231
}232
}233
}235
private boolean setItemAsHead(final Player player, final String[] args)236
{237
final ItemStack item = player.getInventory().getItemInMainHand();238
final ItemStack head = player.getInventory().getHelmet();240
if(head != null && head.getType().equals(Material.SADDLE))241
{242
player.eject();243
}245
player.getInventory().setHelmet(item);246
player.getInventory().setItemInMainHand((new ItemStack(Material.AIR)));248
if(player.getGameMode() == GameMode.SURVIVAL)249
{250
if(head != null)251
{252
player.getInventory().addItem(head);253
}254
}256
return true;257
}259
@SuppressWarnings("deprecation")260
private boolean getSkullForName(final Player player, final String[] args)261
{262
if(!player.isOp())263
{264
player.sendMessage(Constants.Messages.NOT_ENOUGH_PERMISSION);265
return true;266
}268
if(args.length != 1)269
{270
return false;271
}273
final String name = args[0];274
final ItemStack skull = new ItemStack(Material.PLAYER_HEAD);275
final SkullMeta meta = (SkullMeta) skull.getItemMeta();276
meta.setOwner(name);277
skull.setItemMeta(meta);279
player.getInventory().addItem(skull);281
return true;282
}284
private boolean openInventoryForPlayer(final Player player, final String[] args)285
{286
if(args.length == 0)287
{288
return false;289
}291
if(!player.isOp())292
{293
player.sendMessage(Constants.Messages.NOT_ENOUGH_PERMISSION);294
return true;295
}297
final Player target = Bukkit.getPlayer(args[0]);299
if(target == null)300
{301
player.sendMessage(ChatColor.RED + "Player not found!");302
return true;303
}305
player.openInventory(target.getInventory());307
return true;308
}310
private boolean openInfoBook(final Player player, final String[] args)311
{312
final ItemStack book = new ItemStack(Material.WRITTEN_BOOK);313
final BookMeta meta = (BookMeta) book.getItemMeta();314
meta.setTitle("Info");315
meta.setAuthor("Server");316
meta.setPages(config.getInfoPages());317
book.setItemMeta(meta);319
player.openBook(book);321
return true;322
}324
private boolean teleportToSpawn(final Player player, final String[] args)325
{326
final Location location = Bukkit.getWorld("world").getSpawnLocation();328
if(Utils.travelTo(plugin, player, location))329
{330
player.sendMessage(ChatColor.GRAY + "You've been teleported to spawn.");331
}333
return true;334
}336
private boolean teleportToHome(final Player player, final String[] args)337
{338
final Location location = config.getHome(player);340
if(location == null)341
{342
player.sendMessage(ChatColor.RED + "You've don't have a home point.");343
return true;344
}346
if(Utils.travelTo(plugin, player, location))347
{348
player.sendMessage(ChatColor.GRAY + "You've been teleported to your home.");349
}351
return true;352
}354
private boolean teleportToWarppoint(final Player player, final String[] args)355
{356
if(args.length != 1)357
{358
return false;359
}361
final String name = args[0].toLowerCase();362
final Location location = config.getWarp(name);364
if(location == null)365
{366
player.sendMessage(ChatColor.RED + "Warppoint " + name + " doesn't exist!");367
return true;368
}370
if(Utils.travelTo(plugin, player, location))371
{372
player.sendMessage(ChatColor.GRAY + "You've been teleported to warppoint " + name + ".");373
}375
return true;376
}378
private boolean setHome(final Player player, final String[] args)379
{380
try381
{382
config.setHome(player);383
player.sendMessage(ChatColor.YELLOW + "Home point set.");384
}385
catch(Exception ex)386
{387
player.sendMessage(Constants.Messages.FAILED_TO_SAVE_CONFIG_FILE);388
}390
return true;391
}393
private boolean setWarppoint(final Player player, final String[] args)394
{395
if(args.length != 1)396
{397
return false;398
}400
final String name = args[0].toLowerCase();402
if(!Utils.payFee(player, Material.COMPASS, 1))403
{404
player.sendMessage(ChatColor.RED + "The fee for creating a warppoint is 1 compass!");405
return true;406
}408
try409
{410
if(!config.setWarp(name, player.getLocation()))411
{412
player.sendMessage(ChatColor.RED + "Warppoint " + name + " already exists!");413
return true;414
}416
player.sendMessage(ChatColor.YELLOW + "Warppoint " + name + " set.");417
}418
catch(Exception ex)419
{420
player.sendMessage(Constants.Messages.FAILED_TO_SAVE_CONFIG_FILE);421
}423
return true;424
}426
private boolean isSlimeChunk(final Player player, final String[] args)427
{428
boolean isSlimeChunk = player.getLocation().getChunk().isSlimeChunk();430
if(isSlimeChunk)431
{432
player.sendMessage(ChatColor.YELLOW + "This is a slime chunk!");433
return true;434
}435
else436
{437
player.sendMessage(ChatColor.RED + "This is not a slime chunk!");438
return true;439
}440
}442
private boolean doReload(final Player player, final String[] args)443
{444
player.chat("/reload confirm");445
return true;446
}448
private boolean placeBlockBelow(final Player player, final String[] args)449
{450
Location playerLocation = player.getLocation().clone();451
Block blockBelow = playerLocation.add(0, -1, 0).getBlock();453
if(!Utils.isAir(blockBelow.getType()))454
{455
return false;456
}458
if(!player.isOp())459
{460
player.sendMessage(Constants.Messages.NOT_ENOUGH_PERMISSION);461
return true;462
}464
blockBelow.setType(Material.GLASS);466
return true;467
}469
private boolean openEnderChest(final Player player, final String[] args)470
{471
if(args.length != 0)472
{473
if(!player.isOp())474
{475
player.sendMessage(Constants.Messages.NOT_ENOUGH_PERMISSION);476
return true;477
}479
final Player target = Bukkit.getPlayer(args[0]);481
if(target == null)482
{483
player.sendMessage(ChatColor.RED + "Player not found!");484
return true;485
}487
player.openInventory(target.getEnderChest());489
}490
else491
{492
player.openInventory(player.getEnderChest());493
}495
return true;496
}498
private boolean teleportToWorld(final Player player, final String[] args)499
{500
if (args.length != 1)501
{502
return false;503
}505
final String name = args[0].toLowerCase();506
final World world = Bukkit.getServer().getWorld(name);508
if (world == null)509
{510
player.sendMessage(ChatColor.RED + "World " + name + " doesn't exist!");511
return true;512
}514
player.teleport(world.getSpawnLocation());515
player.setGameMode(GameMode.SURVIVAL);516
player.sendMessage(ChatColor.GRAY + "You've been teleported to world " + name + ".");518
return true;519
}521
private boolean changeGameMode(final Player player)522
{523
if (!"world".equals(player.getWorld().getName())) {524
player.sendMessage(ChatColor.RED + "This is not a creative world!");525
return true;526
}528
if (GameMode.SURVIVAL.equals(player.getGameMode()))529
{530
player.setGameMode(GameMode.CREATIVE);531
player.sendMessage(ChatColor.GRAY + "Changed gamemode to creative.");532
}533
else534
{535
player.setGameMode(GameMode.SURVIVAL);536
player.sendMessage(ChatColor.GRAY + "Changed gamemode to survival.");537
}539
return true;540
}541
}