From 1e6b3e3b6d133a14b9ecbaa818d8546b31044e5a Mon Sep 17 00:00:00 2001 From: joethei Date: Thu, 24 Nov 2016 19:52:24 +0100 Subject: [PATCH] + 1.11 Update + pathfinding + method to send centered text --- Core.iml | 27 +- local-maven-repo/The5zigMod.jar | Bin 55487 -> 0 bytes pom.xml | 30 +- src/main/java/eu/univento/core/Core.java | 6 - .../core/antihack/utils/PacketReader.java | 4 +- .../java/eu/univento/core/api/Hologram.java | 12 +- .../core/api/blocks/banners/BannerColor.java | 17 +- .../core/api/chat/DefaultFontInfo.java | 139 ++++++++ .../api/customitems/swords/CustomSword.java | 1 - .../univento/core/api/debug/DebugManager.java | 46 --- .../eu/univento/core/api/effects/Effects.java | 6 +- .../core/api/entity/EntityModifier.java | 12 +- .../core/api/entity/pathfinding/AStar.java | 323 ++++++++++++++++++ .../api/entity/pathfinding/PathingResult.java | 27 ++ .../core/api/entity/pathfinding/Tile.java | 156 +++++++++ .../core/api/fakeplayer/FakePlayer.java | 4 +- .../eu/univento/core/api/gui/AnvilGUI.java | 4 +- .../eu/univento/core/api/gui/SignInput.java | 6 +- .../core/api/gui/SignInputHandler.java | 8 +- .../univento/core/api/items/ItemBuilder.java | 65 +--- .../java/eu/univento/core/api/npc/NPC.java | 6 +- .../api/npc/datawatcher/EnumDataWatcher.java | 14 +- .../eu/univento/core/api/pet/NMSHandler.java | 6 +- .../eu/univento/core/api/pet/NMSHelper.java | 4 +- .../eu/univento/core/api/pet/PetType.java | 6 +- .../core/api/pet/custom/CustomCreeper.java | 2 +- .../core/api/pet/custom/CustomPig.java | 2 +- .../univento/core/api/player/BetterPvP.java | 7 +- .../core/api/player/CustomPlayer.java | 63 +++- .../eu/univento/core/api/player/NickName.java | 7 +- .../univento/core/api/schematic/Cuboid.java | 4 +- .../core/api/schematic/Schematic.java | 2 +- .../core/api/schematic/SchematicManager.java | 2 +- .../eu/univento/core/api/server/GameInfo.java | 2 +- .../core/api/server/MojangService.java | 18 +- .../core/api/server/ServerDatabase.java | 2 + .../univento/core/api/server/ServerInfo.java | 2 +- .../eu/univento/core/api/server/Servers.java | 44 --- .../eu/univento/core/api/shop/PayType.java | 2 +- .../univento/core/api/shop/ShopCategory.java | 2 +- .../eu/univento/core/api/shop/ShopItem.java | 2 +- .../eu/univento/core/api/shop/ShopMenu.java | 2 +- .../core/api/shop/entity/ShopEntity.java | 2 +- .../core/api/shop/entity/ShopIronGolem.java | 2 +- .../core/api/shop/entity/ShopVillager.java | 2 +- .../univento/core/api/story/StoryMission.java | 2 +- .../core/api/story/StoryMissionStatus.java | 2 +- .../core/api/story/StoryMissions.java | 2 +- .../eu/univento/core/api/utils/Direction.java | 3 +- .../core/api/utils/GameProfileBuilder.java | 2 +- .../eu/univento/core/api/utils/Lamps.java | 2 +- .../eu/univento/core/api/utils/Maths.java | 8 +- .../core/api/utils/NettyInjection.java | 15 +- .../core/api/utils/RandomCollection.java | 3 +- .../univento/core/api/utils/UUIDFetcher.java | 9 +- .../eu/univento/core/api/utils/Vectors.java | 72 ++-- .../java/eu/univento/core/commands/Nick.java | 1 - .../eu/univento/core/commands/SetRank.java | 1 + .../eu/univento/core/commands/SystemInfo.java | 1 + .../eu/univento/core/commands/Timeout.java | 1 + .../eu/univento/core/commands/Vanish.java | 1 + .../eu/univento/core/listeners/Blocks.java | 1 + .../java/eu/univento/core/listeners/Chat.java | 1 + .../eu/univento/core/listeners/Commands.java | 1 + .../eu/univento/core/listeners/Events.java | 5 +- .../eu/univento/core/listeners/JoinQuit.java | 20 +- .../eu/univento/core/listeners/NPCEvents.java | 1 + .../core/listeners/PluginMessenger.java | 80 +++-- .../univento/core/listeners/WeaponEvents.java | 2 +- 69 files changed, 977 insertions(+), 359 deletions(-) delete mode 100644 local-maven-repo/The5zigMod.jar create mode 100644 src/main/java/eu/univento/core/api/chat/DefaultFontInfo.java delete mode 100644 src/main/java/eu/univento/core/api/debug/DebugManager.java create mode 100644 src/main/java/eu/univento/core/api/entity/pathfinding/AStar.java create mode 100644 src/main/java/eu/univento/core/api/entity/pathfinding/PathingResult.java create mode 100644 src/main/java/eu/univento/core/api/entity/pathfinding/Tile.java delete mode 100644 src/main/java/eu/univento/core/api/server/Servers.java diff --git a/Core.iml b/Core.iml index 8a9805d..e003791 100644 --- a/Core.iml +++ b/Core.iml @@ -1,5 +1,5 @@ - + @@ -11,40 +11,33 @@ - - + + - + - - + + + + - - + - - - - - - - - - + \ No newline at end of file diff --git a/local-maven-repo/The5zigMod.jar b/local-maven-repo/The5zigMod.jar deleted file mode 100644 index 78e34506395bf231a9b827277ac20c6a4731d95d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55487 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 B`da`1 diff --git a/pom.xml b/pom.xml index 7830560..2eb77fe 100644 --- a/pom.xml +++ b/pom.xml @@ -50,34 +50,35 @@ - spigot-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + univentoEU + http://dev.joethei.de:8081/repository/public/ - org.projectlombok - lombok - 1.14.8 + com.destroystokyo.paper + paper-api + 1.11-R0.1-SNAPSHOT provided org.spigotmc spigot-api - 1.10.2-R0.1-SNAPSHOT + 1.11-R0.1-SNAPSHOT provided org.bukkit bukkit - 1.10.2-R0.1-SNAPSHOT + 1.11-R0.1-SNAPSHOT provided org.bukkit craftbukkit - 1.10.2-R0.1-SNAPSHOT + 1.11-R0.1-SNAPSHOT + provided eu.univento @@ -85,16 +86,9 @@ 1.0-SNAPSHOT - eu.univento - Commons - 1.0-SNAPSHOT - - - eu.the5zig.mod - mod - 1.0 - system - ${project.basedir}/local-maven-repo/The5zigMod.jar + org.projectlombok + lombok + 1.16.10 diff --git a/src/main/java/eu/univento/core/Core.java b/src/main/java/eu/univento/core/Core.java index b26b23f..271906c 100644 --- a/src/main/java/eu/univento/core/Core.java +++ b/src/main/java/eu/univento/core/Core.java @@ -4,7 +4,6 @@ import eu.univento.commons.Commons; import eu.univento.commons.server.TPS; import eu.univento.core.antihack.AntiHack; import eu.univento.core.api.Config; -import eu.univento.core.api.debug.DebugManager; import eu.univento.core.api.effects.Blackscreen; import eu.univento.core.api.events.MoveEventFilter; import eu.univento.core.api.items.InventoryManager; @@ -15,7 +14,6 @@ import eu.univento.core.api.utils.NettyInjection; import eu.univento.core.commands.*; import eu.univento.core.listeners.*; import io.netty.channel.Channel; -import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; @@ -86,9 +84,6 @@ public class Core extends JavaPlugin implements NettyInjection.PacketHandler { } } - @Getter - private static DebugManager debugManager; - /* @Override public void onLoad() { @@ -232,7 +227,6 @@ public class Core extends JavaPlugin implements NettyInjection.PacketHandler { }); */ Bukkit.getScheduler().runTask(this, new TPS()); - debugManager = new DebugManager(); } @Override diff --git a/src/main/java/eu/univento/core/antihack/utils/PacketReader.java b/src/main/java/eu/univento/core/antihack/utils/PacketReader.java index f3eab1b..cbf612e 100644 --- a/src/main/java/eu/univento/core/antihack/utils/PacketReader.java +++ b/src/main/java/eu/univento/core/antihack/utils/PacketReader.java @@ -4,8 +4,8 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMessageDecoder; -import net.minecraft.server.v1_10_R1.Packet; -import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; +import net.minecraft.server.v1_11_R1.Packet; +import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; import org.bukkit.entity.Player; import java.util.List; diff --git a/src/main/java/eu/univento/core/api/Hologram.java b/src/main/java/eu/univento/core/api/Hologram.java index 8a20450..93e4151 100644 --- a/src/main/java/eu/univento/core/api/Hologram.java +++ b/src/main/java/eu/univento/core/api/Hologram.java @@ -2,14 +2,14 @@ package eu.univento.core.api; import eu.univento.core.Core; import eu.univento.core.api.player.CustomPlayer; -import net.minecraft.server.v1_10_R1.EntityArmorStand; -import net.minecraft.server.v1_10_R1.EnumHand; -import net.minecraft.server.v1_10_R1.PacketPlayOutEntityDestroy; -import net.minecraft.server.v1_10_R1.PacketPlayOutSpawnEntityLiving; +import net.minecraft.server.v1_11_R1.EntityArmorStand; +import net.minecraft.server.v1_11_R1.EnumHand; +import net.minecraft.server.v1_11_R1.PacketPlayOutEntityDestroy; +import net.minecraft.server.v1_11_R1.PacketPlayOutSpawnEntityLiving; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_10_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_11_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftItemStack; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; diff --git a/src/main/java/eu/univento/core/api/blocks/banners/BannerColor.java b/src/main/java/eu/univento/core/api/blocks/banners/BannerColor.java index 42e602d..2756299 100644 --- a/src/main/java/eu/univento/core/api/blocks/banners/BannerColor.java +++ b/src/main/java/eu/univento/core/api/blocks/banners/BannerColor.java @@ -8,7 +8,22 @@ import org.bukkit.DyeColor; */ public enum BannerColor { - BLACK('0', DyeColor.BLACK), BLUE('1', DyeColor.BLUE), BROWN('g', DyeColor.BROWN), CYAN('3', DyeColor.CYAN), GRAY('8', DyeColor.GRAY), GREEN('2', DyeColor.GREEN), LIGHT_BLUE('b', DyeColor.LIGHT_BLUE), LIME('a', DyeColor.LIME), MAGENTA('c', DyeColor.MAGENTA), ORANGE('6', DyeColor.ORANGE), PINK('d', DyeColor.PINK), PURPLE('5', DyeColor.PURPLE), RED('4', DyeColor.RED), SILVER('7', DyeColor.SILVER), WHITE('f', DyeColor.WHITE), YELLOW('e', DyeColor.YELLOW); + BLACK('0', DyeColor.BLACK), + BLUE('1', DyeColor.BLUE), + BROWN('g', DyeColor.BROWN), + CYAN('3', DyeColor.CYAN), + GRAY('8', DyeColor.GRAY), + GREEN('2', DyeColor.GREEN), + LIGHT_BLUE('b', DyeColor.LIGHT_BLUE), + LIME('a', DyeColor.LIME), + MAGENTA('c', DyeColor.MAGENTA), + ORANGE('6', DyeColor.ORANGE), + PINK('d', DyeColor.PINK), + PURPLE('5', DyeColor.PURPLE), + RED('4', DyeColor.RED), + SILVER('7', DyeColor.SILVER), + WHITE('f', DyeColor.WHITE), + YELLOW('e', DyeColor.YELLOW); private char colorCode; private DyeColor color; diff --git a/src/main/java/eu/univento/core/api/chat/DefaultFontInfo.java b/src/main/java/eu/univento/core/api/chat/DefaultFontInfo.java new file mode 100644 index 0000000..6f82d04 --- /dev/null +++ b/src/main/java/eu/univento/core/api/chat/DefaultFontInfo.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2016 univento.eu - All rights reserved + * You are not allowed to use, distribute or modify this code + */ + +package eu.univento.core.api.chat; + +/** + * @author SirSpoodles + * @version 1.0 + */ + +public enum DefaultFontInfo { + + A('A', 5), + a('a', 5), + B('B', 5), + b('b', 5), + C('C', 5), + c('c', 5), + D('D', 5), + d('d', 5), + E('E', 5), + e('e', 5), + F('F', 5), + f('f', 4), + G('G', 5), + g('g', 5), + H('H', 5), + h('h', 5), + I('I', 3), + i('i', 1), + J('J', 5), + j('j', 5), + K('K', 5), + k('k', 4), + L('L', 5), + l('l', 1), + M('M', 5), + m('m', 5), + N('N', 5), + n('n', 5), + O('O', 5), + o('o', 5), + P('P', 5), + p('p', 5), + Q('Q', 5), + q('q', 5), + R('R', 5), + r('r', 5), + S('S', 5), + s('s', 5), + T('T', 5), + t('t', 4), + U('U', 5), + u('u', 5), + V('V', 5), + v('v', 5), + W('W', 5), + w('w', 5), + X('X', 5), + x('x', 5), + Y('Y', 5), + y('y', 5), + Z('Z', 5), + z('z', 5), + NUM_1('1', 5), + NUM_2('2', 5), + NUM_3('3', 5), + NUM_4('4', 5), + NUM_5('5', 5), + NUM_6('6', 5), + NUM_7('7', 5), + NUM_8('8', 5), + NUM_9('9', 5), + NUM_0('0', 5), + EXCLAMATION_POINT('!', 1), + AT_SYMBOL('@', 6), + NUM_SIGN('#', 5), + DOLLAR_SIGN('$', 5), + PERCENT('%', 5), + UP_ARROW('^', 5), + AMPERSAND('&', 5), + ASTERISK('*', 5), + LEFT_PARENTHESIS('(', 4), + RIGHT_PERENTHESIS(')', 4), + MINUS('-', 5), + UNDERSCORE('_', 5), + PLUS_SIGN('+', 5), + EQUALS_SIGN('=', 5), + LEFT_CURL_BRACE('{', 4), + RIGHT_CURL_BRACE('}', 4), + LEFT_BRACKET('[', 3), + RIGHT_BRACKET(']', 3), + COLON(':', 1), + SEMI_COLON(';', 1), + DOUBLE_QUOTE('"', 3), + SINGLE_QUOTE('\'', 1), + LEFT_ARROW('<', 4), + RIGHT_ARROW('>', 4), + QUESTION_MARK('?', 5), + SLASH('/', 5), + BACK_SLASH('\\', 5), + LINE('|', 1), + TILDE('~', 5), + TICK('`', 2), + PERIOD('.', 1), + COMMA(',', 1), + SPACE(' ', 3), + DEFAULT('a', 4); + + private char character; + private int length; + + DefaultFontInfo(char character, int length) { + this.character = character; + this.length = length; + } + + public char getCharacter() { + return this.character; + } + + public int getLength() { + return this.length; + } + + public int getBoldLength() { + if (this == DefaultFontInfo.SPACE) return this.getLength(); + return this.length + 1; + } + + public static DefaultFontInfo getDefaultFontInfo(char c) { + for (DefaultFontInfo dFI : DefaultFontInfo.values()) { + if (dFI.getCharacter() == c) return dFI; + } + return DefaultFontInfo.DEFAULT; + } +} diff --git a/src/main/java/eu/univento/core/api/customitems/swords/CustomSword.java b/src/main/java/eu/univento/core/api/customitems/swords/CustomSword.java index 946423a..76c1ded 100644 --- a/src/main/java/eu/univento/core/api/customitems/swords/CustomSword.java +++ b/src/main/java/eu/univento/core/api/customitems/swords/CustomSword.java @@ -1,6 +1,5 @@ package eu.univento.core.api.customitems.swords; -import eu.univento.core.api.customitems.swords.CustomSwordManager; import eu.univento.core.api.player.CustomPlayer; import org.bukkit.inventory.ItemStack; diff --git a/src/main/java/eu/univento/core/api/debug/DebugManager.java b/src/main/java/eu/univento/core/api/debug/DebugManager.java deleted file mode 100644 index 533c702..0000000 --- a/src/main/java/eu/univento/core/api/debug/DebugManager.java +++ /dev/null @@ -1,46 +0,0 @@ -package eu.univento.core.api.debug; - -import eu.the5zig.mod.server.The5zigMod; -import eu.the5zig.mod.server.api.ModUser; -import eu.univento.commons.player.Rank; -import eu.univento.core.api.player.CustomPlayer; -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; - -/** - * @author joethei - * @version 0.1 - */ -public class DebugManager { - - private boolean enabled; - - public DebugManager() { - Plugin plugin = Bukkit.getPluginManager().getPlugin("The5zigMod"); - if(plugin.isEnabled()) { - this.enabled = true; - } - } - - public void sendStat(String stat, String score) { - if(enabled) { - for(ModUser user : The5zigMod.getInstance().getUserManager().getOnlineModUsers()) { - CustomPlayer player = CustomPlayer.getPlayer(user.getPlayer()); - if(player.getDatabasePlayer().isAllowed(Rank.JrDeveloper)) { - user.getStatsManager().getStat(stat).setScore(score); - } - } - } - } - - public void sendOverlay(String overlay) { - if(enabled) { - for(ModUser user : The5zigMod.getInstance().getUserManager().getOnlineModUsers()) { - CustomPlayer player = CustomPlayer.getPlayer(user.getPlayer()); - if(player.getDatabasePlayer().isAllowed(Rank.JrDeveloper)) { - user.sendOverlay(overlay); - } - } - } - } -} \ No newline at end of file diff --git a/src/main/java/eu/univento/core/api/effects/Effects.java b/src/main/java/eu/univento/core/api/effects/Effects.java index 2c0beef..23477ee 100644 --- a/src/main/java/eu/univento/core/api/effects/Effects.java +++ b/src/main/java/eu/univento/core/api/effects/Effects.java @@ -1,10 +1,10 @@ package eu.univento.core.api.effects; import eu.univento.core.Core; -import net.minecraft.server.v1_10_R1.EnumParticle; -import net.minecraft.server.v1_10_R1.PacketPlayOutWorldParticles; +import net.minecraft.server.v1_11_R1.EnumParticle; +import net.minecraft.server.v1_11_R1.PacketPlayOutWorldParticles; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; import org.bukkit.entity.Player; /** diff --git a/src/main/java/eu/univento/core/api/entity/EntityModifier.java b/src/main/java/eu/univento/core/api/entity/EntityModifier.java index 6547773..767cb4d 100644 --- a/src/main/java/eu/univento/core/api/entity/EntityModifier.java +++ b/src/main/java/eu/univento/core/api/entity/EntityModifier.java @@ -1,13 +1,13 @@ package eu.univento.core.api.entity; import eu.univento.core.Core; -import net.minecraft.server.v1_10_R1.EntityLiving; -import net.minecraft.server.v1_10_R1.NBTTagCompound; +import net.minecraft.server.v1_11_R1.EntityLiving; +import net.minecraft.server.v1_11_R1.NBTTagCompound; import org.bukkit.Bukkit; import org.bukkit.EntityEffect; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_10_R1.entity.CraftCreature; -import org.bukkit.craftbukkit.v1_10_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_11_R1.entity.CraftCreature; +import org.bukkit.craftbukkit.v1_11_R1.entity.CraftEntity; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; @@ -20,7 +20,7 @@ import java.lang.reflect.Field; public class EntityModifier { private static org.bukkit.entity.Entity entity; private static CraftEntity craftentity; - private static net.minecraft.server.v1_10_R1.Entity entityS; + private static net.minecraft.server.v1_11_R1.Entity entityS; private static int scheduler; private static Plugin plugin = Core.getInstance(); private static Player player = null; @@ -100,7 +100,7 @@ public class EntityModifier { public Builder setInvulnerable(boolean invulnerable) { try { - Field invulnerableField = net.minecraft.server.v1_10_R1.Entity.class.getDeclaredField("invulnerable"); + Field invulnerableField = net.minecraft.server.v1_11_R1.Entity.class.getDeclaredField("invulnerable"); invulnerableField.setAccessible(true); invulnerableField.setBoolean(EntityModifier.entityS, invulnerable); } catch (Exception ex) { diff --git a/src/main/java/eu/univento/core/api/entity/pathfinding/AStar.java b/src/main/java/eu/univento/core/api/entity/pathfinding/AStar.java new file mode 100644 index 0000000..b4bf39c --- /dev/null +++ b/src/main/java/eu/univento/core/api/entity/pathfinding/AStar.java @@ -0,0 +1,323 @@ +/* + * Copyright (c) 2016 univento.eu - All rights reserved + * You are not allowed to use, distribute or modify this code + */ + +package eu.univento.core.api.entity.pathfinding; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.material.Gate; + +import java.util.*; + +/** + * @author Adamk11s + * @version 1.0 + */ +public class AStar { + + private final int sx, sy, sz, ex, ey, ez; + private final World w; + + private PathingResult result; + + private HashMap open = new HashMap<>(); + private HashMap closed = new HashMap<>(); + + private void addToOpenList(Tile t, boolean modify) { + if (open.containsKey(t.getUID())) { + if (modify) { + open.put(t.getUID(), t); + } + } else { + open.put(t.getUID(), t); + } + } + + private void addToClosedList(Tile t) { + if (!closed.containsKey(t.getUID())) { + closed.put(t.getUID(), t); + } + } + + private final int range; + private final String endUID; + + public AStar(Location start, Location end, int range) throws InvalidPathException { + + boolean s = true, e = true; + + if (!(s = this.isLocationWalkable(start)) || !(e = this.isLocationWalkable(end))) { + throw new InvalidPathException(s, e); + } + + this.w = start.getWorld(); + this.sx = start.getBlockX(); + this.sy = start.getBlockY(); + this.sz = start.getBlockZ(); + this.ex = end.getBlockX(); + this.ey = end.getBlockY(); + this.ez = end.getBlockZ(); + + this.range = range; + + short sh = 0; + Tile t = new Tile(sh, sh, sh, null); + t.calculateBoth(sx, sy, sz, ex, ey, ez, true); + this.open.put(t.getUID(), t); + this.processAdjacentTiles(t); + + StringBuilder b = new StringBuilder(); + b.append(ex - sx).append(ey - sy).append(ez - sz); + this.endUID = b.toString(); + } + + public Location getEndLocation() { + return new Location(w, ex, ey, ez); + } + + public PathingResult getPathingResult() { + return this.result; + } + + boolean checkOnce = false; + + private int abs(int i) { + return (i < 0 ? -i : i); + } + + public ArrayList iterate() { + + if (!checkOnce) { + // invert the boolean flag + checkOnce ^= true; + if((abs(sx - ex) > range) || (abs(sy - ey) > range) || (abs(sz - ez) > range)){ + this.result = PathingResult.NO_PATH; + return null;//jump out + } + } + // while not at end + Tile current = null; + + while (canContinue()) { + + // get lowest F cost square on open list + current = this.getLowestFTile(); + + // process tiles + this.processAdjacentTiles(current); + } + + if (this.result != PathingResult.SUCCESS) { + return null; + } else { + // path found + LinkedList routeTrace = new LinkedList<>(); + Tile parent; + + routeTrace.add(current); + + assert current != null; + while ((parent = current.getParent()) != null) { + routeTrace.add(parent); + current = parent; + } + + Collections.reverse(routeTrace); + + return new ArrayList<>(routeTrace); + } + } + + private boolean canContinue() { + // check if open list is empty, if it is no path has been found + if (open.size() == 0) { + this.result = PathingResult.NO_PATH; + return false; + } else { + if (closed.containsKey(this.endUID)) { + this.result = PathingResult.SUCCESS; + return false; + } else { + return true; + } + } + } + + private Tile getLowestFTile() { + double f = 0; + Tile drop = null; + + // get lowest F cost square + for (Tile t : open.values()) { + if (f == 0) { + t.calculateBoth(sx, sy, sz, ex, ey, ez, true); + f = t.getF(); + drop = t; + } else { + t.calculateBoth(sx, sy, sz, ex, ey, ez, true); + double posF = t.getF(); + if (posF < f) { + f = posF; + drop = t; + } + } + } + + // drop from open list and add to closed + + assert drop != null; + this.open.remove(drop.getUID()); + this.addToClosedList(drop); + + return drop; + } + + private boolean isOnClosedList(Tile t) { + return closed.containsKey(t.getUID()); + } + + // pass in the current tile as the parent + private void processAdjacentTiles(Tile current) { + + // set of possible walk to locations adjacent to current tile + HashSet possible = new HashSet<>(26); + + for (byte x = -1; x <= 1; x++) { + for (byte y = -1; y <= 1; y++) { + for (byte z = -1; z <= 1; z++) { + + if (x == 0 && y == 0 && z == 0) { + continue;// don't check current square + } + + Tile t = new Tile((short) (current.getX() + x), (short) (current.getY() + y), (short) (current.getZ() + z), current); + + if (!t.isInRange(this.range)) { + // if block is out of bounds continue + continue; + } + + if (x != 0 && z != 0 && (y == 0 || y == 1)) { + // check to stop jumping through diagonal blocks + Tile xOff = new Tile((short) (current.getX() + x), (short) (current.getY() + y), current.getZ(), current), zOff = new Tile(current.getX(), + (short) (current.getY() + y), (short) (current.getZ() + z), current); + if (!this.isTileWalkable(xOff) && !this.isTileWalkable(zOff)) { + continue; + } + } + + if (this.isOnClosedList(t)) { + // ignore tile + continue; + } + + // only process the tile if it can be walked on + if (this.isTileWalkable(t)) { + t.calculateBoth(sx, sy, sz, ex, ey, ez, true); + possible.add(t); + } + + } + } + } + + for (Tile t : possible) { + // get the reference of the object in the array + Tile openRef; + if ((openRef = this.isOnOpenList(t)) == null) { + // not on open list, so add + this.addToOpenList(t, false); + } else { + // is on open list, check if path to that square is better using + // G cost + if (t.getG() < openRef.getG()) { + // if current path is better, change parent + openRef.setParent(current); + // force updates of F, G and H values. + openRef.calculateBoth(sx, sy, sz, ex, ey, ez, true); + } + + } + } + + } + + private Tile isOnOpenList(Tile t) { + return (open.containsKey(t.getUID()) ? open.get(t.getUID()) : null); + /* + * for (Tile o : open) { if (o.equals(t)) { return o; } } return null; + */ + } + + private boolean isTileWalkable(Tile t) { + Location l = new Location(w, (sx + t.getX()), (sy + t.getY()), (sz + t.getZ())); + Block b = l.getBlock(); + int i = b.getTypeId(); + + // lava, fire, wheat and ladders cannot be walked on, and of course air + // 85, 107 and 113 stops npcs climbing fences and fence gates + if (i != 10 && i != 11 && i != 51 && i != 59 && i != 65 && i != 0 && i != 85 && i != 107 && i != 113 && !canBlockBeWalkedThrough(i)) { + // make sure the blocks above are air + + if (b.getRelative(0, 1, 0).getTypeId() == 107) { + // fench gate check, if closed continue + Gate g = new Gate(b.getRelative(0, 1, 0).getData()); + return (g.isOpen() && (b.getRelative(0, 2, 0).getTypeId() == 0)); + } + return (canBlockBeWalkedThrough(b.getRelative(0, 1, 0).getTypeId()) && b.getRelative(0, 2, 0).getTypeId() == 0); + + } else { + return false; + } + } + + private boolean isLocationWalkable(Location l) { + Block b = l.getBlock(); + int i = b.getTypeId(); + + if (i != 10 && i != 11 && i != 51 && i != 59 && i != 65 && i != 0 && !canBlockBeWalkedThrough(i)) { + // make sure the blocks above are air or can be walked through + return (canBlockBeWalkedThrough(b.getRelative(0, 1, 0).getTypeId()) && b.getRelative(0, 2, 0).getTypeId() == 0); + } else { + return false; + } + } + + private boolean canBlockBeWalkedThrough(int id) { + return (id == 0 || id == 6 || id == 50 || id == 63 || id == 30 || id == 31 || id == 32 || id == 37 || id == 38 || id == 39 || id == 40 || id == 55 || id == 66 || id == 75 + || id == 76 || id == 78); + } + + public class InvalidPathException extends Exception { + + private final boolean s, e; + + public InvalidPathException(boolean s, boolean e) { + this.s = s; + this.e = e; + } + + public String getErrorReason() { + StringBuilder sb = new StringBuilder(); + if (!s) { + sb.append("Start Location was air. "); + } + if (!e) { + sb.append("End Location was air."); + } + return sb.toString(); + } + + public boolean isStartNotSolid() { + return (!s); + } + + public boolean isEndNotSolid() { + return (!e); + } + } + +} \ No newline at end of file diff --git a/src/main/java/eu/univento/core/api/entity/pathfinding/PathingResult.java b/src/main/java/eu/univento/core/api/entity/pathfinding/PathingResult.java new file mode 100644 index 0000000..30776fb --- /dev/null +++ b/src/main/java/eu/univento/core/api/entity/pathfinding/PathingResult.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2016 univento.eu - All rights reserved + * You are not allowed to use, distribute or modify this code + */ + +package eu.univento.core.api.entity.pathfinding; + +/** + * @author joethei + * @version 1.0 + */ +public enum PathingResult { + + SUCCESS(0), + NO_PATH(-1); + + private final int ec; + + PathingResult(int ec){ + this.ec = ec; + } + + public int getEndCode(){ + return this.ec; + } + +} \ No newline at end of file diff --git a/src/main/java/eu/univento/core/api/entity/pathfinding/Tile.java b/src/main/java/eu/univento/core/api/entity/pathfinding/Tile.java new file mode 100644 index 0000000..ca498e5 --- /dev/null +++ b/src/main/java/eu/univento/core/api/entity/pathfinding/Tile.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2016 univento.eu - All rights reserved + * You are not allowed to use, distribute or modify this code + */ + +package eu.univento.core.api.entity.pathfinding; + +import org.bukkit.Location; + +/** + * @author Adamk11s + * @version 1.0 + */ +public class Tile { + + // as offset from starting point + private final short x, y, z; + + private double g = -1, h = -1; + + private Tile parent = null; + + private final String uid; + + public Tile(short x, short y, short z, Tile parent) { + this.x = x; + this.y = y; + this.z = z; + this.parent = parent; + + StringBuilder b = new StringBuilder(); + b.append(x); + b.append(y); + b.append(z); + uid = b.toString(); + + } + + public boolean isInRange(int range){ + return ((range - abs(x) >= 0) && (range - abs(y) >= 0) && (range - abs(z) >= 0)); + } + + public void setParent(Tile parent) { + this.parent = parent; + } + + public Location getLocation(Location start) { + return new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() + y, start.getBlockZ() + z); + } + + public Tile getParent() { + return this.parent; + } + + public short getX() { + return x; + } + + public int getX(Location i) { + return (i.getBlockX() + x); + } + + public short getY() { + return y; + } + + public int getY(Location i) { + return (i.getBlockY() + y); + } + + public short getZ() { + return z; + } + + public int getZ(Location i) { + return (i.getBlockZ() + z); + } + + public String getUID() { + return this.uid; + } + + public boolean equals(Tile t) { + return (t.getX() == x && t.getY() == y && t.getZ() == z); + } + + public void calculateBoth(int sx, int sy, int sz, int ex, int ey, int ez, boolean update) { + this.calculateG(sx, sy, sz, update); + this.calculateH(sx, sy, sz, ex, ey, ez, update); + } + + public void calculateH(int sx, int sy, int sz, int ex, int ey, int ez, boolean update) { + // only update if h hasn't been calculated or if forced + if ((!update && h == -1) || update) { + int hx = sx + x, hy = sy + y, hz = sz + z; + this.h = this.getEuclideanDistance(hx, hy, hz, ex, ey, ez); + } + } + + // G = the movement cost to move from the starting point A to a given square + // on the grid, following the path generated to get there. + public void calculateG(int sx, int sy, int sz, boolean update) { + + if ((!update && g == -1) || update) { + + // only update if g hasn't been calculated or if forced + Tile currentParent = this.getParent(), currentTile = this; + int gCost = 0; + // follow path back to start + while ((currentParent = currentTile.getParent()) != null) { + + int dx = currentTile.getX() - currentParent.getX(), dy = currentTile.getY() - currentParent.getY(), dz = currentTile.getZ() - currentParent.getZ(); + + dx = abs(dx); + dy = abs(dy); + dz = abs(dz); + + if (dx == 1 && dy == 1 && dz == 1) { + gCost += 1.7; + } else if (((dx == 1 || dz == 1) && dy == 1) || ((dx == 1 || dz == 1) && dy == 0)) { + gCost += 1.4; + } else { + gCost += 1.0; + } + + // move backwards a tile + currentTile = currentParent; + } + this.g = gCost; + } + + } + + public double getG() { + return g; + } + + public double getH() { + return h; + } + + public double getF() { + // f = h + g + return (h + g); + } + + private double getEuclideanDistance(int sx, int sy, int sz, int ex, int ey, int ez) { + double dx = sx - ex, dy = sy - ey, dz = sz - ez; + return Math.sqrt((dx * dx) + (dy * dy) + (dz * dz)); + } + + private int abs(int i) { + return (i < 0 ? -i : i); + } + +} \ No newline at end of file diff --git a/src/main/java/eu/univento/core/api/fakeplayer/FakePlayer.java b/src/main/java/eu/univento/core/api/fakeplayer/FakePlayer.java index c4aad6c..206f4b7 100644 --- a/src/main/java/eu/univento/core/api/fakeplayer/FakePlayer.java +++ b/src/main/java/eu/univento/core/api/fakeplayer/FakePlayer.java @@ -2,9 +2,9 @@ package eu.univento.core.api.fakeplayer; import com.mojang.authlib.GameProfile; import eu.univento.core.Core; -import net.minecraft.server.v1_10_R1.*; +import net.minecraft.server.v1_11_R1.*; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; diff --git a/src/main/java/eu/univento/core/api/gui/AnvilGUI.java b/src/main/java/eu/univento/core/api/gui/AnvilGUI.java index 247a475..3374cfc 100644 --- a/src/main/java/eu/univento/core/api/gui/AnvilGUI.java +++ b/src/main/java/eu/univento/core/api/gui/AnvilGUI.java @@ -1,9 +1,9 @@ package eu.univento.core.api.gui; import eu.univento.core.Core; -import net.minecraft.server.v1_10_R1.*; +import net.minecraft.server.v1_11_R1.*; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; diff --git a/src/main/java/eu/univento/core/api/gui/SignInput.java b/src/main/java/eu/univento/core/api/gui/SignInput.java index 3217d51..c4e1565 100644 --- a/src/main/java/eu/univento/core/api/gui/SignInput.java +++ b/src/main/java/eu/univento/core/api/gui/SignInput.java @@ -1,9 +1,9 @@ package eu.univento.core.api.gui; import eu.univento.core.api.player.CustomPlayer; -import net.minecraft.server.v1_10_R1.BlockPosition; -import net.minecraft.server.v1_10_R1.EntityPlayer; -import net.minecraft.server.v1_10_R1.PacketPlayOutOpenSignEditor; +import net.minecraft.server.v1_11_R1.BlockPosition; +import net.minecraft.server.v1_11_R1.EntityPlayer; +import net.minecraft.server.v1_11_R1.PacketPlayOutOpenSignEditor; /** * @author joethei diff --git a/src/main/java/eu/univento/core/api/gui/SignInputHandler.java b/src/main/java/eu/univento/core/api/gui/SignInputHandler.java index 70cffc5..646e13d 100644 --- a/src/main/java/eu/univento/core/api/gui/SignInputHandler.java +++ b/src/main/java/eu/univento/core/api/gui/SignInputHandler.java @@ -3,11 +3,11 @@ package eu.univento.core.api.gui; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMessageDecoder; -import net.minecraft.server.v1_10_R1.NetworkManager; -import net.minecraft.server.v1_10_R1.Packet; -import net.minecraft.server.v1_10_R1.PacketPlayInUpdateSign; +import net.minecraft.server.v1_11_R1.NetworkManager; +import net.minecraft.server.v1_11_R1.Packet; +import net.minecraft.server.v1_11_R1.PacketPlayInUpdateSign; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; import org.bukkit.entity.Player; import java.lang.reflect.Field; diff --git a/src/main/java/eu/univento/core/api/items/ItemBuilder.java b/src/main/java/eu/univento/core/api/items/ItemBuilder.java index 4c9b5ca..030f923 100644 --- a/src/main/java/eu/univento/core/api/items/ItemBuilder.java +++ b/src/main/java/eu/univento/core/api/items/ItemBuilder.java @@ -34,8 +34,7 @@ public class ItemBuilder { /** * Init item chainable via given Material parameter. * - * @param itemType - * the {@link Material} to initiate the instance with. + * @param itemType the {@link Material} to initiate the instance with. * * @since 1.0 */ @@ -47,8 +46,7 @@ public class ItemBuilder { /** * Init item chainable via given ItemStack parameter. * - * @param itemStack - * the {@link ItemStack} to initialize the instance with. + * @param itemStack the {@link ItemStack} to initialize the instance with. * * @since 1.0 */ @@ -70,8 +68,7 @@ public class ItemBuilder { /** * Changes the Material type of the {@link ItemStack} * - * @param material - * the new {@link Material} to set for the ItemStack. + * @param material the new {@link Material} to set for the ItemStack. * * @return the current instance for chainable application. * @since 1.0 @@ -84,8 +81,7 @@ public class ItemBuilder { /** * Changes the {@link ItemStack}s size. * - * @param itemAmt - * the new Integer count of the ItemStack. + * @param itemAmt the new Integer count of the ItemStack. * * @return the current instance for chainable application. * @since 1.0 @@ -98,8 +94,7 @@ public class ItemBuilder { /** * Changes the {@link ItemStack}s display name. * - * @param name - * the new String for the ItemStack's display name to be set to. + * @param name the new String for the ItemStack's display name to be set to. * * @return the current instance for chainable application. * @since 1.0 @@ -113,8 +108,7 @@ public class ItemBuilder { /** * Adds a line of lore to the {@link ItemStack} * - * @param lore - * String you want to add to the ItemStack's lore. + * @param lore String you want to add to the ItemStack's lore. * * @return the current instance for chainable application. * @since 1.0 @@ -131,8 +125,7 @@ public class ItemBuilder { /** * Clears the {@link ItemStack}s lore and replaces it with the defined String array. * - * @param lores - * String array you want to set the ItemStack's lore to. + * @param lores String array you want to set the ItemStack's lore to. * * @return the current instance for chainable application. * @since 1.0 @@ -146,17 +139,6 @@ public class ItemBuilder { return this; } - /** - * Changes the durability of the current {@link ItemStack} - * - * @return the current instance for chainable application. - * @since 1.0 - */ - public ItemBuilder durability(){ - make().setDurability((short) 3); - return this; - } - public ItemBuilder durability(short durability) { make().setDurability(durability); return this; @@ -165,8 +147,7 @@ public class ItemBuilder { /** * Changes the data value of the {@link ItemStack} * - * @param data - * the new int data value (parsed as byte) to set the ItemStack's durability to. + * @param data the new int data value (parsed as byte) to set the ItemStack's durability to. * * @return the current instance for chainable application. * @since 1.0 @@ -180,11 +161,9 @@ public class ItemBuilder { /** * Adds and UnsafeEnchantment to the {@link ItemStack} with a defined level int value. * - * @param enchantment - * the {@link Enchantment} to add to the ItemStack. + * @param enchantment the {@link Enchantment} to add to the ItemStack. * - * @param level - * the int amount that the Enchantment's level will be set to. + * @param level the int amount that the Enchantment's level will be set to. * * @return the current instance for chainable application. * @since 1.0 @@ -197,8 +176,7 @@ public class ItemBuilder { /** * Adds and UnsafeEnchantment to the {@link} with a level int value of 1. * - * @param enchantment - * the {@link Enchantment} to add to the ItemStack. + * @param enchantment the {@link Enchantment} to add to the ItemStack. * * @return the current instance for chainable application. * @since 1.0 @@ -211,11 +189,9 @@ public class ItemBuilder { /** * Clears all {@link Enchantment}s from the current {@link ItemStack} then adds the defined array of Enchantments to the ItemStack. * - * @param enchantments - * the Enchantment array to replace any current enchantments applied on the ItemStack. + * @param enchantments the Enchantment array to replace any current enchantments applied on the ItemStack. * - * @param level - * the int level value for all Enchantments to be set to. + * @param level the int level value for all Enchantments to be set to. * * @return the current instance for chainable application. * @since 1.0 @@ -231,8 +207,7 @@ public class ItemBuilder { /** * Clears all {@link Enchantment}s from the current {@link ItemStack} then adds the defined array of Enchantments to the ItemStack with a level int value of 1. * - * @param enchantments - * the Enchantment array to replace any current enchantments applied on the ItemStack. + * @param enchantments the Enchantment array to replace any current enchantments applied on the ItemStack. * * @return the current instance for chainable application. * @since 1.0 @@ -248,8 +223,7 @@ public class ItemBuilder { /** * Clears the defined {@link Enchantment} from the {@link ItemStack} * - * @param enchantment - * the Enchantment to remove from the ItemStack. + * @param enchantment the Enchantment to remove from the ItemStack. * * @return the current instance for chainable application. * @since 1.0 @@ -278,8 +252,7 @@ public class ItemBuilder { /** * Clears the defined {@link String} of lore from the {@link ItemStack} * - * @param lore - * the String to be removed from the ItemStack. + * @param lore the String to be removed from the ItemStack. * * @return the current instance for chainable application. * @since 1.0 @@ -307,8 +280,7 @@ public class ItemBuilder { /** * Sets the {@link Color} of any LEATHER_ARMOR {@link Material} types of the {@link ItemStack} * - * @param color - * the Color to set the LEATHER_ARMOR ItemStack to. + * @param color the Color to set the LEATHER_ARMOR ItemStack to. * * @return the current instance for chainable application. * @since 1.0 @@ -346,8 +318,7 @@ public class ItemBuilder { /** * Sets the skullOwner {@link SkullMeta} of the current SKULL_ITEM {@link Material} type {@link ItemStack} * - * @param name - * the {@link String} value to set the SkullOwner meta to for the SKULL_ITEM Material type ItemStack. + * @param name the {@link String} value to set the SkullOwner meta to for the SKULL_ITEM Material type ItemStack. * * @return the current instance for chainable application * @since 1.0 diff --git a/src/main/java/eu/univento/core/api/npc/NPC.java b/src/main/java/eu/univento/core/api/npc/NPC.java index c3d0d6c..3475b2a 100644 --- a/src/main/java/eu/univento/core/api/npc/NPC.java +++ b/src/main/java/eu/univento/core/api/npc/NPC.java @@ -7,9 +7,9 @@ import eu.univento.core.Core; import eu.univento.core.api.player.CustomPlayer; import eu.univento.core.api.utils.GameProfileBuilder; import lombok.Data; -import net.minecraft.server.v1_10_R1.DataWatcher; -import net.minecraft.server.v1_10_R1.PacketPlayOutEntityDestroy; -import net.minecraft.server.v1_10_R1.PacketPlayOutNamedEntitySpawn; +import net.minecraft.server.v1_11_R1.DataWatcher; +import net.minecraft.server.v1_11_R1.PacketPlayOutEntityDestroy; +import net.minecraft.server.v1_11_R1.PacketPlayOutNamedEntitySpawn; import org.bukkit.Bukkit; import org.bukkit.Location; diff --git a/src/main/java/eu/univento/core/api/npc/datawatcher/EnumDataWatcher.java b/src/main/java/eu/univento/core/api/npc/datawatcher/EnumDataWatcher.java index 3a52cfc..aa2ad3d 100644 --- a/src/main/java/eu/univento/core/api/npc/datawatcher/EnumDataWatcher.java +++ b/src/main/java/eu/univento/core/api/npc/datawatcher/EnumDataWatcher.java @@ -1,10 +1,14 @@ package eu.univento.core.api.npc.datawatcher; +import lombok.Getter; + /** * @author ingrim4, joethei * @version 1.0 */ -public enum EnumDataWatcher { +enum EnumDataWatcher { + + //TODO: fix field ENTITY_BITMASK_00("Entity", "ay"),// ENTITY_AIR_01("Entity", "az"),//AIR @@ -23,8 +27,14 @@ public enum EnumDataWatcher { HUMAN_SKIN_12("EntityHuman", ""), HUMAN_HAND_13("EntityHuman", ""); - EnumDataWatcher(String owner, String field) { + @Getter + private String owner; + @Getter + private String field; + EnumDataWatcher(String owner, String field) { + this.owner = owner; + this.field = field; } public Object getObject() { diff --git a/src/main/java/eu/univento/core/api/pet/NMSHandler.java b/src/main/java/eu/univento/core/api/pet/NMSHandler.java index 0a98ca4..9108743 100644 --- a/src/main/java/eu/univento/core/api/pet/NMSHandler.java +++ b/src/main/java/eu/univento/core/api/pet/NMSHandler.java @@ -1,9 +1,9 @@ package eu.univento.core.api.pet; -import net.minecraft.server.v1_10_R1.Entity; -import net.minecraft.server.v1_10_R1.World; +import net.minecraft.server.v1_11_R1.Entity; +import net.minecraft.server.v1_11_R1.World; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_10_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_11_R1.CraftWorld; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.event.entity.CreatureSpawnEvent; diff --git a/src/main/java/eu/univento/core/api/pet/NMSHelper.java b/src/main/java/eu/univento/core/api/pet/NMSHelper.java index d256790..36f3cb3 100644 --- a/src/main/java/eu/univento/core/api/pet/NMSHelper.java +++ b/src/main/java/eu/univento/core/api/pet/NMSHelper.java @@ -1,7 +1,7 @@ package eu.univento.core.api.pet; -import net.minecraft.server.v1_10_R1.EntityInsentient; -import net.minecraft.server.v1_10_R1.EntityTypes; +import net.minecraft.server.v1_11_R1.EntityInsentient; +import net.minecraft.server.v1_11_R1.EntityTypes; import java.lang.reflect.Field; import java.lang.reflect.Method; diff --git a/src/main/java/eu/univento/core/api/pet/PetType.java b/src/main/java/eu/univento/core/api/pet/PetType.java index c00d27d..9d37f69 100644 --- a/src/main/java/eu/univento/core/api/pet/PetType.java +++ b/src/main/java/eu/univento/core/api/pet/PetType.java @@ -2,9 +2,9 @@ package eu.univento.core.api.pet; import eu.univento.core.api.pet.custom.CustomCreeper; import eu.univento.core.api.pet.custom.CustomPig; -import net.minecraft.server.v1_10_R1.EntityCreeper; -import net.minecraft.server.v1_10_R1.EntityInsentient; -import net.minecraft.server.v1_10_R1.EntityPig; +import net.minecraft.server.v1_11_R1.EntityCreeper; +import net.minecraft.server.v1_11_R1.EntityInsentient; +import net.minecraft.server.v1_11_R1.EntityPig; import org.bukkit.entity.EntityType; import java.util.ArrayList; diff --git a/src/main/java/eu/univento/core/api/pet/custom/CustomCreeper.java b/src/main/java/eu/univento/core/api/pet/custom/CustomCreeper.java index c9ceb05..1d7c080 100644 --- a/src/main/java/eu/univento/core/api/pet/custom/CustomCreeper.java +++ b/src/main/java/eu/univento/core/api/pet/custom/CustomCreeper.java @@ -1,7 +1,7 @@ package eu.univento.core.api.pet.custom; import eu.univento.core.api.pet.PetManager; -import net.minecraft.server.v1_10_R1.*; +import net.minecraft.server.v1_11_R1.*; /** * @author joethei diff --git a/src/main/java/eu/univento/core/api/pet/custom/CustomPig.java b/src/main/java/eu/univento/core/api/pet/custom/CustomPig.java index d1c5613..ba286fe 100644 --- a/src/main/java/eu/univento/core/api/pet/custom/CustomPig.java +++ b/src/main/java/eu/univento/core/api/pet/custom/CustomPig.java @@ -1,7 +1,7 @@ package eu.univento.core.api.pet.custom; import eu.univento.core.api.pet.PetManager; -import net.minecraft.server.v1_10_R1.*; +import net.minecraft.server.v1_11_R1.*; /** * @author joethei diff --git a/src/main/java/eu/univento/core/api/player/BetterPvP.java b/src/main/java/eu/univento/core/api/player/BetterPvP.java index 4c6bfd2..e376ecb 100644 --- a/src/main/java/eu/univento/core/api/player/BetterPvP.java +++ b/src/main/java/eu/univento/core/api/player/BetterPvP.java @@ -2,10 +2,7 @@ package eu.univento.core.api.player; public class BetterPvP { - public BetterPvP() { - } - - public String getCodeString() { + public static String getCodeString() { String toReturn = "§c §r§5 §r§1 §r§f"; String code = String.valueOf(getCodeToSend()); int size = code.length(); @@ -16,7 +13,7 @@ public class BetterPvP { return toReturn; } - private int getCodeToSend() { + private static int getCodeToSend() { int code = 0; code |= 0; int armourStatusMask = 2; diff --git a/src/main/java/eu/univento/core/api/player/CustomPlayer.java b/src/main/java/eu/univento/core/api/player/CustomPlayer.java index 1237db0..1fd6bde 100644 --- a/src/main/java/eu/univento/core/api/player/CustomPlayer.java +++ b/src/main/java/eu/univento/core/api/player/CustomPlayer.java @@ -8,15 +8,15 @@ import eu.univento.commons.player.warn.WarnReason; import eu.univento.core.Core; import eu.univento.core.api.Hologram; import eu.univento.core.api.Utils; +import eu.univento.core.api.chat.DefaultFontInfo; import eu.univento.core.api.effects.Blackscreen; import eu.univento.core.api.effects.Effects; import eu.univento.core.api.languages.Messages; import eu.univento.core.api.server.ServerSettings; -import eu.univento.core.api.server.Servers; import eu.univento.core.api.shop.ShopItem; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import net.minecraft.server.v1_10_R1.*; +import net.minecraft.server.v1_11_R1.*; import org.bukkit.*; import org.bukkit.Material; import org.bukkit.World; @@ -27,16 +27,17 @@ import org.bukkit.boss.BarColor; import org.bukkit.boss.BarFlag; import org.bukkit.boss.BarStyle; import org.bukkit.boss.BossBar; -import org.bukkit.craftbukkit.v1_10_R1.CraftServer; -import org.bukkit.craftbukkit.v1_10_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_11_R1.CraftServer; +import org.bukkit.craftbukkit.v1_11_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.scoreboard.Scoreboard; import org.bukkit.scoreboard.Team; import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.lang.reflect.Field; @@ -139,7 +140,15 @@ public class CustomPlayer extends CraftPlayer { } public void connectToServer(String server) { - Servers.connectServer(PLAYER, server); + ByteArrayOutputStream b = new ByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(b); + try { + out.writeUTF("Connect"); + out.writeUTF(server); + } catch (IOException el) { + el.printStackTrace(); + } + sendPluginMessage(Core.getInstance(), "BungeeCord", b.toByteArray()); } public void warn(WarnReason reason, CustomPlayer warner, String proof) { @@ -321,9 +330,45 @@ public class CustomPlayer extends CraftPlayer { return new Messages(this); } + public void sendCentredMessage(Player player, String message) { + if(message == null || message.equals("")) { + player.sendMessage(""); + return; + } + message = ChatColor.translateAlternateColorCodes('&', message); + + int messagePxSize = 0; + boolean previousCode = false; + boolean isBold = false; + + for(char c : message.toCharArray()){ + if(c == '§'){ + previousCode = true; + }else if(previousCode){ + previousCode = false; + isBold = c == 'l' || c == 'L'; + }else{ + DefaultFontInfo dFI = DefaultFontInfo.getDefaultFontInfo(c); + messagePxSize += isBold ? dFI.getBoldLength() : dFI.getLength(); + messagePxSize++; + } + } + int CENTER_PX = 154; + int halvedMessageSize = messagePxSize / 2; + int toCompensate = CENTER_PX - halvedMessageSize; + int spaceLength = DefaultFontInfo.SPACE.getLength() + 1; + int compensated = 0; + StringBuilder sb = new StringBuilder(); + while(compensated < toCompensate){ + sb.append(" "); + compensated += spaceLength; + } + sendMessage(sb.toString() + message); + } + public void strikeLightning(Location loc) { World nmsWorld = (World) ((CraftWorld) loc.getWorld()).getHandle(); - EntityLightning lightning = new EntityLightning((net.minecraft.server.v1_10_R1.World) nmsWorld, loc.getX(), loc.getY(), loc.getZ(), true); + EntityLightning lightning = new EntityLightning((net.minecraft.server.v1_11_R1.World) nmsWorld, loc.getX(), loc.getY(), loc.getZ(), true); sendPacket(new PacketPlayOutSpawnEntityWeather(lightning)); playSound(loc, Sound.ENTITY_LIGHTNING_IMPACT, 20.0F, 1.0F); playSound(loc, Sound.ENTITY_LIGHTNING_THUNDER, 20.0F, 1.0F); @@ -429,7 +474,7 @@ public class CustomPlayer extends CraftPlayer { if(loc.getBlock().getType() != Material.CHEST) return; byte dataByte = (open) ? (byte) 1 : 0; BlockPosition position = new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); - PacketPlayOutBlockAction blockActionPacket = new PacketPlayOutBlockAction(position, net.minecraft.server.v1_10_R1.Block.getById(loc.getBlock().getTypeId()), (byte) 1, dataByte); + PacketPlayOutBlockAction blockActionPacket = new PacketPlayOutBlockAction(position, net.minecraft.server.v1_11_R1.Block.getById(loc.getBlock().getTypeId()), (byte) 1, dataByte); sendPacket(blockActionPacket); } diff --git a/src/main/java/eu/univento/core/api/player/NickName.java b/src/main/java/eu/univento/core/api/player/NickName.java index 67dcd53..bcc5a35 100644 --- a/src/main/java/eu/univento/core/api/player/NickName.java +++ b/src/main/java/eu/univento/core/api/player/NickName.java @@ -8,11 +8,16 @@ import java.util.Random; * @author joethei * @version 1.1 */ + public class NickName { - /** + + /** * gets random Nickname * @return String */ + + //FIXME: change to users from ban list + @Deprecated public static String getRandomNick() { ArrayList names = new ArrayList<>(); names.add("GommeHD"); diff --git a/src/main/java/eu/univento/core/api/schematic/Cuboid.java b/src/main/java/eu/univento/core/api/schematic/Cuboid.java index 05f2a39..2dd2a37 100644 --- a/src/main/java/eu/univento/core/api/schematic/Cuboid.java +++ b/src/main/java/eu/univento/core/api/schematic/Cuboid.java @@ -11,7 +11,7 @@ import java.util.stream.Collectors; /** * @author desht (Original code), KingFaris10 (Editor of code) - * @version 0.1 + * @version 1.0 */ public class Cuboid implements Cloneable, ConfigurationSerializable, Iterable { @@ -66,7 +66,7 @@ public class Cuboid implements Cloneable, ConfigurationSerializable, Iterable channelFuture = (List) FIELD_SERVERCONNECTION_CHANNELFUTURE.get(connection); @@ -132,7 +132,7 @@ public class NettyInjection { } } - private final void unregisterGlobalChannel() { + private void unregisterGlobalChannel() { for (Channel global : this.globalChannel) { final ChannelPipeline pipe = global.pipeline(); global.eventLoop().execute(() -> pipe.remove("NettyInjectionGlobal")); @@ -148,15 +148,15 @@ public class NettyInjection { this.handlerList.remove(name); } - public final void inject(Player player) { + private void inject(Player player) { this.injectChannel(this.getChannel(player)).player = player; } - public final void uninject(Player player) { + private void uninject(Player player) { this.uninjectChannel(this.getChannel(player)); } - private final Channel getChannel(Player player) { + private Channel getChannel(Player player) { Channel channel = this.playerChannel.get(player.getName()); if (channel == null) { channel = FIELD_NETWORKMANAGER_CHANNEL.get(FIELD_PLAYERCONNECTION_NETWORKMANAGER.get(FIELD_ENTITYPLAYER_PLAYERCONNECTION.get(FIELD_CRAFTPLAYER_ENTITY.get(player)))); @@ -165,7 +165,7 @@ public class NettyInjection { return channel; } - private final PacketInjection injectChannel(Channel channel) { + private PacketInjection injectChannel(Channel channel) { try { PacketInjection handel = (PacketInjection) channel.pipeline().get(this.handlerName); if (handel == null) { @@ -178,7 +178,7 @@ public class NettyInjection { } } - private final void uninjectChannel(Channel channel) { + private void uninjectChannel(Channel channel) { Object handel = channel.pipeline().get(this.handlerName); if (handel != null) channel.pipeline().remove(this.handlerName); @@ -196,6 +196,7 @@ public class NettyInjection { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + assert CLASS_PACKERLOGININSTART != null; if (CLASS_PACKERLOGININSTART.isInstance(msg)) NettyInjection.this.playerChannel.put(FIELD_GAMEPROFILE_NAME.get(FIELD_PACKERLOGININSTART_GAMEPROFILE.get(msg)), ctx.channel()); for (PacketHandler handel : NettyInjection.this.handlerList.values()) { diff --git a/src/main/java/eu/univento/core/api/utils/RandomCollection.java b/src/main/java/eu/univento/core/api/utils/RandomCollection.java index cd99bae..162def1 100644 --- a/src/main/java/eu/univento/core/api/utils/RandomCollection.java +++ b/src/main/java/eu/univento/core/api/utils/RandomCollection.java @@ -4,8 +4,7 @@ import java.util.NavigableMap; import java.util.Random; import java.util.TreeMap; -class RandomCollection -{ +class RandomCollection { private final NavigableMap map = new TreeMap<>(); private final Random random; private double total = 0.0D; diff --git a/src/main/java/eu/univento/core/api/utils/UUIDFetcher.java b/src/main/java/eu/univento/core/api/utils/UUIDFetcher.java index 33be615..508a060 100644 --- a/src/main/java/eu/univento/core/api/utils/UUIDFetcher.java +++ b/src/main/java/eu/univento/core/api/utils/UUIDFetcher.java @@ -1,5 +1,9 @@ package eu.univento.core.api.utils; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.mojang.util.UUIDTypeAdapter; + import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; @@ -11,12 +15,9 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.function.Consumer; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.mojang.util.UUIDTypeAdapter; - /** * @author Jofkos + * @version 1.0 */ public class UUIDFetcher{ diff --git a/src/main/java/eu/univento/core/api/utils/Vectors.java b/src/main/java/eu/univento/core/api/utils/Vectors.java index 617978c..96b3e44 100644 --- a/src/main/java/eu/univento/core/api/utils/Vectors.java +++ b/src/main/java/eu/univento/core/api/utils/Vectors.java @@ -2,44 +2,44 @@ package eu.univento.core.api.utils; import org.bukkit.util.Vector; -final class Vectors -{ - private static Vector rotateAroundAxisX(Vector v, double angle) - { - double cos = Math.cos(angle); - double sin = Math.sin(angle); - double y = v.getY() * cos - v.getZ() * sin; - double z = v.getY() * sin + v.getZ() * cos; - return v.setY(y).setZ(z); - } +/** + * @author joethei + * @version 1.0 + */ - private static Vector rotateAroundAxisY(Vector v, double angle) - { - double cos = Math.cos(angle); - double sin = Math.sin(angle); - double x = v.getX() * cos + v.getZ() * sin; - double z = v.getX() * -sin + v.getZ() * cos; - return v.setX(x).setZ(z); - } +final class Vectors { + private static Vector rotateAroundAxisX(Vector v, double angle) { + double cos = Math.cos(angle); + double sin = Math.sin(angle); + double y = v.getY() * cos - v.getZ() * sin; + double z = v.getY() * sin + v.getZ() * cos; + return v.setY(y).setZ(z); + } - private static Vector rotateAroundAxisZ(Vector v, double angle) - { - double cos = Math.cos(angle); - double sin = Math.sin(angle); - double x = v.getX() * cos - v.getY() * sin; - double y = v.getX() * sin + v.getY() * cos; - return v.setX(x).setY(y); - } + private static Vector rotateAroundAxisY(Vector v, double angle) { + double cos = Math.cos(angle); + double sin = Math.sin(angle); + double x = v.getX() * cos + v.getZ() * sin; + double z = v.getX() * -sin + v.getZ() * cos; + return v.setX(x).setZ(z); + } - public static Vector rotateVector(Vector v, double angleX, double angleY, double angleZ) - { - rotateAroundAxisX(v, angleX); - rotateAroundAxisY(v, angleY); - rotateAroundAxisZ(v, angleZ); - return v; - } + private static Vector rotateAroundAxisZ(Vector v, double angle) { + double cos = Math.cos(angle); + double sin = Math.sin(angle); + double x = v.getX() * cos - v.getY() * sin; + double y = v.getX() * sin + v.getY() * cos; + return v.setX(x).setY(y); + } - public static double angleToXAxis(Vector vector) { - return Math.atan2(vector.getX(), vector.getY()); - } + public static Vector rotateVector(Vector v, double angleX, double angleY, double angleZ) { + rotateAroundAxisX(v, angleX); + rotateAroundAxisY(v, angleY); + rotateAroundAxisZ(v, angleZ); + return v; + } + + public static double angleToXAxis(Vector vector) { + return Math.atan2(vector.getX(), vector.getY()); + } } \ No newline at end of file diff --git a/src/main/java/eu/univento/core/commands/Nick.java b/src/main/java/eu/univento/core/commands/Nick.java index a6a4fbe..30a37fb 100644 --- a/src/main/java/eu/univento/core/commands/Nick.java +++ b/src/main/java/eu/univento/core/commands/Nick.java @@ -28,7 +28,6 @@ public class Nick extends AutoCommand{ super(plugin, command, description, aliases); } - @SuppressWarnings("deprecation") @Override public boolean execute(CommandSender sender, String label, String[] args) { if(sender instanceof Player) { diff --git a/src/main/java/eu/univento/core/commands/SetRank.java b/src/main/java/eu/univento/core/commands/SetRank.java index 44836e9..a3ef373 100644 --- a/src/main/java/eu/univento/core/commands/SetRank.java +++ b/src/main/java/eu/univento/core/commands/SetRank.java @@ -17,6 +17,7 @@ import java.util.stream.Collectors; * @author joethei * @version 1.0 */ + public class SetRank extends AutoCommand{ public SetRank(Core plugin, String command, String description, String... aliases) { diff --git a/src/main/java/eu/univento/core/commands/SystemInfo.java b/src/main/java/eu/univento/core/commands/SystemInfo.java index 84705a6..ad26575 100644 --- a/src/main/java/eu/univento/core/commands/SystemInfo.java +++ b/src/main/java/eu/univento/core/commands/SystemInfo.java @@ -27,6 +27,7 @@ public class SystemInfo extends AutoCommand{ * @param description describes the commons * @param aliases aliases of commons */ + public SystemInfo(Core plugin, String command, String description, String... aliases) { super(plugin, command, description, aliases); } diff --git a/src/main/java/eu/univento/core/commands/Timeout.java b/src/main/java/eu/univento/core/commands/Timeout.java index fd88d1d..5da1663 100644 --- a/src/main/java/eu/univento/core/commands/Timeout.java +++ b/src/main/java/eu/univento/core/commands/Timeout.java @@ -16,6 +16,7 @@ import java.util.List; * @author joethei * @version 0.1 */ + public class Timeout extends AutoCommand { public Timeout(Core plugin, String command, String description, String... aliases) { diff --git a/src/main/java/eu/univento/core/commands/Vanish.java b/src/main/java/eu/univento/core/commands/Vanish.java index 01877cb..47ee37c 100644 --- a/src/main/java/eu/univento/core/commands/Vanish.java +++ b/src/main/java/eu/univento/core/commands/Vanish.java @@ -17,6 +17,7 @@ import java.util.List; * @author joethei * @version 1.0 */ + public class Vanish extends AutoCommand{ /** diff --git a/src/main/java/eu/univento/core/listeners/Blocks.java b/src/main/java/eu/univento/core/listeners/Blocks.java index b7b4af0..3fbae4d 100644 --- a/src/main/java/eu/univento/core/listeners/Blocks.java +++ b/src/main/java/eu/univento/core/listeners/Blocks.java @@ -14,6 +14,7 @@ import org.bukkit.event.block.BlockPlaceEvent; * @author joethei * @version 1.0 */ + public class Blocks implements Listener{ /** diff --git a/src/main/java/eu/univento/core/listeners/Chat.java b/src/main/java/eu/univento/core/listeners/Chat.java index 836ca8e..b3329f9 100644 --- a/src/main/java/eu/univento/core/listeners/Chat.java +++ b/src/main/java/eu/univento/core/listeners/Chat.java @@ -34,6 +34,7 @@ import java.util.Map; * @author joethei * @version 1.0 */ + public class Chat implements Listener { private List players = new LinkedList<>(); diff --git a/src/main/java/eu/univento/core/listeners/Commands.java b/src/main/java/eu/univento/core/listeners/Commands.java index 11476f4..4341ddc 100644 --- a/src/main/java/eu/univento/core/listeners/Commands.java +++ b/src/main/java/eu/univento/core/listeners/Commands.java @@ -16,6 +16,7 @@ import org.bukkit.help.HelpTopic; * @author joethei * @version 1.0 */ + public class Commands implements Listener{ diff --git a/src/main/java/eu/univento/core/listeners/Events.java b/src/main/java/eu/univento/core/listeners/Events.java index 602df17..64b5569 100644 --- a/src/main/java/eu/univento/core/listeners/Events.java +++ b/src/main/java/eu/univento/core/listeners/Events.java @@ -22,8 +22,9 @@ import org.bukkit.util.Vector; * some basic events * * @author joethei - * @version 0.2 + * @version 1.0 */ + public class Events implements Listener { @EventHandler @@ -43,6 +44,7 @@ public class Events implements Listener { if (p.getLocation().getY() <= 0) { p.setVelocity(new Vector().setY(10.0D).multiply(1.0D)); p.setGliding(true); + } } @@ -90,4 +92,5 @@ public class Events implements Listener { } } } + } \ No newline at end of file diff --git a/src/main/java/eu/univento/core/listeners/JoinQuit.java b/src/main/java/eu/univento/core/listeners/JoinQuit.java index ab48fb0..b5412e3 100644 --- a/src/main/java/eu/univento/core/listeners/JoinQuit.java +++ b/src/main/java/eu/univento/core/listeners/JoinQuit.java @@ -12,10 +12,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerKickEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerResourcePackStatusEvent; +import org.bukkit.event.player.*; import org.bukkit.scoreboard.Team; import java.io.ByteArrayOutputStream; @@ -34,13 +31,17 @@ public class JoinQuit implements Listener { private List firstJoin = new LinkedList<>(); private List loading = new LinkedList<>(); + @EventHandler + public void onPreLogin(AsyncPlayerPreLoginEvent e) { + if(!Core.getCommons().getSecurityHandler().isValidServer(e.getAddress().getHostAddress())) { + e.setKickMessage("Im sorry, you can only join from our official IP: play.univento.eu"); + e.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_BANNED); + } + } + @EventHandler public void onJoin(PlayerJoinEvent e) { CustomPlayer p = CustomPlayer.getPlayer(e.getPlayer()); - if(!p.hasPlayedBefore()) { - - } - for (Player players : Bukkit.getOnlinePlayers()) { CustomPlayer player = CustomPlayer.getPlayer(players); if (Vanish.getPlayers().contains(player)) @@ -64,7 +65,7 @@ public class JoinQuit implements Listener { labyModFeatures.put(LabyMod.EXTRAS, false); p.setLabyModFeatures(labyModFeatures); - p.sendMessage(new BetterPvP().getCodeString()); + p.sendMessage(BetterPvP.getCodeString()); //disable code for minimap mod p.sendMessage("§A§n§t§i§M§i§n§i§m§a§p"); @@ -90,7 +91,6 @@ public class JoinQuit implements Listener { //p.setStoryResourcePack(); loading.add(p); - } @EventHandler diff --git a/src/main/java/eu/univento/core/listeners/NPCEvents.java b/src/main/java/eu/univento/core/listeners/NPCEvents.java index fe35e6d..2d337a7 100644 --- a/src/main/java/eu/univento/core/listeners/NPCEvents.java +++ b/src/main/java/eu/univento/core/listeners/NPCEvents.java @@ -6,6 +6,7 @@ import org.bukkit.event.Listener; * @author joethei * @version 0.1 */ + public class NPCEvents implements Listener { } \ No newline at end of file diff --git a/src/main/java/eu/univento/core/listeners/PluginMessenger.java b/src/main/java/eu/univento/core/listeners/PluginMessenger.java index 6597471..3656856 100644 --- a/src/main/java/eu/univento/core/listeners/PluginMessenger.java +++ b/src/main/java/eu/univento/core/listeners/PluginMessenger.java @@ -10,11 +10,27 @@ import org.bukkit.plugin.messaging.PluginMessageListener; import java.io.UnsupportedEncodingException; +/** + * @author joethei + * @version 1.0 + */ + public class PluginMessenger implements PluginMessageListener { @Override public void onPluginMessageReceived(String channel, Player player, byte[] data) { CustomPlayer p = CustomPlayer.getPlayer(player); + String string = null; + try { + string = new String (data, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + assert string != null; + if(string.endsWith("squidhq")) { + p.warn(WarnReason.SPAM, null, "https://players.univento.eu/" + p.getUniqueId().toString() + "/hacks"); + } + if (channel.equals("WDL|INIT")) { String version = null; if(data.length == 0) version = "vor 1.8d"; @@ -27,41 +43,47 @@ public class PluginMessenger implements PluginMessageListener { p.sendMessage(p.getDatabasePlayer().getLanguage().getWord("Prefix") + p.getDatabasePlayer().getLanguage().getWord("Hack.WorldDownloader")); } if(channel.equals("WDL|CONTROL")) { - p.sendPluginMessage(Core.getInstance(), "WDL|CONTROL", createWDLPacket(0, false, false, false, false)); + ByteArrayDataOutput output = ByteStreams.newDataOutput(); + + output.writeInt(1); + + output.writeBoolean(false); + output.writeInt(0); + output.writeBoolean(false); + output.writeBoolean(false); + output.writeBoolean(false); + output.writeBoolean(false); + + p.sendPluginMessage(Core.getInstance(), "WDL|CONTROL", output.toByteArray()); } - if (channel.equals("PERMISSIONSREPL") && new String(data).contains("mod.worlddownloader")) { + if (channel.equals("PERMISSIONSREPL") && string.contains("mod.worlddownloader")) { //TODO: change to real warn reason p.warn(WarnReason.SPAM, null, "https://players.univento.eu/" + p.getUniqueId().toString() + "/hacks"); p.sendMessage(p.getDatabasePlayer().getLanguage().getWord("Prefix") + p.getDatabasePlayer().getLanguage().getWord("Hack.WorldDownloader")); } if(channel.equals("5zig_Set")) { - try { - String version = new String(data, "UTF-8"); - Core.getCommons().getLoggingHandler().getCore().info(p.getName() + " hat den 5zig Mod Version : " + version); - //https://gist.github.com/5zig/35e0854504edda418f4b shows why - ByteArrayDataOutput dataOutput = ByteStreams.newDataOutput(); - dataOutput.writeByte(0x01 | 0x02 | 0x02 | 0x04 | 0x08 | 0x010); - p.sendPluginMessage(Core.getInstance(), "5zig_Set", dataOutput.toByteArray()); - p.sendPluginMessage(Core.getInstance(), "5zig_Set", new byte[]{0x01 | 0x02 | 0x04 | 0x08 | 0x10}); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } + //https://gist.github.com/5zig/35e0854504edda418f4b shows why its done that way + + ByteArrayDataOutput output1 = ByteStreams.newDataOutput(); + output1.write(0x01); + p.sendPluginMessage(Core.getInstance(), "5zig_Set", output1.toByteArray()); + + ByteArrayDataOutput output2 = ByteStreams.newDataOutput(); + output2.write(0x02); + p.sendPluginMessage(Core.getInstance(), "5zig_Set", output2.toByteArray()); + + ByteArrayDataOutput output3 = ByteStreams.newDataOutput(); + output3.write(0x04); + p.sendPluginMessage(Core.getInstance(), "5zig_Set", output3.toByteArray()); + + ByteArrayDataOutput output4 = ByteStreams.newDataOutput(); + output4.write(0x08); + p.sendPluginMessage(Core.getInstance(), "5zig_Set", output4.toByteArray()); + + ByteArrayDataOutput output5 = ByteStreams.newDataOutput(); + output5.write(0x10); + p.sendPluginMessage(Core.getInstance(), "5zig_Set", output5.toByteArray()); + } } - - //TODO: - private byte[] createWDLPacket(int saveRadius, boolean cacheChunks, boolean saveEntities, boolean saveTileEntities, boolean saveContainers) { - ByteArrayDataOutput output = ByteStreams.newDataOutput(); - - output.writeInt(1); - - output.writeBoolean(cacheChunks); - output.writeInt(saveRadius); - output.writeBoolean(saveEntities); - output.writeBoolean(saveTileEntities); - output.writeBoolean(saveContainers); - output.writeBoolean(false); - - return output.toByteArray(); - } } diff --git a/src/main/java/eu/univento/core/listeners/WeaponEvents.java b/src/main/java/eu/univento/core/listeners/WeaponEvents.java index 070af27..3b5aed3 100644 --- a/src/main/java/eu/univento/core/listeners/WeaponEvents.java +++ b/src/main/java/eu/univento/core/listeners/WeaponEvents.java @@ -10,7 +10,7 @@ import org.bukkit.event.player.PlayerInteractEvent; /** * @author joethei - * @version 0.1 + * @version 1.0 */ public class WeaponEvents implements Listener {