/src/com/nickeddy/MinecartLauncher/MinecartLauncher.java

https://github.com/nickeddy/MinecartLauncher · Java · 153 lines · 117 code · 23 blank · 13 comment · 26 complexity · edba1a34df6904ad65a9ce9abcc3429f MD5 · raw file

  1. package com.nickeddy.MinecartLauncher;
  2. import java.util.HashSet;
  3. import java.util.logging.Logger;
  4. import org.bukkit.Location;
  5. import org.bukkit.World;
  6. import org.bukkit.command.Command;
  7. import org.bukkit.command.CommandSender;
  8. import org.bukkit.entity.Minecart;
  9. import org.bukkit.entity.Player;
  10. import org.bukkit.entity.Vehicle;
  11. import org.bukkit.event.Event;
  12. import org.bukkit.event.vehicle.VehicleEntityCollisionEvent;
  13. import org.bukkit.event.vehicle.VehicleExitEvent;
  14. import org.bukkit.event.vehicle.VehicleListener;
  15. import org.bukkit.plugin.PluginManager;
  16. import org.bukkit.plugin.java.JavaPlugin;
  17. import org.bukkit.util.Vector;
  18. public class MinecartLauncher extends JavaPlugin {
  19. private Logger log = Logger.getLogger("Minecraft");
  20. private HashSet<Minecart> minecarts = new HashSet<Minecart>();
  21. private MCLVehicleListener mclVehicleListener = new MCLVehicleListener(this);
  22. public void onEnable() {
  23. log.info(this.getDescription().getName() + " "
  24. + this.getDescription().getVersion() + " enabled!");
  25. PluginManager pluginManager = this.getServer().getPluginManager();
  26. pluginManager.registerEvent(Event.Type.VEHICLE_EXIT,
  27. mclVehicleListener, Event.Priority.Normal, this);
  28. pluginManager.registerEvent(Event.Type.VEHICLE_COLLISION_ENTITY,
  29. mclVehicleListener, Event.Priority.Normal, this);
  30. }
  31. public void onDisable() {
  32. log.info(this.getDescription().getName() + " "
  33. + this.getDescription().getVersion() + " disabled!");
  34. minecarts.clear();// clear the minecarts
  35. }
  36. public boolean onCommand(CommandSender sender, Command command,
  37. String commandLabel, String[] args) {
  38. /*
  39. * ***********Launch************
  40. */
  41. if (command.getName().equalsIgnoreCase("launch")) {
  42. if (canLaunch(sender)) {
  43. Player player = (Player) sender;
  44. World world = player.getWorld();
  45. int blockPlayerIsOn = world.getBlockTypeIdAt(player
  46. .getLocation());
  47. // if block player is on is a rail, powered rail, or detector
  48. // rail...
  49. if (blockPlayerIsOn == 27 || blockPlayerIsOn == 28
  50. || blockPlayerIsOn == 66) {
  51. Vector v = getLaunchDirection(player.getLocation());
  52. // spawn a minecart and put the player in it, and then set
  53. // the velocity.
  54. Minecart minecart = world.spawn(player.getLocation(),
  55. Minecart.class);
  56. minecart.setPassenger(player);
  57. minecart.setVelocity(v);
  58. this.minecarts.add(minecart);
  59. return true;
  60. } else {
  61. sender.sendMessage("You must be on a minecart rail!");
  62. return false;
  63. }
  64. } else {
  65. sender.sendMessage("You don't have permission to do that!");
  66. return false;
  67. }
  68. } else {
  69. return false;
  70. }
  71. }
  72. private Vector getLaunchDirection(Location location) {
  73. Vector v = location.getDirection().clone();
  74. double rotation = (location.getYaw() - 90.0D) % 360.0D;
  75. if (rotation < 0.0D) {
  76. rotation += 360.0D;
  77. }
  78. // calculate north/west/east/south
  79. if (rotation <= 45.0 || rotation > 315.0) {
  80. // send north
  81. v.setX(-8);
  82. } else if (rotation > 45.0 && rotation <= 135.0) {
  83. // send east
  84. v.setZ(-8);
  85. } else if (rotation > 135.0 && rotation <= 225.0) {
  86. // send south
  87. v.setX(8);
  88. } else if (rotation > 225.0 && rotation <= 315.0) {
  89. // send west
  90. v.setZ(8);
  91. }
  92. return v;
  93. }
  94. private boolean canLaunch(CommandSender sender) {
  95. return sender.hasPermission("nickeddy.MinecartLauncher.launch");
  96. }
  97. private class MCLVehicleListener extends VehicleListener {
  98. MinecartLauncher launcher;
  99. public MCLVehicleListener(MinecartLauncher launcher) {
  100. this.launcher = launcher;
  101. }
  102. @Override
  103. public void onVehicleEntityCollision(VehicleEntityCollisionEvent event) {
  104. if (event.getVehicle() instanceof Minecart
  105. && event.getEntity() instanceof Minecart) {
  106. // TODO prevent minecart collisions!
  107. event.setCollisionCancelled(true);
  108. event.setCancelled(true);
  109. Location vehicleLocation = event.getVehicle().getLocation()
  110. .clone();
  111. Location entityLocation = event.getEntity().getLocation()
  112. .clone();
  113. Vector vehicleVector = getLaunchDirection(vehicleLocation);
  114. Vector entityVector = getLaunchDirection(entityLocation);
  115. event.getEntity().teleport(vehicleLocation);
  116. event.getVehicle().teleport(entityLocation);
  117. event.getVehicle().setVelocity(vehicleVector);
  118. event.getEntity().setVelocity(entityVector);
  119. }
  120. }
  121. @Override
  122. public void onVehicleExit(VehicleExitEvent event) {
  123. Vehicle vehicle = event.getVehicle();
  124. if (launcher.minecarts.contains(vehicle)) {
  125. vehicle.remove();
  126. launcher.minecarts.remove(vehicle);
  127. }
  128. }
  129. }
  130. }