Advertisement
JackOUT

Untitled

Mar 11th, 2023
728
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.72 KB | None | 0 0
  1. package games.coob.laserturrets.tools;
  2.  
  3. import games.coob.laserturrets.model.TurretRegistry;
  4. import games.coob.laserturrets.sequence.Sequence;
  5. import games.coob.laserturrets.settings.Settings;
  6. import games.coob.laserturrets.settings.TurretSettings;
  7. import games.coob.laserturrets.util.Lang;
  8. import games.coob.laserturrets.util.TurretUtil;
  9. import org.bukkit.Location;
  10. import org.bukkit.block.Block;
  11. import org.bukkit.block.BlockFace;
  12. import org.bukkit.entity.Player;
  13. import org.bukkit.event.inventory.ClickType;
  14. import org.bukkit.inventory.ItemStack;
  15. import org.bukkit.metadata.FixedMetadataValue;
  16. import org.mineacademy.fo.Common;
  17. import org.mineacademy.fo.Messenger;
  18. import org.mineacademy.fo.menu.model.ItemCreator;
  19. import org.mineacademy.fo.menu.tool.Tool;
  20. import org.mineacademy.fo.plugin.SimplePlugin;
  21. import org.mineacademy.fo.remain.CompMaterial;
  22. import org.mineacademy.fo.visual.VisualTool;
  23.  
  24. import java.util.ArrayList;
  25. import java.util.List;
  26. import java.util.Objects;
  27.  
  28. public abstract class TurretTool extends VisualTool {
  29.  
  30.     private final String turretType;
  31.  
  32.     private final String displayName;
  33.  
  34.     private final boolean oneUse;
  35.  
  36.     /**
  37.      * The actual item stored here for maximum performance
  38.      */
  39.     private ItemStack item;
  40.  
  41.     protected TurretTool(final String turretType, final String displayName, final boolean oneUse) {
  42.         this.turretType = turretType;
  43.         this.displayName = displayName;
  44.         this.oneUse = oneUse;
  45.     }
  46.  
  47.     /**
  48.      * @see Tool#getItem()
  49.      */
  50.     @Override
  51.     public ItemStack getItem() {
  52.         final TurretSettings settings = TurretSettings.findByName(this.turretType);
  53.  
  54.         if (settings != null)
  55.             item = ItemCreator.of(settings.getToolItem())
  56.                     .name(this.oneUse ? Lang.of("Tool.Title_Infinite_Use_Tool", "{turretType}", TurretUtil.capitalizeWord(this.displayName)) : Lang.of("Tool.Title_1_Use_Tool", "{turretType}", TurretUtil.capitalizeWord(this.displayName)))
  57.                     .lore(this.oneUse ? Lang.ofArray("Tool.Lore_1_Use_Tool") : Lang.ofArray("Tool.Lore_Infinite_Use_Tool"))
  58.                     .glow(true).make();
  59.  
  60.         return item;
  61.     }
  62.  
  63.     @Override
  64.     protected void handleBlockClick(final Player player, final ClickType click, final Block block) {
  65.         final String type = this.turretType;
  66.         final TurretRegistry registry = TurretRegistry.getInstance();
  67.         final Location location = block.getLocation();
  68.         final Location closestLocation = getClosestLocation(location, registry.getTurretLocations());
  69.         final TurretSettings settings = TurretSettings.findByName(type);
  70.         final Block blockUp = block.getRelative(BlockFace.UP);
  71.  
  72.         if (registry.getTurretsOfType(type).size() >= settings.getTurretLimit() && !registry.isRegistered(block)) {
  73.             Messenger.error(player, Lang.of("Tool.Turret_Limit_Reached", "{turretType}", this.displayName, "{turretLimit}", settings.getTurretLimit()));
  74.             return;
  75.         }
  76.  
  77.         if (!block.getType().isSolid() || (!CompMaterial.isAir(blockUp) && !registry.isRegistered(block))) {
  78.             Messenger.error(player, Lang.of("Tool.Turret_Cannot_Be_Placed"));
  79.             return;
  80.         }
  81.  
  82.         if (registry.isRegistered(block) && !Objects.equals(registry.getTurretByBlock(block).getType(), this.turretType)) {
  83.             Messenger.error(player, Lang.of("Tool.Block_Is_Already_Turret"));
  84.             return;
  85.         }
  86.  
  87.         if (closestLocation != null && !registry.isRegistered(block) && Settings.TurretSection.TURRET_MIN_DISTANCE > closestLocation.distance(location)) {
  88.             Messenger.error(player, Lang.of("Tool.Turret_Min_Distance_Breached", "{distance}", Settings.TurretSection.TURRET_MIN_DISTANCE));
  89.             return;
  90.         }
  91.  
  92.         if (block.hasMetadata("IsCreating") || player.hasMetadata("CreatingTurret")) {
  93.             Messenger.error(player, Lang.of("Tool.Wait_Before_Place"));
  94.             return;
  95.         }
  96.  
  97.         final boolean oneUse = this.oneUse;
  98.         final boolean isTurret = registry.isTurretOfType(block, type);
  99.  
  100.         if (isTurret && !oneUse) {
  101.             registry.unregister(block);
  102.             Messenger.success(player, Lang.of("Tool.Unregistered_Turret_Message", "{turretType}", this.displayName, "{location}", Common.shortLocation(location)));
  103.         } else if (!isTurret) {
  104.             if (oneUse)
  105.                 player.getInventory().removeItem(this.item);
  106.  
  107.             player.setMetadata("CreatingTurret", new FixedMetadataValue(SimplePlugin.getInstance(), ""));
  108.             block.setMetadata("IsCreating", new FixedMetadataValue(SimplePlugin.getInstance(), ""));
  109.             Sequence.TURRET_CREATION(player, block, type).start(location);
  110.             Messenger.success(player, Lang.of("Tool.Registered_Turret_Message", "{turretType}", this.displayName, "{location}", Common.shortLocation(location)));
  111.         }
  112.     }
  113.  
  114.     private Location getClosestLocation(final Location centerLocation, final List<Location> locations) { // TODO add to foundation
  115.         Location closestLocation = null;
  116.  
  117.         for (final Location location : locations) {
  118.             if (!location.getWorld().equals(centerLocation.getWorld()))
  119.                 continue;
  120.  
  121.             if (closestLocation == null || (location.distanceSquared(centerLocation) < closestLocation.distanceSquared(centerLocation)))
  122.                 closestLocation = location;
  123.         }
  124.  
  125.         return closestLocation;
  126.     }
  127.  
  128.     @Override
  129.     protected List<Location> getVisualizedPoints(final Player player) {
  130.         if (!this.oneUse)
  131.             return TurretRegistry.getInstance().getTurretLocationsOfType(this.turretType);
  132.  
  133.         return new ArrayList<>();
  134.     }
  135.  
  136.     @Override
  137.     protected String getBlockName(final Block block, final Player player) {
  138.         if (!this.oneUse)
  139.             return Lang.of("Tool.Registered_Turret_Hologram", "{turretType}", TurretUtil.capitalizeWord(this.displayName));
  140.  
  141.         return null;
  142.     }
  143.  
  144.     @Override
  145.     protected CompMaterial getBlockMask(final Block block, final Player player) {
  146.         return CompMaterial.EMERALD_BLOCK;
  147.     }
  148.  
  149.     /**
  150.      * Cancel the event so that we don't destroy blocks when selecting them
  151.      *
  152.      * @see Tool#autoCancel()
  153.      */
  154.     @Override
  155.     protected boolean autoCancel() {
  156.         return true;
  157.     }
  158. }
  159.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement