diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocks.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocks.java index 92ec72c..59c9d09 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocks.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocks.java @@ -2,9 +2,12 @@ package eu.mhsl.minecraft.pixelblocks; import eu.mhsl.minecraft.pixelblocks.commands.ChessCommand; import eu.mhsl.minecraft.pixelblocks.commands.CreatePixelBlockCommand; +import eu.mhsl.minecraft.pixelblocks.commands.ExitWorldCommand; +import eu.mhsl.minecraft.pixelblocks.listeners.PlayerInteractListener; import eu.mhsl.minecraft.pixelblocks.listeners.PlayerJumpListener; import org.bukkit.plugin.java.JavaPlugin; +import java.io.File; import java.util.Objects; public final class PixelBlocks extends JavaPlugin { @@ -14,9 +17,14 @@ public final class PixelBlocks extends JavaPlugin { public void onEnable() { PixelBlocks.plugin = this; this.getLogger().info("Hello World"); + new File(plugin.getDataFolder().getPath() + "/Maps").mkdir(); + getServer().getPluginManager().registerEvents(new PlayerJumpListener(), this); + getServer().getPluginManager().registerEvents(new PlayerInteractListener(), this); + Objects.requireNonNull(getCommand("chess")).setExecutor(new ChessCommand()); Objects.requireNonNull(getCommand("createpixelblock")).setExecutor(new CreatePixelBlockCommand()); + Objects.requireNonNull(getCommand("exitworld")).setExecutor(new ExitWorldCommand()); } @Override diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/CreatePixelBlockCommand.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/CreatePixelBlockCommand.java index 2a7128d..ccf7df5 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/CreatePixelBlockCommand.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/CreatePixelBlockCommand.java @@ -1,6 +1,7 @@ package eu.mhsl.minecraft.pixelblocks.commands; import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlock; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -13,10 +14,10 @@ public class CreatePixelBlockCommand implements CommandExecutor { public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { if(sender instanceof Player p) { Location playerLocation = p.getLocation(); - PixelBlock pixelBlock = new PixelBlock(playerLocation, 16); + PixelBlock pixelBlock = new PixelBlock(playerLocation, p.getUniqueId(), 16); pixelBlock.place(playerLocation); } - return true; + return(true); } } diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/ExitWorldCommand.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/ExitWorldCommand.java new file mode 100644 index 0000000..fc25433 --- /dev/null +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/ExitWorldCommand.java @@ -0,0 +1,34 @@ +package eu.mhsl.minecraft.pixelblocks.commands; + +import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlock; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class ExitWorldCommand implements CommandExecutor { + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(sender instanceof Player p) { + World playerWorld = p.getWorld(); + World[] standardWorlds = {Bukkit.getWorlds().get(0), Bukkit.getWorlds().get(1), Bukkit.getWorlds().get(2)}; + + if(Arrays.stream(standardWorlds).toList().contains(playerWorld)) { + Location newLocation = PixelBlock.placedBlocks.stream() + .filter(pixelBlock -> pixelBlock.owner == p.getUniqueId()) + .findFirst() + .orElseThrow() + .lastEntryLocation; +// p.teleport(Bukkit.getServer().getWorlds().getFirst().getSpawnLocation()); + } + } + + return(true); + } +} diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerInteractListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerInteractListener.java new file mode 100644 index 0000000..ac0b841 --- /dev/null +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerInteractListener.java @@ -0,0 +1,84 @@ +package eu.mhsl.minecraft.pixelblocks.listeners; + +import eu.mhsl.minecraft.pixelblocks.PixelBlocks; +import eu.mhsl.minecraft.pixelblocks.pixelblock.Pixel; +import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlock; +import io.papermc.paper.event.player.PrePlayerAttackEntityEvent; +import io.papermc.paper.math.Position; +import org.bukkit.*; +import org.bukkit.entity.Blaze; +import org.bukkit.entity.BlockDisplay; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Interaction; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; + +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +import static eu.mhsl.minecraft.pixelblocks.PixelBlocks.plugin; + +public class PlayerInteractListener implements Listener { + @EventHandler + static void onPlayerInteract(PlayerInteractEvent event) { + if(event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock() != null) { + if(event.getClickedBlock().getType() == Material.GLASS) { +// final WorldCreator worldCreator = new WorldCreator(plugin.getDataFolder().getPath()+"/"+event.getPlayer().getUniqueId()); +// worldCreator.type(WorldType.FLAT); +// +// World newWorld = Bukkit.createWorld(worldCreator); +// +// event.getPlayer().teleport(newWorld.getSpawnLocation()); + } + } + } + + @EventHandler + static void onPlayerInteractEntity(PlayerInteractEntityEvent event) { + if(event.getRightClicked() instanceof Interaction) { + Location interactionLocation = event.getRightClicked().getLocation().add(0, PixelBlock.hitboxOffset+0.5, 0).toBlockLocation(); + interactionLocation.setYaw(0); + interactionLocation.setPitch(0); + UUID playerUID = event.getPlayer().getUniqueId(); + PixelBlock pixelBlock = PixelBlock.placedBlocks.stream() + .filter(block -> block.pixelBlockLocation.equals(interactionLocation)) + .findFirst() + .orElseThrow(); + UUID blockOwner = pixelBlock.owner; + + if(playerUID == blockOwner) { + pixelBlock.lastEntryLocation = event.getPlayer().getLocation(); + + final WorldCreator worldCreator = new WorldCreator(plugin.getDataFolder().getPath()+"/"+event.getPlayer().getUniqueId()); + worldCreator.type(WorldType.FLAT); + World newWorld = Bukkit.createWorld(worldCreator); + + event.getPlayer().teleport(newWorld.getSpawnLocation()); + } else { + event.getPlayer().sendMessage("This Block is not yours!"); + } + } + } + + @EventHandler + static void onPlayerAttackEntity(PrePlayerAttackEntityEvent event) { + if(event.getAttacked() instanceof Interaction) { + Location blockLocation = event.getAttacked().getLocation().add(0, PixelBlock.hitboxOffset+0.5, 0).toBlockLocation(); + blockLocation.setYaw(0); + blockLocation.setPitch(0); + + Bukkit.getScheduler().runTask( + PixelBlocks.plugin, + () -> PixelBlock.placedBlocks.stream() +// .filter(pixelBlock -> pixelBlock.pixelBlockLocation.distance(blockLocation) < 0.5) + .filter(pixelBlock -> pixelBlock.pixelBlockLocation.equals(blockLocation)) + .findFirst() + .orElseThrow() + .remove()); + } + } +} diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/Pixel.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/Pixel.java index 6529a09..28e4984 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/Pixel.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/Pixel.java @@ -3,15 +3,21 @@ package eu.mhsl.minecraft.pixelblocks.pixelblock; import org.bukkit.Location; import org.bukkit.block.data.BlockData; import org.bukkit.entity.BlockDisplay; +import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.util.Transformation; +import java.util.Objects; +import java.util.UUID; + public class Pixel { Location relativeLocation; BlockData blockData; double scale; double offset; + public UUID uuid; + public Pixel(Location relativeLocation, BlockData blockData, double scale, double offset) { this.relativeLocation = new Location( relativeLocation.getWorld(), @@ -41,5 +47,12 @@ public class Pixel { Transformation transform = bd.getTransformation(); transform.getScale().set(scale); bd.setTransformation(transform); + + this.uuid = bd.getUniqueId(); + } + + public void remove() { + Entity pixelEntity = this.relativeLocation.getWorld().getEntity(this.uuid); + if(pixelEntity != null) pixelEntity.remove(); } } diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java index f29bd6d..ccdf888 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java @@ -5,31 +5,62 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.data.BlockData; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Interaction; import java.util.ArrayList; +import java.util.List; +import java.util.UUID; public class PixelBlock { - double pixelsPerBlock; - ArrayList<Pixel> pixels = new ArrayList<>(); + public static List<PixelBlock> placedBlocks = new ArrayList<>(); - public PixelBlock(Location originLocation, double pixelsPerBlock) { + public Location pixelBlockLocation; + double pixelsPerBlock; + public ArrayList<Pixel> pixels = new ArrayList<>(); + public Interaction hitbox; + + public static float hitboxOffset = 0.005F; + + public Location lastEntryLocation; + public UUID owner; + + public PixelBlock(Location originLocation, UUID owner, double pixelsPerBlock) { + PixelBlock.placedBlocks.add(this); + this.pixelBlockLocation = originLocation.toBlockLocation(); + this.pixelBlockLocation.setYaw(0); + this.pixelBlockLocation.setPitch(0); this.pixelsPerBlock = pixelsPerBlock; + this.owner = owner; for (int x = 0; x < pixelsPerBlock; x++) { for (int y = 0; y < pixelsPerBlock; y++) { for (int z = 0; z < pixelsPerBlock; z++) { Location relativeLocation = new Location(originLocation.getWorld(), x, y, z); - Location blockLocation = originLocation.toBlockLocation().clone().add(relativeLocation); + Location blockLocation = pixelBlockLocation.clone().add(relativeLocation); BlockData block = blockLocation.getBlock().getBlockData(); if(block.getMaterial() != Material.AIR) { - Pixel newPixel = new Pixel(relativeLocation, block, (1/pixelsPerBlock)-0.0001, 0.00005); + Pixel newPixel = new Pixel(relativeLocation, block, (1/pixelsPerBlock)-0.0001, 0.00005*pixelsPerBlock); pixels.add(newPixel); } } } } + pixelBlockLocation.getBlock().setType(Material.GLASS); + +// BlockDisplay bd = (BlockDisplay) spawnLocation.getWorld().spawnEntity( +// spawnLocation, +// EntityType.BLOCK_DISPLAY +// ); + + hitbox = (Interaction) pixelBlockLocation.getWorld().spawnEntity( + pixelBlockLocation.clone().add(0.5, -hitboxOffset, 0.5), + EntityType.INTERACTION + ); + hitbox.setInteractionHeight(1F + 2*hitboxOffset); + hitbox.setInteractionWidth(1F + 2*hitboxOffset); } public void place(Location placeLocation) { @@ -39,4 +70,11 @@ public class PixelBlock { } }); } + + public void remove() { + this.pixels.forEach(Pixel::remove); + hitbox.remove(); + pixelBlockLocation.getBlock().setType(Material.AIR); + placedBlocks.remove(this); + } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 97acfd5..a071363 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -5,3 +5,4 @@ api-version: '1.21' commands: chess: createpixelblock: + exitworld: \ No newline at end of file