diff --git a/src/main/java/org/ultramine/server/UltramineServerConfig.java b/src/main/java/org/ultramine/server/UltramineServerConfig.java index 17b736d..7a89438 100644 --- a/src/main/java/org/ultramine/server/UltramineServerConfig.java +++ b/src/main/java/org/ultramine/server/UltramineServerConfig.java @@ -118,6 +118,7 @@ public AutoBroacastConf autobroadcast = new AutoBroacastConf(); public AutoDebugInfoConf autoDebugInfo = new AutoDebugInfoConf(); public AutoBackupConf autobackup = new AutoBackupConf(); + public WarpProtectionEntry[] warpProtection = new WarpProtectionEntry[0]; public static class AutoBroacastConf { @@ -142,6 +143,18 @@ public List worlds = null; public boolean notifyPlayers = true; } + + public static class WarpProtectionEntry + { + public String name; + public int radius; + public boolean changeBlocks; + public boolean useItems; + public boolean userBlocks; + public boolean pvp; + public boolean mobSpawn; + public boolean mobDamage; + } } public static class DatabaseConf diff --git a/src/main/java/org/ultramine/server/UltramineServerModContainer.java b/src/main/java/org/ultramine/server/UltramineServerModContainer.java index 770d895..1f23dd4 100644 --- a/src/main/java/org/ultramine/server/UltramineServerModContainer.java +++ b/src/main/java/org/ultramine/server/UltramineServerModContainer.java @@ -42,6 +42,7 @@ import org.ultramine.server.data.ServerDataLoader; import org.ultramine.server.data.player.PlayerCoreData; import org.ultramine.server.tools.ButtonCommand; +import org.ultramine.server.tools.WarpProtection; public class UltramineServerModContainer extends DummyModContainer { @@ -116,7 +117,10 @@ e.getPermissionHandler().createGroup(OpPermissionProxySet.OP_GROUP, "*"); if(e.getSide().isServer()) + { buttonCommand.load(e); + FMLCommonHandler.instance().bus().register(new WarpProtection()); + } } @Subscribe diff --git a/src/main/java/org/ultramine/server/tools/WarpProtection.java b/src/main/java/org/ultramine/server/tools/WarpProtection.java new file mode 100644 index 0000000..e5f4492 --- /dev/null +++ b/src/main/java/org/ultramine/server/tools/WarpProtection.java @@ -0,0 +1,114 @@ +package org.ultramine.server.tools; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.MathHelper; +import net.minecraftforge.event.entity.living.LivingAttackEvent; +import net.minecraftforge.event.entity.living.LivingSpawnEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.world.BlockEvent; + +import org.ultramine.server.ConfigurationHandler; +import org.ultramine.server.PermissionHandler; +import org.ultramine.server.UltramineServerConfig.ToolsConf.WarpProtectionEntry; +import org.ultramine.server.util.WarpLocation; + +import cpw.mods.fml.common.eventhandler.Event; +import cpw.mods.fml.common.eventhandler.EventPriority; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.SERVER) +public class WarpProtection +{ + private boolean isInside(WarpLocation warp, int dim, int x, int z, int radius) + { + return warp.dimension == dim && Math.abs(warp.x - x) < radius && Math.abs(warp.z - z) < radius; + } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onBreakEvent(BlockEvent.BreakEvent e) + { + if(!e.getPlayer().isEntityPlayerMP() || ((EntityPlayerMP)e.getPlayer()).playerNetServerHandler == null) + return; + if(!PermissionHandler.getInstance().has(e.getPlayer(), "ability.admin.breakprivate")) + { + for(WarpProtectionEntry warpConf : ConfigurationHandler.getServerConfig().tools.warpProtection) + { + if(warpConf.changeBlocks) + { + WarpLocation warp = MinecraftServer.getServer().getConfigurationManager().getDataLoader().getWarp(warpConf.name); + if(warp != null && isInside(warp, e.getPlayer().dimension, e.x, e.z, warpConf.radius)) + e.setCanceled(true); + } + } + } + } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onPlayerInteractEvent(PlayerInteractEvent e) + { + if(!PermissionHandler.getInstance().has(e.entityPlayer, "ability.admin.breakprivate")) + { + for(WarpProtectionEntry warpConf : ConfigurationHandler.getServerConfig().tools.warpProtection) + { + if(warpConf.useItems || warpConf.userBlocks) + { + WarpLocation warp = MinecraftServer.getServer().getConfigurationManager().getDataLoader().getWarp(warpConf.name); + if(warp != null) + { + if(e.action == PlayerInteractEvent.Action.RIGHT_CLICK_AIR) + { + if(warpConf.useItems && isInside(warp, e.entityPlayer.dimension, MathHelper.floor_double(e.entity.posX), + MathHelper.floor_double(e.entity.posZ), warpConf.radius)) + e.useItem = Event.Result.DENY; + } + else if(isInside(warp, e.entityPlayer.dimension, e.x, e.z, warpConf.radius)) + { + if(warpConf.useItems) + e.useItem = Event.Result.DENY; + if(warpConf.userBlocks) + e.useBlock = Event.Result.DENY; + } + } + } + } + } + } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onLivingAttackEvent(LivingAttackEvent e) + { + Entity attacker = e.source.getEntity(); + if(attacker != null) + { + boolean isPvP = attacker.isEntityPlayerMP() && e.entityLiving.isEntityPlayerMP(); + for(WarpProtectionEntry warpConf : ConfigurationHandler.getServerConfig().tools.warpProtection) + { + if(isPvP && warpConf.pvp || !isPvP && e.entityLiving.isEntityPlayerMP() && warpConf.mobDamage) + { + WarpLocation warp = MinecraftServer.getServer().getConfigurationManager().getDataLoader().getWarp(warpConf.name); + if(warp != null && isInside(warp, e.entityLiving.dimension, MathHelper.floor_double(e.entityLiving.posX), + MathHelper.floor_double(e.entityLiving.posZ), warpConf.radius)) + e.setCanceled(true); + } + } + } + } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onMobSpawn(LivingSpawnEvent.CheckSpawn e) + { + for(WarpProtectionEntry warpConf : ConfigurationHandler.getServerConfig().tools.warpProtection) + { + if(warpConf.mobSpawn) + { + WarpLocation warp = MinecraftServer.getServer().getConfigurationManager().getDataLoader().getWarp(warpConf.name); + if(warp != null && isInside(warp, e.world.provider.dimensionId, MathHelper.floor_double(e.x), MathHelper.floor_double(e.z), warpConf.radius)) + e.setCanceled(true); + } + } + } +}