diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index e5cc1ba..e22f5bd 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -96,6 +96,7 @@ public class FightSystem extends JavaPlugin { new BlockFadeListener(); new LeaveableArena(); new ClickAnalyzer(); + new BlockPlaceCollision(); new HotbarKit.HotbarKitListener(); new OneShotStateDependent(ArenaMode.All, FightState.PreSchemSetup, () -> Fight.playSound(SWSound.BLOCK_NOTE_PLING.getSound(), 100.0f, 2.0f)); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/BlockPlaceCollision.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/BlockPlaceCollision.java new file mode 100644 index 0000000..57982f6 --- /dev/null +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/BlockPlaceCollision.java @@ -0,0 +1,60 @@ +/* + This file is a part of the SteamWar software. + + Copyright (C) 2023 SteamWar.de-Serverteam + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.steamwar.fightsystem.listener; + +import de.steamwar.fightsystem.ArenaMode; +import de.steamwar.fightsystem.states.FightState; +import de.steamwar.fightsystem.states.StateDependentListener; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockPlaceEvent; + +public class BlockPlaceCollision implements Listener { + + public BlockPlaceCollision() { + new StateDependentListener(ArenaMode.All, FightState.All, this); + } + + @EventHandler + public void onBlockPlace(BlockPlaceEvent event) { + Block block = event.getBlock(); + if(!block.getType().isSolid()) + return; + + // Hitbox size: 0.6xz, 1.8y, 1.5y when sneaking + Player player = event.getPlayer(); + Location min = player.getLocation().add(-0.3, 0, -0.3); + Location max = player.getLocation().add(0.3, player.isSneaking() ? 1.5 : 1.8, 0.3); + + Location blockmin = block.getLocation(); + Location blockmax = block.getLocation().add(1.0, 1.0, 1.0); + if( + max.getX() <= blockmin.getX() || min.getX() >= blockmax.getX() || + max.getY() <= blockmin.getY() || min.getY() >= blockmax.getY() || + max.getZ() <= blockmin.getZ() || min.getZ() >= blockmax.getZ() + ) + return; + + event.setCancelled(true); + } +}