From d390adde383fdb1415ea3f01c0f777ef563a42d5 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Tue, 10 May 2016 03:28:38 +1200 Subject: [PATCH] Convert back to maven --- .classpath | 20 + .project | 23 + .settings/org.eclipse.core.resources.prefs | 3 + .settings/org.eclipse.jdt.core.prefs | 12 + .settings/org.eclipse.m2e.core.prefs | 4 + .../libraryaddict/disguise/DisguiseAPI.class | Bin 0 -> 6791 bytes .../disguise/DisguiseConfig.class | Bin 0 -> 8529 bytes .../disguise/DisguiseListener.class | Bin 0 -> 10459 bytes .../disguise/LibsDisguises.class | Bin 0 -> 9135 bytes ...sguiseCommand$DisguiseParseException.class | Bin 0 -> 5268 bytes .../commands/BaseDisguiseCommand.class | Bin 0 -> 12540 bytes .../commands/CloneDisguiseCommand.class | Bin 0 -> 3275 bytes .../disguise/commands/DisguiseCommand.class | Bin 0 -> 3838 bytes .../disguise/commands/DisguiseViewSelf.class | Bin 0 -> 1950 bytes .../commands/EntityDisguiseCommand.class | Bin 0 -> 3328 bytes .../HelpDisguiseCommand$EnumHelp.class | Bin 0 -> 5384 bytes .../commands/HelpDisguiseCommand.class | Bin 0 -> 7237 bytes .../commands/LibsDisguisesCommand.class | Bin 0 -> 1832 bytes .../commands/PlayerDisguiseCommand.class | Bin 0 -> 4236 bytes .../commands/RadiusDisguiseCommand.class | Bin 0 -> 6939 bytes .../disguise/commands/UndisguiseCommand.class | Bin 0 -> 2019 bytes .../commands/UndisguiseEntityCommand.class | Bin 0 -> 1657 bytes .../commands/UndisguisePlayerCommand.class | Bin 0 -> 2105 bytes .../commands/UndisguiseRadiusCommand.class | Bin 0 -> 2541 bytes .../disguise/disguisetypes/AnimalColor.class | Bin 0 -> 1256 bytes .../disguise/disguisetypes/Disguise.class | Bin 0 -> 12761 bytes .../disguise/disguisetypes/DisguiseType.class | Bin 0 -> 6669 bytes .../disguise/disguisetypes/FlagWatcher.class | Bin 0 -> 14602 bytes .../disguise/disguisetypes/MiscDisguise.class | Bin 0 -> 5642 bytes .../disguise/disguisetypes/MobDisguise.class | Bin 0 -> 7659 bytes .../disguisetypes/PlayerDisguise.class | Bin 0 -> 9072 bytes .../disguise/disguisetypes/RabbitType.class | Bin 0 -> 1114 bytes .../TargetedDisguise$TargetType.class | Bin 0 -> 1464 bytes .../disguisetypes/TargetedDisguise.class | Bin 0 -> 3219 bytes .../watchers/AgeableWatcher.class | Bin 0 -> 1935 bytes .../watchers/AreaEffectCloudWatcher.class | Bin 0 -> 2974 bytes .../watchers/ArmorStandWatcher.class | Bin 0 -> 3087 bytes .../disguisetypes/watchers/ArrowWatcher.class | Bin 0 -> 1551 bytes .../disguisetypes/watchers/BatWatcher.class | Bin 0 -> 1546 bytes .../disguisetypes/watchers/BlazeWatcher.class | Bin 0 -> 1578 bytes .../disguisetypes/watchers/BoatWatcher.class | Bin 0 -> 1543 bytes .../watchers/CreeperWatcher.class | Bin 0 -> 1974 bytes .../watchers/DroppedItemWatcher.class | Bin 0 -> 1700 bytes .../watchers/EnderCrystalWatcher.class | Bin 0 -> 2678 bytes .../watchers/EnderDragonWatcher.class | Bin 0 -> 1619 bytes .../watchers/EndermanWatcher.class | Bin 0 -> 3239 bytes .../watchers/FallingBlockWatcher.class | Bin 0 -> 2952 bytes .../disguisetypes/watchers/GhastWatcher.class | Bin 0 -> 1584 bytes .../watchers/GuardianWatcher.class | Bin 0 -> 3407 bytes .../disguisetypes/watchers/HorseWatcher.class | Bin 0 -> 8808 bytes .../watchers/ItemFrameWatcher.class | Bin 0 -> 2748 bytes .../watchers/LivingWatcher.class | Bin 0 -> 6699 bytes .../watchers/MinecartWatcher.class | Bin 0 -> 3813 bytes .../watchers/OcelotWatcher.class | Bin 0 -> 1728 bytes .../watchers/PaintingWatcher.class | Bin 0 -> 2497 bytes .../disguisetypes/watchers/PigWatcher.class | Bin 0 -> 1559 bytes .../watchers/PlayerWatcher.class | Bin 0 -> 9606 bytes .../watchers/RabbitWatcher.class | Bin 0 -> 1861 bytes .../disguisetypes/watchers/SheepWatcher.class | Bin 0 -> 3350 bytes .../watchers/ShulkerWatcher.class | Bin 0 -> 2370 bytes .../watchers/SkeletonWatcher.class | Bin 0 -> 1688 bytes .../disguisetypes/watchers/SlimeWatcher.class | Bin 0 -> 1629 bytes .../watchers/SplashPotionWatcher.class | Bin 0 -> 2010 bytes .../watchers/TameableWatcher.class | Bin 0 -> 3057 bytes .../watchers/TippedArrowWatcher.class | Bin 0 -> 1804 bytes .../watchers/VillagerWatcher.class | Bin 0 -> 2155 bytes .../disguisetypes/watchers/WitchWatcher.class | Bin 0 -> 1584 bytes .../watchers/WitherSkullWatcher.class | Bin 0 -> 1609 bytes .../watchers/WitherWatcher.class | Bin 0 -> 2976 bytes .../disguisetypes/watchers/WolfWatcher.class | Bin 0 -> 3904 bytes .../watchers/ZombieWatcher.class | Bin 0 -> 4259 bytes .../disguise/events/DisguiseEvent.class | Bin 0 -> 3337 bytes .../disguise/events/UndisguiseEvent.class | Bin 0 -> 3355 bytes .../disguise/utilities/ClassGetter.class | Bin 0 -> 1367 bytes .../utilities/DisguiseSound$SoundType.class | Bin 0 -> 4887 bytes .../disguise/utilities/DisguiseSound.class | Bin 0 -> 7625 bytes .../utilities/DisguiseUtilities.class | Bin 0 -> 12476 bytes .../disguise/utilities/DisguiseValues.class | Bin 0 -> 3935 bytes .../disguise/utilities/FakeBoundingBox.class | Bin 0 -> 911 bytes .../utilities/LibsProfileLookup.class | Bin 0 -> 716 bytes .../utilities/LibsProfileLookupCaller.class | Bin 0 -> 2031 bytes .../disguise/utilities/Metrics$Graph.class | Bin 0 -> 3889 bytes .../disguise/utilities/Metrics$Plotter.class | Bin 0 -> 3335 bytes .../disguise/utilities/Metrics.class | Bin 0 -> 6476 bytes .../disguise/utilities/PacketsManager.class | Bin 0 -> 9029 bytes .../utilities/ReflectionManager.class | Bin 0 -> 16399 bytes .../disguise/utilities/UpdateChecker.class | Bin 0 -> 1188 bytes {src => bin}/main/resources/config.yml | 0 {src => bin}/main/resources/plugin.yml | 0 build.gradle | 95 - config.yml | 130 ++ plugin.yml | 103 + pom.xml | 74 + settings.gradle | 1 - .../disguise/disguisetypes/DisguiseType.java | 290 --- .../libraryaddict/disguise/DisguiseAPI.java | 357 +++- .../disguise/DisguiseConfig.java | 271 ++- .../disguise/DisguiseListener.java | 28 +- .../libraryaddict/disguise/LibsDisguises.java | 381 ++-- .../commands/BaseDisguiseCommand.java | 33 +- .../commands/CloneDisguiseCommand.java | 11 +- .../disguise/commands/DisguiseCommand.java | 15 +- .../disguise/commands/DisguiseViewSelf.java | 3 +- .../commands/EntityDisguiseCommand.java | 15 +- .../commands/HelpDisguiseCommand.java | 21 +- .../commands/LibsDisguisesCommand.java | 3 +- .../commands/PlayerDisguiseCommand.java | 15 +- .../commands/RadiusDisguiseCommand.java | 183 +- .../disguise/commands/UndisguiseCommand.java | 4 +- .../commands/UndisguiseEntityCommand.java | 3 +- .../commands/UndisguisePlayerCommand.java | 4 +- .../commands/UndisguiseRadiusCommand.java | 4 +- .../disguise/disguisetypes/AnimalColor.java | 20 +- .../disguise/disguisetypes/Disguise.java | 767 ++++--- .../disguise/disguisetypes/DisguiseType.java | 389 ++++ .../disguise/disguisetypes/FlagWatcher.java | 495 +++-- .../disguise/disguisetypes/MiscDisguise.java | 11 +- .../disguise/disguisetypes/MobDisguise.java | 8 +- .../disguisetypes/PlayerDisguise.java | 8 +- .../disguise/disguisetypes/RabbitType.java | 19 +- .../disguisetypes/TargetedDisguise.java | 84 +- .../watchers/AgeableWatcher.java | 3 +- .../watchers/AreaEffectCloudWatcher.java | 4 +- .../watchers/ArmorStandWatcher.java | 51 +- .../disguisetypes/watchers/ArrowWatcher.java | 0 .../disguisetypes/watchers/BatWatcher.java | 0 .../disguisetypes/watchers/BlazeWatcher.java | 13 +- .../disguisetypes/watchers/BoatWatcher.java | 17 +- .../watchers/CreeperWatcher.java | 0 .../watchers/DroppedItemWatcher.java | 3 +- .../watchers/EnderCrystalWatcher.java | 21 +- .../watchers/EnderDragonWatcher.java | 0 .../watchers/EndermanWatcher.java | 8 +- .../watchers/FallingBlockWatcher.java | 5 +- .../disguisetypes/watchers/GhastWatcher.java | 0 .../watchers/GuardianWatcher.java | 3 +- .../disguisetypes/watchers/HorseWatcher.java | 153 +- .../watchers/ItemFrameWatcher.java | 3 +- .../disguisetypes/watchers/LivingWatcher.java | 136 +- .../watchers/MinecartWatcher.java | 3 +- .../disguisetypes/watchers/OcelotWatcher.java | 3 +- .../watchers/PaintingWatcher.java | 3 +- .../disguisetypes/watchers/PigWatcher.java | 0 .../disguisetypes/watchers/PlayerWatcher.java | 6 +- .../disguisetypes/watchers/RabbitWatcher.java | 0 .../disguisetypes/watchers/SheepWatcher.java | 3 +- .../watchers/ShulkerWatcher.java | 4 +- .../watchers/SkeletonWatcher.java | 3 +- .../disguisetypes/watchers/SlimeWatcher.java | 0 .../watchers/SplashPotionWatcher.java | 0 .../watchers/TameableWatcher.java | 46 +- .../watchers/TippedArrowWatcher.java | 3 +- .../watchers/VillagerWatcher.java | 3 +- .../disguisetypes/watchers/WitchWatcher.java | 0 .../watchers/WitherSkullWatcher.java | 0 .../disguisetypes/watchers/WitherWatcher.java | 5 +- .../disguisetypes/watchers/WolfWatcher.java | 3 +- .../disguisetypes/watchers/ZombieWatcher.java | 3 +- .../disguise/events/DisguiseEvent.java | 4 +- .../disguise/events/UndisguiseEvent.java | 4 +- .../disguise/utilities/ClassGetter.java | 51 +- .../disguise/utilities/DisguiseSound.java | 295 ++- .../disguise/utilities/DisguiseUtilities.java | 1189 +++++++---- .../disguise/utilities/DisguiseValues.java | 4 +- .../disguise/utilities/FakeBoundingBox.java | 0 .../disguise/utilities/LibsProfileLookup.java | 0 .../utilities/LibsProfileLookupCaller.java | 1 - .../disguise/utilities/Metrics.java | 386 ++-- .../disguise/utilities/PacketsManager.java | 1784 ++++++++++++----- .../disguise/utilities/ReflectionManager.java | 888 +++++--- .../disguise/utilities/UpdateChecker.java | 0 target/LibsDisguises.jar | Bin 0 -> 265247 bytes target/classes/README.md | 15 + target/classes/config.yml | 130 ++ .../libraryaddict/disguise/DisguiseAPI.class | Bin 0 -> 14375 bytes .../disguise/DisguiseConfig.class | Bin 0 -> 11404 bytes .../disguise/DisguiseListener$1$1.class | Bin 0 -> 1746 bytes .../disguise/DisguiseListener$1.class | Bin 0 -> 2448 bytes .../disguise/DisguiseListener$2.class | Bin 0 -> 1328 bytes .../disguise/DisguiseListener$3.class | Bin 0 -> 1210 bytes .../disguise/DisguiseListener$4.class | Bin 0 -> 1030 bytes .../disguise/DisguiseListener$5.class | Bin 0 -> 1025 bytes .../disguise/DisguiseListener$6.class | Bin 0 -> 1056 bytes .../disguise/DisguiseListener$7.class | Bin 0 -> 1047 bytes .../disguise/DisguiseListener.class | Bin 0 -> 21611 bytes .../disguise/LibsDisguises$1.class | Bin 0 -> 2105 bytes .../disguise/LibsDisguises.class | Bin 0 -> 16310 bytes .../commands/BaseDisguiseCommand$1.class | Bin 0 -> 1390 bytes ...sguiseCommand$DisguiseParseException.class | Bin 0 -> 971 bytes .../commands/BaseDisguiseCommand.class | Bin 0 -> 30326 bytes .../commands/CloneDisguiseCommand.class | Bin 0 -> 4086 bytes .../disguise/commands/DisguiseCommand.class | Bin 0 -> 4904 bytes .../disguise/commands/DisguiseViewSelf.class | Bin 0 -> 1794 bytes .../commands/EntityDisguiseCommand.class | Bin 0 -> 4833 bytes .../HelpDisguiseCommand$EnumHelp.class | Bin 0 -> 1897 bytes .../commands/HelpDisguiseCommand.class | Bin 0 -> 13392 bytes .../commands/LibsDisguisesCommand.class | Bin 0 -> 2401 bytes .../commands/PlayerDisguiseCommand.class | Bin 0 -> 5859 bytes .../commands/RadiusDisguiseCommand.class | Bin 0 -> 9422 bytes .../disguise/commands/UndisguiseCommand.class | Bin 0 -> 1876 bytes .../commands/UndisguiseEntityCommand.class | Bin 0 -> 1976 bytes .../commands/UndisguisePlayerCommand.class | Bin 0 -> 1975 bytes .../commands/UndisguiseRadiusCommand.class | Bin 0 -> 2976 bytes .../disguise/disguisetypes/AnimalColor.class | Bin 0 -> 2288 bytes .../disguise/disguisetypes/Disguise$1.class | Bin 0 -> 8210 bytes .../disguise/disguisetypes/Disguise$2.class | Bin 0 -> 807 bytes .../disguise/disguisetypes/Disguise$3.class | Bin 0 -> 2568 bytes .../disguise/disguisetypes/Disguise.class | Bin 0 -> 22448 bytes .../disguisetypes/DisguiseType$1.class | Bin 0 -> 1309 bytes .../disguise/disguisetypes/DisguiseType.class | Bin 0 -> 12757 bytes .../disguisetypes/FlagWatcher$1.class | Bin 0 -> 952 bytes .../disguise/disguisetypes/FlagWatcher.class | Bin 0 -> 16396 bytes .../disguisetypes/MiscDisguise$1.class | Bin 0 -> 1331 bytes .../disguise/disguisetypes/MiscDisguise.class | Bin 0 -> 13036 bytes .../disguise/disguisetypes/MobDisguise.class | Bin 0 -> 8761 bytes .../disguisetypes/PlayerDisguise$1.class | Bin 0 -> 1918 bytes .../disguisetypes/PlayerDisguise.class | Bin 0 -> 10303 bytes .../disguise/disguisetypes/RabbitType.class | Bin 0 -> 1793 bytes .../TargetedDisguise$TargetType.class | Bin 0 -> 1395 bytes .../disguisetypes/TargetedDisguise.class | Bin 0 -> 3448 bytes .../watchers/AgeableWatcher.class | Bin 0 -> 1252 bytes .../watchers/AreaEffectCloudWatcher.class | Bin 0 -> 1809 bytes .../watchers/ArmorStandWatcher.class | Bin 0 -> 2233 bytes .../disguisetypes/watchers/ArrowWatcher.class | Bin 0 -> 1053 bytes .../disguisetypes/watchers/BatWatcher.class | Bin 0 -> 1076 bytes .../disguisetypes/watchers/BlazeWatcher.class | Bin 0 -> 977 bytes .../disguisetypes/watchers/BoatWatcher.class | Bin 0 -> 968 bytes .../watchers/CreeperWatcher.class | Bin 0 -> 1198 bytes .../watchers/DroppedItemWatcher.class | Bin 0 -> 1044 bytes .../watchers/EnderCrystalWatcher.class | Bin 0 -> 1581 bytes .../watchers/EnderDragonWatcher.class | Bin 0 -> 996 bytes .../watchers/EndermanWatcher.class | Bin 0 -> 2607 bytes .../watchers/FallingBlockWatcher.class | Bin 0 -> 2100 bytes .../disguisetypes/watchers/GhastWatcher.class | Bin 0 -> 983 bytes .../watchers/GuardianWatcher.class | Bin 0 -> 2257 bytes .../disguisetypes/watchers/HorseWatcher.class | Bin 0 -> 5881 bytes .../watchers/ItemFrameWatcher.class | Bin 0 -> 1526 bytes .../watchers/LivingWatcher.class | Bin 0 -> 8663 bytes .../watchers/MinecartWatcher.class | Bin 0 -> 2070 bytes .../watchers/OcelotWatcher.class | Bin 0 -> 1253 bytes .../watchers/PaintingWatcher.class | Bin 0 -> 1729 bytes .../disguisetypes/watchers/PigWatcher.class | Bin 0 -> 972 bytes .../watchers/PlayerWatcher.class | Bin 0 -> 7901 bytes .../watchers/RabbitWatcher.class | Bin 0 -> 1547 bytes .../disguisetypes/watchers/SheepWatcher.class | Bin 0 -> 1939 bytes .../watchers/ShulkerWatcher.class | Bin 0 -> 1458 bytes .../watchers/SkeletonWatcher.class | Bin 0 -> 1338 bytes .../disguisetypes/watchers/SlimeWatcher.class | Bin 0 -> 1197 bytes .../watchers/SplashPotionWatcher.class | Bin 0 -> 1710 bytes .../watchers/TameableWatcher.class | Bin 0 -> 2012 bytes .../watchers/TippedArrowWatcher.class | Bin 0 -> 1476 bytes .../watchers/VillagerWatcher.class | Bin 0 -> 1680 bytes .../disguisetypes/watchers/WitchWatcher.class | Bin 0 -> 996 bytes .../watchers/WitherSkullWatcher.class | Bin 0 -> 982 bytes .../watchers/WitherWatcher.class | Bin 0 -> 1856 bytes .../disguisetypes/watchers/WolfWatcher.class | Bin 0 -> 2542 bytes .../watchers/ZombieWatcher.class | Bin 0 -> 2615 bytes .../disguise/events/DisguiseEvent.class | Bin 0 -> 1422 bytes .../disguise/events/UndisguiseEvent.class | Bin 0 -> 1428 bytes .../disguise/utilities/ClassGetter.class | Bin 0 -> 3868 bytes .../disguise/utilities/DisguiseSound$1.class | Bin 0 -> 1022 bytes .../utilities/DisguiseSound$SoundType.class | Bin 0 -> 1439 bytes .../disguise/utilities/DisguiseSound.class | Bin 0 -> 15201 bytes .../utilities/DisguiseUtilities$1.class | Bin 0 -> 2266 bytes .../utilities/DisguiseUtilities$10.class | Bin 0 -> 1611 bytes .../utilities/DisguiseUtilities$2.class | Bin 0 -> 2082 bytes .../utilities/DisguiseUtilities$3$1.class | Bin 0 -> 2102 bytes .../utilities/DisguiseUtilities$3.class | Bin 0 -> 2447 bytes .../utilities/DisguiseUtilities$4.class | Bin 0 -> 1356 bytes .../utilities/DisguiseUtilities$5.class | Bin 0 -> 1283 bytes .../utilities/DisguiseUtilities$6.class | Bin 0 -> 1234 bytes .../utilities/DisguiseUtilities$7.class | Bin 0 -> 1275 bytes .../utilities/DisguiseUtilities$8.class | Bin 0 -> 1266 bytes .../utilities/DisguiseUtilities$9.class | Bin 0 -> 1082 bytes .../utilities/DisguiseUtilities.class | Bin 0 -> 34561 bytes .../disguise/utilities/DisguiseValues$1.class | Bin 0 -> 1407 bytes .../disguise/utilities/DisguiseValues.class | Bin 0 -> 8234 bytes .../disguise/utilities/FakeBoundingBox.class | Bin 0 -> 719 bytes .../utilities/LibsProfileLookup.class | Bin 0 -> 228 bytes .../utilities/LibsProfileLookupCaller.class | Bin 0 -> 1170 bytes .../disguise/utilities/Metrics$1.class | Bin 0 -> 2534 bytes .../disguise/utilities/Metrics$Graph.class | Bin 0 -> 2195 bytes .../disguise/utilities/Metrics$Plotter.class | Bin 0 -> 1176 bytes .../disguise/utilities/Metrics.class | Bin 0 -> 14722 bytes .../disguise/utilities/PacketsManager$1.class | Bin 0 -> 4508 bytes .../disguise/utilities/PacketsManager$2.class | Bin 0 -> 11037 bytes .../utilities/PacketsManager$3$1.class | Bin 0 -> 1642 bytes .../disguise/utilities/PacketsManager$3.class | Bin 0 -> 7453 bytes .../utilities/PacketsManager$4$1.class | Bin 0 -> 1086 bytes .../disguise/utilities/PacketsManager$4.class | Bin 0 -> 8476 bytes .../utilities/PacketsManager$5$1.class | Bin 0 -> 1635 bytes .../disguise/utilities/PacketsManager$5.class | Bin 0 -> 4130 bytes .../disguise/utilities/PacketsManager$6.class | Bin 0 -> 2736 bytes .../disguise/utilities/PacketsManager.class | Bin 0 -> 35417 bytes .../utilities/ReflectionManager$1.class | Bin 0 -> 962 bytes .../utilities/ReflectionManager.class | Bin 0 -> 26585 bytes .../disguise/utilities/UpdateChecker.class | Bin 0 -> 3094 bytes target/classes/plugin.yml | 103 + target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 123 ++ .../compile/default-compile/inputFiles.lst | 76 + 301 files changed, 6503 insertions(+), 2970 deletions(-) create mode 100644 .classpath create mode 100644 .project create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.m2e.core.prefs create mode 100644 bin/main/java/me/libraryaddict/disguise/DisguiseAPI.class create mode 100644 bin/main/java/me/libraryaddict/disguise/DisguiseConfig.class create mode 100644 bin/main/java/me/libraryaddict/disguise/DisguiseListener.class create mode 100644 bin/main/java/me/libraryaddict/disguise/LibsDisguises.class create mode 100644 bin/main/java/me/libraryaddict/disguise/commands/BaseDisguiseCommand$DisguiseParseException.class create mode 100644 bin/main/java/me/libraryaddict/disguise/commands/BaseDisguiseCommand.class create mode 100644 bin/main/java/me/libraryaddict/disguise/commands/CloneDisguiseCommand.class create mode 100644 bin/main/java/me/libraryaddict/disguise/commands/DisguiseCommand.class create mode 100644 bin/main/java/me/libraryaddict/disguise/commands/DisguiseViewSelf.class create mode 100644 bin/main/java/me/libraryaddict/disguise/commands/EntityDisguiseCommand.class create mode 100644 bin/main/java/me/libraryaddict/disguise/commands/HelpDisguiseCommand$EnumHelp.class create mode 100644 bin/main/java/me/libraryaddict/disguise/commands/HelpDisguiseCommand.class create mode 100644 bin/main/java/me/libraryaddict/disguise/commands/LibsDisguisesCommand.class create mode 100644 bin/main/java/me/libraryaddict/disguise/commands/PlayerDisguiseCommand.class create mode 100644 bin/main/java/me/libraryaddict/disguise/commands/RadiusDisguiseCommand.class create mode 100644 bin/main/java/me/libraryaddict/disguise/commands/UndisguiseCommand.class create mode 100644 bin/main/java/me/libraryaddict/disguise/commands/UndisguiseEntityCommand.class create mode 100644 bin/main/java/me/libraryaddict/disguise/commands/UndisguisePlayerCommand.class create mode 100644 bin/main/java/me/libraryaddict/disguise/commands/UndisguiseRadiusCommand.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/AnimalColor.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/DisguiseType.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/MiscDisguise.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/MobDisguise.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/RabbitType.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/TargetedDisguise$TargetType.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AgeableWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BatWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BlazeWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BoatWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/CreeperWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/DroppedItemWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderCrystalWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GhastWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/HorseWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ItemFrameWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/MinecartWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/OcelotWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PaintingWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PigWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PlayerWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/RabbitWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SkeletonWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SlimeWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SplashPotionWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TameableWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitchWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitherSkullWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitherWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.class create mode 100644 bin/main/java/me/libraryaddict/disguise/events/DisguiseEvent.class create mode 100644 bin/main/java/me/libraryaddict/disguise/events/UndisguiseEvent.class create mode 100644 bin/main/java/me/libraryaddict/disguise/utilities/ClassGetter.class create mode 100644 bin/main/java/me/libraryaddict/disguise/utilities/DisguiseSound$SoundType.class create mode 100644 bin/main/java/me/libraryaddict/disguise/utilities/DisguiseSound.class create mode 100644 bin/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.class create mode 100644 bin/main/java/me/libraryaddict/disguise/utilities/DisguiseValues.class create mode 100644 bin/main/java/me/libraryaddict/disguise/utilities/FakeBoundingBox.class create mode 100644 bin/main/java/me/libraryaddict/disguise/utilities/LibsProfileLookup.class create mode 100644 bin/main/java/me/libraryaddict/disguise/utilities/LibsProfileLookupCaller.class create mode 100644 bin/main/java/me/libraryaddict/disguise/utilities/Metrics$Graph.class create mode 100644 bin/main/java/me/libraryaddict/disguise/utilities/Metrics$Plotter.class create mode 100644 bin/main/java/me/libraryaddict/disguise/utilities/Metrics.class create mode 100644 bin/main/java/me/libraryaddict/disguise/utilities/PacketsManager.class create mode 100644 bin/main/java/me/libraryaddict/disguise/utilities/ReflectionManager.class create mode 100644 bin/main/java/me/libraryaddict/disguise/utilities/UpdateChecker.class rename {src => bin}/main/resources/config.yml (100%) rename {src => bin}/main/resources/plugin.yml (100%) delete mode 100644 build.gradle create mode 100644 config.yml create mode 100644 plugin.yml create mode 100644 pom.xml delete mode 100644 settings.gradle delete mode 100644 src/main/java/me/libraryaddict/disguise/disguisetypes/DisguiseType.java rename src/{main/java => }/me/libraryaddict/disguise/DisguiseAPI.java (69%) rename src/{main/java => }/me/libraryaddict/disguise/DisguiseConfig.java (75%) rename src/{main/java => }/me/libraryaddict/disguise/DisguiseListener.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/LibsDisguises.java (61%) rename src/{main/java => }/me/libraryaddict/disguise/commands/BaseDisguiseCommand.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/commands/CloneDisguiseCommand.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/commands/DisguiseCommand.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/commands/DisguiseViewSelf.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/commands/EntityDisguiseCommand.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/commands/HelpDisguiseCommand.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/commands/LibsDisguisesCommand.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/commands/PlayerDisguiseCommand.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/commands/RadiusDisguiseCommand.java (74%) rename src/{main/java => }/me/libraryaddict/disguise/commands/UndisguiseCommand.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/commands/UndisguiseEntityCommand.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/commands/UndisguisePlayerCommand.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/commands/UndisguiseRadiusCommand.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/AnimalColor.java (65%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/Disguise.java (67%) create mode 100644 src/me/libraryaddict/disguise/disguisetypes/DisguiseType.java rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java (62%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/MobDisguise.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/RabbitType.java (55%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java (66%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/AgeableWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.java (97%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.java (53%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/BatWatcher.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/BlazeWatcher.java (58%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/BoatWatcher.java (52%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/CreeperWatcher.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/DroppedItemWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/EnderCrystalWatcher.java (64%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/GhastWatcher.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/HorseWatcher.java (52%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/ItemFrameWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java (73%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/MinecartWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/OcelotWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/PaintingWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/PigWatcher.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/PlayerWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/RabbitWatcher.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/SkeletonWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/SlimeWatcher.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/SplashPotionWatcher.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/TameableWatcher.java (54%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/WitchWatcher.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/WitherSkullWatcher.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/WitherWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/events/DisguiseEvent.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/events/UndisguiseEvent.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/utilities/ClassGetter.java (78%) rename src/{main/java => }/me/libraryaddict/disguise/utilities/DisguiseSound.java (52%) rename src/{main/java => }/me/libraryaddict/disguise/utilities/DisguiseUtilities.java (64%) rename src/{main/java => }/me/libraryaddict/disguise/utilities/DisguiseValues.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/utilities/FakeBoundingBox.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/utilities/LibsProfileLookup.java (100%) rename src/{main/java => }/me/libraryaddict/disguise/utilities/LibsProfileLookupCaller.java (99%) rename src/{main/java => }/me/libraryaddict/disguise/utilities/Metrics.java (74%) rename src/{main/java => }/me/libraryaddict/disguise/utilities/PacketsManager.java (66%) rename src/{main/java => }/me/libraryaddict/disguise/utilities/ReflectionManager.java (58%) rename src/{main/java => }/me/libraryaddict/disguise/utilities/UpdateChecker.java (100%) create mode 100644 target/LibsDisguises.jar create mode 100644 target/classes/README.md create mode 100644 target/classes/config.yml create mode 100644 target/classes/me/libraryaddict/disguise/DisguiseAPI.class create mode 100644 target/classes/me/libraryaddict/disguise/DisguiseConfig.class create mode 100644 target/classes/me/libraryaddict/disguise/DisguiseListener$1$1.class create mode 100644 target/classes/me/libraryaddict/disguise/DisguiseListener$1.class create mode 100644 target/classes/me/libraryaddict/disguise/DisguiseListener$2.class create mode 100644 target/classes/me/libraryaddict/disguise/DisguiseListener$3.class create mode 100644 target/classes/me/libraryaddict/disguise/DisguiseListener$4.class create mode 100644 target/classes/me/libraryaddict/disguise/DisguiseListener$5.class create mode 100644 target/classes/me/libraryaddict/disguise/DisguiseListener$6.class create mode 100644 target/classes/me/libraryaddict/disguise/DisguiseListener$7.class create mode 100644 target/classes/me/libraryaddict/disguise/DisguiseListener.class create mode 100644 target/classes/me/libraryaddict/disguise/LibsDisguises$1.class create mode 100644 target/classes/me/libraryaddict/disguise/LibsDisguises.class create mode 100644 target/classes/me/libraryaddict/disguise/commands/BaseDisguiseCommand$1.class create mode 100644 target/classes/me/libraryaddict/disguise/commands/BaseDisguiseCommand$DisguiseParseException.class create mode 100644 target/classes/me/libraryaddict/disguise/commands/BaseDisguiseCommand.class create mode 100644 target/classes/me/libraryaddict/disguise/commands/CloneDisguiseCommand.class create mode 100644 target/classes/me/libraryaddict/disguise/commands/DisguiseCommand.class create mode 100644 target/classes/me/libraryaddict/disguise/commands/DisguiseViewSelf.class create mode 100644 target/classes/me/libraryaddict/disguise/commands/EntityDisguiseCommand.class create mode 100644 target/classes/me/libraryaddict/disguise/commands/HelpDisguiseCommand$EnumHelp.class create mode 100644 target/classes/me/libraryaddict/disguise/commands/HelpDisguiseCommand.class create mode 100644 target/classes/me/libraryaddict/disguise/commands/LibsDisguisesCommand.class create mode 100644 target/classes/me/libraryaddict/disguise/commands/PlayerDisguiseCommand.class create mode 100644 target/classes/me/libraryaddict/disguise/commands/RadiusDisguiseCommand.class create mode 100644 target/classes/me/libraryaddict/disguise/commands/UndisguiseCommand.class create mode 100644 target/classes/me/libraryaddict/disguise/commands/UndisguiseEntityCommand.class create mode 100644 target/classes/me/libraryaddict/disguise/commands/UndisguisePlayerCommand.class create mode 100644 target/classes/me/libraryaddict/disguise/commands/UndisguiseRadiusCommand.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/AnimalColor.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/Disguise$1.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/Disguise$2.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/Disguise$3.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/Disguise.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/DisguiseType$1.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/DisguiseType.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/FlagWatcher$1.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/FlagWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/MiscDisguise$1.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/MiscDisguise.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/MobDisguise.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/PlayerDisguise$1.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/RabbitType.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/TargetedDisguise$TargetType.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/AgeableWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/BatWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/BlazeWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/BoatWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/CreeperWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/DroppedItemWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/EnderCrystalWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/GhastWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/HorseWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/ItemFrameWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/MinecartWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/OcelotWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/PaintingWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/PigWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/PlayerWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/RabbitWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/SkeletonWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/SlimeWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/SplashPotionWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/TameableWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/WitchWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/WitherSkullWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/WitherWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.class create mode 100644 target/classes/me/libraryaddict/disguise/events/DisguiseEvent.class create mode 100644 target/classes/me/libraryaddict/disguise/events/UndisguiseEvent.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/ClassGetter.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/DisguiseSound$1.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/DisguiseSound$SoundType.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/DisguiseSound.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$1.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$10.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$2.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$3$1.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$3.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$4.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$5.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$6.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$7.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$8.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$9.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/DisguiseValues$1.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/DisguiseValues.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/FakeBoundingBox.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/LibsProfileLookup.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/LibsProfileLookupCaller.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/Metrics$1.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/Metrics$Graph.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/Metrics$Plotter.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/Metrics.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/PacketsManager$1.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/PacketsManager$2.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/PacketsManager$3$1.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/PacketsManager$3.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/PacketsManager$4$1.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/PacketsManager$4.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/PacketsManager$5$1.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/PacketsManager$5.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/PacketsManager$6.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/PacketsManager.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/ReflectionManager$1.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/ReflectionManager.class create mode 100644 target/classes/me/libraryaddict/disguise/utilities/UpdateChecker.class create mode 100644 target/classes/plugin.yml create mode 100644 target/maven-archiver/pom.properties create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst diff --git a/.classpath b/.classpath new file mode 100644 index 00000000..149cb3c9 --- /dev/null +++ b/.classpath @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 00000000..d9784440 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + LibsDisguises + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..7a531392 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 +encoding/src=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..672496e1 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/bin/main/java/me/libraryaddict/disguise/DisguiseAPI.class b/bin/main/java/me/libraryaddict/disguise/DisguiseAPI.class new file mode 100644 index 0000000000000000000000000000000000000000..8e626477b6a8157b709afc652ec60ec560980653 GIT binary patch literal 6791 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 J$X?L>^1o~18IJ$} literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/DisguiseListener.class b/bin/main/java/me/libraryaddict/disguise/DisguiseListener.class new file mode 100644 index 0000000000000000000000000000000000000000..c9e3de035777d18351b2f901053878794f42fd9f GIT binary patch literal 10459 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 literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/commands/BaseDisguiseCommand.class b/bin/main/java/me/libraryaddict/disguise/commands/BaseDisguiseCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..86745086ffcc63c0046902735ed55acba527b7c0 GIT binary patch literal 12540 zcmeHN-*XdH6h1ekEd-L?T|%rHr_%h_+g``vTTJ@?%E z$3H*(3;>s*9)S>n>oqE?$wzdPCTlFI$m=@Qw`jR6OJ=ex8t+PP1dcWV6slH|`SnLkG6@`WsyjErrh!HsA+NO0~)1z>R z9R2N!4+HDygr)OBrLVKw9ZL_AiivP79l3f0l5PNfZ6VTsWin`&b{ z#aT~r)}x8C#*BojnTZ-TrE0=NAojS9G~0ksh$)NPln=-j8@X23bVOwdiK-U)5?(zMQ=4v) zsb$uSY!KT34J%|*tLc>;Tfa$lnPRYu#}-rBY-ah!+FUk2f76G3A(dG!;R8NQi%6ol zv{uNMGWlg6_KTU~l0{`HpZCLLVI^NEq!-pQrF6~*dV%RR*)TBBr%aPd)f!XHjQUX9 z@zItuEh@Bf$BN`Vdy@A~4?u3_!#n%r8vz*XQnUbX*gw<#9Qg5AN|kF=F?w`nPE!rD zr)Q)p%o=Pxu=Y=h0Ksq|8qcA2C0dUz?b86BuTpbfQ@TuqZhYrn)q^QFyJgCXY|5Cz zin7cgFAieM-|izO`ZDco{@#(}u^=rP*tXJ(e(6w9=oZttGYFj3JDj_bh{tl;x=$Q# z*43E;`krf^qd1euRO!)}E@tsqfb1-2;ukcV3z(h-O#V_UEBQM+D&>k=$~1FCzvkUM zrR7mBbP(H&$!bN+IyZKtY&MrJ0Va$%L}6qYhTt%P6XRL8&`~sXS*=W4g^(jzS!K(O z+B(xq)_5dvEUQUWxoxNa_RX+al??)O*}c|hrU@LcFf*kn+GniHhYLbqun9JBdPy!( zqne}j>4_HU=Dn1z)2*y*m$53Zv@uEdCQR69Pox6oJP+3QAteJ)FS5DS^W%x0|G+(qrSb14LyV5vtP(CiVDkO5B{#R1gRzvIPGybyR497W>qWW(4F!|@p*+B#`MHJk3Z<_p@Mbf zWa|M8l(QWV%uHrI1q&;ZbpeRNc>;zHukt{4A5e}@bvGk$rDLdc&R?D&?vAmqclF@Y zh-8!Gz!M)@@@UgFhYXwyIKumY4ZvV`Ufw4%J$Mf)8GEW^?A>wxKQ%J~aSY@6y0vSF zar?YC4D;+;7`>Q3%RT0=QFx2M+3v9j_c#eeWn)2WG}i^f6~tZ4#bpE654bLs2#nOJ z?rzBvNNtbB-nqusK_J6~lS|Lry(zW6z7J{b|mVu`&37p%WT6_GHSA?uxjxT%LJ%xN5iNuRq zLzmd1Z0)q15}aRc9{I$ob4HbL<%qi-cm`=nW_S!%s%{Y&&ZsKWn_-L@5qQ9*Z;pN^ z_D0}ST#GgPg#QPDp=MYnaFVCI+m}CO+zqnj<;UnEfDv@0Et`)(6_TCuE+@L9k!xp)E?;5qy?1PAdu(mWA-0Dl3*e}w4j zvH15e{0m-%;0S(OHh`a__&waR!l#enRTz%L^JsMfe}~|tgA~H+7Sam>q)S4i)9|8$ z^pXJSWdYKR5b0Go;~*s*B&*dePG<#3*M&&0!I*<|&Ovfp_qqV-z7Xj&j5|mZ4wB31 zf&j@7Acf!!c+)|ea*$k3$xb9PB0vhm+i($kllOjigi#^Fr2q(%LWIlk4*KI2?3*b5 zy$bKawCznFILyLM&&>+jc1?gAg6oiSRGJeY2~-MwCq$Zu1)E_Q)w*i4OFNiD4m%O% zPeRN^xZ$u{a*$ka5F!08M9RR20(LhAnAuM4LVpS|mm%-*3s-#+!e2s!0(^w+vwGFi zY{g;Y`dCT8=1C`3I1IPp4q~(-%*Tkgil`yD3-|CZz$f@QhS&FD4d}rb_78z|{AhUp PFh(v37*s%p4XFJKSp2$` literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/commands/CloneDisguiseCommand.class b/bin/main/java/me/libraryaddict/disguise/commands/CloneDisguiseCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..c806016d6a7ac4c1226bcdf50a906f38bb6e89a4 GIT binary patch literal 3275 zcmeHJOK%e~5FVG5JV?NsE*g`dHl zUw{M>-1$+6*%wX7qI9JS3523J@?`d#8T;FB=G*sAUjX1X+$zExf%^dyvi_Rwv3kJk zzUXPDN6dAFW9zOk{h=_t?x-MO(lzzAuOxq%nA@?n2n7Q7a=|=c=2sK~N1H+l+ahpe zZGDG8p{-nAgffA}C_A6Ye*KZwN|)dmnSZ}6H8;xN<1WSY2Eu1nC`kue^?V+fyR=f? z@;G(5<1>v;1Lo|qKBubzuT7L$OUtaKWv)_JaYLoDG+@^8s6`VGHSTEy4?AJ!3Up;F50=?pih|bHrb$=z6)EJ`9^BIuQeNWFw>9#SQ@5^b^ z`il~rA>_jW8qq|USpMXAubol?u$J$3==~r1NaAS%D5m$#Oko82*BeIseqA!^p zYNYAA+0QgP8WY8Hr_+7%a8hgPBSdMHb z;S^d@gn6{Z2&Xd;PGley;4GZOIOp-nIk@l>DaM{EO literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/commands/DisguiseCommand.class b/bin/main/java/me/libraryaddict/disguise/commands/DisguiseCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..172bcff817cde6441e5e1d6c7bdf4ce4dea86831 GIT binary patch literal 3838 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 cmqWuBDGUYJKzkP8efS`V!Z literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/commands/HelpDisguiseCommand.class b/bin/main/java/me/libraryaddict/disguise/commands/HelpDisguiseCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..b2bbef17843b0401428c78874dc72bd3d786bf49 GIT binary patch literal 7237 zcmeHM-ESL35T8xm_@gN)fkOD~658TGumSNzEJG3!C6a?slN13@>$|nRhw2(P)O6g%z+ZB_|X_e4KnW~4ZQZk9}|^R%+QtvgwnQLI zo4}3w@?!#}4e9bS+$Jy|D(JDG-`rG6stU}L`CA8p;#zt~+@)x-q41ayGN3~xyB_!T zXS7z`A8_h&$72eGhRiu+eNLBr-Z*9XMq>F!V)-TNO0H=j4fUCE2Gk%B|8dA2a|#HZ z*|54bCV-5z5&lprMCH_BfyM7~noQ$ADIrzA!O(PQfE*Z^c*Z4`5C7@2`| zX~qg~Xdbw6&N$E*_VxH-568J$q1#LkcG<9%WQKjzdnFk>Ndv7tqeReeudGYyaTc`O z%eCspfSC>HNtNMeY9wX!h$+Ev6&90S3xvjo zUm=?oC_70)+0W-hg;Xd&qjOAJgE@F{4yv$#+xdF5R}Z(#(R-_QJ3ZeK0sm^`ce&cP z+?>EdM>@=V9CP(}uw({86Ig%hy}j)q$RIA+*t4j2PL=xAdJs`QALri!v43@<*Nh@nbgmi2Wu1nINfk-E*Noy>F0XNBDdMx7 z@;9}PQ~@0c+&SBFBkn}5!iYjx83H7=TA&pv6|Ww+?Zt@D@*w9^GQ zZtG$Dy^V@g;2wd$ueijf)y}KN1sG8w*VK%B#F-n>o`+ck={)18z`F$2E;oifW5|h3 z0<}FkQV!n|mUAs;w1&eY1SD=dsrK-8(pM%hw-W?hh1*xI%dkvf=gQ7q@E|BTf+@oa zfpScU%FrNi`xKKZ!$+t~+MD>e8*PIvGuH49;L!~pb`h9?n=p(2Wqg`}3Y74^3N^gm z3J=3>;2l8icbNNj;e}t}&Yz*&OL(Yx15PfdiZnC7b4HPJ!Zcptcd*MV70zwf;0S+ydpeOIHmAKutBipH(Uxow{ z-1$+6NwQJ3YM`wUhaT*;M{nOeduBX8e|`N9;4wA=%rU&kh0@WXI2KVZqfEtC*r7;M zmG~%Ct~*dpMv2LDp;H%iRP0_AR@a_b1I#n5j2SYayU~aEP$r&X@u||vKVztDZSOP8 zw@oSo)EJgeu{+ipTg5e2S^cQ3bS68NDJOS*l?ktm=6!48Oy=$h4{Lip$y1qR!V;)2 zk|WWTd^4BLlI-SGc5^Cwlcz>Hu8rrp@JWw*B9bS4l3606n`n--H7`IpQKRy{vBWBQ zBJ_wqmVA1Q62jPSGaeirDSxGrMaXwfWHRu^&NvJAh70b8eHqpY^sdyYydd^G#-8wP zll{f>v9L-|#)P$(f4=Tg8qaV^(l6oYKVd^uu~f$bt~0D{bxw*-ssc}jgCn~wqM*rVVw6p3S@u>lzPQx`W6Iu#IRHf6GQ!-a*mR9kKO}^4Nx5b$TPsz`3r{49paBF@K!{!t@Z{{eS<_uRvYm?j0KbF; z5aUb;agA$9B2qBY?Hvg z`GqwClP%?O2g(GdfYB0)$Ifjbf|r z0y2q4ggvDZl~b3=2*1N=md0=Cp>(&(aOrRX#zY)>cKRC|!v67|zThYW*B?-|9`C&! z^f=8WKNW@w=_+Z2v0U0@6Mx_z_Kl@T1LP>W$LK=(T#JZWtYfTZZbT64E05;rq-wbI zQsu20B=mebSVlY7i}XG-{zKMlWcpgc*cUV7ZLQg$jiEM{troJ|TwGEr;7m4~3zhN+ zQqC??t0<#Ua^HN%cnt?J#$tou zx{}$xMg_kf|4pMk%-vLK!=Q~sYO(2ibF*E4&0(3QJx{%fzlF6DoFnA(FBax-*kjbW zM^&{@lk^XtJ_IVus;^ysPejMcncTx5zUJZS^kAsfzn|R_9JoZlNz1kamkAsiso@S> zB``J22pm2X#$ZbpbteWc0p5D?Ru1?kcn}`Iw-eveqcK3`9h9EURNlbU2OLenG`=Gr zz~>0QrxGtX3Nx|o7#v4ShOi%P3Bqg+!fX!0B%Fj(IL~SPastkLLyBTdkj~~HJ;_1Z W2j^pq3vdzt0j}Xw!YnDw!IiJzF^9$g literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/commands/RadiusDisguiseCommand.class b/bin/main/java/me/libraryaddict/disguise/commands/RadiusDisguiseCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..3e21ccb4cfbf14d61c3028d89e3c7f1eb55e3b23 GIT binary patch literal 6939 zcmeHM+in{-5FPraOYJyunqJZyb;+9zt4kr?li0!azc z5A-AYBL!NZeeXZ?SBlQwl2yz^5+DIKAPCwE_v~;u91hRS{`21-e*wVPa8Q610*4_J zvi6(}SuNzXKy)6_Y*%ohW5l(x5$<^rq{_;w~ahs^NT zq!1{D>_yT60dh=WbI1bWw*qDiHw13AV=V_(1hxBGvr$_ZTgTT z0h8TYEUn(e*ESkL3fm;GRyp2(f~S`9c>%TwY{&h?@CRBeU4$EC>*!2sZd5SjK1Fl% zMZm03lJ>Rg1Uxj~&~oXt$EnY~fN2EvnRm{*obHCaI%d{tX4YzE)?Ml=Zm3k2hRk|B zYEck>(dV8W6NEEWjdZI{Au`cMgngw^DyJTkk^By)*)XmsLg{Xmp>fef6UG!FJA?Cc zVV6k9%=ZMxweIysR6UD5&W`$=I#)Oqh6?E^X>iGLX%p9Z3qBkeOVRmoWgtA3E@Y2u z5jiyL7^|5VxuxwXpE`m;)o|&j;pNQWGODCEC)m#Q0e#3!?-A=avLJGbx*ueXFQY@_ z#A+eC&4WXw0?uT!xnC~DA>ey%E!R%Jcp$B?BgZ3Z6=gIUb-6SZXiVn`0#ocHRFBz~ z3Y1IpM7<%?f?-4|m-42WquACAD$IgSrs@o%yK!iX)3%^~XOTPAtS6wzAsyqm=tFM+ zUXB6JVw}w1rW*AG(BpuOoXazBzo|f(RxKr;iLRsDa;Ytb7$l~e+xd3+Q?%L7XPEO+ zEHl^r$Hz`v&EgOX!zQ#d*$Nz5=6xg^&l^@*9=b4fX9!$ZAqZXuJ1uoc_V_DihcaA) zo15?syo>2vnybZmR^s>dC=c6i3(0>NgdMI=qd^kbX)BKfPf}u&Hm=#8z@+e~JyYK4 zWVcZcsbosPFq5sc$B0`!yRGN)$W-B9E;jA|T!fFw`e=%LajcsOfo#bSV=BMohiMUF z$q(m4oHBy2_6iWK1vS^am;TS#8*NxRJqoOMwgWXXl6tMe?%{!6(F z<=6zuCu*QQ{+) zN5UAac0{4ez#Sm4iXVek@V5>d@l^qe*jkFO%lMQaUEjpxR{YUu6_EhtKjGTbo$J5D z&fhWa79KYc1NeUrj}abG@IHJHw|xk=a}w60XR(Bj91`{%64u}o_!N6iwEFC&E|Knu gBlg^q!nV-g+1dtXO55U<9mPp`uZKf6Kr}|VAx57(!sG9h#-+ctlC!C zp@{~OgeFOZj?&;z=ds2lh=-C zV#7qzLy4hshHYAFY!TO3;nShEGBxo)Mx5sAsaQB=H1Ao{j%AWQ<$md)D|sZtSXct} zM0g@Pl5ZulHl?|i>#OCOw|Hb^%C&Jk5iaa3~~Xd7xHZM6$fPSmKRXDqQw z9tu6;Z%dvpV+vtxr`GPDoG5oikeNA}r!wq2V`r?IJHrKc!=Cg@8G2vpNL~;-kFhIU z!^D4?c_6G3E&){#?R5lD$|A=dbM&svG|Y>!XO3GL~?i zVZGWqyQ}-oD&47%?sBE2w0zr7+R`43wvb`1WkL}jWm}pB7hPAS49{EtmSE}(C8INo z5M8x3WtVzBte+SA@qB3eLlGN{eZD}xnVM$K@n_h1s7svLJVRY6S2Fnfrf);}N{#Hc zajpuD6E`__SBFNYDs@u3*Gf_;3%f%P_ZhtGh&((b2WNvkKY4h}urhVv4COZ}P08~I zl%rB?f=U^cO<;lEmat5{H!hdw=}=@(sXKYy_wXXAcGp^CYq-HGpANN^&Sa-D<#b|SWx^|?dEc5ilev4w!}>u_@>C|7 zumtLhGFl^Ttt(JY)Tq2~ zEU`+S2tDGDB`<$t3Sn%w6%S5Ml>ZNrMIv|4WHRu^&QQp`;ez{NUxxJpy)ShtuZX>j zu_yet$^LNisjy0r55js!#crptrklY_`mVut4Qz-S78{tyO@`HG=iI~l-YVT~k37EA zQChwobj5KaA*a07iP26uFSUQA zBsJKiHw^HQAt){|z$0=_u_ Rj|cPwIE@-9T*EpZ{{r3r23`OF literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/commands/UndisguisePlayerCommand.class b/bin/main/java/me/libraryaddict/disguise/commands/UndisguisePlayerCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..75f7592e85078368aba6851fdd151a5551d84168 GIT binary patch literal 2105 zcmeHIO>Yx15PfcvZnC7L6v}4-x2N`!y>KE30ck5L1*p^y2{<{sR^oQoj=WCQ{3ZSX z5=e08#4kcjl3i6%Q_=$*5FFNPkKaDetl!Lh`|;@ufJa#MFvqZ&2&ID~aUz052C-^e zVFx0LROo_8rJcS?We}Pq5jskP1D)G;V=<7nIo|M4WLO-L#6ow1H|--CI)?ctN-Ou2 zp|HMj$WUyWNP4I+)XuP5)*4&J6;}9gpsh?zd?F)GC-zheBu*)40$-jh0# zm&DFs97}Wt=*7i1vYE;M`R>jX62CHQzu6V8Y2sf*ej=}rIrare3%8D8H=u~Qiko;?^ls*IXU%h`UD;WGe)3>4ARzq2?T+r1< zjezvMqeG)pl{%^2OC_m6hTVaOdkkK7?H=xv-m^ts?>szYSeOt7L-mzPQ_7His(C3^ zL9LORF)&B766R_2M$NfEGr<3h^4lfP{k4Cq;;u{uWK8kR=3>$pLdoS{Uv fF~jl{hT0T{0&dYabGVH=^aeORW%BSYR`B2_l0&3? literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/commands/UndisguiseRadiusCommand.class b/bin/main/java/me/libraryaddict/disguise/commands/UndisguiseRadiusCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..92a18478f3bc20efe0a1c5090bfa258d9ce55e3b GIT binary patch literal 2541 zcmeHJS#J|D5FRIKH(63zO3PV_TdwvcDLZBWZQaD5p1UxxjD{;GPN48TnzYGZ^ zc;`nUW;Yv^sN1GU@KC|SdVPHUX2zZw&-WjnzXHG`c;G>Sz4%Yji6T zv3*Sa%63Q4Q1FNu1a%qTXKg{3V^JG1r8ZQ%HZ*0KhFVyvw4*U|yh9xliNh}HJwk-1 zQ%iKKoq=+ojf}h6AgiF9sf52J=+KN2gf{J3tGB-|-9LiNyk+B1@Sf8q$7<>{Wz_Y% z!mniLEulhjM(jAo4s&ZdIz{pUGm@ciq4aZx-B3=t{+I)J6S4l-vpf@MJxdMG-!yV$ z`jv6(f9ZIA@L{?N9?TG!UuhmCl`UtaYS)vbGu@O*yz0d*VYZXICNSI7oJG6Y-Di^} z*O8XMX7f)Z$U5diX;G*!lAoa3hca9vuylIP!<2_qT4ljO;Mq!ZBv9(ZVg0!EACFJ1 zqSOUacz3$gG}DfV$+`5L*d2#DXEF9WPWwL|lQc@e-_kw9#imRGZQ+FaA$?&nEEYnp3V{Cw{P(lfPjK-YjtX!I+eySEJ7=-2rhOkS!(6&P4_9&- uuI4bz0j@pp>>iop2=_v5@*iN~se}YT+iuNmJzsZS7UE;3L{N5&dKc zkl>vUg%~?aX{88|`r_Zt?9P8?cg8<{e)$Ff+n{A&hQJG-@<4k}$5iu~=J69j#VK`N z?nIi)hrJOWva>~WI$%Rh54cagTIhu$11SOvNwi0Uo@N9ipTJzz(ra%BytFPQULlaG zT1Q4KXg7}=Xx6%VjJmCN(Ob6-15L#;>-+6@lcOoiJiv&|fnGNnZJj{6Y3q$Tx>AQ` z1B*%@9@&Q$+OxLt3eA>jbqpKTj`z(ry3<|5vYN-}7*lV=2oRG%w#TC6!UU>Cvvm1; z)k2qL;1+?!bB`xPD6(*eK>jEYY#4fD=BiHU54cAo9tP?_geM;JpR0-jo1o4^9tv3T z4i9*=OJKEV{ZVU0f(N}yse?Hz9x6L|u;7ViZ#8VTHf zd+uH15#PDw0PI%wo&gqu|Kal9I?O>D0GW}@O6DXL$t#lcl2;`cBo`%@B$p*uB(F(c zmt2hrGjIdekh743o3M^`ZJ_lCZGu$3!e)2n_9xi-o}9gl-*mE*g?ou7R>;GB8Mlpb qsk68TQ{qSxH$PE_Vp0Qv5@wuajurl%d1H#g3_MP%c>+%pmVW^Ph%h(+ literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.class new file mode 100644 index 0000000000000000000000000000000000000000..8d061b0f377b53fcace4ac718cd8c00d9b4eff37 GIT binary patch literal 12761 zcmeHNOLH5?5$-`~5`d@|B}K9=IcwQYASEIFkYAE4SrkQ+F(fK{IhOPA0vG}#?(V>| z3sS7It9xs&RC;!I@F04DT@s2?WnM7Y+1_t@ zdb)eMXZr8|`Rg|Ta0#|2AjjacYYT7YzP)A7xO~PD6=ka(yH*p`V5TPgdQ14c{U_LI za(`wn?w)`#2FJor9owtVELHCFYQW&I`EJo$^Em@{kHMtrTSW*4ZcHd)s4hy8GQ-$KK&;j@vx~DMaoG-xq|Z09}2$R zD}jk^JE%6eVsL#AQlEG1`a2N-j+XZua{G?$B0qUE5)K-%)(V6(Qx<-JgoPDR_w1mh zkn;Sl*H^oq*VY#2u3W)NY832iNbRI%T}?l+Td1=R~=g+QPZw&+I4Q7clmUWl204OZ2t+B z{Jd3@+_yX#SgxME6(Aaa&_o6AK||x2)(lRk#f|t9Zd0m2vp%iaZ*WgMu&TDF$E$G5 z%fHhVv@xJ3>^YYi})}B8Fd&CYGeak;c9EZs2#_= z5~x;H=cc!Hel7-lqxaY-mfyV_@5_liDm#tj>EE_J%!R4-c?fe&$$xK||mv;MF~x%o$ek@a(aw zBRxE6yH>ieKcFL3g{PX_Kr^^m+6SQ4L=;9IUSj!wq&%_P?PoPcqKbs7evtL(Jt|AG zVe*)Cah9P@=~uEaG9+O!YBzENBglI20D7E)^IvFY8*N+xUr{!dvBGG3g4JTTrz-{ zz*sbJO85&x-<Rz4V({u8KMN}vI;1G2^|*Q=s!1p!O}lL1i0YYl z9#$AE4WDqPd>*aOH@7BeZ6#xT`%I1wA!uhJ*Gu>IiFX3=7WxWSPU_zNnw8UWcfZO% zg>MGx{MkN&9;H8*@Y-m-W~fiA^YA`{JHyv4%aH_X6Al$ClBtiG#I9B|b~kxIRh%0> zs2WDnioa6_xT~Wp05N;eszzn8v=LlxIG@XQ*nC&PKG$A;D=#*I_^Icw~xaUVgHlia}mzMIppf8umJ|_`wXF&KpiEt+a!XHS4r3?svBoXdrK=_J8_+dy5$syMB$zJx?Oo2?&%N-XIWiP)Ud*sss=71Ofw| zfrl?igpC9QN~8WlBGjQl+69I1Er}o!touG8hwn%PCjo(4i+>Ub1#rQ`STl<9WEk6B e3?oq!kx@wh4w1Ak$w4#x{Q$PG9mi({!G8fcX0bv5 literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/DisguiseType.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/DisguiseType.class new file mode 100644 index 0000000000000000000000000000000000000000..2b7d5136b4a2ecf4bc4a8ea03afb49707142503e GIT binary patch literal 6669 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 D<14x) literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/MiscDisguise.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/MiscDisguise.class new file mode 100644 index 0000000000000000000000000000000000000000..73859d78475f16317a3e5a55212a9d859880c7fa GIT binary patch literal 5642 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 U{Qc&wB?>8&V>eImG{$GY080oR{Qv*} literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/TargetedDisguise$TargetType.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/TargetedDisguise$TargetType.class new file mode 100644 index 0000000000000000000000000000000000000000..823ccba3238645783a8cd3854eef1b023401f841 GIT binary patch literal 1464 zcmcgsUvCmY5T6As<%&g7s`w|_5Fa!qTugkjO+#BwA;Cg=2ZkrI+-;7PyWPv)(#Qw# zvzTb2?|vxb-nEo!NX6Lrva>hyyWjlTnfdc0Dv+l@WOnc7FN z^R%-}z*drRf4BW?fFO4yJe^??L1_uFq!e-!wo&F|pGz8x;FNmU6=B2zqL|<~l42at zFn)!Nf-|Amqi#T?21Uf35})E)NbA28zP>2@#U(9#4SRydm!i|AaJtF7?@5M=e{%rvTS12zD(%qLRo zGrGV9Esb=uW>cK;1-6Feo1dWcE%^(|`rOc%1b;`L#q@5#-IOB>l@zrD_fmNus#+Qv LgWv%?YE*v$rI6Jb literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.class new file mode 100644 index 0000000000000000000000000000000000000000..49dbefdc8651cc311361215f669f5cf22c4c240a GIT binary patch literal 3219 zcmcgvTTc@~6h2cbEv0f3R1|eV#Nwrkii(sF5X6v_i*iwUn{Fp%WG~Ikw923Gjo)IT ziN5=zjAyrO%Vk>Iq#=aOT)+9w`OcX${qy(7F94W^*%(9!ymlye&Cj$LljUNOW!QGb7I|n+jZ1q}Bl~Fk{SN=~Kd_Lw8jhfiPo6-eb~mJ!LplS^I`UH1@T~ zEEMYm8Va8F38tIHt?=Sb(Gv*G42!z{AvtD*2DP}t6NPlHba23x7HiX{hfHXu4CNWr z@QqD$h0(LPxvE)No8Q3@;)aqbPxoIn-EX8Yok7!wo>#MKvYjl9jaLwBT|+00DQ{aHSl zXrk}_DC2F}0-JO}0uMg4Gt=IjIrrRq?(aX}e*(Z$cxaTbsWAL#V+Vb1{Ljn=J+6(v7ID^%`G>=^162Z>7l3Pv10ka!8iA?jLJIqW zz;vU%K4h}m>=3BFQXzMsMqnoA9WxpE8(J&v!WB{(yqB6A6(8`B1}f=`m|3AD?Q4Z( z6Z4FEwVfWPArE4vF{saieHL-LlJM4u0IfoRqfIVAs}Nv?hKd_1m8D6h0ksIrzw~)v zM_^ImR>rh-?h6i?ilnbJ-oa_WWOiGZ(;~%@2&JP|H{IVCc5Gx%aIA398&I{E^UYGC zqm`t>P$2^)jWCu=>(vVVOJJ#0l+g^ut8GXt?BI-`O#6h}o(gHiZHL7vZwP6h(5_N3 zXR?`HpURN$35hc9DLszoVeUgLbE#M|TxXVLyv{+#0~e<2FbP))%s1M{&ADwgc6Q#p zGi}W3U7B>c-pR~EV79FS7I&By*?IV}YJ0*Ec+fydC9s17j6?s&Wz8!bxHLl;9^;iIivX<{E)H1G0@m;c3fB@@bz?3M~?r0 zI)#9@tx_HE*CK0yxzSSP!vb4q>x2h43*S2M5M?P0Nud5#7=zullg(yW1}rX)cYrC} zP3CVWANLbb!PWZ#?#Eg08`OW{sRA>@NWkc8xUb`iQE(k*aYbfu1K$Ng{x3(EFG09k zig0rb!mSd7xl)8hxbx2(7D^HBo&#ZV48pw=9FCQ|Uy{XA3Bm+W)U$&1S-}j;IxC1+OpGn3!5330_+<_HEc5VCwD;&JNXnG80Yo z-S6U8FrHnYg*Z{UJTN=E8GiFW*O?!`zI+3KdvHGv5dyDVCcM%CJ7gu7mmE=7OdT=X z7M3pA!f$qj&yOeisLlP-N2aY7SAOZS;%ukU;FjKYWXFEn{T_!HfyI#MFt1s9Q9r;H z1ZE!!Pv}Pk=JVAjJ@QteMj*B=Z61dtfy~Ljc9fDT0dpk!^NpvtFP%efQ%kyS;V>$M?`_z+~x`8cJ zBbI+^qx>N(daM{IEsnfFSE+E@QsEw)TFeV}t8>~n@qbp79oFnQ+d!aNQbq&IQpvub z|FJA^pUZVi+O)}ajX52j7oOgv4M#Fvpu(pe&*lx`p&uGjg^me!pym|l8et?NcB;I( zln!U!RGE`&^r!B{VdAtEPREPW(3pY*%%@=n76>fmt0xU%S1aK)!-kQmVj@28xOJ}f z81?`H*{ZadQ)5a5@4b&P-4Z^5-Rjg^+!lc(7Rqa8iw^D(%@@iESSH~Ay;b!)m9a3! zEj0oOl(H=ysX`@{1gsGFFoBZsl8eBC@GDJEDn8(s{RFHL=uDty{M5vg20inVDJ?9A zS8NO#W@ukrEMG3v5^!bIs0}Ci1W`j!FKV%TC6ID`)UXXp88>Vh#0+Ct;1p!TZ>QnR03le{B`g^TStH>roHG*68wkrr!YW)a5-u7DD@MYl5j3nB z2{iQVpPtMaG~|qgt8i_=ij!EZ8wl%0LLLf6!iIscVI*vhprL3WMByf8Km>|V!e?+7 L53(l$x8TliMdwIt literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..0289b7f58d4842429111a698732c686cd32f69f2 GIT binary patch literal 3087 zcmeH}QBM;=5XWbs&{7Hr2&kwmh}tT)nCJ@_jfx0KAtoS3-nMs3yK;Bi>~6t+G80Yo z-EZKRG0t6E+Ty0>D33ne-R^b!o03!W$` zrs~Xfg<}e?(B+!Y{A^(ARjv!C%s3UUbm67)rP?zra6dF&B_Tmzs}EvPoQR;@q!Ac? zCIVre6Bx@DH=53@=MD%YUQ3rJVT8a$b}zbZUt zgbZj^$&$x?y++d``xQ=I?s!b$qAGKaS((!%pXa+Y$hR~&8$=r9TN*4;S8`1QX{aA+ zKn-H~=PGwh7Zyd%ho0tR8)$ec{Hj!FgHwkEp|ujHtq>b4DuQF`oJyU_qsWWUQTkVk zsL)gdjtsQWh6g4+(h}A}rbbdmLr}wp&rL` z>fu2TRH<(G#aX(`t$ta7yTJ?#L+r<+|CDAicV%7ki|Uew6pUqH2*wG_WQ*GNuzRT;aGk&;mPfnnHa%9xewE$M z9j0KGfY-YhQ%W1Zq zlXuVZ0}!50pU| zz-Rg!q&`lizd+^(&IVut@8KH2>k8g8(Krp0Fctki4Ogv%84Dp}ArP2@YaN8pQp1Pq z7Q%#;Fdu_3Z6(}{L71}=Zp9$XTM4&g5Ed+i0ayUqp=6llhLVdGC6_G(0(W4!gV5d& xcP)ffE8%_&!c!|D8-uWBCFEidURVhaVh}bggh6;1RmTcE!Y9BgUI|n-{|6r6Dc}GA literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..7372acbe14201b0feaa9fbafcdaeb390a73b4a4c GIT binary patch literal 1551 zcmd5+OK%e~5FRI?Nwx`T0_FX1!zGbWmIEh>kWfpZQh-BC5WP9O)5K-hj%=qTe~CYU z1QOi&QHa^ivr<%w=z)W0J=W|u-#mZ*`uZIJ9>aq?WEi}Rg;f5LI2L}4ek8j_n2`uW z88|N7&rziPoAj2}4E$5quOqO9nFxzdiuNi5tEEPfgg{Zp`%r&hwW z_16x@Ol3UKhI}9ogi5@1kxxTBkHtX3ikjIB0eXaErm`vnkBx>_4b5WpPgrO@KQx zDP4834b#b_!tbg;D=V!-|e3mN))-=OfJ=6!+E57IJFA(_|!oi&oB^zK0wYU$e*xVnIl*o_g^ ommrjvB3y?X3kY)#H(^b literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BatWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BatWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..8cc668fa50782ad5d76f18398ab922d4630165a7 GIT binary patch literal 1546 zcmc(f&2AGh6os#o&?G}jXlVI|x?Lp_%4}Fs!~$9fQee{%M0d{2O=6g_Bijk&g?I%d zkYLY4A?{2v`H`XuR3sMT@rl=e(-B(#qj13xjrE@j_jWcfLV-c+0;sl}NHv(#7;HV3O1dWuw(ITV zxr(DkmqFo~4zUPj2Gvw^B-Fq^F-DsbTxPl5H_D*Z(F8*t=y)U};iOi4WOOgW*goQ3 zxidr_Vh{;Ki$)^&AO^?}V{EQ9-^`j{Ow#6?S@VZH)M&ZVj>pL!a7S4DG{V5GVQF`p ziPGj@7nmuP@kkr0fjkf@sn$cDwK!Wblt`Wh!ztJOR7E0`FTLT?a;XBXth5f5^UB$d zZa{LUx!?(529MDVb;t+kx*{55T`Kp0_ofaT33jYP>`O%r_qEwndktd$4Mc^T35*%@F^c_pnS13Jm&1_wY!(ESKB zGRn*rjm7l7%tMae-Zv<{t9f6b@`Ju|P^B?h1N2;_v69X`*nwL5?;7l`5R!E>!rlhL k_C~@DxVb`DYPhw5u(N@XhdWd?2Y2Bfy#Y8q1tQ-64O`L8I{*Lx literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BlazeWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BlazeWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..20cc552e8d25c421aefca3cd97ba863410f7246c GIT binary patch literal 1578 zcmc(fO>Yx15QfKTXp$u*ZJ~UBxH%;f%3e58!~qJlQsB}ML~qXSBr)B!BikvI|HK&y zB)IdV5aUfYO{Ay-wGsz^%6j~c-x>e<{p|+;Jc8{K6d1fpg;e1OaV)|V!$kIsFef68 zW#qzG+QC>_oK4)x2yOULxM+yRhR+i58Q)D-B`7l3I|r;SkEI$+X$)4MNG07<25XJ> z?o`K4v&*3PT*p{~3WHjvIuU9RzA#3cGF)bb`dekt>f{(>9_e%>6XB#*d}MSl!PGwH zL8UW99%GaULx)BpIuZlq^%PqR;kWYeXOk@aRvvzx#~LkH+VRxC0e6JOPa}-n0+!yl z<(0Pn`GSd3nU1ufJCH|0`P+KP^AIN|h7!rOXn4YPKU3j_@_Bc-v|Or4D=V!-<$_B7 zrc0pQX)d^DOz zGT3jQBk|{b+F?+U*6)xI1}lx`VHvJ7I66D4^Q68Irx*le&`d+IaoFsZ;WmRWXN#DX z)>OrRcA3IB&|?$fOX=;~n1AN19?AUuxsuq+i>L$-7?kt+U{HN6ttC4;{_}%vAY17F z1nL>(&?@z%>_1(B0*%3UD8JtfzC!gUtqM@1-k$+#>(p1Xc>o)*neAPLYjXsDZbH~v mLZ~h!+<=>Ngi{T-mJrsL5LVz0-CBUVaF0d+POV79`+oqNCEA4m literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BoatWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BoatWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..6caa59d8e24675c3a243d54e598b62b3e4310550 GIT binary patch literal 1543 zcmc&!OK%e~5dNHoCfTN>w3PS5Etf<>*$XF%I6#S7DZrs6h@-RXCN8^nWIKiaBz^%B zNO0#zA!aw(HkG1M1QG|&daT)RUf;}*pI^QKc!UQPlo&dxP&zymM#N9@O@S zlE*Sige9Yqh~A5Vg%m>o< zL^765rTs&GkWgP+Tsc10u{=TqCeUYN`SpXvJ~@+pk_S1>x>7G7l0Tr`XTRV>$W z36~kxo841N?Rl&8Ag5fTOR2mXr+sPn1+j=>wQC}g^n_KJK7B0vp>hm6-G4I~TMRX- z@3u&Zo(v1k)@~Ko7>4IFyde1BcZmE`V+#M}W~bGw;ugcF^8+{;vH#y(hG5T(Z6rG? z>)Of;|MHQfmhbAwXs4W)+V3byODq~5S8$)9T8u*l8w^V`W5iH@shlHv>}Puo8=&^k zY6M9}R9Yli$yen9O7soBqWW$%_>B5@(n@HM%xpksg=9Uy2e^XO{A~?aXAm;G3Bvju mgvMNi>$ow4a2mtSIS6ZW5EgKoyq0hWcj*gk(pe<^9{4ZKT*qSo literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/CreeperWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/CreeperWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..948dc9ed06015cdb8d70834e7b3f5ea373ce55f2 GIT binary patch literal 1974 zcmd6oO>fgM7{?#C-P(qZjlBTl)f<;qLd}H}LtHk{CJI8@C}KA^dDa>dJF?x4eJoB$ zAiuzdksM;=PmAJZ7jK9fqi=M3hW zovpEwjaHXIWmAV(g*t=zOm`$y-+y6@HZ{1$$}{hjL93%f40)jAL`K3%t$1Q|FT&V9 zXBKRcw$k$_RPdT8SJ7BWN9MH}ku+Bq`mMiUeoce$}!s6!y12=^w z54TgL?Q>r+QYzy_8@dB|AXIu=4|#6l=)^!G#Vr^dbA6DhNQLt0_;6{tRDo7jT8GMc z_1vokSnf0zJf(~-h|vvn$ouHJA{t^-D)*T8w2n}yR!SbK5D%mxyAQPan}q+yvX`jK zq6)W!6RC~=XxbH!<3SDP8ZZOb8LTurCxx=>3{_cHNb?;E*qdS8L$fESHW(~+bReRx zFf!ebe^%T;S_ZE=7pU#&RNP=tmv*O5^^GBeag=VD0IUJUjouNU6k{}IX|87PN*PM@^}a*x!=m>U8b4`Qf_a+L zGeBd3=0>*m;07#a|CV6+6d^q~BCHe;8ij;g=O8Q;5^lrlDGeu9+$qqoTu8Wg4#H{y Vp$zxQ@)A6Nhx7$lr%@qI{14~&K$`#n literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/DroppedItemWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/DroppedItemWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..dc1dfb448fb984232571198e3713aeddf1a5edef GIT binary patch literal 1700 zcmd5+OK%e~5FV$6-E7kbfl}VM1*GJXy>Oz43#Fn`N)IhX9G%_i#_g`XvYkSI23P(F z5=e08M`ouIC^cNt8-)F}o~XE1+y>Xk9tgfPQu=B+Ylb$*B`PjperTsWx}FOBZy zSlDMgs_*oXrq1_5gWd!+TGD|HH4cCKL17GjE?+UJ}G>ACj7b9SoH1P5biMebcyj_jxHEP+j?LU zT$i5krSsCM`T~h&LnT^SX&ox}S|T;nq<<8^Lk8in(gIj!Ff&%60X$+*A2C92v?;A6 zz3upx3(LS@in=zCWu(okWP_@UPeF~w=o^IZo6#3&{Ge40=E-^=pl^X}qnbx>4Vu;7 zb+|Ex;Qfvf7AGLgO+;9NTVn{PG2EVj(42rU1$XJz8r*~XGy*)PFQn`q0Ed;|0N($9 literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderCrystalWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderCrystalWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..dfff2a24ef0712b9ee12c8f1fedd6d2d8e7dccb9 GIT binary patch literal 2678 zcmd5;TW`}a6h3YTZ9~V#xDCd|8@HBA0}@XR?O`{8RJKVQL+s5>OzJJME87M3yLdo= z1n>MP#7Vkr=@xBe>H`mU9OvXa=Q}t1_n+@S0pK}2D?x$4O2mY8x7kPLM%)cWOEbO8 zd|!Ch^@Rz#!tnit-R*GWeqz>Zb8Xxu>2tlHca3G?yWVCAMhJ{2a3Pa{yV~03o+WVh zrI5nT5g4sC7x!Ri>zf2d7L?CRP$4jO@Yj;oN|)grDgJ&dH8(2!$bIUms3SsVg_5+R zRV(C?c|o1ZMw?Tgdm+;()M4HZ3pkyLc%zR^BW1I{NZ2$|HZ#;$+)$}3jbbj;A}s&h zLG$}y(Or$$(#Ah4=vgYFj?y+J(})SRxfGwN$7HOy#c9g+h;X1(5b~2Gqti+(hb-8O zVU7-J6=gJbm{Uo^cY@e_sJxvuWkeFMqXe^%tDRVgg*lKtKSbQNl}`e_l!Vp+%4!3#DVtX>&&T|%RFpZ>9eXZG-5NKr?t`PV#Kws+nF(I;(eF1ipI#pF!Q5;aZV>o3fDcmi6X*}gRfBr87w7f1`ZTYs zRS_OTwXHa^l)#SxSY=8B^X31kSprpIvb2h|`c@h4641x9N{`XKzA=<~C*Z8BuJ-t{ zhzof#rzs}~DRzU`(o@n1W4W}i1jj3g*WN8b9pluO86|i`pqw5+C3r&MT;|{^fs3Eh zltX8{5yoI^*@&+#FbxEXc=G{lK?KKHoJ+|~s0amoIzOQNe!}?*)nE8lfH9n78Ne}) zb2V8zZ~-Qgy^C-u7vXXa!i8Lft1yXrt|3|huJ79tYwX!Fm4kF87wIP4%C+To4#HF} m!Zgfe5Dsj(lY>BW5Q=aw;c*`x;1l2}4hKe{1`pveH2wmvaxe-2 literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..7ca8b1e1c443dc093bc13463cd1792425cf7f0ed GIT binary patch literal 1619 zcmd5+O>Yx15FIC>NtcvBN-5uUdrBmfl@KS2xX_|jN&%@Mh@-PR%^G&?$aVtxVF(E% zxbveBvzu(%Dp91WJ#g^&L)M$;H*fss?~h*q@C>%gP+)MB2&w!}VkGWh7yB=OF*{eNUHu6jls$bsib?! zV6D;Ko3hz$b{Ujj=@84X%Al5UkA>>{`^IQff$OaB^u01@bv(k52Ra$ZSU9N_9~j+> zF|p6Nx7vx2hZw}d(4~P0K8rr`odjFwL}=wA%odpltz3j19%{5)X~&aP1MUbGzYZ{P z=U_?YR?4(>;RF+=G8t$?IgkfJrP+GO^CwPjL=vfXK{V$2Bx8{hT zmGf3}Wfwqmr@7!M(j-ZOF47_Iqw9)zhz+US6GC&%6m>{`IFX9peWJ}W3g@uwm13!I zPdJhCx*#PFDzH|CYjA_XMx%Y|s$*x!l9}sjZF=3CVbVj>5o9C=^|lT~+!aQq`{`lH zMba{O+rC62%-3y~L4|aG7YR#=i;d=C1@16NmRmh{`V|$9I8eQ&97>JDX14HH9A|qR^P%LL3ZxISKdq1J_vF?3`>TlW=phhvh12k?@tY&KuZb3aeTZh|c5Yl@S pgpCCVwS@?qaQ6(tDTjLt5Y`tU6yX77ExVyCQ literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..08c6e5889ddd4e02ab61a8e0569a5788318d31f1 GIT binary patch literal 3239 zcmeHJ%Wm676uo21mc%-7;wF9MId5-1G3{?i}Iq^iOICx@=HWhe}mHzxm8O(Ij z!-$7E?Z`w}sTJ=S-AXXc?sKoY-$ou`m9T?RkQ!=&`WEF?$va|(CiCxE(RM-9g5^Y80p?mK9+1-W(=Cm z1)TR(BW^Re{6>Q~AFefr1+ZO#4;cGn4zC^lGNV%e@6H9gld?v|J!xwUF8X6hs~uF} z8iU64w7DH}&aBaH>^B_hO$M7YQ5mfGjXaz)!0F-nKE1e)Fj$k>!#JjWGLt=OqGiAK zyaJyxP}Aoh923sVgQ$NfJL61B{&T0C&)~1=RE9^E6E5$Bg)#8_&U z0}q*7V{Aj;8Jq&j@Fj!FV0SM=z+hBxl(Ah&$x`vYJ8!}!P}1ng3Q(re3arw-oF8GA zVTqpJE2#Xk;k|&hf9P!q*6HqIfUZk)U(3fHT!xMO+xu{348g_q5v~>>Tq;EP5I!11 z7;*Tx0O95t2-gb{ZWJJFo`G;{48iHsU&ZYLggb=@o3J&8Fw)_Z0))GT2%o{7F@%v0 dpBEqm1qjPfBi>8!1>B`4z*lsw()&HAzXpB-(~JNB literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..9d653f14dd8feb377f6697216cca33a1b206febd GIT binary patch literal 2952 zcmeHJ+iuf95S?w)I&o84S_&;tSjsH{DS6?EA|!4VmC{nF7lg#i#@;yF*xqQpDfEl@ z1f(LtJ0HSlAZDF7aV3{DQh*m8;;ilQnK`pFXZHKgldk~q2p(E6L0~&zBCH;=BUTM~ z)faWe)G>2i;pnO>BCjJN-e2hBHjk?LM?1M_@jN^I7Os z-_#GeqX|sajS+#F+NS2gu4Ybaoxt=H5eog3z-+1Zvgd5Qd_W-gLb}|783JJ%&{v0@^vjO?HrsR-Iqp$|?S78-ALP7{j% zz(OjoQtz}{LJx~)h~g{%Z9=0NWsZB(zz#6+n}P^L6k#L8OlY6T`8oAJ8A58@c3VtyC76Gv+ardrv8C+7 z2&TynJ=@vL0Pa@vAm@oSrd>p|6S}-1LhP-ERKMMV@!=#9>}%l*EwJ6s>cKHYZG#PS zMX+F=z*4C;P`6#Ju!Lguo2y|4wmU(ct38u_0t+?iF#n*p8@-1)-4qdlo!WRM9Cdlh z@nwi^-=}4H+-~x)OyJWwlsws=jBQB^$RBNG0{KKA%(N<}##kP%6Hw>iG3M^YkfNSs z5x7uFMN~e>1103g-;Ze&nfR|Lr)E!5Q1{oa~OnMKwuKjlLRJU3Z`+D z!?gu@ycXhf<|MuWu)l!)ZlU-YE_}ng3Al*YX|yq4F5tBouWeX_OYyTMxSWY_B?DnG z6JZ6erVxy$ZVcBl5LPk~R^dhpVZh>M2Eu9v!X#$La9xAj_z&;^e|gN-9k>UjUu~YJ AO8@`> literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GhastWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GhastWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..322981d9b57b570910efab8e76208db860fddb56 GIT binary patch literal 1584 zcmc(fO>Yx15QfKTXp$wRA5gwO+@2B%WiOm4LP8YUN`Xs55WP9O(_PbDJF=ZXe-vjV zkl@abLdQLqOTSa3Kbz#~cZ&44d8pBHr5#VRJK&D6_<4wdo5Rxm zb~2@%e-1EFD$}7h6a#r6R2FT3yhw3!B9=(51@S4@$GM73C@;IirR7ouT3KlwD(5wd zJ6!2&+AJ0@N3xelQsJ&} zBGdHOQaq@`N)xWYH3pll?pYNbIzuIxSJ`Tp@_9Q-2WWbN3Wvc)R|g{L3nR1jbhGMW zX&D@JFHrbppLQ5DrF{`aWU!TE3cJ*5AJyR|gOl?MyQu3+F^js6JSxkmwvO8UI^1RO z<$N8p2Ac}`&t5a|4)w?c_*!Nru9q)6?@B6xgHmJc7p+u-M-1vkmyj)QBsrp@UiJjS z7LYUaiUN&{DruR5N@I2g=v$+)na@2~hmCyiI@~A` rvU3x{<^n=kI>E)mW&+*v?aTR>QXdla<-_u&Ek0XThCB0l^Btb^Tm literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..1e74f646b4bedf789c5e88cf5a890dd06b174264 GIT binary patch literal 3407 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 UegZi7+KoNG0vu`}U=yr=0oX^GIsgCw literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ItemFrameWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ItemFrameWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..43ceab570305b84d65137e2559914190a3fc1020 GIT binary patch literal 2748 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 N;1M9p+wd8D@fT&Pd*A>7 literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/OcelotWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/OcelotWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..8555d676c29dbe3d055ec8830b87a0a1f438ac05 GIT binary patch literal 1728 zcmd5+&2AGh5FV$cn=C1%f$|S^%O#Oe_QHuGE)-NyfI~|VM`w4MnC#k-?G*Y1TzC&2 z0SP3y^H7NKZnjNCkc!#^2mg#U`sSPYX8iNl*Y5yuAMOTFVX%`4siJq{Ktvfvsq7hH z4n>m4*hPu7{js!oba96xw9$Lv;sF{Py^1l_?oD9^u*l%~DbV&rhN73^1dqYeL#d>D z#9+DE*`83@YIPYbKGq2aP-C!?6HkTeM^B8=rV8g-<a;P(E4@d70vjhc^9oZ#*1IcLtsViPQ}7;E?P6JTsp> zpAnr)%cY97veG(KF07S8&56&Q=7M_=;_RXROlI1p2sFp3$T&kc&xy)YO{v^H z;^JDK(^w_AFBOTfugzb$pNNF-lSw3tD%loJ_(&%Y5<(T0>u?S(Fj#ALj{9}j8L9et zKd*F%>dSG~L$l{6fI*|9W07`+k=~v>F1mrVG-I7p4B3o&TMPoKpVxvxwb| zF!+3u8Tt=2qzr7CL9JON(CSv<27`}hlftPxfI+yc$0o+7GM9Eng8W;c&UiL8L_6i& z1+Y%KloJ)e27P^nSoIguT52C}S=ayu3-qT0?TlJ&iS{7>;}@VpXZQ`OZyVtksQ)0V z0xPt8AE0%S_IiE~VHFzr+ah2Z@Pgta*c%X1N~!nG-cV-DBnAgsC^2nhibpm33PVLZBt+j>jl$Z-ezE&LE9 zkU-**AB8whm$jWTZ9w3mu9F;p-}!tl_K%;RzXHHLxNE@}ffo@IvAe_em>Y376fMQn zJ_`cjYc~*SrzcW=IMMqFPu=%S`(3V5_YE%9BJRBHzp$W6U^asaS=@17w|2O%3E0Vj z9f5K0k)w+Cmes}l!Ggds6;T{jD zFQY_+ObZ#)M9Egjqx3#?CO5jA2HX#sLZgKFyR5_MO2nHZ;+na*!$~HtnTuPYf#fNT zrKXXQM>WFo4+$z7fkkOe<7xA^3HqLjD3J;|IQ3a<*jk+C5=*y`s?%)sc6Ws?WLpba z9?OF7R7=XJ*(GNZqj-Wv9@TQpOiUxLyE331u93aoplv0iEGot&dL$Qd58Ifc#%B|_ zNTewyYUVw~<)=|_vc@tjMwR8ehVn#8dvU{kdOd1gv@^YuPqj zBG5jC&n46Z(x+LGYx15QfKTXp$u*B~U)fN8O$h31u&wC_+NCK&60?T7u}!*`00-yLMzdh5jUd z0TM`X=SLyNn{1LwQ3Yxx4(qio>zQ}_&iL2wZ$ALwA#7Hl#9%iQQiUJHu?RB^Q`tAd zoQODzDNb+v+oqyZ}C{8+N`@oqrB6Rw}chHWUMSB$SWVM_!~jJ~5C;rbUAju8(pRUMQcL!=>d?MOs;D9V!>p ziW^;kZ#!>N( zaKh{POBn%FVWke2;0lAaR(DoC`_4#}OW~!f(DKL4A8eqV?Cb-a21;Q-Zi*BNATyy ogtY~P`a;4@xHU(ZX}G>^OztWwbkz2CsHhyCW05 zP{ji;JWy2eW2k~6p?Ksc@j%hD(n_mjywciMjw+W+(t6eUrhBHlr+fCF|9*b}0O#Ot z3dRU5)hTxi-_k8wsI!8@%O3Sw)V8@L3pV$wP42Vqg={sLU-*tntHwOPu;S1b^X|3( zO~Lr?XeGYI-D-zMAjSQnd!5+?$OeICTqers!WEunmJ`})3sTJyBJ9o;cYW7!_PyUM(w~EwH{m4 z;}kQ{@H+R;&N_9P%;c^-Ym{4(C77cK$7ilRPbF2HeZq4&5ADPd#>#-WP9z-hlO0Cm zJ&!gT%)UYEY{e55?&valG(A0G{o=AfRISKN_)M;LN)@v#gu|$N*64C_M#U5LZL$;Y z%oQxF6j-W6$9*3Qo**&z2*am??w|wKJWj5+Ao z;%ng1r3f8;cyTkb1Jz-@>(|B#AsIe`Z!6YJu zC7e>bjnT^_8gT@~MB}eAZ!5;TdPTyj^qQ7zdTd$Pyn-d7#`tKQ?7`9nzBXW(&=p4> zjzg?`zsY-4AIYcA$-*QYorDa`5IAm@dOa?>1nwU}4}7?UN$OU!US{5!Dk=%gl!Qf{ z^-hu5xj8Ot+$V6ev{#1$*q2XOj&O0n^=MnZcLSv16dpUo_wcHP4;?YyUkS`&DhxO9 z$XUabnTwn@q~TRUeu*D6I5>#gTcgo9tX#hfhc@juKtc0LAj|#LP3|r_w2J3GW-+&s zhBE|s{7Qu`|nP2e~HSj&@`5QxQKS6=?F1zm>Z86y+|g$j@NP|`%~O3_V(cYUNZXN1lyKG zEkU^JkG!Pb?V&Hl>k z>2t6GUlmQyVvBf`i#=w$66ieA4W4OYi&~64m|6;-Wu@Rt0=-Q*1-A*L!%UZgRfIiW zhu|tKw+~6z)Prd_4OnmEv+Xhbn}CDCRSMGhc@n?LKo;K*1<$?@paekn519OFX8Jcc z@-UD+hVKVa2JkhD?~}oG7LLOU!MzjkqLy${LpY@+yaX>t2x_FZ4zFkkhK4W(uYnOE z^sG3oA)MC`2)qt&LXJc0)vln87kOvvB^+h;+-gIM%6 z(+4byL}-IZnBhbiezdU%V{U>^%!VVbP4JfW`@+7P9z7@%*j@nb*^sk-%n#uREI$!a z*rxS^6Elf&SJ)=F34A}RgZlbRb9@AHU;DjAEIS)n8y zYlZNMc})H4?ugTfhcVL_G-lyPHso|8;q5sA+L-`Hn^b^yCcp-b6gN~VOA{vowFt{U zk9lb4U{T?=tF(RQ1k*}IGFBRMa2hh{vh_L5D4t)$NO1H%9347j| z(gHjEo0_A);xqODpXp>py@|`}F4;5Ic!39_)u-5F( zW@5)`A&2SA)Vo;ln@Q5=de==Efksz_EbcKa-1+cf*^Y!E@T$AO9M5%3hk%DFI_C+j zHe219OPvZ_Bk=VU(>nW4L0{yhJT`DTDT_Ocj7-L;-pmtf^(t_Sz?bu+v~YJ2@ORWi zhy0~TZJ)CzeJx?vZ0Cl0D|-)kaGyXWn@tba5o)F|f!b?f3^tfE*T6auSi%nr;7YI= zmvQyd56u#k@b3SB%KL`@4QjveRDwFLE(Y+rgljF``*0Z=>9Z?vHHYBhrU+{V2&;t% j*WpGEVOGP<0)$2Z!V=uZtR=VuckvFef!8vg?*aV>27^A9 literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..f2a3ce533a02bce2509e6d1b9fc44b958ff9f39b GIT binary patch literal 3350 zcmeH}NpI6Y6vyABDRJC%r=^r_S~dqt%z*=<2&rmWDg`brLG(7Ur}0qR6WNnOJ{Jch zkl@aTLOi>6>j)=Gn;sD25YJ39`OVwr@Avc9*Y5!E2p*Q8K;Wgvgl~Rehs^Z2>568+ zf-bXdVJXuVVXGrTemqg#HV@5@Oj!;OLUYIAy#4NIRe~ac?Ga!bEzX)QPjCb-JQcoB z&j?H!^{vE^^=gAaaZ}p71Z4u#vDq&3Tjuj1kbwphWPIYSAMjARhuo%?^xDE@N=To! z1BrMqd_wi|uEVL#Etdtjsm-hd*5Y*4i;UWB@d}D74@PZP=#3j zsm(3bgT(;XB1>zhKH$hw;k9LeXK-pUKRT_+Y3kxBcgUbsYjzF}gzC$31jiDvoGz97 zu}6{9G@EKFLMnVq`k@FF_my5w^OFOmN>WB6#*wKWSB|u4$W?>69c~C;t@lb{fk&JYzHG?=WwI7|^(FzP3A zxuXK%w_-V+uH$`s)A5=-*o_33z+7Eg%x$nhMC;_sqH;ut3SS>V;*r z1hv}G;5q>@*p~POIeb_LsEvN~?oQ+gi%o+SLY9U&egO2}l`sN2rtY|QipE|PvD<_^ z9wK5HrT8y@Ne_wjr|-y4VDT3s(zV&F{=^*_s^WI0k$IK2J|(zEU?Ot~O0b4ED{XU1 zP>WVcVH2pl7Ga2bx*N5}umX7TvBL(qfV1)VS&BREF(}}ue*^9Poc;wWKX6rm>0~G1 z?irj{aKv3O3v)OUn1_q_ObPLCF<~KxFqKQV1WUPu%Q=MkT*4K&njxHcaV>|i*oSZ< pmq2p}%ejPAxS311l|xv`A&kKtjAsGvf`KD|i60F!RfYTT;5ROR2rd8s literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..50d65544c518b27835ccdc461425523cdb3b7bd2 GIT binary patch literal 2370 zcmbtVT~pIQ6unzM(nb(1f{KDmRV;qAe()p=Ga@=L7ImhG*aNO=%^TGCVZdY;Vpz=iIwDzyEyu0RStoVnK$$cEChf{>0j>9PqL)YKo}? zR<8?3m+K;OTO#7!g+6HVsQj5}$Kxt0SG|_s;OhP1vjw9Bw$1=o5p5B=9W(;tYa$eS zoxo(Vve{v>y1YkV^tr5a3vvXeV%|Or-SP{iq{_lMlKJ&6R6LS?o7br$gQoDA7BZww zC2KwpqNmi(?RuQnx#Kg1K~3f~n9FG);H5qTN{Ip8MQlJRF`z)}l1DU@ng+%Lsu7m& zH@TzxVA0`{VOlzMfH<(6u# zMnfQn|77(9$HsBI11dkpHW;U9e}hmFQ4u;aj6|e)sO?-*))ZK(C1up0*trc~I*pgi zNh5l?xHeOQVHeoBH%-$N%pWH8TN#PCg^sK5O+Ns#qhUB88?rDt0b_8Uz)Z1n)Z2;?i$Vg6o6U}tkwdmN*-i349rxIi5@j`Y?VZ_$R~;fHYFk ztTd_l;y)sceYXhg3>IOgYh2Xf$l(k}tE)IZ{Q4FbuBQoLr8aOMdG+txRoPMwe<@76 zPxrTFJYP}FcF%m-N@kJ;_pw&pRVbym;6k)sXn$I6B z0#d{;D1e2lF&M|I6@O7jAcJ@NJ7hoP?XNKL6Q43Lg;x^;_`87DiFj?pMaai{({QN= z!NeUR%%mXXQxPu1l~jbQDG0Nv2-n~`GM&fV8CdA5IpT671!*o7X%PxNT#o#>nS!v8 tif|j2dJv8{q^T*SBHTHJA4@3+BT$T;ScbcJ2Y7-%8%E(CJb*Gh`U{(&m`DHs literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SkeletonWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SkeletonWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..15699834c07c8c5289a6c6d42f537a1c2d3e5992 GIT binary patch literal 1688 zcmcIkOK%e~5FV$cn=C15OUwJ=mP>lcUN}+2g@OuNxU>{;bap3+$*vvQPNBa7@oSJk zf;&G7G2UcL0;xh(IIQiN9e?x9%in)|{t5v1;a&h02G4ULRrFRIi73Y?lWil+u}D*y zxG0sjJCqhr4(@n>HhL#q(nDjT{XS;sw0b>K1hB|p?;LosJd&zAMq{w_P%7yjF<5TK zyJIRl+lLGmAL|qYs4-|1#519~(Gz2|slr88IeeuITAdwX$`hRrWG0-{iVuu#XPDau zJggn`kf)er!jREGBz@6EzLjHZDg&)D11E`)l#<*{@Wx{I-hq2tIfFl?G;3=3Rf6>{ENYuy!ZbLNTj6Pa8H0vtdVDRDJa-I|3{4QV+?(3mR@Tv6WT`vL0Whlm+`s3Ne@a&Zn7r91i@qh2 H?*RV^-4q0z literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SlimeWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SlimeWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..077aa96496d0e20f21e9e8862ac81df81a31be02 GIT binary patch literal 1629 zcmc&!O>Yx15FMwXNtd*xf%5&~_LN8{d*MV87YZ~|;F30oqq93r26pYpb^_%e@e7bZ zf;&G7F}umOsT8WBB5_!+ZH?Z0GjGN}e|`N90FPj+0wn=2Q$;#_rzR>)F-)j$l|52% zOpy;`a)U8BJl^=D5xVe$^3f2j3%d!W_-1;lKv}@v1;9EqAw8I(30QtYn*37%tBua? zOvg^MC!qYy#8`n90qeQyMCn2J+*)I+a9Nc42il@D$pm8=nRG;n@?^9eS<_E2b&qAR zvOh!_W0WY%K_eBtR|AyWDYj0f-zw5S-sI`GiuAW-Y|u$Bv~-Kp82WvGq|FDV{fCNXWiM!y{=9bDdc#a^62lPLhs{cH}&2AFLEr zUqCCpkxFJ5Ct(Mk67s|q`IF2P{m{g6fWD`aF*Zp1hs^1l8TVMncu1NncWCTliPL0f zDDEGj=y+Fom1#M*i~y>zT7yflCSbGCIqAZ#x7@;cm#%j>m)GO8k9J>i;|ZvDOr(;Y zvXq@?mt{XBC!pQAz~IcgxFev#_3hFpW?X7C+f}$OU~u+K6eDqAf0&$YnUa?q?PjkE zw*`DYoBenq|G%*Ug030c2wza<*v5Qi^ATph+jBFrS4>p}9tfxw10$gJik#zC*w5Ze z*aG%~pIqQoaN8{NTFIZ_B`EPf_y*Ot_23KCe(%3+$z~2>KYxzEa4XEdLSK-LH#-#A$8)&Kwi literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SplashPotionWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SplashPotionWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..9e2f7d2998d1dbbb75925c66858ba6e7e23f8bcf GIT binary patch literal 2010 zcmcgtTW`}a6h7{{rpr231{(tgc;(icP3=cb#v!hG*aA9sVq&L zYt$kv|CFLP7ho}ZU1w?cp9vGUIXDfObZi4oa~I3e*o@imG&=pV#uP)j|%lT3_sA1h&V?fa^Vm9@2as5`KEAXx?0eu*$~89@5xX} zBaG$JZV8UBNjN(3;2}N%xyc?p##~H|B?67t!Wis}J@>%CI$&b)jUrHiS*W2@McIQo zu5;PjHG^LO{BPjDTWWlPD?e~ofvdRIP{-X|!nKjfK3s$A+1WCz6e8RxKxh^s+=N?G u2##rD!|eiul|qC&aCZvf+>3h!2x|ohGZ-D`YYXnWgj<9QJ`2>)PuKN@2L{h8eiXo2>AKdR`VWZ6!jWKHW_Sf(W6(R*H=bIAW*KYs}TKfsSQs1W!iWkLpj zvZpLad60;%X8M>#kqB)N2@?;5;iG{)?sF3yF&p-{Ho-1SIqN3;_xwQ(ss!5a!Fw1_ z;s{*1FQl*!2we3$TSG0I&3yvZpH#$a&>*moDNmS;gP*llx(*+ZnSb`A=0+t?c|=2% z_C><1P?GkwLba*6N4>^wkJE^U3DY>K&%!4x=5#gXtrHfs3JXSq%z{>7!77auH&iN1 zQ)dFTh~>}vJhUgU=yA&_ZC&^Sxl)n#m9{RJR;*Nm`xQ)HF?#B%>{6ne*vF4xO{CC+su)-9F$! z9j?y7EX)(Q=6A+by<@eIaaQ#U9bC%a25Fb;UDtL9EOu1Ll6|IyyB|KR+MX~3I-U3E zM5n4@lRzC)Z2L%ZO<>M%b_zf6O=CyIlG%YqL3buz-Or;KSdj#Kd+n{w2b*>Hn84p} z(VYtXT&=L)|N(rm**#yBko%`^43E^%DfxwsW)dXRz s!7m{+O9@}YH>HF!C)Y~}YZoAFln`cMJaopJ3WQe_M?QUAif8h5Z zfdqGc3_k%ecI(zv9Yob0cD;}BH{X0SWB>Z|?FRrnhDTMXFxZL(D*vO{7k(`L2>V8u zLlK4;I6p)?7^9UZ3wM}E>mLXg45hJt50gZO&yCRs?~l%^FwNlAB_NAn3}&CALidcp zT&ufzOlG~k%V2s#hq4NF2J;#9NT`ATf{2(JTw|5rJIY9_qkS3jK*tG2!l70?F}feg z*goN2y*HFRltCm686_eZiGk#6vFx1Dpp$EGvdA>(a$D88kcl8slt z_)QTvEy7s3p$@r~D%=!Kv{1QrD(qN=at{@i(H=2R>uN$4JP&Fx*MJ$g&S0_CJ?)5X zXHX5Yj+yTg)Z1~~m!>DE2^ciHIuOyWFqrO-52xJ_ErWO6OZ4#hI$38>8%URF#h~75 zceCYs4Q?~|{2$FaN#&xJlWhKxBcf$bXnCz;R_)yy+-30Pig;a3jv08{dTavu64T@@ zofkR#zEABl}RuCxWg(in4S fIOVWhg0NhIFa`I>YX$DZ19}3i(U_(EL*Rb_Cdw=0 literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..f919fd1345e1f7ec9717863f9a6dc996cc691778 GIT binary patch literal 2155 zcmc(gTW`}a6vvO-Zf!%i!7hwD-ngihQ1ikQLr92m87c^AT@jCN;-+SaT{-SxpNa<_ zkU)ZWJ{00OZI*7z#;PIhA&%`hKcD|O$H%|_eE$gm58-|p3Itw9Oi1@5+hcCT-B5Hj z)BDW#g=bt}#KBO+{Gem@2RwE^G2`{Qj@^z3Ll$uTel$^r5`nEV@SX;obwfVJ5tw}} zq%cni%+*_)V_P;F9Rj6i%I9UM5?Dwq519sfY$j;~t!POxoSLoTd_|T%mN(><)K#g*leh7aX&|>+e(5 zOB7kr^hmU+h^dgClCg*lm&U24Am<5b^i)#Gt&1Cl2urR*3H3M0_Fd8_^b zIq~xp#@H;0xaljO2HbR5IOKI9%>z_!8rB0t>GPhD80?JC_xf;yCJb{&ZD?4i2Mhh7vM{%Kr>fa8dF4t{)cnK`Fl*hsj)54C&lO@v^ zF@aX=4CUcS0&ZYkz@TJe2+Y?Tt!%tefy)HGo}w6J|KudwIiw3J!z{_H!irblYIG`a zjlh>v=$S~{bI&%c(e=roSQ$6*-Z@!@Ezz0&lcPew*;YgC@fX78-|~?>NeV9}@YY1J zdX-kVGOQD*q&24ucM+EDOQ7~fV5yQp+unSz1_X+Dc>Yx15QfKTXwoGmZE5+2x;Z5h%3e58goG&2N`XsDDtdEvCmYjUJF=ZXeiUaU zkl@abLd}DAgVknd zZ>D3n)n!nAsY9&53WIv4IuVMFXM@1Rs=1Hqtg?kLX zT&&})!Dd4Kv)2r~Lp?G9zLu$p>&45?x{^xZpwJlmc`H?5n?W`260+s3Bu7+qlsC2X`NqF~fBOO8DINzXF>Gc+>1baZiYSv&s@hiABatL3 z_EDl-r>~qm-uR=QbkQf_1(duH=b~Q(?)eC*lLqk$feSjWc8#BQnREf=pvXW`!q4IZWpz1hkXC zj93OWj~-W$WhAyqvO)3KPM}0<_#KrG3*i@3f6}RhS+cng=$j*3E%qViu~6LIz|B(# sx!(X`aSX!DScE0qK80|S!<{h*^J5SuaF3#va32q71y<;rr1L}YKe-3v)Bpeg literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitherWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitherWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..535980d63d5d5a28cf6d8418339705691c67f715 GIT binary patch literal 2976 zcmeHJOK%e~5FV##lZKQ+ODWIREd@3bN-mrz;?jZ|6u2~`LOnUVZr1It9obGGM}7}K z00|_x^M|-0W;c%}>b7cVkPzbF$F8hzX1*DJp6@?De+7WYP{=@vz)r}7EFH2oD}}ri zh`MIF!#q#8w&V%ZXbHmy8{27eQ+mg&>vL^Nd&1(n*Zs^u`eJAm(H64NLnAQrR7hc; z5twr-+dW4%3pE1iE#>hH%o3Q7-42*+l%8v?bQUg=^x+$+xluuzd(>57Qv}QkC23Qu zdcZ^Tgyv?eKBpdc1E%p%letH%!RdO)izD$D`|%Gpas0)8{OiUHvO)R# zCU@-!ED~IdJS~oGpzEm!n@Xb%PF*G=YjsZhA-x>2mRj*f&q^`tL2CfM~mR2{_r zMj_FWL{ed>kgk$O7|W&2&GzX}K&4huMkA1}Cn2}K@@RwG8Vg$75z;6RYo!~F{dX|7Zda5 zn8LV9$1K$xWMM83({P!Ri<&q5YtX! zA3eB5;K$h>43zrfF2sWW*T7(Auz*iwChe39wJfX<_&6Rhf8aKpUr;c+Xn&C1X=gu< zVx16mjwt@C5w;Ay!W zpM$Hg5dT|*YeNXpxh}#|0>WYZC~qsA$L$^#YfD%1#UXS5?GL+@ddsKkMbWMl7ZnebFa&v`(7 z757ENv`~`v6NT_`dY9H~?H;EA_al~IqdxP`Sjg!?%$o)M&58c$MW(+w(SJY##ZxMk zrm?94)dvLZhV6nhW!?d|@2P38;?yCg*;M8Z*^w!~YB5}bMDhZpN!P%M6bFq4Y zqXqolkg9H`$cU!7p{63GLi$RkBGp{#dTla17EG!YWz;~_YxkvyS@b|fDp{%JNOR0} zPX#pO`jkZj?h2_7k(X{5eghfsu8=qkUF^(^%U@Oe^B`$~NjFk#DK06O!7vjvL%vXcB!;`kj zVgkD@<+JFNCBoc~A69fvqy!$dR*3sto*WUlgtItTbWC=)(aM$Z$bmfqKb|Amb1(e| zGG?Ugn8mohwAmS#1lHZgi36_@=$5OQEK@UAE*Eo10X2s|qnP+G(V6OBL}^-n2O+^439HwgSt&Y`@B3zEoo zF4NIiJXQ%*MS5R`$=WjCN|GzAts~@XD;`0+>@_r|m%h{e47mLqxd%Z`K&0!Tj zB5*M`idFa+y)xMeR^hI>8;=Zu%`ZobW7~W{z&_v<#%~aSI$mwS1w2=?Z<2LbGf#g3 z=bPR7Pq6tL-mSqlo=qFTV+YTh*>xRWfZgobi||qo!L%D8T(%%=SrJ}_SF8xHS`hZE z2(QB%IfR*tH!TQPtO!?u<`8Bo_ALn4tO(cOtsKIP!*vV7O)J99IUHOI!YwPp+jBVB x5IifwEjYBQc*nxw_8bJyitw%l;f@7i9o|O|t-)>lN;bbEJREfFhj0fz`4c6xdUyZ; literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.class b/bin/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..6a75bb19540c1e4278004ac473c9f070a476133f GIT binary patch literal 4259 zcmd6rTW=dh6vxlx=8bWZHW2QGNob1=txdTUs4FC(MQvp&q@+gVZM-{K580iuX2t=3 z2tEl&h$keF;1P)rg*daeyEcs7`l7;v*So9nZ~x~$>p%bc1I^5L0VK!`YZED9VZ3+Hm|FQsUi_se5OvrdZ zBd~E(NMS!BuvKo{8VIRZngrH9RS_@1CV`zycEV&_yREg-0X#+4|9BuZH!3;f5e-$^ z5ec(GN!rn>mGIQupvBFjHm4B}6Q*%dhlQss=JX)t)iL|4L;D||WcF8w_8-tlaYLoD zG<80p7P0)>4iD`Z79Cu5N~<$Jps!S<9i{OZoQ6!gr?og8nmD#X>A2eJo}LOjab;U@ z3~<=)QFW5(btciVKvH3-kfD-B7|W$CZVuh=p;D_TqYlznl5*Qt5skTRvZTw)LfR{| zrBuS1tT=L4M*KubbkK>?6BIld6iWMV6n&x92{*d>hRr#NYD%gpk^X1I)Q zG0R*A%;)BRi0N5AFK4+*7BFZoAyczpG+kU*8`R&@y}w8W&nKn`0c@3E9kvPVl^c1h zKeQU>L^cX`8rVthcheTvM-00=f!&4*S<+-$xa+~qHQN@3z`e$@W?h{?L70!DZej_n zmMg~rJWF7I`sBgEgHuhIPgtuLzzYPDN3PEX)pA-YflXl!+w2s5N1!N7QzQwFJsg@B z2(%ZFGE+SeD52xx80VJ}XBe<892I$n6WA_S8u@iSfCBD0#uprb zZ9H3t4LlaI7oJsE!SCX)5PY>;{25BW6&@Uln41ux;12?U=N`(DDUK)s&a_h_hi39rFL zFTod!t6svT83@-V5H62s$TRA7j}_OwgbMfxZ+HlGFX0MY^=hbk2)8E?-trQzc?kEt hgm)%b;q$|hhp>u&LAd&R53b`kKpj6Dc>O+n_&2V~vKjyY literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/events/DisguiseEvent.class b/bin/main/java/me/libraryaddict/disguise/events/DisguiseEvent.class new file mode 100644 index 0000000000000000000000000000000000000000..9d5209007110ada1cade89db3fa7f3056c09e32a GIT binary patch literal 3337 zcmdT`&vV;E6#h0%B3p6WkkV2p&}}GS(_-@@KuJn_XwzwD3>+FVLvCwnYi}cIJ-cfU zIrYe�<>9oil$A!;@si3Zo%TN6f&%mUi{tx9`3E-jCn^{P|Y^Te$CGiQ!HxRMLAc zrlJ?iUZe&_m?IH}Dsa6}+2KT4*^^V5INN(TTkobz56cYenPMc8Vei|)a~U{>#z-V# zB#mV_-+!FH_my=!^r--3@cRWA?Kg}4kYxJ1iBs-~w%3$>Ad)~vk)#jofZ@VWx)LPA z#dha!XDmO^q4e+yeVg01Ym7DxTw<7hml$bvG?gI_bUap(a7rh9Z1fK%N`^a~eKNeS68X&} z9!Rq%$SQ`7z79mRFN{jpvrST;g=!wl&VB=LvK4;;FZV{0hcbwSp-_xPa43e7Z^p8F zf&<;+YPvZGHhHL}qF0$t*D{?BXTP%qX2+0uP%-)}3;6POLhF>O62kta`=j3&rC1nPx;R z-AIRgUh! zQL4pt*-`S+N_Sl9+XJm5DUy1;WmtA2Ma^it|FWGfZAEkqMa&sm)OCv0P6L|^;{^(C zp>ax9Eha`ylT6CFN!^qT%HPSH_ZXrD%&Cpnd30vvwheR`{#fAr|6MjPoNIRu8o15y z;-CFXhlmon>rWk`U^!!mzAu4^1OAZ{yvmJkj$m)`(v;mZI^4BLrNy8BE_ zL^qM$SoN*2$0CYU=(~|}gRye5D<@KW*L|#uoxOA;z%s*nrWy-9=ziaSCPU9q8wwr8 z(mICAy@&a{r<~uRPXz!&qxaPmp7!g-enc|8J?)i0rtLN59ta)EIF|H*9Wq=QNMC|v zxY}x;Ib->OiDZBm=-bS;J!_4v;Tpr_v9{8gcp@Vnnq;J6;g!*RWKBPoiQDFldg%ln z3ayRjeaTPMyy1fT$gsMrwDR{EZnSzc6CZi2^kAobK!*2}mfww& zzO?&-tYX;cnNY+B!m4yV-6Zv?t7g7zAJp(FTUnpumit4=BN@iRk}F0cJQ4%RHxt=8 z#ez=pG@YCUn>;eo@zf`Y@Zpeqf{{Or=;=?v5Uo1t*u_hnnNm7^$a5s00}ty()SYv5POL=;E%LxQu@)<~I9JU7o@qoR z(hp6Yx15FMv!lPskzp#{pP8-$crD0|@mBnm=Ri-e+r=!eA7*&Q}+cGr>ZROFW- zfdqGc6k^tClT_M5)Wce~ci!`xH)H?)^Zh3Pynv@AC@^@H2$}k);!OAn`myY4p+_PN zWnleKnrJ8u`a>&YX(bweHx|acLu*l&pvYj&A!Ct7{)g@<2A086OQzDc87$PdPZ$(; zRfr|1Fj$?&?rE)b8E!Dfj#G_B#b+4uKqUhi3oBL12U>MwOw4QURgQYdLkwb}DQF;q zzKD?55^P+O+qjV1n8>a1P@&Gd1bZYMDmO%*54> zOz~itbWtA(@`XXQqXH412raYq`DW4fq+!tPT)U`E2I~=8S7tQ(N`D;N&0srE+E{Jo zxBpgaG3rQTiK22Sqg2?TCZTWU#kFQqcjvcu+Rb*e4EGr9|GP`FCYi@-QWh%_I(7!n zu2$w6+J#Xz^?Bklv1NF~VC%n98LUuu2WZTDp})winlI0fNYVPopE}JME6%$h*XgV^ z4z2~g!t9LDJ5)m*;Jy>K=1dr0cy~o$3+QIk0|HQ_*&-~_SaJ`_0?h!tA5i{W^}fOK zFIp8~mBuUv=v$+4c^n0|ph~L>+=g|E+Msy>?l`6$;-50z&0*SfOa;PtunG4k_y;-o ehdKD#4E`}Znc(>ZpJh1CBoF_5f~R^r<+Z;vxq55> literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/utilities/DisguiseSound$SoundType.class b/bin/main/java/me/libraryaddict/disguise/utilities/DisguiseSound$SoundType.class new file mode 100644 index 0000000000000000000000000000000000000000..7c61187c03a7bb08d012e623cada5948445ae67e GIT binary patch literal 4887 zcmeHLU2oGc6us`}8cI6~8HDn%2b*`z(XiItircH}q}`(;QV z!8<<+;e?b?X%9&34Zrv(_R012_05fazW@0A6#!lVZbJ=$n-IpG4`fB0ggP;sOCm2w z7_vY)AB~$>#-q{n`I#n8M5vwZ zBj{feTq%Xzf?H_&#VMCG6Y+|MI1ow7VxpMfIF(`^(LT}l>CXwYp%Pid~ z=TuH&l4Ue&!(#-ae^77=zYD#nP>RMc0YP00P|fiWn$QB!*sgG^!cK)&ftp{_QSNHI zSqfM6@_p+I^v(y{pJ4D!_ts!Xw=K;n_`A9-_y88%Ep61{o_?yq5bl@w03Md3NV6Wn HlkxB;v?qIK literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/utilities/DisguiseSound.class b/bin/main/java/me/libraryaddict/disguise/utilities/DisguiseSound.class new file mode 100644 index 0000000000000000000000000000000000000000..8e91393ad3fa07570c83d59c512c40ffc52ee8a0 GIT binary patch literal 7625 zcmeHMOLN;)6h2DhM_f03QJ|EES_+LzYx5|NHfgDBE4GMirIziGv|waQIBIRlNOFd5 znPI_>9shy_3z&hKGQ)xeKZ@bp>*H2w6;C_v4lR=J>fUp|^SH;?_UC{8{rv#|T!F7s zupq$d(6F7tU1QHE46VYz?s|rI-!M(P7Zgm}?~iTYDvSerUp!J+`m zeDA<;`UTk;4+Tg_jfS=*z;$&F>Qw;_6{RM!6;)|R7T|D6YRescQz^?00aB%^QreK~ zXjNjqQl*A0Z?ctSS*vfz+ZdOuqG_knk{V@2Ld&dNXA|XyRMGG;%^z!QWoa^0n&>A{ zsY*KYTft3;=|=>Ks@BlaB%?I6dZ(hPat$A9Ql%z!O06QUEY?~oLble@s|`)7b$D<| ztt6`&avj=KD!2pxcXqT|Q9;w>rYddoxEoTjs4&NR6;r{K^lD4pU`rWYQQLB3UD2x; zkG>(Ra+77SJRNo@u!OEEH6%^xb#04hmYfzWq2FpLWelx_MUcwV9qG2Bs#1k{No*<2 z5;{mCR@ubS$)Gd!g6VB(>N;9XgFiYMbRLmpdxq1q2E03b0ZyvCIavD?s)oO-TLB*I zl5Y1MBN%&@02iLLSes1oj?x3qcKWL~aMy9u7#e+xQ@7p0c!;|NjAnV-r3X2!86({8 zJmv^z*XC)^^W0tY{>WO5jyKh}0=6u`t(7M&a`X7cbQVjlX{F#g9#iP`=XtJ|hED}J z+j2b1cL#fxDfZmq$Q~Gh?K?ANdkt>jR}N}~-$b9-eT zZ7A$Jq?nM9hBDgJk>7MnT&!cVPi|uRm{6CCnm<6E+gC&KwlkN?70N__Bep+@mWmXq zRPCTl>{&y1Z&G2dygi>|RJq$#cAA*zbK-m?+)=%Fv-q=`WpQPl8Ku#P3Xwtdde*wl zRk?lgJlCTH&_Zp%6#BVjPcFq~700o>(!lV2%TIwJfc#ua!lYsLy8@F6|UjTDz09{(-06df56)Ii5tJc z%|H2`GX78Ul}(WO48V7&IIq*bE4VNHa9<^2A2t@QXD95SP>i3!Mu>rR!oi+*BNzlw zp%!A89sBo@40X^#3=1=3_#u*E6K-LBCzWpSIvJ1d6+c%omZkU+yGbF?$2NULDj-7%ltykE+ld>4oVc-_(xg1r+G}YeX;F!?+8O$l;S2u=%nvm#Jk(NkWBRhXsZO`}bW>lqRBKz+G`;FfYr0+Q=r*73 zIC@iebZ$?d@`u)fkt_@`IN;)&s!^Lhw|<#d9R|aeYG`JQ!BoY4DM(D8cgM;M#*qWp z=C+rcotkdg3~rKUol))j3U_c?Zbh#ds?)JJgQLkAGv1KPcg3-EqgFnFsF8K9&DT3d zBV;Z~hVLh;P1E37uoUEeSfX9gjRx0*3`=SoXWzfmJA!*9py|pn9_Y_rG}dffLiZv) z1{H~c&(TGRo@l?5M3TkJjvZ`7&?nLWAo?`VA8y%srKoVTtxh^!am1SQv9A4wr zAUsBEYKt#h=7!$n$etG`vpR;MuDiUJ zdoL#775Ut(WvSa0-A0Xdd#SInF`G9x0s%AzcXzRHwH*<34I(r>yybhD?>?@VS$w03 z0WiIw^QI;yUGXOk&*+BkoM5o8P`tokXx`L#7VbiWMPi+{EYli+d)Vaf)(nf=W^x0I@C2wv-43D$ID z@{ZbQ@qYTcF++>_&u-|$v}&dGPNSit@AmfA8#8Zc>2>TO!9GX0x#F0LsyN$ij^Wi+ zTNqOxI`E%%`58Z$6{*hj*n;Rd&CkqU(UTDomxKgY9tQbGCLAQeHt zY`5(&V05HPFsBViceeXTx)+QGq?xoyADL6FKGmeaoU_Y|1kZdf6_LUAhJYo(Pujfl za3>T-L4hKJLj|eb9XaLVg%Nl+gXP}(b6a==)li--7h?Tg1~(TLlf7Ue!UGI`(^~|ujX01DZr5?| zid^q%K-xbT6e(X#rXN@94>CC4d&xrUNpNp(LZPa4UTp~PZQ{iU2IkR1Qs;EQk7*nW z5Odp0>~3Np9EQP|X3m)%L&IHf&fG#%<32jubxU%nP)zowF~p11xZLmd6VQqB2t3T- zj=n1L*w6X*C|<5)P$*P_D!v^3DqgB|B~#?`eg)hM`l){mb%DZoY*70r3l%TP zOJYO<`R{_5Et3MCW3bR)z%*Nlr>pJ^dmG`k#VEy&z)C6&1&ipXp#!L)Q=X#*);d(U zv{)oe^C;d3rC9kOXD3XOg1>(^$l$KXKAzi`i^*_dFe-u2s!8wmF38R%ygRyJlG1Q= zL*ri{?s!F(%;D%FiJ-)t8Rd&-Ta@yV9@4lsK-X}eHja#9IS(T(x)lnl2kHV13yL@v zC48`-gg!xvo_m9c6qoSC9J6PnUHATrw5M=_Wo}_ZL!`)C3X!|ZX-nM2Va~dz$LpCO zyoERi1y%2^aRJW|OXg*~XLj*kbOvIgk0ld3rlKZe(A(eLZ7@!(cf7fq;Ops7ig&2G z?T1BIZR%avmx~t}=!Dk|Sb!!@*R)j_9H)3iJ|9R$o77_P`xGWkx=OY|?LNg|slUuITyJl{)T)QyCHP-(jLAt0BWAMccA=!TW37mt47}&AuVUA! z!SOo((+oCyOLi@Fc)HSLA}$Q3<^6?9uqUI|KA)-#O4F2Z7v92dc94&ED0PL_EG{O- zv^M39$-eE%>MawCd;H4C=7tuZaBEa(B=&FN6wffIrBHnuU4}=>9oi1K{y@H<0>d59 z7e7&k3E`e&(Ah2Fx+?H~o;_)Er_)|g8fVO?@(;U%QtDJ=^>L!ElRBMvX4 zA9R~K3%|sqkWAiKVJ>-n#8tdUvEdHDuW#_%w^29@Z-8O^m4_^h;AjqiXYeTx`|+(9 zAA|95d;*^jz-0J5h0ixh&j<1Oko0^rKEDy(b@w0O=xg|tfqU`qu=|F=Tk-d(Hw)edZ^x$`lwcZ11ciH% zLI(eP6y8BlxZ+X}b8>JWyo$EGCQJe)%9d%kr#v-sJxT~-VYb5Rhf!hvoIrsoPCgGy>QF1;l;V#0Z zP_K^@dL``1o{8Z!zuZ`Ao2YOs3c#)-`R^2Ze8MACHPYKmn6If zoa9Tb_hkvU0ku%i^^k9*FUl`omGC-TCiyl9zxYdt%R>tc5=X_$Uqf6DbTB1c$nT#b96~r=YRYK09#OrLySOPr`*Us zq31NKv#iG37PT&Ex63BLtWl$vZM2`T zjzeJX-1|&mwdQ?v^|KXfpVetUM_|6mdj@p|79&7kl*rdcR$7;RmaDyrhq)cJm!RE& z<`m5f0=p5>_UKbqGzUhP8$AR-uy~ucFFmXzGaT+*Hu(=2N9^$)fkkEvbR}>~su-sJ6R<7cqk=c^jWpQ|uz|zEd#j;E*0dJF;XUB%cY*RaDU8!U0eXdc5 zn}*c4%(ljKds|A*k1*XkmpariOh;-nX{_g%5|teMh@uVkKza01p>t|+inz)7`f*JO zA$F{ml|uQn(l}~{5pNzSHKo;1Lo0*|E#P%kRZ4}U)@iAtG+QD3ua6ZP^?E@qM^V{3 zK2i&%Fkz3aR2qke%25;}Ej3aY^+xfud02R;hO!bdyAP|aigI*1y2KD+L^SYyqh72k zrzh1~t+4-pL=eg!uTqk52i{G=dmtev=efb19Rh1|fF+uah0K;qpJ3(IxWUwc-ey+I zEgu3aHM2vtlVLdx4{su$)B_B*`2v@SDF3_vmdXd*n#OwxxJRHiol&9@icga2H8Ncn zyX=whh+OYplL>_2i&V?$lLUN7$nkWCJqm1{F{#Ts8nuuo`?T|v_L#Jxv&@yYoaqjG zaAw?=H>9q~Y{{ieojRQ}$w4G`(Z^krrariHK~PL4*}L$AZ| zduUPYJkA-%&bRZb9c%%gbzwXv6y&Ha@%o^UfKLgmPrr10r8o|t;o@kdaEmKAKg`N$ zcdnR~%W0e>Qf}!@hKU(DjpM``x+>1RGL3^dK{K)nggrD_P9%5t0SWH#~$zH#{tus8hvoz zB5v#4wvh$hoek?iUM|Apb2f}7rc5th957A$+~N$rBt+PP&qMpL{}O~R0toK=@be&w;y{S-C43b?n4X7cLWE8Ddi(~qy*J?A z$#kS2g-9~wLi_TQ5FroW1Q23V^YOC~VJ8B@FG7S}_%^f;zX}lwPz)eUzt!Ia2r(#O Ofgc5Qg7POg>B?C2c9+b$d!L_JtGWLn@}H0Ed=}a@*J=XItAFt=Cn`zv6@h z65RPwh_O>BMUkN5;FbmF9055y^V&zlT4~SIFcta$S6qF*hq6K<5)#D zh*go4s-U2>Dpgid5$wui+RiqC z*RJ(g<;p%4XbrGbdy&qjDwS60+?yIb zPAPljx!wHe(~C6~UaqZ|NgGW(%OsjjS;7Sp zPsp!&^Z$kEy6E9X4_yodR)?c=QG3?#)V3?p{gKM)Rhf;+>`T@mFc|4brU%lf>iz7{ zu@hAYJRAMjPuk`oCuH9WG>2PZ2X_QE{yNop&Eed=6L9x*X(HNHRkJI9tU)~;Y=FPO ztJOpUSJ2|9f%cj2)ZXEYE?l-(>lJMBJ>Y&u?{IMaBbL6_HOp*UoCAJV*!Jq!#VT&r mXKT3i8==aZ6K*dc^cNEDUV^Z^kZ|u3gtdi)``mW}4}JiuZqNw; literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/utilities/LibsProfileLookup.class b/bin/main/java/me/libraryaddict/disguise/utilities/LibsProfileLookup.class new file mode 100644 index 0000000000000000000000000000000000000000..009ca94f013394043fa027184d93763b22fb09f4 GIT binary patch literal 716 zcma))O>fjN5QfKP*<{1QE(>kpX7#jiNG_b9DhC8y!iUtQh@;~SyVE+hWjj^-%PN5c zcYYMYNw-wha^PS)GkPMg`&y{cP{FhWGHI# z%a%MAZ6HN~&=)0D{-ZNrNnvTsNox}rFqroLE1{Rghw2z*V36)hMVi6^gIn__M+^q9 zOpOVQ7)-9!ubne4g*%K*KWT^Fs8g)DG>s)C0vXM%GnK-|Kj+zKu|i&>RKi7(74k$Z zk?%E_-@wkVu=Bszd%QO2xi*0}BFGgFu@auyNP44Ev?A}|^8cxM$wQ4bE_BFwhrL2g zXIu*1-BlsK>M0w2cEVb$---s;2L40FgW-aQbBkF9Dcl{yJ(w^U?ys%fo|o6=9R^2w z`Jyv-Qj*5^ZBwCJi0BuCS!twDN5WATual|Kms4Y~J1;kh`dZncX`RG3al{OEHU{1s zl)!GhVzU5)@jLQ9Vl841e#jt>KfX4At=P_O7{)k>(bIJ{`wr=sS#|;ApS@-p_f7+G Y-S0Eq^P0hf{`+CSZ^NT_4x(b`5B#Li$N&HU literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/utilities/LibsProfileLookupCaller.class b/bin/main/java/me/libraryaddict/disguise/utilities/LibsProfileLookupCaller.class new file mode 100644 index 0000000000000000000000000000000000000000..21ffc75534663baace01f7465cd9625d3d839fec GIT binary patch literal 2031 zcmc&#TTj$L6h5=8bSW!00Z~y#6kRmgzW5}@7XoOkmjuN4IBk!+18t|7&JuX{rx^c& zi6;8)k20QFZe6$HCQ5whbf$auJKy={T)zMK{1pHmzuztJMgFxoi%y24=ikxZp|%wVXoyv?Axsv>k?l)?BZ;F{J-*WeLwBVAuKxQU3VHJfE`wX1PnfO?E{xZ~fe8jP4gWNgH;tBQ zYsF^zxGz(D(MbZ-TY{38!IZB;5pN4E?fK|q)wE^KV8j0>rAh@i)#{xGONmw8T=vPI1(hnqm- zfyNet3S59;+Er=qK#kUs?l>Ew9f11<+_zKpPcZh4P8FD>b-4QrxuJdi&8gQ?GL{;WXqy%rqLMEI48jr<(~M%!PJv657Emw3{?k+)$}3O_&WP)FKl9DaDA+ zA>non9JxUq%z}?dQl%|bIvR|#qa$Hyz@%Gf%;||k|3%CFIE#d=aF$v{8MRMS?sXoq zB;Ho?P(+z7w)1Ro%Jz5j2p%wV^bf$bR$x*JZwSWtn6-ZuZr6CV4 z!At9K0oI**!%W=Gk}=l@?m#%brver~WLmiPw6kd^0=3>3E6TTAXQFg#;aS+tRpqr_ z|Ezdx!y5!P7RxhKX9PTywo^$+;BIe4Rwts;X~v71C+e8bKrbNEX#@SfdcwA(a=-n1 z-?PxR?FlmzCtnGi>-Bd~?D8Kn79)i@v0K!NVgE5IaV7UsyO*J0#~J8}H&U4nxJy0) z>rOu?J*xSi_J^XICw8fr_`OnWeYy)_|!lg&uD?dZ`_uTFpKG)C&;09dBr?W>Zco|;7 zH-T5-wGu);mLt4=7NIeyM7RNOmJm)kR3Us;iSX7E2wzqr+ysi=7m?YR#bdEIJC#VA z@OH_Y#R$8V2wQNggs?asqY8v3yaVr+5EgUzz5<~EJ>1&{^x-{xckzqB`|u&gXMpdI Hnw`G@w&geczOaIu>N>YtxMpe7SJrZ!gDipR_-~)dR`qFPm%Elg zR6jdT|l{B0^JtF8TZK=|&N+axagrzQ%(LxPQ4+Huak(++l5;7rJ zY87SF?svIU*kOTRQ?e;qq3&(x@#GBRAH^B0Gt>D2ajMl*fku^>20wb>X;=pn^&kI> z3h572TtWG;xDu z)PxP}=f+T^s7H8)-QFpz%01=_Z>V>y94(h-?-PTJE|7rRw(@9;+jVXX-XNti6^4e= z<4qy)I%p~#-w(0UUPPm(=XW2_)V1-~2uZCtH853w?|~k3<7yEX>l5MggyIsY5qk|GTFXb|Sn`sfv4_;<%TNnZl z*M7?Lp@qxiDcNRzhzp^KTO}}wFKWsU1Gy0!zu8jxxY9gaA+T_=pF=xGU>pq+M;DoI zGt-XjA(}@1B4j>_A4);*6fT#a6L7Xvs9hfIB7x$8O^r<(PFJPmx)${lZgOywz@1ZN zfI#lR_huIWLq{8pnTBzgz)=pzImqL)5Zmi99052V!P%K9zK64)ah8E|_?(Ep%;TQ` z#U2XI!z|7shG~2rGGy@GNDS!4=ioxjbP+BMF!i-uKCUJ6I#J8j??jWt@FtOA9<}tN oIa$NoM22f{eSo2#k0cH65*RXY1GA9<3JXy#k&D10EM*Jd00LwRrT_o{ literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/utilities/Metrics.class b/bin/main/java/me/libraryaddict/disguise/utilities/Metrics.class new file mode 100644 index 0000000000000000000000000000000000000000..c6ecf4d25c5229ad60d796c0705039801bbfbf61 GIT binary patch literal 6476 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 Q!Dp}mpTn2%HPoT;HxAW2+5i9m literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/utilities/ReflectionManager.class b/bin/main/java/me/libraryaddict/disguise/utilities/ReflectionManager.class new file mode 100644 index 0000000000000000000000000000000000000000..55eac426a54bf34d2e074f25461f215fd8954779 GIT binary patch literal 16399 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 CFX_Di literal 0 HcmV?d00001 diff --git a/bin/main/java/me/libraryaddict/disguise/utilities/UpdateChecker.class b/bin/main/java/me/libraryaddict/disguise/utilities/UpdateChecker.class new file mode 100644 index 0000000000000000000000000000000000000000..8cb614ba5ac8de191942ff707de905a41abf90d8 GIT binary patch literal 1188 zcmbu8&2G~`6ot>EAx_c&Z-2y4J(3|gSYv3-n_nm;RUJ)+PbaCOT*l`VdVx$bVU93t zFH>?HQ}V=fSC1#;g%reGnVyUXXFMWrH=+KLsQ#s>{%=vcUMMN|QmMU!>tNz(L!u9v z(XvD`M)ix?`hUZ8UASm9;GoU0)w}9IA-XjXDZQR1V^YW5=qRj`0gp#qiDG^6vZ^N{ zXLvUFkGnFCuLZ@my%N!c6vLinCd-uX>$tl|hx zlJmg0TD~P7&MbLs8Pp1LhjOX{dMQdHmy%lE8@e!QGudaT;09`@s+rnB-8@&ze`3W{ zfcq8hyH4XXZhkkb3f3<=i=7=)H)dVfz-IY<3%3>s#R)UQZ404kAu!xUdx227mat(Z m+{66^!d!)IhHVR>g6)4GJhBoV;Nijy*Q+?N5Eyn!KfPZ`p%U=` literal 0 HcmV?d00001 diff --git a/src/main/resources/config.yml b/bin/main/resources/config.yml similarity index 100% rename from src/main/resources/config.yml rename to bin/main/resources/config.yml diff --git a/src/main/resources/plugin.yml b/bin/main/resources/plugin.yml similarity index 100% rename from src/main/resources/plugin.yml rename to bin/main/resources/plugin.yml diff --git a/build.gradle b/build.gradle deleted file mode 100644 index dd33abce..00000000 --- a/build.gradle +++ /dev/null @@ -1,95 +0,0 @@ -plugins { - id 'java' - id 'maven-publish' -} - -println 'Compiling LibsDisguises via Gradle ver. ' + gradle.gradleVersion - -sourceCompatibility = '1.7' -ext.spigotVersion = '1.9-R0.1-SNAPSHOT' - -ext.disguisesVersion = '9.0.3' - -[compileJava, compileTestJava]*.options*.encoding = 'UTF-8' - -repositories { - mavenCentral() - - maven { - name 'Spigot' - url 'https://hub.spigotmc.org/nexus/content/groups/public/' - } - - maven { - url 'https://oss.sonatype.org/content/groups/public/' - } - - maven { - name 'dmulloy2-repo' - url 'http://repo.dmulloy2.net/content/groups/public/' - } - - flatDir { - dir 'libs' - } -} - -task sourceJar(type: Jar, dependsOn: classes) { - classifier = 'sources' - from sourceSets.main.allSource -} - -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir -} - -jar { - baseName "LibsDisguises" -} - -processResources { - expand projectVersion: disguisesVersion -} - -artifacts { - archives sourceJar - archives javadocJar - archives jar -} - -publishing { - publications { - mavenJava(MavenPublication) { - groupId 'LibsDisguises' - artifactId 'LibsDisguises' - version disguisesVersion + '-SNAPSHOT' - from components.java - artifact sourceJar { - classifier = 'sources' - } - artifact javadocJar { - classifier = 'javadoc' - } - } - } - repositories { - maven { - url "http://repo.md-5.net/content/repositories/releases/" - } - maven { - url "http://repo.md-5.net/content/repositories/snapshots/" - } - } -} - -file('libs').mkdirs() - -ant.get src: 'http://server.o2gaming.com/downloads/spigot-1.9.jar', dest: file('libs'), verbose: false, skipexisting: true - -dependencies { - compile "org.spigotmc:spigot-api:$project.ext.spigotVersion" - compile 'com.comphenix.protocol:ProtocolLib:3.7.0-SNAPSHOT' - compile group: "spigot", name: 'spigot-1.9', version: "1.9" - testCompile group: 'junit', name: 'junit', version: '4.10' -} diff --git a/config.yml b/config.yml new file mode 100644 index 00000000..282c1e11 --- /dev/null +++ b/config.yml @@ -0,0 +1,130 @@ +# Shall I notify people of a LibsDisguises update? +NotifyUpdate: true +# Whats the permission to get the notification? +Permission: 'libsdisguises.update' +# Whats the max size allowed for command disguiseradius +DisguiseRadiusMax: 50 +# Whats the max size allowed for command undisguiseradius +UndisguiseRadiusMax: 50 +# Shall the players view their disguises? +# Best used when viewing yourself in 3rd person +ViewSelfDisguises: true +# Shall I disguise the sounds? +# This turns your damage sound into a MOOOO +DisguiseSounds: true +# Shall the disguised hear their disguise sounds or their damage sounds. +# I disable this as it can be a little confusing when not used with self disguises +HearSelfDisguise: true +# Shall I send the velocity packets? I REALLY recommend you don't disable. +# This is the only thing allowing the mobs to fly without glitching out. +SendVelocity: true +# For self disguises, they need to have the armor and the held item removed +# Else they see floating armor, floating held items. +# This turns the items invisible in the disguised players inventory. It does not actually remove them! +RemoveArmor: true +RemoveHeldItem: false +# If you set a disguise to burning, it will no longer be able to be shown as sneaking or invisible. +# Set this to true if you want the disguise to get the animations of the disguised entity. Such as invisible, on fire, sprinting, sneaking, blocking +# This is only valid if you set a animation on the disguise itself. Because the entitys animations are applied otherwise. +AddEntityAnimations: true +# When a sheep or wolf is right clicked with dye. The client automatically assumes it was successful and displays the sheeps wool or the wolfs collar as dyed. +# This is a option that either prevents that happening, or it changes their color officially in the plugin so that everyone sees it changed. +# Its currently set to false which means that the color is not changed and will refresh itself to the player. +# Please note that this will not remove the dye from their hands. This also does not check if the disguised entity is actually a sheep/wolf and wants a say in its color. +DyeableSheep: false +DyeableWolf: false +# This is only called into action when the disguise is constructed using the commands. +# And when the disguise supports that. This will not be used at all for plugins constructing the disguises for instance. +# Such as prophunt. Its also false because its kind of a retarded feature. +# This is pretty simple. It shows the players displayname (Name as it appears in chat) above their head. +# This also overrides any custom name they have set in their disguise options. +ShowNamesAboveDisguises: false +# This supports the above option. +# If this is true, then the name shown above the head appears regardless of if you are looking at the disguise directly or not. +NameAboveHeadAlwaysVisible: true +# This modifys the bounding box, This is stuff like can a arrow hit them. +# If you turn this to true, arrows will act like they hit the disguise in the right place! +# So someone disguised as a enderdragon will easily get shot down by arrows! +# This WILL conflict with NoCheatPlus. Other plugins may also get problems. +# This shouldn't really be enabled for players as it also interferes with their movement because the server thinks the player is larger than he really is. +# That makes the player unable to approach this building because the server thinks he is trying to glitch inside blocks. +ModifyBoundingBox: false +# This prevents disguised players from being targeted by monsters. +# This doesn't prevent their targeting you if already targeting when disguised +# They will just ignore you unless provoked. +MonstersIgnoreDisguises: false +# Sigh. People are going to want this. +# So lets make your disguise blown if you are attacked.. +# Works only for disguised players when attacked by a entity (arrow, monster. etc) +# This will blow all disguises he has on him +BlowDisguises: false +BlownDisguiseMessage: '&cYour disguise was blown!' + +#Stop shulker disguises from moving, they're weird. This option only effects PLAYERS that are disguised, other entities disguised as shulkers will NOT be effected! +StopShulkerDisguisesFromMoving: true + +# A option to choose how many seconds a DisguiseEntity command is valid for people to right click a entity to disguise it before expiring +DisguiseEntityExpire: 10 + +# Another option to choose the same thing for DisguiseClone command +DisguiseCloneExpire: 10 +# Max disguises to store at a time with the DisguiseClone command +DisguiseCloneSize: 3 + +# This I don't really recommend turning on as it can make a memory leak.. +# These disguises, as normal will not persist after a server restart. +# There is also no EntityDeath option as entities do not revive after death. +KeepDisguises: + EntityDespawn: false + PlayerDeath: false + PlayerLogout: false + +# This controls if a entitys max health is determined by the entity, or by the disguise. +# Wither is 200, a player is 20. With this enabled, a player disguised as a wither will have the boss bar health accurate to the players health. +# Else it will be 1/20 of the boss bar when he is full health. +# Setting this in LivingWatcher overrides both values. +MaxHealthDeterminedByEntity: true + +# This here is a option to turn off misc disguises. +# This means you can not have a living entity disguise as a non-living entity. +# This disables the Attributes packet, Non-living entities can still disguise as other non-living +# This means that the above option will not work as it uses the attribute packet. +MiscDisguisesForLiving: true + +# Turn this to true to have players undisguised when switching worlds +UndisguiseOnWorldChange: false + +# Contact Mojang's servers? Disabling this option will disable player skin disguises! +ContactMojangServers: true + +# This will help performance, especially with CPU +# Due to safety reasons, self disguises can never have their packets disabled. +PacketsEnabled: + # This disables the animation packet. If a disguised entity sends a animation packet and they are using a non-living disguise. People will crash. + # Disabling this also means that if a player disguised as a non-player leaves a bug. People will crash + Animation: true + # Disabling this means that you can't use the setSleeping option on a player disguise. Also you will crash anyone watching when you try to sleep in a bed if disguised as a non-player + # This also sends a chunk packet at key positions else it doesn't work for 1.8. Lazyness means it does it for older versions too currently. + Bed: true + # This disguises the collect packet. If a living entity disguised as a non-living entity picks up a item. People will crash. This fixes it + # This also fixes people crashing if a item disguised as a sleeping player is picked up - Only true if Bed is enabled as well + Collect: true + # This disables a fix for when a disguised entity wearing armor dies, if the disguise can wear armor. It drops unpickupable items to anyone watching. + EntityStatus: true + # Entity equipment is the packets that are sent to ensure that a disguise has or doesn't have armor, and their held item. + # Disabling this means that any disguises which can wear armor or hold items will show the armor/held item that the disguised is wearing. + Equipment: true + # This doesn't actually disable the packet. It would introduce problems. Instead it does the next best thing and caches the data. + # This means that entity metadata will not change, and will only be sent in the spawn packet. + # This is good if performance is extremely in need. + # This is bad to disable unless you are ONLY going to use the disguises for decorations. + # To be honest. This is basically "Disable entity animations". That option is called 'AddEntityAnimations' in the config but unlike that, this is always in effect. + # Animations set by use of the api or through the disguise command are still in effect. + Metadata: true + # Movement packets are the biggest cpu hit. These are majorly used to ensure that the disguises facing direction isn't bugged up. + # If you are using the Item_Frame disguise, when a packet is sent (Roughly every 2min) the disguise will bug up until they move. + Movement: true + # Disable this if you don't mind crashing everytime you see someone riding something disguised as a non-living entity + Riding: true + # When disguised as a wither skull, it sends a look packet every tick so that the wither skull is facing the right way. + WitherSkull: true diff --git a/plugin.yml b/plugin.yml new file mode 100644 index 00000000..bb923226 --- /dev/null +++ b/plugin.yml @@ -0,0 +1,103 @@ +name: LibsDisguises +main: me.libraryaddict.disguise.LibsDisguises +description: A disguise plugin with various disguises. +version: ${project.version} +author: libraryaddict +authors: [Byteflux, Navid K.] +softdepend: [ProtocolLib] +commands: + libsdisguises: + permission: libsdisguises.seecmd.libsdisguises + description: Main command for libsdisguises. + disguise: + aliases: [d, dis] + permission: libsdisguises.seecmd.disguise + description: Disguise yourself as an entity. + disguiseentity: + aliases: [dentity, disentity] + permission: libsdisguises.seecmd.disguiseentity + description: Disguise an entity as another entity. + disguisehelp: + aliases: [dhelp, dishelp] + permission: libsdisguises.seecmd.disguisehelp + description: Help command for LibsDisguises. + disguiseplayer: + aliases: [dplayer, displayer] + permission: libsdisguises.seecmd.disguiseplayer + description: Disguise another player as an entity. + disguiseradius: + aliases: [disradius, dradius] + permission: libsdisguises.seecmd.disguiseradius + description: Disguise all entities within a radius as an entity. + undisguise: + aliases: [u, und, undis] + permission: libsdisguises.seecmd.undisguise + description: Undisguise yourself. + undisguiseentity: + aliases: [undisentity, undentity] + permission: libsdisguises.seecmd.undisguiseentity + description: Undisguise an entity. + undisguiseplayer: + aliases: [undisplayer, undplayer] + permission: libsdisguises.seecmd.undisguiseplayer + description: Undisguise a player. + undisguiseradius: + aliases: [undisradius, undradius] + permission: libsdisguises.seecmd.undisguiseradius + description: Undisguise all entities within a radius. + disguiseclone: + aliases: [disguisec, disc, disclone, dclone, clonedisguise, clonedis, cdisguise, cdis] + permission: libsdisguises.seecmd.disguiseclone + description: Copy a disguise (or entity) and use it later. + disguiseviewself: + aliases: [dviewself, dvs, disguisevs, disvs, vsd, viewselfdisguise, viewselfd] + permission: libsdisguises.seecmd.viewself + description: Toggle seeing your own disguise on or off. + +permissions: + libsdisguises.reload: + description: Allows the user to reload LibsDisguises. + default: op + libsdisguises.seethrough: + description: Allows player to see through disguises. + default: false + libsdisguises.seecmd: + description: See all commands in tab-completion + default: true + children: + libsdisguises.seecmd.libsdisguises: true + libsdisguises.seecmd.disguise: true + libsdisguises.seecmd.disguiseentity: true + libsdisguises.seecmd.disguisehelp: true + libsdisguises.seecmd.disguiseplayer: true + libsdisguises.seecmd.disguiseradius: true + libsdisguises.seecmd.undisguise: true + libsdisguises.seecmd.undisguiseentity: true + libsdisguises.seecmd.undisguiseplayer: true + libsdisguises.seecmd.undisguiseradius: true + libsdisguises.seecmd.disguiseclone: true + libsdisguises.seecmd.disguiseviewself: true + libsdisguises.seecmd.libsdisguises: + description: See the /libsdisguises command in tab-completion + libsdisguises.seecmd.disguiseviewself: + description: See the /disguiseviewself command in tab-completion + libsdisguises.seecmd.disguise: + description: See the /disguise command in tab-completion + libsdisguises.seecmd.disguiseentity: + description: See the /disguiseentity command in tab-completion + libsdisguises.seecmd.disguisehelp: + description: See the /disguisehelp command in tab-completion + libsdisguises.seecmd.disguiseplayer: + description: See the /disguiseplayer command in tab-completion + libsdisguises.seecmd.disguiseradius: + description: See the /disguiseradius command in tab-completion + libsdisguises.seecmd.undisguise: + description: See the /undisguise command in tab-completion + libsdisguises.seecmd.undisguiseentity: + description: See the /undisguiseentity command in tab-completion + libsdisguises.seecmd.undisguiseplayer: + description: See the /undisguiseplayer command in tab-completion + libsdisguises.seecmd.undisguiseradius: + description: See the /undisguiseradius command in tab-completion + libsdisguises.seecmd.disguiseclone: + description: See the /disguiseclone command in tab-completion diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..dea38eac --- /dev/null +++ b/pom.xml @@ -0,0 +1,74 @@ + + 4.0.0 + LibsDisguises + LibsDisguises + 0.0.1-SNAPSHOT + + + src + clean install + target + LibsDisguises + + + + . + true + ${project.basedir} + + plugin.yml + config.yml + README.md + + + + + + + + 1.8 + 1.8 + UTF-8 + + + + + dmulloy2-repo + http://repo.dmulloy2.net/content/groups/public/ + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + + + + com.comphenix.protocol + ProtocolLib + 4.0.0-SNAPSHOT + + + org.spigotmc + spigot-api + 1.9.2-R0.1-SNAPSHOT + + + org.spigotmc + spigot + 1.9.2-R0.1-SNAPSHOT + + + + + + md_5-releases + http://repo.md-5.net/content/repositories/releases/ + + + md_5-snapshots + http://repo.md-5.net/content/repositories/snapshots/ + + + \ No newline at end of file diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index f0b731cb..00000000 --- a/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'LibsDisguises' diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/DisguiseType.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/DisguiseType.java deleted file mode 100644 index 16659ad3..00000000 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/DisguiseType.java +++ /dev/null @@ -1,290 +0,0 @@ -package me.libraryaddict.disguise.disguisetypes; - -import org.apache.commons.lang.StringUtils; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Guardian; -import org.bukkit.entity.Horse; -import org.bukkit.entity.Skeleton; -import org.bukkit.entity.Zombie; - -import java.lang.reflect.Method; - -public enum DisguiseType { - - AREA_EFFECT_CLOUD(3, 0), - ARMOR_STAND(78), - ARROW(60, 0), - BAT, - BLAZE, - BOAT(1), - CAVE_SPIDER, - CHICKEN, - COW, - CREEPER, - DONKEY, - DRAGON_FIREBALL(93), - DROPPED_ITEM(2, 1), - EGG(62), - ELDER_GUARDIAN, - ENDER_CRYSTAL(51), - ENDER_DRAGON, - ENDER_PEARL(65), - ENDER_SIGNAL(72), - ENDERMAN, - ENDERMITE, - EXPERIENCE_ORB, - FALLING_BLOCK(70, 1), - FIREBALL(63), - FIREWORK(76), - FISHING_HOOK(90), - GHAST, - GIANT, - GUARDIAN, - HORSE, - IRON_GOLEM, - ITEM_FRAME(71), - LEASH_HITCH(77), - MAGMA_CUBE, - MINECART(10), - MINECART_CHEST(10, 1), - MINECART_COMMAND(10, 6), - MINECART_FURNACE(10, 2), - MINECART_HOPPER(10, 5), - MINECART_MOB_SPAWNER(10, 4), - MINECART_TNT(10, 3), - MULE, - MUSHROOM_COW, - OCELOT, - PAINTING, - PIG, - PIG_ZOMBIE, - PLAYER, - PRIMED_TNT(50), - RABBIT, - SHEEP, - SHULKER, - SHULKER_BULLET(67), - SILVERFISH, - SKELETON, - SKELETON_HORSE, - SLIME, - SMALL_FIREBALL(63), - SNOWBALL(61), - SNOWMAN, - SPECTRAL_ARROW(91), - SPIDER, - SPLASH_POTION(73, 0), - SQUID, - TIPPED_ARROW(92), - THROWN_EXP_BOTTLE(75), - UNDEAD_HORSE, - VILLAGER, - WITCH, - WITHER, - WITHER_SKELETON, - WITHER_SKULL(66), - WOLF, - ZOMBIE, - ZOMBIE_VILLAGER, - UNKNOWN; - - private static Method isVillager, getVariant, getSkeletonType, isElder; - - static { - // We set the entity type in this so that we can safely ignore disguisetypes which don't exist in older versions of MC. - // Without erroring up everything. - for (DisguiseType type : values()) { - try { - DisguiseType toUse = type; - String name; - switch (type) { - // Disguise item frame isn't supported. So we don't give it a entity type which should prevent it from being.. - // Usable. - case ITEM_FRAME: - break; - case DONKEY: - case MULE: - case UNDEAD_HORSE: - case SKELETON_HORSE: - toUse = DisguiseType.HORSE; - break; - case ZOMBIE_VILLAGER: - toUse = DisguiseType.ZOMBIE; - break; - case WITHER_SKELETON: - toUse = DisguiseType.SKELETON; - break; - case ELDER_GUARDIAN: - toUse = DisguiseType.GUARDIAN; - break; - default: - break; - } - name = toUse.name(); - type.setEntityType(EntityType.valueOf(name)); - } catch (Throwable ex) { - // This version of Spigot doesn't have the disguise. - } - } - try { - isVillager = Zombie.class.getMethod("isVillager"); - } catch (Throwable ignored) { - } - try { - getVariant = Horse.class.getMethod("getVariant"); - } catch (Throwable ignored) { - // Pre-1.6, but that isn't even supported - } - try { - getSkeletonType = Skeleton.class.getMethod("getSkeletonType"); - } catch (Throwable ignored) { - } - try { - isElder = Guardian.class.getMethod("isElder"); - } catch (Throwable ignored) { - } - } - - public static DisguiseType getType(Entity entity) { - DisguiseType disguiseType = getType(entity.getType()); - switch (disguiseType) { - case ZOMBIE: - try { - if ((Boolean) isVillager.invoke(entity)) { - disguiseType = DisguiseType.ZOMBIE_VILLAGER; - } - } catch (Exception ex) { - ex.printStackTrace(System.out); - } - break; - case HORSE: - try { - Object variant = getVariant.invoke(entity); - disguiseType = DisguiseType.valueOf(((Enum) variant).name()); - } catch (Exception ex) { - ex.printStackTrace(System.out); - } - break; - case SKELETON: - try { - Object type = getSkeletonType.invoke(entity); - if (type == Skeleton.SkeletonType.WITHER) { - disguiseType = DisguiseType.WITHER_SKELETON; - } - } catch (Exception ex) { - ex.printStackTrace(System.out); - } - break; - case GUARDIAN: - try { - if ((Boolean) isElder.invoke(entity)) { - disguiseType = DisguiseType.ELDER_GUARDIAN; - } - } catch (Exception ex) { - ex.printStackTrace(System.out); - } - break; - default: - break; - } - return disguiseType; - } - - public static DisguiseType getType(EntityType entityType) { - try { - return valueOf(entityType.name().toUpperCase()); - } catch (Throwable ex) { - return DisguiseType.UNKNOWN; - } - } - - private int objectId = -1, defaultData = 0; - private EntityType entityType; - private Class watcherClass; - - DisguiseType(int... ints) { - for (int i = 0; i < ints.length; i++) { - int value = ints[i]; - switch (i) { - case 0: - objectId = value; - break; - case 1: - defaultData = value; - break; - default: - break; - } - } - } - - public int getDefaultData() { - return defaultData; - } - - public Class getEntityClass() { - if (entityType != null) { - return getEntityType().getEntityClass(); - } - return Entity.class; - } - - public EntityType getEntityType() { - return entityType; - } - - /** - * The TYPE id of this entity. Different from the Object Id - * send in spawn packets when spawning miscs. - * @return - */ - public int getTypeId() { - return (int) getEntityType().getTypeId(); - } - - /** - * The object type send in packets when spawning a misc entity. - * Otherwise, -1. - * @return - */ - public int getObjectId() { - return objectId; - } - - public Class getWatcherClass() { - return watcherClass; - } - - public boolean isMisc() { - return getEntityType() != null && !getEntityType().isAlive(); - } - - public boolean isMob() { - return getEntityType() != null && getEntityType().isAlive() && !isPlayer(); - } - - public boolean isPlayer() { - return this == DisguiseType.PLAYER; - } - - public boolean isUnknown() { - return this == DisguiseType.UNKNOWN; - } - - private void setEntityType(EntityType entityType) { - this.entityType = entityType; - } - - public void setWatcherClass(Class c) { - watcherClass = c; - } - - public String toReadable() { - String[] split = name().split("_"); - for (int i = 0; i < split.length; i++) { - split[i] = split[i].substring(0, 1) + split[i].substring(1).toLowerCase(); - } - return StringUtils.join(split, " "); - } -} diff --git a/src/main/java/me/libraryaddict/disguise/DisguiseAPI.java b/src/me/libraryaddict/disguise/DisguiseAPI.java similarity index 69% rename from src/main/java/me/libraryaddict/disguise/DisguiseAPI.java rename to src/me/libraryaddict/disguise/DisguiseAPI.java index 34802a75..2d73871c 100644 --- a/src/main/java/me/libraryaddict/disguise/DisguiseAPI.java +++ b/src/me/libraryaddict/disguise/DisguiseAPI.java @@ -1,5 +1,24 @@ package me.libraryaddict.disguise; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.UUID; + +import org.bukkit.DyeColor; +import org.bukkit.Material; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Horse; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.inventory.EntityEquipment; +import org.bukkit.inventory.HorseInventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + import me.libraryaddict.disguise.disguisetypes.AnimalColor; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.DisguiseType; @@ -13,120 +32,158 @@ import me.libraryaddict.disguise.disguisetypes.watchers.HorseWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.ReflectionManager; -import org.bukkit.DyeColor; -import org.bukkit.Material; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Horse; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.inventory.EntityEquipment; -import org.bukkit.inventory.HorseInventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.UUID; - -public class DisguiseAPI { - - public static Disguise constructDisguise(Entity entity) { +public class DisguiseAPI +{ + public static Disguise constructDisguise(Entity entity) + { return constructDisguise(entity, true, true, true); } - public static Disguise constructDisguise(Entity entity, boolean doEquipment, boolean doSneak, boolean doSprint) { + public static Disguise constructDisguise(Entity entity, boolean doEquipment, boolean doSneak, boolean doSprint) + { DisguiseType disguiseType = DisguiseType.getType(entity); Disguise disguise; - if (disguiseType.isMisc()) { + + if (disguiseType.isMisc()) + { disguise = new MiscDisguise(disguiseType); - } else if (disguiseType.isMob()) { + } + else if (disguiseType.isMob()) + { disguise = new MobDisguise(disguiseType); - } else { + } + else + { disguise = new PlayerDisguise(entity.getName()); } + FlagWatcher watcher = disguise.getWatcher(); - if (entity instanceof LivingEntity) { - for (PotionEffect effect : ((LivingEntity) entity).getActivePotionEffects()) { + + if (entity instanceof LivingEntity) + { + for (PotionEffect effect : ((LivingEntity) entity).getActivePotionEffects()) + { ((LivingWatcher) watcher).addPotionEffect(effect.getType()); - if (effect.getType() == PotionEffectType.INVISIBILITY) { + + if (effect.getType() == PotionEffectType.INVISIBILITY) + { watcher.setInvisible(true); - } else if (effect.getType() == PotionEffectType.GLOWING) { + } + else if (effect.getType() == PotionEffectType.GLOWING) + { watcher.setGlowing(true); } } } - if (entity.getFireTicks() > 0) { + + if (entity.getFireTicks() > 0) + { watcher.setBurning(true); } - if (doEquipment && entity instanceof LivingEntity) { + + if (doEquipment && entity instanceof LivingEntity) + { EntityEquipment equip = ((LivingEntity) entity).getEquipment(); + watcher.setArmor(equip.getArmorContents()); watcher.setItemInMainHand(equip.getItemInMainHand()); - if (disguiseType.getEntityType() == EntityType.HORSE) { + + if (disguiseType.getEntityType() == EntityType.HORSE) + { Horse horse = (Horse) entity; HorseInventory horseInventory = horse.getInventory(); ItemStack saddle = horseInventory.getSaddle(); - if (saddle != null && saddle.getType() == Material.SADDLE) { + + if (saddle != null && saddle.getType() == Material.SADDLE) + { ((HorseWatcher) watcher).setSaddled(true); } + ((HorseWatcher) watcher).setHorseArmor(horseInventory.getArmor()); } } - for (Method method : entity.getClass().getMethods()) { + for (Method method : entity.getClass().getMethods()) + { if ((doSneak || !method.getName().equals("setSneaking")) && (doSprint || !method.getName().equals("setSprinting")) - && method.getParameterTypes().length == 0 && method.getReturnType() != void.class) { + && method.getParameterTypes().length == 0 && method.getReturnType() != void.class) + { Class methodReturn = method.getReturnType(); - if (methodReturn == float.class || methodReturn == Float.class || methodReturn == Double.class) { + + if (methodReturn == float.class || methodReturn == Float.class || methodReturn == Double.class) + { methodReturn = double.class; } + int firstCapitalMethod = firstCapital(method.getName()); - if (firstCapitalMethod > 0) { - for (Method watcherMethod : watcher.getClass().getMethods()) { + + if (firstCapitalMethod > 0) + { + for (Method watcherMethod : watcher.getClass().getMethods()) + { if (!watcherMethod.getName().startsWith("get") && watcherMethod.getReturnType() == void.class - && watcherMethod.getParameterTypes().length == 1) { + && watcherMethod.getParameterTypes().length == 1) + { int firstCapitalWatcher = firstCapital(watcherMethod.getName()); - if (firstCapitalWatcher > 0 - && method.getName().substring(firstCapitalMethod) - .equalsIgnoreCase(watcherMethod.getName().substring(firstCapitalWatcher))) { + + if (firstCapitalWatcher > 0 && method.getName().substring(firstCapitalMethod) + .equalsIgnoreCase(watcherMethod.getName().substring(firstCapitalWatcher))) + { Class methodParam = watcherMethod.getParameterTypes()[0]; - if (methodParam == float.class || methodParam == Float.class || methodParam == Double.class) { + + if (methodParam == float.class || methodParam == Float.class || methodParam == Double.class) + { methodParam = double.class; - } else if (methodParam == AnimalColor.class) { + } + else if (methodParam == AnimalColor.class) + { methodParam = DyeColor.class; } - if (methodReturn == methodParam) { - try { + if (methodReturn == methodParam) + { + try + { Object value = method.invoke(entity); - if (value != null) { + if (value != null) + { Class toCast = watcherMethod.getParameterTypes()[0]; - if (!(toCast.isInstance(value))) { - if (toCast == float.class) { - if (value instanceof Float) { + if (!(toCast.isInstance(value))) + { + if (toCast == float.class) + { + if (value instanceof Float) + { value = value; - } else { + } + else + { double d = (Double) value; value = (float) d; } - } else if (toCast == double.class) { - if (!(value instanceof Double)) { + } + else if (toCast == double.class) + { + if (!(value instanceof Double)) + { float d = (Float) value; value = (double) d; } - } else if (toCast == AnimalColor.class) { + } + else if (toCast == AnimalColor.class) + { value = AnimalColor.valueOf(((DyeColor) value).name()); } } if (value instanceof Boolean && !(Boolean) value - && watcherMethod.getDeclaringClass() == FlagWatcher.class) { + && watcherMethod.getDeclaringClass() == FlagWatcher.class) + { continue; } } watcherMethod.invoke(watcher, value); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } } @@ -139,54 +196,73 @@ public class DisguiseAPI { return disguise; } - public static void disguiseEntity(Entity entity, Disguise disguise) { + public static void disguiseEntity(Entity entity, Disguise disguise) + { // If they are trying to disguise a null entity or use a null disguise // Just return. - if (entity == null || disguise == null) { + if (entity == null || disguise == null) + { return; } // The event wasn't cancelled. // If the disguise entity isn't the same as the one we are disguising - if (disguise.getEntity() != entity) { + if (disguise.getEntity() != entity) + { // If the disguise entity actually exists - if (disguise.getEntity() != null) { + if (disguise.getEntity() != null) + { // Clone the disguise disguise = disguise.clone(); } // Set the disguise's entity disguise.setEntity(entity); } - if (Disguise.getViewSelf().contains(disguise.getEntity().getUniqueId())) { + + if (Disguise.getViewSelf().contains(disguise.getEntity().getUniqueId())) + { disguise.setViewSelfDisguise(true); } + disguise.startDisguise(); } - public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, Collection playersToNotSeeDisguise) { - if (disguise.getEntity() != null) { + public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, Collection playersToNotSeeDisguise) + { + if (disguise.getEntity() != null) + { disguise = disguise.clone(); } + ((TargetedDisguise) disguise).setDisguiseTarget(TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS); - for (Object obj : playersToNotSeeDisguise) { - if (obj instanceof String) { + + for (Object obj : playersToNotSeeDisguise) + { + if (obj instanceof String) + { ((TargetedDisguise) disguise).addPlayer((String) obj); - } else if (obj instanceof Player) { + } + else if (obj instanceof Player) + { ((TargetedDisguise) disguise).addPlayer(((Player) obj).getName()); } } + disguiseEntity(entity, disguise); } @Deprecated - public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, List playersToNotSeeDisguise) { + public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, List playersToNotSeeDisguise) + { disguiseIgnorePlayers(entity, disguise, (Collection) playersToNotSeeDisguise); } - public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, Player... playersToNotSeeDisguise) { + public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, Player... playersToNotSeeDisguise) + { disguiseIgnorePlayers(entity, disguise, (Collection) Arrays.asList(playersToNotSeeDisguise)); } - public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, String... playersToNotSeeDisguise) { + public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, String... playersToNotSeeDisguise) + { disguiseIgnorePlayers(entity, disguise, (Collection) Arrays.asList(playersToNotSeeDisguise)); } @@ -196,20 +272,29 @@ public class DisguiseAPI { * @param disguise * @return */ - public static int disguiseNextEntity(Disguise disguise) { - if (disguise == null) { + public static int disguiseNextEntity(Disguise disguise) + { + if (disguise == null) + { return -1; } - if (disguise.getEntity() != null || DisguiseUtilities.getDisguises().containsValue(disguise)) { + + if (disguise.getEntity() != null || DisguiseUtilities.getDisguises().containsValue(disguise)) + { disguise = disguise.clone(); } - try { + + try + { int id = ReflectionManager.getNmsField("Entity", "entityCount").getInt(null); DisguiseUtilities.addFutureDisguise(id, (TargetedDisguise) disguise); return id; - } catch (IllegalAccessException e) { + } + catch (IllegalAccessException e) + { e.printStackTrace(); } + return -1; } @@ -219,52 +304,73 @@ public class DisguiseAPI { * @param entity * @param disguise */ - public static void disguiseToAll(Entity entity, Disguise disguise) { - if (disguise.getEntity() != null) { + public static void disguiseToAll(Entity entity, Disguise disguise) + { + if (disguise.getEntity() != null) + { disguise = disguise.clone(); } + // You called the disguiseToAll method foolish mortal! Prepare to have your custom settings wiped!!! ((TargetedDisguise) disguise).setDisguiseTarget(TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS); - for (String observer : ((TargetedDisguise) disguise).getObservers()) { + + for (String observer : ((TargetedDisguise) disguise).getObservers()) + { ((TargetedDisguise) disguise).removePlayer(observer); } disguiseEntity(entity, disguise); } - public static void disguiseToPlayers(Entity entity, Disguise disguise, Collection playersToViewDisguise) { - if (disguise.getEntity() != null) { + public static void disguiseToPlayers(Entity entity, Disguise disguise, Collection playersToViewDisguise) + { + if (disguise.getEntity() != null) + { disguise = disguise.clone(); } + ((TargetedDisguise) disguise).setDisguiseTarget(TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS); - for (Object obj : playersToViewDisguise) { - if (obj instanceof String) { + + for (Object obj : playersToViewDisguise) + { + if (obj instanceof String) + { ((TargetedDisguise) disguise).addPlayer((String) obj); - } else if (obj instanceof Player) { + } + else if (obj instanceof Player) + { ((TargetedDisguise) disguise).addPlayer(((Player) obj).getName()); } } + disguiseEntity(entity, disguise); } @Deprecated - public static void disguiseToPlayers(Entity entity, Disguise disguise, List playersToViewDisguise) { + public static void disguiseToPlayers(Entity entity, Disguise disguise, List playersToViewDisguise) + { disguiseToPlayers(entity, disguise, (Collection) playersToViewDisguise); } - public static void disguiseToPlayers(Entity entity, Disguise disguise, Player... playersToViewDisguise) { + public static void disguiseToPlayers(Entity entity, Disguise disguise, Player... playersToViewDisguise) + { disguiseToPlayers(entity, disguise, (Collection) Arrays.asList(playersToViewDisguise)); } - public static void disguiseToPlayers(Entity entity, Disguise disguise, String... playersToViewDisguise) { + public static void disguiseToPlayers(Entity entity, Disguise disguise, String... playersToViewDisguise) + { disguiseToPlayers(entity, disguise, (Collection) Arrays.asList(playersToViewDisguise)); } - private static int firstCapital(String str) { - for (int i = 0; i < str.length(); i++) { - if (Character.isUpperCase(str.charAt(i))) { + private static int firstCapital(String str) + { + for (int i = 0; i < str.length(); i++) + { + if (Character.isUpperCase(str.charAt(i))) + { return i; } } + return -1; } @@ -274,10 +380,13 @@ public class DisguiseAPI { * @param disguised * @return */ - public static Disguise getDisguise(Entity disguised) { - if (disguised == null) { + public static Disguise getDisguise(Entity disguised) + { + if (disguised == null) + { return null; } + return DisguiseUtilities.getMainDisguise(disguised.getUniqueId()); } @@ -288,10 +397,13 @@ public class DisguiseAPI { * @param disguised * @return */ - public static Disguise getDisguise(Player observer, Entity disguised) { - if (disguised == null || observer == null) { + public static Disguise getDisguise(Player observer, Entity disguised) + { + if (disguised == null || observer == null) + { return null; } + return DisguiseUtilities.getDisguise(observer, disguised); } @@ -301,10 +413,13 @@ public class DisguiseAPI { * @param disguised * @return */ - public static Disguise[] getDisguises(Entity disguised) { - if (disguised == null) { + public static Disguise[] getDisguises(Entity disguised) + { + if (disguised == null) + { return null; } + return DisguiseUtilities.getDisguises(disguised.getUniqueId()); } @@ -315,11 +430,13 @@ public class DisguiseAPI { * @return */ @Deprecated - public static int getFakeDisguise(UUID entityId) { + public static int getFakeDisguise(UUID entityId) + { return -10; } - public static int getSelfDisguiseId() { + public static int getSelfDisguiseId() + { return -10; } @@ -329,7 +446,8 @@ public class DisguiseAPI { * @param disguised * @return */ - public static boolean isDisguised(Entity disguised) { + public static boolean isDisguised(Entity disguised) + { return getDisguise(disguised) != null; } @@ -340,15 +458,18 @@ public class DisguiseAPI { * @param disguised * @return */ - public static boolean isDisguised(Player observer, Entity disguised) { + public static boolean isDisguised(Player observer, Entity disguised) + { return getDisguise(observer, disguised) != null; } - public static boolean isDisguiseInUse(Disguise disguise) { + public static boolean isDisguiseInUse(Disguise disguise) + { return disguise.isDisguiseInUse(); } - public static boolean isSelfDisguised(Player player) { + public static boolean isSelfDisguised(Player player) + { return DisguiseUtilities.getSelfDisguised().contains(player.getUniqueId()); } @@ -358,18 +479,24 @@ public class DisguiseAPI { * @param entity * @return */ - public static boolean isViewSelfToggled(Entity entity) { - return isDisguised(entity) ? getDisguise(entity).isSelfDisguiseVisible() : Disguise.getViewSelf().contains(entity.getUniqueId()); + public static boolean isViewSelfToggled(Entity entity) + { + return isDisguised(entity) ? getDisguise(entity).isSelfDisguiseVisible() + : Disguise.getViewSelf().contains(entity.getUniqueId()); } /** - * Undisguise the entity. This doesn't let you cancel the UndisguiseEvent if the entity is no longer valid. Aka removed from the world. + * Undisguise the entity. This doesn't let you cancel the UndisguiseEvent if the entity is no longer valid. Aka removed from + * the world. * * @param entity */ - public static void undisguiseToAll(Entity entity) { + public static void undisguiseToAll(Entity entity) + { Disguise[] disguises = getDisguises(entity); - for (Disguise disguise : disguises) { + + for (Disguise disguise : disguises) + { disguise.removeDisguise(); } } @@ -380,20 +507,28 @@ public class DisguiseAPI { * @param entity * @param toggled */ - public static void setViewDisguiseToggled(Entity entity, boolean toggled) { - if (isDisguised(entity)) { + public static void setViewDisguiseToggled(Entity entity, boolean toggled) + { + if (isDisguised(entity)) + { Disguise disguise = getDisguise(entity); disguise.setViewSelfDisguise(toggled); } - if (toggled) { - if (!Disguise.getViewSelf().contains(entity.getUniqueId())) { + + if (toggled) + { + if (!Disguise.getViewSelf().contains(entity.getUniqueId())) + { Disguise.getViewSelf().add(entity.getUniqueId()); } - } else { + } + else + { Disguise.getViewSelf().remove(entity.getUniqueId()); } } - private DisguiseAPI() { + private DisguiseAPI() + { } } diff --git a/src/main/java/me/libraryaddict/disguise/DisguiseConfig.java b/src/me/libraryaddict/disguise/DisguiseConfig.java similarity index 75% rename from src/main/java/me/libraryaddict/disguise/DisguiseConfig.java rename to src/me/libraryaddict/disguise/DisguiseConfig.java index e34afe6c..47f733a3 100644 --- a/src/main/java/me/libraryaddict/disguise/DisguiseConfig.java +++ b/src/me/libraryaddict/disguise/DisguiseConfig.java @@ -1,10 +1,12 @@ package me.libraryaddict.disguise; -import me.libraryaddict.disguise.utilities.PacketsManager; import org.bukkit.ChatColor; import org.bukkit.configuration.ConfigurationSection; -public class DisguiseConfig { +import me.libraryaddict.disguise.utilities.PacketsManager; + +public class DisguiseConfig +{ private static boolean animationEnabled; private static boolean bedEnabled; @@ -43,34 +45,43 @@ public class DisguiseConfig { private static String updateNotificationPermission; private static boolean witherSkullEnabled; - public static String getDisguiseBlownMessage() { + public static String getDisguiseBlownMessage() + { return disguiseBlownMessage; } - public static int getDisguiseCloneExpire() { + public static int getDisguiseCloneExpire() + { return disguiseCloneExpire; } - public static int getDisguiseEntityExpire() { + public static int getDisguiseEntityExpire() + { return disguiseEntityExpire; } - public static int getMaxClonedDisguises() { + public static int getMaxClonedDisguises() + { return maxClonedDisguises; } - public static String getUpdateMessage() { + public static String getUpdateMessage() + { return updateMessage; } - public static String getUpdateNotificationPermission() { + public static String getUpdateNotificationPermission() + { return updateNotificationPermission; } - public static void initConfig(ConfigurationSection config) { + public static void initConfig(ConfigurationSection config) + { + setSoundsEnabled(config.getBoolean("DisguiseSounds")); setVelocitySent(config.getBoolean("SendVelocity")); - setViewDisguises(config.getBoolean("ViewSelfDisguises")); //Since we can now toggle, the view disguises listener must always be on + setViewDisguises(config.getBoolean("ViewSelfDisguises")); // Since we can now toggle, the view disguises listener must + // always be on PacketsManager.setViewDisguisesListener(true); setHearSelfDisguise(config.getBoolean("HearSelfDisguise")); setHideArmorFromSelf(config.getBoolean("RemoveArmor")); @@ -105,19 +116,23 @@ public class DisguiseConfig { setStopShulkerDisguisesFromMoving(config.getBoolean("StopShulkerDisguisesFromMoving", true)); } - public static boolean isAnimationPacketsEnabled() { + public static boolean isAnimationPacketsEnabled() + { return animationEnabled; } - public static boolean isBedPacketsEnabled() { + public static boolean isBedPacketsEnabled() + { return bedEnabled; } - public static boolean isCollectPacketsEnabled() { + public static boolean isCollectPacketsEnabled() + { return collectEnabled; } - public static boolean isDisguiseBlownOnAttack() { + public static boolean isDisguiseBlownOnAttack() + { return blowDisguisesOnAttack; } @@ -125,96 +140,117 @@ public class DisguiseConfig { * @deprecated Spelling mistake. */ @Deprecated - public static boolean isEnquipmentPacketsEnabled() { + public static boolean isEnquipmentPacketsEnabled() + { return equipmentEnabled; } - public static boolean isEntityAnimationsAdded() { + public static boolean isEntityAnimationsAdded() + { return entityAnimationsAdded; } - public static boolean isEntityStatusPacketsEnabled() { + public static boolean isEntityStatusPacketsEnabled() + { return entityStatusEnabled; } - public static boolean isEquipmentPacketsEnabled() { + public static boolean isEquipmentPacketsEnabled() + { return equipmentEnabled; } /** * Is the plugin modifying the inventory packets so that players when self disguised, do not see their armor floating around */ - public static boolean isHidingArmorFromSelf() { + public static boolean isHidingArmorFromSelf() + { return hidingArmor; } /** * Does the plugin appear to remove the item they are holding, to prevent a floating sword when they are viewing self disguise */ - public static boolean isHidingHeldItemFromSelf() { + public static boolean isHidingHeldItemFromSelf() + { return hidingHeldItem; } - public static boolean isKeepDisguiseOnEntityDespawn() { + public static boolean isKeepDisguiseOnEntityDespawn() + { return keepDisguiseEntityDespawn; } - public static boolean isKeepDisguiseOnPlayerDeath() { + public static boolean isKeepDisguiseOnPlayerDeath() + { return keepDisguisePlayerDeath; } - public static boolean isKeepDisguiseOnPlayerLogout() { + public static boolean isKeepDisguiseOnPlayerLogout() + { return keepDisguisePlayerLogout; } - public static boolean isMaxHealthDeterminedByDisguisedEntity() { + public static boolean isMaxHealthDeterminedByDisguisedEntity() + { return maxHealthIsDisguisedEntity; } - public static boolean isMetadataPacketsEnabled() { + public static boolean isMetadataPacketsEnabled() + { return sendsEntityMetadata; } - public static boolean isMiscDisguisesForLivingEnabled() { + public static boolean isMiscDisguisesForLivingEnabled() + { return miscDisguisesForLivingEnabled; } - public static boolean isModifyBoundingBox() { + public static boolean isModifyBoundingBox() + { return modifyBoundingBox; } - public static boolean isMonstersIgnoreDisguises() { + public static boolean isMonstersIgnoreDisguises() + { return targetDisguises; } - public static boolean isMovementPacketsEnabled() { + public static boolean isMovementPacketsEnabled() + { return movementEnabled; } - public static boolean isNameAboveHeadAlwaysVisible() { + public static boolean isNameAboveHeadAlwaysVisible() + { return showNameAboveHeadAlwaysVisible; } - public static boolean isNameOfPlayerShownAboveDisguise() { + public static boolean isNameOfPlayerShownAboveDisguise() + { return showNameAboveHead; } - public static boolean isSelfDisguisesSoundsReplaced() { + public static boolean isSelfDisguisesSoundsReplaced() + { return hearSelfDisguise; } - public static boolean isSheepDyeable() { + public static boolean isSheepDyeable() + { return colorizeSheep; } /** * Is the sound packets caught and modified */ - public static boolean isSoundEnabled() { + public static boolean isSoundEnabled() + { return PacketsManager.isHearDisguisesEnabled(); } - public static boolean isUndisguiseOnWorldChange() { + public static boolean isUndisguiseOnWorldChange() + { return undisguiseSwitchWorlds; } @@ -223,7 +259,8 @@ public class DisguiseConfig { * * @return */ - public static boolean isVelocitySent() { + public static boolean isVelocitySent() + { return sendVelocity; } @@ -232,74 +269,98 @@ public class DisguiseConfig { * * @return */ - public static boolean isViewDisguises() { + public static boolean isViewDisguises() + { return viewSelfDisguise; } - public static boolean isWitherSkullPacketsEnabled() { + public static boolean isWitherSkullPacketsEnabled() + { return witherSkullEnabled; } - public static boolean isWolfDyeable() { + public static boolean isWolfDyeable() + { return colorizeWolf; } - public static void setAddEntityAnimations(boolean isEntityAnimationsAdded) { + public static void setAddEntityAnimations(boolean isEntityAnimationsAdded) + { entityAnimationsAdded = isEntityAnimationsAdded; } - public static void setAnimationPacketsEnabled(boolean enabled) { - if (enabled != isAnimationPacketsEnabled()) { + public static void setAnimationPacketsEnabled(boolean enabled) + { + if (enabled != isAnimationPacketsEnabled()) + { animationEnabled = enabled; + PacketsManager.setupMainPacketsListener(); } } - public static void setBedPacketsEnabled(boolean enabled) { - if (enabled != isBedPacketsEnabled()) { + public static void setBedPacketsEnabled(boolean enabled) + { + if (enabled != isBedPacketsEnabled()) + { bedEnabled = enabled; + PacketsManager.setupMainPacketsListener(); } } - public static void setCollectPacketsEnabled(boolean enabled) { - if (enabled != isCollectPacketsEnabled()) { + public static void setCollectPacketsEnabled(boolean enabled) + { + if (enabled != isCollectPacketsEnabled()) + { collectEnabled = enabled; + PacketsManager.setupMainPacketsListener(); } } - public static void setDisguiseBlownMessage(String newMessage) { + public static void setDisguiseBlownMessage(String newMessage) + { disguiseBlownMessage = newMessage; } - public static void setDisguiseBlownOnAttack(boolean blowDisguise) { + public static void setDisguiseBlownOnAttack(boolean blowDisguise) + { blowDisguisesOnAttack = blowDisguise; } - public static void setDisguiseCloneExpire(int newExpires) { + public static void setDisguiseCloneExpire(int newExpires) + { disguiseCloneExpire = newExpires; } - public static void setDisguiseEntityExpire(int newExpires) { + public static void setDisguiseEntityExpire(int newExpires) + { disguiseEntityExpire = newExpires; } @Deprecated - public static void setEnquipmentPacketsEnabled(boolean enabled) { + public static void setEnquipmentPacketsEnabled(boolean enabled) + { setEquipmentPacketsEnabled(enabled); } - public static void setEntityStatusPacketsEnabled(boolean enabled) { - if (enabled != isEntityStatusPacketsEnabled()) { + public static void setEntityStatusPacketsEnabled(boolean enabled) + { + if (enabled != isEntityStatusPacketsEnabled()) + { entityStatusEnabled = enabled; + PacketsManager.setupMainPacketsListener(); } } - public static void setEquipmentPacketsEnabled(boolean enabled) { - if (enabled != isEquipmentPacketsEnabled()) { + public static void setEquipmentPacketsEnabled(boolean enabled) + { + if (enabled != isEquipmentPacketsEnabled()) + { equipmentEnabled = enabled; + PacketsManager.setupMainPacketsListener(); } } @@ -307,8 +368,10 @@ public class DisguiseConfig { /** * Can players hear their own disguises */ - public static void setHearSelfDisguise(boolean replaceSound) { - if (hearSelfDisguise != replaceSound) { + public static void setHearSelfDisguise(boolean replaceSound) + { + if (hearSelfDisguise != replaceSound) + { hearSelfDisguise = replaceSound; } } @@ -316,9 +379,12 @@ public class DisguiseConfig { /** * Set the plugin to hide self disguises armor from theirselves */ - public static void setHideArmorFromSelf(boolean hideArmor) { - if (hidingArmor != hideArmor) { + public static void setHideArmorFromSelf(boolean hideArmor) + { + if (hidingArmor != hideArmor) + { hidingArmor = hideArmor; + PacketsManager.setInventoryListenerEnabled(isHidingHeldItemFromSelf() || isHidingArmorFromSelf()); } } @@ -326,95 +392,121 @@ public class DisguiseConfig { /** * Does the plugin appear to remove the item they are holding, to prevent a floating sword when they are viewing self disguise */ - public static void setHideHeldItemFromSelf(boolean hideHelditem) { - if (hidingHeldItem != hideHelditem) { + public static void setHideHeldItemFromSelf(boolean hideHelditem) + { + if (hidingHeldItem != hideHelditem) + { hidingHeldItem = hideHelditem; + PacketsManager.setInventoryListenerEnabled(isHidingHeldItemFromSelf() || isHidingArmorFromSelf()); } } - public static void setKeepDisguiseOnEntityDespawn(boolean keepDisguise) { + public static void setKeepDisguiseOnEntityDespawn(boolean keepDisguise) + { keepDisguiseEntityDespawn = keepDisguise; } - public static void setKeepDisguiseOnPlayerDeath(boolean keepDisguise) { + public static void setKeepDisguiseOnPlayerDeath(boolean keepDisguise) + { keepDisguisePlayerDeath = keepDisguise; } - public static void setKeepDisguiseOnPlayerLogout(boolean keepDisguise) { + public static void setKeepDisguiseOnPlayerLogout(boolean keepDisguise) + { keepDisguisePlayerLogout = keepDisguise; } - public static void setMaxClonedDisguises(int newMax) { + public static void setMaxClonedDisguises(int newMax) + { maxClonedDisguises = newMax; } - public static void setMaxHealthDeterminedByDisguisedEntity(boolean isDetermined) { + public static void setMaxHealthDeterminedByDisguisedEntity(boolean isDetermined) + { maxHealthIsDisguisedEntity = isDetermined; } - public static void setMetadataPacketsEnabled(boolean enabled) { + public static void setMetadataPacketsEnabled(boolean enabled) + { sendsEntityMetadata = enabled; } - public static void setMiscDisguisesForLivingEnabled(boolean enabled) { - if (enabled != isMiscDisguisesForLivingEnabled()) { + public static void setMiscDisguisesForLivingEnabled(boolean enabled) + { + if (enabled != isMiscDisguisesForLivingEnabled()) + { miscDisguisesForLivingEnabled = enabled; + PacketsManager.setupMainPacketsListener(); } } - public static void setModifyBoundingBox(boolean modifyBounding) { + public static void setModifyBoundingBox(boolean modifyBounding) + { modifyBoundingBox = modifyBounding; } - public static void setMonstersIgnoreDisguises(boolean ignore) { + public static void setMonstersIgnoreDisguises(boolean ignore) + { targetDisguises = ignore; } - public static void setMovementPacketsEnabled(boolean enabled) { - if (enabled != isMovementPacketsEnabled()) { + public static void setMovementPacketsEnabled(boolean enabled) + { + if (enabled != isMovementPacketsEnabled()) + { movementEnabled = enabled; + PacketsManager.setupMainPacketsListener(); } } - public static void setNameAboveHeadAlwaysVisible(boolean alwaysVisible) { + public static void setNameAboveHeadAlwaysVisible(boolean alwaysVisible) + { showNameAboveHeadAlwaysVisible = alwaysVisible; } - public static void setNameOfPlayerShownAboveDisguise(boolean showNames) { + public static void setNameOfPlayerShownAboveDisguise(boolean showNames) + { showNameAboveHead = showNames; } - public static void setSheepDyeable(boolean color) { + public static void setSheepDyeable(boolean color) + { colorizeSheep = color; } /** * Set if the disguises play sounds when hurt */ - public static void setSoundsEnabled(boolean isSoundsEnabled) { + public static void setSoundsEnabled(boolean isSoundsEnabled) + { PacketsManager.setHearDisguisesListener(isSoundsEnabled); } - public static void setUndisguiseOnWorldChange(boolean isUndisguise) { + public static void setUndisguiseOnWorldChange(boolean isUndisguise) + { undisguiseSwitchWorlds = isUndisguise; } - public static void setUpdateMessage(String newMessage) { + public static void setUpdateMessage(String newMessage) + { updateMessage = newMessage; } - public static void setUpdateNotificationPermission(String newPermission) { + public static void setUpdateNotificationPermission(String newPermission) + { updateNotificationPermission = newPermission; } - public static void setStopShulkerDisguisesFromMoving(boolean stopShulkerDisguisesFromMoving) { + public static void setStopShulkerDisguisesFromMoving(boolean stopShulkerDisguisesFromMoving) + { DisguiseConfig.stopShulkerDisguisesFromMoving = stopShulkerDisguisesFromMoving; } - public static boolean isStopShulkerDisguisesFromMoving() { + public static boolean isStopShulkerDisguisesFromMoving() + { return stopShulkerDisguisesFromMoving; } @@ -423,22 +515,27 @@ public class DisguiseConfig { * * @param sendVelocityPackets */ - public static void setVelocitySent(boolean sendVelocityPackets) { + public static void setVelocitySent(boolean sendVelocityPackets) + { sendVelocity = sendVelocityPackets; } - public static void setViewDisguises(boolean seeOwnDisguise) { + public static void setViewDisguises(boolean seeOwnDisguise) + { viewSelfDisguise = seeOwnDisguise; } - public static void setWitherSkullPacketsEnabled(boolean enabled) { + public static void setWitherSkullPacketsEnabled(boolean enabled) + { witherSkullEnabled = enabled; } - public static void setWolfDyeable(boolean color) { + public static void setWolfDyeable(boolean color) + { colorizeWolf = color; } - private DisguiseConfig() { + private DisguiseConfig() + { } } diff --git a/src/main/java/me/libraryaddict/disguise/DisguiseListener.java b/src/me/libraryaddict/disguise/DisguiseListener.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/DisguiseListener.java rename to src/me/libraryaddict/disguise/DisguiseListener.java index f50b7b8a..75713120 100644 --- a/src/main/java/me/libraryaddict/disguise/DisguiseListener.java +++ b/src/me/libraryaddict/disguise/DisguiseListener.java @@ -1,15 +1,9 @@ package me.libraryaddict.disguise; -import com.comphenix.protocol.ProtocolLibrary; -import com.comphenix.protocol.events.PacketContainer; -import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; -import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; -import me.libraryaddict.disguise.disguisetypes.TargetedDisguise; -import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; -import me.libraryaddict.disguise.utilities.DisguiseUtilities; -import me.libraryaddict.disguise.utilities.ReflectionManager; -import me.libraryaddict.disguise.utilities.UpdateChecker; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.HashSet; + import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -33,9 +27,17 @@ import org.bukkit.event.vehicle.VehicleExitEvent; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; -import java.lang.reflect.InvocationTargetException; -import java.util.HashMap; -import java.util.HashSet; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.PacketContainer; + +import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.DisguiseType; +import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; +import me.libraryaddict.disguise.disguisetypes.TargetedDisguise; +import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; +import me.libraryaddict.disguise.utilities.DisguiseUtilities; +import me.libraryaddict.disguise.utilities.ReflectionManager; +import me.libraryaddict.disguise.utilities.UpdateChecker; public class DisguiseListener implements Listener { diff --git a/src/main/java/me/libraryaddict/disguise/LibsDisguises.java b/src/me/libraryaddict/disguise/LibsDisguises.java similarity index 61% rename from src/main/java/me/libraryaddict/disguise/LibsDisguises.java rename to src/me/libraryaddict/disguise/LibsDisguises.java index 8158e9b4..32dd54dc 100644 --- a/src/main/java/me/libraryaddict/disguise/LibsDisguises.java +++ b/src/me/libraryaddict/disguise/LibsDisguises.java @@ -1,8 +1,22 @@ package me.libraryaddict.disguise; +import java.io.IOException; +import java.lang.reflect.Field; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Ageable; +import org.bukkit.entity.Damageable; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Tameable; +import org.bukkit.entity.Zombie; +import org.bukkit.event.HandlerList; +import org.bukkit.plugin.java.JavaPlugin; + import com.comphenix.protocol.reflect.FieldAccessException; import com.comphenix.protocol.wrappers.WrappedDataWatcher; import com.comphenix.protocol.wrappers.WrappedWatchableObject; + import me.libraryaddict.disguise.commands.CloneDisguiseCommand; import me.libraryaddict.disguise.commands.DisguiseCommand; import me.libraryaddict.disguise.commands.DisguiseViewSelf; @@ -33,37 +47,30 @@ import me.libraryaddict.disguise.utilities.FakeBoundingBox; import me.libraryaddict.disguise.utilities.Metrics; import me.libraryaddict.disguise.utilities.PacketsManager; import me.libraryaddict.disguise.utilities.ReflectionManager; -import org.bukkit.Bukkit; -import org.bukkit.entity.Ageable; -import org.bukkit.entity.Damageable; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Tameable; -import org.bukkit.entity.Zombie; -import org.bukkit.event.HandlerList; -import org.bukkit.plugin.java.JavaPlugin; - -import java.io.IOException; -import java.lang.reflect.Field; - - -public class LibsDisguises extends JavaPlugin { +public class LibsDisguises extends JavaPlugin +{ private static LibsDisguises instance; private DisguiseListener listener; @Override - public void onEnable() { + public void onEnable() + { getLogger().info("Discovered MC version: " + ReflectionManager.getBukkitVersion()); + saveDefaultConfig(); PacketsManager.init(this); DisguiseUtilities.init(this); + DisguiseConfig.initConfig(getConfig()); PacketsManager.addPacketListeners(); + listener = new DisguiseListener(this); + Bukkit.getPluginManager().registerEvents(listener, this); + getCommand("disguise").setExecutor(new DisguiseCommand()); getCommand("undisguise").setExecutor(new UndisguiseCommand()); getCommand("disguiseplayer").setExecutor(new PlayerDisguiseCommand()); @@ -76,228 +83,304 @@ public class LibsDisguises extends JavaPlugin { getCommand("disguiseclone").setExecutor(new CloneDisguiseCommand()); getCommand("libsdisguises").setExecutor(new LibsDisguisesCommand()); getCommand("disguiseviewself").setExecutor(new DisguiseViewSelf()); + registerValues(); + instance = this; - try { + + try + { Metrics metrics = new Metrics(this); metrics.start(); - } catch (IOException e) { + } + catch (IOException e) + { } } /** * Reloads the config with new config options. */ - public void reload() { + public void reload() + { HandlerList.unregisterAll(listener); + reloadConfig(); DisguiseConfig.initConfig(getConfig()); } /** - * Here we create a nms entity for each disguise. Then grab their default values in their datawatcher. Then their sound volume for mob noises. As well as setting their watcher class and entity size. + * Here we create a nms entity for each disguise. Then grab their default values in their datawatcher. Then their sound volume + * for mob noises. As well as setting their watcher class and entity size. */ - private void registerValues() { - for (DisguiseType disguiseType : DisguiseType.values()) { - if (disguiseType.getEntityType() == null) { + private void registerValues() + { + for (DisguiseType disguiseType : DisguiseType.values()) + { + if (disguiseType.getEntityType() == null) + { continue; } + Class watcherClass = null; - try { - switch (disguiseType) { - case ITEM_FRAME: //Not really supported... - break; - case MINECART_CHEST: - case MINECART_COMMAND: - case MINECART_FURNACE: - case MINECART_HOPPER: - case MINECART_MOB_SPAWNER: - case MINECART_TNT: - watcherClass = MinecartWatcher.class; - break; - case DONKEY: - case MULE: - case UNDEAD_HORSE: - case SKELETON_HORSE: - watcherClass = HorseWatcher.class; - break; - case ZOMBIE_VILLAGER: - case PIG_ZOMBIE: - watcherClass = ZombieWatcher.class; - break; - case MAGMA_CUBE: - watcherClass = SlimeWatcher.class; - break; - case ELDER_GUARDIAN: - watcherClass = GuardianWatcher.class; - break; - case ENDERMITE: - watcherClass = LivingWatcher.class; - break; - case WITHER_SKELETON: - watcherClass = SkeletonWatcher.class; - break; - default: - watcherClass = Class.forName("me.libraryaddict.disguise.disguisetypes.watchers." - + toReadable(disguiseType.name()) + "Watcher"); - break; - } - } catch (ClassNotFoundException ex) { - // There is no explicit watcher for this entity. - Class entityClass = disguiseType.getEntityType().getEntityClass(); - if (entityClass != null) { - if (Tameable.class.isAssignableFrom(entityClass)) { - watcherClass = TameableWatcher.class; - } else if (Ageable.class.isAssignableFrom(entityClass)) { - watcherClass = AgeableWatcher.class; - } else if (LivingEntity.class.isAssignableFrom(entityClass)) { - watcherClass = LivingWatcher.class; - } else { - watcherClass = FlagWatcher.class; - } - } else { - watcherClass = FlagWatcher.class; //Disguise is unknown type - } - } - disguiseType.setWatcherClass(watcherClass); - if (DisguiseValues.getDisguiseValues(disguiseType) != null) { - continue; - } - String nmsEntityName = toReadable(disguiseType.name()); - switch (disguiseType) { - case WITHER_SKELETON: - case ZOMBIE_VILLAGER: + + try + { + switch (disguiseType) + { + case ITEM_FRAME: // Not really supported... + break; + case MINECART_CHEST: + case MINECART_COMMAND: + case MINECART_FURNACE: + case MINECART_HOPPER: + case MINECART_MOB_SPAWNER: + case MINECART_TNT: + watcherClass = MinecartWatcher.class; + break; case DONKEY: case MULE: case UNDEAD_HORSE: case SKELETON_HORSE: - continue; - case PRIMED_TNT: - nmsEntityName = "TNTPrimed"; + watcherClass = HorseWatcher.class; break; - case MINECART_TNT: - nmsEntityName = "MinecartTNT"; + case ZOMBIE_VILLAGER: + case PIG_ZOMBIE: + watcherClass = ZombieWatcher.class; break; - case MINECART: - nmsEntityName = "MinecartRideable"; - break; - case FIREWORK: - nmsEntityName = "Fireworks"; - break; - case SPLASH_POTION: - nmsEntityName = "Potion"; - break; - case GIANT: - nmsEntityName = "GiantZombie"; - break; - case DROPPED_ITEM: - nmsEntityName = "Item"; - break; - case FIREBALL: - nmsEntityName = "LargeFireball"; - break; - case LEASH_HITCH: - nmsEntityName = "Leash"; + case MAGMA_CUBE: + watcherClass = SlimeWatcher.class; break; case ELDER_GUARDIAN: - nmsEntityName = "Guardian"; + watcherClass = GuardianWatcher.class; + break; + case ENDERMITE: + watcherClass = LivingWatcher.class; + break; + case WITHER_SKELETON: + watcherClass = SkeletonWatcher.class; break; - case ARROW: - nmsEntityName = "TippedArrow"; default: + watcherClass = Class.forName( + "me.libraryaddict.disguise.disguisetypes.watchers." + toReadable(disguiseType.name()) + "Watcher"); break; + } } - try { - if (nmsEntityName.equalsIgnoreCase("Unknown")) { + catch (ClassNotFoundException ex) + { + // There is no explicit watcher for this entity. + Class entityClass = disguiseType.getEntityType().getEntityClass(); + + if (entityClass != null) + { + if (Tameable.class.isAssignableFrom(entityClass)) + { + watcherClass = TameableWatcher.class; + } + else if (Ageable.class.isAssignableFrom(entityClass)) + { + watcherClass = AgeableWatcher.class; + } + else if (LivingEntity.class.isAssignableFrom(entityClass)) + { + watcherClass = LivingWatcher.class; + } + else + { + watcherClass = FlagWatcher.class; + } + } + else + { + watcherClass = FlagWatcher.class; // Disguise is unknown type + } + } + + disguiseType.setWatcherClass(watcherClass); + + if (DisguiseValues.getDisguiseValues(disguiseType) != null) + { + continue; + } + + String nmsEntityName = toReadable(disguiseType.name()); + + switch (disguiseType) + { + case WITHER_SKELETON: + case ZOMBIE_VILLAGER: + case DONKEY: + case MULE: + case UNDEAD_HORSE: + case SKELETON_HORSE: + continue; + case PRIMED_TNT: + nmsEntityName = "TNTPrimed"; + break; + case MINECART_TNT: + nmsEntityName = "MinecartTNT"; + break; + case MINECART: + nmsEntityName = "MinecartRideable"; + break; + case FIREWORK: + nmsEntityName = "Fireworks"; + break; + case SPLASH_POTION: + nmsEntityName = "Potion"; + break; + case GIANT: + nmsEntityName = "GiantZombie"; + break; + case DROPPED_ITEM: + nmsEntityName = "Item"; + break; + case FIREBALL: + nmsEntityName = "LargeFireball"; + break; + case LEASH_HITCH: + nmsEntityName = "Leash"; + break; + case ELDER_GUARDIAN: + nmsEntityName = "Guardian"; + break; + case ARROW: + nmsEntityName = "TippedArrow"; + default: + break; + } + + try + { + if (nmsEntityName.equalsIgnoreCase("Unknown")) + { DisguiseValues disguiseValues = new DisguiseValues(disguiseType, null, 0, 0); + disguiseValues.setAdultBox(new FakeBoundingBox(0, 0, 0)); + DisguiseSound sound = DisguiseSound.getType(disguiseType.name()); - if (sound != null) { + + if (sound != null) + { sound.setDamageAndIdleSoundVolume(1f); } + continue; } + Object nmsEntity = ReflectionManager.createEntityInstance(nmsEntityName); - if (nmsEntity == null) { + + if (nmsEntity == null) + { getLogger().warning("Entity not found! (" + nmsEntityName + ")"); + continue; } + Entity bukkitEntity = ReflectionManager.getBukkitEntity(nmsEntity); int entitySize = 0; - for (Field field : ReflectionManager.getNmsClass("Entity").getFields()) { - if (field.getType().getName().equals("EnumEntitySize")) { + + for (Field field : ReflectionManager.getNmsClass("Entity").getFields()) + { + if (field.getType().getName().equals("EnumEntitySize")) + { Enum enumEntitySize = (Enum) field.get(nmsEntity); + entitySize = enumEntitySize.ordinal(); + break; } } + DisguiseValues disguiseValues = new DisguiseValues(disguiseType, nmsEntity.getClass(), entitySize, bukkitEntity instanceof Damageable ? ((Damageable) bukkitEntity).getMaxHealth() : 0); + WrappedDataWatcher watcher = WrappedDataWatcher.getEntityWatcher(bukkitEntity); - for (WrappedWatchableObject watch : watcher.getWatchableObjects()) { + + for (WrappedWatchableObject watch : watcher.getWatchableObjects()) + { disguiseValues.setMetaValue(watch.getIndex(), watch.getValue()); // Uncomment when I need to find the new datawatcher values for a class.. -// int id = watch.getIndex(); -// Object val = watch.getValue(); -// Class valClazz = val != null ? watch.getValue().getClass() : null; -// try { -// val = val.toString(); -// } catch (Exception e) { -// val = val != null ? val.getClass() : "null"; -// } -// System.out.println("Disguise: " + disguiseType + ", ID: " + id + ", Class: " + (val == null ? "null" : valClazz) + ", Value: " + val); + // int id = watch.getIndex(); + // Object val = watch.getValue(); + // Class valClazz = val != null ? watch.getValue().getClass() : null; + // try { + // val = val.toString(); + // } catch (Exception e) { + // val = val != null ? val.getClass() : "null"; + // } + // System.out.println("Disguise: " + disguiseType + ", ID: " + id + ", Class: " + (val == null ? "null" : + // valClazz) + ", Value: " + val); } + DisguiseSound sound = DisguiseSound.getType(disguiseType.name()); - if (sound != null) { + + if (sound != null) + { Float soundStrength = ReflectionManager.getSoundModifier(nmsEntity); - if (soundStrength != null) { + + if (soundStrength != null) + { sound.setDamageAndIdleSoundVolume(soundStrength); } } // Get the bounding box disguiseValues.setAdultBox(ReflectionManager.getBoundingBox(bukkitEntity)); - if (bukkitEntity instanceof Ageable) { + + if (bukkitEntity instanceof Ageable) + { ((Ageable) bukkitEntity).setBaby(); - disguiseValues.setBabyBox(ReflectionManager.getBoundingBox(bukkitEntity)); - } else if (bukkitEntity instanceof Zombie) { - ((Zombie) bukkitEntity).setBaby(true); + disguiseValues.setBabyBox(ReflectionManager.getBoundingBox(bukkitEntity)); } + else if (bukkitEntity instanceof Zombie) + { + ((Zombie) bukkitEntity).setBaby(true); + + disguiseValues.setBabyBox(ReflectionManager.getBoundingBox(bukkitEntity)); + } + disguiseValues.setEntitySize(ReflectionManager.getSize(bukkitEntity)); - } catch (SecurityException | IllegalArgumentException | IllegalAccessException | FieldAccessException ex) { - System.out.print("[LibsDisguises] Uh oh! Trouble while making values for the disguise " + disguiseType.name() - + "!"); + } + catch (SecurityException | IllegalArgumentException | IllegalAccessException | FieldAccessException ex) + { + System.out.print( + "[LibsDisguises] Uh oh! Trouble while making values for the disguise " + disguiseType.name() + "!"); System.out.print("[LibsDisguises] Before reporting this error, " + "please make sure you are using the latest version of LibsDisguises and ProtocolLib."); - System.out - .print("[LibsDisguises] Development builds are available at (ProtocolLib) " - + "http://ci.dmulloy2.net/job/ProtocolLib/ and (LibsDisguises) http://server.o2gaming.com:8080/job/LibsDisguises%201.9+/"); + System.out.print("[LibsDisguises] Development builds are available at (ProtocolLib) " + + "http://ci.dmulloy2.net/job/ProtocolLib/ and (LibsDisguises) http://server.o2gaming.com:8080/job/LibsDisguises%201.9+/"); ex.printStackTrace(System.out); } } } - private String toReadable(String string) { + private String toReadable(String string) + { StringBuilder builder = new StringBuilder(); - for (String s : string.split("_")) { + + for (String s : string.split("_")) + { builder.append(s.substring(0, 1)).append(s.substring(1).toLowerCase()); } + return builder.toString(); } - public DisguiseListener getListener() { + public DisguiseListener getListener() + { return listener; } /** - * External APIs shouldn't actually need this instance. - * DisguiseAPI should be enough to handle most cases. + * External APIs shouldn't actually need this instance. DisguiseAPI should be enough to handle most cases. * * @return The instance of this plugin */ - public static LibsDisguises getInstance() { + public static LibsDisguises getInstance() + { return instance; } } diff --git a/src/main/java/me/libraryaddict/disguise/commands/BaseDisguiseCommand.java b/src/me/libraryaddict/disguise/commands/BaseDisguiseCommand.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/commands/BaseDisguiseCommand.java rename to src/me/libraryaddict/disguise/commands/BaseDisguiseCommand.java index ff883be6..9e9c500a 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/BaseDisguiseCommand.java +++ b/src/me/libraryaddict/disguise/commands/BaseDisguiseCommand.java @@ -1,14 +1,13 @@ package me.libraryaddict.disguise.commands; -import me.libraryaddict.disguise.disguisetypes.AnimalColor; -import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; -import me.libraryaddict.disguise.disguisetypes.FlagWatcher; -import me.libraryaddict.disguise.disguisetypes.MiscDisguise; -import me.libraryaddict.disguise.disguisetypes.MobDisguise; -import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; -import me.libraryaddict.disguise.disguisetypes.RabbitType; -import me.libraryaddict.disguise.utilities.DisguiseUtilities; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map.Entry; + import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.block.BlockFace; @@ -21,13 +20,15 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.potion.PotionEffectType; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map.Entry; +import me.libraryaddict.disguise.disguisetypes.AnimalColor; +import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.DisguiseType; +import me.libraryaddict.disguise.disguisetypes.FlagWatcher; +import me.libraryaddict.disguise.disguisetypes.MiscDisguise; +import me.libraryaddict.disguise.disguisetypes.MobDisguise; +import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; +import me.libraryaddict.disguise.disguisetypes.RabbitType; +import me.libraryaddict.disguise.utilities.DisguiseUtilities; /** diff --git a/src/main/java/me/libraryaddict/disguise/commands/CloneDisguiseCommand.java b/src/me/libraryaddict/disguise/commands/CloneDisguiseCommand.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/commands/CloneDisguiseCommand.java rename to src/me/libraryaddict/disguise/commands/CloneDisguiseCommand.java index fd77c87e..8d570966 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/CloneDisguiseCommand.java +++ b/src/me/libraryaddict/disguise/commands/CloneDisguiseCommand.java @@ -1,15 +1,16 @@ package me.libraryaddict.disguise.commands; -import me.libraryaddict.disguise.DisguiseConfig; -import me.libraryaddict.disguise.LibsDisguises; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; +import java.util.ArrayList; +import java.util.HashMap; + import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import java.util.ArrayList; -import java.util.HashMap; +import me.libraryaddict.disguise.DisguiseConfig; +import me.libraryaddict.disguise.LibsDisguises; +import me.libraryaddict.disguise.disguisetypes.DisguiseType; public class CloneDisguiseCommand extends BaseDisguiseCommand { diff --git a/src/main/java/me/libraryaddict/disguise/commands/DisguiseCommand.java b/src/me/libraryaddict/disguise/commands/DisguiseCommand.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/commands/DisguiseCommand.java rename to src/me/libraryaddict/disguise/commands/DisguiseCommand.java index 5b94874b..1cdba6a9 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/DisguiseCommand.java +++ b/src/me/libraryaddict/disguise/commands/DisguiseCommand.java @@ -1,18 +1,19 @@ package me.libraryaddict.disguise.commands; -import me.libraryaddict.disguise.DisguiseAPI; -import me.libraryaddict.disguise.DisguiseConfig; -import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; -import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; +import java.util.ArrayList; +import java.util.HashMap; + import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.HashMap; +import me.libraryaddict.disguise.DisguiseAPI; +import me.libraryaddict.disguise.DisguiseConfig; +import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.DisguiseType; +import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; public class DisguiseCommand extends BaseDisguiseCommand { diff --git a/src/main/java/me/libraryaddict/disguise/commands/DisguiseViewSelf.java b/src/me/libraryaddict/disguise/commands/DisguiseViewSelf.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/commands/DisguiseViewSelf.java rename to src/me/libraryaddict/disguise/commands/DisguiseViewSelf.java index b735645c..a1098f22 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/DisguiseViewSelf.java +++ b/src/me/libraryaddict/disguise/commands/DisguiseViewSelf.java @@ -1,12 +1,13 @@ package me.libraryaddict.disguise.commands; -import me.libraryaddict.disguise.DisguiseAPI; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import me.libraryaddict.disguise.DisguiseAPI; + /** * * @author Navid diff --git a/src/main/java/me/libraryaddict/disguise/commands/EntityDisguiseCommand.java b/src/me/libraryaddict/disguise/commands/EntityDisguiseCommand.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/commands/EntityDisguiseCommand.java rename to src/me/libraryaddict/disguise/commands/EntityDisguiseCommand.java index 7a7d64a6..6ce182dc 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/EntityDisguiseCommand.java +++ b/src/me/libraryaddict/disguise/commands/EntityDisguiseCommand.java @@ -1,17 +1,18 @@ package me.libraryaddict.disguise.commands; -import me.libraryaddict.disguise.DisguiseConfig; -import me.libraryaddict.disguise.LibsDisguises; -import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.HashMap; + import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.HashMap; +import me.libraryaddict.disguise.DisguiseConfig; +import me.libraryaddict.disguise.LibsDisguises; +import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.DisguiseType; public class EntityDisguiseCommand extends BaseDisguiseCommand { diff --git a/src/main/java/me/libraryaddict/disguise/commands/HelpDisguiseCommand.java b/src/me/libraryaddict/disguise/commands/HelpDisguiseCommand.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/commands/HelpDisguiseCommand.java rename to src/me/libraryaddict/disguise/commands/HelpDisguiseCommand.java index 2656a21f..c6b78d7f 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/HelpDisguiseCommand.java +++ b/src/me/libraryaddict/disguise/commands/HelpDisguiseCommand.java @@ -1,10 +1,11 @@ package me.libraryaddict.disguise.commands; -import me.libraryaddict.disguise.disguisetypes.AnimalColor; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; -import me.libraryaddict.disguise.disguisetypes.FlagWatcher; -import me.libraryaddict.disguise.disguisetypes.RabbitType; -import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; + import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; import org.bukkit.block.BlockFace; @@ -13,11 +14,11 @@ import org.bukkit.command.CommandSender; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffectType; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; +import me.libraryaddict.disguise.disguisetypes.AnimalColor; +import me.libraryaddict.disguise.disguisetypes.DisguiseType; +import me.libraryaddict.disguise.disguisetypes.FlagWatcher; +import me.libraryaddict.disguise.disguisetypes.RabbitType; +import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; public class HelpDisguiseCommand extends BaseDisguiseCommand { diff --git a/src/main/java/me/libraryaddict/disguise/commands/LibsDisguisesCommand.java b/src/me/libraryaddict/disguise/commands/LibsDisguisesCommand.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/commands/LibsDisguisesCommand.java rename to src/me/libraryaddict/disguise/commands/LibsDisguisesCommand.java index 8b79763f..840bd78b 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/LibsDisguisesCommand.java +++ b/src/me/libraryaddict/disguise/commands/LibsDisguisesCommand.java @@ -1,12 +1,13 @@ package me.libraryaddict.disguise.commands; -import me.libraryaddict.disguise.LibsDisguises; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import me.libraryaddict.disguise.LibsDisguises; + public class LibsDisguisesCommand implements CommandExecutor { @Override diff --git a/src/main/java/me/libraryaddict/disguise/commands/PlayerDisguiseCommand.java b/src/me/libraryaddict/disguise/commands/PlayerDisguiseCommand.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/commands/PlayerDisguiseCommand.java rename to src/me/libraryaddict/disguise/commands/PlayerDisguiseCommand.java index e373cde5..d986af6b 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/PlayerDisguiseCommand.java +++ b/src/me/libraryaddict/disguise/commands/PlayerDisguiseCommand.java @@ -1,10 +1,8 @@ package me.libraryaddict.disguise.commands; -import me.libraryaddict.disguise.DisguiseAPI; -import me.libraryaddict.disguise.DisguiseConfig; -import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; -import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; +import java.util.ArrayList; +import java.util.HashMap; + import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -12,8 +10,11 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.HashMap; +import me.libraryaddict.disguise.DisguiseAPI; +import me.libraryaddict.disguise.DisguiseConfig; +import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.DisguiseType; +import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; public class PlayerDisguiseCommand extends BaseDisguiseCommand { diff --git a/src/main/java/me/libraryaddict/disguise/commands/RadiusDisguiseCommand.java b/src/me/libraryaddict/disguise/commands/RadiusDisguiseCommand.java similarity index 74% rename from src/main/java/me/libraryaddict/disguise/commands/RadiusDisguiseCommand.java rename to src/me/libraryaddict/disguise/commands/RadiusDisguiseCommand.java index 92feb477..d80a7337 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/RadiusDisguiseCommand.java +++ b/src/me/libraryaddict/disguise/commands/RadiusDisguiseCommand.java @@ -1,11 +1,9 @@ package me.libraryaddict.disguise.commands; -import me.libraryaddict.disguise.DisguiseAPI; -import me.libraryaddict.disguise.DisguiseConfig; -import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; -import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; -import me.libraryaddict.disguise.utilities.ClassGetter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; + import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; import org.bukkit.command.Command; @@ -15,135 +13,207 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; +import me.libraryaddict.disguise.DisguiseAPI; +import me.libraryaddict.disguise.DisguiseConfig; +import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.DisguiseType; +import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; +import me.libraryaddict.disguise.utilities.ClassGetter; -public class RadiusDisguiseCommand extends BaseDisguiseCommand { +public class RadiusDisguiseCommand extends BaseDisguiseCommand +{ private int maxRadius = 30; private ArrayList validClasses = new ArrayList<>(); - public RadiusDisguiseCommand(int maxRadius) { + public RadiusDisguiseCommand(int maxRadius) + { this.maxRadius = maxRadius; - for (Class c : ClassGetter.getClassesForPackage("org.bukkit.entity")) { - if (c != Entity.class && Entity.class.isAssignableFrom(c) && c.getAnnotation(Deprecated.class) == null) { + + for (Class c : ClassGetter.getClassesForPackage("org.bukkit.entity")) + { + if (c != Entity.class && Entity.class.isAssignableFrom(c) && c.getAnnotation(Deprecated.class) == null) + { validClasses.add(c); } } } @Override - public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { - if (sender.getName().equals("CONSOLE")) { + public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) + { + if (sender.getName().equals("CONSOLE")) + { sender.sendMessage(ChatColor.RED + "You may not use this command from the console!"); return true; } + HashMap, Boolean>> map = getPermissions(sender); - if (map.isEmpty()) { + + if (map.isEmpty()) + { sender.sendMessage(ChatColor.RED + "You are forbidden to use this command."); return true; } - if (args.length == 0) { + + if (args.length == 0) + { sendCommandUsage(sender, map); return true; } - if (args[0].equalsIgnoreCase("entitytype") || args[0].equalsIgnoreCase("entitytypes")) { + + if (args[0].equalsIgnoreCase("entitytype") || args[0].equalsIgnoreCase("entitytypes")) + { ArrayList classes = new ArrayList<>(); - for (Class c : validClasses) { + + for (Class c : validClasses) + { classes.add(c.getSimpleName()); } + Collections.sort(classes); + sender.sendMessage(ChatColor.DARK_GREEN + "EntityTypes usable are: " + ChatColor.GREEN + StringUtils.join(classes, ChatColor.DARK_GREEN + ", " + ChatColor.GREEN) + ChatColor.DARK_GREEN + "."); return true; } + Class entityClass = Entity.class; EntityType type = null; int starting = 0; - if (!isNumeric(args[0])) { - for (Class c : validClasses) { - if (c.getSimpleName().equalsIgnoreCase(args[0])) { + + if (!isNumeric(args[0])) + { + for (Class c : validClasses) + { + if (c.getSimpleName().equalsIgnoreCase(args[0])) + { entityClass = c; starting = 1; break; } } - if (starting == 0) { - try { + + if (starting == 0) + { + try + { type = EntityType.valueOf(args[0].toUpperCase()); - } catch (Exception ex) { } - if (type == null) { + catch (Exception ex) + { + } + + if (type == null) + { sender.sendMessage(ChatColor.RED + "Unrecognised EntityType " + args[0]); return true; } } } - if (args.length == starting + 1) { + + if (args.length == starting + 1) + { sender.sendMessage(ChatColor.RED + "You need to supply a disguise as well as the radius" + (starting != 0 ? " and EntityType" : "")); return true; } - if (!isNumeric(args[starting])) { + + if (!isNumeric(args[starting])) + { sender.sendMessage(ChatColor.RED + args[starting] + " is not a number"); return true; } + int radius = Integer.parseInt(args[starting]); - if (radius > maxRadius) { + + if (radius > maxRadius) + { sender.sendMessage(ChatColor.RED + "Limited radius to " + maxRadius + "! Don't want to make too much lag right?"); radius = maxRadius; } + String[] newArgs = new String[args.length - (starting + 1)]; System.arraycopy(args, starting + 1, newArgs, 0, newArgs.length); Disguise disguise; - try { + + try + { disguise = parseDisguise(sender, newArgs, map); - } catch (DisguiseParseException ex) { - if (ex.getMessage() != null) { + } + catch (DisguiseParseException ex) + { + if (ex.getMessage() != null) + { sender.sendMessage(ex.getMessage()); } + return true; - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); return true; - } // Time to use it! + } + + // Time to use it! int disguisedEntitys = 0; int miscDisguises = 0; - for (Entity entity : ((Player) sender).getNearbyEntities(radius, radius, radius)) { - if (entity == sender) { + + for (Entity entity : ((Player) sender).getNearbyEntities(radius, radius, radius)) + { + if (entity == sender) + { continue; } - if (type != null ? entity.getType() == type : entityClass.isAssignableFrom(entity.getClass())) { + + if (type != null ? entity.getType() == type : entityClass.isAssignableFrom(entity.getClass())) + { if (disguise.isMiscDisguise() && !DisguiseConfig.isMiscDisguisesForLivingEnabled() - && entity instanceof LivingEntity) { + && entity instanceof LivingEntity) + { miscDisguises++; continue; } + disguise = disguise.clone(); - if (entity instanceof Player && DisguiseConfig.isNameOfPlayerShownAboveDisguise()) { - if (disguise.getWatcher() instanceof LivingWatcher) { + + if (entity instanceof Player && DisguiseConfig.isNameOfPlayerShownAboveDisguise()) + { + if (disguise.getWatcher() instanceof LivingWatcher) + { disguise.getWatcher().setCustomName(((Player) entity).getDisplayName()); - if (DisguiseConfig.isNameAboveHeadAlwaysVisible()) { + if (DisguiseConfig.isNameAboveHeadAlwaysVisible()) + { disguise.getWatcher().setCustomNameVisible(true); } } } + DisguiseAPI.disguiseToAll(entity, disguise); - if (disguise.isDisguiseInUse()) { + + if (disguise.isDisguiseInUse()) + { disguisedEntitys++; } } } - if (disguisedEntitys > 0) { + + if (disguisedEntitys > 0) + { sender.sendMessage(ChatColor.RED + "Successfully disguised " + disguisedEntitys + " entities!"); - } else { + } + else + { sender.sendMessage(ChatColor.RED + "Couldn't find any entities to disguise!"); } - if (miscDisguises > 0) { + + if (miscDisguises > 0) + { sender.sendMessage(ChatColor.RED + "Failed to disguise " + miscDisguises + " entities because the option to disguise a living entity as a non-living has been disabled in the config"); } + return true; } @@ -151,25 +221,34 @@ public class RadiusDisguiseCommand extends BaseDisguiseCommand { * Send the player the information */ @Override - protected void sendCommandUsage(CommandSender sender, HashMap, Boolean>> map) { + protected void sendCommandUsage(CommandSender sender, HashMap, Boolean>> map) + { ArrayList allowedDisguises = getAllowedDisguises(map); + sender.sendMessage(ChatColor.DARK_GREEN + "Disguise all entities in a radius! Caps at 30 blocks!"); sender.sendMessage(ChatColor.DARK_GREEN + "You can use the disguises: " + ChatColor.GREEN + StringUtils.join(allowedDisguises, ChatColor.RED + ", " + ChatColor.GREEN)); + String optional = ChatColor.DARK_GREEN + "(" + ChatColor.GREEN + "Optional" + ChatColor.DARK_GREEN + ")"; - if (allowedDisguises.contains("player")) { + + if (allowedDisguises.contains("player")) + { sender.sendMessage((ChatColor.DARK_GREEN + "/disguiseradius player ") .replace("<", "<" + ChatColor.GREEN).replace(">", ChatColor.DARK_GREEN + ">")); } + sender.sendMessage((ChatColor.DARK_GREEN + "/disguiseradius ").replace("<", "<" + ChatColor.GREEN).replace(">", ChatColor.DARK_GREEN + ">")); - if (allowedDisguises.contains("dropped_item") || allowedDisguises.contains("falling_block")) { + + if (allowedDisguises.contains("dropped_item") || allowedDisguises.contains("falling_block")) + { sender.sendMessage((ChatColor.DARK_GREEN + "/disguiseradius ").replace("<", - "<" + ChatColor.GREEN).replace(">", ChatColor.DARK_GREEN + ">")); + + "> ") + .replace("<", "<" + ChatColor.GREEN).replace(">", ChatColor.DARK_GREEN + ">")); } - sender.sendMessage(ChatColor.DARK_GREEN + "See the EntityType's usable by " + ChatColor.GREEN - + "/disguiseradius EntityTypes"); + + sender.sendMessage( + ChatColor.DARK_GREEN + "See the EntityType's usable by " + ChatColor.GREEN + "/disguiseradius EntityTypes"); } } diff --git a/src/main/java/me/libraryaddict/disguise/commands/UndisguiseCommand.java b/src/me/libraryaddict/disguise/commands/UndisguiseCommand.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/commands/UndisguiseCommand.java rename to src/me/libraryaddict/disguise/commands/UndisguiseCommand.java index 25fe14c4..f2be148b 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/UndisguiseCommand.java +++ b/src/me/libraryaddict/disguise/commands/UndisguiseCommand.java @@ -1,7 +1,5 @@ package me.libraryaddict.disguise.commands; -import me.libraryaddict.disguise.DisguiseAPI; - import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -9,6 +7,8 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import me.libraryaddict.disguise.DisguiseAPI; + public class UndisguiseCommand implements CommandExecutor { @Override diff --git a/src/main/java/me/libraryaddict/disguise/commands/UndisguiseEntityCommand.java b/src/me/libraryaddict/disguise/commands/UndisguiseEntityCommand.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/commands/UndisguiseEntityCommand.java rename to src/me/libraryaddict/disguise/commands/UndisguiseEntityCommand.java index 98ad3190..1f42f994 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/UndisguiseEntityCommand.java +++ b/src/me/libraryaddict/disguise/commands/UndisguiseEntityCommand.java @@ -1,11 +1,12 @@ package me.libraryaddict.disguise.commands; -import me.libraryaddict.disguise.LibsDisguises; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import me.libraryaddict.disguise.LibsDisguises; + public class UndisguiseEntityCommand implements CommandExecutor { @Override diff --git a/src/main/java/me/libraryaddict/disguise/commands/UndisguisePlayerCommand.java b/src/me/libraryaddict/disguise/commands/UndisguisePlayerCommand.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/commands/UndisguisePlayerCommand.java rename to src/me/libraryaddict/disguise/commands/UndisguisePlayerCommand.java index 82b9a6b0..22844f41 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/UndisguisePlayerCommand.java +++ b/src/me/libraryaddict/disguise/commands/UndisguisePlayerCommand.java @@ -1,7 +1,5 @@ package me.libraryaddict.disguise.commands; -import me.libraryaddict.disguise.DisguiseAPI; - import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; @@ -9,6 +7,8 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import me.libraryaddict.disguise.DisguiseAPI; + public class UndisguisePlayerCommand implements CommandExecutor { @Override diff --git a/src/main/java/me/libraryaddict/disguise/commands/UndisguiseRadiusCommand.java b/src/me/libraryaddict/disguise/commands/UndisguiseRadiusCommand.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/commands/UndisguiseRadiusCommand.java rename to src/me/libraryaddict/disguise/commands/UndisguiseRadiusCommand.java index a22269c6..37580860 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/UndisguiseRadiusCommand.java +++ b/src/me/libraryaddict/disguise/commands/UndisguiseRadiusCommand.java @@ -1,7 +1,5 @@ package me.libraryaddict.disguise.commands; -import me.libraryaddict.disguise.DisguiseAPI; - import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -9,6 +7,8 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import me.libraryaddict.disguise.DisguiseAPI; + public class UndisguiseRadiusCommand implements CommandExecutor { private int maxRadius = 30; diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/AnimalColor.java b/src/me/libraryaddict/disguise/disguisetypes/AnimalColor.java similarity index 65% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/AnimalColor.java rename to src/me/libraryaddict/disguise/disguisetypes/AnimalColor.java index 20ad534d..7382c816 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/AnimalColor.java +++ b/src/me/libraryaddict/disguise/disguisetypes/AnimalColor.java @@ -1,29 +1,35 @@ package me.libraryaddict.disguise.disguisetypes; -public enum AnimalColor { - +public enum AnimalColor +{ BLACK(15), BLUE(11), BROWN(12), CYAN(9), GRAY(7), GREEN(13), LIGHT_BLUE(3), LIME(5), MAGENTA(2), ORANGE(1), PINK(6), PURPLE( 10), RED(14), SILVER(8), WHITE(0), YELLOW(4); - public static AnimalColor getColor(int nmsId) { - for (AnimalColor color : values()) { - if (color.getId() == nmsId) { + public static AnimalColor getColor(int nmsId) + { + for (AnimalColor color : values()) + { + if (color.getId() == nmsId) + { return color; } } + return null; } private int value; - AnimalColor(int newValue) { + AnimalColor(int newValue) + { value = newValue; } /** * The color ID as defined by nms internals. */ - public int getId() { + public int getId() + { return value; } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java similarity index 67% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java rename to src/me/libraryaddict/disguise/disguisetypes/Disguise.java index 18baec28..0cfb3003 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java @@ -1,9 +1,29 @@ package me.libraryaddict.disguise.disguisetypes; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Horse.Variant; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Skeleton.SkeletonType; +import org.bukkit.entity.Villager.Profession; +import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.Vector; + import com.comphenix.protocol.PacketType.Play.Server; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.reflect.StructureModifier; + import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.LibsDisguises; @@ -20,27 +40,9 @@ import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.DisguiseValues; import me.libraryaddict.disguise.utilities.PacketsManager; import me.libraryaddict.disguise.utilities.ReflectionManager; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Horse.Variant; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.entity.Skeleton.SkeletonType; -import org.bukkit.entity.Villager.Profession; -import org.bukkit.scheduler.BukkitTask; -import org.bukkit.util.Vector; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.UUID; - -public abstract class Disguise { +public abstract class Disguise +{ private boolean disguiseInUse; private DisguiseType disguiseType; private Entity entity; @@ -67,252 +69,363 @@ public abstract class Disguise { /** * Seems I do this method so I can make cleaner constructors on disguises.. * - * @param newType The disguise + * @param newType + * The disguise */ - protected void createDisguise(DisguiseType newType) { - if (getWatcher() != null) { + protected void createDisguise(DisguiseType newType) + { + if (getWatcher() != null) + { return; } - if (newType.getEntityType() == null) { - throw new RuntimeException( - "DisguiseType " - + newType + + if (newType.getEntityType() == null) + { + throw new RuntimeException("DisguiseType " + newType + " was used in a futile attempt to construct a disguise, but this version of Spigot does not have that entity"); } + // Set the disguise type disguiseType = newType; // Get if they are a adult now.. + boolean isAdult = true; - if (isMobDisguise()) { + + if (isMobDisguise()) + { isAdult = ((MobDisguise) this).isAdult(); } - try { + + try + { // Construct the FlagWatcher from the stored class setWatcher((FlagWatcher) getType().getWatcherClass().getConstructor(Disguise.class).newInstance(this)); - } catch (Exception e) { + } + catch (Exception e) + { e.printStackTrace(System.out); } + // Set the disguise if its a baby or not - if (!isAdult) { - if (getWatcher() instanceof AgeableWatcher) { + if (!isAdult) + { + if (getWatcher() instanceof AgeableWatcher) + { ((AgeableWatcher) getWatcher()).setBaby(true); - } else if (getWatcher() instanceof ZombieWatcher) { + } + else if (getWatcher() instanceof ZombieWatcher) + { ((ZombieWatcher) getWatcher()).setBaby(true); } } + // If the disguise type is a wither, set the flagwatcher value for the skeleton to a wither skeleton - if (getType() == DisguiseType.WITHER_SKELETON) { - ((SkeletonWatcher)getWatcher()).setType(SkeletonType.WITHER); + if (getType() == DisguiseType.WITHER_SKELETON) + { + ((SkeletonWatcher) getWatcher()).setType(SkeletonType.WITHER); } // Else if its a zombie, but the disguise type is a zombie villager. Set the value. - else if (getType() == DisguiseType.ZOMBIE_VILLAGER) { - ((ZombieWatcher)getWatcher()).setProfession(Profession.values()[DisguiseUtilities.random.nextInt(Profession.values().length)]); - } else if (getType() == DisguiseType.ELDER_GUARDIAN) { - ((GuardianWatcher)getWatcher()).setElder(true); + else if (getType() == DisguiseType.ZOMBIE_VILLAGER) + { + ((ZombieWatcher) getWatcher()) + .setProfession(Profession.values()[DisguiseUtilities.random.nextInt(Profession.values().length)]); + } + else if (getType() == DisguiseType.ELDER_GUARDIAN) + { + ((GuardianWatcher) getWatcher()).setElder(true); } // Else if its a horse. Set the horse watcher type - else if (getWatcher() instanceof HorseWatcher) { - try { + else if (getWatcher() instanceof HorseWatcher) + { + try + { Variant horseType = Variant.valueOf(getType().name()); - ((HorseWatcher)getWatcher()).setVariant(horseType); - } catch (Exception ex) { + ((HorseWatcher) getWatcher()).setVariant(horseType); + } + catch (Exception ex) + { // Ok.. So it aint a horse } } + final boolean alwaysSendVelocity; - switch (getType()) { - case EGG: - case ENDER_PEARL: - case BAT: - case EXPERIENCE_ORB: - case FIREBALL: - case SMALL_FIREBALL: - case SNOWBALL: - case SPLASH_POTION: - case THROWN_EXP_BOTTLE: - case WITHER_SKULL: - case FIREWORK: - alwaysSendVelocity = true; - break; - default: - alwaysSendVelocity = false; - break; + + switch (getType()) + { + case EGG: + case ENDER_PEARL: + case BAT: + case EXPERIENCE_ORB: + case FIREBALL: + case SMALL_FIREBALL: + case SNOWBALL: + case SPLASH_POTION: + case THROWN_EXP_BOTTLE: + case WITHER_SKULL: + case FIREWORK: + alwaysSendVelocity = true; + break; + default: + alwaysSendVelocity = false; + break; } + double velocitySpeed = 0.0005; - switch (getType()) { - case FIREWORK: - velocitySpeed = -0.040; - break; - case WITHER_SKULL: - velocitySpeed = 0.000001D; - break; - case ARROW: - case TIPPED_ARROW: - case SPECTRAL_ARROW: - case BOAT: - case ENDER_CRYSTAL: - case ENDER_DRAGON: - case GHAST: - case ITEM_FRAME: - case MINECART: - case MINECART_CHEST: - case MINECART_COMMAND: - case MINECART_FURNACE: - case MINECART_HOPPER: - case MINECART_MOB_SPAWNER: - case MINECART_TNT: - case PAINTING: - case PLAYER: - case SQUID: - velocitySpeed = 0; - break; - case DROPPED_ITEM: - case PRIMED_TNT: - case WITHER: - case FALLING_BLOCK: - velocitySpeed = 0.04; - break; - case EXPERIENCE_ORB: - velocitySpeed = 0.0221; - break; - case SPIDER: - case BAT: - case CAVE_SPIDER: - velocitySpeed = 0.004; - break; - default: - break; + + switch (getType()) + { + case FIREWORK: + velocitySpeed = -0.040; + break; + case WITHER_SKULL: + velocitySpeed = 0.000001D; + break; + case ARROW: + case TIPPED_ARROW: + case SPECTRAL_ARROW: + case BOAT: + case ENDER_CRYSTAL: + case ENDER_DRAGON: + case GHAST: + case ITEM_FRAME: + case MINECART: + case MINECART_CHEST: + case MINECART_COMMAND: + case MINECART_FURNACE: + case MINECART_HOPPER: + case MINECART_MOB_SPAWNER: + case MINECART_TNT: + case PAINTING: + case PLAYER: + case SQUID: + velocitySpeed = 0; + break; + case DROPPED_ITEM: + case PRIMED_TNT: + case WITHER: + case FALLING_BLOCK: + velocitySpeed = 0.04; + break; + case EXPERIENCE_ORB: + velocitySpeed = 0.0221; + break; + case SPIDER: + case BAT: + case CAVE_SPIDER: + velocitySpeed = 0.004; + break; + default: + break; } + final double vectorY = velocitySpeed; + final TargetedDisguise disguise = (TargetedDisguise) this; + // A scheduler to clean up any unused disguises. - velocityRunnable = new Runnable() { + velocityRunnable = new Runnable() + { private int blockX, blockY, blockZ, facing; private int deadTicks = 0; private int refreshDisguise = 0; @Override - public void run() { + public void run() + { // If entity is no longer valid. Remove it. - if (!getEntity().isValid()) { + if (!getEntity().isValid()) + { // If it has been dead for 30+ ticks // This is to ensure that this disguise isn't removed while clients think its the real entity // The delay is because if it sends the destroy entity packets straight away, then it means no death animation // This is probably still a problem for wither and enderdragon deaths. - if (deadTicks++ > (getType() == DisguiseType.ENDER_DRAGON ? 200 : 20)) { + if (deadTicks++ > (getType() == DisguiseType.ENDER_DRAGON ? 200 : 20)) + { deadTicks = 0; - if (isRemoveDisguiseOnDeath()) { + + if (isRemoveDisguiseOnDeath()) + { removeDisguise(); - } else { + } + else + { entity = null; watcher = getWatcher().clone(disguise); task.cancel(); task = null; } } - } else { + } + else + { deadTicks = 0; + // If the disguise type is tnt, we need to resend the entity packet else it will turn invisible - if (getType() == DisguiseType.PRIMED_TNT || getType() == DisguiseType.FIREWORK) { + if (getType() == DisguiseType.PRIMED_TNT || getType() == DisguiseType.FIREWORK) + { refreshDisguise++; - if (refreshDisguise % 40 == 0) { + + if (refreshDisguise % 40 == 0) + { refreshDisguise = 0; + DisguiseUtilities.refreshTrackers(disguise); } } - if (getType() == DisguiseType.ITEM_FRAME) { + + if (getType() == DisguiseType.ITEM_FRAME) + { Location loc = getEntity().getLocation(); + int newFacing = (((int) loc.getYaw() + 720 + 45) / 90) % 4; + if (loc.getBlockX() != blockX || loc.getBlockY() != blockY || loc.getBlockZ() != blockZ - || newFacing != facing) { + || newFacing != facing) + { blockX = loc.getBlockX(); blockY = loc.getBlockY(); blockZ = loc.getBlockZ(); facing = newFacing; + DisguiseUtilities.refreshTrackers(disguise); } } - if (isModifyBoundingBox()) { + + if (isModifyBoundingBox()) + { DisguiseUtilities.doBoundingBox(disguise); } - if (getType() == DisguiseType.BAT && !((BatWatcher) getWatcher()).isHanging()) { + + if (getType() == DisguiseType.BAT && !((BatWatcher) getWatcher()).isHanging()) + { return; } + // If the vectorY isn't 0. Cos if it is. Then it doesn't want to send any vectors. // If this disguise has velocity sending enabled and the entity is flying. - if (isVelocitySent() && vectorY != 0 && (alwaysSendVelocity || !getEntity().isOnGround())) { + if (isVelocitySent() && vectorY != 0 && (alwaysSendVelocity || !getEntity().isOnGround())) + { Vector vector = getEntity().getVelocity(); + // If the entity doesn't have velocity changes already - You know. I really can't wrap my head about the // if statement. // But it doesn't seem to do anything wrong.. - if (vector.getY() != 0 && !(vector.getY() < 0 && alwaysSendVelocity && getEntity().isOnGround())) { + if (vector.getY() != 0 && !(vector.getY() < 0 && alwaysSendVelocity && getEntity().isOnGround())) + { return; } + // If disguise isn't a experience orb, or the entity isn't standing on the ground - if (getType() != DisguiseType.EXPERIENCE_ORB || !getEntity().isOnGround()) { + if (getType() != DisguiseType.EXPERIENCE_ORB || !getEntity().isOnGround()) + { PacketContainer lookPacket = null; - if (getType() == DisguiseType.WITHER_SKULL && DisguiseConfig.isWitherSkullPacketsEnabled()) { + + if (getType() == DisguiseType.WITHER_SKULL && DisguiseConfig.isWitherSkullPacketsEnabled()) + { lookPacket = new PacketContainer(Server.ENTITY_LOOK); + StructureModifier mods = lookPacket.getModifier(); lookPacket.getIntegers().write(0, getEntity().getEntityId()); Location loc = getEntity().getLocation(); - mods.write(4, PacketsManager.getYaw(getType(), getEntity().getType(), (byte) Math.floor(loc.getYaw() * 256.0F / 360.0F))); - mods.write(5, PacketsManager.getPitch(getType(), DisguiseType.getType(getEntity().getType()), (byte) Math.floor(loc.getPitch() * 256.0F / 360.0F))); - if (isSelfDisguiseVisible() && getEntity() instanceof Player) { + + mods.write(4, PacketsManager.getYaw(getType(), getEntity().getType(), + (byte) Math.floor(loc.getYaw() * 256.0F / 360.0F))); + mods.write(5, PacketsManager.getPitch(getType(), DisguiseType.getType(getEntity().getType()), + (byte) Math.floor(loc.getPitch() * 256.0F / 360.0F))); + + if (isSelfDisguiseVisible() && getEntity() instanceof Player) + { PacketContainer selfLookPacket = lookPacket.shallowClone(); + selfLookPacket.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); - try { + + try + { ProtocolLibrary.getProtocolManager().sendServerPacket((Player) getEntity(), selfLookPacket, false); - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(System.out); } } } - try { + + try + { PacketContainer velocityPacket = new PacketContainer(Server.ENTITY_VELOCITY); + StructureModifier mods = velocityPacket.getIntegers(); + mods.write(1, (int) (vector.getX() * 8000)); mods.write(3, (int) (vector.getZ() * 8000)); - for (Player player : DisguiseUtilities.getPerverts(disguise)) { - if (getEntity() == player) { - if (!isSelfDisguiseVisible()) { + + for (Player player : DisguiseUtilities.getPerverts(disguise)) + { + if (getEntity() == player) + { + if (!isSelfDisguiseVisible()) + { continue; } + mods.write(0, DisguiseAPI.getSelfDisguiseId()); - } else { + } + else + { mods.write(0, getEntity().getEntityId()); } + mods.write(2, (int) (8000D * (vectorY * ReflectionManager.getPing(player)) * 0.069D)); - if (lookPacket != null && player != getEntity()) { + + if (lookPacket != null && player != getEntity()) + { ProtocolLibrary.getProtocolManager().sendServerPacket(player, lookPacket, false); } + ProtocolLibrary.getProtocolManager().sendServerPacket(player, velocityPacket.shallowClone(), false); } - } catch (Exception e) { + } + catch (Exception e) + { e.printStackTrace(System.out); } } // If we need to send a packet to update the exp position as it likes to gravitate client sided to // players. } - if (getType() == DisguiseType.EXPERIENCE_ORB) { + if (getType() == DisguiseType.EXPERIENCE_ORB) + { PacketContainer packet = new PacketContainer(Server.REL_ENTITY_MOVE); + packet.getIntegers().write(0, getEntity().getEntityId()); - try { - for (Player player : DisguiseUtilities.getPerverts(disguise)) { - if (getEntity() != player) { + try + { + for (Player player : DisguiseUtilities.getPerverts(disguise)) + { + if (getEntity() != player) + { ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, false); - } else if (isSelfDisguiseVisible()) { + } + else if (isSelfDisguiseVisible()) + { PacketContainer selfPacket = packet.shallowClone(); + selfPacket.getModifier().write(0, DisguiseAPI.getSelfDisguiseId()); - try { - ProtocolLibrary.getProtocolManager().sendServerPacket((Player) getEntity(), selfPacket, false); - } catch (InvocationTargetException e) { + + try + { + ProtocolLibrary.getProtocolManager().sendServerPacket((Player) getEntity(), selfPacket, + false); + } + catch (InvocationTargetException e) + { e.printStackTrace(System.out); } } } - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(System.out); } } @@ -326,7 +439,8 @@ public abstract class Disguise { * * @return entity */ - public Entity getEntity() { + public Entity getEntity() + { return entity; } @@ -335,7 +449,8 @@ public abstract class Disguise { * * @return disguiseType */ - public DisguiseType getType() { + public DisguiseType getType() + { return disguiseType; } @@ -344,63 +459,79 @@ public abstract class Disguise { * * @return flagWatcher */ - public FlagWatcher getWatcher() { + public FlagWatcher getWatcher() + { return watcher; } /** - * In use doesn't mean that this disguise is active. It means that Lib's Disguises still stores a reference to the disguise. getEntity() can still return null if this disguise is active after despawn, logout, etc. + * In use doesn't mean that this disguise is active. It means that Lib's Disguises still stores a reference to the disguise. + * getEntity() can still return null if this disguise is active after despawn, logout, etc. * * @return isDisguiseInUse */ - public boolean isDisguiseInUse() { + public boolean isDisguiseInUse() + { return disguiseInUse; } - public boolean isHidingArmorFromSelf() { + public boolean isHidingArmorFromSelf() + { return hideArmorFromSelf; } - public boolean isHidingHeldItemFromSelf() { + public boolean isHidingHeldItemFromSelf() + { return hideHeldItemFromSelf; } - public boolean isKeepDisguiseOnEntityDespawn() { + public boolean isKeepDisguiseOnEntityDespawn() + { return this.keepDisguiseEntityDespawn; } - public boolean isKeepDisguiseOnPlayerDeath() { + public boolean isKeepDisguiseOnPlayerDeath() + { return this.keepDisguisePlayerDeath; } - public boolean isKeepDisguiseOnPlayerLogout() { + public boolean isKeepDisguiseOnPlayerLogout() + { return this.keepDisguisePlayerLogout; } - public boolean isMiscDisguise() { + public boolean isMiscDisguise() + { return false; } - public boolean isMobDisguise() { + public boolean isMobDisguise() + { return false; } - public boolean isModifyBoundingBox() { + public boolean isModifyBoundingBox() + { return modifyBoundingBox; } - public boolean isPlayerDisguise() { + public boolean isPlayerDisguise() + { return false; } /** * Internal use */ - public boolean isRemoveDisguiseOnDeath() { - return getEntity() == null || (getEntity() instanceof Player ? (!((Player) getEntity()).isOnline() ? !isKeepDisguiseOnPlayerLogout() : !isKeepDisguiseOnPlayerDeath()) : (!isKeepDisguiseOnEntityDespawn() || getEntity().isDead())); + public boolean isRemoveDisguiseOnDeath() + { + return getEntity() == null || (getEntity() instanceof Player + ? (!((Player) getEntity()).isOnline() ? !isKeepDisguiseOnPlayerLogout() : !isKeepDisguiseOnPlayerDeath()) + : (!isKeepDisguiseOnEntityDespawn() || getEntity().isDead())); } - public boolean isSelfDisguiseSoundsReplaced() { + public boolean isSelfDisguiseSoundsReplaced() + { return hearSelfDisguise; } @@ -409,15 +540,18 @@ public abstract class Disguise { * * @return viewSelfDisguise */ - public boolean isSelfDisguiseVisible() { + public boolean isSelfDisguiseVisible() + { return viewSelfDisguise; } - public boolean isSoundsReplaced() { + public boolean isSoundsReplaced() + { return replaceSounds; } - public boolean isVelocitySent() { + public boolean isVelocitySent() + { return velocitySent; } @@ -426,7 +560,8 @@ public abstract class Disguise { * * @return */ - public boolean isShowName() { + public boolean isShowName() + { return showName; } @@ -435,58 +570,88 @@ public abstract class Disguise { * * @return removeDiguise */ - public boolean removeDisguise() { - if (disguiseInUse) { + public boolean removeDisguise() + { + if (disguiseInUse) + { UndisguiseEvent event = new UndisguiseEvent(entity, this); + Bukkit.getPluginManager().callEvent(event); - if (!event.isCancelled()) { + + if (!event.isCancelled()) + { disguiseInUse = false; - if (task != null) { + + if (task != null) + { task.cancel(); task = null; } + HashMap> disguises = DisguiseUtilities.getDisguises(); + // If this disguise has a entity set - if (getEntity() != null) { + if (getEntity() != null) + { // If this disguise is active // Remove the disguise from the current disguises. - if (DisguiseUtilities.removeDisguise((TargetedDisguise) this)) { - if (getEntity() instanceof Player) { + if (DisguiseUtilities.removeDisguise((TargetedDisguise) this)) + { + if (getEntity() instanceof Player) + { DisguiseUtilities.removeSelfDisguise((Player) getEntity()); } // Better refresh the entity to undisguise it - if (getEntity().isValid()) { + if (getEntity().isValid()) + { DisguiseUtilities.refreshTrackers((TargetedDisguise) this); - } else { + } + else + { DisguiseUtilities.destroyEntity((TargetedDisguise) this); } } - } else { + } + else + { // Loop through the disguises because it could be used with a unknown entity id. HashMap> future = DisguiseUtilities.getFutureDisguises(); + Iterator itel = DisguiseUtilities.getFutureDisguises().keySet().iterator(); - while (itel.hasNext()) { + + while (itel.hasNext()) + { int id = itel.next(); - if (future.get(id).remove(this) && future.get(id).isEmpty()) { + + if (future.get(id).remove(this) && future.get(id).isEmpty()) + { itel.remove(); } } } - if (isPlayerDisguise()) { + if (isPlayerDisguise()) + { String name = ((PlayerDisguise) this).getName(); - if (!DisguiseUtilities.getAddedByPlugins().contains(name.toLowerCase())) { - for (HashSet disguise : disguises.values()) { - for (Disguise d : disguise) { - if (d.isPlayerDisguise() && ((PlayerDisguise) d).getName().equals(name)) { + + if (!DisguiseUtilities.getAddedByPlugins().contains(name.toLowerCase())) + { + for (HashSet disguise : disguises.values()) + { + for (Disguise d : disguise) + { + if (d.isPlayerDisguise() && ((PlayerDisguise) d).getName().equals(name)) + { return true; } } } + DisguiseUtilities.getGameProfiles().remove(name.toLowerCase()); } } + return true; } } @@ -499,135 +664,195 @@ public abstract class Disguise { * @param entity * @return disguise */ - public Disguise setEntity(Entity entity) { - if (this.getEntity() != null) { - if (getEntity() == entity) { + public Disguise setEntity(Entity entity) + { + if (this.getEntity() != null) + { + if (getEntity() == entity) + { return this; } + throw new RuntimeException("This disguise is already in use! Try .clone()"); } - if (isMiscDisguise() && !DisguiseConfig.isMiscDisguisesForLivingEnabled() && entity instanceof LivingEntity) { + + if (isMiscDisguise() && !DisguiseConfig.isMiscDisguisesForLivingEnabled() && entity instanceof LivingEntity) + { throw new RuntimeException( "Cannot disguise a living entity with a misc disguise. Reenable MiscDisguisesForLiving in the config to do this"); } + this.entity = entity; + setupWatcher(); + return this; } - public Disguise setShowName(boolean showName) { + public Disguise setShowName(boolean showName) + { this.showName = showName; + return this; } - public Disguise setHearSelfDisguise(boolean hearSelfDisguise) { + public Disguise setHearSelfDisguise(boolean hearSelfDisguise) + { this.hearSelfDisguise = hearSelfDisguise; + return this; } - public Disguise setHideArmorFromSelf(boolean hideArmor) { + public Disguise setHideArmorFromSelf(boolean hideArmor) + { this.hideArmorFromSelf = hideArmor; - if (getEntity() instanceof Player) { + + if (getEntity() instanceof Player) + { ((Player) getEntity()).updateInventory(); } + return this; } - public Disguise setHideHeldItemFromSelf(boolean hideHeldItem) { + public Disguise setHideHeldItemFromSelf(boolean hideHeldItem) + { this.hideHeldItemFromSelf = hideHeldItem; - if (getEntity() instanceof Player) { + + if (getEntity() instanceof Player) + { ((Player) getEntity()).updateInventory(); } + return this; } - public Disguise setKeepDisguiseOnEntityDespawn(boolean keepDisguise) { + public Disguise setKeepDisguiseOnEntityDespawn(boolean keepDisguise) + { this.keepDisguiseEntityDespawn = keepDisguise; + return this; } - public Disguise setKeepDisguiseOnPlayerDeath(boolean keepDisguise) { + public Disguise setKeepDisguiseOnPlayerDeath(boolean keepDisguise) + { this.keepDisguisePlayerDeath = keepDisguise; + return this; } - public Disguise setKeepDisguiseOnPlayerLogout(boolean keepDisguise) { + public Disguise setKeepDisguiseOnPlayerLogout(boolean keepDisguise) + { this.keepDisguisePlayerLogout = keepDisguise; + return this; } - public Disguise setModifyBoundingBox(boolean modifyBox) { - if (((TargetedDisguise) this).getDisguiseTarget() != TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { + public Disguise setModifyBoundingBox(boolean modifyBox) + { + if (((TargetedDisguise) this).getDisguiseTarget() != TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) + { throw new RuntimeException( "Cannot modify the bounding box of a disguise which is not TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS"); } - if (isModifyBoundingBox() != modifyBox) { + + if (isModifyBoundingBox() != modifyBox) + { this.modifyBoundingBox = modifyBox; - if (DisguiseUtilities.isDisguiseInUse(this)) { + + if (DisguiseUtilities.isDisguiseInUse(this)) + { DisguiseUtilities.doBoundingBox((TargetedDisguise) this); } } + return this; } - public Disguise setReplaceSounds(boolean areSoundsReplaced) { + public Disguise setReplaceSounds(boolean areSoundsReplaced) + { replaceSounds = areSoundsReplaced; + return this; } /** - * Sets up the FlagWatcher with the entityclass, it creates all the data it needs to prevent conflicts when sending the datawatcher. + * Sets up the FlagWatcher with the entityclass, it creates all the data it needs to prevent conflicts when sending the + * datawatcher. */ - private void setupWatcher() { + private void setupWatcher() + { HashMap disguiseValues = DisguiseValues.getMetaValues(getType()); HashMap entityValues = DisguiseValues.getMetaValues(DisguiseType.getType(getEntity().getType())); + // Start from 2 as they ALL share 0 and 1 - for (int dataNo = 0; dataNo <= 31; dataNo++) { + for (int dataNo = 0; dataNo <= 31; dataNo++) + { // STEP 1. Find out if the watcher has set data on it. // If the watcher already set a metadata on this - if (getWatcher().hasValue(dataNo)) { + if (getWatcher().hasValue(dataNo)) + { // Better check that the value is stable. // To check this, I'm going to check if there exists a default value // Then I'm going to check if the watcher value is the same as the default value. - if (disguiseValues.containsKey(dataNo)) { + if (disguiseValues.containsKey(dataNo)) + { // Now check if they are the same class, or both null. - if (disguiseValues.get(dataNo) == null || getWatcher().getValue(dataNo, null) == null) { - if (disguiseValues.get(dataNo) == null && getWatcher().getValue(dataNo, null) == null) { + if (disguiseValues.get(dataNo) == null || getWatcher().getValue(dataNo, null) == null) + { + if (disguiseValues.get(dataNo) == null && getWatcher().getValue(dataNo, null) == null) + { // They are both null. Idk what this means really. continue; } - } else if (getWatcher().getValue(dataNo, null).getClass() == disguiseValues.get(dataNo).getClass()) { + } + else if (getWatcher().getValue(dataNo, null).getClass() == disguiseValues.get(dataNo).getClass()) + { // The classes are the same. The client "shouldn't" crash. continue; } } } + // STEP 2. As the watcher has not set data on it, check if I need to set the default data. // If neither of them touch it - if (!entityValues.containsKey(dataNo) && !disguiseValues.containsKey(dataNo)) { + if (!entityValues.containsKey(dataNo) && !disguiseValues.containsKey(dataNo)) + { continue; } + // If the disguise has this, but not the entity. Then better set it! - if (!entityValues.containsKey(dataNo) && disguiseValues.containsKey(dataNo)) { + if (!entityValues.containsKey(dataNo) && disguiseValues.containsKey(dataNo)) + { getWatcher().setBackupValue(dataNo, disguiseValues.get(dataNo)); continue; } + // Else if the disguise doesn't have it. But the entity does. Better remove it! - if (entityValues.containsKey(dataNo) && !disguiseValues.containsKey(dataNo)) { + if (entityValues.containsKey(dataNo) && !disguiseValues.containsKey(dataNo)) + { getWatcher().setBackupValue(dataNo, null); continue; } + Object eObj = entityValues.get(dataNo); Object dObj = disguiseValues.get(dataNo); - if (eObj == null || dObj == null) { - if (eObj == null && dObj == null) { + + if (eObj == null || dObj == null) + { + if (eObj == null && dObj == null) + { continue; - } else { + } + else + { getWatcher().setBackupValue(dataNo, dObj); continue; } } - if (eObj.getClass() != dObj.getClass()) { + + if (eObj.getClass() != dObj.getClass()) + { getWatcher().setBackupValue(dataNo, dObj); continue; } @@ -640,29 +865,35 @@ public abstract class Disguise { // EntityLiving is 5 & 6 & 7 & 8 & 9 // Lets use switch Class baseClass = null; - switch (dataNo) { - case 5: - case 6: - case 7: - case 8: - case 9: - baseClass = ReflectionManager.getNmsClass("EntityLiving"); - break; - case 10: - baseClass = ReflectionManager.getNmsClass("EntityInsentient"); - break; - case 11: - baseClass = ReflectionManager.getNmsClass("EntityAgeable"); - break; - default: - break; + + switch (dataNo) + { + case 5: + case 6: + case 7: + case 8: + case 9: + baseClass = ReflectionManager.getNmsClass("EntityLiving"); + break; + case 10: + baseClass = ReflectionManager.getNmsClass("EntityInsentient"); + break; + case 11: + baseClass = ReflectionManager.getNmsClass("EntityAgeable"); + break; + default: + break; } + Class nmsEntityClass = ReflectionManager.getNmsEntity(getEntity()).getClass(); Class nmsDisguiseClass = DisguiseValues.getNmsEntityClass(getType()); - if (nmsDisguiseClass != null) { + + if (nmsDisguiseClass != null) + { // If they both extend the same base class. They OBVIOUSLY share the same datavalue. Right..? if (baseClass != null && baseClass.isAssignableFrom(nmsDisguiseClass) - && baseClass.isAssignableFrom(nmsEntityClass)) { + && baseClass.isAssignableFrom(nmsEntityClass)) + { continue; } @@ -670,18 +901,22 @@ public abstract class Disguise { // Maybe if I check that they extend each other.. // Seeing as I only store the finished forms of entitys. This should raise no problems and allow for more shared // datawatchers. - if (nmsEntityClass.isAssignableFrom(nmsDisguiseClass) || nmsDisguiseClass.isAssignableFrom(nmsEntityClass)) { + if (nmsEntityClass.isAssignableFrom(nmsDisguiseClass) || nmsDisguiseClass.isAssignableFrom(nmsEntityClass)) + { continue; } } + // Well I can't find a reason I should leave it alone. They will probably conflict. // Time to set the value to the disguises value so no conflicts! getWatcher().setBackupValue(dataNo, disguiseValues.get(dataNo)); } } - public Disguise setVelocitySent(boolean sendVelocity) { + public Disguise setVelocitySent(boolean sendVelocity) + { this.velocitySent = sendVelocity; + return this; } @@ -691,58 +926,88 @@ public abstract class Disguise { * @param viewSelfDisguise * @return */ - public Disguise setViewSelfDisguise(boolean viewSelfDisguise) { - if (isSelfDisguiseVisible() != viewSelfDisguise) { + public Disguise setViewSelfDisguise(boolean viewSelfDisguise) + { + if (isSelfDisguiseVisible() != viewSelfDisguise) + { this.viewSelfDisguise = viewSelfDisguise; - if (getEntity() != null && getEntity() instanceof Player) { - if (DisguiseAPI.getDisguise((Player) getEntity(), getEntity()) == this) { - if (isSelfDisguiseVisible()) { + + if (getEntity() != null && getEntity() instanceof Player) + { + if (DisguiseAPI.getDisguise((Player) getEntity(), getEntity()) == this) + { + if (isSelfDisguiseVisible()) + { DisguiseUtilities.setupFakeDisguise(this); - } else { + } + else + { DisguiseUtilities.removeSelfDisguise((Player) getEntity()); } } } } + return this; } - public Disguise setWatcher(FlagWatcher newWatcher) { - if (!getType().getWatcherClass().isInstance(newWatcher)) { + public Disguise setWatcher(FlagWatcher newWatcher) + { + if (!getType().getWatcherClass().isInstance(newWatcher)) + { throw new IllegalArgumentException(newWatcher.getClass().getSimpleName() + " is not a instance of " + getType().getWatcherClass().getSimpleName() + " for DisguiseType " + getType().name()); } + watcher = newWatcher; - if (getEntity() != null) { + + if (getEntity() != null) + { setupWatcher(); } + return this; } - public boolean startDisguise() { - if (!isDisguiseInUse()) { - if (getEntity() == null) { + public boolean startDisguise() + { + if (!isDisguiseInUse()) + { + if (getEntity() == null) + { throw new RuntimeException("No entity is assigned to this disguise!"); } + // Fire a disguise event DisguiseEvent event = new DisguiseEvent(entity, this); + Bukkit.getPluginManager().callEvent(event); + // If they cancelled this disguise event. No idea why. // Just return. - if (!event.isCancelled()) { + if (!event.isCancelled()) + { disguiseInUse = true; + task = Bukkit.getScheduler().runTaskTimer(LibsDisguises.getInstance(), velocityRunnable, 1, 1); + // Stick the disguise in the disguises bin DisguiseUtilities.addDisguise(entity.getUniqueId(), (TargetedDisguise) this); - if (isSelfDisguiseVisible() && getEntity() instanceof Player) { + + if (isSelfDisguiseVisible() && getEntity() instanceof Player) + { DisguiseUtilities.removeSelfDisguise((Player) getEntity()); } + // Resend the disguised entity's packet DisguiseUtilities.refreshTrackers((TargetedDisguise) this); + // If he is a player, then self disguise himself - Bukkit.getScheduler().scheduleSyncDelayedTask(LibsDisguises.getInstance(), new Runnable() { + Bukkit.getScheduler().scheduleSyncDelayedTask(LibsDisguises.getInstance(), new Runnable() + { @Override - public void run() { + public void run() + { DisguiseUtilities.setupFakeDisguise(Disguise.this); } }, 2); @@ -752,7 +1017,8 @@ public abstract class Disguise { return false; } - public boolean stopDisguise() { + public boolean stopDisguise() + { return removeDisguise(); } @@ -761,7 +1027,8 @@ public abstract class Disguise { * * @return */ - public static List getViewSelf() { + public static List getViewSelf() + { return viewSelf; } } diff --git a/src/me/libraryaddict/disguise/disguisetypes/DisguiseType.java b/src/me/libraryaddict/disguise/disguisetypes/DisguiseType.java new file mode 100644 index 00000000..d37e5337 --- /dev/null +++ b/src/me/libraryaddict/disguise/disguisetypes/DisguiseType.java @@ -0,0 +1,389 @@ +package me.libraryaddict.disguise.disguisetypes; + +import java.lang.reflect.Method; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Guardian; +import org.bukkit.entity.Horse; +import org.bukkit.entity.Skeleton; +import org.bukkit.entity.Skeleton.SkeletonType; +import org.bukkit.entity.Zombie; + +public enum DisguiseType +{ + + AREA_EFFECT_CLOUD(3, 0), + + ARMOR_STAND(78), + + ARROW(60, 0), + + BAT, + + BLAZE, + + BOAT(1), + + CAVE_SPIDER, + + CHICKEN, + + COW, + + CREEPER, + + DONKEY, + + DRAGON_FIREBALL(93), + + DROPPED_ITEM(2, 1), + + EGG(62), + + ELDER_GUARDIAN, + + ENDER_CRYSTAL(51), + + ENDER_DRAGON, + + ENDER_PEARL(65), + + ENDER_SIGNAL(72), + + ENDERMAN, + + ENDERMITE, + + EXPERIENCE_ORB, + + FALLING_BLOCK(70, 1), + + FIREBALL(63), + + FIREWORK(76), + + FISHING_HOOK(90), + + GHAST, + + GIANT, + + GUARDIAN, + + HORSE, + + IRON_GOLEM, + + ITEM_FRAME(71), + + LEASH_HITCH(77), + + MAGMA_CUBE, + + MINECART(10), + + MINECART_CHEST(10, 1), + + MINECART_COMMAND(10, 6), + + MINECART_FURNACE(10, 2), + + MINECART_HOPPER(10, 5), + + MINECART_MOB_SPAWNER(10, 4), + + MINECART_TNT(10, 3), + + MULE, + + MUSHROOM_COW, + + OCELOT, + + PAINTING, + + PIG, + + PIG_ZOMBIE, + + PLAYER, + + PRIMED_TNT(50), + + RABBIT, + + SHEEP, + + SHULKER, + + SHULKER_BULLET(67), + + SILVERFISH, + + SKELETON, + + SKELETON_HORSE, + + SLIME, + + SMALL_FIREBALL(63), + + SNOWBALL(61), + + SNOWMAN, + + SPECTRAL_ARROW(91), + + SPIDER, + + SPLASH_POTION(73, 0), + + SQUID, + + TIPPED_ARROW(92), + + THROWN_EXP_BOTTLE(75), + + UNDEAD_HORSE, + + VILLAGER, + + WITCH, + + WITHER, + + WITHER_SKELETON, + + WITHER_SKULL(66), + + WOLF, + + ZOMBIE, + + ZOMBIE_VILLAGER, + + UNKNOWN; + + static + { + // We set the entity type in this so that we can safely ignore disguisetypes which don't exist in older versions of MC. + // Without erroring up everything. + + for (DisguiseType type : values()) + { + + try + { + DisguiseType toUse = type; + String name; + + switch (type) + { + // Disguise item frame isn't supported. So we don't give it a entity type which should prevent it from being.. + // Usable. + case ITEM_FRAME: + break; + case DONKEY: + case MULE: + case UNDEAD_HORSE: + case SKELETON_HORSE: + toUse = DisguiseType.HORSE; + break; + case ZOMBIE_VILLAGER: + toUse = DisguiseType.ZOMBIE; + break; + case WITHER_SKELETON: + toUse = DisguiseType.SKELETON; + break; + case ELDER_GUARDIAN: + toUse = DisguiseType.GUARDIAN; + break; + default: + break; + } + + name = toUse.name(); + + type.setEntityType(EntityType.valueOf(name)); + } + catch (Throwable ex) + { + // This version of Spigot doesn't have the disguise. + } + } + } + + public static DisguiseType getType(Entity entity) + { + DisguiseType disguiseType = getType(entity.getType()); + + switch (disguiseType) + { + case ZOMBIE: + + if (((Zombie) entity).isVillager()) + { + disguiseType = DisguiseType.ZOMBIE_VILLAGER; + } + + break; + + case HORSE: + + disguiseType = DisguiseType.valueOf(((Horse) entity).getVariant().name()); + + break; + + case SKELETON: + + if (((Skeleton) entity).getSkeletonType() == SkeletonType.WITHER) + { + disguiseType = DisguiseType.WITHER_SKELETON; + } + + break; + case GUARDIAN: + + if (((Guardian) entity).isElder()) + { + disguiseType = DisguiseType.ELDER_GUARDIAN; + } + + break; + default: + break; + } + + return disguiseType; + + } + + public static DisguiseType getType(EntityType entityType) + { + try + { + return valueOf(entityType.name().toUpperCase()); + } + catch (Throwable ex) + { + return DisguiseType.UNKNOWN; + } + } + + private int objectId = -1, defaultData = 0; + + private EntityType entityType; + + private Class watcherClass; + + DisguiseType(int... ints) + { + for (int i = 0; i < ints.length; i++) + { + int value = ints[i]; + + switch (i) + { + case 0: + objectId = value; + + break; + case 1: + defaultData = value; + + break; + default: + break; + } + } + } + + public int getDefaultData() + { + return defaultData; + } + + public Class getEntityClass() + { + if (entityType != null) + { + return getEntityType().getEntityClass(); + } + + return Entity.class; + } + + public EntityType getEntityType() + { + return entityType; + } + + /** + * The TYPE id of this entity. Different from the Object Id send in spawn packets when spawning miscs. + * + * @return + */ + public int getTypeId() + { + return (int) getEntityType().getTypeId(); + } + + /** + * The object type send in packets when spawning a misc entity. Otherwise, -1. + * + * @return + */ + public int getObjectId() + { + return objectId; + } + + public Class getWatcherClass() + { + return watcherClass; + } + + public boolean isMisc() + { + return getEntityType() != null && !getEntityType().isAlive(); + } + + public boolean isMob() + { + return getEntityType() != null && getEntityType().isAlive() && !isPlayer(); + } + + public boolean isPlayer() + { + return this == DisguiseType.PLAYER; + } + + public boolean isUnknown() + { + return this == DisguiseType.UNKNOWN; + } + + private void setEntityType(EntityType entityType) + { + this.entityType = entityType; + } + + public void setWatcherClass(Class c) + { + watcherClass = c; + } + + public String toReadable() + { + String[] split = name().split("_"); + + for (int i = 0; i < split.length; i++) + { + split[i] = split[i].substring(0, 1) + split[i].substring(1).toLowerCase(); + } + + return StringUtils.join(split, " "); + } +} diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java similarity index 62% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java index 6e1d3638..359f186d 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java @@ -1,29 +1,32 @@ package me.libraryaddict.disguise.disguisetypes; -import com.comphenix.protocol.PacketType.Play.Server; -import com.comphenix.protocol.ProtocolLibrary; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.reflect.StructureModifier; -import com.comphenix.protocol.wrappers.WrappedDataWatcher; -import com.comphenix.protocol.wrappers.WrappedWatchableObject; -import me.libraryaddict.disguise.DisguiseAPI; -import me.libraryaddict.disguise.DisguiseConfig; -import me.libraryaddict.disguise.utilities.DisguiseUtilities; -import me.libraryaddict.disguise.utilities.PacketsManager; -import me.libraryaddict.disguise.utilities.ReflectionManager; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.inventory.EntityEquipment; -import org.bukkit.inventory.EquipmentSlot; -import org.bukkit.inventory.ItemStack; - import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; -public class FlagWatcher { +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.inventory.EntityEquipment; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; + +import com.comphenix.protocol.PacketType.Play.Server; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.reflect.StructureModifier; +import com.comphenix.protocol.wrappers.WrappedDataWatcher; +import com.comphenix.protocol.wrappers.WrappedWatchableObject; + +import me.libraryaddict.disguise.DisguiseAPI; +import me.libraryaddict.disguise.DisguiseConfig; +import me.libraryaddict.disguise.utilities.DisguiseUtilities; +import me.libraryaddict.disguise.utilities.PacketsManager; +import me.libraryaddict.disguise.utilities.ReflectionManager; + +public class FlagWatcher +{ private boolean addEntityAnimations = DisguiseConfig.isEntityAnimationsAdded(); /** @@ -37,305 +40,445 @@ public class FlagWatcher { private HashSet modifiedEntityAnimations = new HashSet<>(); private List watchableObjects; - public FlagWatcher(Disguise disguise) { + public FlagWatcher(Disguise disguise) + { this.disguise = (TargetedDisguise) disguise; equipment = ReflectionManager.createEntityEquipment(disguise.getEntity()); } - private byte addEntityAnimations(byte originalValue, byte entityValue) { + private byte addEntityAnimations(byte originalValue, byte entityValue) + { byte valueByte = originalValue; - for (int i = 0; i < 6; i++) { - if ((entityValue & 1 << i) != 0 && !modifiedEntityAnimations.contains(i)) { + + for (int i = 0; i < 6; i++) + { + if ((entityValue & 1 << i) != 0 && !modifiedEntityAnimations.contains(i)) + { valueByte = (byte) (valueByte | 1 << i); } } + originalValue = valueByte; + return originalValue; } - public FlagWatcher clone(Disguise owningDisguise) { + public FlagWatcher clone(Disguise owningDisguise) + { FlagWatcher cloned; - try { + + try + { cloned = getClass().getConstructor(Disguise.class).newInstance(getDisguise()); - } catch (Exception e) { + } + catch (Exception e) + { e.printStackTrace(System.out); cloned = new FlagWatcher(getDisguise()); } + cloned.entityValues = (HashMap) entityValues.clone(); cloned.equipment = ReflectionManager.createEntityEquipment(cloned.getDisguise().getEntity()); cloned.modifiedEntityAnimations = (HashSet) modifiedEntityAnimations.clone(); cloned.addEntityAnimations = addEntityAnimations; + return cloned; } - public List convert(List list) { + public List convert(List list) + { List newList = new ArrayList<>(); HashSet sentValues = new HashSet<>(); boolean sendAllCustom = false; - for (WrappedWatchableObject watch : list) { + + for (WrappedWatchableObject watch : list) + { int id = watch.getIndex(); sentValues.add(id); + // Its sending the air metadata. This is the least commonly sent metadata which all entitys still share. // I send my custom values if I see this! - if (id == 1) { + if (id == 1) + { sendAllCustom = true; } + Object value = null; - if (entityValues.containsKey(id)) { - if (entityValues.get(id) == null) { + + if (entityValues.containsKey(id)) + { + if (entityValues.get(id) == null) + { continue; } + value = entityValues.get(id); - } else if (backupEntityValues.containsKey(id)) { - if (backupEntityValues.get(id) == null) { + } + else if (backupEntityValues.containsKey(id)) + { + if (backupEntityValues.get(id) == null) + { continue; } + value = backupEntityValues.get(id); } - if (value != null) { - if (isEntityAnimationsAdded() && id == 0) { + + if (value != null) + { + if (isEntityAnimationsAdded() && id == 0) + { value = this.addEntityAnimations((byte) value, (byte) watch.getValue()); } + boolean isDirty = watch.getDirtyState(); + watch = new WrappedWatchableObject(ReflectionManager.createDataWatcherItem(id, value)); - if (!isDirty) { - watch.setDirtyState(false); - } - } else { - boolean isDirty = watch.getDirtyState(); - watch = new WrappedWatchableObject(ReflectionManager.createDataWatcherItem(id, watch.getValue())); - if (!isDirty) { + + if (!isDirty) + { watch.setDirtyState(false); } } + else + { + boolean isDirty = watch.getDirtyState(); + + watch = new WrappedWatchableObject(ReflectionManager.createDataWatcherItem(id, watch.getValue())); + + if (!isDirty) + { + watch.setDirtyState(false); + } + } + newList.add(watch); } - if (sendAllCustom) { + + if (sendAllCustom) + { // Its sending the entire meta data. Better add the custom meta - for (int id : entityValues.keySet()) { - if (sentValues.contains(id)) { + for (int id : entityValues.keySet()) + { + if (sentValues.contains(id)) + { continue; } + Object value = entityValues.get(id); - if (value == null) { + + if (value == null) + { continue; } + WrappedWatchableObject watch = new WrappedWatchableObject(ReflectionManager.createDataWatcherItem(id, value)); + newList.add(watch); } } // Here we check for if there is a health packet that says they died. - if (getDisguise().isSelfDisguiseVisible() && getDisguise().getEntity() != null && getDisguise().getEntity() instanceof Player) { - for (WrappedWatchableObject watch : newList) { + if (getDisguise().isSelfDisguiseVisible() && getDisguise().getEntity() != null + && getDisguise().getEntity() instanceof Player) + { + for (WrappedWatchableObject watch : newList) + { // Its a health packet - if (watch.getIndex() == 6) { + if (watch.getIndex() == 6) + { Object value = watch.getValue(); - if (value != null && value instanceof Float) { + + if (value != null && value instanceof Float) + { float newHealth = (Float) value; - if (newHealth > 0 && hasDied) { + + if (newHealth > 0 && hasDied) + { hasDied = false; DisguiseUtilities.sendSelfDisguise((Player) getDisguise().getEntity(), disguise); - } else if (newHealth <= 0 && !hasDied) { + } + else if (newHealth <= 0 && !hasDied) + { hasDied = true; } } } } } + return newList; } - public ItemStack[] getArmor() { + public ItemStack[] getArmor() + { ItemStack[] armor = new ItemStack[4]; System.arraycopy(armor, 0, armor, 0, 4); + return armor; } - public String getCustomName() { + public String getCustomName() + { return (String) getValue(2, null); } - protected TargetedDisguise getDisguise() { + protected TargetedDisguise getDisguise() + { return disguise; } - private boolean getEntityFlag(int byteValue) { + private boolean getEntityFlag(int byteValue) + { return ((byte) getValue(0, (byte) 0) & 1 << byteValue) != 0; } - public ItemStack getItemInMainHand() { - if (equipment == null) return null; + public ItemStack getItemInMainHand() + { + if (equipment == null) + return null; + return equipment.getItemInMainHand(); } - public ItemStack getItemInOffHand() { - if (equipment == null) return null; + public ItemStack getItemInOffHand() + { + if (equipment == null) + return null; + return equipment.getItemInOffHand(); } - public EntityEquipment getEquipment() { + public EntityEquipment getEquipment() + { return equipment; } - protected Object getValue(int no, Object backup) { - if (entityValues.containsKey(no)) { - return entityValues.get(no); + protected Y getValue(int no, Y backup) + { + if (entityValues.containsKey(no)) + { + return (Y) entityValues.get(no); } + return backup; } - public List getWatchableObjects() { - if (watchableObjects == null) { + public List getWatchableObjects() + { + if (watchableObjects == null) + { rebuildWatchableObjects(); } + return watchableObjects; } - public boolean hasCustomName() { + public boolean hasCustomName() + { return getCustomName() != null; } - protected boolean hasValue(int no) { + protected boolean hasValue(int no) + { return entityValues.containsKey(no); } - public boolean isCustomNameVisible() { + public boolean isCustomNameVisible() + { return (boolean) getValue(3, false); } - public boolean isEntityAnimationsAdded() { + public boolean isEntityAnimationsAdded() + { return addEntityAnimations; } - public boolean isBurning() { + public boolean isBurning() + { return getEntityFlag(0); } - public boolean isSneaking() { + public boolean isSneaking() + { return getEntityFlag(1); } - public boolean isSprinting() { + public boolean isSprinting() + { return getEntityFlag(3); } - public boolean isRightClicking() { + public boolean isRightClicking() + { return getEntityFlag(4); } - public boolean isInvisible() { + public boolean isInvisible() + { return getEntityFlag(5); } - public boolean isGlowing() { + public boolean isGlowing() + { return getEntityFlag(6); } - public boolean isFlyingWithElytra() { + public boolean isFlyingWithElytra() + { return getEntityFlag(7); } - public void rebuildWatchableObjects() { + public void rebuildWatchableObjects() + { watchableObjects = new ArrayList<>(); - for (int i = 0; i <= 31; i++) { + + for (int i = 0; i <= 31; i++) + { WrappedWatchableObject watchable = null; - if (this.entityValues.containsKey(i) && this.entityValues.get(i) != null) { - watchable = new WrappedWatchableObject(ReflectionManager.createDataWatcherItem(i, entityValues.get(i))); - } else if (this.backupEntityValues.containsKey(i) && this.backupEntityValues.get(i) != null) { + + if (this.entityValues.containsKey(i) && this.entityValues.get(i) != null) + { watchable = new WrappedWatchableObject(ReflectionManager.createDataWatcherItem(i, entityValues.get(i))); } - if (watchable != null) { + else if (this.backupEntityValues.containsKey(i) && this.backupEntityValues.get(i) != null) + { + watchable = new WrappedWatchableObject(ReflectionManager.createDataWatcherItem(i, entityValues.get(i))); + } + + if (watchable != null) + { watchableObjects.add(watchable); } } } - protected void sendData(int... dataValues) { - if (!DisguiseAPI.isDisguiseInUse(getDisguise()) || getDisguise().getWatcher() != this) { + protected void sendData(int... dataValues) + { + if (!DisguiseAPI.isDisguiseInUse(getDisguise()) || getDisguise().getWatcher() != this) + { return; } + List list = new ArrayList<>(); - for (int data : dataValues) { - if (!entityValues.containsKey(data) || entityValues.get(data) == null) { + + for (int data : dataValues) + { + if (!entityValues.containsKey(data) || entityValues.get(data) == null) + { continue; } + Object value = entityValues.get(data); - if (isEntityAnimationsAdded() && DisguiseConfig.isMetadataPacketsEnabled() && data == 0) { + + if (isEntityAnimationsAdded() && DisguiseConfig.isMetadataPacketsEnabled() && data == 0) + { if (!PacketsManager.isStaticMetadataDisguiseType(disguise)) - value = addEntityAnimations((byte) value, WrappedDataWatcher.getEntityWatcher(disguise.getEntity()).getByte(0)); + { + value = addEntityAnimations((byte) value, + WrappedDataWatcher.getEntityWatcher(disguise.getEntity()).getByte(0)); + } } + WrappedWatchableObject watch = new WrappedWatchableObject(ReflectionManager.createDataWatcherItem(data, value)); + list.add(watch); } - if (!list.isEmpty()) { + + if (!list.isEmpty()) + { PacketContainer packet = new PacketContainer(Server.ENTITY_METADATA); + StructureModifier mods = packet.getModifier(); mods.write(0, getDisguise().getEntity().getEntityId()); + packet.getWatchableCollectionModifier().write(0, list); - for (Player player : DisguiseUtilities.getPerverts(getDisguise())) { - try { + + for (Player player : DisguiseUtilities.getPerverts(getDisguise())) + { + try + { ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(System.out); } } } } - public void setAddEntityAnimations(boolean isEntityAnimationsAdded) { + public void setAddEntityAnimations(boolean isEntityAnimationsAdded) + { this.addEntityAnimations = isEntityAnimationsAdded; } - public void setArmor(ItemStack[] itemstack) { + public void setArmor(ItemStack[] itemstack) + { setItemStack(EquipmentSlot.HEAD, itemstack[0]); setItemStack(EquipmentSlot.CHEST, itemstack[1]); setItemStack(EquipmentSlot.LEGS, itemstack[2]); setItemStack(EquipmentSlot.FEET, itemstack[3]); } - protected void setBackupValue(int no, Object value) { + protected void setBackupValue(int no, Object value) + { backupEntityValues.put(no, value); } - public void setBurning(boolean setBurning) { + public void setBurning(boolean setBurning) + { setEntityFlag(0, setBurning); + sendData(0); } - public void setCustomName(String name) { - if (name != null && name.length() > 64) { + public void setCustomName(String name) + { + if (name != null && name.length() > 64) + { name = name.substring(0, 64); } + setValue(2, name); sendData(2); } - public void setCustomNameVisible(boolean display) { + public void setCustomNameVisible(boolean display) + { setValue(3, display); sendData(3); } - private void setEntityFlag(int byteValue, boolean flag) { + private void setEntityFlag(int byteValue, boolean flag) + { modifiedEntityAnimations.add(byteValue); + byte b0 = (byte) getValue(0, (byte) 0); - if (flag) { + + if (flag) + { setValue(0, (byte) (b0 | 1 << byteValue)); - } else { + } + else + { setValue(0, (byte) (b0 & ~(1 << byteValue))); } } - public void setInvisible(boolean setInvis) { + public void setInvisible(boolean setInvis) + { setEntityFlag(5, setInvis); sendData(0); } - public void setGlowing(boolean glowing) { + public void setGlowing(boolean glowing) + { setEntityFlag(6, glowing); sendData(0); } - public void setFlyingWithElytra(boolean flying) { + public void setFlyingWithElytra(boolean flying) + { setEntityFlag(7, flying); sendData(0); } @@ -346,110 +489,146 @@ public class FlagWatcher { * @param itemstack */ @Deprecated - public void setItemInHand(ItemStack itemstack) { + public void setItemInHand(ItemStack itemstack) + { setItemInMainHand(itemstack); } - public void setItemInMainHand(ItemStack itemstack) { + public void setItemInMainHand(ItemStack itemstack) + { setItemStack(EquipmentSlot.HAND, itemstack); } - public void setItemInOffHand(ItemStack itemstack) { + public void setItemInOffHand(ItemStack itemstack) + { setItemStack(EquipmentSlot.OFF_HAND, itemstack); } - public void setItemStack(EquipmentSlot slot, ItemStack itemStack) { - if (equipment == null) return; + public void setItemStack(EquipmentSlot slot, ItemStack itemStack) + { + if (equipment == null) + return; + // Itemstack which is null means that its not replacing the disguises itemstack. - if (itemStack == null) { + if (itemStack == null) + { // Find the item to replace it with - if (getDisguise().getEntity() instanceof LivingEntity) { + if (getDisguise().getEntity() instanceof LivingEntity) + { EntityEquipment equipment = ((LivingEntity) getDisguise().getEntity()).getEquipment(); setItemStack(equipment, slot, itemStack); } } + Object itemToSend = null; - if (itemStack != null && itemStack.getTypeId() != 0) { + + if (itemStack != null && itemStack.getTypeId() != 0) + { itemToSend = ReflectionManager.getNmsItem(itemStack); } + setItemStack(equipment, slot, itemStack); - if (DisguiseAPI.isDisguiseInUse(getDisguise()) && getDisguise().getWatcher() == this) { + + if (DisguiseAPI.isDisguiseInUse(getDisguise()) && getDisguise().getWatcher() == this) + { PacketContainer packet = new PacketContainer(Server.ENTITY_EQUIPMENT); + StructureModifier mods = packet.getModifier(); + mods.write(0, getDisguise().getEntity().getEntityId()); mods.write(1, ReflectionManager.createEnumItemSlot(slot)); mods.write(2, itemToSend); - for (Player player : DisguiseUtilities.getPerverts(getDisguise())) { - try { + + for (Player player : DisguiseUtilities.getPerverts(getDisguise())) + { + try + { ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(System.out); } } } } - private void setItemStack(EntityEquipment equipment, EquipmentSlot slot, ItemStack itemStack) { - if (equipment == null) return; - switch (slot) { - case CHEST: - equipment.setChestplate(itemStack); - break; - case FEET: - equipment.setBoots(itemStack); - break; - case HAND: - equipment.setItemInMainHand(itemStack); - break; - case HEAD: - equipment.setHelmet(itemStack); - break; - case LEGS: - equipment.setLeggings(itemStack); - break; - case OFF_HAND: - equipment.setItemInOffHand(itemStack); - break; + private void setItemStack(EntityEquipment equipment, EquipmentSlot slot, ItemStack itemStack) + { + if (equipment == null) + return; + + switch (slot) + { + case CHEST: + equipment.setChestplate(itemStack); + break; + case FEET: + equipment.setBoots(itemStack); + break; + case HAND: + equipment.setItemInMainHand(itemStack); + break; + case HEAD: + equipment.setHelmet(itemStack); + break; + case LEGS: + equipment.setLeggings(itemStack); + break; + case OFF_HAND: + equipment.setItemInOffHand(itemStack); + break; } } - public ItemStack getItemStack(EquipmentSlot slot) { - if (equipment == null) return null; - switch (slot) { - case CHEST: - return equipment.getChestplate(); - case FEET: - return equipment.getBoots(); - case HAND: - return equipment.getItemInMainHand(); - case HEAD: - return equipment.getHelmet(); - case LEGS: - return equipment.getLeggings(); - case OFF_HAND: - return equipment.getItemInOffHand(); + public ItemStack getItemStack(EquipmentSlot slot) + { + if (equipment == null) + return null; + + switch (slot) + { + case CHEST: + return equipment.getChestplate(); + case FEET: + return equipment.getBoots(); + case HAND: + return equipment.getItemInMainHand(); + case HEAD: + return equipment.getHelmet(); + case LEGS: + return equipment.getLeggings(); + case OFF_HAND: + return equipment.getItemInOffHand(); } + return null; } - public void setRightClicking(boolean setRightClicking) { + public void setRightClicking(boolean setRightClicking) + { setEntityFlag(4, setRightClicking); sendData(0); } - public void setSneaking(boolean setSneaking) { + public void setSneaking(boolean setSneaking) + { setEntityFlag(1, setSneaking); sendData(0); } - public void setSprinting(boolean setSprinting) { + public void setSprinting(boolean setSprinting) + { setEntityFlag(3, setSprinting); sendData(0); } - protected void setValue(int id, Object value) { + protected void setValue(int id, Object value) + { entityValues.put(id, value); - if (!DisguiseConfig.isMetadataPacketsEnabled()) { + + if (!DisguiseConfig.isMetadataPacketsEnabled()) + { this.rebuildWatchableObjects(); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java rename to src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java index ccdbfc5a..9d0c792d 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java @@ -1,15 +1,16 @@ package me.libraryaddict.disguise.disguisetypes; -import me.libraryaddict.disguise.disguisetypes.watchers.DroppedItemWatcher; -import me.libraryaddict.disguise.disguisetypes.watchers.FallingBlockWatcher; -import me.libraryaddict.disguise.disguisetypes.watchers.PaintingWatcher; -import me.libraryaddict.disguise.disguisetypes.watchers.SplashPotionWatcher; +import java.security.InvalidParameterException; + import org.bukkit.Art; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import java.security.InvalidParameterException; +import me.libraryaddict.disguise.disguisetypes.watchers.DroppedItemWatcher; +import me.libraryaddict.disguise.disguisetypes.watchers.FallingBlockWatcher; +import me.libraryaddict.disguise.disguisetypes.watchers.PaintingWatcher; +import me.libraryaddict.disguise.disguisetypes.watchers.SplashPotionWatcher; public class MiscDisguise extends TargetedDisguise { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/MobDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/MobDisguise.java rename to src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java index 7c430d99..63b1f8e7 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/MobDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java @@ -2,14 +2,14 @@ package me.libraryaddict.disguise.disguisetypes; import java.security.InvalidParameterException; -import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; -import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; -import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; - import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; +import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; +import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; + public class MobDisguise extends TargetedDisguise { private boolean isAdult; diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java rename to src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java index dcf287b7..6cb6a812 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java @@ -1,14 +1,16 @@ package me.libraryaddict.disguise.disguisetypes; +import org.apache.commons.lang.Validate; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; + import com.comphenix.protocol.wrappers.WrappedGameProfile; + import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.LibsProfileLookup; import me.libraryaddict.disguise.utilities.ReflectionManager; -import org.apache.commons.lang.Validate; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; public class PlayerDisguise extends TargetedDisguise { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/RabbitType.java b/src/me/libraryaddict/disguise/disguisetypes/RabbitType.java similarity index 55% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/RabbitType.java rename to src/me/libraryaddict/disguise/disguisetypes/RabbitType.java index 143748a8..0f74e5bf 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/RabbitType.java +++ b/src/me/libraryaddict/disguise/disguisetypes/RabbitType.java @@ -1,25 +1,32 @@ package me.libraryaddict.disguise.disguisetypes; -public enum RabbitType { +public enum RabbitType +{ BLACK(2), BROWN(0), GOLD(4), KILLER_BUNNY(99), PATCHES(3), PEPPER(5), WHITE(1); - public static RabbitType getType(int id) { - for (RabbitType type : values()) { - if (type.getTypeId() == id) { + public static RabbitType getType(int id) + { + for (RabbitType type : values()) + { + if (type.getTypeId() == id) + { return type; } } + return null; } private int type; - RabbitType(int type) { + RabbitType(int type) + { this.type = type; } - public int getTypeId() { + public int getTypeId() + { return type; } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java similarity index 66% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java rename to src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java index 1a21b577..357632c2 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java @@ -1,93 +1,127 @@ package me.libraryaddict.disguise.disguisetypes; -import me.libraryaddict.disguise.DisguiseAPI; -import me.libraryaddict.disguise.utilities.DisguiseUtilities; -import org.bukkit.entity.Player; - import java.util.ArrayList; import java.util.Collections; import java.util.List; -public abstract class TargetedDisguise extends Disguise { +import org.bukkit.entity.Player; - public enum TargetType { +import me.libraryaddict.disguise.DisguiseAPI; +import me.libraryaddict.disguise.utilities.DisguiseUtilities; + +public abstract class TargetedDisguise extends Disguise +{ + + public enum TargetType + { HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS, SHOW_TO_EVERYONE_BUT_THESE_PLAYERS } private List disguiseViewers = new ArrayList<>(); private TargetType targetType = TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS; - public TargetedDisguise addPlayer(Player player) { + public TargetedDisguise addPlayer(Player player) + { addPlayer(player.getName()); + return this; } - public TargetedDisguise addPlayer(String playername) { - if (!disguiseViewers.contains(playername)) { + public TargetedDisguise addPlayer(String playername) + { + if (!disguiseViewers.contains(playername)) + { disguiseViewers.add(playername); - if (DisguiseAPI.isDisguiseInUse(this)) { + + if (DisguiseAPI.isDisguiseInUse(this)) + { DisguiseUtilities.checkConflicts(this, playername); DisguiseUtilities.refreshTracker(this, playername); } } + return this; } - public boolean canSee(Player player) { + public boolean canSee(Player player) + { return canSee(player.getName()); } - public boolean canSee(String playername) { + public boolean canSee(String playername) + { boolean hasPlayer = disguiseViewers.contains(playername); - if (targetType == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { + + if (targetType == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) + { return !hasPlayer; } + return hasPlayer; } - public TargetType getDisguiseTarget() { + public TargetType getDisguiseTarget() + { return targetType; } - public List getObservers() { + public List getObservers() + { return Collections.unmodifiableList(disguiseViewers); } - public TargetedDisguise removePlayer(Player player) { + public TargetedDisguise removePlayer(Player player) + { removePlayer(player.getName()); + return this; } - public TargetedDisguise removePlayer(String playername) { - if (disguiseViewers.contains(playername)) { + public TargetedDisguise removePlayer(String playername) + { + if (disguiseViewers.contains(playername)) + { disguiseViewers.remove(playername); - if (DisguiseAPI.isDisguiseInUse(this)) { + + if (DisguiseAPI.isDisguiseInUse(this)) + { DisguiseUtilities.checkConflicts(this, playername); DisguiseUtilities.refreshTracker(this, playername); } } + return this; } - public TargetedDisguise setDisguiseTarget(TargetType newTargetType) { - if (DisguiseUtilities.isDisguiseInUse(this)) { + public TargetedDisguise setDisguiseTarget(TargetType newTargetType) + { + if (DisguiseUtilities.isDisguiseInUse(this)) + { throw new RuntimeException("Cannot set the disguise target after the entity has been disguised"); } + targetType = newTargetType; + return this; } - public TargetedDisguise silentlyAddPlayer(String playername) { - if (!disguiseViewers.contains(playername)) { + public TargetedDisguise silentlyAddPlayer(String playername) + { + if (!disguiseViewers.contains(playername)) + { disguiseViewers.add(playername); } + return this; } - public TargetedDisguise silentlyRemovePlayer(String playername) { - if (disguiseViewers.contains(playername)) { + public TargetedDisguise silentlyRemovePlayer(String playername) + { + if (disguiseViewers.contains(playername)) + { disguiseViewers.remove(playername); } + return this; } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AgeableWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/AgeableWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AgeableWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/AgeableWatcher.java index e5a1d9f9..bca9192e 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AgeableWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/AgeableWatcher.java @@ -1,8 +1,9 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import me.libraryaddict.disguise.disguisetypes.Disguise; import org.bukkit.entity.Entity; +import me.libraryaddict.disguise.disguisetypes.Disguise; + public class AgeableWatcher extends LivingWatcher { public AgeableWatcher(Disguise disguise) { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.java similarity index 97% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.java index 66f721dd..acfee458 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.java @@ -1,10 +1,10 @@ package me.libraryaddict.disguise.disguisetypes.watchers; +import java.awt.Color; + import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; -import java.awt.*; - /** * @author Navid */ diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.java similarity index 53% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.java index d5562d85..32b7f894 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.java @@ -2,68 +2,85 @@ package me.libraryaddict.disguise.disguisetypes.watchers; import me.libraryaddict.disguise.disguisetypes.Disguise; -public class ArmorStandWatcher extends LivingWatcher { +public class ArmorStandWatcher extends LivingWatcher +{ - public ArmorStandWatcher(Disguise disguise) { + public ArmorStandWatcher(Disguise disguise) + { super(disguise); } - private boolean getArmorStandFlag(int value) { - return ((byte) getValue(10, 0) & value) != 0; + private boolean getArmorStandFlag(int value) + { + return (getValue(10, 0) & value) != 0; } - public boolean isNoBasePlate() { + public boolean isNoBasePlate() + { return getArmorStandFlag(8); } - public boolean isNoGravity() { + public boolean isNoGravity() + { return getArmorStandFlag(2); } - public boolean isShowArms() { + public boolean isShowArms() + { return getArmorStandFlag(4); } - public boolean isSmall() { + public boolean isSmall() + { return getArmorStandFlag(1); } - public boolean isMarker() { + public boolean isMarker() + { return getArmorStandFlag(10); } - private void setArmorStandFlag(int value, boolean isTrue) { + private void setArmorStandFlag(int value, boolean isTrue) + { byte b1 = (byte) getValue(10, (byte) 0); - if (isTrue) { + if (isTrue) + { b1 = (byte) (b1 | value); - } else { + } + else + { b1 = (byte) (b1 & value); } setValue(10, b1); sendData(10); } - public void setNoBasePlate(boolean noBasePlate) { + public void setNoBasePlate(boolean noBasePlate) + { setArmorStandFlag(8, noBasePlate); sendData(10); } - public void setNoGravity(boolean noGravity) { + public void setNoGravity(boolean noGravity) + { setArmorStandFlag(2, noGravity); sendData(10); } - public void setShowArms(boolean showArms) { + public void setShowArms(boolean showArms) + { setArmorStandFlag(4, showArms); sendData(10); } - public void setSmall(boolean isSmall) { + public void setSmall(boolean isSmall) + { setArmorStandFlag(1, isSmall); sendData(10); } - public void setMarker(boolean isMarker) { + public void setMarker(boolean isMarker) + { setArmorStandFlag(10, isMarker); sendData(10); } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.java diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BatWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/BatWatcher.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BatWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/BatWatcher.java diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BlazeWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/BlazeWatcher.java similarity index 58% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BlazeWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/BlazeWatcher.java index 675c7378..6e8d4f57 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BlazeWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/BlazeWatcher.java @@ -2,17 +2,20 @@ package me.libraryaddict.disguise.disguisetypes.watchers; import me.libraryaddict.disguise.disguisetypes.Disguise; -public class BlazeWatcher extends LivingWatcher { - - public BlazeWatcher(Disguise disguise) { +public class BlazeWatcher extends LivingWatcher +{ + public BlazeWatcher(Disguise disguise) + { super(disguise); } - public boolean isBlazing() { + public boolean isBlazing() + { return (boolean) getValue(11, false); } - public void setBlazing(boolean isBlazing) { + public void setBlazing(boolean isBlazing) + { setValue(11, isBlazing); sendData(11); } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BoatWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/BoatWatcher.java similarity index 52% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BoatWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/BoatWatcher.java index e848e5ad..2eca213b 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BoatWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/BoatWatcher.java @@ -3,22 +3,25 @@ package me.libraryaddict.disguise.disguisetypes.watchers; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; -public class BoatWatcher extends FlagWatcher { +public class BoatWatcher extends FlagWatcher +{ - //TODO: Add stuff for new boat values + // TODO: Add stuff for new boat values - public BoatWatcher(Disguise disguise) { + public BoatWatcher(Disguise disguise) + { super(disguise); } - public int getDamage() { - return (int) getValue(7, 40F); + public float getDamage() + { + return getValue(7, 40F); } - public void setDamage(float dmg) { + public void setDamage(float dmg) + { setValue(7, dmg); sendData(7); } - } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/CreeperWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/CreeperWatcher.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/CreeperWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/CreeperWatcher.java diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/DroppedItemWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/DroppedItemWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/DroppedItemWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/DroppedItemWatcher.java index 236a100e..04b28ccf 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/DroppedItemWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/DroppedItemWatcher.java @@ -1,8 +1,9 @@ package me.libraryaddict.disguise.disguisetypes.watchers; +import org.bukkit.inventory.ItemStack; + import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; -import org.bukkit.inventory.ItemStack; //TODO: Add support for custom items instead of just stone public class DroppedItemWatcher extends FlagWatcher { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderCrystalWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/EnderCrystalWatcher.java similarity index 64% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderCrystalWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/EnderCrystalWatcher.java index 4ca31e66..2666d2e3 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderCrystalWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/EnderCrystalWatcher.java @@ -2,35 +2,40 @@ package me.libraryaddict.disguise.disguisetypes.watchers; import com.comphenix.protocol.wrappers.BlockPosition; import com.google.common.base.Optional; + import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; /** * @author Navid */ -public class EnderCrystalWatcher extends FlagWatcher { - - public EnderCrystalWatcher(Disguise disguise) { +public class EnderCrystalWatcher extends FlagWatcher +{ + public EnderCrystalWatcher(Disguise disguise) + { super(disguise); } - public void setBeamTarget(BlockPosition position) { + public void setBeamTarget(BlockPosition position) + { setValue(5, Optional.of(position)); sendData(5); } - public Optional getBeamTarget() { + public Optional getBeamTarget() + { return (Optional) getValue(5, Optional.absent()); } - public void setShowBottom(boolean bool) { + public void setShowBottom(boolean bool) + { setValue(6, bool); sendData(6); } - public boolean isShowBottom() { + public boolean isShowBottom() + { return (boolean) getValue(6, false); } - } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.java diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.java index 7f49b2a3..20daf454 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.java @@ -1,11 +1,13 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import com.google.common.base.Optional; -import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.utilities.ReflectionManager; import org.apache.commons.lang3.tuple.Pair; import org.bukkit.inventory.ItemStack; +import com.google.common.base.Optional; + +import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.utilities.ReflectionManager; + public class EndermanWatcher extends LivingWatcher { public EndermanWatcher(Disguise disguise) { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java index 31faa748..b71ab1ab 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java @@ -1,11 +1,12 @@ package me.libraryaddict.disguise.disguisetypes.watchers; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; import me.libraryaddict.disguise.utilities.DisguiseUtilities; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; public class FallingBlockWatcher extends FlagWatcher { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GhastWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/GhastWatcher.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GhastWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/GhastWatcher.java diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.java index e0a45591..b8a3629c 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.java @@ -1,9 +1,10 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import me.libraryaddict.disguise.disguisetypes.Disguise; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import me.libraryaddict.disguise.disguisetypes.Disguise; + public class GuardianWatcher extends LivingWatcher { public GuardianWatcher(Disguise disguise) { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/HorseWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/HorseWatcher.java similarity index 52% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/HorseWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/HorseWatcher.java index d1fec1fa..3e8fe68d 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/HorseWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/HorseWatcher.java @@ -1,177 +1,222 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import com.google.common.base.Optional; -import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.utilities.DisguiseUtilities; +import java.util.UUID; + import org.bukkit.Material; import org.bukkit.entity.Horse.Color; import org.bukkit.entity.Horse.Style; import org.bukkit.entity.Horse.Variant; import org.bukkit.inventory.ItemStack; -import java.util.UUID; +import com.google.common.base.Optional; -public class HorseWatcher extends AgeableWatcher { +import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.utilities.DisguiseUtilities; - public HorseWatcher(Disguise disguise) { +public class HorseWatcher extends AgeableWatcher +{ + + public HorseWatcher(Disguise disguise) + { super(disguise); setStyle(Style.values()[DisguiseUtilities.random.nextInt(Style.values().length)]); setColor(Color.values()[DisguiseUtilities.random.nextInt(Color.values().length)]); } - public Variant getVariant() { + public Variant getVariant() + { return Variant.values()[(int) getValue(13, 0)]; } - public void setVariant(Variant variant) { + public void setVariant(Variant variant) + { setVariant(variant.ordinal()); } - public void setVariant(int variant) { - if (variant < 0 || variant > 4) { - variant = 0; //Crashing people is mean + public void setVariant(int variant) + { + if (variant < 0 || variant > 4) + { + variant = 0; // Crashing people is mean } setValue(13, variant); sendData(13); } - public Color getColor() { + public Color getColor() + { return Color.values()[((Integer) getValue(14, 0) & 0xFF)]; } - public ItemStack getHorseArmor() { + public ItemStack getHorseArmor() + { int horseValue = getHorseArmorAsInt(); - switch (horseValue) { - case 1: - return new ItemStack(Material.getMaterial("IRON_BARDING")); - case 2: - return new ItemStack(Material.getMaterial("GOLD_BARDING")); - case 3: - return new ItemStack(Material.getMaterial("DIAMOND_BARDING")); - default: - break; + switch (horseValue) + { + case 1: + return new ItemStack(Material.getMaterial("IRON_BARDING")); + case 2: + return new ItemStack(Material.getMaterial("GOLD_BARDING")); + case 3: + return new ItemStack(Material.getMaterial("DIAMOND_BARDING")); + default: + break; } return null; } - protected int getHorseArmorAsInt() { + protected int getHorseArmorAsInt() + { return (int) getValue(16, 0); } - public Optional getOwner() { - return (Optional) getValue(15, Optional.absent()); + public Optional getOwner() + { + return getValue(15, Optional. absent()); } - public Style getStyle() { + public Style getStyle() + { return Style.values()[((int) getValue(14, 0) >>> 8)]; } - public boolean hasChest() { + public boolean hasChest() + { return isHorseFlag(8); } - public boolean isBreedable() { + public boolean isBreedable() + { return isHorseFlag(16); } - public boolean isGrazing() { + public boolean isGrazing() + { return isHorseFlag(32); } - public boolean isMouthOpen() { + public boolean isMouthOpen() + { return isHorseFlag(128); } - public boolean isRearing() { + public boolean isRearing() + { return isHorseFlag(64); } - public boolean isSaddled() { + public boolean isSaddled() + { return isHorseFlag(4); } - public boolean isTamed() { + public boolean isTamed() + { return isHorseFlag(2); } - private boolean isHorseFlag(int i) { + private boolean isHorseFlag(int i) + { return (getHorseFlag() & i) != 0; } - private byte getHorseFlag() { + private byte getHorseFlag() + { return (byte) getValue(12, (byte) 0); } - public void setCanBreed(boolean breed) { + public void setCanBreed(boolean breed) + { setHorseFlag(16, breed); } - public void setCarryingChest(boolean chest) { + public void setCarryingChest(boolean chest) + { setHorseFlag(8, chest); } - public void setColor(Color color) { + public void setColor(Color color) + { setValue(14, color.ordinal() & 0xFF | getStyle().ordinal() << 8); sendData(14); } - private void setHorseFlag(int i, boolean flag) { + private void setHorseFlag(int i, boolean flag) + { byte j = (byte) getValue(12, (byte) 0); - if (flag) { + if (flag) + { setValue(12, (byte) (j | i)); - } else { + } + else + { setValue(12, (byte) (j & ~i)); } sendData(12); } - public void setGrazing(boolean grazing) { + public void setGrazing(boolean grazing) + { setHorseFlag(32, grazing); } - protected void setHorseArmor(int armor) { + protected void setHorseArmor(int armor) + { setValue(16, armor); sendData(16); } - public void setHorseArmor(ItemStack item) { + public void setHorseArmor(ItemStack item) + { int value = 0; - if (item != null) { + if (item != null) + { Material mat = item.getType(); - if (mat == Material.IRON_BARDING) { + if (mat == Material.IRON_BARDING) + { value = 1; - } else if (mat == Material.GOLD_BARDING) { + } + else if (mat == Material.GOLD_BARDING) + { value = 2; - } else if (mat == Material.DIAMOND_BARDING) { + } + else if (mat == Material.DIAMOND_BARDING) + { value = 3; } } setHorseArmor(value); } - public void setMouthOpen(boolean mouthOpen) { + public void setMouthOpen(boolean mouthOpen) + { setHorseFlag(128, mouthOpen); } - public void setOwner(UUID uuid) { + public void setOwner(UUID uuid) + { setValue(15, Optional.of(uuid)); sendData(15); } - public void setRearing(boolean rear) { + public void setRearing(boolean rear) + { setHorseFlag(64, rear); } - public void setSaddled(boolean saddled) { + public void setSaddled(boolean saddled) + { setHorseFlag(4, saddled); } - public void setStyle(Style style) { + public void setStyle(Style style) + { setValue(14, getColor().ordinal() & 0xFF | style.ordinal() << 8); sendData(14); } - public void setTamed(boolean tamed) { + public void setTamed(boolean tamed) + { setHorseFlag(2, tamed); } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ItemFrameWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/ItemFrameWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ItemFrameWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/ItemFrameWatcher.java index a6483d51..cccd5881 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ItemFrameWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/ItemFrameWatcher.java @@ -1,8 +1,9 @@ package me.libraryaddict.disguise.disguisetypes.watchers; +import org.bukkit.inventory.ItemStack; + import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; -import org.bukkit.inventory.ItemStack; public class ItemFrameWatcher extends FlagWatcher { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java similarity index 73% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java index b0a3609b..b237018c 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java @@ -1,19 +1,5 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import com.comphenix.protocol.PacketType.Play.Server; -import com.comphenix.protocol.ProtocolLibrary; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.wrappers.WrappedAttribute; -import com.comphenix.protocol.wrappers.WrappedAttribute.Builder; -import me.libraryaddict.disguise.DisguiseAPI; -import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.disguisetypes.FlagWatcher; -import me.libraryaddict.disguise.utilities.DisguiseUtilities; -import me.libraryaddict.disguise.utilities.ReflectionManager; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.potion.PotionEffectType; - import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; @@ -22,64 +8,98 @@ import java.util.HashSet; import java.util.List; import java.util.Map; -public class LivingWatcher extends FlagWatcher { +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffectType; + +import com.comphenix.protocol.PacketType.Play.Server; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.wrappers.WrappedAttribute; +import com.comphenix.protocol.wrappers.WrappedAttribute.Builder; + +import me.libraryaddict.disguise.DisguiseAPI; +import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.FlagWatcher; +import me.libraryaddict.disguise.utilities.DisguiseUtilities; +import me.libraryaddict.disguise.utilities.ReflectionManager; + +public class LivingWatcher extends FlagWatcher +{ static Map list = new HashMap<>(); static Method getId; - static { - try { + static + { + try + { getId = ReflectionManager.getNmsMethod("MobEffectList", "getId", ReflectionManager.getNmsClass("MobEffectList")); Object REGISTRY = ReflectionManager.getNmsField("MobEffectList", "REGISTRY").get(null); - for (Object next: ((Iterable)REGISTRY)) { + for (Object next : ((Iterable) REGISTRY)) + { int id = (int) getId.invoke(null, next); list.put(id, next); } - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } } + private double maxHealth; private boolean maxHealthSet; private HashSet potionEffects = new HashSet<>(); - public LivingWatcher(Disguise disguise) { + public LivingWatcher(Disguise disguise) + { super(disguise); } - public void addPotionEffect(PotionEffectType potionEffect) { - if (!hasPotionEffect(potionEffect)) { + public void addPotionEffect(PotionEffectType potionEffect) + { + if (!hasPotionEffect(potionEffect)) + { removePotionEffect(potionEffect); potionEffects.add(potionEffect.getId()); + sendPotionEffects(); } } @Override - public LivingWatcher clone(Disguise disguise) { + public LivingWatcher clone(Disguise disguise) + { LivingWatcher clone = (LivingWatcher) super.clone(disguise); clone.potionEffects = (HashSet) potionEffects.clone(); clone.maxHealth = maxHealth; clone.maxHealthSet = maxHealthSet; + return clone; } - public float getHealth() { + public float getHealth() + { return (float) getValue(6, 0F); } - public double getMaxHealth() { + public double getMaxHealth() + { return maxHealth; } - public boolean isPotionParticlesAmbient() { + public boolean isPotionParticlesAmbient() + { return (boolean) getValue(8, false); } - private int getPotions() { + private int getPotions() + { int m = 3694022; - if (potionEffects.isEmpty()) { + if (potionEffects.isEmpty()) + { return m; } @@ -87,15 +107,19 @@ public class LivingWatcher extends FlagWatcher { float f2 = 0.0F; float f3 = 0.0F; float f4 = 0.0F; - try { - for (int localMobEffect : potionEffects) { + try + { + for (int localMobEffect : potionEffects) + { int n = (Integer) getId.invoke(list.get(localMobEffect)); f1 += (n >> 16 & 0xFF) / 255.0F; f2 += (n >> 8 & 0xFF) / 255.0F; f3 += (n & 0xFF) / 255.0F; f4 += 1.0F; } - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } @@ -106,64 +130,86 @@ public class LivingWatcher extends FlagWatcher { return (int) f1 << 16 | (int) f2 << 8 | (int) f3; } - public boolean hasPotionEffect(PotionEffectType type) { + public boolean hasPotionEffect(PotionEffectType type) + { return potionEffects.contains(type.getId()); } - public boolean isMaxHealthSet() { + public boolean isMaxHealthSet() + { return maxHealthSet; } - public void removePotionEffect(PotionEffectType type) { - if (potionEffects.contains(type.getId())) { + public void removePotionEffect(PotionEffectType type) + { + if (potionEffects.contains(type.getId())) + { potionEffects.remove(type.getId()); sendPotionEffects(); } } - public void setPotionParticlesAmbient(boolean particles) { + public void setPotionParticlesAmbient(boolean particles) + { setValue(8, particles); sendData(8); } - private void sendPotionEffects() { + private void sendPotionEffects() + { setValue(7, getPotions()); sendData(7); } - public void setHealth(float health) { + public void setHealth(float health) + { setValue(6, health); sendData(6); } - public int getArrowsSticking() { + public int getArrowsSticking() + { return (int) getValue(9, 0); } - public void setArrowsSticking(int arrowsNo) { + public void setArrowsSticking(int arrowsNo) + { setValue(9, arrowsNo); sendData(9); } - public void setMaxHealth(double newHealth) { + public void setMaxHealth(double newHealth) + { this.maxHealth = newHealth; this.maxHealthSet = true; - if (DisguiseAPI.isDisguiseInUse(getDisguise()) && getDisguise().getWatcher() == this) { + + if (DisguiseAPI.isDisguiseInUse(getDisguise()) && getDisguise().getWatcher() == this) + { PacketContainer packet = new PacketContainer(Server.UPDATE_ATTRIBUTES); + List attributes = new ArrayList<>(); + Builder builder; builder = WrappedAttribute.newBuilder(); builder.attributeKey("generic.maxHealth"); builder.baseValue(getMaxHealth()); builder.packet(packet); + attributes.add(builder.build()); + Entity entity = getDisguise().getEntity(); + packet.getIntegers().write(0, entity.getEntityId()); packet.getAttributeCollectionModifier().write(0, attributes); - for (Player player : DisguiseUtilities.getPerverts(getDisguise())) { - try { + + for (Player player : DisguiseUtilities.getPerverts(getDisguise())) + { + try + { ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, false); - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(System.out); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/MinecartWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/MinecartWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/MinecartWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/MinecartWatcher.java index 8cf490d9..58a13562 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/MinecartWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/MinecartWatcher.java @@ -1,8 +1,9 @@ package me.libraryaddict.disguise.disguisetypes.watchers; +import org.bukkit.inventory.ItemStack; + import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; -import org.bukkit.inventory.ItemStack; public class MinecartWatcher extends FlagWatcher { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/OcelotWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/OcelotWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/OcelotWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/OcelotWatcher.java index 70450436..83a71d1d 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/OcelotWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/OcelotWatcher.java @@ -1,9 +1,10 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import me.libraryaddict.disguise.disguisetypes.Disguise; import org.bukkit.entity.Ocelot; import org.bukkit.entity.Ocelot.Type; +import me.libraryaddict.disguise.disguisetypes.Disguise; + public class OcelotWatcher extends TameableWatcher { public OcelotWatcher(Disguise disguise) { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PaintingWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/PaintingWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PaintingWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/PaintingWatcher.java index 944c66cb..9d72b060 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PaintingWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/PaintingWatcher.java @@ -1,9 +1,10 @@ package me.libraryaddict.disguise.disguisetypes.watchers; +import org.bukkit.Art; + import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; import me.libraryaddict.disguise.utilities.DisguiseUtilities; -import org.bukkit.Art; public class PaintingWatcher extends FlagWatcher { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PigWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/PigWatcher.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PigWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/PigWatcher.java diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PlayerWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/PlayerWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PlayerWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/PlayerWatcher.java index 348b218d..3e9ab94c 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PlayerWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/PlayerWatcher.java @@ -1,17 +1,19 @@ package me.libraryaddict.disguise.disguisetypes.watchers; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; + import com.comphenix.protocol.PacketType.Play.Server; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.reflect.StructureModifier; import com.comphenix.protocol.wrappers.WrappedGameProfile; + import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; import me.libraryaddict.disguise.utilities.DisguiseUtilities; -import org.bukkit.block.BlockFace; -import org.bukkit.entity.Player; public class PlayerWatcher extends LivingWatcher { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/RabbitWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/RabbitWatcher.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/RabbitWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/RabbitWatcher.java diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.java index 6231a3e4..204ef3c3 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.java @@ -1,8 +1,9 @@ package me.libraryaddict.disguise.disguisetypes.watchers; +import org.bukkit.DyeColor; + import me.libraryaddict.disguise.disguisetypes.AnimalColor; import me.libraryaddict.disguise.disguisetypes.Disguise; -import org.bukkit.DyeColor; public class SheepWatcher extends AgeableWatcher { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.java index b41add41..a5e7fb5a 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.java @@ -1,9 +1,11 @@ package me.libraryaddict.disguise.disguisetypes.watchers; +import org.bukkit.block.BlockFace; + import com.comphenix.protocol.wrappers.BlockPosition; import com.google.common.base.Optional; + import me.libraryaddict.disguise.disguisetypes.Disguise; -import org.bukkit.block.BlockFace; /** * @author Navid diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SkeletonWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/SkeletonWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SkeletonWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/SkeletonWatcher.java index ad010ad5..26910584 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SkeletonWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/SkeletonWatcher.java @@ -1,8 +1,9 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import me.libraryaddict.disguise.disguisetypes.Disguise; import org.bukkit.entity.Skeleton.SkeletonType; +import me.libraryaddict.disguise.disguisetypes.Disguise; + /** * @author Navid */ diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SlimeWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/SlimeWatcher.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SlimeWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/SlimeWatcher.java diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SplashPotionWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/SplashPotionWatcher.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SplashPotionWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/SplashPotionWatcher.java diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TameableWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/TameableWatcher.java similarity index 54% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TameableWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/TameableWatcher.java index dfeb5344..1135d890 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TameableWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/TameableWatcher.java @@ -1,52 +1,66 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import com.google.common.base.Optional; -import me.libraryaddict.disguise.disguisetypes.Disguise; - import java.util.UUID; -public class TameableWatcher extends AgeableWatcher { +import com.google.common.base.Optional; - public TameableWatcher(Disguise disguise) { +import me.libraryaddict.disguise.disguisetypes.Disguise; + +public class TameableWatcher extends AgeableWatcher +{ + + public TameableWatcher(Disguise disguise) + { super(disguise); } - public Optional getOwner() { - return (Optional) getValue(13, Optional.absent()); + public Optional getOwner() + { + return getValue(13, Optional. absent()); } - public boolean isSitting() { + public boolean isSitting() + { return isTameableFlag(1); } - public boolean isTamed() { + public boolean isTamed() + { return isTameableFlag(4); } - protected boolean isTameableFlag(int no) { + protected boolean isTameableFlag(int no) + { return ((byte) getValue(12, (byte) 0) & no) != 0; } - protected void setTameableFlag(int no, boolean flag) { + protected void setTameableFlag(int no, boolean flag) + { byte value = (byte) getValue(12, (byte) 0); - if (flag) { + if (flag) + { setValue(12, (byte) (value | no)); - } else { + } + else + { setValue(12, (byte) (value & -(no + 1))); } sendData(12); } - public void setOwner(UUID owner) { + public void setOwner(UUID owner) + { setValue(13, Optional.of(owner)); sendData(13); } - public void setSitting(boolean sitting) { + public void setSitting(boolean sitting) + { setTameableFlag(1, sitting); } - public void setTamed(boolean tamed) { + public void setTamed(boolean tamed) + { setTameableFlag(4, tamed); } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java index 953b54e2..121e5fb0 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java @@ -1,8 +1,9 @@ package me.libraryaddict.disguise.disguisetypes.watchers; +import org.bukkit.Color; + import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.utilities.DisguiseUtilities; -import org.bukkit.Color; /** * @author Navid diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.java index 91f46e85..96ab0f89 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.java @@ -1,8 +1,9 @@ package me.libraryaddict.disguise.disguisetypes.watchers; +import org.bukkit.entity.Villager.Profession; + import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.utilities.DisguiseUtilities; -import org.bukkit.entity.Villager.Profession; public class VillagerWatcher extends AgeableWatcher { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitchWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/WitchWatcher.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitchWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/WitchWatcher.java diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitherSkullWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/WitherSkullWatcher.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitherSkullWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/WitherSkullWatcher.java diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitherWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/WitherWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitherWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/WitherWatcher.java index fb482c34..3414f15e 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitherWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/WitherWatcher.java @@ -1,9 +1,10 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import me.libraryaddict.disguise.disguisetypes.Disguise; +import java.security.InvalidParameterException; + import org.bukkit.ChatColor; -import java.security.InvalidParameterException; +import me.libraryaddict.disguise.disguisetypes.Disguise; public class WitherWatcher extends LivingWatcher { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.java index 1f35bc01..b881df27 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.java @@ -1,8 +1,9 @@ package me.libraryaddict.disguise.disguisetypes.watchers; +import org.bukkit.DyeColor; + import me.libraryaddict.disguise.disguisetypes.AnimalColor; import me.libraryaddict.disguise.disguisetypes.Disguise; -import org.bukkit.DyeColor; public class WolfWatcher extends TameableWatcher { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.java index 09ca4537..039db9ea 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.java @@ -1,8 +1,9 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import me.libraryaddict.disguise.disguisetypes.Disguise; import org.bukkit.entity.Villager.Profession; +import me.libraryaddict.disguise.disguisetypes.Disguise; + public class ZombieWatcher extends LivingWatcher { public ZombieWatcher(Disguise disguise) { diff --git a/src/main/java/me/libraryaddict/disguise/events/DisguiseEvent.java b/src/me/libraryaddict/disguise/events/DisguiseEvent.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/events/DisguiseEvent.java rename to src/me/libraryaddict/disguise/events/DisguiseEvent.java index 1f6ea041..c8d99951 100644 --- a/src/main/java/me/libraryaddict/disguise/events/DisguiseEvent.java +++ b/src/me/libraryaddict/disguise/events/DisguiseEvent.java @@ -1,12 +1,12 @@ package me.libraryaddict.disguise.events; -import me.libraryaddict.disguise.disguisetypes.Disguise; - import org.bukkit.entity.Entity; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; +import me.libraryaddict.disguise.disguisetypes.Disguise; + public class DisguiseEvent extends Event implements Cancellable { private static final HandlerList handlers = new HandlerList(); diff --git a/src/main/java/me/libraryaddict/disguise/events/UndisguiseEvent.java b/src/me/libraryaddict/disguise/events/UndisguiseEvent.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/events/UndisguiseEvent.java rename to src/me/libraryaddict/disguise/events/UndisguiseEvent.java index 1ae228d6..4296f55f 100644 --- a/src/main/java/me/libraryaddict/disguise/events/UndisguiseEvent.java +++ b/src/me/libraryaddict/disguise/events/UndisguiseEvent.java @@ -1,12 +1,12 @@ package me.libraryaddict.disguise.events; -import me.libraryaddict.disguise.disguisetypes.Disguise; - import org.bukkit.entity.Entity; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; +import me.libraryaddict.disguise.disguisetypes.Disguise; + public class UndisguiseEvent extends Event implements Cancellable { private static final HandlerList handlers = new HandlerList(); diff --git a/src/main/java/me/libraryaddict/disguise/utilities/ClassGetter.java b/src/me/libraryaddict/disguise/utilities/ClassGetter.java similarity index 78% rename from src/main/java/me/libraryaddict/disguise/utilities/ClassGetter.java rename to src/me/libraryaddict/disguise/utilities/ClassGetter.java index a05dd781..f1018a63 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/ClassGetter.java +++ b/src/me/libraryaddict/disguise/utilities/ClassGetter.java @@ -1,7 +1,5 @@ package me.libraryaddict.disguise.utilities; -import org.bukkit.entity.Entity; - import java.net.URL; import java.net.URLDecoder; import java.security.CodeSource; @@ -10,60 +8,81 @@ import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import org.bukkit.entity.Entity; + /** * User: Austin Date: 4/22/13 Time: 11:47 PM (c) lazertester */ // Code for this taken and slightly modified from // https://github.com/ddopson/java-class-enumerator -public class ClassGetter { +public class ClassGetter +{ - public static ArrayList> getClassesForPackage(String pkgname) { + public static ArrayList> getClassesForPackage(String pkgname) + { ArrayList> classes = new ArrayList<>(); // String relPath = pkgname.replace('.', '/'); // Get a File object for the package CodeSource src = Entity.class.getProtectionDomain().getCodeSource(); - if (src != null) { + + if (src != null) + { URL resource = src.getLocation(); resource.getPath(); processJarfile(resource, pkgname, classes); } + return classes; } - private static Class loadClass(String className) { - try { + private static Class loadClass(String className) + { + try + { return Class.forName(className); - } catch (ClassNotFoundException e) { + } + catch (ClassNotFoundException e) + { throw new RuntimeException("Unexpected ClassNotFoundException loading class '" + className + "'"); - } catch (NoClassDefFoundError e) { + } + catch (NoClassDefFoundError e) + { return null; } } - private static void processJarfile(URL resource, String pkgname, ArrayList> classes) { - try { + private static void processJarfile(URL resource, String pkgname, ArrayList> classes) + { + try + { String relPath = pkgname.replace('.', '/'); String resPath = URLDecoder.decode(resource.getPath(), "UTF-8"); String jarPath = resPath.replaceFirst("[.]jar[!].*", ".jar").replaceFirst("file:", ""); JarFile jarFile = new JarFile(jarPath); Enumeration entries = jarFile.entries(); - while (entries.hasMoreElements()) { + while (entries.hasMoreElements()) + { JarEntry entry = entries.nextElement(); String entryName = entry.getName(); String className = null; if (entryName.endsWith(".class") && entryName.startsWith(relPath) - && entryName.length() > (relPath.length() + "/".length())) { + && entryName.length() > (relPath.length() + "/".length())) + { className = entryName.replace('/', '.').replace('\\', '.').replace(".class", ""); } - if (className != null) { + if (className != null) + { Class c = loadClass(className); - if (c != null) { + if (c != null) + { classes.add(c); } } } - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseSound.java b/src/me/libraryaddict/disguise/utilities/DisguiseSound.java similarity index 52% rename from src/main/java/me/libraryaddict/disguise/utilities/DisguiseSound.java rename to src/me/libraryaddict/disguise/utilities/DisguiseSound.java index 82a3a561..cf9a17b8 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseSound.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseSound.java @@ -1,87 +1,145 @@ package me.libraryaddict.disguise.utilities; -import org.bukkit.Sound; - import java.util.HashMap; import java.util.HashSet; +import org.bukkit.Sound; + /** * Only living disguises go in here! */ -public enum DisguiseSound { +public enum DisguiseSound +{ ARROW(null, null, null, null, Sound.ENTITY_ARROW_HIT, Sound.ENTITY_ARROW_SHOOT), - BAT(Sound.ENTITY_BAT_HURT, null, Sound.ENTITY_BAT_DEATH, Sound.ENTITY_BAT_AMBIENT, Sound.ENTITY_PLAYER_SMALL_FALL, Sound.ENTITY_BAT_LOOP, Sound.ENTITY_PLAYER_BIG_FALL, - Sound.ENTITY_BAT_TAKEOFF), - BLAZE(Sound.ENTITY_BLAZE_HURT, null, Sound.ENTITY_BLAZE_DEATH, Sound.ENTITY_BLAZE_AMBIENT, Sound.ENTITY_PLAYER_SMALL_FALL, Sound.ENTITY_PLAYER_BIG_FALL), + + BAT(Sound.ENTITY_BAT_HURT, null, Sound.ENTITY_BAT_DEATH, Sound.ENTITY_BAT_AMBIENT, Sound.ENTITY_PLAYER_SMALL_FALL, + Sound.ENTITY_BAT_LOOP, Sound.ENTITY_PLAYER_BIG_FALL, Sound.ENTITY_BAT_TAKEOFF), + + BLAZE(Sound.ENTITY_BLAZE_HURT, null, Sound.ENTITY_BLAZE_DEATH, Sound.ENTITY_BLAZE_AMBIENT, Sound.ENTITY_PLAYER_SMALL_FALL, + Sound.ENTITY_PLAYER_BIG_FALL), + CAVE_SPIDER(Sound.ENTITY_SPIDER_AMBIENT, Sound.ENTITY_SPIDER_STEP, Sound.ENTITY_SPIDER_DEATH, Sound.ENTITY_SPIDER_AMBIENT), - CHICKEN(Sound.ENTITY_CHICKEN_HURT, Sound.ENTITY_CHICKEN_STEP, Sound.ENTITY_CHICKEN_HURT, Sound.ENTITY_CHICKEN_AMBIENT, Sound.ENTITY_PLAYER_SMALL_FALL, - Sound.ENTITY_CHICKEN_EGG, Sound.ENTITY_PLAYER_BIG_FALL), + + CHICKEN(Sound.ENTITY_CHICKEN_HURT, Sound.ENTITY_CHICKEN_STEP, Sound.ENTITY_CHICKEN_HURT, Sound.ENTITY_CHICKEN_AMBIENT, + Sound.ENTITY_PLAYER_SMALL_FALL, Sound.ENTITY_CHICKEN_EGG, Sound.ENTITY_PLAYER_BIG_FALL), + COW(Sound.ENTITY_COW_HURT, Sound.ENTITY_COW_STEP, Sound.ENTITY_COW_DEATH, Sound.ENTITY_COW_AMBIENT), + CREEPER(Sound.ENTITY_CREEPER_HURT, "step.grass", Sound.ENTITY_CREEPER_DEATH, null), - DONKEY(Sound.ENTITY_DONKEY_HURT, "step.grass", Sound.ENTITY_DONKEY_DEATH, Sound.ENTITY_DONKEY_AMBIENT, Sound.ENTITY_HORSE_GALLOP, - Sound.ENTITY_HORSE_SADDLE, Sound.ENTITY_DONKEY_ANGRY, Sound.ENTITY_HORSE_STEP_WOOD, Sound.ENTITY_HORSE_ARMOR, - Sound.ENTITY_HORSE_LAND, Sound.ENTITY_HORSE_JUMP, Sound.ENTITY_HORSE_ANGRY), - ELDER_GUARDIAN(Sound.ENTITY_ELDER_GUARDIAN_HURT, null, Sound.ENTITY_ELDER_GUARDIAN_DEATH, Sound.ENTITY_ELDER_GUARDIAN_AMBIENT), - ENDER_DRAGON(Sound.ENTITY_ENDERDRAGON_HURT, null, Sound.ENTITY_ENDERDRAGON_DEATH, Sound.ENTITY_ENDERDRAGON_AMBIENT, Sound.ENTITY_PLAYER_SMALL_FALL, - Sound.ENTITY_ENDERDRAGON_FLAP, Sound.ENTITY_PLAYER_BIG_FALL), - ENDERMAN(Sound.ENTITY_ENDERMEN_HURT, "step.grass", Sound.ENTITY_ENDERMEN_DEATH, Sound.ENTITY_ENDERMEN_AMBIENT, Sound.ENTITY_ENDERMEN_SCREAM, - Sound.ENTITY_ENDERMEN_TELEPORT, Sound.ENTITY_ENDERMEN_STARE), - ENDERMITE(Sound.ENTITY_SILVERFISH_HURT, Sound.ENTITY_ENDERMITE_STEP, Sound.ENTITY_ENDERMITE_DEATH, Sound.ENTITY_ENDERMITE_AMBIENT), - GHAST(Sound.ENTITY_GHAST_HURT, null, Sound.ENTITY_GHAST_DEATH, Sound.ENTITY_GHAST_AMBIENT, Sound.ENTITY_PLAYER_SMALL_FALL, Sound.ENTITY_GHAST_SHOOT, - Sound.ENTITY_PLAYER_BIG_FALL, Sound.ENTITY_GHAST_SCREAM, Sound.ENTITY_GHAST_WARN), + + DONKEY(Sound.ENTITY_DONKEY_HURT, "step.grass", Sound.ENTITY_DONKEY_DEATH, Sound.ENTITY_DONKEY_AMBIENT, + Sound.ENTITY_HORSE_GALLOP, Sound.ENTITY_HORSE_SADDLE, Sound.ENTITY_DONKEY_ANGRY, Sound.ENTITY_HORSE_STEP_WOOD, + Sound.ENTITY_HORSE_ARMOR, Sound.ENTITY_HORSE_LAND, Sound.ENTITY_HORSE_JUMP, Sound.ENTITY_HORSE_ANGRY), + + ELDER_GUARDIAN(Sound.ENTITY_ELDER_GUARDIAN_HURT, null, Sound.ENTITY_ELDER_GUARDIAN_DEATH, + Sound.ENTITY_ELDER_GUARDIAN_AMBIENT), + + ENDER_DRAGON(Sound.ENTITY_ENDERDRAGON_HURT, null, Sound.ENTITY_ENDERDRAGON_DEATH, Sound.ENTITY_ENDERDRAGON_AMBIENT, + Sound.ENTITY_PLAYER_SMALL_FALL, Sound.ENTITY_ENDERDRAGON_FLAP, Sound.ENTITY_PLAYER_BIG_FALL), + + ENDERMAN(Sound.ENTITY_ENDERMEN_HURT, "step.grass", Sound.ENTITY_ENDERMEN_DEATH, Sound.ENTITY_ENDERMEN_AMBIENT, + Sound.ENTITY_ENDERMEN_SCREAM, Sound.ENTITY_ENDERMEN_TELEPORT, Sound.ENTITY_ENDERMEN_STARE), + + ENDERMITE(Sound.ENTITY_SILVERFISH_HURT, Sound.ENTITY_ENDERMITE_STEP, Sound.ENTITY_ENDERMITE_DEATH, + Sound.ENTITY_ENDERMITE_AMBIENT), + + GHAST(Sound.ENTITY_GHAST_HURT, null, Sound.ENTITY_GHAST_DEATH, Sound.ENTITY_GHAST_AMBIENT, Sound.ENTITY_PLAYER_SMALL_FALL, + Sound.ENTITY_GHAST_SHOOT, Sound.ENTITY_PLAYER_BIG_FALL, Sound.ENTITY_GHAST_SCREAM, Sound.ENTITY_GHAST_WARN), + GIANT(Sound.ENTITY_PLAYER_HURT, "step.grass", null, null), + GUARDIAN(Sound.ENTITY_GUARDIAN_HURT, null, Sound.ENTITY_GUARDIAN_DEATH, Sound.ENTITY_ELDER_GUARDIAN_AMBIENT), + HORSE(Sound.ENTITY_HORSE_HURT, "step.grass", Sound.ENTITY_HORSE_DEATH, Sound.ENTITY_HORSE_AMBIENT, Sound.ENTITY_HORSE_GALLOP, Sound.ENTITY_HORSE_SADDLE, Sound.ENTITY_DONKEY_ANGRY, Sound.ENTITY_HORSE_STEP_WOOD, Sound.ENTITY_HORSE_ARMOR, Sound.ENTITY_HORSE_LAND, Sound.ENTITY_HORSE_JUMP, Sound.ENTITY_HORSE_ANGRY), - IRON_GOLEM(Sound.ENTITY_IRONGOLEM_HURT, Sound.ENTITY_IRONGOLEM_STEP, Sound.ENTITY_IRONGOLEM_DEATH, Sound.ENTITY_IRONGOLEM_ATTACK), + + IRON_GOLEM(Sound.ENTITY_IRONGOLEM_HURT, Sound.ENTITY_IRONGOLEM_STEP, Sound.ENTITY_IRONGOLEM_DEATH, + Sound.ENTITY_IRONGOLEM_ATTACK), + MAGMA_CUBE(Sound.ENTITY_MAGMACUBE_HURT, Sound.ENTITY_MAGMACUBE_JUMP, null, null), + MULE(Sound.ENTITY_MULE_HURT, "step.grass", Sound.ENTITY_MULE_DEATH, Sound.ENTITY_MULE_AMBIENT), + MUSHROOM_COW(Sound.ENTITY_COW_HURT, Sound.ENTITY_COW_STEP, Sound.ENTITY_COW_HURT, Sound.ENTITY_COW_AMBIENT), - OCELOT(Sound.ENTITY_CAT_HURT, "step.grass", Sound.ENTITY_CAT_HURT, Sound.ENTITY_CAT_AMBIENT, Sound.ENTITY_CAT_PURR, Sound.ENTITY_CAT_PURREOW), + + OCELOT(Sound.ENTITY_CAT_HURT, "step.grass", Sound.ENTITY_CAT_HURT, Sound.ENTITY_CAT_AMBIENT, Sound.ENTITY_CAT_PURR, + Sound.ENTITY_CAT_PURREOW), + PIG(Sound.ENTITY_PIG_HURT, Sound.ENTITY_PIG_STEP, Sound.ENTITY_PIG_DEATH, Sound.ENTITY_PIG_AMBIENT), - PIG_ZOMBIE(Sound.ENTITY_ZOMBIE_PIG_HURT, null, Sound.ENTITY_ZOMBIE_PIG_DEATH, Sound.ENTITY_ZOMBIE_PIG_AMBIENT, Sound.ENTITY_ZOMBIE_PIG_ANGRY), + + PIG_ZOMBIE(Sound.ENTITY_ZOMBIE_PIG_HURT, null, Sound.ENTITY_ZOMBIE_PIG_DEATH, Sound.ENTITY_ZOMBIE_PIG_AMBIENT, + Sound.ENTITY_ZOMBIE_PIG_ANGRY), + PLAYER(Sound.ENTITY_PLAYER_HURT, "step.grass", Sound.ENTITY_PLAYER_DEATH, null), + RABBIT(Sound.ENTITY_RABBIT_HURT, Sound.ENTITY_RABBIT_JUMP, Sound.ENTITY_RABBIT_DEATH, Sound.ENTITY_RABBIT_AMBIENT), + SHEEP(Sound.ENTITY_SHEEP_HURT, Sound.ENTITY_SHEEP_STEP, null, Sound.ENTITY_SHEEP_AMBIENT, Sound.ENTITY_SHEEP_SHEAR), + SHULKER(Sound.ENTITY_SHULKER_HURT, null, Sound.ENTITY_SHULKER_DEATH, Sound.ENTITY_SHULKER_AMBIENT, Sound.ENTITY_SHULKER_OPEN, Sound.ENTITY_SHULKER_CLOSE, Sound.ENTITY_SHULKER_HURT_CLOSED, Sound.ENTITY_SHULKER_TELEPORT), - SILVERFISH(Sound.ENTITY_SILVERFISH_HURT, Sound.ENTITY_SILVERFISH_STEP, Sound.ENTITY_SILVERFISH_DEATH, Sound.ENTITY_SILVERFISH_AMBIENT), - SKELETON(Sound.ENTITY_SKELETON_HURT, Sound.ENTITY_SKELETON_STEP, Sound.ENTITY_SKELETON_DEATH, Sound.ENTITY_SKELETON_AMBIENT), - SKELETON_HORSE(Sound.ENTITY_SKELETON_HORSE_HURT, "step.grass", Sound.ENTITY_SKELETON_HORSE_DEATH, Sound.ENTITY_SKELETON_HORSE_AMBIENT, - Sound.ENTITY_HORSE_GALLOP, - Sound.ENTITY_HORSE_SADDLE, Sound.ENTITY_DONKEY_ANGRY, Sound.ENTITY_HORSE_STEP_WOOD, Sound.ENTITY_HORSE_ARMOR, - Sound.ENTITY_HORSE_LAND, Sound.ENTITY_HORSE_JUMP, Sound.ENTITY_HORSE_ANGRY), - SLIME(Sound.ENTITY_SLIME_HURT, Sound.ENTITY_SLIME_JUMP, Sound.ENTITY_SLIME_DEATH, null), - SNOWMAN(Sound.ENTITY_SNOWMAN_HURT, null, Sound.ENTITY_SNOWMAN_DEATH, Sound.ENTITY_SNOWMAN_AMBIENT, Sound.ENTITY_SNOWMAN_SHOOT), - SPIDER(Sound.ENTITY_SPIDER_AMBIENT, Sound.ENTITY_SPIDER_STEP, Sound.ENTITY_SPIDER_DEATH, Sound.ENTITY_SPIDER_AMBIENT), - SQUID(Sound.ENTITY_SQUID_HURT, null, Sound.ENTITY_SQUID_DEATH, Sound.ENTITY_SQUID_AMBIENT), - UNDEAD_HORSE(Sound.ENTITY_ZOMBIE_HORSE_HURT, "step.grass", Sound.ENTITY_ZOMBIE_HORSE_DEATH, Sound.ENTITY_ZOMBIE_HORSE_AMBIENT, Sound.ENTITY_HORSE_GALLOP, - Sound.ENTITY_HORSE_SADDLE, Sound.ENTITY_DONKEY_ANGRY, Sound.ENTITY_HORSE_STEP_WOOD, Sound.ENTITY_HORSE_ARMOR, - Sound.ENTITY_HORSE_LAND, Sound.ENTITY_HORSE_JUMP, Sound.ENTITY_HORSE_ANGRY), - VILLAGER(Sound.ENTITY_VILLAGER_HURT, null, Sound.ENTITY_VILLAGER_DEATH, Sound.ENTITY_VILLAGER_AMBIENT, Sound.ENTITY_VILLAGER_TRADING, Sound.ENTITY_VILLAGER_NO, - Sound.ENTITY_VILLAGER_YES), - WITCH(Sound.ENTITY_WITCH_HURT, null, Sound.ENTITY_WITCH_DEATH, Sound.ENTITY_WITCH_AMBIENT), - WITHER(Sound.ENTITY_WITHER_HURT, null, Sound.ENTITY_WITHER_DEATH, Sound.ENTITY_WITHER_AMBIENT, Sound.ENTITY_PLAYER_SMALL_FALL, Sound.ENTITY_WITHER_SPAWN, - Sound.ENTITY_PLAYER_BIG_FALL, Sound.ENTITY_WITHER_SHOOT), - WITHER_SKELETON(Sound.ENTITY_SKELETON_HURT, Sound.ENTITY_SKELETON_STEP, Sound.ENTITY_SKELETON_DEATH, Sound.ENTITY_SKELETON_AMBIENT), - WOLF(Sound.ENTITY_WOLF_HURT, Sound.ENTITY_WOLF_STEP, Sound.ENTITY_WOLF_DEATH, Sound.ENTITY_WOLF_AMBIENT, Sound.ENTITY_WOLF_GROWL, Sound.ENTITY_WOLF_PANT, - Sound.ENTITY_WOLF_HOWL, Sound.ENTITY_WOLF_SHAKE, Sound.ENTITY_WOLF_WHINE), - ZOMBIE(Sound.ENTITY_ZOMBIE_HURT, Sound.ENTITY_ZOMBIE_STEP, Sound.ENTITY_ZOMBIE_DEATH, Sound.ENTITY_ZOMBIE_AMBIENT, - Sound.ENTITY_ZOMBIE_INFECT, Sound.ENTITY_ZOMBIE_BREAK_DOOR_WOOD, Sound.ENTITY_ZOMBIE_ATTACK_DOOR_WOOD, Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR), - ZOMBIE_VILLAGER(Sound.ENTITY_ZOMBIE_VILLAGER_HURT, Sound.ENTITY_ZOMBIE_VILLAGER_STEP, Sound.ENTITY_ZOMBIE_VILLAGER_DEATH, Sound.ENTITY_ZOMBIE_VILLAGER_AMBIENT, - Sound.ENTITY_ZOMBIE_INFECT, Sound.ENTITY_ZOMBIE_BREAK_DOOR_WOOD, Sound.ENTITY_ZOMBIE_ATTACK_DOOR_WOOD, Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR); - public enum SoundType { + SILVERFISH(Sound.ENTITY_SILVERFISH_HURT, Sound.ENTITY_SILVERFISH_STEP, Sound.ENTITY_SILVERFISH_DEATH, + Sound.ENTITY_SILVERFISH_AMBIENT), + + SKELETON(Sound.ENTITY_SKELETON_HURT, Sound.ENTITY_SKELETON_STEP, Sound.ENTITY_SKELETON_DEATH, Sound.ENTITY_SKELETON_AMBIENT), + + SKELETON_HORSE(Sound.ENTITY_SKELETON_HORSE_HURT, "step.grass", Sound.ENTITY_SKELETON_HORSE_DEATH, + Sound.ENTITY_SKELETON_HORSE_AMBIENT, Sound.ENTITY_HORSE_GALLOP, Sound.ENTITY_HORSE_SADDLE, Sound.ENTITY_DONKEY_ANGRY, + Sound.ENTITY_HORSE_STEP_WOOD, Sound.ENTITY_HORSE_ARMOR, Sound.ENTITY_HORSE_LAND, Sound.ENTITY_HORSE_JUMP, + Sound.ENTITY_HORSE_ANGRY), + + SLIME(Sound.ENTITY_SLIME_HURT, Sound.ENTITY_SLIME_JUMP, Sound.ENTITY_SLIME_DEATH, null), + + SNOWMAN(Sound.ENTITY_SNOWMAN_HURT, null, Sound.ENTITY_SNOWMAN_DEATH, Sound.ENTITY_SNOWMAN_AMBIENT, + Sound.ENTITY_SNOWMAN_SHOOT), + + SPIDER(Sound.ENTITY_SPIDER_AMBIENT, Sound.ENTITY_SPIDER_STEP, Sound.ENTITY_SPIDER_DEATH, Sound.ENTITY_SPIDER_AMBIENT), + + SQUID(Sound.ENTITY_SQUID_HURT, null, Sound.ENTITY_SQUID_DEATH, Sound.ENTITY_SQUID_AMBIENT), + + UNDEAD_HORSE(Sound.ENTITY_ZOMBIE_HORSE_HURT, "step.grass", Sound.ENTITY_ZOMBIE_HORSE_DEATH, Sound.ENTITY_ZOMBIE_HORSE_AMBIENT, + Sound.ENTITY_HORSE_GALLOP, Sound.ENTITY_HORSE_SADDLE, Sound.ENTITY_DONKEY_ANGRY, Sound.ENTITY_HORSE_STEP_WOOD, + Sound.ENTITY_HORSE_ARMOR, Sound.ENTITY_HORSE_LAND, Sound.ENTITY_HORSE_JUMP, Sound.ENTITY_HORSE_ANGRY), + + VILLAGER(Sound.ENTITY_VILLAGER_HURT, null, Sound.ENTITY_VILLAGER_DEATH, Sound.ENTITY_VILLAGER_AMBIENT, + Sound.ENTITY_VILLAGER_TRADING, Sound.ENTITY_VILLAGER_NO, Sound.ENTITY_VILLAGER_YES), + + WITCH(Sound.ENTITY_WITCH_HURT, null, Sound.ENTITY_WITCH_DEATH, Sound.ENTITY_WITCH_AMBIENT), + + WITHER(Sound.ENTITY_WITHER_HURT, null, Sound.ENTITY_WITHER_DEATH, Sound.ENTITY_WITHER_AMBIENT, Sound.ENTITY_PLAYER_SMALL_FALL, + Sound.ENTITY_WITHER_SPAWN, Sound.ENTITY_PLAYER_BIG_FALL, Sound.ENTITY_WITHER_SHOOT), + + WITHER_SKELETON(Sound.ENTITY_SKELETON_HURT, Sound.ENTITY_SKELETON_STEP, Sound.ENTITY_SKELETON_DEATH, + Sound.ENTITY_SKELETON_AMBIENT), + + WOLF(Sound.ENTITY_WOLF_HURT, Sound.ENTITY_WOLF_STEP, Sound.ENTITY_WOLF_DEATH, Sound.ENTITY_WOLF_AMBIENT, + Sound.ENTITY_WOLF_GROWL, Sound.ENTITY_WOLF_PANT, Sound.ENTITY_WOLF_HOWL, Sound.ENTITY_WOLF_SHAKE, + Sound.ENTITY_WOLF_WHINE), + + ZOMBIE(Sound.ENTITY_ZOMBIE_HURT, Sound.ENTITY_ZOMBIE_STEP, Sound.ENTITY_ZOMBIE_DEATH, Sound.ENTITY_ZOMBIE_AMBIENT, + Sound.ENTITY_ZOMBIE_INFECT, Sound.ENTITY_ZOMBIE_BREAK_DOOR_WOOD, Sound.ENTITY_ZOMBIE_ATTACK_DOOR_WOOD, + Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR), ZOMBIE_VILLAGER(Sound.ENTITY_ZOMBIE_VILLAGER_HURT, + Sound.ENTITY_ZOMBIE_VILLAGER_STEP, Sound.ENTITY_ZOMBIE_VILLAGER_DEATH, Sound.ENTITY_ZOMBIE_VILLAGER_AMBIENT, + Sound.ENTITY_ZOMBIE_INFECT, Sound.ENTITY_ZOMBIE_BREAK_DOOR_WOOD, Sound.ENTITY_ZOMBIE_ATTACK_DOOR_WOOD, + Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR); + + public enum SoundType + { CANCEL, DEATH, HURT, IDLE, STEP } - public static DisguiseSound getType(String name) { - //TODO: FIX the disguise sounds - try { + public static DisguiseSound getType(String name) + { + // TODO: FIX the disguise sounds + try + { return valueOf(name); - } catch (Exception ex) { + } + catch (Exception ex) + { return null; } } @@ -90,115 +148,160 @@ public enum DisguiseSound { private float damageSoundVolume = 1F; private HashMap disguiseSounds = new HashMap<>(); - DisguiseSound(Object hurt, Object step, Object death, Object idle, Object... sounds) { + DisguiseSound(Object hurt, Object step, Object death, Object idle, Object... sounds) + { addSound(hurt, SoundType.HURT); addSound(step, SoundType.STEP); addSound(death, SoundType.DEATH); addSound(idle, SoundType.IDLE); - for (Object obj : sounds) { + + for (Object obj : sounds) + { addSound(obj, SoundType.CANCEL); } } - private void addSound(Object sound, SoundType type) { + private void addSound(Object sound, SoundType type) + { String s; - if (sound == null) { + + if (sound == null) + { return; - } else if (sound instanceof String) { + } + else if (sound instanceof String) + { s = (String) sound; - } else if (sound instanceof Sound) { + } + else if (sound instanceof Sound) + { s = ReflectionManager.getCraftSound((Sound) sound); - } else { + } + else + { throw new RuntimeException("Was given a unknown object " + sound); } - switch (type) { - case HURT: - disguiseSounds.put(SoundType.HURT, s); - break; - case STEP: - disguiseSounds.put(SoundType.STEP, s); - break; - case DEATH: - disguiseSounds.put(SoundType.DEATH, s); - break; - case IDLE: - disguiseSounds.put(SoundType.IDLE, s); - break; - case CANCEL: - cancelSounds.add(s); + + switch (type) + { + case HURT: + disguiseSounds.put(SoundType.HURT, s); + break; + case STEP: + disguiseSounds.put(SoundType.STEP, s); + break; + case DEATH: + disguiseSounds.put(SoundType.DEATH, s); + break; + case IDLE: + disguiseSounds.put(SoundType.IDLE, s); + break; + case CANCEL: + cancelSounds.add(s); } } - public float getDamageAndIdleSoundVolume() { + public float getDamageAndIdleSoundVolume() + { return damageSoundVolume; } - public String getSound(SoundType type) { - if (type == null || !disguiseSounds.containsKey(type)) { + public String getSound(SoundType type) + { + if (type == null || !disguiseSounds.containsKey(type)) + { return null; } + return disguiseSounds.get(type); } - public HashSet getSoundsToCancel() { + public HashSet getSoundsToCancel() + { return cancelSounds; } /** * Used to check if this sound name is owned by this disguise sound. */ - public SoundType getType(String sound, boolean ignoreDamage) { - if (sound == null) return SoundType.CANCEL; - if (isCancelSound(sound)) { + public SoundType getType(String sound, boolean ignoreDamage) + { + if (sound == null) + return SoundType.CANCEL; + + if (isCancelSound(sound)) + { return SoundType.CANCEL; } + if (disguiseSounds.containsKey(SoundType.STEP) && disguiseSounds.get(SoundType.STEP).startsWith("step.") - && sound.startsWith("step.")) { + && sound.startsWith("step.")) + { return SoundType.STEP; } - for (SoundType type : SoundType.values()) { - if (!disguiseSounds.containsKey(type) || type == SoundType.DEATH || (ignoreDamage && type == SoundType.HURT)) { + + for (SoundType type : SoundType.values()) + { + if (!disguiseSounds.containsKey(type) || type == SoundType.DEATH || (ignoreDamage && type == SoundType.HURT)) + { continue; } + String s = disguiseSounds.get(type); - if (s != null) { - if (s.equals(sound)) { + + if (s != null) + { + if (s.equals(sound)) + { return type; } } } + return null; } - public boolean isCancelSound(String sound) { + public boolean isCancelSound(String sound) + { return getSoundsToCancel().contains(sound); } - public void removeSound(SoundType type, Sound sound) { + public void removeSound(SoundType type, Sound sound) + { removeSound(type, ReflectionManager.getCraftSound(sound)); } - public void removeSound(SoundType type, String sound) { - if (type == SoundType.CANCEL) { + public void removeSound(SoundType type, String sound) + { + if (type == SoundType.CANCEL) + { cancelSounds.remove(sound); - } else { + } + else + { disguiseSounds.remove(type); } } - public void setDamageAndIdleSoundVolume(float strength) { + public void setDamageAndIdleSoundVolume(float strength) + { this.damageSoundVolume = strength; } - public void setSound(SoundType type, Sound sound) { + public void setSound(SoundType type, Sound sound) + { setSound(type, ReflectionManager.getCraftSound(sound)); } - public void setSound(SoundType type, String sound) { - if (type == SoundType.CANCEL) { + public void setSound(SoundType type, String sound) + { + if (type == SoundType.CANCEL) + { cancelSounds.add(sound); - } else { + } + else + { disguiseSounds.put(type, sound); } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java similarity index 64% rename from src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java rename to src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 63a80266..03a50b44 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -1,23 +1,21 @@ package me.libraryaddict.disguise.utilities; -import com.comphenix.protocol.PacketType.Play.Server; -import com.comphenix.protocol.ProtocolLibrary; -import com.comphenix.protocol.ProtocolManager; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.reflect.StructureModifier; -import com.comphenix.protocol.wrappers.WrappedDataWatcher; -import com.comphenix.protocol.wrappers.WrappedGameProfile; -import me.libraryaddict.disguise.DisguiseAPI; -import me.libraryaddict.disguise.DisguiseConfig; -import me.libraryaddict.disguise.LibsDisguises; -import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; -import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; -import me.libraryaddict.disguise.disguisetypes.TargetedDisguise; -import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType; -import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; -import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; -import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.Set; +import java.util.UUID; +import java.util.regex.Pattern; + import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -37,27 +35,33 @@ import org.bukkit.scoreboard.Team.Option; import org.bukkit.scoreboard.Team.OptionStatus; import org.bukkit.util.Vector; -import java.lang.reflect.Array; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.Set; -import java.util.UUID; -import java.util.regex.Pattern; +import com.comphenix.protocol.PacketType.Play.Server; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.ProtocolManager; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.reflect.StructureModifier; +import com.comphenix.protocol.wrappers.WrappedDataWatcher; +import com.comphenix.protocol.wrappers.WrappedGameProfile; -public class DisguiseUtilities { +import me.libraryaddict.disguise.DisguiseAPI; +import me.libraryaddict.disguise.DisguiseConfig; +import me.libraryaddict.disguise.LibsDisguises; +import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.DisguiseType; +import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; +import me.libraryaddict.disguise.disguisetypes.TargetedDisguise; +import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType; +import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; +import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; +import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; + +public class DisguiseUtilities +{ public static final Random random = new Random(); /** - * This is a list of names which was called by other plugins. As such, don't remove from the gameProfiles as its the duty of the plugin to do that. + * This is a list of names which was called by other plugins. As such, don't remove from the gameProfiles as its the duty of + * the plugin to do that. */ private static HashSet addedByPlugins = new HashSet<>(); private static Object bedChunk; @@ -67,7 +71,8 @@ public class DisguiseUtilities { */ private static HashMap> disguisesInUse = new HashMap<>(); /** - * Disguises which are stored ready for a entity to be seen by a player Preferably, disguises in this should only stay in for a max of a second. + * Disguises which are stored ready for a entity to be seen by a player Preferably, disguises in this should only stay in for + * a max of a second. */ private static HashMap> futureDisguises = new HashMap<>(); /** @@ -79,158 +84,240 @@ public class DisguiseUtilities { private static HashSet selfDisguised = new HashSet<>(); private static Field xChunk, zChunk; - static { - try { + static + { + try + { Object server = ReflectionManager.getNmsMethod("MinecraftServer", "getServer").invoke(null); Object world = ((List) server.getClass().getField("worlds").get(server)).get(0); + bedChunk = ReflectionManager.getNmsClass("Chunk") .getConstructor(ReflectionManager.getNmsClass("World"), int.class, int.class).newInstance(world, 0, 0); + Field cSection = bedChunk.getClass().getDeclaredField("sections"); cSection.setAccessible(true); + Object chunkSection = ReflectionManager.getNmsClass("ChunkSection").getConstructor(int.class, boolean.class) .newInstance(0, true); + Object block; - try { - block = ReflectionManager.getNmsClass("Block").getMethod("getById", int.class) - .invoke(null, Material.BED_BLOCK.getId()); - } catch (Exception ex) { - block = ((Object[]) ReflectionManager.getNmsField(ReflectionManager.getNmsClass("Block"), "byId").get(null))[Material.BED_BLOCK.getId()]; + + try + { + block = ReflectionManager.getNmsClass("Block").getMethod("getById", int.class).invoke(null, + Material.BED_BLOCK.getId()); } + catch (Exception ex) + { + block = ((Object[]) ReflectionManager.getNmsField(ReflectionManager.getNmsClass("Block"), "byId") + .get(null))[Material.BED_BLOCK.getId()]; + } + Method fromLegacyData = block.getClass().getMethod("fromLegacyData", int.class); Method setType = chunkSection.getClass().getMethod("setType", int.class, int.class, int.class, ReflectionManager.getNmsClass("IBlockData")); Method setSky = chunkSection.getClass().getMethod("a", int.class, int.class, int.class, int.class); Method setEmitted = chunkSection.getClass().getMethod("b", int.class, int.class, int.class, int.class); - for (BlockFace face : new BlockFace[]{BlockFace.EAST, BlockFace.WEST, BlockFace.NORTH, BlockFace.SOUTH}) { - setType.invoke(chunkSection, 1 + face.getModX(), 0, 1 + face.getModZ(), fromLegacyData.invoke(block, face.ordinal())); + + for (BlockFace face : new BlockFace[] + { + BlockFace.EAST, BlockFace.WEST, BlockFace.NORTH, BlockFace.SOUTH + }) + { + setType.invoke(chunkSection, 1 + face.getModX(), 0, 1 + face.getModZ(), + fromLegacyData.invoke(block, face.ordinal())); setSky.invoke(chunkSection, 1 + face.getModX(), 0, 1 + face.getModZ(), 0); setEmitted.invoke(chunkSection, 1 + face.getModX(), 0, 1 + face.getModZ(), 0); } Object[] array = (Object[]) Array.newInstance(chunkSection.getClass(), 16); array[0] = chunkSection; + cSection.set(bedChunk, array); + xChunk = bedChunk.getClass().getField("locX"); xChunk.setAccessible(true); zChunk = bedChunk.getClass().getField("locZ"); zChunk.setAccessible(true); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } } - public static boolean addClonedDisguise(String key, Disguise disguise) { - if (DisguiseConfig.getMaxClonedDisguises() > 0) { - if (clonedDisguises.containsKey(key)) { + public static boolean addClonedDisguise(String key, Disguise disguise) + { + if (DisguiseConfig.getMaxClonedDisguises() > 0) + { + if (clonedDisguises.containsKey(key)) + { clonedDisguises.remove(key); - } else if (DisguiseConfig.getMaxClonedDisguises() == clonedDisguises.size()) { + } + else if (DisguiseConfig.getMaxClonedDisguises() == clonedDisguises.size()) + { clonedDisguises.remove(clonedDisguises.keySet().iterator().next()); } - if (DisguiseConfig.getMaxClonedDisguises() > clonedDisguises.size()) { + + if (DisguiseConfig.getMaxClonedDisguises() > clonedDisguises.size()) + { clonedDisguises.put(key, disguise); return true; } } + return false; } - public static void addDisguise(UUID entityId, TargetedDisguise disguise) { - if (!getDisguises().containsKey(entityId)) { + public static void addDisguise(UUID entityId, TargetedDisguise disguise) + { + if (!getDisguises().containsKey(entityId)) + { getDisguises().put(entityId, new HashSet()); } + getDisguises().get(entityId).add(disguise); + checkConflicts(disguise, null); - if (disguise.getDisguiseTarget() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS && disguise.isModifyBoundingBox()) { + + if (disguise.getDisguiseTarget() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS && disguise.isModifyBoundingBox()) + { doBoundingBox(disguise); } } - public static void addFutureDisguise(final int entityId, final TargetedDisguise disguise) { - if (!futureDisguises.containsKey(entityId)) { + public static void addFutureDisguise(final int entityId, final TargetedDisguise disguise) + { + if (!futureDisguises.containsKey(entityId)) + { futureDisguises.put(entityId, new HashSet()); } + futureDisguises.get(entityId).add(disguise); - final BukkitRunnable runnable = new BukkitRunnable() { + + final BukkitRunnable runnable = new BukkitRunnable() + { @Override - public void run() { - if (futureDisguises.containsKey(entityId) && futureDisguises.get(entityId).contains(disguise)) { - for (World world : Bukkit.getWorlds()) { - for (Entity entity : world.getEntities()) { - if (entity.getEntityId() == entityId) { + public void run() + { + if (futureDisguises.containsKey(entityId) && futureDisguises.get(entityId).contains(disguise)) + { + for (World world : Bukkit.getWorlds()) + { + for (Entity entity : world.getEntities()) + { + if (entity.getEntityId() == entityId) + { UUID uniqueId = entity.getUniqueId(); - for (TargetedDisguise disguise : futureDisguises.remove(entityId)) { + + for (TargetedDisguise disguise : futureDisguises.remove(entityId)) + { addDisguise(uniqueId, disguise); } + return; } } } + futureDisguises.get(entityId).remove(disguise); - if (futureDisguises.get(entityId).isEmpty()) { + + if (futureDisguises.get(entityId).isEmpty()) + { futureDisguises.remove(entityId); } } } }; + runnable.runTaskLater(libsDisguises, 20); } - public static void addGameProfile(String string, WrappedGameProfile gameProfile) { + public static void addGameProfile(String string, WrappedGameProfile gameProfile) + { getGameProfiles().put(string, gameProfile); getAddedByPlugins().add(string.toLowerCase()); } /** - * If name isn't null. Make sure that the name doesn't see any other disguise. Else if name is null. Make sure that the observers in the disguise don't see any other disguise. + * If name isn't null. Make sure that the name doesn't see any other disguise. Else if name is null. Make sure that the + * observers in the disguise don't see any other disguise. */ - public static void checkConflicts(TargetedDisguise disguise, String name) { + public static void checkConflicts(TargetedDisguise disguise, String name) + { // If the disguise is being used.. Else we may accidentally undisguise something else - if (DisguiseAPI.isDisguiseInUse(disguise)) { + if (DisguiseAPI.isDisguiseInUse(disguise)) + { Iterator disguiseItel = getDisguises().get(disguise.getEntity().getUniqueId()).iterator(); // Iterate through the disguises - while (disguiseItel.hasNext()) { + while (disguiseItel.hasNext()) + { TargetedDisguise d = disguiseItel.next(); // Make sure the disguise isn't the same thing - if (d != disguise) { + if (d != disguise) + { // If the loop'd disguise is hiding the disguise to everyone in its list - if (d.getDisguiseTarget() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { + if (d.getDisguiseTarget() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) + { // If player is a observer in the loop - if (disguise.getDisguiseTarget() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { + if (disguise.getDisguiseTarget() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) + { // If player is a observer in the disguise // Remove them from the loop - if (name != null) { + if (name != null) + { d.removePlayer(name); - } else { - for (String playername : disguise.getObservers()) { + } + else + { + for (String playername : disguise.getObservers()) + { d.silentlyRemovePlayer(playername); } } - } else if (disguise.getDisguiseTarget() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { + } + else if (disguise.getDisguiseTarget() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) + { // If player is not a observer in the loop - if (name != null) { - if (!disguise.getObservers().contains(name)) { + if (name != null) + { + if (!disguise.getObservers().contains(name)) + { d.removePlayer(name); } - } else { - for (String playername : new ArrayList<>(d.getObservers())) { - if (!disguise.getObservers().contains(playername)) { + } + else + { + for (String playername : new ArrayList<>(d.getObservers())) + { + if (!disguise.getObservers().contains(playername)) + { d.silentlyRemovePlayer(playername); } } } } - } else if (d.getDisguiseTarget() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { + } + else if (d.getDisguiseTarget() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) + { // Here you add it to the loop if they see the disguise - if (disguise.getDisguiseTarget() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { + if (disguise.getDisguiseTarget() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) + { // Everyone who is in the disguise needs to be added to the loop - if (name != null) { + if (name != null) + { d.addPlayer(name); - } else { - for (String playername : disguise.getObservers()) { + } + else + { + for (String playername : disguise.getObservers()) + { d.silentlyAddPlayer(playername); } } - } else if (disguise.getDisguiseTarget() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { + } + else if (disguise.getDisguiseTarget() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) + { // This here is a paradox. // If fed a name. I can do this. // But the rest of the time.. Its going to conflict. @@ -250,187 +337,278 @@ public class DisguiseUtilities { /** * Sends entity removal packets, as this disguise was removed */ - public static void destroyEntity(TargetedDisguise disguise) { - try { + public static void destroyEntity(TargetedDisguise disguise) + { + try + { Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); - if (entityTrackerEntry != null) { - Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry); + + if (entityTrackerEntry != null) + { + Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") + .get(entityTrackerEntry); + // If the tracker exists. Remove himself from his tracker - trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); //Copy before iterating to prevent ConcurrentModificationException + trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); // Copy before iterating to prevent + // ConcurrentModificationException + PacketContainer destroyPacket = new PacketContainer(Server.ENTITY_DESTROY); - destroyPacket.getIntegerArrays().write(0, new int[]{disguise.getEntity().getEntityId()}); - for (Object p : trackedPlayers) { + + destroyPacket.getIntegerArrays().write(0, new int[] + { + disguise.getEntity().getEntityId() + }); + + for (Object p : trackedPlayers) + { Player player = (Player) ReflectionManager.getBukkitEntity(p); - if (player == disguise.getEntity() || disguise.canSee(player)) { + + if (player == disguise.getEntity() || disguise.canSee(player)) + { ProtocolLibrary.getProtocolManager().sendServerPacket(player, destroyPacket); } } } - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } } - public static void doBoundingBox(TargetedDisguise disguise) { + public static void doBoundingBox(TargetedDisguise disguise) + { Entity entity = disguise.getEntity(); - if (entity != null) { - if (isDisguiseInUse(disguise)) { + + if (entity != null) + { + if (isDisguiseInUse(disguise)) + { DisguiseValues disguiseValues = DisguiseValues.getDisguiseValues(disguise.getType()); FakeBoundingBox disguiseBox = disguiseValues.getAdultBox(); - if (disguiseValues.getBabyBox() != null) { + + if (disguiseValues.getBabyBox() != null) + { if ((disguise.getWatcher() instanceof AgeableWatcher && ((AgeableWatcher) disguise.getWatcher()).isBaby()) - || (disguise.getWatcher() instanceof ZombieWatcher && ((ZombieWatcher) disguise.getWatcher()) - .isBaby())) { + || (disguise.getWatcher() instanceof ZombieWatcher + && ((ZombieWatcher) disguise.getWatcher()).isBaby())) + { disguiseBox = disguiseValues.getBabyBox(); } } + ReflectionManager.setBoundingBox(entity, disguiseBox); - } else { + } + else + { DisguiseValues entityValues = DisguiseValues.getDisguiseValues(DisguiseType.getType(entity.getType())); + FakeBoundingBox entityBox = entityValues.getAdultBox(); - if (entityValues.getBabyBox() != null) { + + if (entityValues.getBabyBox() != null) + { if ((entity instanceof Ageable && !((Ageable) entity).isAdult()) - || (entity instanceof Zombie && ((Zombie) entity).isBaby())) { + || (entity instanceof Zombie && ((Zombie) entity).isBaby())) + { entityBox = entityValues.getBabyBox(); } } + ReflectionManager.setBoundingBox(entity, entityBox); } } } - public static HashSet getAddedByPlugins() { + public static HashSet getAddedByPlugins() + { return addedByPlugins; } - public static PacketContainer[] getBedChunkPacket(Location newLoc, Location oldLoc) { + public static PacketContainer[] getBedChunkPacket(Location newLoc, Location oldLoc) + { int i = 0; + PacketContainer[] packets = new PacketContainer[newLoc != null ? 2 + (oldLoc != null ? 1 : 0) : 1]; - for (Location loc : new Location[]{oldLoc, newLoc}) { - if (loc == null) { + + for (Location loc : new Location[] + { + oldLoc, newLoc + }) + { + if (loc == null) + { continue; } - try { + try + { int chunkX = (int) Math.floor(loc.getX() / 16D) - 17, chunkZ = (int) Math.floor(loc.getZ() / 16D) - 17; + chunkX -= chunkX % 8; chunkZ -= chunkZ % 8; xChunk.set(bedChunk, chunkX); zChunk.set(bedChunk, chunkZ); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } // Make unload packets - try { - packets[i] = ProtocolLibrary.getProtocolManager() - .createPacketConstructor(Server.MAP_CHUNK, bedChunk, true, 0, 40) + try + { + packets[i] = ProtocolLibrary.getProtocolManager().createPacketConstructor(Server.MAP_CHUNK, bedChunk, true, 0, 40) .createPacket(bedChunk, true, 0, 48); - } catch (IllegalArgumentException ex) { - packets[i] = ProtocolLibrary.getProtocolManager() - .createPacketConstructor(Server.MAP_CHUNK, bedChunk, true, 0) + } + catch (IllegalArgumentException ex) + { + packets[i] = ProtocolLibrary.getProtocolManager().createPacketConstructor(Server.MAP_CHUNK, bedChunk, true, 0) .createPacket(bedChunk, true, 0); } + i++; // Make load packets - if (oldLoc == null || i > 1) { - //MAP_CHUNK_BULK was replaced in 1.9 with several seperated chunk packets -// packets[i] = ProtocolLibrary.getProtocolManager() -// .createPacketConstructor(Server.MAP_CHUNK_BULK, Arrays.asList(bedChunk)) -// .createPacket(Arrays.asList(bedChunk)); - packets[i] = ProtocolLibrary.getProtocolManager() - .createPacketConstructor(Server.MAP_CHUNK, bedChunk, true, 0) + if (oldLoc == null || i > 1) + { + // MAP_CHUNK_BULK was replaced in 1.9 with several seperated chunk packets + // packets[i] = ProtocolLibrary.getProtocolManager() + // .createPacketConstructor(Server.MAP_CHUNK_BULK, Arrays.asList(bedChunk)) + // .createPacket(Arrays.asList(bedChunk)); + packets[i] = ProtocolLibrary.getProtocolManager().createPacketConstructor(Server.MAP_CHUNK, bedChunk, true, 0) .createPacket(bedChunk, true, 0); i++; } } + return packets; } - public static PacketContainer[] getBedPackets(Player player, Location loc, Location playerLocation, PlayerDisguise disguise) { + public static PacketContainer[] getBedPackets(Player player, Location loc, Location playerLocation, PlayerDisguise disguise) + { Entity entity = disguise.getEntity(); + PacketContainer setBed = new PacketContainer(Server.BED); - StructureModifier bedInts = setBed.getIntegers(); - bedInts.write(0, entity.getEntityId()); - PlayerWatcher watcher = disguise.getWatcher(); - int chunkX = (int) Math.floor(playerLocation.getX() / 16D) - 17, chunkZ = (int) Math - .floor(playerLocation.getZ() / 16D) - 17; + + int chunkX = (int) Math.floor(playerLocation.getX() / 16D) - 17, + chunkZ = (int) Math.floor(playerLocation.getZ() / 16D) - 17; chunkX -= chunkX % 8; chunkZ -= chunkZ % 8; + + PlayerWatcher watcher = disguise.getWatcher(); + + StructureModifier bedInts = setBed.getIntegers(); + bedInts.write(0, entity.getEntityId()); + bedInts.write(1, (chunkX * 16) + 1 + watcher.getSleepingDirection().getModX()); bedInts.write(3, (chunkZ * 16) + 1 + watcher.getSleepingDirection().getModZ()); + PacketContainer teleport = new PacketContainer(Server.ENTITY_TELEPORT); + StructureModifier ints = teleport.getIntegers(); ints.write(0, entity.getEntityId()); ints.write(1, (int) Math.floor(loc.getX() * 32)); ints.write(2, (int) Math.floor((PacketsManager.getYModifier(disguise.getEntity(), disguise) + loc.getY()) * 32)); ints.write(3, (int) Math.floor(loc.getZ() * 32)); - return new PacketContainer[]{setBed, teleport}; + + return new PacketContainer[] + { + setBed, teleport + }; } - public static Disguise getClonedDisguise(String key) { - if (clonedDisguises.containsKey(key)) { + public static Disguise getClonedDisguise(String key) + { + if (clonedDisguises.containsKey(key)) + { return clonedDisguises.get(key).clone(); } + return null; } - public static PacketContainer getDestroyPacket(int... ids) { + public static PacketContainer getDestroyPacket(int... ids) + { PacketContainer destroyPacket = new PacketContainer(Server.ENTITY_DESTROY); + destroyPacket.getIntegerArrays().write(0, ids); + return destroyPacket; } - public static TargetedDisguise getDisguise(Player observer, Entity entity) { + public static TargetedDisguise getDisguise(Player observer, Entity entity) + { UUID entityId = entity.getUniqueId(); - if (futureDisguises.containsKey(entity.getEntityId())) { - for (TargetedDisguise disguise : futureDisguises.remove(entity.getEntityId())) { + + if (futureDisguises.containsKey(entity.getEntityId())) + { + for (TargetedDisguise disguise : futureDisguises.remove(entity.getEntityId())) + { addDisguise(entityId, disguise); } } - if (getDisguises().containsKey(entityId)) { - for (TargetedDisguise disguise : getDisguises().get(entityId)) { - if (disguise.canSee(observer)) { + + if (getDisguises().containsKey(entityId)) + { + for (TargetedDisguise disguise : getDisguises().get(entityId)) + { + if (disguise.canSee(observer)) + { return disguise; } } } + return null; } - public static HashMap> getDisguises() { + public static HashMap> getDisguises() + { return disguisesInUse; } - public static TargetedDisguise[] getDisguises(UUID entityId) { - if (getDisguises().containsKey(entityId)) { + public static TargetedDisguise[] getDisguises(UUID entityId) + { + if (getDisguises().containsKey(entityId)) + { HashSet disguises = getDisguises().get(entityId); + return disguises.toArray(new TargetedDisguise[disguises.size()]); } + return new TargetedDisguise[0]; } - public static HashMap> getFutureDisguises() { + public static HashMap> getFutureDisguises() + { return futureDisguises; } - public static WrappedGameProfile getGameProfile(String playerName) { + public static WrappedGameProfile getGameProfile(String playerName) + { return gameProfiles.get(playerName.toLowerCase()); } - public static HashMap getGameProfiles() { + public static HashMap getGameProfiles() + { return gameProfiles; } - public static TargetedDisguise getMainDisguise(UUID entityId) { + public static TargetedDisguise getMainDisguise(UUID entityId) + { TargetedDisguise toReturn = null; - if (getDisguises().containsKey(entityId)) { - for (TargetedDisguise disguise : getDisguises().get(entityId)) { - if (disguise.getDisguiseTarget() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { + + if (getDisguises().containsKey(entityId)) + { + for (TargetedDisguise disguise : getDisguises().get(entityId)) + { + if (disguise.getDisguiseTarget() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) + { return disguise; } + toReturn = disguise; } } + return toReturn; } @@ -440,41 +618,60 @@ public class DisguiseUtilities { * @param disguise * @return */ - public static List getPerverts(Disguise disguise) { + public static List getPerverts(Disguise disguise) + { List players = new ArrayList<>(); - try { + + try + { Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); - if (entityTrackerEntry != null) { - Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry); - trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); //Copy before iterating to prevent ConcurrentModificationException - for (Object p : trackedPlayers) { + + if (entityTrackerEntry != null) + { + Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") + .get(entityTrackerEntry); + trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); // Copy before iterating to prevent + // ConcurrentModificationException + for (Object p : trackedPlayers) + { Player player = (Player) ReflectionManager.getBukkitEntity(p); - if (((TargetedDisguise) disguise).canSee(player)) { + if (((TargetedDisguise) disguise).canSee(player)) + { players.add(player); } } } - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } + return players; } - public static WrappedGameProfile getProfileFromMojang(final PlayerDisguise disguise) { + public static WrappedGameProfile getProfileFromMojang(final PlayerDisguise disguise) + { final String nameToFetch = disguise.getSkin() != null ? disguise.getSkin() : disguise.getName(); final boolean remove = getAddedByPlugins().contains(nameToFetch.toLowerCase()); - return getProfileFromMojang(nameToFetch, new LibsProfileLookup() { + + return getProfileFromMojang(nameToFetch, new LibsProfileLookup() + { @Override - public void onLookup(WrappedGameProfile gameProfile) { - if (remove) { + public void onLookup(WrappedGameProfile gameProfile) + { + if (remove) + { getAddedByPlugins().remove(nameToFetch.toLowerCase()); } + if (DisguiseAPI.isDisguiseInUse(disguise) - && (!gameProfile.getName().equals( - disguise.getSkin() != null ? disguise.getSkin() : disguise.getName()) - || !gameProfile.getProperties().isEmpty())) { + && (!gameProfile.getName().equals(disguise.getSkin() != null ? disguise.getSkin() : disguise.getName()) + || !gameProfile.getProperties().isEmpty())) + { disguise.setGameProfile(gameProfile); + DisguiseUtilities.refreshTrackers(disguise); } } @@ -482,61 +679,93 @@ public class DisguiseUtilities { } /** - * Pass in a set, check if it's a hashset. - * If it's not, return false. - * If you pass in something else, you failed. + * Pass in a set, check if it's a hashset. If it's not, return false. If you pass in something else, you failed. * * @param obj * @return */ - private static boolean isHashSet(Object obj) { - if (obj instanceof HashSet) return true; //It's Spigot/Bukkit - if (obj instanceof Set) return false; //It's PaperSpigot/SportsBukkit + private static boolean isHashSet(Object obj) + { + if (obj instanceof HashSet) + return true; // It's Spigot/Bukkit + + if (obj instanceof Set) + return false; // It's PaperSpigot/SportsBukkit + throw new IllegalArgumentException("Object passed was not either a hashset or set!"); } /** - * Thread safe to use. This returns a GameProfile. And if its GameProfile doesn't have a skin blob. Then it does a lookup using schedulers. The runnable is run once the GameProfile has been successfully dealt with + * Thread safe to use. This returns a GameProfile. And if its GameProfile doesn't have a skin blob. Then it does a lookup + * using schedulers. The runnable is run once the GameProfile has been successfully dealt with */ - public static WrappedGameProfile getProfileFromMojang(String playerName, LibsProfileLookup runnableIfCantReturn) { + public static WrappedGameProfile getProfileFromMojang(String playerName, LibsProfileLookup runnableIfCantReturn) + { return getProfileFromMojang(playerName, (Object) runnableIfCantReturn); } - private static WrappedGameProfile getProfileFromMojang(final String origName, final Object runnable) { + private static WrappedGameProfile getProfileFromMojang(final String origName, final Object runnable) + { final String playerName = origName.toLowerCase(); - if (gameProfiles.containsKey(playerName)) { - if (gameProfiles.get(playerName) != null) { + + if (gameProfiles.containsKey(playerName)) + { + if (gameProfiles.get(playerName) != null) + { return gameProfiles.get(playerName); } - } else if (Pattern.matches("([A-Za-z0-9_]){1,16}", origName)) { + } + else if (Pattern.matches("([A-Za-z0-9_]){1,16}", origName)) + { getAddedByPlugins().add(playerName); + Player player = Bukkit.getPlayerExact(playerName); - if (player != null) { + + if (player != null) + { WrappedGameProfile gameProfile = ReflectionManager.getGameProfile(player); - if (!gameProfile.getProperties().isEmpty()) { + + if (!gameProfile.getProperties().isEmpty()) + { gameProfiles.put(playerName, gameProfile); return gameProfile; } } + // Add null so that if this is called again. I already know I'm doing something about it gameProfiles.put(playerName, null); - Bukkit.getScheduler().runTaskAsynchronously(libsDisguises, new Runnable() { + + Bukkit.getScheduler().runTaskAsynchronously(libsDisguises, new Runnable() + { @Override - public void run() { - try { + public void run() + { + try + { final WrappedGameProfile gameProfile = lookupGameProfile(origName); - Bukkit.getScheduler().runTask(libsDisguises, new Runnable() { + + Bukkit.getScheduler().runTask(libsDisguises, new Runnable() + { @Override - public void run() { - if (!gameProfile.getProperties().isEmpty()) { - if (gameProfiles.containsKey(playerName) && gameProfiles.get(playerName) == null) { + public void run() + { + if (!gameProfile.getProperties().isEmpty()) + { + if (gameProfiles.containsKey(playerName) && gameProfiles.get(playerName) == null) + { gameProfiles.put(playerName, gameProfile); } - if (runnables.containsKey(playerName)) { - for (Object obj : runnables.remove(playerName)) { - if (obj instanceof Runnable) { + + if (runnables.containsKey(playerName)) + { + for (Object obj : runnables.remove(playerName)) + { + if (obj instanceof Runnable) + { ((Runnable) obj).run(); - } else if (obj instanceof LibsProfileLookup) { + } + else if (obj instanceof LibsProfileLookup) + { ((LibsProfileLookup) obj).onLookup(gameProfile); } } @@ -544,48 +773,64 @@ public class DisguiseUtilities { } } }); - } catch (Exception e) { - if (gameProfiles.containsKey(playerName) && gameProfiles.get(playerName) == null) { + } + catch (Exception e) + { + if (gameProfiles.containsKey(playerName) && gameProfiles.get(playerName) == null) + { gameProfiles.remove(playerName); getAddedByPlugins().remove(playerName); } - System.out.print("[LibsDisguises] Error when fetching " + playerName + "'s uuid from mojang: " - + e.getMessage()); + + System.out.print( + "[LibsDisguises] Error when fetching " + playerName + "'s uuid from mojang: " + e.getMessage()); } } }); - } else { + } + else + { return ReflectionManager.getGameProfile(null, origName); } - if (runnable != null) { - if (!runnables.containsKey(playerName)) { + + if (runnable != null) + { + if (!runnables.containsKey(playerName)) + { runnables.put(playerName, new ArrayList<>()); } runnables.get(playerName).add(runnable); } + return ReflectionManager.getGameProfile(null, origName); } /** - * Thread safe to use. This returns a GameProfile. And if its GameProfile doesn't have a skin blob. Then it does a lookup using schedulers. The runnable is run once the GameProfile has been successfully dealt with + * Thread safe to use. This returns a GameProfile. And if its GameProfile doesn't have a skin blob. Then it does a lookup + * using schedulers. The runnable is run once the GameProfile has been successfully dealt with */ - public static WrappedGameProfile getProfileFromMojang(String playerName, Runnable runnableIfCantReturn) { + public static WrappedGameProfile getProfileFromMojang(String playerName, Runnable runnableIfCantReturn) + { return getProfileFromMojang(playerName, (Object) runnableIfCantReturn); } - public static HashSet getSelfDisguised() { + public static HashSet getSelfDisguised() + { return selfDisguised; } - public static boolean hasGameProfile(String playerName) { + public static boolean hasGameProfile(String playerName) + { return getGameProfile(playerName) != null; } - public static void init(LibsDisguises disguises) { + public static void init(LibsDisguises disguises) + { libsDisguises = disguises; } - public static boolean isDisguiseInUse(Disguise disguise) { + public static boolean isDisguiseInUse(Disguise disguise) + { return disguise.getEntity() != null && getDisguises().containsKey(disguise.getEntity().getUniqueId()) && getDisguises().get(disguise.getEntity().getUniqueId()).contains(disguise); } @@ -593,55 +838,88 @@ public class DisguiseUtilities { /** * This is called on a thread as it is thread blocking */ - public static WrappedGameProfile lookupGameProfile(String playerName) { + public static WrappedGameProfile lookupGameProfile(String playerName) + { return ReflectionManager.getSkullBlob(ReflectionManager.grabProfileAddUUID(playerName)); } /** * Resends the entity to this specific player */ - public static void refreshTracker(final TargetedDisguise disguise, String player) { - if (disguise.getEntity() != null && disguise.getEntity().isValid()) { - try { + public static void refreshTracker(final TargetedDisguise disguise, String player) + { + if (disguise.getEntity() != null && disguise.getEntity().isValid()) + { + try + { PacketContainer destroyPacket = getDestroyPacket(disguise.getEntity().getEntityId()); + if (disguise.isDisguiseInUse() && disguise.getEntity() instanceof Player - && disguise.getEntity().getName().equalsIgnoreCase(player)) { + && disguise.getEntity().getName().equalsIgnoreCase(player)) + { removeSelfDisguise((Player) disguise.getEntity()); - if (disguise.isSelfDisguiseVisible()) { + + if (disguise.isSelfDisguiseVisible()) + { selfDisguised.add(disguise.getEntity().getUniqueId()); } + ProtocolLibrary.getProtocolManager().sendServerPacket((Player) disguise.getEntity(), destroyPacket); - Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() { + + Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() + { @Override - public void run() { - try { + public void run() + { + try + { DisguiseUtilities.sendSelfDisguise((Player) disguise.getEntity(), disguise); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } } }, 2); - } else { + } + else + { final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); - if (entityTrackerEntry != null) { + + if (entityTrackerEntry != null) + { Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") .get(entityTrackerEntry); + Method clear = ReflectionManager.getNmsMethod("EntityTrackerEntry", "clear", ReflectionManager.getNmsClass("EntityPlayer")); + final Method updatePlayer = ReflectionManager.getNmsMethod("EntityTrackerEntry", "updatePlayer", ReflectionManager.getNmsClass("EntityPlayer")); - trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); //Copy before iterating to prevent ConcurrentModificationException - for (final Object p : trackedPlayers) { + + trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); // Copy before iterating to prevent + // ConcurrentModificationException + for (final Object p : trackedPlayers) + { Player pl = (Player) ReflectionManager.getBukkitEntity(p); - if (player.equalsIgnoreCase((pl).getName())) { + + if (player.equalsIgnoreCase((pl).getName())) + { clear.invoke(entityTrackerEntry, p); + ProtocolLibrary.getProtocolManager().sendServerPacket(pl, destroyPacket); - Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() { + + Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() + { @Override - public void run() { - try { + public void run() + { + try + { updatePlayer.invoke(entityTrackerEntry, p); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } } @@ -651,7 +929,9 @@ public class DisguiseUtilities { } } } - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } } @@ -660,30 +940,50 @@ public class DisguiseUtilities { /** * A convenience method for me to refresh trackers in other plugins */ - public static void refreshTrackers(Entity entity) { - if (entity.isValid()) { - try { + public static void refreshTrackers(Entity entity) + { + if (entity.isValid()) + { + try + { PacketContainer destroyPacket = getDestroyPacket(entity.getEntityId()); + final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(entity); - if (entityTrackerEntry != null) { - Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get( - entityTrackerEntry); + + if (entityTrackerEntry != null) + { + Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") + .get(entityTrackerEntry); + Method clear = ReflectionManager.getNmsMethod("EntityTrackerEntry", "clear", ReflectionManager.getNmsClass("EntityPlayer")); + final Method updatePlayer = ReflectionManager.getNmsMethod("EntityTrackerEntry", "updatePlayer", ReflectionManager.getNmsClass("EntityPlayer")); - trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); //Copy before iterating to prevent ConcurrentModificationException - for (final Object p : trackedPlayers) { + + trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); // Copy before iterating to prevent + // ConcurrentModificationException + for (final Object p : trackedPlayers) + { Player player = (Player) ReflectionManager.getBukkitEntity(p); - if (player != entity) { + + if (player != entity) + { clear.invoke(entityTrackerEntry, p); + ProtocolLibrary.getProtocolManager().sendServerPacket(player, destroyPacket); - Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() { + + Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() + { @Override - public void run() { - try { + public void run() + { + try + { updatePlayer.invoke(entityTrackerEntry, p); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } } @@ -691,7 +991,9 @@ public class DisguiseUtilities { } } } - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } } @@ -700,42 +1002,74 @@ public class DisguiseUtilities { /** * Resends the entity to all the watching players, which is where the magic begins */ - public static void refreshTrackers(final TargetedDisguise disguise) { - if (disguise.getEntity().isValid()) { + public static void refreshTrackers(final TargetedDisguise disguise) + { + if (disguise.getEntity().isValid()) + { PacketContainer destroyPacket = getDestroyPacket(disguise.getEntity().getEntityId()); - try { - if (selfDisguised.contains(disguise.getEntity().getUniqueId()) && disguise.isDisguiseInUse()) { + try + { + if (selfDisguised.contains(disguise.getEntity().getUniqueId()) && disguise.isDisguiseInUse()) + { removeSelfDisguise((Player) disguise.getEntity()); + selfDisguised.add(disguise.getEntity().getUniqueId()); + ProtocolLibrary.getProtocolManager().sendServerPacket((Player) disguise.getEntity(), destroyPacket); - Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() { + + Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() + { @Override - public void run() { - try { + public void run() + { + try + { DisguiseUtilities.sendSelfDisguise((Player) disguise.getEntity(), disguise); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } } }, 2); } + final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); - if (entityTrackerEntry != null) { - Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry); - final Method clear = ReflectionManager.getNmsMethod("EntityTrackerEntry", "clear", ReflectionManager.getNmsClass("EntityPlayer")); - final Method updatePlayer = ReflectionManager.getNmsMethod("EntityTrackerEntry", "updatePlayer", ReflectionManager.getNmsClass("EntityPlayer")); + + if (entityTrackerEntry != null) + { + Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") + .get(entityTrackerEntry); + + final Method clear = ReflectionManager.getNmsMethod("EntityTrackerEntry", "clear", + ReflectionManager.getNmsClass("EntityPlayer")); + + final Method updatePlayer = ReflectionManager.getNmsMethod("EntityTrackerEntry", "updatePlayer", + ReflectionManager.getNmsClass("EntityPlayer")); + trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); - for (final Object p : trackedPlayers) { + + for (final Object p : trackedPlayers) + { Player player = (Player) ReflectionManager.getBukkitEntity(p); - if (disguise.getEntity() != player && disguise.canSee(player)) { + + if (disguise.getEntity() != player && disguise.canSee(player)) + { clear.invoke(entityTrackerEntry, p); + ProtocolLibrary.getProtocolManager().sendServerPacket(player, destroyPacket); - Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() { + + Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() + { @Override - public void run() { - try { + public void run() + { + try + { updatePlayer.invoke(entityTrackerEntry, p); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } } @@ -743,78 +1077,115 @@ public class DisguiseUtilities { } } } - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } } } - public static boolean removeDisguise(TargetedDisguise disguise) { + public static boolean removeDisguise(TargetedDisguise disguise) + { UUID entityId = disguise.getEntity().getUniqueId(); - if (getDisguises().containsKey(entityId) && getDisguises().get(entityId).remove(disguise)) { - if (getDisguises().get(entityId).isEmpty()) { + + if (getDisguises().containsKey(entityId) && getDisguises().get(entityId).remove(disguise)) + { + if (getDisguises().get(entityId).isEmpty()) + { getDisguises().remove(entityId); } - if (disguise.getDisguiseTarget() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS && disguise.isModifyBoundingBox()) { + + if (disguise.getDisguiseTarget() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS && disguise.isModifyBoundingBox()) + { doBoundingBox(disguise); } + return true; } + return false; } - public static void removeGameProfile(String string) { + public static void removeGameProfile(String string) + { gameProfiles.remove(string.toLowerCase()); } - public static void removeSelfDisguise(Player player) { - if (selfDisguised.contains(player.getUniqueId())) { + public static void removeSelfDisguise(Player player) + { + if (selfDisguised.contains(player.getUniqueId())) + { // Send a packet to destroy the fake entity PacketContainer packet = getDestroyPacket(DisguiseAPI.getSelfDisguiseId()); - try { + + try + { ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } - //Code to stop player pushing in 1.9 + + // Code to stop player pushing in 1.9 Scoreboard scoreboard = player.getScoreboard(); Team t; - if ((t = scoreboard.getTeam("LDPushing")) != null) { + + if ((t = scoreboard.getTeam("LDPushing")) != null) + { t.setOption(Option.COLLISION_RULE, OptionStatus.ALWAYS); t.removeEntry(player.getName()); t.unregister(); } -// player.spigot().setCollidesWithEntities(true); - //Finish up + + // player.spigot().setCollidesWithEntities(true); + // Finish up // Remove the fake entity ID from the disguise bin selfDisguised.remove(player.getUniqueId()); // Get the entity tracker - try { + + try + { Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(player); - if (entityTrackerEntry != null) { - Object trackedPlayersObj = ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry); + + if (entityTrackerEntry != null) + { + Object trackedPlayersObj = ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") + .get(entityTrackerEntry); + // If the tracker exists. Remove himself from his tracker - if (isHashSet(trackedPlayersObj)) { - ((Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry)).remove(ReflectionManager.getNmsEntity(player)); - } else { - ((Map) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayerMap").get(entityTrackerEntry)).remove(ReflectionManager.getNmsEntity(player)); + if (isHashSet(trackedPlayersObj)) + { + ((Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") + .get(entityTrackerEntry)).remove(ReflectionManager.getNmsEntity(player)); + } + else + { + ((Map) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayerMap") + .get(entityTrackerEntry)).remove(ReflectionManager.getNmsEntity(player)); } } - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } + // Resend entity metadata else he will be invisible to himself until its resent - try { - ProtocolLibrary.getProtocolManager().sendServerPacket( - player, - ProtocolLibrary - .getProtocolManager() + try + { + ProtocolLibrary.getProtocolManager().sendServerPacket(player, + ProtocolLibrary.getProtocolManager() .createPacketConstructor(Server.ENTITY_METADATA, player.getEntityId(), WrappedDataWatcher.getEntityWatcher(player), true) .createPacket(player.getEntityId(), WrappedDataWatcher.getEntityWatcher(player), true)); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } + player.updateInventory(); } } @@ -822,142 +1193,159 @@ public class DisguiseUtilities { /** * Sends the self disguise to the player */ - public static void sendSelfDisguise(final Player player, final TargetedDisguise disguise) { - try { + public static void sendSelfDisguise(final Player player, final TargetedDisguise disguise) + { + try + { if (!disguise.isDisguiseInUse() || !player.isValid() || !player.isOnline() || !disguise.isSelfDisguiseVisible() - || !disguise.canSee(player)) { + || !disguise.canSee(player)) + { return; } + Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(player); - if (entityTrackerEntry == null) { + + if (entityTrackerEntry == null) + { // A check incase the tracker is null. // If it is, then this method will be run again in one tick. Which is when it should be constructed. // Else its going to run in a infinite loop hue hue hue.. // At least until this disguise is discarded - Bukkit.getScheduler().runTask(libsDisguises, new Runnable() { + Bukkit.getScheduler().runTask(libsDisguises, new Runnable() + { @Override - public void run() { - if (DisguiseAPI.getDisguise(player, player) == disguise) { + public void run() + { + if (DisguiseAPI.getDisguise(player, player) == disguise) + { sendSelfDisguise(player, disguise); } } }); + return; } + // Add himself to his own entity tracker - Object trackedPlayersObj = ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry); - //Check for code differences in PaperSpigot vs Spigot - if (isHashSet(trackedPlayersObj)) { - ((Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry)).add(ReflectionManager.getNmsEntity(player)); - } else { - ((Map) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayerMap").get(entityTrackerEntry)).put(ReflectionManager.getNmsEntity(player), true); + Object trackedPlayersObj = ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") + .get(entityTrackerEntry); + + // Check for code differences in PaperSpigot vs Spigot + if (isHashSet(trackedPlayersObj)) + { + ((Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry)) + .add(ReflectionManager.getNmsEntity(player)); + } + else + { + ((Map) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayerMap") + .get(entityTrackerEntry)).put(ReflectionManager.getNmsEntity(player), true); } ProtocolManager manager = ProtocolLibrary.getProtocolManager(); // Send the player a packet with himself being spawned - manager.sendServerPacket(player, manager.createPacketConstructor(Server.NAMED_ENTITY_SPAWN, player) - .createPacket(player)); + manager.sendServerPacket(player, + manager.createPacketConstructor(Server.NAMED_ENTITY_SPAWN, player).createPacket(player)); + WrappedDataWatcher dataWatcher = WrappedDataWatcher.getEntityWatcher(player); - sendSelfPacket( - player, - manager.createPacketConstructor(Server.ENTITY_METADATA, player.getEntityId(), dataWatcher, - true).createPacket(player.getEntityId(), dataWatcher, true)); + + sendSelfPacket(player, + manager.createPacketConstructor(Server.ENTITY_METADATA, player.getEntityId(), dataWatcher, true) + .createPacket(player.getEntityId(), dataWatcher, true)); boolean isMoving = false; - try { + + try + { Field field = ReflectionManager.getNmsClass("EntityTrackerEntry").getDeclaredField("isMoving"); field.setAccessible(true); isMoving = field.getBoolean(entityTrackerEntry); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } + // Send the velocity packets - if (isMoving) { + if (isMoving) + { Vector velocity = player.getVelocity(); - sendSelfPacket( - player, - manager.createPacketConstructor(Server.ENTITY_VELOCITY, player.getEntityId(), - velocity.getX(), velocity.getY(), velocity.getZ()).createPacket(player.getEntityId(), - velocity.getX(), velocity.getY(), velocity.getZ())); + sendSelfPacket(player, + manager.createPacketConstructor(Server.ENTITY_VELOCITY, player.getEntityId(), velocity.getX(), + velocity.getY(), velocity.getZ()) + .createPacket(player.getEntityId(), velocity.getX(), velocity.getY(), velocity.getZ())); } // Why the hell would he even need this. Meh. - if (player.getVehicle() != null && player.getEntityId() > player.getVehicle().getEntityId()) { - sendSelfPacket(player, - manager.createPacketConstructor(Server.ATTACH_ENTITY, 0, player, player.getVehicle()) - .createPacket(0, player, player.getVehicle())); - } else if (player.getPassenger() != null && player.getEntityId() > player.getPassenger().getEntityId()) { - sendSelfPacket(player, - manager.createPacketConstructor(Server.ATTACH_ENTITY, 0, player.getPassenger(), player) - .createPacket(0, player.getPassenger(), player)); + if (player.getVehicle() != null && player.getEntityId() > player.getVehicle().getEntityId()) + { + sendSelfPacket(player, manager.createPacketConstructor(Server.ATTACH_ENTITY, 0, player, player.getVehicle()) + .createPacket(0, player, player.getVehicle())); + } + else if (player.getPassenger() != null && player.getEntityId() > player.getPassenger().getEntityId()) + { + sendSelfPacket(player, manager.createPacketConstructor(Server.ATTACH_ENTITY, 0, player.getPassenger(), player) + .createPacket(0, player.getPassenger(), player)); } sendSelfPacket(player, - manager.createPacketConstructor( - Server.ENTITY_EQUIPMENT, - 0, + manager.createPacketConstructor(Server.ENTITY_EQUIPMENT, 0, ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), - ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) - .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), + ReflectionManager.getNmsItem(new ItemStack(Material.STONE))).createPacket(player.getEntityId(), + ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), ReflectionManager.getNmsItem(player.getInventory().getHelmet()))); sendSelfPacket(player, - manager.createPacketConstructor( - Server.ENTITY_EQUIPMENT, - 0, + manager.createPacketConstructor(Server.ENTITY_EQUIPMENT, 0, ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), - ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) - .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.CHEST), + ReflectionManager.getNmsItem(new ItemStack(Material.STONE))).createPacket(player.getEntityId(), + ReflectionManager.createEnumItemSlot(EquipmentSlot.CHEST), ReflectionManager.getNmsItem(player.getInventory().getChestplate()))); sendSelfPacket(player, - manager.createPacketConstructor( - Server.ENTITY_EQUIPMENT, - 0, + manager.createPacketConstructor(Server.ENTITY_EQUIPMENT, 0, ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), - ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) - .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.LEGS), + ReflectionManager.getNmsItem(new ItemStack(Material.STONE))).createPacket(player.getEntityId(), + ReflectionManager.createEnumItemSlot(EquipmentSlot.LEGS), ReflectionManager.getNmsItem(player.getInventory().getLeggings()))); sendSelfPacket(player, - manager.createPacketConstructor( - Server.ENTITY_EQUIPMENT, - 0, + manager.createPacketConstructor(Server.ENTITY_EQUIPMENT, 0, ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), - ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) - .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.FEET), + ReflectionManager.getNmsItem(new ItemStack(Material.STONE))).createPacket(player.getEntityId(), + ReflectionManager.createEnumItemSlot(EquipmentSlot.FEET), ReflectionManager.getNmsItem(player.getInventory().getBoots()))); sendSelfPacket(player, - manager.createPacketConstructor( - Server.ENTITY_EQUIPMENT, - 0, + manager.createPacketConstructor(Server.ENTITY_EQUIPMENT, 0, ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), - ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) - .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.HAND), + ReflectionManager.getNmsItem(new ItemStack(Material.STONE))).createPacket(player.getEntityId(), + ReflectionManager.createEnumItemSlot(EquipmentSlot.HAND), ReflectionManager.getNmsItem(player.getInventory().getItemInMainHand()))); sendSelfPacket(player, - manager.createPacketConstructor( - Server.ENTITY_EQUIPMENT, - 0, + manager.createPacketConstructor(Server.ENTITY_EQUIPMENT, 0, ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), - ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) - .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.OFF_HAND), + ReflectionManager.getNmsItem(new ItemStack(Material.STONE))).createPacket(player.getEntityId(), + ReflectionManager.createEnumItemSlot(EquipmentSlot.OFF_HAND), ReflectionManager.getNmsItem(player.getInventory().getItemInOffHand()))); Location loc = player.getLocation(); + // If the disguised is sleeping for w/e reason - if (player.isSleeping()) { - sendSelfPacket( - player, + if (player.isSleeping()) + { + sendSelfPacket(player, manager.createPacketConstructor(Server.BED, player, ReflectionManager.getBlockPosition(0, 0, 0)) - .createPacket(player, ReflectionManager.getBlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()))); + .createPacket(player, + ReflectionManager.getBlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()))); } // Resend any active potion effects - for (PotionEffect potionEffect : player.getActivePotionEffects()) { + for (PotionEffect potionEffect : player.getActivePotionEffects()) + { Object mobEffect = ReflectionManager.createMobEffect(potionEffect); - sendSelfPacket(player, - manager.createPacketConstructor(Server.ENTITY_EFFECT, player.getEntityId(), mobEffect) - .createPacket(player.getEntityId(), mobEffect)); + sendSelfPacket(player, manager.createPacketConstructor(Server.ENTITY_EFFECT, player.getEntityId(), mobEffect) + .createPacket(player.getEntityId(), mobEffect)); } - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } } @@ -965,34 +1353,55 @@ public class DisguiseUtilities { /** * Method to send a packet to the self disguise, translate his entity ID to the fake id. */ - private static void sendSelfPacket(final Player player, PacketContainer packet) { + private static void sendSelfPacket(final Player player, PacketContainer packet) + { PacketContainer[][] transformed = PacketsManager.transformPacket(packet, player, player); + PacketContainer[] packets = transformed == null ? null : transformed[0]; + final PacketContainer[] delayed = transformed == null ? null : transformed[1]; - try { - if (packets == null) { - packets = new PacketContainer[]{packet}; + + try + { + if (packets == null) + { + packets = new PacketContainer[] + { + packet + }; } - for (PacketContainer p : packets) { + + for (PacketContainer p : packets) + { p = p.deepClone(); p.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); ProtocolLibrary.getProtocolManager().sendServerPacket(player, p, false); } - if (delayed != null && delayed.length > 0) { - Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() { + + if (delayed != null && delayed.length > 0) + { + Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() + { @Override - public void run() { - try { - for (PacketContainer packet : delayed) { + public void run() + { + try + { + for (PacketContainer packet : delayed) + { ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, false); } - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(System.out); } } }); } - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(System.out); } } @@ -1002,40 +1411,60 @@ public class DisguiseUtilities { * * @param disguise */ - public static void setupFakeDisguise(final Disguise disguise) { + public static void setupFakeDisguise(final Disguise disguise) + { Entity e = disguise.getEntity(); + // If the disguises entity is null, or the disguised entity isn't a player return if (e == null || !(e instanceof Player) || !getDisguises().containsKey(e.getUniqueId()) - || !getDisguises().get(e.getUniqueId()).contains(disguise)) { + || !getDisguises().get(e.getUniqueId()).contains(disguise)) + { return; } + Player player = (Player) e; + // Check if he can even see this.. - if (!((TargetedDisguise) disguise).canSee(player)) { + if (!((TargetedDisguise) disguise).canSee(player)) + { return; } + // Remove the old disguise, else we have weird disguises around the place DisguiseUtilities.removeSelfDisguise(player); + // If the disguised player can't see himself. Return - if (!disguise.isSelfDisguiseVisible() || !PacketsManager.isViewDisguisesListenerEnabled() || player.getVehicle() != null) { + if (!disguise.isSelfDisguiseVisible() || !PacketsManager.isViewDisguisesListenerEnabled() || player.getVehicle() != null) + { return; } - //Code to stop player pushing in 1.9 + + // Code to stop player pushing in 1.9 Scoreboard scoreboard = player.getScoreboard(); Team t; - if ((t = scoreboard.getTeam("LDPushing")) != null) { + + if ((t = scoreboard.getTeam("LDPushing")) != null) + { t.setOption(Option.COLLISION_RULE, OptionStatus.NEVER); - } else { + } + else + { t = scoreboard.registerNewTeam("LDPushing"); + t.setOption(Option.COLLISION_RULE, OptionStatus.NEVER); t.addEntry(player.getName()); } -// player.spigot().setCollidesWithEntities(false); - //Finish up + + // player.spigot().setCollidesWithEntities(false); + // Finish up selfDisguised.add(player.getUniqueId()); + sendSelfDisguise(player, (TargetedDisguise) disguise); - if (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf()) { - if (PacketsManager.isInventoryListenerEnabled()) { + + if (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf()) + { + if (PacketsManager.isInventoryListenerEnabled()) + { player.updateInventory(); } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseValues.java b/src/me/libraryaddict/disguise/utilities/DisguiseValues.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/utilities/DisguiseValues.java rename to src/me/libraryaddict/disguise/utilities/DisguiseValues.java index bb428de0..70296a5e 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseValues.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseValues.java @@ -1,9 +1,9 @@ package me.libraryaddict.disguise.utilities; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; - import java.util.HashMap; +import me.libraryaddict.disguise.disguisetypes.DisguiseType; + public class DisguiseValues { private static HashMap values = new HashMap<>(); diff --git a/src/main/java/me/libraryaddict/disguise/utilities/FakeBoundingBox.java b/src/me/libraryaddict/disguise/utilities/FakeBoundingBox.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/utilities/FakeBoundingBox.java rename to src/me/libraryaddict/disguise/utilities/FakeBoundingBox.java diff --git a/src/main/java/me/libraryaddict/disguise/utilities/LibsProfileLookup.java b/src/me/libraryaddict/disguise/utilities/LibsProfileLookup.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/utilities/LibsProfileLookup.java rename to src/me/libraryaddict/disguise/utilities/LibsProfileLookup.java diff --git a/src/main/java/me/libraryaddict/disguise/utilities/LibsProfileLookupCaller.java b/src/me/libraryaddict/disguise/utilities/LibsProfileLookupCaller.java similarity index 99% rename from src/main/java/me/libraryaddict/disguise/utilities/LibsProfileLookupCaller.java rename to src/me/libraryaddict/disguise/utilities/LibsProfileLookupCaller.java index cee46e8d..d904b4f9 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/LibsProfileLookupCaller.java +++ b/src/me/libraryaddict/disguise/utilities/LibsProfileLookupCaller.java @@ -1,7 +1,6 @@ package me.libraryaddict.disguise.utilities; import com.comphenix.protocol.wrappers.WrappedGameProfile; - import com.mojang.authlib.GameProfile; import com.mojang.authlib.ProfileLookupCallback; diff --git a/src/main/java/me/libraryaddict/disguise/utilities/Metrics.java b/src/me/libraryaddict/disguise/utilities/Metrics.java similarity index 74% rename from src/main/java/me/libraryaddict/disguise/utilities/Metrics.java rename to src/me/libraryaddict/disguise/utilities/Metrics.java index b31601f3..f32a325d 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/Metrics.java +++ b/src/me/libraryaddict/disguise/utilities/Metrics.java @@ -27,13 +27,6 @@ */ package me.libraryaddict.disguise.utilities; -import org.bukkit.Bukkit; -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.PluginDescriptionFile; -import org.bukkit.scheduler.BukkitTask; - import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; @@ -53,7 +46,15 @@ import java.util.UUID; import java.util.logging.Level; import java.util.zip.GZIPOutputStream; -public class Metrics { +import org.bukkit.Bukkit; +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.scheduler.BukkitTask; + +public class Metrics +{ /** * The current revision number @@ -104,8 +105,10 @@ public class Metrics { */ private volatile BukkitTask task = null; - public Metrics(final Plugin plugin) throws IOException { - if (plugin == null) { + public Metrics(final Plugin plugin) throws IOException + { + if (plugin == null) + { throw new IllegalArgumentException("Plugin cannot be null"); } this.plugin = plugin; @@ -117,7 +120,8 @@ public class Metrics { configuration.addDefault("guid", UUID.randomUUID().toString()); configuration.addDefault("debug", false); // Do we need to create the file? - if (configuration.get("guid", null) == null) { + if (configuration.get("guid", null) == null) + { configuration.options().header("http://mcstats.org").copyDefaults(true); configuration.save(configurationFile); } @@ -127,13 +131,17 @@ public class Metrics { } /** - * Construct and create a Graph that can be used to separate specific plotters to their own graphs on the metrics website. Plotters can be added to the graph object returned. + * Construct and create a Graph that can be used to separate specific plotters to their own graphs on the metrics website. + * Plotters can be added to the graph object returned. * - * @param name The name of the graph + * @param name + * The name of the graph * @return Graph object created. Will never return NULL under normal circumstances unless bad parameters are given */ - public Graph createGraph(final String name) { - if (name == null) { + public Graph createGraph(final String name) + { + if (name == null) + { throw new IllegalArgumentException("Graph name cannot be null"); } // Construct the graph object @@ -147,45 +155,59 @@ public class Metrics { /** * Add a Graph object to BukkitMetrics that represents data for the plugin that should be sent to the backend * - * @param graph The name of the graph + * @param graph + * The name of the graph */ - public void addGraph(final Graph graph) { - if (graph == null) { + public void addGraph(final Graph graph) + { + if (graph == null) + { throw new IllegalArgumentException("Graph cannot be null"); } graphs.add(graph); } /** - * Start measuring statistics. This will immediately create an async repeating task as the plugin and send the initial data to the metrics backend, and then after that it will post in increments of PING_INTERVAL * 1200 ticks. + * Start measuring statistics. This will immediately create an async repeating task as the plugin and send the initial data to + * the metrics backend, and then after that it will post in increments of PING_INTERVAL * 1200 ticks. * * @return True if statistics measuring is running, otherwise false. */ - public boolean start() { - synchronized (optOutLock) { + public boolean start() + { + synchronized (optOutLock) + { // Did we opt out? - if (isOptOut()) { + if (isOptOut()) + { return false; } // Is metrics already running? - if (task != null) { + if (task != null) + { return true; } // Begin hitting the server with glorious data - task = plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, new Runnable() { + task = plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, new Runnable() + { private boolean firstPost = true; @Override - public void run() { - try { + public void run() + { + try + { // This has to be synchronized or it can collide with the disable method. - synchronized (optOutLock) { + synchronized (optOutLock) + { // Disable Task, if it is running and the server owner decided to opt-out - if (isOptOut() && task != null) { + if (isOptOut() && task != null) + { task.cancel(); task = null; // Tell all plotters to stop gathering information. - for (Graph graph : graphs) { + for (Graph graph : graphs) + { graph.onOptOut(); } } @@ -197,8 +219,11 @@ public class Metrics { // After the first post we set firstPost to false // Each post thereafter will be a ping firstPost = false; - } catch (IOException e) { - if (debug) { + } + catch (IOException e) + { + if (debug) + { Bukkit.getLogger().log(Level.INFO, "[Metrics] " + e.getMessage()); } } @@ -213,13 +238,19 @@ public class Metrics { * * @return true if metrics should be opted out of it */ - public boolean isOptOut() { - synchronized (optOutLock) { - try { + public boolean isOptOut() + { + synchronized (optOutLock) + { + try + { // Reload the metrics file configuration.load(getConfigFile()); - } catch (IOException | InvalidConfigurationException ex) { - if (debug) { + } + catch (IOException | InvalidConfigurationException ex) + { + if (debug) + { Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage()); } return true; @@ -233,16 +264,20 @@ public class Metrics { * * @throws java.io.IOException */ - public void enable() throws IOException { + public void enable() throws IOException + { // This has to be synchronized or it can collide with the check in the task. - synchronized (optOutLock) { + synchronized (optOutLock) + { // Check if the server owner has already set opt-out, if not, set it. - if (isOptOut()) { + if (isOptOut()) + { configuration.set("opt-out", false); configuration.save(configurationFile); } // Enable Task, if it is not running - if (task == null) { + if (task == null) + { start(); } } @@ -253,16 +288,20 @@ public class Metrics { * * @throws java.io.IOException */ - public void disable() throws IOException { + public void disable() throws IOException + { // This has to be synchronized or it can collide with the check in the task. - synchronized (optOutLock) { + synchronized (optOutLock) + { // Check if the server owner has already set opt-out, if not, set it. - if (!isOptOut()) { + if (!isOptOut()) + { configuration.set("opt-out", true); configuration.save(configurationFile); } // Disable Task, if it is running - if (task != null) { + if (task != null) + { task.cancel(); task = null; } @@ -274,7 +313,8 @@ public class Metrics { * * @return the File object for the config file */ - public File getConfigFile() { + public File getConfigFile() + { // I believe the easiest way to get the base folder (e.g Spigot set via -P) for plugins to use // is to abuse the plugin object we already have // plugin.getDataFolder() => base/plugins/PluginA/ @@ -288,7 +328,8 @@ public class Metrics { /** * Generic method that posts a plugin to the metrics website */ - private void postPlugin(final boolean isPing) throws IOException { + private void postPlugin(final boolean isPing) throws IOException + { // Server software specific section PluginDescriptionFile description = plugin.getDescription(); String pluginName = description.getName(); @@ -312,7 +353,8 @@ public class Metrics { String java_version = System.getProperty("java.version"); int coreCount = Runtime.getRuntime().availableProcessors(); // normalize os arch .. amd64 -> x86_64 - if (osarch.equals("amd64")) { + if (osarch.equals("amd64")) + { osarch = "x86_64"; } appendJSONPair(json, "osname", osname); @@ -322,11 +364,14 @@ public class Metrics { appendJSONPair(json, "auth_mode", onlineMode ? "1" : "0"); appendJSONPair(json, "java_version", java_version); // If we're pinging, append it - if (isPing) { + if (isPing) + { appendJSONPair(json, "ping", "1"); } - if (graphs.size() > 0) { - synchronized (graphs) { + if (graphs.size() > 0) + { + synchronized (graphs) + { json.append(','); json.append('"'); json.append("graphs"); @@ -334,14 +379,17 @@ public class Metrics { json.append(':'); json.append('{'); boolean firstGraph = true; - for (Graph graph : graphs) { + for (Graph graph : graphs) + { StringBuilder graphJson = new StringBuilder(); graphJson.append('{'); - for (Plotter plotter : graph.getPlotters()) { + for (Plotter plotter : graph.getPlotters()) + { appendJSONPair(graphJson, plotter.getColumnName(), Integer.toString(plotter.getValue())); } graphJson.append('}'); - if (!firstGraph) { + if (!firstGraph) + { json.append(','); } json.append(escapeJSON(graph.getName())); @@ -360,9 +408,12 @@ public class Metrics { URLConnection connection; // Mineshafter creates a socks proxy, so we can safely bypass it // It does not reroute POST requests so we need to go around it - if (isMineshafterPresent()) { + if (isMineshafterPresent()) + { connection = url.openConnection(Proxy.NO_PROXY); - } else { + } + else + { connection = url.openConnection(); } byte[] uncompressed = json.toString().getBytes(); @@ -375,8 +426,10 @@ public class Metrics { connection.addRequestProperty("Accept", "application/json"); connection.addRequestProperty("Connection", "close"); connection.setDoOutput(true); - if (debug) { - System.out.println("[Metrics] Prepared request for " + pluginName + " uncompressed=" + uncompressed.length + " compressed=" + compressed.length); + if (debug) + { + System.out.println("[Metrics] Prepared request for " + pluginName + " uncompressed=" + uncompressed.length + + " compressed=" + compressed.length); } // Write the data OutputStream os = connection.getOutputStream(); @@ -384,24 +437,35 @@ public class Metrics { os.flush(); String response; try ( // Now read the response - BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) + { response = reader.readLine(); // close resources os.close(); } - if (response == null || response.startsWith("ERR") || response.startsWith("7")) { - if (response == null) { + if (response == null || response.startsWith("ERR") || response.startsWith("7")) + { + if (response == null) + { response = "null"; - } else if (response.startsWith("7")) { + } + else if (response.startsWith("7")) + { response = response.substring(response.startsWith("7,") ? 2 : 1); } throw new IOException(response); - } else { + } + else + { // Is this the first update this hour? - if (response.equals("1") || response.contains("This is your first update this hour")) { - synchronized (graphs) { - for (Graph graph : graphs) { - for (Plotter plotter : graph.getPlotters()) { + if (response.equals("1") || response.contains("This is your first update this hour")) + { + synchronized (graphs) + { + for (Graph graph : graphs) + { + for (Plotter plotter : graph.getPlotters()) + { plotter.reset(); } } @@ -416,19 +480,29 @@ public class Metrics { * @param input * @return byte[] */ - public static byte[] gzip(String input) { + public static byte[] gzip(String input) + { ByteArrayOutputStream baos = new ByteArrayOutputStream(); GZIPOutputStream gzos = null; - try { + try + { gzos = new GZIPOutputStream(baos); gzos.write(input.getBytes("UTF-8")); - } catch (IOException e) { + } + catch (IOException e) + { e.printStackTrace(System.out); - } finally { - if (gzos != null) { - try { + } + finally + { + if (gzos != null) + { + try + { gzos.close(); - } catch (IOException ignore) { + } + catch (IOException ignore) + { } } } @@ -440,11 +514,15 @@ public class Metrics { * * @return true if mineshafter is installed on the server */ - private boolean isMineshafterPresent() { - try { + private boolean isMineshafterPresent() + { + try + { Class.forName("mineshafter.MineServer"); return true; - } catch (Exception e) { + } + catch (Exception e) + { return false; } } @@ -457,24 +535,33 @@ public class Metrics { * @param value * @throws UnsupportedEncodingException */ - private static void appendJSONPair(StringBuilder json, String key, String value) throws UnsupportedEncodingException { + private static void appendJSONPair(StringBuilder json, String key, String value) throws UnsupportedEncodingException + { boolean isValueNumeric = false; - try { - if (value.equals("0") || !value.endsWith("0")) { + try + { + if (value.equals("0") || !value.endsWith("0")) + { Double.parseDouble(value); isValueNumeric = true; } - } catch (NumberFormatException e) { + } + catch (NumberFormatException e) + { isValueNumeric = false; } - if (json.charAt(json.length() - 1) != '{') { + if (json.charAt(json.length() - 1) != '{') + { json.append(','); } json.append(escapeJSON(key)); json.append(':'); - if (isValueNumeric) { + if (isValueNumeric) + { json.append(value); - } else { + } + else + { json.append(escapeJSON(value)); } } @@ -485,37 +572,43 @@ public class Metrics { * @param text * @return String */ - private static String escapeJSON(String text) { + private static String escapeJSON(String text) + { StringBuilder builder = new StringBuilder(); builder.append('"'); - for (int index = 0; index < text.length(); index++) { + for (int index = 0; index < text.length(); index++) + { char chr = text.charAt(index); - switch (chr) { - case '"': - case '\\': - builder.append('\\'); + switch (chr) + { + case '"': + case '\\': + builder.append('\\'); + builder.append(chr); + break; + case '\b': + builder.append("\\b"); + break; + case '\t': + builder.append("\\t"); + break; + case '\n': + builder.append("\\n"); + break; + case '\r': + builder.append("\\r"); + break; + default: + if (chr < ' ') + { + String t = "000" + Integer.toHexString(chr); + builder.append("\\u").append(t.substring(t.length() - 4)); + } + else + { builder.append(chr); - break; - case '\b': - builder.append("\\b"); - break; - case '\t': - builder.append("\\t"); - break; - case '\n': - builder.append("\\n"); - break; - case '\r': - builder.append("\\r"); - break; - default: - if (chr < ' ') { - String t = "000" + Integer.toHexString(chr); - builder.append("\\u").append(t.substring(t.length() - 4)); - } else { - builder.append(chr); - } - break; + } + break; } } builder.append('"'); @@ -525,17 +618,20 @@ public class Metrics { /** * Encode text as UTF-8 * - * @param text the text to encode + * @param text + * the text to encode * @return the encoded text, as UTF-8 */ - private static String urlEncode(final String text) throws UnsupportedEncodingException { + private static String urlEncode(final String text) throws UnsupportedEncodingException + { return URLEncoder.encode(text, "UTF-8"); } /** * Represents a custom graph on the website */ - public static class Graph { + public static class Graph + { /** * The graph's name, alphanumeric and spaces only :) If it does not comply to the above when submitted, it is rejected @@ -546,7 +642,8 @@ public class Metrics { */ private final Set plotters = new LinkedHashSet<>(); - private Graph(final String name) { + private Graph(final String name) + { this.name = name; } @@ -555,25 +652,30 @@ public class Metrics { * * @return the Graph's name */ - public String getName() { + public String getName() + { return name; } /** * Add a plotter to the graph, which will be used to plot entries * - * @param plotter the plotter to add to the graph + * @param plotter + * the plotter to add to the graph */ - public void addPlotter(final Plotter plotter) { + public void addPlotter(final Plotter plotter) + { plotters.add(plotter); } /** * Remove a plotter from the graph * - * @param plotter the plotter to remove from the graph + * @param plotter + * the plotter to remove from the graph */ - public void removePlotter(final Plotter plotter) { + public void removePlotter(final Plotter plotter) + { plotters.remove(plotter); } @@ -582,18 +684,22 @@ public class Metrics { * * @return an unmodifiable {@link java.util.Set} of the plotter objects */ - public Set getPlotters() { + public Set getPlotters() + { return Collections.unmodifiableSet(plotters); } @Override - public int hashCode() { + public int hashCode() + { return name.hashCode(); } @Override - public boolean equals(final Object object) { - if (!(object instanceof Graph)) { + public boolean equals(final Object object) + { + if (!(object instanceof Graph)) + { return false; } final Graph graph = (Graph) object; @@ -603,14 +709,16 @@ public class Metrics { /** * Called when the server owner decides to opt-out of BukkitMetrics while the server is running. */ - protected void onOptOut() { + protected void onOptOut() + { } } /** * Interface used to collect custom data for a plugin */ - public static abstract class Plotter { + public static abstract class Plotter + { /** * The plot's name @@ -620,21 +728,26 @@ public class Metrics { /** * Construct a plotter with the default plot name */ - public Plotter() { + public Plotter() + { this("Default"); } /** * Construct a plotter with a specific plot name * - * @param name the name of the plotter to use, which will show up on the website + * @param name + * the name of the plotter to use, which will show up on the website */ - public Plotter(final String name) { + public Plotter(final String name) + { this.name = name; } /** - * Get the current value for the plotted point. Since this function defers to an external function it may or may not return immediately thus cannot be guaranteed to be thread friendly or safe. This function can be called from any thread so care should be taken when accessing resources that need to be synchronized. + * Get the current value for the plotted point. Since this function defers to an external function it may or may not + * return immediately thus cannot be guaranteed to be thread friendly or safe. This function can be called from any thread + * so care should be taken when accessing resources that need to be synchronized. * * @return the current value for the point to be plotted. */ @@ -645,24 +758,29 @@ public class Metrics { * * @return the plotted point's column name */ - public String getColumnName() { + public String getColumnName() + { return name; } /** * Called after the website graphs have been updated */ - public void reset() { + public void reset() + { } @Override - public int hashCode() { + public int hashCode() + { return getColumnName().hashCode(); } @Override - public boolean equals(final Object object) { - if (!(object instanceof Plotter)) { + public boolean equals(final Object object) + { + if (!(object instanceof Plotter)) + { return false; } final Plotter plotter = (Plotter) object; diff --git a/src/main/java/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/me/libraryaddict/disguise/utilities/PacketsManager.java similarity index 66% rename from src/main/java/me/libraryaddict/disguise/utilities/PacketsManager.java rename to src/me/libraryaddict/disguise/utilities/PacketsManager.java index 6ffd10cd..045f8047 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -1,36 +1,11 @@ package me.libraryaddict.disguise.utilities; -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.PacketType.Play.Server; -import com.comphenix.protocol.ProtocolLibrary; -import com.comphenix.protocol.events.ListenerPriority; -import com.comphenix.protocol.events.PacketAdapter; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.events.PacketEvent; -import com.comphenix.protocol.events.PacketListener; -import com.comphenix.protocol.reflect.StructureModifier; -import com.comphenix.protocol.wrappers.WrappedAttribute; -import com.comphenix.protocol.wrappers.WrappedAttribute.Builder; -import com.comphenix.protocol.wrappers.WrappedDataWatcher; -import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry; -import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject; -import com.comphenix.protocol.wrappers.WrappedGameProfile; -import com.comphenix.protocol.wrappers.WrappedWatchableObject; -import me.libraryaddict.disguise.DisguiseAPI; -import me.libraryaddict.disguise.DisguiseConfig; -import me.libraryaddict.disguise.LibsDisguises; -import me.libraryaddict.disguise.disguisetypes.AnimalColor; -import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; -import me.libraryaddict.disguise.disguisetypes.FlagWatcher; -import me.libraryaddict.disguise.disguisetypes.MiscDisguise; -import me.libraryaddict.disguise.disguisetypes.MobDisguise; -import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; -import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; -import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; -import me.libraryaddict.disguise.disguisetypes.watchers.SheepWatcher; -import me.libraryaddict.disguise.disguisetypes.watchers.WolfWatcher; -import me.libraryaddict.disguise.utilities.DisguiseSound.SoundType; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + import org.bukkit.Art; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -50,13 +25,41 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.util.Vector; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.UUID; +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.PacketType.Play.Server; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.ListenerPriority; +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.events.PacketEvent; +import com.comphenix.protocol.events.PacketListener; +import com.comphenix.protocol.reflect.StructureModifier; +import com.comphenix.protocol.wrappers.WrappedAttribute; +import com.comphenix.protocol.wrappers.WrappedAttribute.Builder; +import com.comphenix.protocol.wrappers.WrappedDataWatcher; +import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry; +import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject; +import com.comphenix.protocol.wrappers.WrappedGameProfile; +import com.comphenix.protocol.wrappers.WrappedWatchableObject; -public class PacketsManager { +import me.libraryaddict.disguise.DisguiseAPI; +import me.libraryaddict.disguise.DisguiseConfig; +import me.libraryaddict.disguise.LibsDisguises; +import me.libraryaddict.disguise.disguisetypes.AnimalColor; +import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.DisguiseType; +import me.libraryaddict.disguise.disguisetypes.FlagWatcher; +import me.libraryaddict.disguise.disguisetypes.MiscDisguise; +import me.libraryaddict.disguise.disguisetypes.MobDisguise; +import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; +import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; +import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; +import me.libraryaddict.disguise.disguisetypes.watchers.SheepWatcher; +import me.libraryaddict.disguise.disguisetypes.watchers.WolfWatcher; +import me.libraryaddict.disguise.utilities.DisguiseSound.SoundType; + +public class PacketsManager +{ /** * This is a fix for the stupidity that is * "I can't separate the sounds from the sounds the player heard, and the sounds of the entity tracker heard" @@ -72,47 +75,74 @@ public class PacketsManager { private static PacketListener viewDisguisesListener; private static boolean viewDisguisesListenerEnabled; - public static void addPacketListeners() { + public static void addPacketListeners() + { // Add a client listener to cancel them interacting with uninteractable disguised entitys. // You ain't supposed to be allowed to 'interact' with a item that cannot be clicked. // Because it kicks you for hacking. + clientInteractEntityListener = new PacketAdapter(libsDisguises, ListenerPriority.NORMAL, - PacketType.Play.Client.USE_ENTITY) { + PacketType.Play.Client.USE_ENTITY) + { @Override - public void onPacketReceiving(PacketEvent event) { + public void onPacketReceiving(PacketEvent event) + { + if (event.isCancelled()) return; - try { - if (event.getPlayer().getName().contains("UNKNOWN[")) //If the player is temporary + + try + { + if (event.getPlayer().getName().contains("UNKNOWN[")) // If the player is temporary return; + Player observer = event.getPlayer(); + StructureModifier entityModifer = event.getPacket().getEntityModifier(observer.getWorld()); + Entity entity = entityModifer.read(0); + if (entity instanceof ExperienceOrb || entity instanceof Item || entity instanceof Arrow - || entity == observer) { + || entity == observer) + { event.setCancelled(true); } + ItemStack item = observer.getItemInHand(); - if (item != null && item.getType() == Material.INK_SACK) { + + if (item != null && item.getType() == Material.INK_SACK) + { Disguise disguise = DisguiseAPI.getDisguise(observer, entity); + if (disguise != null - && (disguise.getType() == DisguiseType.SHEEP || disguise.getType() == DisguiseType.WOLF)) { + && (disguise.getType() == DisguiseType.SHEEP || disguise.getType() == DisguiseType.WOLF)) + { AnimalColor color = AnimalColor.getColor(item.getDurability()); - if (disguise.getType() == DisguiseType.SHEEP) { + + if (disguise.getType() == DisguiseType.SHEEP) + { SheepWatcher watcher = (SheepWatcher) disguise.getWatcher(); + watcher.setColor(DisguiseConfig.isSheepDyeable() ? color : watcher.getColor()); - } else { + } + else + { WolfWatcher watcher = (WolfWatcher) disguise.getWatcher(); + watcher.setCollarColor(DisguiseConfig.isWolfDyeable() ? color : watcher.getCollarColor()); } } } - } catch (Exception e) { + } + catch (Exception e) + { e.printStackTrace(); } } }; + ProtocolLibrary.getProtocolManager().addPacketListener(clientInteractEntityListener); + // Now I call this and the main listener is registered! setupMainPacketsListener(); } @@ -120,158 +150,233 @@ public class PacketsManager { /** * Construct the packets I need to spawn in the disguise */ - public static PacketContainer[][] constructSpawnPackets(final Player player, Disguise disguise, Entity disguisedEntity) { + public static PacketContainer[][] constructSpawnPackets(final Player player, Disguise disguise, Entity disguisedEntity) + { if (disguise.getEntity() == null) disguise.setEntity(disguisedEntity); + ArrayList packets = new ArrayList<>(); // This sends the armor packets so that the player isn't naked. // Please note it only sends the packets that wouldn't be sent normally - if (DisguiseConfig.isEquipmentPacketsEnabled()) { - for (EquipmentSlot slot : EquipmentSlot.values()) { + if (DisguiseConfig.isEquipmentPacketsEnabled()) + { + for (EquipmentSlot slot : EquipmentSlot.values()) + { ItemStack itemstack = disguise.getWatcher().getItemStack(slot); - if (itemstack != null && itemstack.getTypeId() != 0) { + + if (itemstack != null && itemstack.getTypeId() != 0) + { ItemStack item = null; - if (disguisedEntity instanceof LivingEntity) { + + if (disguisedEntity instanceof LivingEntity) + { item = ReflectionManager.getEquipment(slot, disguisedEntity); } - if (item == null || item.getType() == Material.AIR) { + + if (item == null || item.getType() == Material.AIR) + { PacketContainer packet = new PacketContainer(Server.ENTITY_EQUIPMENT); + StructureModifier mods = packet.getModifier(); + mods.write(0, disguisedEntity.getEntityId()); mods.write(1, ReflectionManager.createEnumItemSlot(slot)); mods.write(2, ReflectionManager.getNmsItem(itemstack)); + packets.add(packet); } } } } - if (DisguiseConfig.isMiscDisguisesForLivingEnabled()) { - if (disguise.getWatcher() instanceof LivingWatcher) { + + if (DisguiseConfig.isMiscDisguisesForLivingEnabled()) + { + if (disguise.getWatcher() instanceof LivingWatcher) + { PacketContainer packet = new PacketContainer(Server.UPDATE_ATTRIBUTES); - List attributes = new ArrayList<>(); + + List attributes = new ArrayList(); + Builder builder = WrappedAttribute.newBuilder().attributeKey("generic.maxHealth"); - if (((LivingWatcher) disguise.getWatcher()).isMaxHealthSet()) { + + if (((LivingWatcher) disguise.getWatcher()).isMaxHealthSet()) + { builder.baseValue(((LivingWatcher) disguise.getWatcher()).getMaxHealth()); - } else if (DisguiseConfig.isMaxHealthDeterminedByDisguisedEntity() && disguisedEntity instanceof Damageable) { + } + else if (DisguiseConfig.isMaxHealthDeterminedByDisguisedEntity() && disguisedEntity instanceof Damageable) + { builder.baseValue(((Damageable) disguisedEntity).getMaxHealth()); - } else { + } + else + { builder.baseValue(DisguiseValues.getDisguiseValues(disguise.getType()).getMaxHealth()); } + builder.packet(packet); + attributes.add(builder.build()); + packet.getIntegers().write(0, disguisedEntity.getEntityId()); packet.getAttributeCollectionModifier().write(0, attributes); + packets.add(packet); } } + PacketContainer[] spawnPackets = new PacketContainer[2 + packets.size()]; PacketContainer[] delayedPackets = new PacketContainer[0]; - for (int i = 0; i < packets.size(); i++) { + + for (int i = 0; i < packets.size(); i++) + { spawnPackets[i + 2] = packets.get(i); } + Location loc = disguisedEntity.getLocation().clone().add(0, getYModifier(disguisedEntity, disguise), 0); + byte yaw = (byte) (int) (loc.getYaw() * 256.0F / 360.0F); byte pitch = (byte) (int) (loc.getPitch() * 256.0F / 360.0F); - if (DisguiseConfig.isMovementPacketsEnabled()) { + + if (DisguiseConfig.isMovementPacketsEnabled()) + { yaw = getYaw(disguise.getType(), disguisedEntity.getType(), yaw); pitch = getPitch(disguise.getType(), DisguiseType.getType(disguisedEntity.getType()), pitch); } - if (disguise.getType() == DisguiseType.EXPERIENCE_ORB) { + if (disguise.getType() == DisguiseType.EXPERIENCE_ORB) + { spawnPackets[0] = new PacketContainer(Server.SPAWN_ENTITY_EXPERIENCE_ORB); + StructureModifier mods = spawnPackets[0].getModifier(); + mods.write(0, disguisedEntity.getEntityId()); mods.write(1, Math.floor(loc.getX() * 32)); mods.write(2, Math.floor(loc.getY() * 32) + 2); mods.write(3, Math.floor(loc.getZ() * 32)); mods.write(4, 1); - } else if (disguise.getType() == DisguiseType.PAINTING) { + } + else if (disguise.getType() == DisguiseType.PAINTING) + { spawnPackets[0] = new PacketContainer(Server.SPAWN_ENTITY_PAINTING); + StructureModifier mods = spawnPackets[0].getModifier(); + mods.write(0, disguisedEntity.getEntityId()); mods.write(1, disguisedEntity.getUniqueId()); mods.write(2, ReflectionManager.getBlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); mods.write(3, ReflectionManager.getEnumDirection(((int) loc.getYaw()) % 4)); + int id = ((MiscDisguise) disguise).getData(); + mods.write(4, ReflectionManager.getEnumArt(Art.values()[id])); // Make the teleport packet to make it visible.. spawnPackets[1] = new PacketContainer(Server.ENTITY_TELEPORT); + mods = spawnPackets[1].getModifier(); + mods.write(0, disguisedEntity.getEntityId()); mods.write(1, Math.floor(loc.getX() * 32D)); mods.write(2, Math.floor(loc.getY() * 32D)); mods.write(3, Math.floor(loc.getZ() * 32D)); mods.write(4, yaw); mods.write(5, pitch); - } else if (disguise.getType().isPlayer()) { + } + else if (disguise.getType().isPlayer()) + { PlayerDisguise playerDisguise = (PlayerDisguise) disguise; + String name = playerDisguise.getSkin() != null ? playerDisguise.getSkin() : playerDisguise.getName(); int entityId = disguisedEntity.getEntityId(); boolean removeName = false; - if (!DisguiseUtilities.hasGameProfile(name)) { + + if (!DisguiseUtilities.hasGameProfile(name)) + { removeName = !DisguiseUtilities.getAddedByPlugins().contains(name); } + WrappedGameProfile gameProfile = playerDisguise.getGameProfile(); - if (removeName) { + + if (removeName) + { DisguiseUtilities.getAddedByPlugins().remove(name); } + Object entityPlayer = ReflectionManager.createEntityPlayer(player.getWorld(), gameProfile); spawnPackets[0] = ProtocolLibrary.getProtocolManager() - .createPacketConstructor(Server.NAMED_ENTITY_SPAWN, entityPlayer) - .createPacket(entityPlayer); + .createPacketConstructor(Server.NAMED_ENTITY_SPAWN, entityPlayer).createPacket(entityPlayer); - //Write spawn packet in order - spawnPackets[0].getIntegers().write(0, entityId); //Id + // Write spawn packet in order + spawnPackets[0].getIntegers().write(0, entityId); // Id spawnPackets[0].getDoubles().write(0, loc.getX()); spawnPackets[0].getDoubles().write(1, loc.getY()); spawnPackets[0].getDoubles().write(2, loc.getZ()); - spawnPackets[0].getDataWatcherModifier().write(0, createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); //watcher, duh + spawnPackets[0].getDataWatcherModifier().write(0, + createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); // watcher, + // duh - - - if (DisguiseConfig.isBedPacketsEnabled() && ((PlayerWatcher) disguise.getWatcher()).isSleeping()) { + if (DisguiseConfig.isBedPacketsEnabled() && ((PlayerWatcher) disguise.getWatcher()).isSleeping()) + { PacketContainer[] newPackets = new PacketContainer[spawnPackets.length + 1]; + System.arraycopy(spawnPackets, 1, newPackets, 2, spawnPackets.length - 1); + newPackets[0] = spawnPackets[0]; spawnPackets = newPackets; + PacketContainer[] bedPackets = DisguiseUtilities.getBedPackets(player, loc.clone().subtract(0, PacketsManager.getYModifier(disguisedEntity, disguise), 0), player.getLocation(), ((PlayerDisguise) disguise)); + System.arraycopy(bedPackets, 0, spawnPackets, 1, 2); } - ArrayList newPackets = new ArrayList<>(); + ArrayList newPackets = new ArrayList(); newPackets.add(null); - for (PacketContainer spawnPacket : spawnPackets) { - if (spawnPacket != null) { // Get rid of empty packet '1' if it exists. + + for (PacketContainer spawnPacket : spawnPackets) + { + if (spawnPacket != null) + { // Get rid of empty packet '1' if it exists. newPackets.add(spawnPacket); } } - //Send player info along with the disguise + // Send player info along with the disguise spawnPackets = newPackets.toArray(new PacketContainer[newPackets.size()]); spawnPackets[0] = new PacketContainer(Server.PLAYER_INFO); - //Add player to the list, necessary to spawn them + // Add player to the list, necessary to spawn them spawnPackets[0].getModifier().write(0, ReflectionManager.getEnumPlayerInfoAction(0)); + List playerList = new ArrayList(); + playerList.add(ReflectionManager.getPlayerInfoData(spawnPackets[0].getHandle(), playerDisguise.getGameProfile())); spawnPackets[0].getModifier().write(1, playerList); - //Remove player from the list + // Remove player from the list PacketContainer delayedPacket = spawnPackets[0].shallowClone(); + delayedPacket.getModifier().write(0, ReflectionManager.getEnumPlayerInfoAction(4)); - delayedPackets = new PacketContainer[]{delayedPacket}; - } else if (disguise.getType().isMob() || disguise.getType() == DisguiseType.ARMOR_STAND) { + + delayedPackets = new PacketContainer[] + { + delayedPacket + }; + } + else if (disguise.getType().isMob() || disguise.getType() == DisguiseType.ARMOR_STAND) + { Vector vec = disguisedEntity.getVelocity(); + spawnPackets[0] = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY_LIVING); + StructureModifier mods = spawnPackets[0].getModifier(); + mods.write(0, disguisedEntity.getEntityId()); mods.write(1, UUID.randomUUID()); mods.write(2, disguise.getType().getTypeId()); - //region Vector calculations + + // region Vector calculations double d1 = 3.9D; double d2 = vec.getX(); double d3 = vec.getY(); @@ -288,7 +393,8 @@ public class PacketsManager { d3 = d1; if (d4 > d1) d4 = d1; - //endregion + // endregion + mods.write(3, loc.getX()); mods.write(4, loc.getY()); mods.write(5, loc.getZ()); @@ -297,215 +403,277 @@ public class PacketsManager { mods.write(8, (int) (d4 * 8000.0D)); mods.write(9, yaw); mods.write(10, pitch); + spawnPackets[0].getDataWatcherModifier().write(0, createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); - } else if (disguise.getType().isMisc()) { + } + else if (disguise.getType().isMisc()) + { int objectId = disguise.getType().getObjectId(); int data = ((MiscDisguise) disguise).getData(); - if (disguise.getType() == DisguiseType.FALLING_BLOCK) { + + if (disguise.getType() == DisguiseType.FALLING_BLOCK) + { data = ReflectionManager.getCombinedId(((MiscDisguise) disguise).getId(), data); - } else if (disguise.getType() == DisguiseType.FISHING_HOOK && data == 0) { + } + else if (disguise.getType() == DisguiseType.FISHING_HOOK && data == 0) + { // If the MiscDisguise data isn't set. Then no entity id was provided, so default to the owners entity id data = disguisedEntity.getEntityId(); - } else if (disguise.getType() == DisguiseType.ITEM_FRAME) { + } + else if (disguise.getType() == DisguiseType.ITEM_FRAME) + { data = ((((int) loc.getYaw() % 360) + 720 + 45) / 90) % 4; } + Object nmsEntity = ReflectionManager.getNmsEntity(disguisedEntity); + spawnPackets[0] = ProtocolLibrary.getProtocolManager() .createPacketConstructor(PacketType.Play.Server.SPAWN_ENTITY, nmsEntity, objectId, data) .createPacket(nmsEntity, objectId, data); spawnPackets[0].getModifier().write(8, pitch); spawnPackets[0].getModifier().write(9, yaw); - if (disguise.getType() == DisguiseType.ITEM_FRAME) { - if (data % 2 == 0) { + + if (disguise.getType() == DisguiseType.ITEM_FRAME) + { + if (data % 2 == 0) + { spawnPackets[0].getModifier().write(4, (int) Math.floor((loc.getZ() + (data == 0 ? -1 : 1)) * 32D)); - } else { + } + else + { spawnPackets[0].getModifier().write(2, (int) Math.floor((loc.getX() + (data == 3 ? -1 : 1)) * 32D)); } } } - if (spawnPackets[1] == null || disguise.isPlayerDisguise()) { + if (spawnPackets[1] == null || disguise.isPlayerDisguise()) + { int entry = spawnPackets[1] == null ? 1 : 0; - if (entry == 0) { + + if (entry == 0) + { entry = spawnPackets.length; spawnPackets = Arrays.copyOf(spawnPackets, spawnPackets.length + 1); } // Make a packet to turn his head! + spawnPackets[entry] = new PacketContainer(Server.ENTITY_HEAD_ROTATION); + StructureModifier mods = spawnPackets[entry].getModifier(); + mods.write(0, disguisedEntity.getEntityId()); mods.write(1, yaw); } - return new PacketContainer[][]{spawnPackets, delayedPackets}; + return new PacketContainer[][] + { + spawnPackets, delayedPackets + }; } /** * Create a new datawatcher but with the 'correct' values */ - private static WrappedDataWatcher createDataWatcher(WrappedDataWatcher watcher, FlagWatcher flagWatcher) { + private static WrappedDataWatcher createDataWatcher(WrappedDataWatcher watcher, FlagWatcher flagWatcher) + { WrappedDataWatcher newWatcher = new WrappedDataWatcher(); - try { - List list = DisguiseConfig.isMetadataPacketsEnabled() ? flagWatcher.convert(watcher.getWatchableObjects()) : flagWatcher.getWatchableObjects(); - for (WrappedWatchableObject watchableObject : list) { - if (watchableObject == null) continue; - if (watchableObject.getValue() == null) continue; - if (Registry.get(watchableObject.getValue().getClass()) == null) continue; - WrappedDataWatcherObject obj = new WrappedDataWatcherObject(watchableObject.getIndex(), Registry.get(watchableObject.getValue().getClass())); + + try + { + List list = DisguiseConfig.isMetadataPacketsEnabled() + ? flagWatcher.convert(watcher.getWatchableObjects()) : flagWatcher.getWatchableObjects(); + + for (WrappedWatchableObject watchableObject : list) + { + if (watchableObject == null) + continue; + + if (watchableObject.getValue() == null) + continue; + + if (Registry.get(watchableObject.getValue().getClass()) == null) + continue; + + WrappedDataWatcherObject obj = new WrappedDataWatcherObject(watchableObject.getIndex(), + Registry.get(watchableObject.getValue().getClass())); + newWatcher.setObject(obj, watchableObject.getValue()); } - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(); } + return newWatcher; } - public static byte getPitch(DisguiseType disguiseType, DisguiseType entityType, byte value) { - switch (disguiseType) { - case MINECART: - case MINECART_CHEST: - case MINECART_COMMAND: - case MINECART_FURNACE: - case MINECART_HOPPER: - case MINECART_MOB_SPAWNER: - case MINECART_TNT: - value = (byte) -value; - break; - default: - break; + public static byte getPitch(DisguiseType disguiseType, DisguiseType entityType, byte value) + { + switch (disguiseType) + { + case MINECART: + case MINECART_CHEST: + case MINECART_COMMAND: + case MINECART_FURNACE: + case MINECART_HOPPER: + case MINECART_MOB_SPAWNER: + case MINECART_TNT: + value = (byte) -value; + break; + default: + break; } - switch (entityType) { - case MINECART: - case MINECART_CHEST: - case MINECART_FURNACE: - case MINECART_HOPPER: - case MINECART_MOB_SPAWNER: - case MINECART_TNT: - value = (byte) -value; - break; - default: - break; + switch (entityType) + { + case MINECART: + case MINECART_CHEST: + case MINECART_FURNACE: + case MINECART_HOPPER: + case MINECART_MOB_SPAWNER: + case MINECART_TNT: + value = (byte) -value; + break; + default: + break; } + return value; } /** * Add the yaw for the disguises */ - public static byte getYaw(DisguiseType disguiseType, EntityType entityType, byte value) { - switch (disguiseType) { - case MINECART: - case MINECART_CHEST: - case MINECART_COMMAND: - case MINECART_FURNACE: - case MINECART_HOPPER: - case MINECART_MOB_SPAWNER: - case MINECART_TNT: - value += 64; - break; - case ENDER_DRAGON: - value -= 128; - break; - case WITHER_SKULL: - value -= 128; - break; - case ARROW: - case TIPPED_ARROW: - case SPECTRAL_ARROW: - value = (byte) -value; - break; - case PAINTING: - case ITEM_FRAME: - value = (byte) -(value + 128); - break; - default: - if (disguiseType.isMisc() && disguiseType != DisguiseType.ARMOR_STAND) { - value -= 64; - } - break; - } - switch (entityType) { - case MINECART: - case MINECART_CHEST: - case MINECART_FURNACE: - case MINECART_HOPPER: - case MINECART_MOB_SPAWNER: - case MINECART_TNT: + public static byte getYaw(DisguiseType disguiseType, EntityType entityType, byte value) + { + switch (disguiseType) + { + case MINECART: + case MINECART_CHEST: + case MINECART_COMMAND: + case MINECART_FURNACE: + case MINECART_HOPPER: + case MINECART_MOB_SPAWNER: + case MINECART_TNT: + value += 64; + break; + case ENDER_DRAGON: + value -= 128; + break; + case WITHER_SKULL: + value -= 128; + break; + case ARROW: + case TIPPED_ARROW: + case SPECTRAL_ARROW: + value = (byte) -value; + break; + case PAINTING: + case ITEM_FRAME: + value = (byte) -(value + 128); + break; + default: + if (disguiseType.isMisc() && disguiseType != DisguiseType.ARMOR_STAND) + { value -= 64; - break; - case ENDER_DRAGON: - case WITHER_SKULL: - value += 128; - break; - case ARROW: - value = (byte) -value; - break; - case PAINTING: - case ITEM_FRAME: - value = (byte) -(value - 128); - break; - default: - if (!entityType.isAlive()) { - value += 64; - } - break; + } + + break; } + switch (entityType) + { + case MINECART: + case MINECART_CHEST: + case MINECART_FURNACE: + case MINECART_HOPPER: + case MINECART_MOB_SPAWNER: + case MINECART_TNT: + value -= 64; + break; + case ENDER_DRAGON: + case WITHER_SKULL: + value += 128; + break; + case ARROW: + value = (byte) -value; + break; + case PAINTING: + case ITEM_FRAME: + value = (byte) -(value - 128); + break; + default: + if (!entityType.isAlive()) + { + value += 64; + } + + break; + } + return value; } /** * Get the Y level to add to the disguise for realism. */ - public static double getYModifier(Entity entity, Disguise disguise) { + public static double getYModifier(Entity entity, Disguise disguise) + { double yMod = 0; + if ((disguise.getType() != DisguiseType.PLAYER || !((PlayerWatcher) disguise.getWatcher()).isSleeping()) - && entity.getType() == EntityType.DROPPED_ITEM) { + && entity.getType() == EntityType.DROPPED_ITEM) + { yMod -= 0.13; } - switch (disguise.getType()) { - case BAT: - if (entity instanceof LivingEntity) - return yMod + ((LivingEntity) entity).getEyeHeight(); + + switch (disguise.getType()) + { + case BAT: + if (entity instanceof LivingEntity) + return yMod + ((LivingEntity) entity).getEyeHeight(); + case MINECART: + case MINECART_COMMAND: + case MINECART_CHEST: + case MINECART_FURNACE: + case MINECART_HOPPER: + case MINECART_MOB_SPAWNER: + case MINECART_TNT: + switch (entity.getType()) + { case MINECART: - case MINECART_COMMAND: case MINECART_CHEST: case MINECART_FURNACE: case MINECART_HOPPER: case MINECART_MOB_SPAWNER: case MINECART_TNT: - switch (entity.getType()) { - case MINECART: - case MINECART_CHEST: - case MINECART_FURNACE: - case MINECART_HOPPER: - case MINECART_MOB_SPAWNER: - case MINECART_TNT: - return yMod; - default: - return yMod + 0.4; - } - case TIPPED_ARROW: - case SPECTRAL_ARROW: - case BOAT: - case EGG: - case ENDER_PEARL: - case ENDER_SIGNAL: - case FIREWORK: - case PAINTING: - case SMALL_FIREBALL: - case SNOWBALL: - case SPLASH_POTION: - case THROWN_EXP_BOTTLE: - case WITHER_SKULL: - return yMod + 0.7; - case PLAYER: - if (DisguiseConfig.isBedPacketsEnabled() && ((PlayerWatcher) disguise.getWatcher()).isSleeping()) { - return yMod + 0.35; - } - break; - case DROPPED_ITEM: - return yMod + 0.13; + return yMod; default: - break; + return yMod + 0.4; + } + case TIPPED_ARROW: + case SPECTRAL_ARROW: + case BOAT: + case EGG: + case ENDER_PEARL: + case ENDER_SIGNAL: + case FIREWORK: + case PAINTING: + case SMALL_FIREBALL: + case SNOWBALL: + case SPLASH_POTION: + case THROWN_EXP_BOTTLE: + case WITHER_SKULL: + return yMod + 0.7; + case PLAYER: + if (DisguiseConfig.isBedPacketsEnabled() && ((PlayerWatcher) disguise.getWatcher()).isSleeping()) + { + return yMod + 0.35; + } + + break; + case DROPPED_ITEM: + return yMod + 0.13; + default: + break; } return yMod; } @@ -513,73 +681,125 @@ public class PacketsManager { /** * Creates the packet listeners */ - public static void init(LibsDisguises plugin) { + public static void init(LibsDisguises plugin) + { libsDisguises = plugin; - soundsListener = new PacketAdapter(libsDisguises, ListenerPriority.NORMAL, Server.NAMED_SOUND_EFFECT, Server.ENTITY_STATUS) { + soundsListener = new PacketAdapter(libsDisguises, ListenerPriority.NORMAL, Server.NAMED_SOUND_EFFECT, + Server.ENTITY_STATUS) + { @Override - public void onPacketSending(PacketEvent event) { - if (event.isCancelled()) { + public void onPacketSending(PacketEvent event) + { + if (event.isCancelled()) + { return; } - if (event.isAsync()) { + if (event.isAsync()) + { return; } - if (event.getPlayer().getName().contains("UNKNOWN[")) //If the player is temporary + + if (event.getPlayer().getName().contains("UNKNOWN[")) // If the player is temporary return; + event.setPacket(event.getPacket().deepClone()); + StructureModifier mods = event.getPacket().getModifier(); + Player observer = event.getPlayer(); - if (event.getPacketType() == Server.NAMED_SOUND_EFFECT) { + + if (event.getPacketType() == Server.NAMED_SOUND_EFFECT) + { Object soundEffect = mods.read(0); + SoundType soundType = null; + Location soundLoc = new Location(observer.getWorld(), ((Integer) mods.read(2)) / 8D, ((Integer) mods.read(3)) / 8D, ((Integer) mods.read(4)) / 8D); + Entity disguisedEntity = null; DisguiseSound entitySound = null; + Disguise disguise = null; + Entity[] entities = soundLoc.getChunk().getEntities(); - for (Entity entity : entities) { + + for (Entity entity : entities) + { Disguise entityDisguise = DisguiseAPI.getDisguise(observer, entity); - if (entityDisguise != null) { + + if (entityDisguise != null) + { Location loc = entity.getLocation(); + loc = new Location(observer.getWorld(), ((int) (loc.getX() * 8)) / 8D, ((int) (loc.getY() * 8)) / 8D, ((int) (loc.getZ() * 8)) / 8D); - if (loc.equals(soundLoc)) { + + if (loc.equals(soundLoc)) + { entitySound = DisguiseSound.getType(entity.getType().name()); - if (entitySound != null) { + + if (entitySound != null) + { Object obj = null; - if (entity instanceof LivingEntity) { - try { + + if (entity instanceof LivingEntity) + { + try + { // Use reflection so that this works for either int or double methods obj = LivingEntity.class.getMethod("getHealth").invoke(entity); - if (obj instanceof Double ? (Double) obj == 0 : (Integer) obj == 0) { + + if (obj instanceof Double ? (Double) obj == 0 : (Integer) obj == 0) + { soundType = SoundType.DEATH; - } else { + } + else + { obj = null; } - } catch (Exception e) { + } + catch (Exception e) + { e.printStackTrace(); } } - if (obj == null) { + + if (obj == null) + { boolean hasInvun = false; + Object nmsEntity = ReflectionManager.getNmsEntity(entity); - try { - if (entity instanceof LivingEntity) { - hasInvun = ReflectionManager.getNmsField("Entity", "noDamageTicks").getInt( - nmsEntity) == ReflectionManager.getNmsField("EntityLiving", - "maxNoDamageTicks").getInt(nmsEntity); - } else { + + try + { + if (entity instanceof LivingEntity) + { + hasInvun = ReflectionManager.getNmsField("Entity", "noDamageTicks") + .getInt(nmsEntity) == ReflectionManager + .getNmsField("EntityLiving", "maxNoDamageTicks") + .getInt(nmsEntity); + } + else + { Class clazz = ReflectionManager.getNmsClass("DamageSource"); - hasInvun = (Boolean) ReflectionManager.getNmsMethod("Entity", "isInvulnerable", clazz) + + hasInvun = (Boolean) ReflectionManager + .getNmsMethod("Entity", "isInvulnerable", clazz) .invoke(nmsEntity, ReflectionManager.getNmsField(clazz, "GENERIC")); } - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(); } - soundType = entitySound.getType(ReflectionManager.convertSoundEffectToString(soundEffect), !hasInvun); + + soundType = entitySound.getType(ReflectionManager.convertSoundEffectToString(soundEffect), + !hasInvun); } - if (soundType != null) { + + if (soundType != null) + { disguise = entityDisguise; disguisedEntity = entity; break; @@ -588,79 +808,120 @@ public class PacketsManager { } } } - if (disguise != null) { - if (disguise.isSelfDisguiseSoundsReplaced() || disguisedEntity != event.getPlayer()) { - if (disguise.isSoundsReplaced()) { + + if (disguise != null) + { + if (disguise.isSelfDisguiseSoundsReplaced() || disguisedEntity != event.getPlayer()) + { + if (disguise.isSoundsReplaced()) + { String sound = null; + DisguiseSound dSound = DisguiseSound.getType(disguise.getType().name()); + if (dSound != null) sound = dSound.getSound(soundType); - if (sound == null) { + if (sound == null) + { event.setCancelled(true); - } else { - if (sound.equals("step.grass")) { - try { + } + else + { + if (sound.equals("step.grass")) + { + try + { int typeId = soundLoc.getWorld().getBlockTypeIdAt(soundLoc.getBlockX(), soundLoc.getBlockY() - 1, soundLoc.getBlockZ()); + Object block = ReflectionManager.getNmsMethod("RegistryMaterials", "a", int.class) - .invoke(ReflectionManager.getNmsField("Block", "REGISTRY").get(null), - typeId); - if (block != null) { + .invoke(ReflectionManager.getNmsField("Block", "REGISTRY").get(null), typeId); + + if (block != null) + { Object step = ReflectionManager.getNmsField("Block", "stepSound").get(block); - mods.write(0, ReflectionManager.getNmsMethod(step.getClass(), "getStepSound").invoke(step)); + + mods.write(0, ReflectionManager.getNmsMethod(step.getClass(), "getStepSound") + .invoke(step)); } - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(); } // There is no else statement. Because seriously. This should never be null. Unless // someone is // sending fake sounds. In which case. Why cancel it. - } else { + } + else + { mods.write(0, ReflectionManager.getCraftSoundEffect(sound)); + // Time to change the pitch and volume if (soundType == SoundType.HURT || soundType == SoundType.DEATH - || soundType == SoundType.IDLE) { + || soundType == SoundType.IDLE) + { // If the volume is the default - if (mods.read(5).equals(entitySound.getDamageAndIdleSoundVolume())) { + if (mods.read(5).equals(entitySound.getDamageAndIdleSoundVolume())) + { mods.write(5, dSound.getDamageAndIdleSoundVolume()); } + // Here I assume its the default pitch as I can't calculate if its real. if (disguise instanceof MobDisguise && disguisedEntity instanceof LivingEntity - && ((MobDisguise) disguise).doesDisguiseAge()) { + && ((MobDisguise) disguise).doesDisguiseAge()) + { boolean baby = false; - if (disguisedEntity instanceof Zombie) { + + if (disguisedEntity instanceof Zombie) + { baby = ((Zombie) disguisedEntity).isBaby(); - } else if (disguisedEntity instanceof Ageable) { + } + else if (disguisedEntity instanceof Ageable) + { baby = !((Ageable) disguisedEntity).isAdult(); } - if (((MobDisguise) disguise).isAdult() == baby) { + if (((MobDisguise) disguise).isAdult() == baby) + { float pitch = (Integer) mods.read(5); - if (baby) { + + if (baby) + { // If the pitch is not the expected if (pitch > 97 || pitch < 111) return; - pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) * 0.2F + 1.5F; + + pitch = (DisguiseUtilities.random.nextFloat() + - DisguiseUtilities.random.nextFloat()) * 0.2F + 1.5F; // Min = 1.5 // Cap = 97.5 // Max = 1.7 // Cap = 110.5 - } else { + } + else + { // If the pitch is not the expected if (pitch >= 63 || pitch <= 76) return; - pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) * 0.2F + 1.0F; + + pitch = (DisguiseUtilities.random.nextFloat() + - DisguiseUtilities.random.nextFloat()) * 0.2F + 1.0F; // Min = 1 // Cap = 63 // Max = 1.2 // Cap = 75.6 } + pitch *= 63; + if (pitch < 0) pitch = 0; + if (pitch > 255) pitch = 255; + mods.write(6, (int) pitch); } } @@ -670,70 +931,117 @@ public class PacketsManager { } } } - } else if (event.getPacketType() == Server.ENTITY_STATUS) { - if ((byte) mods.read(1) == 2) { + } + else if (event.getPacketType() == Server.ENTITY_STATUS) + { + if ((byte) mods.read(1) == 2) + { // It made a damage animation Entity entity = event.getPacket().getEntityModifier(observer.getWorld()).read(0); + Disguise disguise = DisguiseAPI.getDisguise(observer, entity); + if (disguise != null && !disguise.getType().isPlayer() - && (disguise.isSelfDisguiseSoundsReplaced() || entity != event.getPlayer())) { + && (disguise.isSelfDisguiseSoundsReplaced() || entity != event.getPlayer())) + { DisguiseSound disSound = DisguiseSound.getType(entity.getType().name()); + if (disSound == null) return; + SoundType soundType = null; Object obj = null; - if (entity instanceof LivingEntity) { - try { + + if (entity instanceof LivingEntity) + { + try + { obj = LivingEntity.class.getMethod("getHealth").invoke(entity); - if (obj instanceof Double ? (Double) obj == 0 : (Integer) obj == 0) { + + if (obj instanceof Double ? (Double) obj == 0 : (Integer) obj == 0) + { soundType = SoundType.DEATH; - } else { + } + else + { obj = null; } - } catch (Exception e) { + } + catch (Exception e) + { e.printStackTrace(); } } - if (obj == null) { + + if (obj == null) + { soundType = SoundType.HURT; } + if (disSound.getSound(soundType) == null - || (disguise.isSelfDisguiseSoundsReplaced() && entity == event.getPlayer())) { - if (disguise.isSelfDisguiseSoundsReplaced() && entity == event.getPlayer()) { + || (disguise.isSelfDisguiseSoundsReplaced() && entity == event.getPlayer())) + { + if (disguise.isSelfDisguiseSoundsReplaced() && entity == event.getPlayer()) + { cancelSound = !cancelSound; + if (cancelSound) return; } + disSound = DisguiseSound.getType(disguise.getType().name()); - if (disSound != null) { + + if (disSound != null) + { String sound = disSound.getSound(soundType); - if (sound != null) { + + if (sound != null) + { Location loc = entity.getLocation(); + PacketContainer packet = new PacketContainer(Server.NAMED_SOUND_EFFECT); + mods = packet.getModifier(); + Object craftSoundEffect = ReflectionManager.getCraftSoundEffect(sound); + mods.write(0, craftSoundEffect); - mods.write(1, ReflectionManager.getSoundCategory("master")); //Meh + mods.write(1, ReflectionManager.getSoundCategory("master")); // Meh mods.write(2, (int) (loc.getX() * 8D)); mods.write(3, (int) (loc.getY() * 8D)); mods.write(4, (int) (loc.getZ() * 8D)); mods.write(5, disSound.getDamageAndIdleSoundVolume()); + float pitch; - if (disguise instanceof MobDisguise && !((MobDisguise) disguise).isAdult()) { - pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) * 0.2F + 1.5F; - } else - pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) * 0.2F + 1.0F; + + if (disguise instanceof MobDisguise && !((MobDisguise) disguise).isAdult()) + { + pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) + * 0.2F + 1.5F; + } + else + pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) + * 0.2F + 1.0F; + if (disguise.getType() == DisguiseType.BAT) pitch *= 95F; + pitch *= 63; + if (pitch < 0) pitch = 0; + if (pitch > 255) pitch = 255; + mods.write(6, (int) pitch); - try { + + try + { ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet); - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(); } } @@ -744,102 +1052,159 @@ public class PacketsManager { } } }; - //Self disguise (/vsd) listener - viewDisguisesListener = new PacketAdapter(libsDisguises, ListenerPriority.HIGH, - Server.NAMED_ENTITY_SPAWN, Server.ATTACH_ENTITY, - Server.REL_ENTITY_MOVE, Server.ENTITY_MOVE_LOOK, - Server.ENTITY_LOOK, Server.ENTITY_TELEPORT, - Server.ENTITY_HEAD_ROTATION, Server.ENTITY_METADATA, - Server.ENTITY_EQUIPMENT, Server.ANIMATION, Server.BED, - Server.ENTITY_EFFECT, Server.ENTITY_VELOCITY, - Server.UPDATE_ATTRIBUTES, Server.ENTITY_STATUS) { + + // Self disguise (/vsd) listener + viewDisguisesListener = new PacketAdapter(libsDisguises, ListenerPriority.HIGH, Server.NAMED_ENTITY_SPAWN, + Server.ATTACH_ENTITY, Server.REL_ENTITY_MOVE, Server.ENTITY_MOVE_LOOK, Server.ENTITY_LOOK, Server.ENTITY_TELEPORT, + Server.ENTITY_HEAD_ROTATION, Server.ENTITY_METADATA, Server.ENTITY_EQUIPMENT, Server.ANIMATION, Server.BED, + Server.ENTITY_EFFECT, Server.ENTITY_VELOCITY, Server.UPDATE_ATTRIBUTES, Server.ENTITY_STATUS) + { @Override - public void onPacketSending(PacketEvent event) { + public void onPacketSending(PacketEvent event) + { if (event.isCancelled()) return; - if (event.getPlayer().getName().contains("UNKNOWN[")) //If the player is temporary + + if (event.getPlayer().getName().contains("UNKNOWN[")) // If the player is temporary return; + final Player observer = event.getPlayer(); - if (event.getPacket().getIntegers().read(0) == observer.getEntityId()) { - if (DisguiseAPI.isSelfDisguised(observer)) { + + if (event.getPacket().getIntegers().read(0) == observer.getEntityId()) + { + if (DisguiseAPI.isSelfDisguised(observer)) + { // Here I grab the packets to convert them to, So I can display them as if the disguise sent them. PacketContainer[][] transformed = transformPacket(event.getPacket(), observer, observer); + PacketContainer[] packets = transformed == null ? null : transformed[0]; + final PacketContainer[] delayedPackets = transformed == null ? null : transformed[1]; - if (packets == null) { - packets = new PacketContainer[]{event.getPacket()}; + + if (packets == null) + { + packets = new PacketContainer[] + { + event.getPacket() + }; } - for (PacketContainer packet : packets) { - if (packet.getType() != Server.PLAYER_INFO) { - if (packet.equals(event.getPacket())) { + + for (PacketContainer packet : packets) + { + if (packet.getType() != Server.PLAYER_INFO) + { + if (packet.equals(event.getPacket())) + { packet = packet.shallowClone(); } + packet.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); } - try { + + try + { ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(); } } - if (delayedPackets != null && delayedPackets.length > 0) { - Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() { - public void run() { - try { - for (PacketContainer packet : delayedPackets) { + + if (delayedPackets != null && delayedPackets.length > 0) + { + Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() + { + public void run() + { + try + { + for (PacketContainer packet : delayedPackets) + { ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); } - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(); } } }, 2); } - if (event.getPacketType() == Server.ENTITY_METADATA) { + + if (event.getPacketType() == Server.ENTITY_METADATA) + { event.setPacket(event.getPacket().deepClone()); - for (WrappedWatchableObject watch : event.getPacket().getWatchableCollectionModifier().read(0)) { - if (watch.getIndex() == 0) { + + for (WrappedWatchableObject watch : event.getPacket().getWatchableCollectionModifier().read(0)) + { + if (watch.getIndex() == 0) + { byte b = (byte) watch.getValue(); + byte a = (byte) (b | 1 << 5); + if ((b & 1 << 3) != 0) a = (byte) (a | 1 << 3); + watch.setValue(a); } } - } else if (event.getPacketType() == Server.NAMED_ENTITY_SPAWN) { + } + else if (event.getPacketType() == Server.NAMED_ENTITY_SPAWN) + { event.setCancelled(true); + PacketContainer packet = new PacketContainer(Server.ENTITY_METADATA); + StructureModifier mods = packet.getModifier(); + mods.write(0, observer.getEntityId()); + List watchableList = new ArrayList<>(); Byte b = 1 << 5; + if (observer.isSprinting()) b = (byte) (b | 1 << 3); - WrappedWatchableObject watch = new WrappedWatchableObject(ReflectionManager.createDataWatcherItem(0, b)); + + WrappedWatchableObject watch = new WrappedWatchableObject( + ReflectionManager.createDataWatcherItem(0, b)); + watchableList.add(watch); packet.getWatchableCollectionModifier().write(0, watchableList); - try { + + try + { ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet); - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(); } - } else if (event.getPacketType() == Server.ANIMATION) { - if (event.getPacket().getIntegers().read(1) != 2) { + } + else if (event.getPacketType() == Server.ANIMATION) + { + if (event.getPacket().getIntegers().read(1) != 2) + { event.setCancelled(true); } - } else if (event.getPacketType() == Server.ATTACH_ENTITY - || event.getPacketType() == Server.REL_ENTITY_MOVE - || event.getPacketType() == Server.ENTITY_MOVE_LOOK - || event.getPacketType() == Server.ENTITY_LOOK + } + else if (event.getPacketType() == Server.ATTACH_ENTITY || event.getPacketType() == Server.REL_ENTITY_MOVE + || event.getPacketType() == Server.ENTITY_MOVE_LOOK || event.getPacketType() == Server.ENTITY_LOOK || event.getPacketType() == Server.ENTITY_TELEPORT || event.getPacketType() == Server.ENTITY_HEAD_ROTATION || event.getPacketType() == Server.ENTITY_EFFECT - || event.getPacketType() == Server.ENTITY_EQUIPMENT) { + || event.getPacketType() == Server.ENTITY_EQUIPMENT) + { event.setCancelled(true); - } else if (event.getPacketType() == Server.ENTITY_STATUS) { + } + else if (event.getPacketType() == Server.ENTITY_STATUS) + { Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer()); + if (disguise.isSelfDisguiseSoundsReplaced() && !disguise.getType().isPlayer() - && event.getPacket().getBytes().read(0) == 2) { + && event.getPacket().getBytes().read(0) == 2) + { event.setCancelled(true); } } @@ -847,56 +1212,91 @@ public class PacketsManager { } } }; - inventoryListener = new PacketAdapter(libsDisguises, ListenerPriority.HIGHEST, Server.SET_SLOT, - Server.WINDOW_ITEMS, PacketType.Play.Client.HELD_ITEM_SLOT, - PacketType.Play.Client.SET_CREATIVE_SLOT, PacketType.Play.Client.WINDOW_CLICK) { + + inventoryListener = new PacketAdapter(libsDisguises, ListenerPriority.HIGHEST, Server.SET_SLOT, Server.WINDOW_ITEMS, + PacketType.Play.Client.HELD_ITEM_SLOT, PacketType.Play.Client.SET_CREATIVE_SLOT, + PacketType.Play.Client.WINDOW_CLICK) + { @Override - public void onPacketReceiving(final PacketEvent event) { + public void onPacketReceiving(final PacketEvent event) + { if (event.isCancelled()) return; - if (event.getPlayer().getName().contains("UNKNOWN[")) //If the player is temporary + + if (event.getPlayer().getName().contains("UNKNOWN[")) // If the player is temporary return; + if (!(event.getPlayer() instanceof com.comphenix.net.sf.cglib.proxy.Factory) - && event.getPlayer().getVehicle() == null) { + && event.getPlayer().getVehicle() == null) + { Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer()); + // If player is disguised, views self disguises and has a inventory modifier - if (disguise != null && disguise.isSelfDisguiseVisible() && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { + if (disguise != null && disguise.isSelfDisguiseVisible() + && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) + { // If they are in creative and clicked on a slot - if (event.getPacketType() == PacketType.Play.Client.SET_CREATIVE_SLOT) { + if (event.getPacketType() == PacketType.Play.Client.SET_CREATIVE_SLOT) + { int slot = event.getPacket().getIntegers().read(0); - if (slot >= 5 && slot <= 8) { - if (disguise.isHidingArmorFromSelf()) { + + if (slot >= 5 && slot <= 8) + { + if (disguise.isHidingArmorFromSelf()) + { int armorSlot = Math.abs((slot - 5) - 3); - org.bukkit.inventory.ItemStack item = event.getPlayer().getInventory().getArmorContents()[armorSlot]; - if (item != null && item.getType() != Material.AIR) { + + org.bukkit.inventory.ItemStack item = event.getPlayer().getInventory() + .getArmorContents()[armorSlot]; + + if (item != null && item.getType() != Material.AIR) + { PacketContainer packet = new PacketContainer(Server.SET_SLOT); + StructureModifier mods = packet.getModifier(); + mods.write(0, 0); mods.write(1, slot); mods.write(2, ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); - try { + + try + { ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(); } } } - } else if (slot >= 36 && slot <= 44) { - if (disguise.isHidingHeldItemFromSelf()) { + } + else if (slot >= 36 && slot <= 44) + { + if (disguise.isHidingHeldItemFromSelf()) + { int currentSlot = event.getPlayer().getInventory().getHeldItemSlot(); - if (slot + 36 == currentSlot) { + + if (slot + 36 == currentSlot) + { org.bukkit.inventory.ItemStack item = event.getPlayer().getItemInHand(); - if (item != null && item.getType() != Material.AIR) { + + if (item != null && item.getType() != Material.AIR) + { PacketContainer packet = new PacketContainer(Server.SET_SLOT); + StructureModifier mods = packet.getModifier(); mods.write(0, 0); mods.write(1, slot); mods.write(2, ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); - try { + + try + { ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(); } } @@ -905,97 +1305,149 @@ public class PacketsManager { } } // If the player switched item, aka he moved from slot 1 to slot 2 - else if (event.getPacketType() == PacketType.Play.Client.HELD_ITEM_SLOT) { - if (disguise.isHidingHeldItemFromSelf()) { + else if (event.getPacketType() == PacketType.Play.Client.HELD_ITEM_SLOT) + { + if (disguise.isHidingHeldItemFromSelf()) + { // From logging, it seems that both bukkit and nms uses the same thing for the slot switching. // 0 1 2 3 - 8 // If the packet is coming, then I need to replace the item they are switching to // As for the old item, I need to restore it. org.bukkit.inventory.ItemStack currentlyHeld = event.getPlayer().getItemInHand(); // If his old weapon isn't air - if (currentlyHeld != null && currentlyHeld.getType() != Material.AIR) { + if (currentlyHeld != null && currentlyHeld.getType() != Material.AIR) + { PacketContainer packet = new PacketContainer(Server.SET_SLOT); + StructureModifier mods = packet.getModifier(); + mods.write(0, 0); mods.write(1, event.getPlayer().getInventory().getHeldItemSlot() + 36); mods.write(2, ReflectionManager.getNmsItem(currentlyHeld)); - try { + + try + { ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(); } } + org.bukkit.inventory.ItemStack newHeld = event.getPlayer().getInventory() .getItem(event.getPacket().getIntegers().read(0)); + // If his new weapon isn't air either! - if (newHeld != null && newHeld.getType() != Material.AIR) { + if (newHeld != null && newHeld.getType() != Material.AIR) + { PacketContainer packet = new PacketContainer(Server.SET_SLOT); + StructureModifier mods = packet.getModifier(); + mods.write(0, 0); mods.write(1, event.getPacket().getIntegers().read(0) + 36); mods.write(2, ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); - try { + + try + { ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(); } } } - } else if (event.getPacketType() == PacketType.Play.Client.WINDOW_CLICK) { + } + else if (event.getPacketType() == PacketType.Play.Client.WINDOW_CLICK) + { int slot = event.getPacket().getIntegers().read(1); + org.bukkit.inventory.ItemStack clickedItem; - if (event.getPacket().getShorts().read(0) == 1) { + + if (event.getPacket().getShorts().read(0) == 1) + { // Its a shift click clickedItem = event.getPacket().getItemModifier().read(0); - if (clickedItem != null && clickedItem.getType() != Material.AIR) { + + if (clickedItem != null && clickedItem.getType() != Material.AIR) + { // Rather than predict the clients actions // Lets just update the entire inventory.. - Bukkit.getScheduler().runTask(libsDisguises, new Runnable() { - public void run() { + Bukkit.getScheduler().runTask(libsDisguises, new Runnable() + { + public void run() + { event.getPlayer().updateInventory(); } }); } + return; - } else { + } + else + { // If its not a player inventory click // Shift clicking is exempted for the item in hand.. - if (event.getPacket().getIntegers().read(0) != 0) { + if (event.getPacket().getIntegers().read(0) != 0) + { return; } + clickedItem = event.getPlayer().getItemOnCursor(); } - if (clickedItem != null && clickedItem.getType() != Material.AIR) { + + if (clickedItem != null && clickedItem.getType() != Material.AIR) + { // If the slot is a armor slot - if (slot >= 5 && slot <= 8) { - if (disguise.isHidingArmorFromSelf()) { + if (slot >= 5 && slot <= 8) + { + if (disguise.isHidingArmorFromSelf()) + { PacketContainer packet = new PacketContainer(Server.SET_SLOT); + StructureModifier mods = packet.getModifier(); + mods.write(0, 0); mods.write(1, slot); mods.write(2, ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); - try { + + try + { ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(); } } // Else if its a hotbar slot - } else if (slot >= 36 && slot <= 44) { - if (disguise.isHidingHeldItemFromSelf()) { + } + else if (slot >= 36 && slot <= 44) + { + if (disguise.isHidingHeldItemFromSelf()) + { int currentSlot = event.getPlayer().getInventory().getHeldItemSlot(); + // Check if the player is on the same slot as the slot that its setting - if (slot == currentSlot + 36) { + if (slot == currentSlot + 36) + { PacketContainer packet = new PacketContainer(Server.SET_SLOT); + StructureModifier mods = packet.getModifier(); mods.write(0, 0); mods.write(1, slot); mods.write(2, ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); - try { + + try + { ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(); } } @@ -1008,80 +1460,119 @@ public class PacketsManager { } @Override - public void onPacketSending(PacketEvent event) { + public void onPacketSending(PacketEvent event) + { // If the inventory is the players inventory if (!(event.getPlayer() instanceof com.comphenix.net.sf.cglib.proxy.Factory) - && event.getPlayer().getVehicle() == null && event.getPacket().getIntegers().read(0) == 0) { + && event.getPlayer().getVehicle() == null && event.getPacket().getIntegers().read(0) == 0) + { + Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer()); + // If the player is disguised, views self disguises and is hiding a item. if (disguise != null && disguise.isSelfDisguiseVisible() - && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { + && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) + { // If the server is setting the slot // Need to set it to air if its in a place it shouldn't be. // Things such as picking up a item, spawned in item. Plugin sets the item. etc. Will fire this /** * Done */ - if (event.getPacketType() == Server.SET_SLOT) { + if (event.getPacketType() == Server.SET_SLOT) + { // The raw slot // nms code has the start of the hotbar being 36. int slot = event.getPacket().getIntegers().read(1); + // If the slot is a armor slot - if (slot >= 5 && slot <= 8) { - if (disguise.isHidingArmorFromSelf()) { + if (slot >= 5 && slot <= 8) + { + if (disguise.isHidingArmorFromSelf()) + { // Get the bukkit armor slot! int armorSlot = Math.abs((slot - 5) - 3); - org.bukkit.inventory.ItemStack item = event.getPlayer().getInventory().getArmorContents()[armorSlot]; - if (item != null && item.getType() != Material.AIR) { + + org.bukkit.inventory.ItemStack item = event.getPlayer().getInventory() + .getArmorContents()[armorSlot]; + + if (item != null && item.getType() != Material.AIR) + { event.setPacket(event.getPacket().shallowClone()); - event.getPacket().getModifier() - .write(2, ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); + + event.getPacket().getModifier().write(2, + ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); } } // Else if its a hotbar slot - } else if (slot >= 36 && slot <= 44) { - if (disguise.isHidingHeldItemFromSelf()) { + } + else if (slot >= 36 && slot <= 44) + { + if (disguise.isHidingHeldItemFromSelf()) + { int currentSlot = event.getPlayer().getInventory().getHeldItemSlot(); + // Check if the player is on the same slot as the slot that its setting - if (slot == currentSlot + 36) { + if (slot == currentSlot + 36) + { org.bukkit.inventory.ItemStack item = event.getPlayer().getItemInHand(); - if (item != null && item.getType() != Material.AIR) { + + if (item != null && item.getType() != Material.AIR) + { event.setPacket(event.getPacket().shallowClone()); - event.getPacket() - .getModifier() - .write(2, ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); + event.getPacket().getModifier().write(2, + ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); } } } } - } else if (event.getPacketType() == Server.WINDOW_ITEMS) { + } + else if (event.getPacketType() == Server.WINDOW_ITEMS) + { event.setPacket(event.getPacket().deepClone()); + StructureModifier mods = event.getPacket().getItemArrayModifier(); ItemStack[] items = mods.read(0); - for (int slot = 0; slot < items.length; slot++) { - if (slot >= 5 && slot <= 8) { - if (disguise.isHidingArmorFromSelf()) { + + for (int slot = 0; slot < items.length; slot++) + { + if (slot >= 5 && slot <= 8) + { + if (disguise.isHidingArmorFromSelf()) + { // Get the bukkit armor slot! int armorSlot = Math.abs((slot - 5) - 3); - org.bukkit.inventory.ItemStack item = event.getPlayer().getInventory().getArmorContents()[armorSlot]; - if (item != null && item.getType() != Material.AIR) { + + org.bukkit.inventory.ItemStack item = event.getPlayer().getInventory() + .getArmorContents()[armorSlot]; + + if (item != null && item.getType() != Material.AIR) + { items[slot] = new org.bukkit.inventory.ItemStack(0); } } // Else if its a hotbar slot - } else if (slot >= 36 && slot <= 44) { - if (disguise.isHidingHeldItemFromSelf()) { + } + else if (slot >= 36 && slot <= 44) + { + if (disguise.isHidingHeldItemFromSelf()) + { int currentSlot = event.getPlayer().getInventory().getHeldItemSlot(); + // Check if the player is on the same slot as the slot that its setting - if (slot == currentSlot + 36) { + if (slot == currentSlot + 36) + { org.bukkit.inventory.ItemStack item = event.getPlayer().getItemInHand(); - if (item != null && item.getType() != Material.AIR) { + + if (item != null && item.getType() != Material.AIR) + { items[slot] = new org.bukkit.inventory.ItemStack(0); } } } } } + mods.write(0, items); } } @@ -1090,43 +1581,58 @@ public class PacketsManager { }; } - public static boolean isHearDisguisesEnabled() { + public static boolean isHearDisguisesEnabled() + { return soundsListenerEnabled; } - public static boolean isInventoryListenerEnabled() { + public static boolean isInventoryListenerEnabled() + { return inventoryModifierEnabled; } - public static boolean isViewDisguisesListenerEnabled() { + public static boolean isViewDisguisesListenerEnabled() + { return viewDisguisesListenerEnabled; } - public static void setHearDisguisesListener(boolean enabled) { - //TODO: FIX SOUNDS -// if (soundsListenerEnabled != enabled) { -// soundsListenerEnabled = enabled; -// if (soundsListenerEnabled) { -// ProtocolLibrary.getProtocolManager().addPacketListener(soundsListener); -// } else { -// ProtocolLibrary.getProtocolManager().removePacketListener(soundsListener); -// } -// } + public static void setHearDisguisesListener(boolean enabled) + { + // TODO: FIX SOUNDS + // if (soundsListenerEnabled != enabled) { + // soundsListenerEnabled = enabled; + // if (soundsListenerEnabled) { + // ProtocolLibrary.getProtocolManager().addPacketListener(soundsListener); + // } else { + // ProtocolLibrary.getProtocolManager().removePacketListener(soundsListener); + // } + // } } - public static void setInventoryListenerEnabled(boolean enabled) { - if (inventoryModifierEnabled != enabled) { + public static void setInventoryListenerEnabled(boolean enabled) + { + if (inventoryModifierEnabled != enabled) + { inventoryModifierEnabled = enabled; - if (inventoryModifierEnabled) { + + if (inventoryModifierEnabled) + { ProtocolLibrary.getProtocolManager().addPacketListener(inventoryListener); - } else { + } + else + { ProtocolLibrary.getProtocolManager().removePacketListener(inventoryListener); } - for (Player player : Bukkit.getOnlinePlayers()) { + + for (Player player : Bukkit.getOnlinePlayers()) + { Disguise disguise = DisguiseAPI.getDisguise(player, player); - if (disguise != null) { + + if (disguise != null) + { if (viewDisguisesListenerEnabled && disguise.isSelfDisguiseVisible() - && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { + && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) + { player.updateInventory(); } } @@ -1134,11 +1640,15 @@ public class PacketsManager { } } - public static void setupMainPacketsListener() { - if (clientInteractEntityListener != null) { - if (mainListener != null) { + public static void setupMainPacketsListener() + { + if (clientInteractEntityListener != null) + { + if (mainListener != null) + { ProtocolLibrary.getProtocolManager().removePacketListener(mainListener); } + List packetsToListen = new ArrayList<>(); // Add spawn packets { @@ -1148,105 +1658,161 @@ public class PacketsManager { packetsToListen.add(Server.SPAWN_ENTITY_LIVING); packetsToListen.add(Server.SPAWN_ENTITY_PAINTING); } + // Add packets that always need to be enabled to ensure safety { packetsToListen.add(Server.ENTITY_METADATA); } - if (DisguiseConfig.isCollectPacketsEnabled()) { + + if (DisguiseConfig.isCollectPacketsEnabled()) + { packetsToListen.add(Server.COLLECT); } - if (DisguiseConfig.isMiscDisguisesForLivingEnabled()) { + + if (DisguiseConfig.isMiscDisguisesForLivingEnabled()) + { packetsToListen.add(Server.UPDATE_ATTRIBUTES); } + // The bed packet. - if (DisguiseConfig.isBedPacketsEnabled()) { + if (DisguiseConfig.isBedPacketsEnabled()) + { packetsToListen.add(Server.BED); } + // Add movement packets - if (DisguiseConfig.isMovementPacketsEnabled()) { + if (DisguiseConfig.isMovementPacketsEnabled()) + { packetsToListen.add(Server.ENTITY_LOOK); packetsToListen.add(Server.ENTITY_MOVE_LOOK); packetsToListen.add(Server.ENTITY_HEAD_ROTATION); packetsToListen.add(Server.ENTITY_TELEPORT); packetsToListen.add(Server.REL_ENTITY_MOVE); } + // Add equipment packet - if (DisguiseConfig.isEquipmentPacketsEnabled()) { + if (DisguiseConfig.isEquipmentPacketsEnabled()) + { packetsToListen.add(Server.ENTITY_EQUIPMENT); } + // Add the packet that ensures if they are sleeping or not - if (DisguiseConfig.isAnimationPacketsEnabled()) { + if (DisguiseConfig.isAnimationPacketsEnabled()) + { packetsToListen.add(Server.ANIMATION); } + // Add the packet that makes sure that entities with armor do not send unpickupable armor on death - if (DisguiseConfig.isEntityStatusPacketsEnabled()) { + if (DisguiseConfig.isEntityStatusPacketsEnabled()) + { packetsToListen.add(Server.ENTITY_STATUS); } - mainListener = new PacketAdapter(libsDisguises, ListenerPriority.HIGH, packetsToListen) { + mainListener = new PacketAdapter(libsDisguises, ListenerPriority.HIGH, packetsToListen) + { @Override - public void onPacketSending(PacketEvent event) { + public void onPacketSending(PacketEvent event) + { if (event.isCancelled()) return; - if (event.getPlayer().getName().contains("UNKNOWN[")) //If the player is temporary + + if (event.getPlayer().getName().contains("UNKNOWN[")) // If the player is temporary return; + final Player observer = event.getPlayer(); + // First get the entity, the one sending this packet StructureModifier entityModifer = event.getPacket().getEntityModifier(observer.getWorld()); + org.bukkit.entity.Entity entity = entityModifer.read((Server.COLLECT == event.getPacketType() ? 1 : 0)); + // If the entity is the same as the sender. Don't disguise! // Prevents problems and there is no advantage to be gained. if (entity == observer) return; + PacketContainer[][] packets = transformPacket(event.getPacket(), event.getPlayer(), entity); - if (packets != null) { + + if (packets != null) + { event.setCancelled(true); - try { - for (PacketContainer packet : packets[0]) { + + try + { + for (PacketContainer packet : packets[0]) + { ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); } + final PacketContainer[] delayed = packets[1]; - if (delayed.length > 0) { - Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() { - public void run() { - try { - for (PacketContainer packet : delayed) { + + if (delayed.length > 0) + { + Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() + { + public void run() + { + try + { + for (PacketContainer packet : delayed) + { ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); } - } catch (InvocationTargetException e) { + } + catch (InvocationTargetException e) + { e.printStackTrace(); } } }, 2); } - } catch (InvocationTargetException ex) { + } + catch (InvocationTargetException ex) + { ex.printStackTrace(); } } } }; + ProtocolLibrary.getProtocolManager().addPacketListener(mainListener); } } - public static void setViewDisguisesListener(boolean enabled) { - if (viewDisguisesListenerEnabled != enabled) { + public static void setViewDisguisesListener(boolean enabled) + { + if (viewDisguisesListenerEnabled != enabled) + { viewDisguisesListenerEnabled = enabled; - if (viewDisguisesListenerEnabled) { + + if (viewDisguisesListenerEnabled) + { ProtocolLibrary.getProtocolManager().addPacketListener(viewDisguisesListener); - } else { + } + else + { ProtocolLibrary.getProtocolManager().removePacketListener(viewDisguisesListener); } - for (Player player : Bukkit.getOnlinePlayers()) { + + for (Player player : Bukkit.getOnlinePlayers()) + { Disguise disguise = DisguiseAPI.getDisguise(player, player); - if (disguise != null) { - if (disguise.isSelfDisguiseVisible()) { - if (enabled) { + + if (disguise != null) + { + if (disguise.isSelfDisguiseVisible()) + { + if (enabled) + { DisguiseUtilities.setupFakeDisguise(disguise); - } else { + } + else + { DisguiseUtilities.removeSelfDisguise(player); } - if (inventoryModifierEnabled && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { + + if (inventoryModifierEnabled && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) + { player.updateInventory(); } } @@ -1259,144 +1825,216 @@ public class PacketsManager { * Transform the packet magically into the one I have always dreamed off. My true luv!!! This will return null if its not * transformed */ - public static PacketContainer[][] transformPacket(PacketContainer sentPacket, Player observer, Entity entity) { + public static PacketContainer[][] transformPacket(PacketContainer sentPacket, Player observer, Entity entity) + { PacketContainer[] packets = null; + PacketContainer[] delayedPackets = new PacketContainer[0]; - try { + + try + { Disguise disguise = DisguiseAPI.getDisguise(observer, entity); + // If disguised. - if (disguise != null) { - packets = new PacketContainer[]{sentPacket}; + if (disguise != null) + { + packets = new PacketContainer[] + { + sentPacket + }; // This packet sends attributes - if (sentPacket.getType() == Server.UPDATE_ATTRIBUTES) { - if (disguise.isMiscDisguise()) { + if (sentPacket.getType() == Server.UPDATE_ATTRIBUTES) + { + if (disguise.isMiscDisguise()) + { packets = new PacketContainer[0]; - } else { + } + else + { List attributes = new ArrayList<>(); - for (WrappedAttribute attribute : sentPacket.getAttributeCollectionModifier().read(0)) { - if (attribute.getAttributeKey().equals("generic.maxHealth")) { + + for (WrappedAttribute attribute : sentPacket.getAttributeCollectionModifier().read(0)) + { + if (attribute.getAttributeKey().equals("generic.maxHealth")) + { packets[0] = new PacketContainer(Server.UPDATE_ATTRIBUTES); + Builder builder; - if (((LivingWatcher) disguise.getWatcher()).isMaxHealthSet()) { + + if (((LivingWatcher) disguise.getWatcher()).isMaxHealthSet()) + { builder = WrappedAttribute.newBuilder(); builder.attributeKey("generic.maxHealth"); builder.baseValue(((LivingWatcher) disguise.getWatcher()).getMaxHealth()); - } else if (DisguiseConfig.isMaxHealthDeterminedByDisguisedEntity()) { + } + else if (DisguiseConfig.isMaxHealthDeterminedByDisguisedEntity()) + { builder = WrappedAttribute.newBuilder(attribute); - } else { + } + else + { builder = WrappedAttribute.newBuilder(); builder.attributeKey("generic.maxHealth"); builder.baseValue(DisguiseValues.getDisguiseValues(disguise.getType()).getMaxHealth()); } + builder.packet(packets[0]); + attributes.add(builder.build()); break; } } - if (!attributes.isEmpty()) { + + if (!attributes.isEmpty()) + { packets[0].getIntegers().write(0, entity.getEntityId()); packets[0].getAttributeCollectionModifier().write(0, attributes); - } else { + } + else + { packets = new PacketContainer[0]; } } } // Else if the packet is sending entity metadata - else if (sentPacket.getType() == Server.ENTITY_METADATA) { - if (DisguiseConfig.isMetadataPacketsEnabled() && !isStaticMetadataDisguiseType(disguise)) { - List watchableObjects = disguise.getWatcher().convert( - packets[0].getWatchableCollectionModifier().read(0)); + else if (sentPacket.getType() == Server.ENTITY_METADATA) + { + if (DisguiseConfig.isMetadataPacketsEnabled() && !isStaticMetadataDisguiseType(disguise)) + { + List watchableObjects = disguise.getWatcher() + .convert(packets[0].getWatchableCollectionModifier().read(0)); + packets[0] = new PacketContainer(sentPacket.getType()); + StructureModifier newMods = packets[0].getModifier(); + newMods.write(0, entity.getEntityId()); + packets[0].getWatchableCollectionModifier().write(0, watchableObjects); - } else { + } + else + { packets = new PacketContainer[0]; } } // Else if the packet is spawning.. - else if (sentPacket.getType() == Server.NAMED_ENTITY_SPAWN - || sentPacket.getType() == Server.SPAWN_ENTITY_LIVING + else if (sentPacket.getType() == Server.NAMED_ENTITY_SPAWN || sentPacket.getType() == Server.SPAWN_ENTITY_LIVING || sentPacket.getType() == Server.SPAWN_ENTITY_EXPERIENCE_ORB - || sentPacket.getType() == Server.SPAWN_ENTITY - || sentPacket.getType() == Server.SPAWN_ENTITY_PAINTING) { + || sentPacket.getType() == Server.SPAWN_ENTITY || sentPacket.getType() == Server.SPAWN_ENTITY_PAINTING) + { PacketContainer[][] spawnPackets = constructSpawnPackets(observer, disguise, entity); + packets = spawnPackets[0]; delayedPackets = spawnPackets[1]; } // Else if the disguise is attempting to send players a forbidden packet - else if (sentPacket.getType() == Server.ANIMATION) { - if (disguise.getType().isMisc() - || (packets[0].getIntegers().read(1) == 2 && (!disguise.getType() - .isPlayer() || (DisguiseConfig.isBedPacketsEnabled() && ((PlayerWatcher) disguise - .getWatcher()).isSleeping())))) { + else if (sentPacket.getType() == Server.ANIMATION) + { + if (disguise.getType().isMisc() || (packets[0].getIntegers().read(1) == 2 && (!disguise.getType().isPlayer() + || (DisguiseConfig.isBedPacketsEnabled() && ((PlayerWatcher) disguise.getWatcher()).isSleeping())))) + { packets = new PacketContainer[0]; } } - //Else if the disguise is collecting stuff - else if (sentPacket.getType() == Server.COLLECT) { - if (disguise.getType().isMisc()) { + // Else if the disguise is collecting stuff + else if (sentPacket.getType() == Server.COLLECT) + { + if (disguise.getType().isMisc()) + { packets = new PacketContainer[0]; - } else if (DisguiseConfig.isBedPacketsEnabled() && disguise.getType().isPlayer() - && ((PlayerWatcher) disguise.getWatcher()).isSleeping()) { + } + + else if (DisguiseConfig.isBedPacketsEnabled() && disguise.getType().isPlayer() + && ((PlayerWatcher) disguise.getWatcher()).isSleeping()) + { PacketContainer newPacket = new PacketContainer(Server.ANIMATION); + StructureModifier mods = newPacket.getIntegers(); mods.write(0, disguise.getEntity().getEntityId()); mods.write(1, 3); - packets = new PacketContainer[]{newPacket, sentPacket}; + + packets = new PacketContainer[] + { + newPacket, sentPacket + }; } } // Else if the disguise is moving. - else if (sentPacket.getType() == Server.ENTITY_MOVE_LOOK - || sentPacket.getType() == Server.ENTITY_LOOK - || sentPacket.getType() == Server.ENTITY_TELEPORT - || sentPacket.getType() == Server.REL_ENTITY_MOVE) { - if (disguise.getType() == DisguiseType.RABBIT && (sentPacket.getType() == Server.REL_ENTITY_MOVE || sentPacket.getType() == Server.ENTITY_MOVE_LOOK)) { - //Rabbit robbing... + else if (sentPacket.getType() == Server.ENTITY_MOVE_LOOK || sentPacket.getType() == Server.ENTITY_LOOK + || sentPacket.getType() == Server.ENTITY_TELEPORT || sentPacket.getType() == Server.REL_ENTITY_MOVE) + { + if (disguise.getType() == DisguiseType.RABBIT && (sentPacket.getType() == Server.REL_ENTITY_MOVE + || sentPacket.getType() == Server.ENTITY_MOVE_LOOK)) + { + // Rabbit robbing... if (entity.getMetadata("LibsRabbitHop").isEmpty() || System.currentTimeMillis() - entity.getMetadata("LibsRabbitHop").get(0).asLong() < 100 - || System.currentTimeMillis() - entity.getMetadata("LibsRabbitHop").get(0).asLong() > 500) { + || System.currentTimeMillis() - entity.getMetadata("LibsRabbitHop").get(0).asLong() > 500) + { if (entity.getMetadata("LibsRabbitHop").isEmpty() - || System.currentTimeMillis() - entity.getMetadata("LibsRabbitHop").get(0).asLong() > 500) { + || System.currentTimeMillis() - entity.getMetadata("LibsRabbitHop").get(0).asLong() > 500) + { entity.removeMetadata("LibsRabbitHop", libsDisguises); - entity.setMetadata("LibsRabbitHop", new FixedMetadataValue(libsDisguises, System.currentTimeMillis())); + entity.setMetadata("LibsRabbitHop", + new FixedMetadataValue(libsDisguises, System.currentTimeMillis())); } + packets = Arrays.copyOf(packets, packets.length + 1); + packets[1] = new PacketContainer(Server.ENTITY_STATUS); + packets[1].getIntegers().write(0, entity.getEntityId()); packets[1].getBytes().write(0, (byte) 1); } } - //Stop wither skulls from looking - if (sentPacket.getType() == Server.ENTITY_LOOK && disguise.getType() == DisguiseType.WITHER_SKULL) { + // Stop wither skulls from looking + if (sentPacket.getType() == Server.ENTITY_LOOK && disguise.getType() == DisguiseType.WITHER_SKULL) + { packets = new PacketContainer[0]; - } else if (sentPacket.getType() != Server.REL_ENTITY_MOVE) { + } + else if (sentPacket.getType() != Server.REL_ENTITY_MOVE) + { packets[0] = sentPacket.shallowClone(); + StructureModifier bytes = packets[0].getBytes(); + byte yawValue = bytes.read(0); - bytes.write(0, getYaw(disguise.getType(), entity.getType(), yawValue)); byte pitchValue = bytes.read(1); + + bytes.write(0, getYaw(disguise.getType(), entity.getType(), yawValue)); bytes.write(1, getPitch(disguise.getType(), DisguiseType.getType(entity.getType()), pitchValue)); - if (sentPacket.getType() == Server.ENTITY_TELEPORT && disguise.getType() == DisguiseType.ITEM_FRAME) { + + if (sentPacket.getType() == Server.ENTITY_TELEPORT && disguise.getType() == DisguiseType.ITEM_FRAME) + { StructureModifier doubles = packets[0].getDoubles(); + Location loc = entity.getLocation(); + double data = (((loc.getYaw() % 360) + 720 + 45) / 90) % 4; - if (data % 2 == 0) { - if (data % 2 == 0) { + + if (data % 2 == 0) + { + if (data % 2 == 0) + { doubles.write(3, loc.getZ()); - } else { + } + else + { doubles.write(1, loc.getZ()); } } + double y = getYModifier(entity, disguise); - if (y != 0) { + + if (y != 0) + { y *= 32; doubles.write(2, doubles.read(2) + y); } @@ -1404,109 +2042,153 @@ public class PacketsManager { } } - //Else if the disguise is updating equipment - else if (sentPacket.getType() == Server.ENTITY_EQUIPMENT) { + // Else if the disguise is updating equipment + else if (sentPacket.getType() == Server.ENTITY_EQUIPMENT) + { EquipmentSlot slot = ReflectionManager.createEquipmentSlot(packets[0].getModifier().read(1)); + org.bukkit.inventory.ItemStack itemStack = disguise.getWatcher().getItemStack(slot); - if (itemStack != null) { + + if (itemStack != null) + { packets[0] = packets[0].shallowClone(); - packets[0].getModifier().write(2, (itemStack.getTypeId() == 0 ? null : ReflectionManager.getNmsItem(itemStack))); + + packets[0].getModifier().write(2, + (itemStack.getTypeId() == 0 ? null : ReflectionManager.getNmsItem(itemStack))); } - if (disguise.getWatcher().isRightClicking() && slot == EquipmentSlot.HAND) { + if (disguise.getWatcher().isRightClicking() && slot == EquipmentSlot.HAND) + { ItemStack heldItem = packets[0].getItemModifier().read(0); - if (heldItem != null && heldItem.getType() != Material.AIR) { + + if (heldItem != null && heldItem.getType() != Material.AIR) + { // Convert the datawatcher List list = new ArrayList<>(); - if (DisguiseConfig.isMetadataPacketsEnabled() && !isStaticMetadataDisguiseType(disguise)) { - WrappedWatchableObject watch = new WrappedWatchableObject(ReflectionManager.createDataWatcherItem(0, - WrappedDataWatcher.getEntityWatcher(entity).getByte(0))); + + if (DisguiseConfig.isMetadataPacketsEnabled() && !isStaticMetadataDisguiseType(disguise)) + { + WrappedWatchableObject watch = new WrappedWatchableObject(ReflectionManager + .createDataWatcherItem(0, WrappedDataWatcher.getEntityWatcher(entity).getByte(0))); + list.add(watch); + list = disguise.getWatcher().convert(list); - } else { - for (WrappedWatchableObject obj : disguise.getWatcher().getWatchableObjects()) { - if (obj.getIndex() == 0) { + } + else + { + for (WrappedWatchableObject obj : disguise.getWatcher().getWatchableObjects()) + { + if (obj.getIndex() == 0) + { list.add(obj); break; } } } + // Construct the packets to return PacketContainer packetBlock = new PacketContainer(Server.ENTITY_METADATA); + packetBlock.getModifier().write(0, entity.getEntityId()); packetBlock.getWatchableCollectionModifier().write(0, list); + PacketContainer packetUnblock = packetBlock.deepClone(); // Make a packet to send the 'unblock' - for (WrappedWatchableObject watcher : packetUnblock.getWatchableCollectionModifier().read(0)) { + for (WrappedWatchableObject watcher : packetUnblock.getWatchableCollectionModifier().read(0)) + { watcher.setValue((byte) ((byte) watcher.getValue() & ~(1 << 4))); } + // Send the unblock before the itemstack change so that the 2nd metadata packet works. Why? Scheduler // delay. - packets = new PacketContainer[]{packetUnblock, packets[0], packetBlock}; + packets = new PacketContainer[] + { + packetUnblock, packets[0], packetBlock + }; // Silly mojang made the right clicking datawatcher value only valid for one use. So I have to reset // it. } } } - //If the entity is going into a bed, stop everything but players from doing this - else if (sentPacket.getType() == Server.BED) { - if (!disguise.getType().isPlayer()) { + // If the entity is going into a bed, stop everything but players from doing this + else if (sentPacket.getType() == Server.BED) + { + if (!disguise.getType().isPlayer()) + { packets = new PacketContainer[0]; } } - //If the entity is updating their Facebook status, stop them from showing death - else if (sentPacket.getType() == Server.ENTITY_STATUS) { - if (packets[0].getBytes().read(0) == (byte) 3) { + // If the entity is updating their Facebook status, stop them from showing death + else if (sentPacket.getType() == Server.ENTITY_STATUS) + { + if (packets[0].getBytes().read(0) == (byte) 3) + { packets = new PacketContainer[0]; } } - //If the entity is rotating his head - else if (sentPacket.getType() == Server.ENTITY_HEAD_ROTATION) { - if (disguise.getType().isPlayer() && entity.getType() != EntityType.PLAYER) { + // If the entity is rotating his head + else if (sentPacket.getType() == Server.ENTITY_HEAD_ROTATION) + { + if (disguise.getType().isPlayer() && entity.getType() != EntityType.PLAYER) + { Location loc = entity.getLocation(); + byte pitch = getPitch(disguise.getType(), DisguiseType.getType(entity.getType()), (byte) (int) (loc.getPitch() * 256.0F / 360.0F)); byte yaw = getYaw(disguise.getType(), entity.getType(), sentPacket.getBytes().read(0)); + PacketContainer rotation = new PacketContainer(Server.ENTITY_HEAD_ROTATION); + StructureModifier mods = rotation.getModifier(); + mods.write(0, entity.getEntityId()); mods.write(1, yaw); + PacketContainer look = new PacketContainer(Server.ENTITY_LOOK); + look.getIntegers().write(0, entity.getEntityId()); look.getBytes().write(0, yaw); look.getBytes().write(1, pitch); - packets = new PacketContainer[]{look, rotation}; + + packets = new PacketContainer[] + { + look, rotation + }; } } - //Whatever - else { + // Whatever + else + { packets = null; } } - } catch (Exception e) { + } + catch (Exception e) + { e.printStackTrace(); } - return packets == null ? null : new PacketContainer[][]{packets, delayedPackets}; + return packets == null ? null : new PacketContainer[][] + { + packets, delayedPackets + }; } /** * Returns true if this disguise type doesn't have changing metadata. + * * @param disguise * @return */ - public static boolean isStaticMetadataDisguiseType(Disguise disguise) { - return (disguise.getType() == DisguiseType.WOLF || - disguise.getType() == DisguiseType.OCELOT || - disguise.getType() == DisguiseType.ENDERMAN || - disguise.getType() == DisguiseType.SHULKER || - disguise.getType() == DisguiseType.SPLASH_POTION || - disguise.getType() == DisguiseType.FIREWORK || - disguise.getType() == DisguiseType.DROPPED_ITEM || - disguise.getType() == DisguiseType.ENDER_CRYSTAL - ); + public static boolean isStaticMetadataDisguiseType(Disguise disguise) + { + return (disguise.getType() == DisguiseType.WOLF || disguise.getType() == DisguiseType.OCELOT + || disguise.getType() == DisguiseType.ENDERMAN || disguise.getType() == DisguiseType.SHULKER + || disguise.getType() == DisguiseType.SPLASH_POTION || disguise.getType() == DisguiseType.FIREWORK + || disguise.getType() == DisguiseType.DROPPED_ITEM || disguise.getType() == DisguiseType.ENDER_CRYSTAL); } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/ReflectionManager.java b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java similarity index 58% rename from src/main/java/me/libraryaddict/disguise/utilities/ReflectionManager.java rename to src/me/libraryaddict/disguise/utilities/ReflectionManager.java index 01afdabc..df23d0d4 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/ReflectionManager.java +++ b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java @@ -1,12 +1,13 @@ package me.libraryaddict.disguise.utilities; -import com.comphenix.protocol.wrappers.MinecraftKey; -import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry; -import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer; -import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject; -import com.comphenix.protocol.wrappers.WrappedGameProfile; -import com.google.common.collect.ImmutableMap; -import com.mojang.authlib.GameProfile; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Map; +import java.util.UUID; + import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import org.bukkit.Art; @@ -23,15 +24,16 @@ import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.Map; -import java.util.UUID; +import com.comphenix.protocol.wrappers.MinecraftKey; +import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry; +import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer; +import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject; +import com.comphenix.protocol.wrappers.WrappedGameProfile; +import com.google.common.collect.ImmutableMap; +import com.mojang.authlib.GameProfile; -public class ReflectionManager { +public class ReflectionManager +{ private static final String bukkitVersion = Bukkit.getServer().getClass().getName().split("\\.")[3]; private static final Class craftItemClass; @@ -53,491 +55,732 @@ public class ReflectionManager { * * The publicly licensed version may be viewed here: https://gist.github.com/riking/2f330f831c30e2276df7 */ - static { - primitiveTypes = ImmutableMap., String>builder().put(boolean.class, "Z").put(byte.class, "B") + static + { + primitiveTypes = ImmutableMap., String> builder().put(boolean.class, "Z").put(byte.class, "B") .put(char.class, "C").put(short.class, "S").put(int.class, "I").put(long.class, "J").put(float.class, "F") .put(double.class, "D").put(void.class, "V").build(); } - static { - for (Method method : getNmsClass("EntityLiving").getDeclaredMethods()) { - try { + static + { + for (Method method : getNmsClass("EntityLiving").getDeclaredMethods()) + { + try + { if (method.getReturnType() == float.class && Modifier.isProtected(method.getModifiers()) - && method.getParameterTypes().length == 0) { + && method.getParameterTypes().length == 0) + { Object entity = createEntityInstance("Cow"); + method.setAccessible(true); float value = (Float) method.invoke(entity); - if (value == 0.4F) { + + if (value == 0.4F) + { damageAndIdleSoundMethod = method; break; } } - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } } + craftItemClass = getCraftClass("inventory.CraftItemStack"); + pingField = getNmsField("EntityPlayer", "ping"); + trackerField = getNmsField("WorldServer", "tracker"); + entitiesField = getNmsField("EntityTracker", "trackedEntities"); + ihmGet = getNmsMethod("IntHashMap", "get", int.class); - boundingBoxConstructor = getNmsConstructor("AxisAlignedBB", double.class, double.class, double.class, - double.class, double.class, double.class); + + boundingBoxConstructor = getNmsConstructor("AxisAlignedBB", double.class, double.class, double.class, double.class, + double.class, double.class); + setBoundingBoxMethod = getNmsMethod("Entity", "a", getNmsClass("AxisAlignedBB")); + entityCountField = getNmsField("Entity", "entityCount"); + entityCountField.setAccessible(true); } - public static Object createEntityInstance(String entityName) { - try { + public static Object createEntityInstance(String entityName) + { + try + { Class entityClass = getNmsClass("Entity" + entityName); Object entityObject; Object world = getWorldServer(Bukkit.getWorlds().get(0)); - switch (entityName) { - case "Player": - Object minecraftServer = getNmsMethod("MinecraftServer", "getServer").invoke(null); - Object playerinteractmanager = getNmsClass("PlayerInteractManager").getDeclaredConstructor(getNmsClass("World")).newInstance(world); - WrappedGameProfile gameProfile = getGameProfile(null, "Steve"); - entityObject = entityClass.getDeclaredConstructor(getNmsClass("MinecraftServer"), getNmsClass("WorldServer"), - gameProfile.getHandleType(), playerinteractmanager.getClass()).newInstance(minecraftServer, world, - gameProfile.getHandle(), playerinteractmanager); - break; - case "EnderPearl": - entityObject = entityClass.getDeclaredConstructor(getNmsClass("World"), getNmsClass("EntityLiving")).newInstance(world, createEntityInstance("Cow")); - break; - case "Potion": - entityObject = entityClass.getDeclaredConstructor(getNmsClass("World"), Double.TYPE, Double.TYPE, Double.TYPE, getNmsClass("ItemStack")) - .newInstance(world, 0d, 0d, 0d, getNmsItem(new ItemStack(Material.SPLASH_POTION))); + + switch (entityName) + { + case "Player": + Object minecraftServer = getNmsMethod("MinecraftServer", "getServer").invoke(null); + + Object playerinteractmanager = getNmsClass("PlayerInteractManager").getDeclaredConstructor(getNmsClass("World")) + .newInstance(world); + + WrappedGameProfile gameProfile = getGameProfile(null, "Steve"); + + entityObject = entityClass + .getDeclaredConstructor(getNmsClass("MinecraftServer"), getNmsClass("WorldServer"), + gameProfile.getHandleType(), playerinteractmanager.getClass()) + .newInstance(minecraftServer, world, gameProfile.getHandle(), playerinteractmanager); + break; + case "EnderPearl": + entityObject = entityClass.getDeclaredConstructor(getNmsClass("World"), getNmsClass("EntityLiving")) + .newInstance(world, createEntityInstance("Cow")); + break; + case "Potion": + entityObject = entityClass + .getDeclaredConstructor(getNmsClass("World"), Double.TYPE, Double.TYPE, Double.TYPE, + getNmsClass("ItemStack")) + .newInstance(world, 0d, 0d, 0d, getNmsItem(new ItemStack(Material.SPLASH_POTION))); + break; + default: + entityObject = entityClass.getDeclaredConstructor(getNmsClass("World")).newInstance(world); break; - default: - entityObject = entityClass.getDeclaredConstructor(getNmsClass("World")).newInstance(world); - break; } + return entityObject; - } catch (Exception e) { + } + catch (Exception e) + { e.printStackTrace(System.out); } + return null; } - public static Object getMobEffectList(int id) { + public static Object getMobEffectList(int id) + { Method nmsMethod = getNmsMethod("MobEffectList", "fromId", Integer.TYPE); - try { + + try + { return nmsMethod.invoke(null, id); - } catch (IllegalAccessException | InvocationTargetException e) { + } + catch (IllegalAccessException | InvocationTargetException e) + { e.printStackTrace(); - return null; } - } - public static Object createMobEffect(PotionEffect effect) { - return createMobEffect(effect.getType().getId(), effect.getDuration(), effect.getAmplifier(), effect.isAmbient(), effect.hasParticles()); - } - - public static Object createMobEffect(int id, int duration, int amplification, boolean ambient, boolean particles) { - try { - return getNmsClass("MobEffect").getDeclaredConstructor(getNmsClass("MobEffectList"), Integer.TYPE, Integer.TYPE, Boolean.TYPE, Boolean.TYPE) - .newInstance(getMobEffectList(id), duration, amplification, ambient, particles); - } catch (Exception e) { - e.printStackTrace(System.out); - } return null; } - private static String dir2fqn(String s) { + public static Object createMobEffect(PotionEffect effect) + { + return createMobEffect(effect.getType().getId(), effect.getDuration(), effect.getAmplifier(), effect.isAmbient(), + effect.hasParticles()); + } + + public static Object createMobEffect(int id, int duration, int amplification, boolean ambient, boolean particles) + { + try + { + return getNmsClass("MobEffect") + .getDeclaredConstructor(getNmsClass("MobEffectList"), Integer.TYPE, Integer.TYPE, Boolean.TYPE, Boolean.TYPE) + .newInstance(getMobEffectList(id), duration, amplification, ambient, particles); + } + catch (Exception e) + { + e.printStackTrace(System.out); + } + + return null; + } + + private static String dir2fqn(String s) + { return s.replaceAll("/", "."); } - public static FakeBoundingBox getBoundingBox(Entity entity) { - try { + public static FakeBoundingBox getBoundingBox(Entity entity) + { + try + { Object boundingBox = getNmsMethod("Entity", "getBoundingBox").invoke(getNmsEntity(entity)); + double x = 0, y = 0, z = 0; int stage = 0; - for (Field field : boundingBox.getClass().getDeclaredFields()) { - if (field.getType().getSimpleName().equals("double")) { + + for (Field field : boundingBox.getClass().getDeclaredFields()) + { + if (field.getType().getSimpleName().equals("double")) + { stage++; - switch (stage) { - case 1: - x -= field.getDouble(boundingBox); - break; - case 2: - y -= field.getDouble(boundingBox); - break; - case 3: - z -= field.getDouble(boundingBox); - break; - case 4: - x += field.getDouble(boundingBox); - break; - case 5: - y += field.getDouble(boundingBox); - break; - case 6: - z += field.getDouble(boundingBox); - break; - default: - throw new Exception("Error while setting the bounding box, more doubles than I thought??"); + + switch (stage) + { + case 1: + x -= field.getDouble(boundingBox); + break; + case 2: + y -= field.getDouble(boundingBox); + break; + case 3: + z -= field.getDouble(boundingBox); + break; + case 4: + x += field.getDouble(boundingBox); + break; + case 5: + y += field.getDouble(boundingBox); + break; + case 6: + z += field.getDouble(boundingBox); + break; + default: + throw new Exception("Error while setting the bounding box, more doubles than I thought??"); } } } + return new FakeBoundingBox(x, y, z); - - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } + return null; } - public static Entity getBukkitEntity(Object nmsEntity) { - try { + public static Entity getBukkitEntity(Object nmsEntity) + { + try + { return (Entity) getNmsMethod("Entity", "getBukkitEntity").invoke(nmsEntity); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } + return null; } - public static ItemStack getBukkitItem(Object nmsItem) { - try { + public static ItemStack getBukkitItem(Object nmsItem) + { + try + { return (ItemStack) craftItemClass.getMethod("asBukkitCopy", getNmsClass("ItemStack")).invoke(null, nmsItem); - } catch (Exception e) { + } + catch (Exception e) + { e.printStackTrace(System.out); } + return null; } - public static String getBukkitVersion() { + public static String getBukkitVersion() + { return bukkitVersion; } - public static Class getCraftClass(String className) { - try { + public static Class getCraftClass(String className) + { + try + { return Class.forName("org.bukkit.craftbukkit." + getBukkitVersion() + "." + className); - } catch (Exception e) { + } + catch (Exception e) + { e.printStackTrace(System.out); } + return null; } - public static Constructor getCraftConstructor(Class clazz, Class... parameters) { - try { + public static Constructor getCraftConstructor(Class clazz, Class... parameters) + { + try + { Constructor declaredConstructor = clazz.getDeclaredConstructor(parameters); declaredConstructor.setAccessible(true); return declaredConstructor; - } catch (NoSuchMethodException e) { + } + catch (NoSuchMethodException e) + { e.printStackTrace(System.out); } + return null; } - public static Constructor getCraftConstructor(String className, Class... parameters) { + public static Constructor getCraftConstructor(String className, Class... parameters) + { return getCraftConstructor(getCraftClass(className), parameters); } - public static String getCraftSound(Sound sound) { - try { + public static String getCraftSound(Sound sound) + { + try + { return (String) getCraftClass("CraftSound").getMethod("getSound", Sound.class).invoke(null, sound); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } + return null; } - public static Object getEntityTrackerEntry(Entity target) throws Exception { + public static Object getEntityTrackerEntry(Entity target) throws Exception + { Object world = getWorldServer(target.getWorld()); Object tracker = trackerField.get(world); Object trackedEntities = entitiesField.get(tracker); + return ihmGet.invoke(trackedEntities, target.getEntityId()); } - public static Object getMinecraftServer() { - try { + public static Object getMinecraftServer() + { + try + { return getCraftMethod("CraftServer", "getServer").invoke(Bukkit.getServer()); - } catch (IllegalAccessException | InvocationTargetException e) { + } + catch (IllegalAccessException | InvocationTargetException e) + { e.printStackTrace(); } return null; } - public static String getEnumArt(Art art) { - try { + public static String getEnumArt(Art art) + { + try + { Object enumArt = getCraftClass("CraftArt").getMethod("BukkitToNotch", Art.class).invoke(null, art); - for (Field field : enumArt.getClass().getDeclaredFields()) { - if (field.getType() == String.class) { + for (Field field : enumArt.getClass().getDeclaredFields()) + { + if (field.getType() == String.class) + { return (String) field.get(enumArt); } } - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } + return null; } - public static Object getBlockPosition(int x, int y, int z) { - try { + public static Object getBlockPosition(int x, int y, int z) + { + try + { return getNmsClass("BlockPosition").getDeclaredConstructor(int.class, int.class, int.class).newInstance(x, y, z); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } + return null; } - public static Enum getEnumDirection(int direction) { - try { + public static Enum getEnumDirection(int direction) + { + try + { return (Enum) getNmsMethod("EnumDirection", "fromType2", int.class).invoke(null, direction); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } + return null; } - public static Enum getEnumPlayerInfoAction(int action) { - try { + public static Enum getEnumPlayerInfoAction(int action) + { + try + { return (Enum) getNmsClass("PacketPlayOutPlayerInfo$EnumPlayerInfoAction").getEnumConstants()[action]; - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } + return null; } - public static Object getPlayerInfoData(Object playerInfoPacket, WrappedGameProfile gameProfile) { - try { + public static Object getPlayerInfoData(Object playerInfoPacket, WrappedGameProfile gameProfile) + { + try + { Object playerListName = getNmsClass("ChatComponentText").getDeclaredConstructor(String.class) .newInstance(gameProfile.getName()); - return getNmsClass("PacketPlayOutPlayerInfo$PlayerInfoData").getDeclaredConstructor(getNmsClass("PacketPlayOutPlayerInfo"), - gameProfile.getHandleType(), int.class, getNmsClass("WorldSettings$EnumGamemode"), getNmsClass("IChatBaseComponent")) + + return getNmsClass("PacketPlayOutPlayerInfo$PlayerInfoData") + .getDeclaredConstructor(getNmsClass("PacketPlayOutPlayerInfo"), gameProfile.getHandleType(), int.class, + getNmsClass("WorldSettings$EnumGamemode"), getNmsClass("IChatBaseComponent")) .newInstance(playerInfoPacket, gameProfile.getHandle(), 0, getNmsClass("WorldSettings$EnumGamemode").getEnumConstants()[1], playerListName); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } + return null; } - public static WrappedGameProfile getGameProfile(Player player) { + public static WrappedGameProfile getGameProfile(Player player) + { return WrappedGameProfile.fromPlayer(player); } - public static WrappedGameProfile getGameProfile(UUID uuid, String playerName) { - try { + public static WrappedGameProfile getGameProfile(UUID uuid, String playerName) + { + try + { return new WrappedGameProfile(uuid != null ? uuid : UUID.randomUUID(), playerName); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } return null; } - public static WrappedGameProfile getGameProfileWithThisSkin(UUID uuid, String playerName, WrappedGameProfile profileWithSkin) { - try { + public static WrappedGameProfile getGameProfileWithThisSkin(UUID uuid, String playerName, WrappedGameProfile profileWithSkin) + { + try + { WrappedGameProfile gameProfile = new WrappedGameProfile(uuid != null ? uuid : UUID.randomUUID(), playerName); gameProfile.getProperties().putAll(profileWithSkin.getProperties()); return gameProfile; - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } + return null; } - public static Class getNmsClass(String className) { - try { + public static Class getNmsClass(String className) + { + try + { return Class.forName("net.minecraft.server." + getBukkitVersion() + "." + className); - } catch (Exception e) { + } + catch (Exception e) + { e.printStackTrace(System.out); } + return null; } - public static Constructor getNmsConstructor(Class clazz, Class... parameters) { - try { + public static Constructor getNmsConstructor(Class clazz, Class... parameters) + { + try + { Constructor declaredConstructor = clazz.getDeclaredConstructor(parameters); declaredConstructor.setAccessible(true); return declaredConstructor; - } catch (NoSuchMethodException e) { + } + catch (NoSuchMethodException e) + { e.printStackTrace(System.out); } + return null; } - public static Constructor getNmsConstructor(String className, Class... parameters) { + public static Constructor getNmsConstructor(String className, Class... parameters) + { return getNmsConstructor(getNmsClass(className), parameters); } - public static Object getNmsEntity(Entity entity) { - try { + public static Object getNmsEntity(Entity entity) + { + try + { return getCraftClass("entity.CraftEntity").getMethod("getHandle").invoke(entity); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } + return null; } - public static Field getNmsField(Class clazz, String fieldName) { - try { + public static Field getNmsField(Class clazz, String fieldName) + { + try + { Field declaredField = clazz.getDeclaredField(fieldName); declaredField.setAccessible(true); + return declaredField; - } catch (NoSuchFieldException e) { + } + catch (NoSuchFieldException e) + { e.printStackTrace(System.out); } + return null; } - public static Field getNmsField(String className, String fieldName) { + public static Field getNmsField(String className, String fieldName) + { return getNmsField(getNmsClass(className), fieldName); } - public static Object getNmsItem(ItemStack itemstack) { - try { + public static Object getNmsItem(ItemStack itemstack) + { + try + { return craftItemClass.getDeclaredMethod("asNMSCopy", ItemStack.class).invoke(null, itemstack); - } catch (Exception e) { + } + catch (Exception e) + { e.printStackTrace(System.out); } + return null; } - public static Method getCraftMethod(String className, String methodName, Class... parameters) { + public static Method getCraftMethod(String className, String methodName, Class... parameters) + { return getCraftMethod(getCraftClass(className), methodName, parameters); } - public static Method getCraftMethod(Class clazz, String methodName, Class... parameters) { - try { + public static Method getCraftMethod(Class clazz, String methodName, Class... parameters) + { + try + { Method declaredMethod = clazz.getDeclaredMethod(methodName, parameters); declaredMethod.setAccessible(true); + return declaredMethod; - } catch (NoSuchMethodException e) { + } + catch (NoSuchMethodException e) + { e.printStackTrace(System.out); } + return null; } - public static Method getNmsMethod(Class clazz, String methodName, Class... parameters) { - try { + public static Method getNmsMethod(Class clazz, String methodName, Class... parameters) + { + try + { Method declaredMethod = clazz.getDeclaredMethod(methodName, parameters); declaredMethod.setAccessible(true); + return declaredMethod; - } catch (NoSuchMethodException e) { + } + catch (NoSuchMethodException e) + { e.printStackTrace(System.out); } + return null; } - public static Method getNmsMethod(String className, String methodName, Class... parameters) { + public static Method getNmsMethod(String className, String methodName, Class... parameters) + { return getNmsMethod(getNmsClass(className), methodName, parameters); } - public static double getPing(Player player) { - try { + public static double getPing(Player player) + { + try + { return (double) pingField.getInt(ReflectionManager.getNmsEntity(player)); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } - return 0D; + + return 0; } - public static float[] getSize(Entity entity) { - try { + public static float[] getSize(Entity entity) + { + try + { float length = getNmsField("Entity", "length").getFloat(getNmsEntity(entity)); float width = getNmsField("Entity", "width").getFloat(getNmsEntity(entity)); + float height = (Float) getNmsMethod("Entity", "getHeadHeight").invoke(getNmsEntity(entity)); - return new float[]{length, width, height}; - } catch (Exception ex) { + return new float[] + { + length, width, height + }; + } + catch (Exception ex) + { ex.printStackTrace(System.out); } + return null; } - public static WrappedGameProfile getSkullBlob(WrappedGameProfile gameProfile) { - try { + public static WrappedGameProfile getSkullBlob(WrappedGameProfile gameProfile) + { + try + { Object minecraftServer = getNmsMethod("MinecraftServer", "getServer").invoke(null); - for (Method method : getNmsClass("MinecraftServer").getDeclaredMethods()) { - if (method.getReturnType().getSimpleName().equals("MinecraftSessionService")) { + + for (Method method : getNmsClass("MinecraftServer").getDeclaredMethods()) + { + if (method.getReturnType().getSimpleName().equals("MinecraftSessionService")) + { Object session = method.invoke(minecraftServer); + return WrappedGameProfile.fromHandle(session.getClass() .getDeclaredMethod("fillProfileProperties", gameProfile.getHandleType(), boolean.class) .invoke(session, gameProfile.getHandle(), true)); } } - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } + return null; } - public static Float getSoundModifier(Object entity) { - try { + public static Float getSoundModifier(Object entity) + { + try + { damageAndIdleSoundMethod.setAccessible(true); + return (Float) damageAndIdleSoundMethod.invoke(entity); - } catch (Exception ignored) { + } + catch (Exception ignored) + { } return null; } - public static WrappedGameProfile grabProfileAddUUID(String playername) { - try { + public static WrappedGameProfile grabProfileAddUUID(String playername) + { + try + { Object minecraftServer = getNmsMethod("MinecraftServer", "getServer").invoke(null); - for (Method method : getNmsClass("MinecraftServer").getDeclaredMethods()) { - if (method.getReturnType().getSimpleName().equals("GameProfileRepository")) { + + for (Method method : getNmsClass("MinecraftServer").getDeclaredMethods()) + { + if (method.getReturnType().getSimpleName().equals("GameProfileRepository")) + { Object profileRepo = method.invoke(minecraftServer); + Object agent = Class.forName("com.mojang.authlib.Agent").getDeclaredField("MINECRAFT").get(null); + LibsProfileLookupCaller callback = new LibsProfileLookupCaller(); - profileRepo - .getClass() - .getDeclaredMethod("findProfilesByNames", String[].class, agent.getClass(), - Class.forName("com.mojang.authlib.ProfileLookupCallback")) - .invoke(profileRepo, new String[]{playername}, agent, callback); - if (callback.getGameProfile() != null) { + + profileRepo.getClass().getDeclaredMethod("findProfilesByNames", String[].class, agent.getClass(), + Class.forName("com.mojang.authlib.ProfileLookupCallback")).invoke(profileRepo, new String[] + { + playername + }, agent, callback); + + if (callback.getGameProfile() != null) + { return callback.getGameProfile(); } + return getGameProfile(null, playername); } } - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } + return null; } - private static String methodSignaturePart(Class param) { - if (param.isArray()) { + private static String methodSignaturePart(Class param) + { + if (param.isArray()) + { return "[" + methodSignaturePart(param.getComponentType()); - } else if (param.isPrimitive()) { + } + else if (param.isPrimitive()) + { return primitiveTypes.get(param); - } else { + } + else + { return "L" + param.getName().replaceAll("\\.", "/") + ";"; } } - public static void removePlayer(Player player) { - //Some future remove code if needed + public static void removePlayer(Player player) + { + // Some future remove code if needed } - public static void setBoundingBox(Entity entity, FakeBoundingBox newBox) { - try { + public static void setBoundingBox(Entity entity, FakeBoundingBox newBox) + { + try + { Location loc = entity.getLocation(); + Object boundingBox = boundingBoxConstructor.newInstance(loc.getX() - newBox.getX(), loc.getY() - newBox.getY(), - loc.getZ() - newBox.getZ(), loc.getX() + newBox.getX(), loc.getY() + newBox.getY(), loc.getZ() + newBox.getZ()); + loc.getZ() - newBox.getZ(), loc.getX() + newBox.getX(), loc.getY() + newBox.getY(), + loc.getZ() + newBox.getZ()); + setBoundingBoxMethod.invoke(getNmsEntity(entity), boundingBox); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(System.out); } } - public static Enum getSoundCategory(String category) { + public static Enum getSoundCategory(String category) + { Method method = getNmsMethod("SoundCategory", "a", String.class); - try { + + try + { Enum invoke = (Enum) method.invoke(null, category.toLowerCase()); - if (invoke == null) { + + if (invoke == null) + { Class clazz = getNmsClass("SoundCategory"); Enum[] enums = clazz != null ? (Enum[]) clazz.getEnumConstants() : null; - for (Enum anEnum : enums != null ? enums : new Enum[0]) { - if (anEnum.name().equals("MASTER")) return anEnum; + + for (Enum anEnum : enums != null ? enums : new Enum[0]) + { + if (anEnum.name().equals("MASTER")) + return anEnum; } } - return null; - } catch (Exception e) { - e.printStackTrace(); - return null; } + catch (Exception e) + { + e.printStackTrace(); + } + + return null; } /** @@ -546,25 +789,31 @@ public class ReflectionManager { * @param slot * @return null if the equipment slot is null */ - public static Enum createEnumItemSlot(EquipmentSlot slot) { + public static Enum createEnumItemSlot(EquipmentSlot slot) + { Class clazz = getNmsClass("EnumItemSlot"); + Object[] enums = clazz != null ? clazz.getEnumConstants() : null; - if (enums == null) return null; - switch (slot) { - case HAND: - return (Enum) enums[0]; - case OFF_HAND: - return (Enum) enums[1]; - case FEET: - return (Enum) enums[2]; - case LEGS: - return (Enum) enums[3]; - case CHEST: - return (Enum) enums[4]; - case HEAD: - return (Enum) enums[5]; - default: - return null; + + if (enums == null) + return null; + + switch (slot) + { + case HAND: + return (Enum) enums[0]; + case OFF_HAND: + return (Enum) enums[1]; + case FEET: + return (Enum) enums[2]; + case LEGS: + return (Enum) enums[3]; + case CHEST: + return (Enum) enums[4]; + case HEAD: + return (Enum) enums[5]; + default: + return null; } } @@ -573,26 +822,32 @@ public class ReflectionManager { * * @return null if the object isn't an nms EnumItemSlot */ - public static EquipmentSlot createEquipmentSlot(Object enumItemSlot) { - try { + public static EquipmentSlot createEquipmentSlot(Object enumItemSlot) + { + try + { Enum nmsSlot = (Enum) enumItemSlot; - switch (nmsSlot.name()) { - case "MAINHAND": - return EquipmentSlot.HAND; - case "OFFHAND": - return EquipmentSlot.OFF_HAND; - case "FEET": - return EquipmentSlot.FEET; - case "LEGS": - return EquipmentSlot.LEGS; - case "CHEST": - return EquipmentSlot.CHEST; - case "HEAD": - return EquipmentSlot.HAND; + + switch (nmsSlot.name()) + { + case "MAINHAND": + return EquipmentSlot.HAND; + case "OFFHAND": + return EquipmentSlot.OFF_HAND; + case "FEET": + return EquipmentSlot.FEET; + case "LEGS": + return EquipmentSlot.LEGS; + case "CHEST": + return EquipmentSlot.CHEST; + case "HEAD": + return EquipmentSlot.HAND; } - } catch (Exception e) { - return null; } + catch (Exception e) + { + } + return null; } @@ -602,23 +857,27 @@ public class ReflectionManager { * @param slot * @return null if the disguisedEntity is not an instance of a living entity */ - public static ItemStack getEquipment(EquipmentSlot slot, Entity disguisedEntity) { - if (!(disguisedEntity instanceof LivingEntity)) return null; - switch (slot) { - case HAND: - return ((LivingEntity) disguisedEntity).getEquipment().getItemInMainHand(); - case OFF_HAND: - return ((LivingEntity) disguisedEntity).getEquipment().getItemInOffHand(); - case FEET: - return ((LivingEntity) disguisedEntity).getEquipment().getBoots(); - case LEGS: - return ((LivingEntity) disguisedEntity).getEquipment().getLeggings(); - case CHEST: - return ((LivingEntity) disguisedEntity).getEquipment().getChestplate(); - case HEAD: - return ((LivingEntity) disguisedEntity).getEquipment().getHelmet(); - default: - return null; + public static ItemStack getEquipment(EquipmentSlot slot, Entity disguisedEntity) + { + if (!(disguisedEntity instanceof LivingEntity)) + return null; + + switch (slot) + { + case HAND: + return ((LivingEntity) disguisedEntity).getEquipment().getItemInMainHand(); + case OFF_HAND: + return ((LivingEntity) disguisedEntity).getEquipment().getItemInOffHand(); + case FEET: + return ((LivingEntity) disguisedEntity).getEquipment().getBoots(); + case LEGS: + return ((LivingEntity) disguisedEntity).getEquipment().getLeggings(); + case CHEST: + return ((LivingEntity) disguisedEntity).getEquipment().getChestplate(); + case HEAD: + return ((LivingEntity) disguisedEntity).getEquipment().getHelmet(); + default: + return null; } } @@ -627,24 +886,35 @@ public class ReflectionManager { * * @return */ - public static String convertSoundEffectToString(Object soundEffect) { - try { + public static String convertSoundEffectToString(Object soundEffect) + { + try + { Field f_getMinecraftKey = getNmsField("SoundEffect", "b"); f_getMinecraftKey.setAccessible(true); MinecraftKey key = MinecraftKey.fromHandle(f_getMinecraftKey.get(soundEffect)); + return key.getKey(); - } catch (IllegalAccessException e) { + } + catch (IllegalAccessException e) + { e.printStackTrace(); } + return null; } - public static Object getCraftSoundEffect(String sound) { - try { + public static Object getCraftSoundEffect(String sound) + { + try + { return getCraftMethod("CraftSound", "getSoundEffect", String.class).invoke(null, sound); - } catch (IllegalAccessException | InvocationTargetException e) { + } + catch (IllegalAccessException | InvocationTargetException e) + { e.printStackTrace(); } + return null; } @@ -655,73 +925,107 @@ public class ReflectionManager { * @param value * @return */ - public static Object createDataWatcherItem(int id, Object value) { - if (value == null) return null; + public static Object createDataWatcherItem(int id, Object value) + { + if (value == null) + return null; + Serializer serializer = Registry.get(value.getClass()); + WrappedDataWatcherObject watcherObject = new WrappedDataWatcherObject(id, serializer); + Constructor construct = getNmsConstructor("DataWatcher$Item", getNmsClass("DataWatcherObject"), Object.class); - try { + + try + { return construct.newInstance(watcherObject.getHandle(), value); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { + } + catch (InstantiationException | IllegalAccessException | InvocationTargetException e) + { e.printStackTrace(); } + return null; } - public static EntityEquipment createEntityEquipment(Entity entity) { - if (!(entity instanceof LivingEntity)) return null; - Constructor construct = getCraftConstructor("CraftEntityEquipment", getCraftClass("CraftLivingEntity")); - try { + public static EntityEquipment createEntityEquipment(Entity entity) + { + if (!(entity instanceof LivingEntity)) + return null; + + Constructor construct = getCraftConstructor("inventory.CraftEntityEquipment", getCraftClass("entity.CraftLivingEntity")); + + try + { return (EntityEquipment) construct.newInstance((LivingEntity) entity); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException | ClassCastException e) { + } + catch (InstantiationException | IllegalAccessException | InvocationTargetException | ClassCastException e) + { e.printStackTrace(); } + return null; } - public static int getCombinedId(int id, int data) { + public static int getCombinedId(int id, int data) + { return id + (data << 12); } - public static Pair getFromCombinedId(int combinedId) { + public static Pair getFromCombinedId(int combinedId) + { int j = combinedId & 4095; int k = combinedId >> 12 & 15; + return new ImmutablePair<>(j, k); } - public static Object getWorldServer(World w) { - try { + public static Object getWorldServer(World w) + { + try + { return getCraftMethod("CraftWorld", "getHandle").invoke(w); - } catch (IllegalAccessException | InvocationTargetException e) { + } + catch (IllegalAccessException | InvocationTargetException e) + { e.printStackTrace(); } + return null; } - public static Object getPlayerInteractManager(World w) { + public static Object getPlayerInteractManager(World w) + { Object worldServer = getWorldServer(w); - try { + + try + { return getNmsConstructor("PlayerInteractManager", getNmsClass("World")).newInstance(worldServer); - } catch (InstantiationException | InvocationTargetException | IllegalAccessException e) { + } + catch (InstantiationException | InvocationTargetException | IllegalAccessException e) + { e.printStackTrace(); } + return null; } - public static Object createEntityPlayer(World w, WrappedGameProfile profile) { + public static Object createEntityPlayer(World w, WrappedGameProfile profile) + { Object entityPlayer = null; - try { - entityPlayer = getNmsConstructor("EntityPlayer", - getNmsClass("MinecraftServer"), - getNmsClass("WorldServer"), - GameProfile.class, - getNmsClass("PlayerInteractManager")) - .newInstance(getMinecraftServer(), getWorldServer(w), profile.getHandle(), getPlayerInteractManager(w)); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { + + try + { + entityPlayer = getNmsConstructor("EntityPlayer", getNmsClass("MinecraftServer"), getNmsClass("WorldServer"), + GameProfile.class, getNmsClass("PlayerInteractManager")).newInstance(getMinecraftServer(), getWorldServer(w), + profile.getHandle(), getPlayerInteractManager(w)); + } + catch (InstantiationException | IllegalAccessException | InvocationTargetException e) + { e.printStackTrace(); } + return entityPlayer; } - } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/UpdateChecker.java b/src/me/libraryaddict/disguise/utilities/UpdateChecker.java similarity index 100% rename from src/main/java/me/libraryaddict/disguise/utilities/UpdateChecker.java rename to src/me/libraryaddict/disguise/utilities/UpdateChecker.java diff --git a/target/LibsDisguises.jar b/target/LibsDisguises.jar new file mode 100644 index 0000000000000000000000000000000000000000..06ae7b78897642723e81818dc1a7ee83691de484 GIT binary patch literal 265247 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

|5{?N9hU0I%qOM*S zxrAuFH)QTwfM?Z6>|#m_3%Y|2D&ZFV)Yk#OjAZ0bD+EgBNAizU8{sl)KPs>tcAsuU z=eL-H-@bU6sRzN_DY`I!nMYgKOIulcd7Ih8t(Y7?><{wYC(9klceL<)4ctCMx^Q=z zG}a9MUo!7bc)YmfJAeud^X1;xXRdcRy7_A`9}b1SsX9K1zIcu7yqzQU?6MuA#c)=h z$cGbbpR5Ng?4~-~IeX|c7x?5`@v+luY3)f~JnXCik04-XMLUc3h({u@TqC=32YV3! zzf`ANyyLNm!@?8%APUc3yIHZ*TG4FYlK8*|-(26sa&DSA%`if|_CB3&K!271L^#94 zeyo-K?#kfG&mHsl(|4zC#(Mv3l1<>iW5TTgSGPQ17&7oeL#KZO{tKh7C1e0YLwkG| zwMEn)_?_U}d?6cHge%ucg|SEW9>9LUxCbLJb9O6zr zs+wqeZ%N)0&Xcb@t;#-wZ*!d5*H6B<@R+Rqg!1@w4@kchNJ&7$wdqejspFkGZA6Zk z#9NdtC$%y0(AxD`9J!|xG#@rfF4&0ZbXxiwPfFpEP(w5E9L1l&F4Gh+wCKg5YsECe z#~Szn*t&Jp?U{pqbmuh7$+jM-O0Y56b7>3LDZ`MuuU@k?WJj3 z9FNzv5zWvU4Qdz7v25%4b5S3{z_QfFc@?{^{-Wui7^x_-!Ktm&cCvWnq}c^rDTapT zhaj;tU2|na_UZNQ#)v&jVCqLyGR5EI))iSZ@)z|GN5k%PClBE2x;D_;&e4@H;>y)^ zHFm}P`doSzmb2Y@OH#8-1a`FZ?4ltZ3Yd0WxZabf+P$$Va}_Uk|IO#|t~~jsBWPW@ zAt=nLcO_mle#F@q)sXKfc}?G-mcrYzW!|TZxkB!iYPUrfl_4oCUR*hFlC0Xdf;f!R zSr-;vyBD5u^U4w}LzZ9A$b^W|rb!#ht*p4|(Ph#Jb2av-9uH>B^XN6QmM67HMCH$o zEK@svY`C~oq6@PX22$49P^TZc3PZ*{(rL7zo$>g+E{PCl=p0jF7-z-<-brnXhH{}b zm)B2BJ+;~#y}hHh;-EYnSGF^gNDJivqehD1ht)@cPN=FLor%sIbjaGyg7Qu8kr4@K zQEK923(B0<-6gj7PL~sIEG0`b>416{39f7VJlT;x1>yXK40Ute1yl&^Vw6Pant@(f zW=+kLP7cq5%38=-Re!M(a_(%)3n7;jr1hSZSyEj!3gdDn0c5SXJX$pWI}>KvOQnY# z1TJmKynNC%c^Wx~zk9=y!R7|{lvx*Zlkx1tD#eE~8GVt~^vO=FE`Ds27IP->AvD>- z)s##CZ0BStk?Q|L**mpo8a3wq%Id-Y^Yx*s=?#Hy-lRHyOWH|i!MJ|N z(?t6eC;jw1>hox^{9}`X(@mycI~doM36z(+^3cg{x)5&x)S+_VT?VB~`xuid37DH= z3}n2e5n4(F-RD7->Mb2AJc6vpY0+1FLccnt}X z6#K15r8UJ0!2y@>+t5wJ;Z20)g=pjCS0?bv93t^BZMYZqd|P>g(YG#mKgkdw(tGO} zb4%dsco&e`0zt5PhtsA%>Tru*ZP@i&%Qjt4B2L8rL-Fq#$mY4g(-xCLwA{zde+2WF$&x6<>wswWdlac%J0%O^|&#Bt+r}3PX`go*8QjvXw zg?+x{?m9Q_51dW7aXH9d_+BWZ#B}Kx5xgBZqeQ|3kG#Rni639DRU{CfV=APWfsu<%yT10OhROc)tH~o^3 z3(lNrmtp9#!v0N*l{4@dmKO^=ihgZwFYumSKxC+R&ChOhi*H&VI&4E*L*_r*=furB5sOgYmOXq(TVs4jt9hr*sT@iY z<(V^#pwTsSfQHV%aYD5oinvsq$HY&txE@S>4YF|077fjFTr+5!|RV!KV)W!kf@lp=VlBw` zaTBvl4Y`w0TvbA9lM*qXjJ$ZnG;$$Q*Td2>g(r;WXd+5h*e(TJE3D4*xaw@M|4Nwj zc;y(Q!wW3Z!~)Ibn4`xFxQ1CvB2HKr)95pzOPGXNGi8iR%x9RR*9)*R8CO|Pa6<}T z_LT?in=EiiWPYbnWK5SZ>9fi%zBHNRTVaoepMWfyBTXO59kHWs)i zSY**=l%|cGiae++YLI3`${w=L^KP^9`(n=QnO0gfg`XfVnqy2Cm(Vz3J{jMG~C!x++#y|YV={!QXWw|TJDIs)qgl5|6}exZ8&nK(_gHKghY<962E z@<+)>$Rvz@$RofIf{+KrNF4+k+2`GY)^zR@Ch+RQbi9RiFABv0?*ZQ}Db?zMirTU@ zo78p-ixXEFV`KiYxaY4G8ZkLC3HpeEZdVi2lN`H2{yCYN#Q4=kox9!0f>Teys9p8w z20fo=Q=u<`;4MOu8^R-L>LV!MYoen`>LV`Zdqbg~0wLR^_;4ST*xKnb4O;@D@3VugI9M0#WPa*ecX(2DHWa z7zfmA2lP4}$u8;9uZlPT*6U5s2L&246^XCpn6Da<4c04;P*1+l)7aQE)N5k=nBiG+ zJOSc;DfLWJ)JIs{cYzQ$GBTUcS0!}2uo!lbmvZn`V!Sfol?9ENjwBQ6)yYkoP@Zsl zjVW4w;LXUPhD25$QXyCzEs{7YU#R~%LhDNm9gGGr-f|Z`IM<7F5q5fII96BAoX4CO zQFbB($3CdRnvWk#myavY<4^TX(r3))@GUg{H)P8Sb!!ymS?GX2zD*uG``w1@SzzqP zW-(W4D>D4u`GDWp`P$XIQYz7sA3!N@$s>EQFjn+sW^Yk>oNIwv*`P*#Mi|gY4AzVM zBdPEL9RQtfK!#Kmf%xHS&sTj+fPe~?%q*A%wL%T>ktR}+0&^yc2e2demp}<}W>z$w z>mDa$W6-Zd3@6wWlWodLugFTL;ChemC_9=7U%NnGqdMFWUb8xwiJgA^sMW~yS1V6j zZo#n)*?$qPi@f>xvl2-dJF6g{!xHnEVRmii|H1sx#4fQ! zP*H^!mW$al!ah^NK66ZqR!@RO58TCosPwNWPc}0EhkJos_QM(W!}&Gtr@rX7y5P6E z=*J-j@$qZf&sT-KpWGdCTZrduWeomJfV4kUDqxzqKU>5;HDOO)D!|Dkz%zW0pR7MO zSyP1!g;xa3lNjuqq2Y|A7*hLpK(|O8gV1g29OxI3qF|jW`IBtNt zQwtUHA(hs#aMMI66;lot8`BGhb+FT>$!QMBX-pD#X!1ZiHJLvdN|yi_gBa8ZRDh+4 zbD*K~cEp)p!I@tEnUBPLH@Al~o75?CgHvt1Q>}Q`Vvtj_R6vo;EdveXtv0cn zx=YeM!z^@wW%`~s@r(CRAcP>JB-TKj%q=jI7v`NoEtFxy1v5LT{>a(F*ms!{?6HKf zs=0!yBF>#l1*T<2f%+sEbd%$qpsM_PF>gtkvLy?`b(MW{Erf#N`oSq}+`b%E^+4;-;`-B1L^tKG) zQ-UIHNCN~bih{|1QBr1rU3x``-k*gtGbq?e>}`DDl^=HR6wId|yirHS06I0Q-vnk6 z-N)o?nT8s7TC;7S@03p-!d*Qm9~O%o#%ke@DjQ;dNZE2y;ol7COE@$sPg8BmG6iWz z>}grWD(MMjj|`&J>lv4-0mRvNw(+{!JYG%9DpeDEZ57>xD~6XCdm3VeldkG0oDJCZ z8hhe|`n>)54E8kZ?0x%wgo{7T^&J&WbbQs1A>C&Ya9DA7ISuGDmWoy4b?7xe3llyh z_D5OFtPs6m>0Y#7h)Kg$r)@rET^@=TXuTs2xFoocj6)8HBs8r&I&=o9F+PFsS(hxF9w*ABG% z{G*_}MIC=!%~bs55nHiyR;&6%I25&*u(jHsx>Ee-eEQ~kN#?EQ#a@?+^=@@80!(LA zj`trm_7gpKTy>?CU-8k*^Ad9mTP=-Yy-&6V$knYxgUDV*#Ha0ZwI(9rLFwM{)TLI= zzvVe@JSQt=7=^I5G;0BL(miUE6G$OT1+XhBm|~Coqm-9^*u%~^OdA&LXzsrQ9c*5veS9O8VFeN|QcyRSDPj4DZm)PQ28lk|nYzxg+Uu!&EIl8esl86u`1WEv-I z9y#Ldp%#D1aQ3KU=D3%d1{85YiN{3>6^+UJ{#2rv-bagc!z&d; zm_kg|EV7uHE6N9E5q~huF&&I%-!0^n=eX4!>S~z&@O--#y~2B={kTP6{Vvuw#*B94 z4_9s)J+D0$hfQe8bp|!}dCS}s|KE{GNj&xp_aj11`6JfL{2xZK8gF zvk<8cNK-yWD_ONa7_j69DLJXXK&F~b03b+UV`5>1Hib+*HR&V##O#qPJ7tdX+?e1k zm3#4Aa~up5AHs8_Q@r!k>pgo@>igsQCooqLn+$skpX&+!>#XSgQ@hL@};gjnSQ;du#_e+~P)Bp?j1afI}kOY0ET* z5&}Y@Q?QyKYbHOjMqxql8Jj}1i7|1F+pLq?ufqcD-WX&y(bdW}i7Ca1_uf7$48jPH zerJ<(O72J4M+nZc8*w&G%<&$sXYF?p>GU8b!))m@!N6BLookYMFeNLIO*c?@&^yxhl9S-@h)u*z=0pwFTy^XcXd8CNw{>p` z=n8>VWAzG(Elx7Qv`eEC{wA9CIz#zzCdJjhuKRImGgKYK#<$WKMS;UvTe?+|+C7AX z`*lzcqAU!Y0)aE+(-gml5F@=ai;Bu-Ey(z|1V|6Cfg|G#>NX4$vIj!pot{cZW#U2c zz>@YzbU%4bC-rY-PAx;_M%YJ(+1!F=OS%*Buk05V?U%>)vQ`r15Xz{yLHxtzxLx!X zG8-cZnX>{do)z_;w_K&tX2qg2jy>9#jKf{8B1^cOVX1|VP-Zn+W_QEB;!7cKBoV4d z%%U^4vTPp95}$;*?8w)1r110524MlVPyGxkbx*W>R}Tm|4k^naBX8e8p~Te9(O-g5 zEGHH6=FT}AAW?HauoI7wQA**hnumt}Q}K4gYL!Pp`luD?z;8vS;K>mn>i5NXHpTBM+(iw?HGZ6*1oj&l>)Q#71yON>1G!gj9u5898lrBJWkANV`F!^7(JI7B`r z3_&VaYmD=d6Qc>mP->DQt1`yH(&%lyAfmkD%VyEY&{B_I4h zPA<&B?cGe$SZMhZY zf%@0MRLux`p^J4)16#b&WACkr;O;ht19xuGN>penE;iu3WNgX2AQV0~#1|)Zp&GIp z>;v*H#L+nzR{;UnA6G6(mgDktc{F&*Z{gV7clZU5P#o_$k#ru??_N-*v3#mXDna|~ z&)6$4O*R-qti=cv(#ra*mD#mTV`vASJ%@s`07cRpn)>_#Owo2Z@en9caZ)nZDL6RL z709duX%_FWXRs!Seuz#DZ)@1!Pn?3gHPR5s(`L1w6Zo!ClK%*rMPyac$*(T^?Cve^ z)`ZZmUy+Je+`)(X%}2+ETXtB_r~>URZ(kD&6hefh+I}B&6Dh_Upx(4Ao8LJDn;5)~ z0+p2VR+kz<&LL2<2|Rcv$+51`Yf`qY?WQX>ihf3&b`cg z!1pTB!UNno4msROuwaD}1uv7Fr#O^WZx^ z#_*8he^*8aZQvHZA9(wIs^foH8Cm|jGAe7^A^*S&5l80?u4NOc)l5xYJhq~j!`h>e z5of*ZcK%)$#rXG6%GC_=t0wu%X5igAfeCNpoHQ$Y!t_kmr0dM9=}dZVZ;v-*U2rw7 zsr@8v>%*8KSu9Um<|v;E?N+WRIsz?klR|Udgu%}lo==ovOiD0Xw}}tjnNS?E>~r~oA#<+&>B1;CE z=HmwOm7);fOZ|l^F2?6#@a9L(kCsg;XIo@6qr~ElnN^*2pXWl%De>fH>5fRo-c|nl zy~vCT(#-I-@DNP%5?6qu`po;62+1|XIEY2CWk-6OIi@Il^P3*S>Rg&`w)yjKc(7rN z7%~3Uy>Pt~_r)d#+%|Y%6Tc0ra1DhsjRo|eqs#JVr@AqNtPB&rb33|?$qa4~N!1+B zjQ-h5MJkQccB4Wr{2zttTu5D@Ht4kPRTz_@O^D1geBn3jf_8kADU zPz+`-qpD6RAwj4o6dyN59H3NgXY46a;xd|?s^TsjKp<2=c-IGcs~E;(D@BTr*mB%{ z$>nr|H#@7p>kD*NxH?3ovpmTL1E$np59@S8`XWAV21)#oGhICj8|_8hcuhX|_G^yfwP(sPU!=l8z9`{U8RA+6SdF2c z!-x?=QUtEWt9+=^=ojKS5B|`R=2K$aC`pc#&1`mvZFtFp(0oi_nprxbQ=w4$HouF8 zJd9{%AxvF}WPHd$`_e~t?;^*a*Cb_kZR)5*nTk8$~?FSaZBZ61}NkuMVfU^s`@FPDFKx zE%ume4BDeuEK9w7{vZ7V%47jS%%5xq^PdC6_CEm0+ARtodS?b@V7E%b(CyOADI~BC zaWzpOBEu2JDIuaJgO)~jOSNoQ(bVFVe}e#Ch$K)EA$@>;K{H*FT8hw%q_~>qnCtkzv0pxbKS#00`Ynn1YrslIC5p&+r)wj#Xxy+>Tu z^yUsJxe_o=k?~nf$cA`yGI){kFvZHdVNMX<30riOvkv$&J8mqH3PrB1@Fi)H$715E zn^I+^DDW9jHWer^qHZchrdsrp9JF>71|{Qy>)_pLY`B4;SN(>#2__#&IT(S0#$g$w zyqP07I#gNIst4Knq>Ki=lhOK0_FcqLV;%Rb07b(>?xsl4L*;I}G(>sk)$uzu#IFej zukt9%yU05+gmFQ5RxF;*7R4D9Lv{U>^Kd3b*#+Z6Dv=ucvW4i9Y{tJ9{`)P7B_&2` z+*C{~`)_&Tk#$F2pi{93Y;`?I2On%8?fy?A*X3BH@C0l8gzt>3T`a-kHG{0bbBWP> zEJTsDlhS(SOg>Zs(=@3wxmD?UQRB^=ERbVyLN>TS3WPC|2SyzfHjz7B#KZ5%=4$0S ztxweU4cDXI-{E9hr<6!npebYe(-DyxBV>dRv}A>5!98#QePwu6gYGA^D@f?yj=T2P z+l*N_p=NOCHoi|tqE7&;E2ot)9Hl7iV+XFuo`A~VFwVubhs5smCS2)=AK?ExQ6-Xz zD&zccM*W|2#{NH?ZT=)GM83?Rv>(o(>7LQeDJ8KFcm?zYBoHS=r34jJayXu-*H`LE zZn%|vAOUV-1%7UOpf8j|Rf%&E5@BQaGwF9z>4(|dKb7+v$R08pT%*k>rIKCFczT4a zYO^im5@Nfq&M<$<0Kr`WAIyu?DCGDFn81-^&v147XE(d^8S}n_LbZKd!R|R2XH0JD z5b4?b++sDgB2$9wr&&9fA{D7HRC3(|TkO+!TgNQFUlnx0FIjC{m?5~sLR@@s5FQo?E&s_waf^l1pi;zj*S z&JJ^))Q;jYKqCH3H{UbfZoec@cFWNoA|?=g4IaJzA}^pKI3tj532#d*ncWrN1{Ozg z%Y|orKYyv_-eW)>1gSH2q3@CucJy80-B&3j0oen48_>K&5>lGH?(kuZQ7RA%A@pex z4?lO3Ly<&n$C3Gv6Lz5?Twt=te^}8v3CWtZAQKm(L;E%#=i~KIbe)ZJ7AA&_h_w_DubyAS(4 zjoonsHBn46OTLj|k9Zw-`(=_-daQ(&1}$Lsf1?J#>4pBUA2f{r95s&ri(0m_&Cl%u z(Wiy3y9Hk<-gQ?&P70WdEP@=xC#MN>A4DTH7z zmU%``68nXCzk!Ek_Uek)DSiEyuWvT6Tg);@31hZ6K8t(9HKm*SARqWO&7DBFCL99W z6q8ES69pCzB;40L)IiPrIUe5l8Y0C2#rY^RKU9!t>^JC8fT+LK8C(7 zo$$K^!QIF43J=~0ks$?K#%Au&fp9GJ+8l*JmJqg!koB98bmze<*TD~cj>kww&w=io z3JdT2F7;l$1(y&&XT#@A!!u2bZn>={&b!*;PSY>Ot_~kLIw;+9Cx&!P?EJe)-0JO; zX4x+hgso4;x8{rYmTgPMq*@&zhZKAMCQC(Pp3#c!bh4daFX z>x>5h5YVwa5D?>k)JOZjD0X`Ryi}I|eRH{*-jgRn1_}5X!Zifbl7fX{qWaf?C)Ndt z_Eii{kz%D!4W$DjTj*V?wQZIy%d{<$JC?x7NVUq{2G_uy-#CkiYyRpYIXCuf#RIaCYf$ zo=omyU*Xd`7l&Q%wuMe9=zBtMT<*NRdI@)G??BT(2np=x@3zQ!ah)A_ZWh~wQ6J-Y zd9My~?@8{jHiMeyLW)W1hOSf|3&hP*jW$#_)`-9o3^lb z?5vjfY?40DLzKSOl2@DZV|uvu?vmL<*uLxhs5R)c*DPyop8ER=NpELHLnZ$ABVK#g z<%&#owsA$Z#d2@3T`Y2^1X!PsG_9toM3Hr!i5gtyY$6gkFX~cd6YgYb_D2){X-Deq@(|8tg;MMj zm328boj%7b%OK@w=L#K7{)u9-N~ZKjnB$arja2N?5o0j$a)1H>z5K*+T?u)|89WPGrG#QPyFVn2;Jl!KR?wAK?>Di+5{O%8-8; z;Y0Jgn_^)v_SG9O+(#T(*O((%F++gT2=sJ-svq-m8R(N&3;nmw*}zDrW%AOFUB&37 zvJ5FO&X+=EI4M)j9S9228=|kQrUpcf&Q)_evGNd-;Yw(&|68Fj@6X(l5Gqv}UEY|z zxr59{czIW)YS_hLi{Z#haSpkBpzpZtgGD+Jrq~{%fnjE##_UlD$q0z-SG2!5kP!oX z@BovrcwLkv9~1VZnukzNo(0r&ya1=si-I0QpA{|C`gO7@jT*5I(Q6QiPg~_G0qmPM zdy!-c9-tapx{6M!5a6Uw$ADB<^uh8D2bXEdewOCrros)9QdDSU7^Xk~;4tj6VvkcD z&x1{EG@UHII_n~3vb+%CG@QQJsQ6d8iX~HR0~mViPxAYx|3b=Yq`=uULtyiC6%->K zBQ_EsqeP881|mx*1PtooA2On0!Z?@d@7k|`CbaPAX1oozWs>1gT?)t?0WPE4verBs zb9MntEudK2K3XS^m9?k|IS#@9ilC?^og8Z0Ag~N$gLbApv9nCkC>!lwBTb=aNZX>5 zxU>^T6IYI8YX-}XDWPV|3FO`g12%0k$Z%=GG!X3yvV?{NLJ$o|_;qFnFD_8|XugRA zDXT<-KL;&KC+dv}Z}Z3jp@2t=;!?!Xg-0$TN&P!FWc58jC1Tkpw#}Wp_>XuU&0MRJ zXRtUQD!dJ}ctB4_wtpJN3hT4EN40fO{hRkl0qMLU56D-x%a_6Do4qh-05PpM%;FXB zp-^%ZZc~#L1|v(aFIqRFQDhS#KPO2zvZot#k6UstG2DQ^x>$&lXP2HYD|d5KQ<8kNnh_o(S0SV6o8EJA!qF|kLUTf?;*v}i9gWo4m>1TaKZxPUP z%~o;=vF!t+2mRKXt$$c!?Dc+(5TZjn?4^e;_3;sfr~by+rVuWkyL-r$?oJ$QwtI;X zTs}g22$t?HGPrn%(fby07>@Co7rM+ZGdJV<_p;-{EZyuFINN4u;y*SX9WVUoJyr>lLLsH!IpKERA<;RJG)V&o8UFMAY<@ z$eCm;#KuUfmxi+zgSv3&X45Hh3I@^L#f6becn!U(L{IAZg`-PwO^wPXn@e&{Pj$`8lB@GS zU6*Jmce;c=AZ!F#-O|dN@=F(&K+EN2e3yulo>|rsj?%?*J`a6$4rpzT^9xg#$QoPK z=8iZ2wJkl>NWvV_UXM+zyqZda3WD9dQ`3wYV>^2*Mo?T)wb z4q^4@F!*cL=kp7nW_@LZvkO5N0d<>;yqb;Ug?#*lrNNB1@*4d7XT_THi@3a+rRCY6 zL~&8O*z(-V3x|I}H90C6fQrEm52>AGaj(T5YU;D)`uRHd)(>wV|KOti zSy~`7h4xQaNai&rW3oH{N3tfyc`p%t|cqF#oa*LJ+HeA z%Kd@Z&qf)Gk)&S1+a!$0-A=c4YH2yw*{oG~0awMC^cv<)wdS?p*4^>&fcrcqc1o8< z;V+Z!+F^#;fU}+Zfq(AveVSjI?pAT)^_c7#6s2_T{&DpaIPlAm*v|h_D6eiVP)ox3 zq6@j}Ko3Thug1?}O^1-LgfsH)_-BJ=9z>XyQNuh?2pjKLV8+F|)=!>8f9o9t*V3RQ zy8LUgcWChlwJ`L}wkd@ij{b$*oVN9w|KdV79Q)?{!h5->(idvSH)8%n+S~6p5l$Rg z(sTxyygEU|SxwvQ+igyi6P04Cu1J8aj45{fl9!N=u6Gf?Sl$leeKBpTAzc6xJBz9& zKh&!o)9LrwMXyoEw{q^;h4R1ll9;m#7>BoF(8xm*2FH&#PmiKi}GiO%_Dg59`~;MBIMB9O+}apyrEnxEz?Fo=|XS77v}clxawX zWJZ)lMfm)h#KjsW7pxbp3BdG%P(ZSk=K{K^CFyBDuiTV=DQ|^45_#)7s%yzS57ziX z<8J~Duy6cyEy<~(Kn7X$D6{adX z%I|?#RG8kGUMd;{=J(?0;;x}x(ed__TgY$&T^IMBs`{3@iJTew%@y+g2Lud%+ydwh zw2beSC*LRR6)JulxWq~_#Z$2)+V;xmBM)n+AeYC?n!j|J4ktmX2Jo5jJ8Tm*NdPQ* zhbl-TD0dwFf{6s6xc9*zLF9O%#3dHuyBWh)6;prZ!)YrQ@h-JXMOh&4w*4$Lq={Fn z5g6bhJYNftN`Yy{e{o+rs1sxlbbGM_mh&!!;K1-8ssouQag9txKZ*1YOtj3vkKMbK zQ}E!1Kz^1B!e;wwNs(W?lkeSsNB?6xO!@$JE(ZPfVCqf=)@T$RcljEF_a&_f&gkJsfs;9*YY=XKJ@34^5@@obG4W8${x;X2 zYe|b=tN>3>IeK=wDE}e*>RPe*XNby z3I5;BVl1yIjQB$I%kWsg5}KNNew0$z;i1xRNg%dZu;{~nzjG2O%CpXCO9!Zm#HG`# zp@`qy)d=Dlyo6p`igNoXrg0@7xJY5--rnhoIsNu{c`f{~#>3w2cZLfw^W$PCde{gm z5Czz=q|V~rjI_fke7@yf7zRV+tg|ll_D;IS()OMUg@pl#KYJ)KK`l@3F(0Kd$ zJzXr*1Oo8kByq_C%&v@=0-d(UAs2}$)yC8Wv?f2|1s&!tg|A@M+yy5)QIh&oP)CZ^ z?00`#a+jC6S!94b3##U(sX1-0Z+l&ICk~d)LtrQ4@ECjDO@|ZLC4G*l@svpUmmk-)qAq# z=#H!o4dwGW)@@%RDc=8H-eEFE@f#NjYf2og10@fWi)XGWO?biS$>?HY)=t(24 zi;`i&vPMI8Q!whV*={HvsZC$#(w(zm@t9_n)P;i+u>w)FQ}UD4r6`yjjDPWOPL7Tf zCk?8q;qb1iLBjI6YoV8YsRw18I2M!_ZeYN)G$jPYnPz3MK=F>PBF}0S)Y~V9n{Xm=WHupjw;N#VB8KlAE>veY450C{%V^&7)(f3QZ)}Oqo?6I<>5Q>6N^w|?FbjA_&u=U^jZf@3!wzEnV`TGZ5{3pquxC?M{-rAq$6QykkVb zBKfwxP}sm*cjHAJC&vgi3UhSYRZp0|rnETb2KT=-j{1D?625*rs0g?2ve0cV^k=4UB8@)F(}{+k zD|;6l74sc&;WnAr#UbHATV%`-H7*Y-ndha>bL5VRDMn+>?P|*T0x44@_kC3N7=FQF z;`cziXZ(aaG#ttXQo-&nnZLZ}G4Kf7X%g`SxW3xlp6`h_&!53#531;{3EGyZVTbo? zl!#mC$SUGQ@2r>p|;8Zl|$E|@)Ntz9D;iypfj8T=}w3em!&}O(sF`Jt4=QF%2*A2;L z$EL>}Pf9sFEF6_pLau{=nC9lik3ZZs(bVj^Y2b!>=YU@`0UThfJm&tEObHmj5FikXAvERtx7T0Dz0J7Xd>vf+D=3OK3u-q1K zT*K#F!p5>+g|5>a*n{*;+W_?|JfZZ(Y*tAxYCc2>oFxFU+-pKZRH$5rgw_Tc7+=|} zgim&My5to7OhD2>KE@tB^NejN3KD~1W+Z;$a5Za_KuGMuL0}VD;l$DJVy>Tm!P>rm zQr2UttT8oWT_5ntMw^LDj(-M>%^GKft1vAn*lbA=hAAPf;Yfzpeeh?vc#U9Uhh*qu z8!)?3UWOkk`vw-UhgzcsRdkl*Cb`YqU#5OXsdM7zCuiEYl`q@0z{u$GsA2(^WUDnV z)CCk2z;lO(BP4Wp0&y7FXiVyByj=f#5h5PPo9)+8x89P^v@Jb{P#(zP?73YKqreGtv1w|bv#~3rll)gbu!FP>AO74A=L?I| z2CDcfM_t%imT)ar@&VBK!0(8AS~RhrxFOo!k+N~d!2=WFG37o(@_?%Gq})H!Y|0$P zs!5amG54r}%F@f}L&+ax)*4M@bOib~ni-@7RgrRM7Q?=kYf{?^HmB3La)ztAL!k-g zi(ea~sEZ%fNZ|~$&Nf(do}?=Iu0sMF(oW`*ZK^A+my5=^WX-X~x+Eq{UDnYtR|_nC(9~q?*~6sXGFbX7Q`61ROuez&v=jS+&gqpVVSWHn+Sev~R1$=*~9Z z6a$9aW0=PUZJaG>OeVY!N?`E9PHJ5^UP=X?FrcvH3t8PlA{gm~hsk8n1dLJQ-9?Q- zxG4H}aO>28_On#d5^P4puS1kW@{5Fi>wZvV;JgEjY}F+r5Le+OnV*c`o$Z~Yli1@< zn&7#!4bgM>Sfwh`mde$%HSn#V4c#}3jHnxS+!TrP1qP(`ZR(K<$tN}nNNe(k@ko7> zXM19ue}BHQTb9+i`db{km(L2UYwX8C6A^lNMUZ23;YILDN{onT?Oiz$MFsIS~8FXmlTyLRNsEnsV}fzjpNdV12+N@*+{ zupr-`>Slc~+z1!?le)Ps*15gm!#!DzXIa>I+A_bod4_`~M?%)S_oro%E0hNzV5Vp0 zeS2oGY51?RS<_;BbyLaMKz;6vRpEnE4^>)T{WcfIm;@qdA`*P3px)Z&Cx6Bo+)=?& z>qmvPRs=+@ymtr$g#?>(T4fPwM_aOK^CFoiB>|6fxyVILTJJLW!|)0Fj7{leo!pB4 z7pCsKlya0IQ-VCCE|p5&id}1ht&H$kWxe#@$Ly>dqea|UMM)Yw+nuA?bf-^#$D^${1&7KgFx8nHdXK8Bkb`$n zain0noi!;Kd!7=UmQ0V~6dnH7%MAKG4vMhdga&dfDm{T+;j`V6LSGt@U9|}2GGx9@ zsYk2Q{BSPNZY|U}3_@F-P)Y}qgCT@D(9bA6;nWw1gYnEWuw7>CaMw8zuZT;GM|!JA z{DG}bD2VSp_eXhDJ%W4cw=m;JCVlzu{m)0hFUj2dNXm{cncRoa$6)M`H0~VDX@laE zMp?Swom%~Js)Om4be&74GfJIqVI3)<IFy8d=j zvV0qnei$zKA={yIEAkYmGNlsw{+@RkV=m^!**_OkAuxpv!qpjZLiETjU3H^Z<0M*a z6i-7&q5{HUv65e#mDsFcyL&<1xu6>e3uH=Roc!i=qHu|m|1 zWqCl-7e*=Z6-*YRQ+EJ!56AElq_9{jySt+#j1`=wn12F80kWG`$7Wb6awA)6FMMI4 z#=hsW`71Ky>I_OjrOs|VTrXaRI(x`nKd$AP6=3hL8lSTUSn=?$OGm_%lT*w8rr^z; z7g-JuAugmapw4lwO_Xrtp3nNoWppl>WJ~-8tR>a7TO%>Zp_ZDWb?0Z>+7vfSi2vf0 zsXQ{}+$6@r;@9cPeLC0=wRtSmbj|oiiKZGE_d}&pvMBjj54{Jjao29`nqE{`mMI;- z&9$U2SgtGlXKtM^JQO0*vIFF)WwgwJz0O~1X>vm@Ovcb0vG~kHGkgxYck_p_6OxQM zIgPO8H9qG+rhQG{QnQo^xt6d-LLUbrZ;vk7F7-8cyrs zkz`2gJgsub__p?kqFN-wG|L3B#r5vF+L$9(``&=2{gCxzc01#QLtPm0)iCuF=qGE z_}so}#)$UZM|Ofyg$Y1%lF%aAq=Nlm-J7v3LcRgBYwH4V8t~*3*iVd=4tp&Qtgh^w zwgmw7FmMu_7xb88%_EI0tRovLHQwY?m}1Z9(_3oq7r8tQ*&X%_Z3l#$2JByu4m!OV zv_Y^Ny{(}#(t`gR-n;QTHV!d6jxa?S%N6mp)NqRjP@0*+*c{(x0X(T%DOdGObJ+Vs z{?_e3KPk2Y*8U8*Ii)i0C}>+-6$WM^-?!S)`w6>56@_x2mBy%`spPFu*oHvQ1RaZ8 z{M-mpcLZ77DOB(2ox6DE9lf(#ZaL0W_(LyVb)fIvZ$Tb(Ol#&NOf&$s_$3r1I5zo0 zdT_Cb%eq+#+rtXmTGB3O*bQR7k|eZ)xYZMH3P;>EjqvEXA)1nXRmrA#3Q`K#HgLsc zWulmvvA<$@WkRFM?ix3Y<^`X|{&+MY6<--=!kYVicqPtTqmGwt8dB-Qo9GA@zDlLt zsIrFFh6vS^9=PInnQ$Z$ zu88fh8r0)+40#Y!tt46u9XuLsgVo!HXtWAcX%nGmAoPG5Z3F7B12kNp^=T)WJR*|+ z9wqMImuQf+!L((~SUr<@?86#2^yQUg0)-*w`44L&QA`a}Lc_k#LqoUX=0!bDPTLox zPe#v!86t)Cq@+aZ%{iYQsPNNG8;O6T=f=1h(d!x8R5s?#aeB1>`uhfgLQWKj!i+hZ zfGNuyOUAT8-cPXBeI-4ZQSDpxx=63~sjZXyhw0gv3AdxajeTGtJOvXHkyPT`f%%*3 z_x9$`)oSGv{*r&ItK7k|>CHO+{rms1|7(^<{EGbME&p&5(dlM%H zL0bzOLu+9>YdgpPo-IkzcKtC48U0?ANl0|gzz0Ru(xz_~SP&AvDW+?-09gF?U{Y2h zp_W@jgm5fx_d5$@s5xG>e?5pqFi|i#PZ)00A7a=Glt0^{XzYl%U#d#}%>2%A`g*@| zlDi+h)Yk_|8(Jkgdm)XIztcpN7Tf|DgXM-&Svaj3YVI+0f~0aP|8`I}NYX@>V7vk7 z7;=LcPrZX2PCFczq zX?6)O|qhv!XtIRIH z5e=}(>Kr3ZB*C(p|HIii24@nz+dj5!+s+$nl8KXvZQFcf+qP|El8HUBZ9ADb zxv6{4`Ebs+`>*P%?(a`^_uhN0^;?mha%EaN_Ns1?kBr`BvKjeo+wE1P= zYg5tGnyyr2?r+IcqcU3pb^orqhE;i#JXGq^-gSMY%#uhCm1a)rn#F1@>04+&SEWdp zsf(p8Hp3$?T?p7i20)gbabR<117+$mWchza*=#vmREf7d(<}=P#UCbDx;3dDV;Nb+ z=c!G6_Go0sYA|4o=Q2~CxW2}FR<2bt5LD!dThZ7oYCVeHh7MGvg>A(;L4sf3PkWC2 zAqQ3%?!l-c6yK}}qfJ2Bk(wKT>*KbEiu5*C7_0nAM`$O1AVs1 zXR5CK&gXsKj}>h7H5+~6GO>nP*{**=n4i4x7gp*ZXE<#Yr@C^D;Bm*ezDn$P$0(u* z%JJQDd%E1j6pcn{QrZ*QBg8!jh2aoALl#g&BhJc3mX$Z?xfEXKqqRL1tm*iUD^U_N za9T%Y7N1|XWRl!*J%{;8oRocC%y)>r9Xwq?wBG*mZv2;Hg{^hUeez&#1hwXGDo{cu+v-*toDJ%RGwF}A`9d5V~BQ#Z6IEKh~#y%L(eE z>i`r(K<;#eGKYM?7TprFi#F6jK!z7b2jivAw}(4H1^p<&`IMG?N!|Hq-4UqU<^U97n4J#t#zK{J}g8vn8 z?0l2=%#6uwvM>JLhA-Gnfzitl{Yt!iWq%#|Os-Z3^V2saNPmBk;2r9VK6JbD*6%sz zJe0jm-%rrVJSK8^!=iywNAb2Zl3S%)%E48_s9*~m;;szql6Hp#T(>VC^^(dY?9rfo z2<9;}xVwD|b9pKkZ{R{6uT*{pDlj3?!K;IOrp%jM!kiz67%p@`f@W9FwlrW+vDeN^ zJMh*{pdd`SkPe1NbjhDcdT`GMb`d2NPL_oYhkz~X(V|_|d_Q^+#U2hGT_99bQGUg1 zRhm7y!wv5jxud{tYX54}^yWlnka*2t1}eOB^BtIkN}a+#*R$JH1M^^3c<=^AmN~p= ze4|Se%w3wWHR71F+cU`-4p%+9td>|n|OjqdgJjEhT7G`#{L z!@)w?48lcd>l_Lat|A5p4gku7MBuC)^RY-U^7wfi5&)sKtjC!2_xA2I=cA-L3D&tS zLa5gxL?1rP&};X5UGL90ypisYTMaU-Nb&Ahee@>la=7d?$WXxpbH8k)?^G{8^Nu+?yME49T&LrQ9d|y@XObsX)15Mw&Li zfsH6`L`AKXlY0^oqMFE&C^b71Lxd>eVg*B5E%GxB3fvKq5Kz1egPbhRl%f)I^s80E zZv2XVt(Ya)p2y^> zIj9&er2q+am`SS6MBVxF_(%@AQZz*9kTWGvLM+7$e>*g;O@`F05T!Z;<}w}8p+mjF zJ_E9aq7gZJRhC(^0X$pO{?^D{I#!#aDxP6HU9ok}PBjhpoO<^#3C!fFGzT?x$r4?> z%TnoBI#o**IZnKnK}8u#y31J$=9d=+&d!8?5hqY8mGkAfcq&#HyB>Mca)ITVHmw%T z`VbaEEmjLu(VBwuLvtq}EmbaxMPj0}hB0=9S*m9k@|j{f zS8>l!8(0S&lD$+TEf#*tO5zRufO$K`N?CzQdhTb;JmR%ZE|zAZZ(`05es9y~Wm-!r zFE!z?+CCPa$58G0oKJ%neX(J-m9C*2%A462(f(`WvxkNgdEOT+7}0L`kMI{pBiyV~ zeoklA-bt3Mhn^K--WkMMyjX8!VqqX$Zj~hq#+;n*da^y`!{nh4oAC;> zCz%~mlX4o&x;g6Unq>XDp$V({R6tDpkO0~EUwr2q_uAA_u;1bkukc@a$bGWEuNT*9 z4&P5Uh00h=33|qq2FAjPp42qMQ}b6Rq?dZ&VS7zQ`z$2mOx6azQOI$Yyfr*&#`Rqd zWBSKcrxq3Vq?1*T+%Ic*ng390b5{v|vBv}_7><8pnBC!*Q8Ia1X0vuNZMV30KZ(n^ zylDen30ve+Tm?TzcR$8_>uszeCOv$*(rX0(7OH==x@y&Uh;6=W1P#{M4Qf-O5a!QN z#Z((iI40w2D_2;3lR}J@mz-27!|2ypo}AVjbDukOoO9Y({Hz_do$<}YToiO1R?QTA zeQVOK{w;*nkukJYA27G;YzIi_CvB_iU!Gf7RPH&g9oer=JT`l7e+v660-Q~hSr3+F z)B2!lIVQQt`_v0MxN##^mfT44 z_DSl^OY#!K7UGBd5TED2@3=r3j)6$q6bSir_f?o28+A>yc#~gnqUK!GWMrv|5~>?a zz*q{e?iie~xx3=URm6^lVl+pdyj^v&G_H!QEM3v&q$q4Ducu?r1{t~L7yL7uQ;(6ZUyHkm!o?z^LZd$ru# zm=LuIh9q2yNVdy8<#J0vVlZ(S))<}}Bx^2nJGs;o)4I2*T2gY9<;7vMoU~Bpx9K9a z`~Jx?;i1_}XbSY_K+b^u9VcVU!1FQ@f@<6pZ4p>kN_1hofB$+(`Ta|XQLysdZ7vq| z%2fu}_6Z2Jg1T_>{gaEd##uId$J~cmZYCcWKX#q!Z%8$FND{LPE<@JH1O#jPTOGo43FPvM(wLeu?uH(5Jaf#I?&n&LG{vL#Q%eeI&ByV>6B4_if z3a?v4a>iOT%=vZ-%K1zvI7#yWqSQMV=nZfs!`|sAE2m>1BQBgrNdLXZXo@trM)PMH zr+d*zAvgko>FI9-!T<#9X~-c;>i8nS`Cc06uj6LNvD8Vf_2z})!%yZOYM*5 z{Q-mL3kW%`54ZN0>r7vDVuNUGr9>tX`mMnm7}HOos!`0QHN|`(G^S+gO)F=hnd$KY zV`S;hA1piuP}}Gbe!We2ZzO+#Cb#-x8m=};R4uE|?OQ~sN5PR5!Zmyy_Nm8w(J^=fm0 z=*<*fWzhpdWUWv4zp;#;OOG^^DL$t>1pS4cLUn!2O{8Yj7LF_AXD8{xE z>bzMy8KH96j8Kp@7=fUJa9{1VJfW^vuD{3}clteGq`buv{Tpf8z1|xK(?Ee~z&@Vi4&m zplik@4&jM&dFY^f=-Xc#ag;o!`4ZC$&>|v}#1THWOWS@iq~}z)Z2ZQ-6PNeNIK2Lx z{P7%m38d#^X0t54m*dk?KWksr&b({fGNknef!DCtl%gB#dEik^4lnvOm|&N2Ymq!w zv}>{Ulilk!$;Lys;x{k2I4`pRr2t~yL-u?5J3uR0OuE;ozf5x6@sR5|KfLm1j!sel zc6^w6{Wk>0?HwxRnGvkr|HC7Peghw8FsnVr1Q@LIj5al(J{IFRcLQ^{*VT+7R5;|3 zn)+?sk)N=jtSM1-p{$`|t|_o>j-@O22R285sr-OSnfXOm)@4bbQ+WA+qx(}RU-v<# zGa$E2x>I;j3G0P|dr=zSB2Go#*AjV?rsWP8{7>q-%>Ut6?scix>BIt!fTY}@!fEh3n2%1viJd9NC&Z)r$GdcoJ~#yG(` zg2K0CUp!UWPJOAla3}g4wb=RPl=Tz(@yiF!LwR0f*F;B#!KRHxS&DZ1?r2_$jwY!& z_6-3jKtI!|NbDCY0;vqz*ZQk35TsEhwh1eY?7E-unZ(YtGwlZ9)Bn`uRF&Uymi7*P zBLM0qES@Knc@J}{=XRzMD@cUwjy+Kwa zU&9@ld0JG2N5LKwCb2OZ6vTeSHt8GVLh+2>D->7Nv&UAVHM0@u0SB^T$sT&0hz~j+ zqZSo|VSiM1izZgeA67ETf1D=z{)4jAO!Y}@f|i_bUAMHkm>WR~L9J(O+drW*vL2iLu_gU-7Yudeb%92uNr2LSOaEV%V^-(4U2!fpDbNt$Z7T-bx{1RdsF96Ctu84J z9K*`yo{eX?hS)sxQ_xQBCYxmAyEvO%e3Go%=5%IPSxnoZrE)`!6!21Bq*f&2@*L={ zqTu!^k}A8H9~{wmG#+oD>;(Wco-{>A22%sPI+=SHB`hk@vBb`ckG;?Ws8&{fa37;7 zcrDwRDcN3Q914#MWo~gNtyk3JEzu>Z?vhB+=R?63B?g2D%M|=sA)=mNVK*~F6SK4?SeHYH z%~?ZA7PKt5W{QtoU{p%z3<<2PtVB`LbPZAY1S!6QCP{H!ymywgi|-6jEqUg9>Tki-s>W1njHLuZkoRtu+%Un9v6Gzvz@ohMlKALe^l`KVSrl9)M2n-wWt*@U${z}k1z>_nGZJ!dJV#vkHq2cxx?WA<$(==?}qM1 z27&-#fDk~0Y;ZwPLCC-0*#6W0(*ex>%mH=&bpiGknU>2otamG?Kd_J~|L?7ht~-m? zLXB=nt2(=CIm)#(ehtq1%!GB@0MB>MFhe4@d7@vyk}rpT+8FCC)Qvzva0=(`&AwX0W)KAEn=={|M5<&vYieb;0@^opW{snT0^b9lCSH$4=Sy|EQNr7MSpki3$* zM7%94FKsx{=my43FFJ__)Jr`K70n*k5vEFXO}+!aR$A z!@{`hxaL-igqDnq{Omd3g455n%hH(iVb!76|UVAS}7vQj8xQl!fMBc^q3f23mhd(H@Xt-+e6g|*pWG7HqmLN#dO9d zm-N?EDjbNLGhiQoBJwPcM-@ zc{2TUt>PbRx%%PupG%H8&3QM=ckC~~e{l!+_EuRIRZ6`US#$p7`j%Z5!j@qc7Mkbs z&y7bS&yD|dZ`=+yZ;%cJZsZS1JrrNyJkst`ZtMC_; z=U^!CWm=|N82gkjBJG6jgX9)Yx8xkneunW?ch9y{%ul*o=IMkv;^`FhgYlLWy-kt+ z4KVl{?ajj4Hr@7uB;(sN@uYEg@8kO?F^|})Sju;*EQDjM?$HuF^I*Aut)A-TuqASI zVktB&s;A7bfT|b!&^-nXxA#KnOvvDanKWv3Q|C`OK@E`Oz(FcDsa!0Tn<7Cp!0&(Q zOSlfTSm1;pAXJhdAYA{!$?N|Ums)t?Juns*k2h9LxUyh_QAj|+q98`WVeXPa0))YS zhz7z!1d+)%CYel`abMZN+Pt zzfWgm_#l%Or^e-YA8mR66?odX?@mgK^LgR{NoUrR56URNEeav7K}wIYMRM8qd|&$; zA69@A+Kupnb7pb^41Gs{#DQa57@Bbl?ZjQ{Q$!ZSW^o}E!)A416=HIn*;j(r3r(Bw z2#HqbB|%=l@W5=--yKkeJFCS*aaGtNH8J%+;VJ@d!)An)B6gs@A!#lp3B6=vO{ z+FvGkc6|?xZo7ZxHti-y{O(r+KibP-+dA}z^k|EI0vMofEFoS+1l91m9D^iTmvD7k+x~u;LQC|Dk)2jaInnRN&pIYhMRVX{Sca9Vu(SK3zDZ z&s-vYxk)IhfF|nPX|wK0@-ehpO$rn2sr$0$E@eV~V(9(weS9Le9#Kkj$4fH3NMk+l zXLn?_ckw5F^8nvYarEQ088UyS97Prq;+?l6}wrZ0~mQ?>G6Jo#@(Ew5_#m6y(d6_nv4js z-|1^$e$wr4Up%|}e)+pUBSYJKlk{)M-^&QUhBnu6Z@1r{pw2h! zr5?!z)0&QPtPdf&{$lwkZltRrF?|@Km=(qNqEwmvS16YKA{^qpPqdArJ8r?c(alk^ z&_MXQeaoT?G8wEQ!W#&wG$J7q)F_)U9P;7PC`Ym|4b%=<({2VTfI(e)I@qvK-@d1; zF&bfE`eeK^mNJ0@$hwImT%gk7qt&M>5huzF7z{3xdw$CV;Y?+B78o9wT>KC*jDW;QoNh{(icIbkq<@C#HvPxgiITd7Z@C{Y6)=N^}_<)~_zWUH{q$bYWT2uR#a8`t~R~v3}=Lp7l z9Q4h?Wowt>IM{rxeMSE)KH=mLTS*Tn;#A(Wd~`*$x(1G&+8(MOTs?K|?9ZjQk-LwOaxTY2lXWuF5A7f)ULfqSQ@1HXxsydnK)NSu(t{SVR zmD{Q)i5Azj(5^}{q&>_8q{2}*wcNWk4(vE3tDaG@5MCtJycd?Hpzvx8k(*yStrw8U z%#i2HN)SRj1ML)~TKG_kBP<`U)avjq?&c?z(L&RPyY1IhR2zz;r@boH&yi9|B_Tr) zDGF2tu?u3W-Mm{eYh$UVdS_RFYAtn|j~wN`+`U;jtp-_HgS=10m@!!Lmj9l+e;E6U z>^jW+!Y%Y(-#zs)s^jwyFHa3!PbNbn|gzNIw%`nTAx1CNG1>}{{g#gYdGejFR zPET={p*W?UovL|*730=IDa(WhtDkc*sJKCoOFe~aNc@Q4<(v{HP@Oq(tKm7h=bp>x zB3ox5ykp|7{8VEs?=T8Z{YCsepXI8Y*Oy=MMVGVL((@bCbH5ObZrJ2Fp9O7k%*|f0 zpix%|xWdG#MX0w(Bs#${Z;|33(sXuk+zo27E`|Ew4};&51b*f6)iVuOEqI}K&jt_P z0^&Gky*MsXB-+8xHv^8!GtCsk>S$jDGq;ln)JypcYSA(Pe+kRyd4cOKCrZDtj6Py^ zFU}CAkLSeE_%?Qs+FkccIMK?`+7KQ8PKr2_<(dZz+4(^1n#t9WQP0hpwr9_>GMUxj zS&*w14K#KHWm4}6J&N#x^-7P+6`e>AS1qr2+35LfR^v=mBfm;X*rXa>l6)l<+Aenx zP9mQwgHdL6@8(Khk%$`a6XKs{o^Es|JvDNKCehg|T2t!E9sy5p?6T+X7-9s>gz2MXCT zUzey3g;zJSvY|@EmB`slouwO@m5h=ogQYke6}O8AkHijO6OTq-D!ca)!g4U1>~^E) z`ZF;3s4|tX^HgG#KBNSH7Fg=$pbFW~TV?%?;x;+UKN*&|nj4wRT<|Y7Z~MV&mb*1{ zyS0wW!euW%UL1QPFZ&c&;kuF!k*t|? zcNN=?KzXUfhZft+poT~IUlo`$Hh?;4yq@KElQ%j@kd(g${i;36UU63&^pvl3_81V+ zkNzxali-#e(N#>(&Of4d)haDn-LBPuCeGsu>B!*=d*0?iu!9d%&nqlq(ZlY(jS>rsoG8VS&? zR{p_BkSHEQ#ud(P@~bS|tKk<`7RD?I7yX{>YsAeV0lUv znFQ|99CD~YQxYwV+3`@$a7YbozHXf?hK)#o!uJNHC>&{5H8?K9jcyP497Fa_mTyoB zLsuwcqyB?CqhN(}w3&HlBqXr^ibGt7f+=-~GO}GoM}oGCjOo}?eTPbVGqI6IT!%JO zb4{IgkACm$CV6E|1a&#w8q<+bxg)gw569Mae*qjvkCNKpBe0V@yiSR>ARPbYkcz5T zWP>3}8^e*lcSGW>ST!O?6MuCogq9apO~6;q^|5|{VuWX?V|IH#yJlMr6N4^&T*o&C zH#-@qxOjDWkT&2N<(_h8`V*J5mRH~vV&0IqYqO8*?7{&$lRU|c@0>%fSKDQHivU9H z?H$VXh<>HCVc*WNtr6b+#YMkn$4Ich?tUMCFRQU#4E47WwP@8?Si;EpsGM1#!XKo6 zm%p~JFYKJT+ZqUPhGv|R=$p=$m+ZD$8{D)_#Y}aLZRHMIQ?j`1*4tYfdz{uo&+dlD zJG~%#P~7SEm}beNx-cE%+S7pTG`k}{k?s2Y`Qgx-&&UyBm<=)vNsi`XjWTPzOuhOBZ)-SuL%cbB{sD2Sf_){Kr^v#8tyMpSz6t@=i4u00QO0< z6b)kw%BkfD|Jgh%F~H}Dr660Rg=tb?>QfsOyw%mbP#A(03MNt6xoTr5*pYfn7Oi+x~rar zp3Yqpcg#ePkW3Q)4WX%UIrv=ka7S{2#{c9ma&uG4k*cjCc`>VIshF5VOQV?Nwyx|u zTL11q9^F507-ihRp+~}#$>>^@>Ap z@#tTSZwmGVZGHB*XrdIkTBRHYjSZx>ONDJMnV(i$jjyh$>*4Sko@Te?29>oK0DA%% zJoJp_wypw-vqzqQEP@hB0qRw@N`~8-Bj<^+7&)y}%SvX)6-S(7>{4W*P)*}}n_ z#(U}g1^>MVs}jvs#&xi#*pA!YG7=7Mx^bs35RA2F=lN&^X-E#0!pbYFU!XZt|FIKD zm@q-R`L=NCg9;gbI^Vl>0i)Ic--M}xsdg(Di4}d=J1Xs{hQE00qqDhjjG49T-?rc_Qa^~&jYoaQlnEnuMGxy?3xMq3(s4f~y$`v3Z;|fhj zvn^Imc#!Fd!%aE(ryR#?_zy(XKJ zvK$w;cUo zfAkKT6<3Nz@mV*vsZj}iKr{%V?JFVvq8_|s8OGB6?qAAz4YMw^0kYwWD|Sqjbg2Eq z;kBrMA0D0$>ao)2rUauSF3cHE&95Xs7$mK}^8`5HZ}G2J=6$gozB4VNv)n~-4#IjX zw}qJs@qCI|H|s=}+I-^>ILlQ%SK)x4M8?>t%O!cd9g`MALG?!zJqpy7a=ytZwib(N z!l85-=*tE$Df(y=@S)BE-63*A*iSDO@pxoBY+=1K4qDxM@Rhqyt^*(ENHR|g4nPHa zBgFeU{0o!%QXeNb;WQOP%vk@9t!8u;oLzoB*82V}$A9_6HjJ$RI;?G-uCrdgJHRK~W`NUg z4s-oKdD7-)}1X=8I{Y^G+ga zm?dA6BERT_aIwv*dq&oE3L1_&q8Dth#_ZCY9vw$2Fi?hxduf^p5U>SXX<5+Cz=g43 zdM=K7JrC=CczNUKEv%HH>_Jwcu z=Io(t?^n>v_xuWvvNiYSE4M-F_gQqzw{Q>fNZOJW`7f}>0z~PRGzG7N_+p{>F(@eW z!B??->?90zA^IXr)=J`042!eqjkF8q4HTAW9@)6!yBUs0TuJEQYANlVQQ*7TM!-A} zQ9i^aU1l!>x`Tx{yB@@B=EO$h$Bbn?29_8PLqH3}qA2crY&}MhhzGVWvVmC7XpuX9 zH?kiG7wK4^1RIijI|eYF*ac^E-8(M+K=lHQkq5q_@Nl3rO8*6Niq+&B9$KoVQN%x9Eiryo(}UmSV{$P8PMMKOQp z1nMauWZwRmMl-BKCQY7#E4D(X&fj;SRHx$y-U({h$!c}bcQ4TuYR*ElN4L;Y zJ!DDu{_YIK^@-@!d)<`oed{gO*YA&8-pWEe$6kNUXTi7X$YBf2LvP$gu={B)CeU`e zS|6cJJJJeBNj7k<_-!GSy{eIHJuNl04j=PTZ_0h@NZA~OeN;$Dy^AqtD7Ac{E|~DLi(deNC)GAh^;-}+wXY+1RkS^N6G{+(+=}i3>e8>e6ShtQ~li{ zwdOCG>b+8<@a`>ug8KySp=O?T91ZAAJm%Mif*1NU9JI#@rd zD*~tM0UR)3;Srq8; z62%$^cm)SSd_myXB!GXB(WI!22l@^8NooZNj;!;lNR} z7iZpJ6O)AS_e#n;Z2sh6;F2-yXm6wFkSg$X&9ggBe)iu)?cx%$Bky>lxQAmn}8t;EW*W87UJp z+v^-t(S9)`IHM($X^@$JU({p@Z9j+%Blx*cJ66yO487%xgHW>9@HHf&*ECrqzc10){S(0t%#BC%Utb7yinRiF z&|}^}n~g$HW`@e&1h^yTd55w#6(MUOjIKkQBm38d`jVb(Kp&GQuQ}Pi{h6Mhz%2wj zCV>!}X<;#4N>2t|Aqu<-st+pv_s~DMQj4N91CKP^fl_cC^}%sisMj8?)(L<}o54#{ z%5>6%VcLehWEXQ75^QI)>u^mtbW1KhC=K4JoLksXajs7%^>Hw($fiFpZgMsa;+p-C zW-eYKI)B@1>0x$5{DeP+HX?CzO{3utl8^!8(j*R1?W94+b_s!HHu|qMjQx zl!vnYf~OZJREdBp$2RX*gY&Q1BY+8a-Zk0{wEn@jLBhL(v>OCH_<|7$j$zhCGw7xq z{u^Wq8@msB4-G)aG{El&nHpJjgW$-y6lL8Yq7xRg2jvox)gZo6dOo(Ayml3u0f1|g z)VA}N1K>4{5nTJX0H8*cBy`|90I|)I!~D{DUoku!*Wf4pIs^*$YDR+cBnY6Z8e!;` zNc37+1@6i6AQ-b(h@DB~E;&Dz^SMIGaXI8k@obJvS@vj>#{iEs7^CSzRF}@9#cIQr zc_Ks9B!Xe5Y;#|hc>_Oi%~4pgyo3(FVii_c>OtV;#608GFc#EsGI?XO_H<3S6`byJ zU2Aen!*)9LaD+gXuY)i4j(4Hvlzkqmb}4e@_J<3p$*-(B^^i8?jy;&8F`fo!Zc$`W zd=$xu3fO_!e{W!U2R1u_BY5Xw^SFWS@?t(^v?MXoUBR z6tayMDns9bF*=5uJdlkYhq1~Wil>ebtiCD{pQi%?mKYlJ=2-_h^-DP8W-^6JIQ@LH zIgcr7Ju6#gk|_#)i!W@qV&VPe4B?v2TnVQzx<+ewk{7n=;cS?sF!G}^@)H1UfJ8M~ z&Prv?BXoqZ+X8Rnw>kT$DOKIz+SP;GLXQ@Gw?5E9%=>u6iBKq16$ZlK?&Yz_0}+yj zs1IfZgNz#II+Az9J2HrO%>1- ze(Q-7m=i|Iyy1f*ZPZ!zZ?`028D#@ESA2&_@^YXwgK9U2r4j%(C#>pXAnkJ7z*|F; z(DgdQ!_LP0UGdq!rt9M{nLVp(1#hfG(L@O5Z3oAiYt4snics>e@0=I!Cr>|LvJB^E z&b!m`K(Qt(d7Po8Rj%H6-6CP?uQ6=R_oJrszn$J7SG1IO`;Awe1<}=SvXVxp$bUYX zr7LW*N5M<}>AaC@q-S}-3?G*st%=S!wA3CQ5`-~i2 z$3mQdcyY?Y9=Xm!J%q|$bj=StcYItlU;YKPQI z&Tm~$v4HA$L4JvaeJ|wCC^C+)muEEHaWb&deWvyBX@|>UiXf6SA*Gs zw0UB=(J2r5zntRw8F1ChN`3+Lgh4)t-yowQvZAeJ3G%&oL#n-NT3qAg8n4#JI~7Y{HEVX{VLNp$=_daN+fr&!583MK2)O`+h$UWl01AkjU1>wF*EtC*RTV|ZJY z0ph7d6qlrRG>?50r>N=V0&r0jaMyEo8uXVjyY~+;d1dFz#i++>sS*Tr16E1cAgkLNjjtNt;2y16Q*2wQ$V?lTFfAko>7nyYMSKPjK%5;hf(nDG)7ThGX2F+NefPc@tAP zk&fh$08(`r@f#SIIFE}(sRffOMKfD${QZPiGX2OAl|X$)UM%9hqbVpKy|;ETtjcFM z$q@GR&3{4d+Hi(lmQZ=3W(-5@3?#Gr+q|E#V&U|Aa1!pIaF6jrid&zGbe_vmW{_)o zFF6$^Cq|nQmQv3IQS?MEXNISJs&HXQgxf5h^uYO7%fTMtL`{dFz>$wjyvJB}@mTR@ z9T|F57FiH-`YKikTSLTrt~xIozUQYcE$;Sxbdu$=ebmc#hS{4sE9Pe_8TK`HiVROyZQ@fA&)&FjqNlw`5>iK3t6Mi?%@c#$0s>*kW@4rJWImw#}^9C5hd5sNr zMWcU^QF;}rh<#Z^1b?6qH2)E8%dizrj#_m^#F&uoL>kD6*zzzh^z)CP+N#7ciYBER z#{Z((=Sf;kNKcP{@X390_wst}p|*d!UrzG@8BpwR_pe3Ka%BC{Bon80VN z`Ks}%SzE7T+A-{uW9m;ywHF#r3OYY~VLZRMoV2FqG9RvG);F6?Sfjz=%B{sQVg215 z`<~Ozr!B!lN30ktDLh~$D(s-tHko)T4}0_Y$P9loy(ZqdT9`>muDZ(bor$K`z_3)d z)on`U95E4u;WF2i^ZQ|4&UPs+46s%w*i2`C@wNV-hvsUwjgh9O+-#gMvt+bvKX>~z zC>Qa{LADE!m&6%L57x%Po*8>#m7%X0QgUl8teegVRaGGvaiiEcYKBdfO66lvW|(Ji z*W6=ZXJ}$z8-|Fs!)p-x9l5B5!M9MQ@zGxt1Xlc`!UWKis>XzG3W{oPd)gmb&;=G6 zr=%rppxs2L zg|{U>@UsW#ee*Vdy`x`k42P7s#F#OOzCDb=6A8H>3A-VLts{!sL;4ee z`6lrlQ*R&fMZ0^1>4h3N;O<1M3I(=Udb!JC2_7Slr+lJ;>IgOFCwcZInli0cl{4V! zB=phjFM?<2rB2U7*7v^{=>%@wWclwcjV;egWa%(R#t)u*1t;JA#NOzsRy1 z>bLuCro-j#q%C8IC+cUCr{t714Z`Pk3^C@o_!~+f+r=6rknK|)n$<)~95>O=_-xGN z+#O17B8Hm#EyO$SOR1nJ3@dZI)6$nYiIq8?xo`;?J41Q%CPn3z>`rHxHvy5#{vLMg z-|Ty4pP@d>xViU)_Bx5-er6K;4peMAow?iiPRIG7cm&`x4+_C~q|@sSGBIJ@(A+D4 z5gF@|?KmElfaMzKQSC?_9fIW=>5=YO9;JZg8tPH*XdW$s>z-tgb!fikmvG35FKsjgmb7yeFdqi2ncw~7-`MamLeVcMT zv;3dZe}iqAZ!ztFAGv`Nv$?}OhkJ(k$7Q&~JqLTH`731jq2Ay+m-$a;_+j2a-rIrd zvt6U!VBXt<^_XqZ@8BP8LtYqdQSWFUeSo>Kf06F+9SK1Kr-8zMkSC!bFHq~#lD^Pj zCc_}e?zh2gC&M7uGU8xdScoxCOa!TBhJZTx!$8q|13_ArsF!46?t9AsCtM-&nE{}h z0n$BBK*!`UlP z7u~wkcvIWRdYOus4bvL^^id$frJFfnwUIWrw)~d@<3lqJ={mk0LP${pmOXlhqu0Q$ zB7WfSwRKU2MUiW1p}->E!MIhyYdAlSIfC-rFjNkGpFhhx_J#d|wS_PJzJBb-?N*|4 zh@Wo3-I?`mObZw_h`}F=TL$r7O6W+O+;7%}0a$+Iix10-qzA7-2drAlXNb!X-3Kfq z+k=738}f#ZjQ6V#5{~I{Q@-}?LhNYe)_aYjf?SPR4D3>Jj`%+nZ9x5!ril?lsw!f% z;Am!4uxpS)fru(~LXsIa@F7x<3s7W_I+cPLg+I-8e{=VPEB|yv6Zf0^`>F^KMeG1K zJag2g8U1i}<}PY6v?o6_f&SQ%^l28H*{dq6max|?;y$ykDP@?&vABEdHgw9crY!35 z5^5`Xf-e}B;F0-IvbApimW`1;eUt={S*An{^X70WOEvFXIU6ocleF8RV~3aW^A?vR zeE=9%(c>L1A;3?AaK4obM2?mjkQp6L=+VwG3H4CCDsYvFMS_RcCS`YLz>H)Qoo;9U z*4Y_IoKkVF8bnRBq>pudz{FvtN^>VC&Vw?lI|Yi)F7iE%vT*{GPzC=`hZDN@`NuaHM243`EctuiKdo`|*N!wK?gu?2k9T zgHvTK9+jWkG#WCP)d`dA=(E0gTGqO%2~_Ef4D)(F zL+EI*edOl=fE6tZZQTZBxb|nKTIkny5jCe2;z?U#=P0RZ2qzvC^Er~W`uraT>+~?C zyhb_n-|PiDiIzjj;m*D6Hhn&fkynr5>}iKFQ0j-Bea8%66ba%Lo|@zqaI4$au|Zxg zu3@gR=TqLW`n^AWW2s2I!rJeE;6hOH`NjgimW*{>S$F<3VNJ7-|Aw! zIb$ot9P$VkXLB2w?yPRgxtg(J}rIu0YxQ=fGPhE;oub`m9w0cd-W zy8o*3hegL`0owsMu{*55Z zk)V?20%&>%o~#$5cbF>vXVy7<^MlW%Znni1DiK$~zIf=LedI9Y|Cm+s&g7Ld6mFdn zdv6SQYWF0@PXMdEHYUd1?732u0?(AbHM`tI41>Bv3`Wah7ItbnDU{gvnuSRyY~r84UVyV2Ur^VJ~4=OAe6 zJqqNjU3ucamsh(tEN6Y>j?9RCJ?F)p)UzF2TT?MahYbOU0$f>Be`&);j*55dI{;eQ z<*OWVax0DP2S&*JvH|@?HblnvfGp}2{;?xkE`=t~(5WVyT;qHGEbNu;(IZo?x_Zx) zDQg=&^LwZ)?$z$0BU`TPde5{eZ<{Uid(bT8Rp8)}F;`ywOY)StjiC8GWES%(aOlXI zYrB4R=t!HZYZW+h8v+739s<$peQnqg17c1_#i1#j)J%5CHkN#a*l$x?j`UbDw2+(xB4aW zpenMCqPO-X^dKwJj-t2bCH9~z@`j?f?j_(LEE1o>xB4aGpe!)j4SwvU8GY&d=V80fo$pl#fMpMhMWhc@g+xy zgXDo3(_H;*&gR!s;FWE?T@l&vxv>r-UD_l-MXUaND$iIe+U$y1=Z~Y3U8Llx9@#=4ztmWVLz67y!~$v56ZFO-s@|Ef@RN-`}%? z>stzI(N5-^2&a?tIlDvBu&1afD5&GJb80z!k)a`%=OsP#jp(8Z^PA=GMy(k`A`a22 z499^vCj?n0uXI20ZIBpp9@%v7W*8}t|*+LfKimegQ;c)+kI^2o<6^O1X|lIPyp5KQ%n zE7eIW#pr4BlLG?>iXF8aEihH(u-7}k?XOD=WwDfDd&&)1K%aS%^VeV><|2RD9 zPl7~|6T_mw-Kpt$CfBa`|Cx=d$;r&)`h~xc{%wjo)AB2S!FuCl(^5e*)mM7D+Pw#Q z6w&+Kiw|P5-JPTnV%-rBYVtci@FB9pZ*)WsRX)zIudp#3|>}`D;t!I_86Mf-%$k+JhLGfP_7>$k)X7 zWh;V|>iGQf!v=eq!u(68^#%=pZZ{q9;qqzb$NFV2|CL%fw5+1(iY?vVVQ08iZOA4g z=GlLKe6eXs>yc=0UDGaT<9`y+8~NVWb#BG<%6a{(cjGAPG`u%oBV+NI(z0wxQoDq( zH<42!3&PSoR1&K6S*Vq~}M}}!~bO+Mps%@yi#K>$Dw?}?wYQtJmiRC7}x$`v&yMMvhy@=2fkH*AQMO?#VXrzY^c{ zp@GgF<4EY@_IV2E%aqR&^oi&Z+IJn>S8a;CH1m~zim%<$;&yONvMEd5o_Zyg6fY0G znkgAzF?Ws!$ir`1?rZt=T{yPFqx~ltCz-UFs8-s1}Jwh@O7sOPLm(N~%W#)ngS! zc1618;AO>^1YKiD1qz%Jc($;<);?^8j3!Zh1J;IVWv=2*ReXy|0i_rzmmJMyHxvVl+H&;QzaKuC5sBvhltV* z^GY5?9@RW!l^yDk!-ok|hBgiBC}qEDIS0xXJDAus4zjb6Pma#1X-);xPvN|cykll3 z*+dSq%dm%22&Pk%jDJc#ntrjSC)t!vvH+Lmz;cK%d-FhudCh6>rte%b6B}9;Ue#GMD^IJ#6CyY0!_;VtxLC(?M&)tNlWgN`c!bx z1$+T4vZgyU^h{A%itVFxO+2|5sa>m-?EpQc8~T+!iak1Yt(10YgK*nskZ$7pvOS|n z*NKCA&V3|*lLz%4HKoXt2e&KAP`I3Ssj9S?T`<4k`9=V8rBjJ#W!{Aq!GUWy?OVcA3J2mF~03W0cnCBUpnrCIf% z4I+WYkRxH)6X=)ylOVz{?4b-Yfy$61Vc2u%xBZzQoK-lYGvcD1wm>_ zsTudM1`R=KNtChdc?=?e*pO1O>SOAse+9{#^w<2Z1L_I31ZhR~2HO%SXV{|+-1X1- z{pL?iyo6~FU$Eov1qlRlO+;N5CnX57Jx_6=}i&ofvRkG+Q%3AOiiTkt%lzyM^o61JG1INoq08l(W1tg;i~A&QK@nKhbYy7 zi`R~ew*@sT0_QQpab?PHlXix1SuH2rxhOng!y8=;U*t$0sEHwvS5>5s8y$c@#Lk}8 zn@JleVGkl5kVBtB%K_MmXj;oV) z9c1zX?33XG#+wD^yD47YBopRugUGywmA~Lh9BjR9-+m<>zDDb>x+ybn>h){G#%_>u z6Hna+A5!7nI($87-arr5!3$|+Q!X(0Gp&BX7t?t`RBHVu#OUvwz{VHv!&+a^3>>_* zgLLR2uG5~d7;N^Dd599u<(~2wqDgjjip-;8kyIdaeR>Vj!pKAD% zo+1Do&$%_{FPxTUb}NQ&!kndHG{eWQ@4)X7cQb}+22!k~S&rxFEw1NMvtHkCZzz3K zD--E`O~|2k-NLibR5qEd#lp({)=&#rCM;`YH|c2x>Wv-jjJIttzDA?vhE0t+G9@k1 zF+xcr7sIYPCJ$%vLFmI|g0{XHdGCWT#>8`_(2tKn+MotR@IZrRTB3z%xJ|*UTUT)| zqsO(=eOfie%e*Wi-N{cpm%mn-i3NX0GVVoWF8)c<9OdxHDnYh5_s4N;{}uJcAY;5> z7T$;fLHDTV-1t5DZ)&j+Nka4*#t z8lXnOScMHjnrJz=3I?hN1b<)XOXSweM8hQObBk_;=Z) zN6{IVij6f*J6lV~RhH##Gd!Ls)tVGC?#5HE_lmCnhzXxKQK=*-7bxC8qUL z-DCgi5%~tYSR-}01I4+6*X<#nGKe0cKE!vJXcw}JS!JuDuH;5cnSTIfVwFEh^7#dJ z0)f>c%`Q>`Y=(x*QT+Y~XpueDvXBbv*ROb<|16;K|5=d#Eoj$h{RrA4pWmORZ11dD z=n#+sg1-a^iL-*q1&95`fq@7m_y-mGtt3+G>(^!6*!Zn`DpahrYQ(UAWU2BN)au^| zEo-XHs#+~8t*whgD;r8$EhzRw)UZyyO`d4z@M7tHuE z2a5P<4j!bax5`0O-bW{j8rh^n=U{UG5>_`jhW5_yy+Y$e9ZTZojxrj#r^J{#BxPri zoSR^IH}^PrCl8%qaxaG>Eb&)wxr0uzwX-Im-3#JIZwX%&$&O|p70_;h20Fm#o)&~@ zXAV4V#}7nx35OJe=Kd`h>ynyf{xy4&O*@xIWmJFzw+%I>}h)umR zF={7`n}odod+&jGDGh*=NPB$kk$p8h17Y^{%191Js)OJ(ERpqTTa~YVGb?e zh!fZVm;L+_u)S%CfLizw(ESddR?}5Bu}#WbKraCXq)m-^oCxy5iFv!B6!rWLUi1i+ z>bb;J<<1(5#N1zb;^g!p<|6lTPFH8G#>5F8x(#4x*t#DyTnw(wWnjaxATX^Gz71Tk z8kix0#%9*_a414?CWEmi^k9JM44d*W^VN%o@g#X|1w};we%P(jSTb%*h^7$YJ}h1U zkN1@19U}Xv>8lPPqo2Er0%$eta0AJhIjjir11=}LS61FSt`suP1YuUrA$Ox@X2A81 z7Y7S%8wpZGGif+}JYjbKdPc$B35M2J(m_v;^87|y6k-5T%9*hO0m9U}l{s;fPxwxu ziwZD}?80x(iL}*7jsZdD4`z|QWl#@9Tdz}R*2_+v1hZ{Ttywv=?}2+K+#F+}Y=<6n z(wqR}3nQ|yw@oftZYSOLnDXHVkw>*rLBT%6*Zbpikem}lNWS>G{AZlTzK#A z;(35DYYNg)QZdSpZOz`;PCODR6M@kUI@V}!-J4`#h7P|i0XWhuupkk=(_d?9ul;>Y zxaf05RzyARKxmi*TTyv}b&<5H~h)zG}bVrBVJebhz8TeEn4y zeLb7_7c=zG0?nJ0EqU*st%&nVc|#$ab|yq<{~&dH9WnAPweof}pb=sKg+GE=ppWk# z#CVwAR@v1|v>s}?1{vyhUKkkiqO1gHVbUooC8nY>9-K26Ld(%&&#;s`s?-a+H68(NG<=8v|+LeG`{t~2!PPj9Rm@Mi%!ToQ-rN)6uRtkA& zIBc2g=UC)HJ3{Z4_HEZ$c7m9U<$Zh*m`xzRA4Gdagd zC zlE1SiU7zBUz+17Xju{5XQoNhX$b2#M1)nS(r5V8cio~kssx#@|%e|;1`BA=k$%N+J z%_T&5r6*HGOVHiYNdx0DeBl;4#ebH}f1!T5f<`W^8NV|z~4V{Lxy8T4(q z81-AgmwG7e%rxnX-!8*BJ{Ps)Ya{A8)0`OxMp*hQ>*e#`gHX`7?LF5=?Zo$L3Dh!rVr2XecjiB774p;3`}UpIdKnG;4Hyxv2|#h$nF)bYWW^|C;oXI? zl8k@6W#QlsvFDt!$o;v ztsYj@*r_?g|2((3A4|E_n=f7>tb)SNXZcsxpVcKYb@@Oc%tvwm{i-x4ZZCnm0JYfQ`Z;XE9dYcCe&LYf7UCf96Gu4KTW#4rcxzjd{W7_R3=Loh6g0^p^v7CxJ7 z5nRA>#Bx`z<}jS^HC2O8kM6AmGmpHbnRn7IB5hUHDYOf;?@1wWTNI55uoqUTT(c$t zFsX2f_?3x5t0X=tkB57YF2xAPDdmh?nI?5+;8r;N+xxDFWGbi_>#c2YjGF5$&(eGVWmQ>d(g33BCN?hJJ z{&dtvRU>R?&l52^hS0qx6LwrpAG!x#e9CfiqS!%@0y`G9PC9k75^f^}8f?hp^n*Dz z{#9pB*DlLUQcseeQX;a4Yp{}ngtn2{p2&C|KVjR?FVOR z-nEV>!(li%)#|r5l)pWFS1zb z>a_LE=ooP56#um2$KBKLmy#jQ4DYy{1-_dH+?-5#2))ch2ykrpfjJCF`P?f=daVNJ*Gzir_ zb)&jSVb}Y!B-I#*Wr3}1TOA|hQ7B%w`GW`C7nafxxZ4Wl>r_f7gcOVq$S;-2uogC; zy>4cHHntI9$Tf$#q@;mEC*wHWN=u`I4%ry`dK{I*x3&rzIlSAURq)sF@YhiM*Bn~O z9t!d#Yaopb&LfUo;V+7qke1w?s$crkBb3ftb-H?R%Gs$q$G2+s4d#=3>>zaGlVI!I zyBmzJt&#Ic!;Jb*>zp-OZ*(^1XpnY6`y0>jTUW7b;&@l?dfAKIh|R;Z6s%NNn#nC` zPS4Z7(KYFu?yB@}53@BJ>~2YeALt=Pd_Z~hmNTQt0ccr@dja zNLnjEE#l!XXD6<9#E0A3))lZD=8KL7`{DI4#Vjk^4g1?h`+5jG$YO~HmK@k9lfM^OhBGPZg2tX1m`qXA0DvPi?>s*l z2=Au2F2HTxnZ2sG>&(`kxXFutCvmChOuWYq$AdAj@zImMtWOSV;+cGr8GdH;;GFR}PyHWk(F-y+ON)hqV&@h8*B8t){v@PX79~^ON+A#7?!= z&C*65K*Z?Nev5-O1%w&8>qM8+3_NDAVe>kF-_e@O<1;*fgDX}S8a+(RVwE>opHwp_ zxhd80%)9*}#Fzw?s4c47*u^qQ6UX#8ttH-)R(&i{=N< z_ntQ6he2pbFL*$>jW2lU+OvxYxbrncx+<`}ZvFtNpTaG0LaPokW1gj7EgTP3&6f70 zQ%ou_ndi~scvxcb!0B!^@a=clypvaboio|8CdYf`HY8xS7K<5m4`;q7xNMCzz=Fv zxz7b-+by|S=kQ=i%tFcCA5CIz>s?a05X4bVyLP@{l~ru)qr3KfI+Lh|bkxGw`Z z+W>^hL%%g(bt434;7E{h5l7tC5nZx|d5dfO>VhI1ZMID*82hsLso??GJGiAKzly;r zqze69jI}^CYl_>R<3nSqCx>xe%$(Vc^M!`w3%2*w&3(6vqWg5+`5Iuxft_5SWNeNVA{1q$^hrTRgh#yvdSx01s!Cl{~aA&N}T z_O{jp5wDL~XJ*3`1>jdJ4*8P7GMB?TJGUtC%L3aF2k}wWJlib^ zcq$FZO+tH<0e^GG-ncz2HuBMhYTx(&=EZgA+(9n^{RZhV32?%rrT}t_+O=hO0|2l7 z9n4O;DXHoxP(w*86}}U|BHLClm`q(JDG;bjo}CY%yw(7+oc<+m0&bBWY?ZOBZ)2n_ zL%V$}ysDhcb^tbfg*18ik328y%vo0;$^*6K-m)`#uB=MFl`rmw&8c64__aCZD_pS# zA!hXqJL+sdHF-SvBa8wY_1-#p*a9Cw-;rgV)HkOAr3g=8$t2J%`BvMrG!H830={zA zm$%iGXya*N^s1C%t7anVE86>x*V)3&XJlDIR#F#CNh@K)R5DTw+k-7vx_|N2?0r+vYzR|j zO?3lQQo03fny{t3pCL6s$dvK@OV|vO~VaMb*5Wo#a*DynU?zzJOoMY!1ZOc$`%1p2G;dTVmoXEEO z)AmY(u9N75;@m-bVw=F{nZEq_gzE0i&Ru#_caAU5je3EUZGY!zbwu|KE4`xC9&Nr* ze?_{6J(`nbTBIxw88mzGG!w1P=asA;R;csv`w0YK$Q7N}l~3XsZ~USB$7Nr#dQP}> z>Nn1lQkB?&(d1Y7Z6Z#u`s^p^=APJ4^Y7-c`|%2`%dw`Q+M6@-$jZeP|IGF32brVE z@nO&K));605SHu^j8^E3{b1K@EoOm)N%8BcHJ~xJ^L1e?`L$pc1Rvn{x0`;fmJZL4 zz_yEL4vu$Sq%LQ`tymd7PDzKm9Bk7Wl|9Y>V6@ZLe!$?0H_i7k#olF7ovYWswB#9EtgOk*4#!yqH$TlR}y9)k2*y zrk^ON>Mio$AHkP`Y^;Ib>hto|_wW8YWmMzrsJ5znj z0%3Xr@tLH;x@~wfIO07!DkEW5o;U&b2myD0`rxw6{{=(l#D*vc5>H0(#_Nzv(2N;a-*_F?b z$clobcsVeO;XnrL&qkz;TyFlT`oXGxV^)9t1FFuo(egxlUA(KcD)y{ z+K#;HkPknTM&Qq6RTs3HNY%LKfJ6XoBiN)=7j2{M(R4g*<9({nc*7b2-qc}r8c^~} zLj5VTXS$pytJ}FF)piZ&EAO8hK(DoX8BQr;d5M_0kR&P%VV$xtwaM zX$~VcU6YhCtDb5yzVe4hVaccA!Z5)OW~W%DS1Rbu(3CXYyFv%kAp+tx!8nEI?B# zwam}3r0{me^mgW`QKmXKe1zO6U+I^l6Q2Oe!hL1i#50-7w3vt-4CS)@reqMWRk<85 z%Crc!#LSn>wmjXKu(0m}ALs#U7wYeE__dW}v!%4ShgbZo0>WM_pv&jimJ+jV+sCEw zsmIvGs3@78eJA#ik4e|#!Qx>{$AJT-z`7;VaYc=DVkdD4ANG|zW(~fk#++*j?@e~_ zA8N$VbvZS}bG}7w3Iq;a-s;JO`lD}4uk<*@lmCebd)vkr?EX0tW%>`jMlu#oM*kC_ zlapliUtXiJZxf^KQU8F*aJJ;h5oo0&!oapNSE@YAbQ&Cl45)M|!|K6M^n zjCKk!^+?VzXQK|aWWbYgwR9TrmhdoV=!*0IFtD`&lN;WBWOiOB3yp_bqqPDhOe%m1 z4_6l=yJa>jR77OL>(O#4C5DFsWf(wu#6F%WD9kMpZ5cnJ(U%Q>|6z<$xpC6 ziAzeUOGk!txQ-@6(xQ~aNZvSr@wi%hl3Ibk?jWo|MPtrH(!}Pqp>P=dJngbTPd@zl z-}(WBLG~!-JufggP^3TI?jM|w@av*0CcS_<2(V>%2wFA<;kD}`ag2KgY4SG=0+@FU zlIS*LH~O~Xv2?9_t_&hxHwH1EYtw7H+P8dM?jTO!I?7&<(%`Phd41B4>ge({9km6 zFJG1fP z8O!@!FYMfoI8u+T!hSM3;!d4bJcb$TG-igvU9cy?rtLl*Qugv}5jxj-3-io(Ie4o5 z(haS*w{p5Ae=BnGhBWk#`yfQy+&!U$&S_H(#d|rXZvWEO8)Vnn2&}hcZxgEbaFp76 zH74UFH}Iy50h>?$R><}v0XyY|;r$62l<#;qE&a?4hR@7BV;>!+&-ev(s1DP2=vFIq zm*FFKA0Ecf_yu_=5A*9_RPPQ-%FhT~*QBbh!OG7}?t5VNgDH*lmeZ}fAMYb-A2!sF z=_71kCbSLWH^y%vFd6!tiro%c$MDtQcMzltm$6%uqG{W(Z@CmU`0oro~(A{bk^(D$Vyt&b$R9%aiz% zN32}?oK=WN(dc+Q^g$s39_7`eZkvL(w+q_?OBi>T0E(JWJ-fJv=d%;EnlUk&kQ$)4 zlgkz9pxvC&YWqBa-0Y0T9#*2Gi1q3+Ob_J0a=~WFyTDY7*$&Wh9lSawQeKW~>i_;) z0|HkP<$qBX2E!#2nnD~QX@$vQFUkbWR<8K3Ypo)$cK{$(&%f#s@hY3RE~@}KecAa# zyhI!w{iBsDQq4d$vt_Sdmz{&9`!_PX#ha|>t8X>=7-H1%S9hQvOCG8!8=~3`xTE-*Y#6{a|Gz*gjcYgrmp9` zxI|qo-4`FtS0~RgMaa#MO6&3a%h=Oj{_ECYZypddLVDFQdnjh(VB4oQke8oCMN7TG zrU4nu_DQwiMrf?>SFgOTk603tgz{e7uS|B|E;%lxwG_|70{B?nzK;M08C$G&6=<)w7o5j3U(rk-&AOsz)<&3|i1xb@i}jNsyBBjv zZy{JB3wO)v8Ykskb3ZK#$G;rJn`$3@Ns+^0*KS8iLpbGNSMKfQ=UotSN68ur%Zbx|0+ zbofE7k6nRBdDk`blpjFf-gylC+o%yHawGcquj=~*V?(CH$R}S4*Q(AJc-t6%;8c{u zl`u`AQPePs^R0G3QE_>7pwCeeJ(U^4bmp8AO}L+>EukNxyE_a!E6Y*J?*7WDjc7kq z7D_5t6^5pYEJb=$rq3+`E0EQ*F6Ur18!;)b7GV13Mk7~8vJ0U?j}VGbtBxQwD5IK1 zngGinpV+K;^XeK-_Hi9z+L#KOV|@Wd&iYGeiRR%|Wgb!FmP8&Kig2QJooOLlTteKM za-pdx(5XT(%cfUN!2AyCd{l^5NU*C?ZqTfjXYem_rd^b{tM+P(d|pSyl^?;ff9{#O(%?)a^;6iGR78{nQP-GR@I8?iYK$BoSfhqHbWyT~qp4V4^IKW;jIN)BJX+1Y&ysrTd%>4X&Y)#hY?EUxu3=xD5wX2Qf zOgpB*cD=f=CHaP*yD`DsTmMXq%Xp;QLl0hS*J9&l-C>i*&d7}0S&Qp|lOf1!UBfW^ z%Y$pb83X1y2UcbC9fR8w=n$_0?A3@dVA6}@_+o#bJ^8Ks^QDX^2y0T)XJVp?P=up6_Uf`^?vvkppftJ7` zlLv)sAB4IB-8p^tUB*R%Y*32%RhHDfpS=3Io~6ryqpZjZUE zC9!3aI>aCwZRA|cyk%xGl>3KRiq|wuR>s`GA=XPqkw$gn&x6A~r!mMXH>Yw7`>%wyC`Q%%Qw+7PIq~ zy|UHeV_t~hC&yiCu$%nE&cr|f#U<5V6a|_lK+vFpggU~of+QPrgi(r}D)Km0UXY-j zF!HUYh3IQ}{uPLoDDSD^_vyT@YayDBdLRvRjnhK3?ZtK^w7u>i4z2S^e4J}{8gVYj za@{P>lcpK$S$=t2+)og>RZjb<6K7g3l4mOC0QSfvxhk$pA$R1mLbbz=saV64`3%uG zFIL=`#W-nqIHBwiVPtX(3Q-n0d_!2J&F0;$q7{52C7GP7(tC;n{+yFHwHY|R;1Djk z_=7Pn_B0klx)}#<{s@%fBm*)`3K_=aZ;`hCcZU=sliU`@<`py*Ltz+Fd1H2zz)K?y zaTZCzi^e43)8+d!>qL1Shs3kuHyzOyT|pNaq)PZh&8SF8Z%mb@;EN4nW&DvbYRXQS zm?BEt(RHNC%OrUp95!`jw#f=s@p4;9L6;<<7B$&r!h(&o;0t89C;1dz0XnfjCsUf-m-omD@O!!H<=*NR-DC z<$Wd#IEl+H;^lb~f-eAYsM`l7;HNl{%S;mG*Zqi57qT9vXUXzEvEkG9Y1x%hf{zCg z<@eYxc3^PJm~bj^t4dm<_tFyL*&M9!7P}OyylgC2R`zkyU0f_zRmZJurIkL)r9Qfr z8z7FGn~KY+8@zlhS3}C%fWJEb*csZ=K}XSP2?h^!a^?=9OsI2 z?O2;NB@#VHoP$f?RRAj`mJzRzEJ_ovG$Bs?5MKoT6D_fLf$m<%*`yl-Ut8;5@Bi;6 z=Bx-kQ2s&1loS1D&6_fIhX1>A{=YQ>@+#ujYATJ!_-Hy;`mpxExIcSP1f+ftE>1Lu zw2TANV#`B4y0JupDyuCZs2M?$;%CSwA|x@7%?i6LzSKZtKW^wvG}-n`oinYyYi zZuky1O1}HNtp446{${d!>RH#w^}DMm1EN-t+)fXF?p%oGW!njR=DG_kxX1!8>p(5h};PJ$L(4ThM!_?mNNcnY{oHp=0(Qje2`$)YP%xsgU)K%JyClvu%|d zqB~(`-pPd8F?eU~gNEMFd#CMt!R(s701d%o`VQY3h33(JB=7%MA@Kt0^+7UJhv7SO ziygYl_z}DR4CAN&LNt_z@il#mPWDyVUom0{a+hDrZ=odLE(mS$CJ8!4mDL$cSKcDF zY+i>2VeY$)K5vNYKtrk+x`U0#u&a4#Nu{$qZK1NKjtmC@T9nlsZyxK`5_P89!Xr*( zB4f~pWvx<#rKc4H*P|3gp`O{&2fP1NJcR|C>p#;Ii0ufiH4wu=+a9B)y;WHCwT-@-Bw{WaOO(?&u>VzOq?tx*Z<)Nq?EoJo%p!|x3V;C> zah92n6$QD`=w{-lD2<9J?wOvEI`b-l8YUda)A?3~1bbzXX=?ib6H1jQ6!AunCsoGX`5yB7mYY3#M4S? z)m!_~S}M?S;cFjdM-cp<*PZuoTGB)e&ALf!X~OEyI<}yh)y0Hl2<*Do%4E*0J@K75 zkmvnGM0y*zF+`dk3bxi8B;TAk(NDa-a15JN$o$?EXI1kqIrS~qL<_Ow8x+dEK&kMY+aeKACcZle}5Ug~)1`6_} z^zv{(o*0mrjv?yO1GZlf+P^Y79f?LUg=B8c#>ATeQR{nhIP1GTj3*~7P9Dhs#j^q0 zY?XTUu!G^Hca7nR3x~J^Lvq4?NXLTq^^LI=@>aO|V}r{-S|irDW>vv8ML5cAp4{z9 zm{$W5*^2d+!!?MH8e7k07sr!`RLvn>8!g4Z#2(~nDM2)u;XNHv_kH1YBi!8U(cv8p zXB}i`9XKK27;sG42kn#hF@_vMkzvU0{K3uCk9m;=y)g|JR_ndP4cPcn5Qc11H|7f8 zHGKKrd$JaxC#76!N#bJdX?NwFalrHNL9J>Btpo<9n{Tmfce92(rMQtG#Uk{%`j)%_ zYBB)}luBi#qJ&FOTYK+G&37tymmu^CtEZZB{sTSRD<4TH2A?wE})%d6*%FHpf_rOcNK6|uk`8i#9cCc^I@-NHH6fM)T$EXUH_7` zODV#iG%`LhpeoqJpcNt*Juoqrp)V^y-TXD=$x+HV-9i#mEZI)j zndbHPXi^*`hR9TAh(!4a3UfZrCBt%f6v!AwN@++9opR@+;qEScg-m^o`QPH{=v zU5g2}1-h`CCsm$+yW>P126T~hv#B<&;{h8F{VDC_tu)e^Lv{~5bR-wVV+V&&Zc-i7 zG%-&Zjm<~W%&DfRZk5k;dq`w_84gdB7k!GAiVbL8rHGM0!VmLg#k4TNDR zJjFB>AvN*mHXIO<+q{s|rTtdth0H4nji64$V(x#JVvV*yYMWu8LP|45pF>X5M`u7z zGe%z`r`uqpI2WD}?`^B5#Lh{@K{>}uDuhj_3vs#9RLaYR6$hlcFzs_rS`pa}(X_Js ztzVIsTqY4ks}m60(hTyDA@ld)4Wsz@M_nlkaAK|QDBE++4kPNLbLpI6X2GWACS7-Q zsB&QQll-zoD+!%(Y#etyD70j{K{|n#^@x(0GO?i8V%7ZcLF?OqSu_LnfFiNh0Y08w zO^aN`%FgN!|f5&V@1 zVP1uzm|I{oX8_6)*R^Emx$o(gZv<*Fcyg@srlU&~4+&kLTEdwuMw2Qw#4Og0TE$dc z;+rf^6)%1=j`!r*(HCDZ8$hU__*AD%@N@yI@G38_Ujph_f<>z6ViNCJNaQ3>(D2|;hu_RWsoBQKZN8%z) z+agHl!Wy)sMO|^|Sdm4ncr*RyQB~?9SlhBh_+tO(Ax*_+R;sS{suIO`6MtMX8^;yR zj#3O-gf9l^Q}%f~lxu`9Ca5G*R_?(oNLu<6DUW;`Z0ltkYV6T6Ifr?P%<3j$W%8C7 zpEmxk^*HW6t~bt2uEDN1xJ~%%X47b0c*ZSeKH;64R8`#TY{CDiS^N*%}v35 zPtWFI<$6-!@N#wiOXTQk7nO&(Bq}tESFuc@4Sv1e(1M3f@^c{LTM)y?Mc)_5gx~FAnT1Z`z18u`Qkh`)@ga@ z9rcW)j60O;2&X4%`>b0@(F^gnR6RJXjyU?P@^nLkfbjnZgKr8phMuNQ|EpI2@9dkZ zw(_C?+B-&^0Bj4`HUlN`LjeReBt#K)-k^-4*@Wpxt8GV8Fl)JF#e?}%*|)yyWySX6 z<3gl&%F)Jr1y5wA#PN&u#!men=b6^b&kBzZG-JTJn}`El0OFnKT;y5BN$d_36t@HF zH4KVG1$i;Kon>3Kp+aE)+-a?J?e{Q4UUiHRGI)A->n@F?5__~_^$IEZuULN7#JtAy zdu+QiE53kVg8`&!SXyRT1qNYy~qvoS`*dTP>k%w#k@6dY5seFcyh8ennX@^f%tdKBZ^kY1|jD)YiIb|NVg0CyNT zi*08Br(A2bgBF|^036u^j^gRK z$Riw|n;vQG44EKIZ)Y7>h6qn1*wj7Fr0MbWrQim;_etm+Qy0i0Lg|M?<`w{#!tiuO zGXtln>iO@YE_{K*MyF5(y(*~PibG@G5mlBrH1eeBFMt%F*kY)GEM{|c6Vy|foz?7l zwGfgf3~lhpF;}FsYt^c2mCX(68e&G`C1b{me-lng%UpxhbhvI4bC>AsHqLJZU#_|h z6>;C!3gWr1$ZY~>Kj;cNWeL{%3EkrR)rsGJBPp$ee@?5F@&Pc%?F5xeq8;cVcXdXR z`&Ol?xbWsmGoZY$aQ`+Tl7P!9O#lc8DD{7~l<{v9`k#PL>%WUa{2ZI4gOfsFhS3lv zuq-=6VdRv)Q*ZiLyXUdeYflQ}+hAjh0OH<5Zf(|P&+!Sx9Ap5=4r&-J~mrvNbk)mDKZ za{$6x=l_J&4;huj z=Ybj_^6#fVa_4W4NVf^E;Zb@?uW3+v$*;-7f5tu0h5w9y;tOxhx`KWp3IB#ZkehwQ z{%08UyXyeT6K?twPx_lU(Vs=wkAUx}J9sFU37>aW9woYByRqU7NS!1O62?g4sz3<|!BpYOQ8SE03_oQIc4 zxYZ>W|H_8rKtX~@Mjl%IPbHLs#2x_hKyTP$L=5WJcJ&SWI%-@qy?muq zsY?8nKgS@OVg4HVL4aWj?TFm|qLezba=~IK{ zwB~<->a=2hpny~U!!(f&&ReJnHk{GGH(xlixQG0UVc6=Rl4Ck0-0$mhilU9*d`kTZ zwhEzNGcj(pl)+?Q6kYW?C)}jzRv^r1Joa+!60YEuhUKx~OO)YpOfyrOfxBik#2?ud zl&{BRt`w{+oZviq1(f+%uUd568R!w%39b7DDPAZ&%xT;wYLBj3qB90x?XD$ z9X(=?mD*mZ%4Q>YO*%jQYoLF#FHP1-OFKQ_)8Mw)eeZ*~U^L#8o1|Yg`$ks$RICeo z%pavpQv(V}D7SdmPnFV0>25-)vXC)@)+KaeqoeW`Mz~Li=f&E6+5Y-rU>_s2TGy zQ+fa@&?EX{j;$+Z9*g1y_EdF`Eric=erM;7r2<}2(RlKy#h))|vO=Qhz|o=Tj7-$E zrLJkH(bvPV%LUxeT^Q_>sg09M*brw1`5FX5KpV6|wEABdB$BNm@{n2tv%`Arz^r($ z2Zzi(O3X={;LXw3Q#m9Ll@$CKw1`%XcO$Vhk825SvMl;dR-Mr#TqH|j`|a7C%ts@D zW(@#)@q-8NTqb&V+aUGFe+=$JF{@(LPe{f+X2H6^{xJ2G-=Z+q1P3Y_RGXG6O z>{k&-mT+HEJEHpBA<$!I#?&F8P0r9^W21vK>oLxD%T?ZXgm-}|Q%gP@^sPiy$}TVc zIDHe#Y)N@_AyKaIq8qZj2z6Cupy6W0g-V5Ng%+lS4N)1|Fh86pLGW*W*oy+gEj)DY z?o-wYYl|-Ka1hxnIbs3hP1!=A?EaRl{}a{>2o}i|FB@)QWjQovV927w9b+1o08k*c zz--G3AylZt|AzlLZQ6Xi6${q>*6ECeTqMUVjxKPm18* z{>uJjZ-;*~Asj3yY{bIsAqErv4%4W!3La5a{OapKvNhg_=)vy(^4{F^yP;OyxJZ2vv$h!F7#^^8Q`5&jEDnC+xFgs0Sizn%L&~rp`$Xr-@B{)}*l-GJ z1=X+$08~TX7MT#L<3W|RpC^qL>4-j zso~NCCxTF+)g>4-SKc9Aibk?O+H41f`AiZW;l0=Ij>-wP5v<=R!+-;uomaIWo1M0i z6?}itB5#RzzM424wil|cOX{Ciw4~~^i!k5 zI$;QEJ{#&cz7mTw7Ta5I4rU8YJkP6aoWG_AWjwK3*0VO_K2PDr5P#0zD=ol!Nv;topP@y2_)JtGIp53_Wdf~nG81Q(pcZ&#?=Y)w0eL|ON>xQxe9jtBfdk8 z`)zjQ=zuRR0GRP(DxAbUqE#!};QR5QO>_2MHM_ciDMI7&6*p;t6Kt8+qJnNDO?uhY z$mbKj%&jERSj<8JO02Xc)n`YJX<1~a-g=1aCdsxLB_Om!6 zd@q@KYQ~f-F3`+?uv}_W;cHZ(1-e{4sIWy`!mTaf>VZ}9W>moqx_q>t;JZ=6O<2M$ zF5pUvuw2c)Yy zU`zTHc`FG*oOi$Q(&P+@c!8lFD~EZK>*4A|jAtisAXqv3C}eutBJ;7_5VbZGq{Lq4 z@%3!}zBR%|tWJuJ5NSWNxS=drG*t5Q`=--38E#yEZlB8lOOh7t2hJPXG+X!p_Qvp4 z0g7Q4MlS@%19CD@-O*1^I_-z4qkigoDAIF;U9#dSFKNy)JY?gGSBBCRIx`$EV{%{ro&X|=0j7}c!DCaGPHP;YKf}VE|pQm9Kz6|gdJsz2w;~8#IH;dpW7OI^9Y>~8db1OH^xhb0+ z^X%|{@e(sT9-QNV;e&+Votg_BI$K)ktcFbpVS2Q)p5iyU-EUb_87^!xeF*T>Ycb%rSvVU()>EQR(2QsHJuzxx| zfM7^({l_&Lv|sp(ktR{jp*ZyO54Qd}RwPFPxOxbWAt;9C+AhRY@BMn0D~kYkkzE~c zGzJ5JcI@^07md(ar==8uyWZFVt+tl}$q&fCLzd)Zs<@QTRX3oYQ9tK@5cMk=8W~x- z{MQ!we}yaAD!R@%rf7cKb?5Xh(s3oM3S;Wp@FJ1X;mhQ*i3&=L+I_T=q1OYN2E)}s zE>FiYwO!ZZ9w#3A(U?@#w&J65wQnTvkhL2*w;f^??O)6|XZg)%J!eK=2QF*o1_&_w|4gk1LZ<1AZ;X`9@8=TwYTrxJ{Q6(r+rg~lQCOH7j<;-g=U zB}aLUHHAg{dQI&P-5^q?!6`P~&U8Cp=j_!*aAYJlwpV#QtcD_;b z)jGY{J=;kNwCl3l!(#D>E>2zg)i6ah4Q|;R2YfLMHMZ$&= zi|PV@vOaQJ{kpyGP#{?Q?Z1fHmLe5Pm4ASkxinjJ;+D0rlXu}#>DDcaFKdwF(Ce;nM4yZPIfz$!ClInr=&_$PAOO;yG zJhhH)p^!j?TgO+Nc87wt-oNXS+k&nh6l~qK=>*;%d}FAs>+z5LBiwGX!!k#v{qn&E zFfqXPz)VH(iINBSgjM)M>g<%7f;(n$#2F--und}|On=Sv%)*4}=A+uW7kjM}-jXX` zAkn5=z2u7Kmu+J1xYpUcxL1?!FtD#w(z`24l)ALnDJF1@dKUo0WwOI0l<`Qra~K)a zL^|TlG9Q9K0tD@M$?Z{tb$x*;3Zp~5q2LVihzL);!ux_MF)879RQLqI=zcO?Ft%qb zFv%JGK$(cIV#4{r*W9oDyz@Z=`58A>Xh z+xsaTO(p*GWhl1x16f=t;a4FuT^P%bF#LR*APyz*q^M-l8$4^nz+T&guyJ?~(UTrg zUO&aq`Zr1A0Hj=64rM~y7!KyhaPv8q@!T&SF1*O53E3t6Mx3H&ADt+%t;DJDnzvxX zzNC#c^KmYVU5brCT~OZ-VZpw=S5fM#XVcexN`uwY!UeLd7y@sBr)%r8T z=lt2nE%_hVx{9Hbxv7h($^Xsq{p*MS&-klVY~>df(ERA>TxcLiKp=-OkzK(}3ewVS zhz1pbQv(1zl1PG-&YGEo8WvmefnF4eAq!TY2XX9KI`{x&*(tk3?+Z`g9A~dhf^WS( z&~*{ZlqS3?*D$b<#&8%a78+=qN)W=-T&W^M`!Hg`I%;u78dI3;cN=2;9?i;(cUtW# zi!?88%}vFtdKXF7zq;gBIEL>ldTbfXOfT4~^L(!QjppELtUb9xUweMB91o`?JDqoo zc7tzQteM4Gt@$+?zpgwJ<%xWARU5LhajCxTtt`PljPkL3)E7y5p73%MFI_y`#NS0c zcP=Ht8K+3-uAn;FK*(5QF>_VSOcSeZ}j5~Mq6v3C!kLtZf~*{mKk#B;=Axxkdg(F zBrs*$-CP9gZ2fLx=Cd@9ekvF1+)rOAp~FdkV)4@KvkHrx{8q9HtA@sFI(84DJ4l*i z*%r-%6N0?R7=bl-^@|_-MYi-eO7peI%>Y2^o^KKm_8$3RI&k%84<5F+{m%9AkU8JQ zEtuaW`W;cpP3j6tA_fjS6T_J}Hi~kD3DoPTXgVHEnh)$Xs7G0XK+?EP@>Sp%H~&de z#&utP9#d<%t?LT=tu#*5=V$Sgb*TFq7+RUFNa zJX})(gApb|#X7HysXk;w3Ec$A{2Mk{CuNX##lOLqE%FxWbK&mlGqv-=4ABdo=EKCeiBS5xRMu#jlZh0hqX33+WA{j8Op*~?M+ngY) zWp6Yu$8sVvF}bRHCPCu@hM>3NGTkw;6Pr!N2%&V(od0OTnmx;IMP_%9tdvaKo!(KQ z0w0kdZoZ0Dr^cGV(Q~OGLOf<%Q&Hs{n2$WU6fM=Tq@lZ9MY>8ittHPLiE6$bOxkwH z47iZ#W5nIecycd5;A-knYGi4H%*v-Rr#d~wGo7BcP*A=5S~`BcrQ{f!|GiUVe7n6M zZQ6y|D@H+PIxGtY+iv8c*2?&PjCDFi#*Vk?tSj|LtIA6`-3Z>PHoHgldmKk$Y??O7 z2h)Qd*!NQ5-wV%$4;Qg%TFEn|9sJAG2R$XWet|^_HQS6Te!{5YTfNw?Sz{4VL;#kr zR;D%+j7hHX?AQc5X;H6X6P*5KLG~tS*VR#2Gg5@JC@R>dWhiY?rYfXWV{=ymBNbR; zj(S3>Vh9~kj#X^%bL-p1eHG13#Z(JE>iRN9q7eABGu^lwq_KkKv6~0 z^}Uepy(EjI2?nh_okzEn-~zUg$X8je!DBsLZTj*@1#-Y(yY~995x=$!=EAM?`nrpw z7m@zdPpPAY;r6K|B`^L_#yaI(W{DtHYmV>wjj-%3-ycUt42~7fI*Khi+RFzUi=lOz z&k-LJ2}2Tj;BBPRGcxltbyzZISzZDprq{N;$11)0d0HA%k@GaQGDn3Lg>aV9YideP zU!0P&#^ScVqsrSjpUi7lZthG%aj4%w>6Q>*zg2gYoGw!r$5d!`h2eTt>#d~xPEAX^ z-d#JSvCib7J=T%s(di8CL-u9)ntzE*@TQm;aAE&?BK%USR@^SberkjBt)LY9$r9>o zcrR3BZ?OFd+n-wGu#W)nTI4_LZut52ne1>!ATM))epxR0W9X$08GhK!AJ~}ew$LCh z!>GN&Mo$QMk=LpC8e@9A5sbr>KM;8`bqSdwNdy(ZZmQs)yW!KrJ|aN!-CnK$6u{6p zq{wRym~ZG&_Joo7ljL`sL4hy}SY$hfFBrJ_Dp>{BtizcW@PxaNaebql;zN?S{;-;b zPeaiM8Mu;bsH<-Si5N}J%o`y%4+?`hv>l+jbrenFCT?Y9XK=ECNgqeY+z$Yy9SVp) z3^CnTLw5^AAjS~x{)l@h;q5kyqIiU{c4O#YN(A_e8I*JBN>SgxJ7mc+I~o~30i#JQ zMJu8ZJVVxW+FK)jjlt5t`!l zs#o|?>k*(;9lgS}gF@;RDyBe$Qyp#BSBTq(&g~LQFSJ;hb5%g&Q`fEEvH4modd%7? z$Gr-(WJ7{`HwMLFg`0QMyfv2NWfK2;3?FqJmH5@r-h^Lf!<11}x&ZmuR$NY;BK95n zZ>DBHJImMl)E);AARwauf%b6!*Gf%i20?RELn9m0|5>s5FTyTP`e}!vh&<9eNZ;wI zsbxW^#&#N)Rx_7N?O zXk>UaDS*Yf=Q%rl9pUG9pLaL|yfX|VjXDFvc_B3EiB7w{5IDPvofPKDi33?Q88qyu z&<3hEgb?WGn|cQwP1{?y*wwR!Lmt-?Htq#f;nB-%nAvs2LZ$qHylyp|rTbGu%_ zmN~Iq;i;L;`vngTxc1Fm-RAv8VOSY**W%GEj;VN^o*>3f#l*RA3r*c$2HdcB-C(OH zQT;u2xmAOIP2XxrVn-5~6papSafGe}NV*=hb*($JXwj)(l^}>qHjJ&eMS8QZIOOim zf2WT!+#d*PIG->xhGFak{toM21yJF1`qVhy%is*uQlbw!`MHZUsPmz)^{Q~@8r4+> zzSJpH^SCG*V0sh5;T3hEC=E1)UresX( zuF@tc3HC-w(1tMlB#t>y(}+>0q!HAbCd}WXK6Z>J?Zx|egNm#P#1bMj9K;+ch=^YH zCna(HXazsZL2{YGc*3xV%qv7S(i?7pFIMRwJM`507c*uP=BZsN7%d7m_z=>N=c736 z4sW|40|4wg6NE2-NIdAd7uku(P+zvptk|%jpAl8`E%I~6^w7ggn@dO*AZIk-CAC17 zHrnPJAJ8u&BL}I)m#wVx0rhY2{<(Lm2Yd#}Up|9m*?$CHCsRXFGc!|T7hxNFSChX$ zT%D*bk1F^%5h*O)x>ciqd{#^xfGMT8@>(4>Csf}N(P}WT*@SnR(QNJ3iqo6OG#@JE z!^r=dA7x%LsYQt;W0T0`Jd<^s$?}o@_I$SK4zhZsA`X@6I^-xi%2;F7MxK2}1?-c} z4$u>RFoRVX0do23RfUDIP#SWz=nWJ!eX0t9I9mD(Bf0KddO|TASQ_ zubuAg+q`!vkDm4e*q(-Vs#C#r$Ia-}EsuDjcHKUQ&#utEIID;qZ2L9aQ<{|Aa^!eo z(^W@4^fG3^x?l6U6W@GdYrjL-O^yRY-C0Z-d)UDT(eN#Lx!eG}FL}G)Q1nrylV{zw zE4D4OOeK$d_z?%%pqk=Dg7*v0Lu?%Aytbxd?^sq9Vd`u5d7cpQuYir{2P2(-q* z?5T>2yVWI{jym{QWrU@M%YD8o2)uo5Q+{KNHx%_7a3abcP*oSFg?N=@tF93C*d9@^ z;MN`kbuYQ}*}JELpN)zfh19?C+&7GD6Ah#6MmJm!j2`z^O%VrOdNva4)VyW+(9BRRycP*m`r{D)JmsXyS+Svv+-eFYnyHbso zxt1E{_!ujW>xpZOlKOsNkLkn7@I&ArCAR(meE|<2I9IQmWyS5oitdO&G>kiqnWNpD zCiYfQMBxnCA2Q(d*BR>w#G3vgLzKQfAOKxY5a!PKL{&h(^ioEQvjvPBb3oZAGG{t4 zflnX8B;}rKiBoA(fqog)ZL&e4!=0BiBrZZ1-jEXEnfNnA!|epkqkq+yaYeaB2}8d)geDmmwhs?8|$)4<)?Pyhj=8c$8}IFS({~5 zh2)WQ?t;XK2fBzhOS1!jdlR55B|QVj7@N5O&l-k=>}pdF9rxwVBC-B_!}GAJP8a{% zgys5FGEUW}+2z21fJpo^v$M5#Qg$)4``h9^-G=?58ro>@s^i|0qqJ1V4GDsaG59Fs zLPLt;fRLmx5v@W|fy`Ns9ZDjO4)nU6qW;`FB>pq>2s}eq(;};^_x8^q3 z;&{8+?nj?*M?hz}m)X~E?_hO52vjZF3ifzt%f<{9`&H4IdoVMt2eeRDT|ca0DyCnP^0#U28H?Q8x@C1%Ot4DNE*4+^Xx@c6PI@zzInVl7 zIOjf4=~6oF-Nj70(|%7CZ0@?B?sqO&bVlE>aojA4qPygG&&{BRd_;tjKbuBST#EX| z=M;Dak-~jzvV=`8ab4TjfbVgXH7`te6@iNF9O4#J6QXI_{Uwop05CfCC#|4^f6cA) zu!2mF&o>V|HTMdy#_%gDoSl`%2pxiJl|sQ@fsu2me);7~NeGmkb=nB*Zd1iB;)RvP zUQP(ZHM;QIZK!|#!+2auvoY5j79*ET$H|kKeil_fS`}Z(>Y_#yqDL5Z5w=xmqm!V0 zOk0&}PMU777Qcsx=!JqNF}f_$eM{b|IG^Zxg`qxi>xqa5&y}MW!i6&ve=qB#Ewxq5 zJ8sx4XPO04^{9nQ^Z&F9?})+ay?8#d1F0R&f$^`2WBDxA!P}}@VU5HZVzoMmz)RTWQlp2 z8*fI$@o-!>44ou*OZ-qa%Vlf|T87RgJPlB+!H+r4BE~Jq$5t>ibjkv2MJDLWtmw-w zNJmj-jQqU|kzehpyjM6)#S8 zHHLGOdpcX*)zK1K-|F}{qX4pF4fli)-S1gZBWDQE84%SeR3$YE>ffuO7u7{y;aZS7 zC{BFmWs--clD@O0xEg0?59&JoWqBbO>=^#r{{SJi$2Ej&Nual~Tz<&XjP(S?n_jc8-Y?Zd$*_ zkVMyR&Zj)KGdT+1u5TwfKpq`7g)p2kT+ry!+DvvD z08-3t#M7$as{kE}G2R_re1RdhVAGD75be=vFSWS~*&=5_Kk!zL<&J$C5Dl{m>F6Tle&Mpm)3G%E7R9~|K zCI_+#TEz2$UaFoJB&K;&fRIz9KzkFVtlcg$!N(A1ICgAIlW^Mb=Q@B-UYT$Qv zzEo@!aZ$h-Md~yoMK|5{<(OY6k<~gv$WqL#b}jzxn?jkOZX?RHRhjDjg<=5P*f;78 zY`|8E2c@d`p~mh8J%J;tWE%O5!F&+prU+~$!18|lJ}9&=yqyq{k1HX5iRD&z4*bX-LNjV}|}?SaQ2A5?b&fAV*T`MGvqd6~4kY0c{V6 z9S`_gcfy1s(_zrbD= z5r-BKPFNZXI|z}pJKb0NVl7&Q3Ky$dmO#H7zsQqdmlqNr7886)!{F$P9!pN0 zq8azKH?h96ag4hfwBLvQfy}VHROs2ri8X0nnhDU>0L1ks#tM@-@lj+=1V=~BdB3fC zB)LF?S~e%I`Z$s}mN=XI zp#RNw|2;nq4i|%(o!wz`1P^E$Uen#@bK>0yG`2t<9I5KdTQx7wxa! zRukT)KlW50P}jdpTU-@%v&7s(#+oqCQ4f?fdP^-3;7c)_G|i;IJUDFkTF?$-7hbE6 z5H1J3$4EdBU3RV8BGiq1m}9>%3B0&HH*uX2k1{A&*!x2H?oo!q`)FA^0Q zSlar;lF&cmH~aq|g8MIDo5|^Tnn8}hy4y(yd0M1E!Y>!@M5$OL@r4Twn@A4V+p*Q@ zs|k;6%yJxI=8JSaFvb0FQEAABo9m4WhT zia%J3s)INk5BJ4s+o*!gqyjl!i1~^E?YTekBdyhVNA)?*mij^&&v5ynXV}dHTmY0#}R(;GbXIiM9YJS92Gv58O`-? zhZMjeY8kvo+4BMBd4WVjUEMWMB;QT~@&U~Fa6X$fj~}7r4~8sFALdX1d3vc!NT7b* zgtUJ5j{~ebRD7A?E4o2+EAOk#?hLl+2}P_B-OBHXj9>BKIV{=UWxhy;m=`H^?X12} zxGTvVyLt{_!>wfc4feBlD}kR*29|>^dW9DtI^BT}A8u3B#kx!wBAnJ&o>O-_p_+0p zA5yB+bm)R(shkX_T*gKnl$|*?;C&a<*m-Y5Qe{>@6T(8 zHRrG>fY|C%Rc@dQ*}Ci|KB|lN2-6@ROfx{H8hAn=HE-%nN z$m~`}$`DQ8Dr4cD1qUc+Oq_Bxd^TM?6C##P(< zfjv{oQ=uK$iL7U-9Mu!b|4N68q!de{mC{H6JVVxhZN!n7L{+H3gg=>;kd1#ww2k;Y z$DJ7s!78+n&MAhXlMY?*9TNR0V4`d&Pj|idw3C>pLM+cl_tomWI5Kz!?d7Bme&Nf) z&p6$rU)*@@2~j%zs#PK+wKFVvpR@bCf#{ZX)cwofuvCl#trfTK_5bF#Bs8?g%TIno z`-I?sQVw_j-;}h7lf8q3sfnbEsqJ4dtXBS4NRi1I!&G7m*5s4o2jZ#(EA5jN;AL5k zMrDO0T2B2*bIEr5Yw_Lm6TJb_)SyCH&x&E16m3GHO%iJh=QGFM94zt=j|90rU>@Ni z2=I>;ZT5vh(Cif+WrGcfu@xHSM#=p?bR^|1SbFW*`By^g(jLr*f`q=mAen!gGoufS zMvD{QyP0WL&YLo}>`rzjeT*Q>3!Kb`H!dd}}QOLdMG2jANY`! zI!;kT#M}0WaL6Tzz#e;GmSr={^l=qi^(-YGwmGG|fsgQsFp>4)k6@jJ^Z@e&K&yi{ zd6T$Mhi|t0Y}}6hX9*pP+Esz?QibrQfN|R{mD% z+S=dBbPQ}4g2F3;zUl*Lx;~SGy1}mY1!}CM`1Qx;Y%>GrXiXAJo@f(uwY5mRv&W11!%NHliag&aWdx zc{Z6ihEDXsFe8;x#}E%0y@_{yp}l&KDg~?MWAxcbqnFZbbWeij_M^;ko7c2D>}gpu*|z8bGjTaDa;+T48E0 zFXP8gWZ?q|Gc=@woYyzF-U?DhnyvED5#nxTm9bgmv~#j( zMU>Y(lhP=1>AH$~u%nDe5+iv$Ar!X2f_XP_vkDpW!~_)>9t2B%?L3EI@tWWhD z8ud;o^N!H`NdzgkkG00@$vQ3H8>Ls$Gpfc)jB8i{diOHS=Uj1cyW29h#Lbo8c4cu& z(FPyBXF0*1Ej>KgTrU5vYh)mBYDS6gaO}V*cim*x24%IpXW<-y_8Hg2x6yHf@Yq(s zEtDtB?`iVdD0jat)}-yE-0t5yIY^)sY5t3h4?e}_KO*D*HX9KqLvwq(zpdtf@;jfJ z^DK>=iVSo@eNsFdtuAN>ElFDWQ*#Php$Bxh`On`=aciM(U#6T6(l4<`wWOl{wBa zbvKxe^GgfEC=t?Z+nE$ai!Qb&3wAhf*sPqW$zwy+A`X*VdtcQ>GRcL%3)GuNWemfC$m`?UMU9$CvgA-ioyX(JxD|b`u zaiG?mMygfH3nYPOEUVup%Pl6&YwsIy!{c2`RVZdm#^m7Na&Z{u8SR1MXLtnRg>(qn z=0fLeAsOw4&jke|pwczTo`2rT+y1TrE&RAZ4bGM7p9+8Md@(z8#U~sXLO}aG!_KZm z8-iE)0d303k0A%Nq!U&l4ZJ08-l4Vm)9jbz0M9?+0Rti({Al)jd zi3!Oq(BA!ueU2&$sgu7cF$X6#q*YiJ-=H8$r$|*8ri?^dn!Ctv_< zm|zZr(s#;q5;i|WB7=%6(WFgGRw*Ccs&a!((t_m+b!)TzNT*RXvyMQoL%SHBAR^#q zj?f>zbQ)-xICDRA5?yq0X#cm1cSY0FZuxZY%%3Y*#QrfE+Zz52sbV#2byRh#8eXn36b3F;F>u)rCCYgy#L5={@3+UJ`(NmGy9 zv}!BdS8n#@hz7eTzQ&HQ(wKAn77f5yz7jylt(*&;u$G)oS;QK`;9M zz)4UqCJF2cNw=vtOIOvr32G&yM%P4~in#k7a#y`Vx>ljx!$nYQMxn+^dI*dt&M&3J zJM$}4Yv?jntXOa=I!+OF74=Z6HZ~^KNbCvGhUPy@hncWWIm&F!j`+14bW6!RWhL?3 z!z#_o{Q~F3hK3SCt$K$R<^+f?CpuVuE;4^_)3~&@7UxfuEjtOTV?U`9BkfOV&&a5V zxv=O!euw5N$Zxh@y{t3JQ8`dwI-RFjt91z8G2bnWqCvx0LkyOmZ>_9?OX}M&M!4vv z+u4C?p8|o+umXOd zwW5LWl!!@H);FbveMuhC_S;Zf}*5rGbH{(GF?yz8Y*Qyz9n0@II zpM*Mn+WrBpe+|&%xlTD#qua%@pybc=DA^tPuoXjib`PPPkUd$W1L3oY7*GcsjJ3GRNSZ@u zqmQWNKD+bb_*YE`C`E>@SS4Q_Snz6ljtRvN6%}s{;S1T*NRpoWWhDU>X ze;bbE7NzJS)(;IiQ+_Xfv)qPC$AoX%;`#jCtjmF4V;z&lp+A0@Tma!MdL35$_rEUY zH)np!3`Nt{Crr8?*lbx+aV`9yo@g+$RZUmra~j#4|P%DXCZLos!g z-z!uRF1#thkY&H;&@|y}C9)_Tt{?B|!^@QRbPd^&YdssD3WFV;z%>`k4`56c^bwFt z#2R6%xnL@szv}%#zcK0Ii#9l;v`cU`g5E7_az z$(bbEwr`~TC7sW}3tncF%nZ|CH>RH&Lirgn>g(o6Jn!Yf(@gf=C9(S=e3YzGuHRwR zoU@`1yf2}cI!mz;ba&^qV_8**yaO4(BfF0Bx=!tUd$j-64Rj{fOS`KMvr8K?zOl&6 zH51NY?TCPMmss)+qraF?-n-6T>)rm0o^gHn?%O#<`79b+`gY;8L*yGHwjO-*c&Ov* zzwdOeDJUPq|Ma!|pS9J0BvZulmB%z#eX0Kx`r z6cc0-wg;q)C5E@~jX_>k!fAEi7(* zt^jem{Y>)If?ODUHq_a{p(M>w3`WKg?t;YoVYf0O|A-J2w1an)_`^+`coY`ZiIvP0 z;+UTq$2h(tjkSJ&AuLX7U9v1~WK+?a~ zQiH>5XmyyAB6VFzN42@!$*c|7 zPJX^$?ouIzoW4_VT5jdgOx3WgJzkz9Ym>d!?DS3zH&NrcNp3nG^?%S@gyk0_8BSQQ zXQeNZ=#bj+=c9u&H0#O=^3_nbh1i7zPg>LkoE&5DN-0p^|P9h0+k&I8sQEh z(nkXVL`6t>6|RsKVPnyF#bgE&0!*vIA~vu>7(lY~-!2pL5%Stc$7AzPp4L)XwM)U7 z%Y5%C%CNf{=P3XPrB6>Qdo+`gXg{e(>=AP;sND(!A~Yzo7ges#onx%YpHIt4LYJL8 z?B}iA*rYC@S|glTKQD{w9}{`aFuKiKS+YpdBUs;k?Tcl28auJ$%ESd8id*S1Sd~GS zybml@Pq#@<3TRI;`aa^PWbNbLkDvEwo#7+ zNfg)TSK?ghGQzBBHS)35K|`$tX@(8-L;+OF`vPlNAoTzz^>*dp%$M)6f=(U;J8#}v{H)Zd58pB@<-cjoCM=KsN z|JEl*`O|^dpQ?BD(-MXMi9QjxFm(R6BGUh+>!a}~T!HNWEqI?R5{YSvI3WXmz^RN| zA&QD6Esp4ARe!cN$SHiFV$y>W1##XMA~(u8kR*enw=`v7_ufu*lKe~WLbq8P!KTU_ zuQ4hP|AMP2JE)MVDc|>k%tQwoFyfDEnDK>#ws@0fNg$%+e7z-%^E-rKMi^yA7mdT~ z#Vl`RneDKR75vT*2QgSdV_eU{j}vx)P9UP9=`7A4%bO#SJR9l7ozk<5S-8hgS8dbk5 z?i3?hl;sieIY^sPvC#pwl@>UHmrz!Ldd=yQ6D=0MQy)xMrCm4QGS|;Oxc{*MDttNh zR+BZxNehw;8#_|)5tA>8=_=2qW{oI%NQFL_(%ngTf`k~H>$+Jg-L%pJDZK92x%p5h`TYcCsnEat_kyM3ig37I-?7bis8K4RhTck3Hf3i4j(dD!c>XLc7;~sVYApDIe!w2ay z@=wLP_Q~u2Nb!oh8akO+{y&OW*Z#9Jp3k_pd&Vn~Gi?nb6hjLpCedtAJ)aGs|2fYt zJ7{kyX-*1nGg5P}s_>pWSzlrK`<%ERDAKQBOySCkQ|;n+a+Uj;^OwM(_=pTj9_LG- z_e{F?WzEgwx866<9qOL{!`V4DW}-w}y1Qd{Y}>YN+qUhbW81dg*tTukw$aJt&Ydsk z%(wF&s&?&Kd#`8B|L!NnK=K0UW2qyv2HmF7B@gT;2ODoh6NDh^SA`F!2g_HKw-7E( zD<3F(_5SWMUrlZwu%p&qVT@{1c4?VES_CNDM*$Wq8Y_xd*IO>V>&+|PR9u<{ax0hs zB>ir^b(51zI;&1i?yWM}h(RJj%aR+lftQ@f&$Ww2BY#b+a9cFptvICjWgZ1OxmD(A1+|~&1MgiHetH1Be3%dZ35$`BGyHu)*Clmy2g6$ zpc78}5Pf>0IGQa*W}T_pNh0zum)+N$thz{{?1_TUu7v3_X_zw8B~766y+ch&u^K9($qZ#90+9k2E?dP6!fDZJEngsVVx^ zw$-Zd(_Qt)pjTilXox$#F(i(OQ|`pl{q6|h55enK%-E3~HxV8=-AhfO@?kkh>;y!A zVsfz54${q5%WSz!rk|d)L{vL%2+9w$bg9VC+2d}@v40zzNI_AYwT6&?3StbufwwkU zp1FnEq9=b{htgAZG79x_5$a-8@k#3Jn2p+7*Kz_%nBqB!tvI=;VWE zRQ@qg(XzT)KtsRi!Wvf0aqYa}N)()*XcVcfeMp0vGkAsk!LfPMsSfZ2w@z%UJKBZ+CJmEg!=C9V~L_- z5rAh9lc@(W>{7-45RMygKH5;b~hgDr|(8_G6? zNZCv}=R`fzUub)WZ1KM@^$#IA?@f1|?+dQ42?*Yv3Ni_J^3f1)DFz75WnYvn!OUxw zl40mEwWRdNl1T04N?|{Yb@C%)AZ#_3NN+$*GQw>s(` zyH34kIZk(udw#j!Q~Zh9$%yo-bLQSXR5ovdlJ}TsHP13}w{s_=DPSHozL-Mjl$P->_qhe!P-=U*S$1 zndGKC1oHG3C8Kr3$zfzURk$SW;T*s3mBo^#_J~2Vv#+MB-(x%JHaLmmtO@p++F&L|s z09%3jMpFl|p@=^fC_bwWSJV2IwiL z9ioaTl|;RXQAA?D#pT>yTxkY;a`HTv6$R0l3x#2jGXA@w?pSIxhAvY4o_652&|NPm zzomGhoKt28sbcS{$m|@vT7UX9F%6AqOXIF+`Y>;crjdLuu)Jj{24AmPwK*0_=fsu< zaV+Wsgfs#CghhmfN#wgQ_#}cvjOGUcok;{cGqvdh<#IDKDr`y#Cpa7x(gmT}x%#k9 z&jcWC&33Dz{v{)ogj*8(-u4K`-e$T{`o#;}d8zeJAOs7i`sta525AQ|R#&t$d+wZF z%63R$ODg87!`CsJsJ#J|QeG+c)Wta@-OY`HBej?(NA2}`i=k+uUP+EajWBM{pogbf zo3SDv=4t2pO)#|$Ai^g(f>H2oJ+y>E1vMi7q@*!;+6z6auqtEoq&ICxG0FS2)D~Z%1oOyzH z$2h*#)=?niwTyAFu~9<-6nE5`3tP7qIVO?DOAbLZJJq?U2`~`cK2Q+b{da~cikF{T zakqjXynQjqTz|k;$7GSr*akd!m2YT#ig%7*K=kb)>nwN@as#T3nFM=1#VB5gEp2*L zK)U;?kv~AYm1_`{kg9aKBq~0xWMDQ|m)kw@*c$>2igsLIxa)7=8kz{1+2k||I8E_Z z+bNk3Cdj@WYsBFc3osyHc5=NXx9CS>IYbMS9uK{h>8d$?LB+o zQ<&cAq|xe_0OWf|M|ag#^*QQIXT@vk$ygM@$r32`rTQ zqXvVu)0aOv*)L#m^K3_d&UJ^>sR%eWWEKPZ@IRj(^h)jm@>-=bYtpk@u=T!F_zf1L z)}oj=pm_l&m@%$Wg5lG-XOLbCI$8eRj*vgo%Z?Zq4Me)6+RI~eo8pZ8h{1O_m<-7c z%=$>u&FkRp2{~Ga*m$J6;Z8UPOuVE{Hbv?Xyi=y|&|((i{b!K+u5(QwzuO5>Vdm|H zK7C|Oz8(oBsdivB+Dj7(!P{u^1(`gXr6D?9wJ^LY*Hsh;E2un7%@%8=43G^r_W_s2 zW}Xneaxavhx~!`!W7ZWh@7u7~&%zdpilKDeJXIxOMtoEuGcw&~OYv#vW=;W;rtJmw zSxz>D+T07IPl8gMi&A-=x^(jbnZtz6j;ZE7zOqz$q(=rNgZjt&D>OfJ@etE~j=msa zv}w}*VFc~k7WExJwdHfMyUsQE%)XZ;z=dYp zBM$e8)}QNw`jjA_@+p6Y9Z>;9pcm@_*RcIr+nc|R2U*u zR2Cy!(D*oDKJs~g^G?G-+7~R|Ue~?F{`_d9MgCsax9}uaYZ_A(lvXY0U%3O(|h`8E*pxjAI{Lcw(e{jzrrh%^hpDF ze3n~mPif&8oeW=x#IE-cK2W~~w^tC3&mepZ$*Lmbw5_fJOz83b%K)r>FT?sG_ zrM27pdm&FV6AW@YNkx7%gLRw#imz}-_tST_D0fwUMhbp=h>#OjkjyRMiLRQ{Ta#l; zIMTn}#H=5=f;%MFcif$-;FIGFth8G0E7%cS$uaaExk6d{R~-86p=t%P!ff=3r}8(Dk-i zvJqDKD=Iy)Jep+WGvtt9MUA_>%=J$$-6L#!t%Eo17Ek=cM{LH>DFvNt;aBvUuM?}j z2xGEtFwz!(&rXKI;qi_7M10zm(b$B(jd!dD>tE8*<2riPazZ-JextD8u2c}TzbsE| z$4*^_d!?>g_w3zb#~;ib$JHt9$2r5OEn^{E7jSN?zG)ZT3PYbEt$&phFQtwoA3XF; zH$pP#qB1-+PTq1vc)b-LIx9;KegE0RjR&09U3?F-pT0fTqW?vo_@CVf5eI$ifAw)n z>oSP)NZKLEGU&mY@Uami!g^~I1zH`*^4}pG3dHb=0$v=}!wfT1v8UvPw4VWAyFeXC z`9m)zd!p#iX|RHXB6KeCj!zZ!&l=|!n@_{jvbsO1^rVGJO_ZGYRDY|&3kV1Ui-Wix z`p6R0JJ1_VdAD-O(TBK$KtZCQ6G$dohZzS8b1Sk$#V0woYVHU5C!vb;0+7m82BCk+ zbJ9@`wS6Uro1*tw%JdqYjHxxf0yL)5t}wGH;St8!+;zqrmgBE^&`{b{g7h!fG(@!y zT&0^03WLymO2X?{%;XiCE79O^m%1x%9%r=z|P z6PxLY2&E4Op?$VQyx3cy$N!Datj&Yu2>&XQd{DP+s?A@rrv~iw2_7MtL>Mxg=eX{oAXHfR9G+0h0M;UbAt-43H4QsA3IbxW?}S z<;NM9v85SFd0#>()|um4A#ij&*x(Gbht{UkY5!TC_|Q5IjV{6W$QhXvq}_ecJD5B} z4mfwntcHNhhPV_oZUte>g?9=;9hwMuHYq(pqQi&>qBg=j#s-guIF7^^zvs}DneBm< zeMW|jzEatT>?@LMBv}^pNuu*mllWbZH3a$aMWL67HpFn7rCA>YHQb=RRj7n&*!)O% zhCk~_QT!z;x=d6!OjI(*hD4XTfPg-GsTZBPt`z*Xg&K#OU1*KmO>A~lTl2GZY=rFm zDOuJq7!U)&)IwYOJq%)e#_etcx-nTOJiK482>ppn5UDF(A z|NT7Paz8yr)%j5)I26DZh|2V#^BbfE=}$CjfK^v+IxXleu@`%&a!ZAZukNI`@T{+L zzof;HW%%bg;8ojrHSSLb$W5+B7dw=4zzf_7}rNFWLSa zvY)ca&kpeIVO_JAalB7R-%D!`sN7xKUoV;;+P{@wJR84omF{CC)_BW~a+L3B z0k8bOzruZ?_Cj70JTaX4~Zh3t^Y=6h>l3Mha1D<^WuVofK zDuFqaoW7yvSBOYqV*GMkd&+{ka*)D`MAc?{a1wm}!U{xfBoY2*%7D{4wS+yqHM>z- zVjry8LMAffIw5Aszb(04wolwryTmQ zA|1Fl^oyg1!4eDg4L@k+LyM!K3e|H>hc`)-6Z-vy32zgTV;Z4h9ZVH!h(z<+BMS+L z3esEaUzL=@k*}HzR4iijOr_sz(4#f}LJ-pHLqn@ASoKK2MrnvMu8T`YrjFXxb6Tvp zh5A^A!=;Yds!VL~a%|X=ctn1ZnU1aP!xMUph^bjz$ap9YQv%tbZdBHO)~>IjRcrNYetxD+>)JOX9@T z<4V)4u&$aX)W%5kBtToo^TgH^ttS@HzFxJll*wn{uczGrJy@tzkX^g8XB#b7L z%p01HYDN5dMD+w@(&@G6uLo>`^2F6ItD5tGV#t{GeTBCw`nb>>373Rf@uA@(Ceta+ z`QoQn7*8MH%vy=5(4^*Kb$IZ}^-M5>H3P%QK!vJdF*%c}btuvNp};h`mBf9~HS;2p zzO1Ko>A?-M9A!4`cO?0yf zv2q7>@=I*TyY&?V--WQyv=Rnb>YOkgDXixOmT3mPXXbO^4P*BOBV?GR15gykWIDe` zs35c0zg7XDF&A^&5 zi~8uFc12DyKNXokVpJH%5kjiYER4@t1$$N|7p5KmgT191@* z^Y(Djr!Am_CFrWv9&XC+ZuAMu158qJ^<6^8ZpbgOye_6t4iX`rz5iv{D9jeN_!nISkydIP8!Kk=)K0`%)_MkI*+&dFKUDBZtmoW(v)k!=O!%Ekm`P5z0a+7<>L3Z_K zxdub;3@mkUqq2g|iVJ4PpF+r6Ma-D@_~QyH z{ZHzm@;_nwUB$$e8at`shP^uc11y@`D>ENky{FholD4j$v^gdvnxJFIcwZ_jj>j3t zrb0sjiX9#o&GvJ)gADm7lWxCf-~|Cy>yRR-RC&|HKnmg>056z= zo`Q2>WpiQP+FV;wQf__So1JXa+xA+;s+!8O^7{E^L@}XRjl6V%yERs~QjDrU!3u``BuV*yF+H`eBRw=ZJBt|RJRX=6J!EOOx}G5P*|33FSdD;qFwKbKTLF z#iqA#+Qq_Yapaq*vwvHYbD@eHKtno4 z;fB7b1pNd@dTEJ&E~>>g;J{=OedUB_(`4R&RYZ5yu|Ma^ya1>dWNBY}qK~>}A_c z0so4&20c=3kWH+EC9*J>M>B1G0H7gE&-94WN>$GXw$x4eZJD?K`v>mFSr!OCt|$oG z1U;^;owhr#E)+8rG;Ebj zkhT4{YQ-UB3}=avW;mENykH|1n_sZPS-F##muGij!1Zt`W}-1q3t-sv&TEGB(--v% zEM5LkLQEmovF(rHPP*%*4oYbbB!`6;#EsW0@BQ>Ej zo=BXNnp$6tuU?GX;0zCFQGaBMQ#CfKC5yZw)}vvM7YO@#SaU`m2s1$1U6mUnw_}^q z_yTt&$s#o(HKHuKN1S<0Ss8ol8}A~ifaCZTc~F9+)KElWx|o~RzERm|73cE?F@xN2 z#Wb349MHU%C%;NcT+t3b0NK)NqMqB99j*8pZ)oglA5BM}bs+O}c2BvQyzMfo6$WMt zJ7b)eQ+Uw&fw_i^-EOyEn~WfN zc0-wFi^DWA9prR?)wO52jkv{mzk%@K&M?#Wyf8AqwPLv*%_zFg0zz42Y;*@cWF)aL z`6+^)_2YwN^MP*Cmlx>O56io}{!OL*txZpU@ap{rv+BaeqHu)LO+aOh)W~q;U8`nV zagR4v#Eb=jCmfGQ3IcaDPAM))iQjrlYzX8`lv|aL6NIc^HBf@-OxH3aJ}&Pt;g(aX zJBG0%XT*LzykdQ8S}3EyW0wQdfWZptzScVukdrr-lP3BIN0*}Xn>UsHq4fm*X2m0g zBgEO|PtHh$J}v?1#4J;dLom>AuDNOW4Y=ab4#+YarS~x2W366rv*I!$%VYzNuPZE-f5rc zvZJT%0ZYK`=lU(d*$s%w1Z|y#H-sx9XY?-R#y!IAsijc3ZS4H`!6T%rPX=eV;Mw)w z_)GTXI?diR$fqw-w{)OKruZ{`aZXML?*!5Za6xTW*@w7SxW~e6i*Gs;j{|S;^qwP& zh4$3YA;bI*8uOPnD{^L5&hgayMfzFR(Rb%{Fnd!NT*Aavxmyt>KhM?v$wi5w$j8L> zPVs9Vk`M_(Zm!ga##Pa>JOVrD%-?=lu^z$ESjGUQE&VO5=xR3+&lEXSN=pc{eivqX zXQvRcM6l`WsgfuAH;Lj z<-OI}lu8pfl?N-GIE(adE?B2&akmes@VkIar$QcVT}!0V_zVhCt@h-qMgE$H)gDM; zQc6?-^cciKybEO+>wK9$%3FptkRa0@8Qiox4m4a@Iobs|hXG=>Jn9Ni8FTwg59|k?OspqvjLEtYeIQaeHiOD}3#0B|RLc9jHxWB&O{weev%K6Lw$#T?V@}`Vb_I_xGl$Z0qJBU&SF`~ObuZdiKRJAJ46j(5a1ga zXL=-u;!UhqEYS;bhlvkweL*#b`BY+_(5Y!a&47mMZUO&XHHj?|X-Srh=H66%E zZtQ=pL*Fv*g8K&S7Rz(&m`E;gt#j64!pJ{Q2Ai>R=1+nlex1I$R-DFi_ zj5|81VDo$GCr&E<$FkM*Rbc*$+Cr7g`Ov5){Xd<&uiuHJP{qCH+#QR#oiEvUsvC}( ztQ@yEDibDwh4T?ZjV4|0pDz7wxT;X^T6x;A0iy!Oo*OF z9XoKDZE!6tFa-!QT6B=S-Pfc)Uj=DUNNQm(PAf z5CrnS;={ZyT%B0~q~q=3RmttCTvg-h2Egn%gkVZzUeR~Dg&Vf=PYQxv!;Gc#6v-pR z7C>5XToE&sNj;2d7@fX(eUQQ|}8L z#ss0!Od3s4-VL+KVV`%D7?mN9IyD*))T}@O)jMY`Ud)*3D+$%vMB7Ablnq^Pkgv-l z)Z||xcGpL||EwA-^K!6K-}3O`_rlSCQnO?Yjje3|RWlN7zj0W-M#t{rZcQi@?t&}>TBsIE6P#o54 z_B@C$S?_l$!IQ!x0El@|HF`s17kK&`n;FH7NWX}2f=D3I@TE zysp7j0!1ps$NdpXpR|ynC!Fa5;w?;Y78(?PGtk-JShCMLln_tK!V9Q7yYKJ44e_ z`@MjnNKovj2N048TWt4!swnly2fsoo311eiR=j539-KKtjbMq|8eM zF_w2^MfO28KTaE}IU)~(iUb(0;d$_3J$Fh)%~)WV@D)9)vc}uCj7-jekT>}X{jO}$ zY%FFcFwrFb0t-G8oY2D&2svcFkdS3rF3byQ%EtSwiMK__XNpfJ5Wg)iYy*I%vzglb zvZopftj$CIHY8*(KK_dh61ECwd-}a>Jn`M<@&A|EgPi$42Mo|)Qo5C(^DE{Vn-4cg~zFgoEZ>>gQ=JBXa z^x0kSZftWi9t=;@ZvWUA#>Pa}s?*nB6hTjsY%xeLFK#u7J}0h7s*xe%Sun)5g~wsr z6g&j=KpVSJd+T~KSYDnr0}v)5-`;W}x31q;&13woFh$gb2WWGv&=!XXB6r32|4BN$ z8c68n3toG0oDF|=7IJ%-Zr>VTSy$CR=vpXPHs8cg^vwW&mch-Co0ZR*^t*#_FKLvl zSxpj8uD7fb5xJHv&MV2bOz3I@w}0lt5&wy43T(4e+(W%VvJiC!>cHiYBSYdBZ|Db8 z0nTOy(NHUX@-aLK5hKg}*Qjt}-ZXG74!RidoIJCm=^_ivQq8Gw+tUJ$IW>iwymiCp zZeQZ8KoF|W!HY{J`oCb1+sMDx=#m1xtLx_9U=ZI)$O&3FhM4h^9UCb2&p!s9_lPHi zs_dDE^D+wzkX(%e%7o5&;Ti(u`O(HEzo+z#r_PA1a<{6&K1>fxMtnn<1$PC5sYyWN z@PsY02_cT%#Uan`HR`KIa~FY?tTc5mSzpsnCgn5=wf3TR>@(i=)t-9KhnooY~Cn#RaqzN6AM30pSa^%azK&9x2d zBWQ*bHdnJ({B)NTmn>_wqt*`VI_V_zt(O{uevpvAD0q7O>9#9x zh;t(OE zb~{3tttTWvhbvOFgDnuA7S?bff}Tqwboizvl-A7-Sk?|uptVdY>@^!uazjk}%Pl>^ zI~Z;{{DmQ)wAjDagSf9}4P8P(URb=ewhG2V0m9OPYlw~%N!A5~*1OG4hIDmCB-( z;ctvR_#k}~u_$tB?@nxqI_0a-IT>>@oaBP_gTk@pqvBlWa`Is35-Q8)ilFu+BZ?WU zB(S6d7en!I)WTD=WNB?jP*paJ82EaYEYEKDN8$Uxybj4(4U+duC*R3YZqB8bEZV8R5B5IlTCStQB%$^B*aS;Q&)7pi$xU@E&<&pzv8mT01@Aj0TxY8Wvpb$NO zv%^}Qe3gIGWdkMSXgxBytfHwc>a0t#|3-4Lq!=Z~K{B!W=ZvvKH&*CaZ53Zca-ktN zSO>&ryR<_!&U1np+SGGM-|f~9Z-h+=DQs|}czbG`Xi=c{1P6j%LZfz`Fe{SSBcl$* zD2!KPl1PyLyHh?oq~f9dh+XKf(fn{Ir&Hm;T`6Br9tBtbb}>Wn1BECq0T)=Nb0?VF zR1(Fsnf-0OB8?iS;l#Af;7)WCQwy;H0E?LkhCD>)tys8f2-b~w5u?QFP}TzK(p$WQ zAy>W&fTLOv9naO&&0(KUP5fr!por8st)8KMM1Cq`wZ(l*LDf_YYKW;Q0!h7IV!-hs zKg=zA3m#tH16#-|NC$X~oRP}CZ=PBEGdEjMphV{f7Pch$J_&UP1WN?zSM{=Tx@>+eXG;s&AGs4;J&tPWTDhEk6I7*_-m?Q+99#vs4>AvM# z7zoZ;F`4)qX)novW@0a}ZRA^Si0xrGp%1yfm>WX~-d!u+!D*t7&>Tf{ELXR`xy52H zAU@=~zkrD^dXW)y`o^ItWt8;=ryJ;rFZ!xqZY&`n+lW6vt3zKZ1GnvkeQ9@n$G z=6o@k{#uV*~hkXMUM=G9jJRlp!#P^g5(5WZK zPVX4p%sS;=8J#0nvqDb2_Y+aKec0DZ3SSfz>h}+*!=-;01>Hp4ubDG(mKaA!;r5N-VOcIN#Taq56L%)tV^&Tw7u<#9xI@i?rj!t9Vo)a(qd`p*edAe#&PeUzqtA{krDq4|#zCJ=M1#|cx&?ukk>fx!*13|QD3v=Yy)mNC5eH#5 zYsxT_0|`+NJXAY$TNfh74eb{jxy|IXzt>KZyib~g3QsPqvyd-Rix%8&!VJ+?JD#K~ z2JPrDW)Rl(+--o9T3(?X#B4oIA{`Qcq@*ESHV{PrYBo|x7~;mPs5Rdr`|CZ1aiZQ_W)P$gWA3TNwBFCRVHmfzTV$?W%pB&1$C*s;}kQnq0Ai36TR#Z+>1 zpKeWXe|Uuh?XcxGef)9{!%dd-5-vc4Mi?7hnkjL6w=09|xx@;Bx!ere%tSviZjK0* zkwIuWIf=L5*frxJ;ogB{y70F*vG_p&BI?Hq`@tb4i&n_OH$0QE{Vmb<_$OATTU#|`v@2Jg2=#D; zCQ3AE@j#{tFki)sgxkX7@#mE68NGqo&N2%z{{E&zZU>gxlvr#WjCVw06qWNrA|@n5 z27o?6e}hW!*`C!2HaQN)pzl>QQA&q`+&Hrw`DxeyOZJi>GiDMRfQ&#-X|~8Z?__(J zkwtWj67HcHqyEdfT^-Z$&cWby>;BH(Q$ILB{YBt>=mbq#XS23@cV2k{z}zcRo zZzAZ*lDMAo1n7mwuXcPewG?x&AOlq}#|{bGkQ6Bl?T>HEi(#W1aQz^#ZwBB6u_>i- zNoBU2Jsg0Ka)5$9n2F!CB22aQqRu_OsF0_^ z^7DNsv+(ktW(?LKt)kHDC)Gg{(PJ3HLNrErmHak)h0H#pp)_I-?Deb7H3S0NRc0lx znKGu%dHL_Kl%zdZIlgKgO_sk-bhKqiI?~Pt!Q{BvqXkJz!Wx`{PqFhg!PQ8rrwZuK za5smf!|jl0Y)YB)3Ssw9H#kyeZHwTvXN8~ZKrV2S89yr+Y>LmiqF!!AdD_Fl&b|;; z<_!OJLx32&!45d zOu6k&4$~) z2Oi}DIabA=Ndq0oU_z#Zo!5Waeq`KhOoP8w7N~EP4^6&OvM6&m~Zd(-|H%3j+uuy7sR*swgEX4##q}68y|KEuK5U6(}dk3{lbY z$CXv-2JYq%X)V@;cdI!EA@KuVEk?_buyoH_AVe06q0vxeH_ihJBr^Ko6lk*yTv zbp11%V}@cmI_v@RC>B|K!Rq5Y^!$QBRr5&v5e8QW{hR~8qh*7D=S>y$x&TWb@oGuC zJzr?E3(58Sb_4W!J3J*(Y4mjC^dVrNI1XF_!TY~x947YZMNy!jf!c_a?K>POj>+Xw zc!mj**@kWc4b?p<-NtIeO`%u6IQfHv6cMSCg0}Km1m7MQ3xc-oDVX6;80%T5SRT`S zRTmR0#E9W4*UnJ{D!qpt%h%s50uz=-2P)_dqHqVzdbw`pXXR(o)z~>j`N(`OvHQV) zz8W4EU4vXY^PAF3skI7{TMkmoE1H`3la>_?7*g-2cE0m9LJivbtIUPSi7tCM9$8-S>PPpYaxB~RQ_+4>$Jn8vZ z)Vl_;*TyEX-epusZI_a$`n8=$hZ$wcF3n=j-5Nc#zp@}4TRJ~rFLDO*7+?@q0dA_J&xFZ{_ABSJH3tKq1(USzAJO4jaNvL*Mv zjk!3Rv!lLv=;HgQO?aLsVdU<@HDbv}xSgq`%cMS=WnoifY^4U}#uEaBQHV0B#s<7` zaA};!NUWNjyZI}LF3j6yRfzGFwRcaJ@F2`?sUl${aIjhP{B+(i4V>aIoeLrXq52g>Y<=SJNh>9Als8{T z5KX78HTGDyz8?*()bk%^Ug94nXoFinu4I0&u0bqs_Q7iFdV&x?f!3bz9>lol!Mf;0 zgQoh<@jfjy#u|B3yC}>ip4bNc4>*qLTPw{1CFssDmJl!!~%iDX8yqSg>WJ9 z@sw~lIHlpD%O>bEg-u&3QSi^Z-OlB>b3Em|;Q=h~sUMmop9zmaESEe#(n=6^fvna502dT^Hull zc=%5_MT%z5R+j(fk}Cec89^oWf(KA|xE7MoII)z#0fYh&!k%CO5r|jzri{z5jVnvL zV(iyJz+3)pFYZnZLv|L8G`_Oc#-z*?yXTZ^mt$H^ch}dCn_uU~8$J8>T)hV9l5QG( z4iM95;hYpo#ZxuPmQF-)iHH#|S`8Xw%pFAt)#V7Qs1xo)h+R46>y)I>L8@)U=vPci zWZO=h(UCEMh_S}`dD`%qp=w1QCRAv;#L(?undeey%PIDK89uCL<1gB>+a_r3c19~$ zSsb_bh3vnpAUnO0C6~#t877uhFgTuC=B=BPc4cxmS+*r*9UA3FV@tiLFNKnRxJJQO zZO7%YFNB@_)h3Wqb!{nWL=}@U5DnRY7rL@eYzzJKXE~mn5dZF`Bva!3jusxutF|PeNip zTb8k9rzkxl5zst0?S{}`K9W6DGeiK1e>?h8@SH*JVT=j?rjyg|*n-px>H$w@Yw{5T*1x zcs=@nhX`THmm7$o`yZhy-JXrdq-xkouPqPie{-5=G8>-$Ct8c+`^f&Mxt5}(v6ZpY zzqoltN|&8XZ|W-b4xo3SC}?w*46znj`hzZTf&1eUBmIOr<)Z)x3x+!k287Kp4i8!a)A~-0 z$z*heAP;G}$QFj*no$Aa;I3|iq(&Q+s;#<5c?;((sS52325wu9OJG%ic7n*vOYdDM zWjLMYKgz+MunGF7AB~J?ftSC{^x}HYUMvHX2l0OE_a4g=m2QEoSB7LOnqOQ?9)|LX zJ1y)DfcX;DuwQAc2D&Gp6UCDgR77lXzj8H@CulNVFqg;KD zM!l&t)p~)T;OMP);c*xv&5QT%dmO|45VFCkxn{%BJ^kCBR$RuPqvb13Zn*GN<| zKQ5bvVTzh1s&#lAPt%qcr@xeaQ3&FoIr2fY)vimjUs;jsA1XCxR1u_dxT6RgG(`Pv z@Uq5zf4&RV1B;k589IS`4`3Cn8bt)zYlUjhrS=Hl3u#V35Dj<53e)cPYjkt$mm5kgI5zbGJ>_8UpN1|(4n4T!<7J?ipEGHwsyw16K|1I}1Fhp#Ocp+PNEA_!pv&866v7`h9vUzjp}!TOVa* z{%?Dk;x{Pu`@4XeY}0O~NtO(FQI0?G+L#SiR=u@dc@gh5;h^Kb*Z|kmcXjB-~}& zwr$(C)n%Jq>f$NeUAAr8wq4a_+f(;>W+vwT-!~>EZp8WW`*#y9!4EJoVw*$S4= zB^4s!Kewu`D=LAgP0C@{GTlTNCz1!NwDWvn^VqcIDL7+<- z&lGPjbR#@g2Gc7bp$$QTrl8T=5*D8g}!Ko;t1RTmb z(iZ5hBYlg0_>S{PPhbI|uQtbnl1-XIznnNmb#42FcAKvK$3tjiYXM4BOY0KF5HE~{ZAWB?uX z^Popx9JhS;z5kJ+nu>#sp|gdey^G~Pn7HwOD-877^e&y01ar660%)C(P)Ui1 zp`iXtVbFxPUMthQnkjt^@p1t2e`pNa$Cd4&5WTsa|E@cCId8sv?%!ejaMoNh-1*iR zux-pC4cn5{Q6X~`9=gi@R1V|eF8WDrqus9ucx)pHR#~THs(}L>)RjQB_AzE}ZX6ZS zL028(YZt~-O4pNiIEi@hDjyhTdi~Y*&>6d6BE{z-o0@5)vU-;??(W&tEB}cy*M5RZ z=QZsV+!pdvSUqUC#`jbcBAHgb7H*deTptH~^t%j*-?R&2dA?(XbP z^|z9k#jZQRC2jn|g8#-QnmqAQyH?aq#FbBPAA;iNaCAfXB3(JYo7VfX)sk(wcYH_J zKI;at0S5K;i~)3pr)6gytV`~C58@Ek5`CU6IDpCMC#nXVOU`@`tQp$`R_ZVx2#n@} z!*&k{ZD~#lmf5tD9%D?SMSpUAvHe`tVLSsv@ZPQ zYLW@x8&%$FcZBnlU%@OU?`N7vUl&WUedx*!wA1s(L0dp6-wvf3tFD$LmTs^J3f+;v zS?QWX96eiMJ?}A%tY!)tq6{kf`*S}|5ES=bdt~k^yAxNuuV4o`RBlaX>^4J zcC0}#N#TngNe(>a*&VsxP&LkJ_H+_n$dTn5J*9cY5pv0TlO#@2KHO`|C@?FnVfFD)O{HFq4z+7665xPm@mso}oaArM zEoslmi(8s|m!JK!4$6bZ#B#p-;*IaV_&>UhsD5t?|9_J{|F@DH?|gwy)I zNsbnqW!x) z&#Ak8P-JY5Kp1j1`zU3}%Eyk~)*1*w#(OFYvfhAcxdq4N0X|mQjwl*foGb>6DSbCUsX>o?K?((askU9e|nk%ltsmMim#CQ9U(Qedtv7MrsNDF+@*6d7dv@P^S-g>q8*1jO?w%$e6@ zVs6H;Y5dXW=y8?rFsqZP=gGHPFF61HHg;CASH1at77l!OB>$0_x2om8f)#|E{u$O* zscNk)QOKe>&gmM=IMWUgJ*-ouzriU8YaVTQNKHGB7q<*4jey((oo zS-xQlMToeRUTNjtENozG%^kQ1p{4ea*$bgHrzM{bX#t1j(Y=wlyKGmLe?Yr+GN$@B z0n}dpb%QG|D4OgSA?ZHge7tc(i(q*^GXa#A7f<)#Vq-@EN70_3!EzX4*ao~MTFkjY zTQzlb+qad4#7lTpwOufP7Q@uG`%#MXwAVYxeK3^9wFkk$|zqggXA)%MQxXD;U1p{Y(fMFs4R%y60_F_?A; zD-T)QFq3}vU$9IVXdNnirFFlh=+#@a{S7witRz{ei?%zw0P*eJ`o*QSdCS35EV96$EIrSPbKajd3(b%%zeH8lrWi=C5r=AAnDoG<>CS8CKCJ9m z&cm|G{_!FBybrRUDSij1?GxnZ=BY3=)a{pHYi^q89&c0+VdA z;2VcydGbE`MZ=9G(-##tHRAM6bP{a<4gN8F+Rs-E0L_z_vG^t8>51g~kn&hP4Zn~o9rk?&DV z0xlxKfUJ~?Ip>J+Tb{vVj4+V9RiJ|HlE5%P})9>on`S|J)A^(ShCEK zSf#dxT+I8cTV0vsqc%Se3$huc4OHy{KJa#R?o6$D^D&E%_36+T)bE=K+%6TpSwGiPM2F(DyUQdJ;u zU>1EnwO|#|%Q7Wkl%0&hVkcvPTa{tR4OU&CF6O3-8&&=#j>%-G#gvo)uPXx*z$HnX ztl!i%)QOVS)H<~3MED-UWDa4nYIwt!+)G4>=@kTfrYvD`LrG?G5wOuMTv#58*&36U z>n1a&6XQfuObMfsZtmxJk{~r%*F92M+|p3-e5Enty|%Re;;F&Hj%;+0#+EF_j>)>a z+ad4lH&X0|Og+`rW=Lq1cEh{S`#a;#c=y9~TT$W65GpPX8M|w)p4(-{6Y8OXJs$|y zv0(>VD^sGjVOZpnzO5}RtzpNLtDkg`X^m$>GcpxNX2v(SH0T)Uo&oJ~Xodp4?v~_> znMMUg>92O~IkoXdG*oudkO-8sA4XVt(wmhQ< z{}_!GeA0|^Um=P#pZAO$L0A@bn?*2vxGyZC9NuLRQ(z0aIMZtoZ~x-SW%s|Al!YwR z$L+TO_Fowj|It%}hNX+K#lMei{DodSd*K!}7y?H)u^^2WU_rH08n)F4WdM zzRLZ<&9TO~3(yAv$6aJZ;ZPO~w`C1Vep2ZbOMX@=cVswW?=30#AsUdbXObd%yM z(Ni0R`l<`&V+LabM%pJ+Qa1^TEJ=N5hJrC^0sPyU!!XsCh7xlLW>b&H>H4iZ8xPX> zh1C?)a}2GN+((_E>+AO+EZH=EgaFZkQd|^~`g0I~81j^c>zN?m?2a>=IJYqaKAFgO zyaWZ?Q6?YfUt_yI!Oa2N4JJp7bW$ZXiUXycj?jI@>ye;fH57Jk@+OCv-IL#RLAmai zpIx})l&L^v#`w_#J9Huu`kMm#nisr?Y2~W0=}S`?COdc$hD(jp$riKvvjVmig)HJ{ z)vz4PqMz*l^4sO!sMV{OXK4TNVENOk-6cKoK`{?Rm0KsfhhJH>k9bpDzcOF8j4WI` z7<$~|AQAeHCJ}f)ScSaSW(FK9PgL6@Rw2}PR44`I?^HvY)|@z!Nnu_wX59iJFpHR> zGDlnB%EKIKi7%^;S?q^i&_x0I6boXDt~ie7zZp&D^6M`2hw=4~~om8w{ZT=DV^FL!taCn-GHx%MgDGd(GzhSkvFRX}QTlyWkC@fY= zS?pR@ptFIwDzEf^x;UT35(kUK)f7H-G_%-mMZW)6R383rRs?jiUTVvEUoRSt23ku| zkE?6NN{it>dEkR8yh+#8^@=@S7-O>1*gVSC*{B`qH5oVbs6St_fZ-P^O8ts-8}H?{Dm5?pOPOrqGh#w$?ZNqfs9ijZEhlhI7Md}lU+9Ojj z(7HY5DXW9^ScSHu!2w>?a?R=0d)!!dKbsELY$b`ZSlw z>hDezmm1+OOR!U>o&}?md&tUsQHGyvOZ@&m1tmdP+Tocx4Fff{= zaDcm#=*BDy+n-&#nAu9$z0dH@LAN1cWrbJf4S5;|(P&s!3;8p@g!I&!wfnV}xYhgL zPrH~i9w8q~2eqsq>Xe8`)ao3q>e*|x`jP1^(lJ~&3l09AsdhEN<^sMU#rfSt|3@N< z|Ay7SQ`L71Jui;Rhx2fP4)xKnL}~43$W#*bF|O%9OBcNyjjSEb%B= zM-=lx_5tE!@wUTQm~cB0b9!Gz%Tt?Rs9j@Tb-Bgob=fMxQR!U{cCEtXlQa6?VJisF@m7wWW{*pay4+ZO0;NFQwyY z4a+fK$QNfn_NPD7N55KTe0;fZ{a8{17RA1sZsT3NhT5bIcK1PDk8vWgfDYg7(W>v) zgtc7RM3OeTy?QIjA~z+V6Yqq1<7K*2-(h+UDLVZ(F`p;@2?GplEl~7#n1+V@Ep{Kx z+NS(GI(+qL(fuQq@QG}kP;uq(My{lC|H*_(*<@>RPyb0?-B0mod&a>%eB-c!>{rD} z9942u>yAA~>n9+4h{xk3_2Jq9z7rfy=G!^vtwZp?j!Qjw-sU^>OIT)VY}*HJBnAz9 zvxw3DaI}~!1AHJ)j={TS2#&#vj*>XNZ5>o+F)jU1K@=I2DajUIb*3z&F(cGjBo{-Q z(KbtHhrC_OimcZlzO0IUAb`Wk6kEezd0E=>tDn~HD%0BXr@_@+uB>m$Rx+BxZcwGs z{HnP&J4n9D4LY#a1a4?sAvvV&tedfdBof?t?~z183=J-Q%C74ciDklZ*(ZBUlC6&! zHk2mv$;Yt`5FtjF*WP;zcWMO2%N#AkA6}BdFUj*G%iQhlbK})l4)&dkHgOv>OMk&< z6Xn+ntCY6vP>}i`?%Q3XJNEl9ySiWG--DIvhnkJ`%MJ2`<|zDwIK8y{sp;pM&tVrB zfQ#sP2SF>B7=?Zl{+Yz{`;cD+jYoCuwnF5Nc1|RFrSuMp@kyqf+W%f|^9~61EB8Y* z?Xg+PfbZ-RMaboVd_sJ2mBe`fy5ldLg@8ze%_c@eWCPx?x@Yj=Nn|S)Um089t+0$t zBGzKz*M7CFIB7MO(+H7c*i)Wq5Uwx7N+|g3m`0rhsQq?s+X!?snPiQEQZ7%}0!6}I zO~74C7%*><9S|@^(g*;r4ggobWPF7|Hy~;Hz)o0)nEC2aMHtfU2szm>L}1}dg-HEK z2cHg32Bs>CgF(3Spl2TOiI|{b9%LN>XW>W0xgDez%=bv+)fD~nNi#B&LNBu&fos*` zCfmV=YQIZOghhk~qhh&~&HwZdq11~EkAlMY&;u0uKa5w^u(vV$_X=0nQCU|<{Dkic zg?tf4h7G>|!#Ywl0OhZ1CESD9Y?nEM4lOsgUP~7#m|Q|D@&WO>wcK@&;KFj>}_%x-Z!b^mkbFah=*SrZU>* zLRLe%+NA!GS|BY3jd~Og&c;$OK4$(@)0UAYr*jp^q&R$*G*3hdWGgklNx=5%@>JfpFdt6{;m?|opu>SG1z_M$zjb@ei#{XQ?VrUa zYi%hE={9q0yYp+Gs-M6bsJz1|&|Q7Yu>F01I7;YV>P{@+Ce^Rux{?H|)D|p$#^6c= z2JygLWuZakdeO0=n{r`Xk1*9|>tLhOq1~7&djwVdp=5fq{66LVqml!-HZ*o1L)dSj zA02acu(#B%`QS1CeoY^<&~`aJbK6_xg%AZbOh+{}wGGB9jjxV{$%lR9KIET#Z@Ly?<>FlY4aHm*4QTt%%Ut>^Sk7Q^c z0*;KAG+O#Ci58Ab4aa7*)#WEZcd672U>OrU%h%uHdpmvTBk&ZI*7gyMtX9|WF_ZMG zSai8fDJ;m2EoPIxTv-kK*6+_4;cw!5 z2ZU!|xGiBYb2t#EpTFt&(EJ?3~?q%mb>fBQWkBE|c~ z>2hbv;~Vve9oUQN4ZtIPu?0nY$x|Vy-+%yX0?txld!T_<9OyG6U1~`&0vTTY#J&6g zB7|tGKP;lG5H}>Cj!%i`TVkDO1rCejT$~mMXOu>z#vp+cph!g+B}`)grZL1JRMqEC zj6U&};i=U4^Fa{@3_h~enPd0hw-jkb&IR6H^!Y?p_h{=F(-wmZ2O8ykpj$l*Ak1$R3 z0VjeD!@bjcUi@t-WY0-j=uaqI`z8 zcHN>0L>;RoS-_o`U0Qi%X1JvQGc_DH7Cn2pc)rbw?)gW5YWpDGx4Lrpb;+Szr|9B1 zeKHf8gQLSXI=9<+*x}doH>_V zJ6XvcIF`w5&l=fg$zmZ|vTQr=_>9j*dRo+O$B`Z8Gp}4D{dbcu?c4jVAq5+-pSlnr z%dKLw=Gr;8w)MBlPMhBS=>h&jd0Aya`o%q=u!zQG#}q@xevC@>AX=uOfgo&^T5c}>KEVsPaUZF4$R7KPufqS67VIcv9r(z5BeE$Z$n^M(xh zJhaxDTVM`>!6mem7{Z-l65IB+paON@bV za9Ad6-ru=&>^G{t7=0%)a0dQk<6i>)pBRF1SF;7)egV~3^x0+Q3j=)lv&_p`Op)=p z;ltX*q@t&^Ff`ceZHUZT<-8o_cJ$8gp`@syb22xY5?~oRc$_CH)TIvWuI?oF zl9jZ!6>D|7*swk)#mY^iifM23Tn3U1_+^>!VOtWx7?L}s3G=fc){)F90{hR}V0CBH?BH)=a1ng;eD^O+9lI|#Hfegh96G%?qmNh1=i~H4tjFYqj z*e!VRQ-ASj@?Sq5jz}t25v@so>ItoxPsXt&+~#FG{zkhC#Z5dB+N8Jz8Fe28~fW0mmIhk$Zx{| zdmllhj=__Yb0@ri{us3@5T#INMYYV@%3CL`_okdvMYM$0FePQWv=r5!jX+h(VX^li zt4m%l(G(M2zTUbCZ-nCNmB-hv4%aBzYe)UsfX6`~JgJKrkG5qRH`d+qhzW z{MC>2oe`A;Z9sAtoIjSy?h#w(_If406PUM%cnoxlGdEPHE)5C0{Q3>Sk)^;>;jw>1^(5>1-m# zx1a%EH<{9%a_2fS`Tg-EqNWvpB^&e)P}--_~^IM9}~q z(=WI3anM-l<4WAY@8O7*Tph+Hg6~#Y2Ai1r_kyqe#G{Krd6lVOw;yJBg7E-m@b~KC zqc*+PH>fxWVDk|e|{ue@l*kGK9ydzG87`QOB))O{PGU*r^wryN`{=;5p&ft15Td1%pM zgKaEr(wCfFR&+wgOb=a)P`Foc7`7w&S62=t%6Qq|?mt#^JaEm z$x_&`DH;O*Lk8u^V)jZlQL}_$RzW(%e}E#UR)iDI;v$Owc3qfMq}>CCzmX z+Wv~Uv8HXPUQYs6U+px?Pv@d*?kwtSdQ%C}rq($Tn}wOgjz&n8IM|4f3PX~86B-#@ zDc)hgo^}eC;48$QgodOySbGL$Iiqqc@u0xJH}zK0y7NZgfKB`cEc^cpVAbqQ{{JAm ztuU{M`gytZQ3XpL&^JIttrK!4x<%U26NwPPUqX7l^qsM$%suZ$`j+ke!so&1XLB`W=ns581>n`*DsM=oO$NA1La7zm<6GgOQx*HE_{6^G!+W3+pMTK20 z=yli=lzt}L@dwPMKYGpi&7Q@@8_Si><2Mf)yQT?VpD<-?t;;8l(?%i{2%7F|Ut z{y~A=t%oeISH6!B(pX?Z0bQDS9X zBKBh8d&S=1?KzUj$7!&2zdY&pt15W&;2q-@s}SeQKn5BsffC1a8h@aL;<_k9CK9dS zUd|Fw1~VczVJjYnx#%N9hB0w(5C18cr3!BkdPEx=EcsPZg2}4d54;+?3#23)xUb}3 zN$%leA|@9QqAqJhpzt#Z$qfj>9Fc-wtY=Mj4~{o}hp#L;%*xi)Z(wD{CUy}@1%aD3 zSdD}vfwWwZZ_Xn?Zq=Hk1juPSj<-$t6lTTLq*7Rti?H;c>Qd1I|1QGsdmq=gGZ@4F z6}7UKM$Z3>W1UHv{+nStlh*BU)KCG-;hE2|QhVf<2>=mbHr8Fmr&w@lne{Mp8-%pL zG_2tUpp6?3N%G8h4N?3YWFJ3iFh?1kAVgs_WL?K#Pz1k!{gy);oz}t-kx#*t z-#_l?t~wvH0x1OEA09}4qy|6DI{-UTr3NKXadQuPas!!bnqiq^IY(+>Rx?jA=^JO5 z>;CMRY8h!6Xqkw`x{Kr$F)WD$&L5#p3$@&GR>&=$_URaumiFmA(H`ENJC^f>@Y$+iE67 z#B&99BC64I#;wy+G|8~@&}%kt8GhA097KNku6iE7DWeKbc+Jwb;UfppP67HXbJLWE zLcJ3Q|3N+7ci}W>(v;-5ssS5{l43^=%Ep1z13W9KCpa85LQyPrhpKhNn*L}axqi1A zwU5xM9MizI3F)`~UAd@r>AKh<2OtyWH2Yc%cTu2(9w z&O)8SF>Ok-r7@~ZXlm*u5f`!W+%RQTZON@Vm~B>AcYm~X7F_h`o%&t0XqKAFNdda7 z2ijfC(+O&NN*CI-#OvYY>5x=Of7ZeEIIL6`H;{eW+kbG>v5BZPJtb{ylH;MX>Qrh! z0)O?5wVfwgnT{`dNZZG~&LK+GzEmV(Z^vh1-PKi*+@Db^P+Hn`iSC=OHcFw=zoYDvNcJ&}DDy)grUzl-0r|e7?d03fA>_6_wBd}e&hxkh><+RZ=5 z+6`GnfD-8Ar}d8X5q;)-E4j`;4+&PNAwc>BeM`NjSRD=)81z+ro;s2^zzEwEVQt*{@S#>jY-gMB zE1QhKD%97pE47g>kOh^>g)40vmzK(#nijRI*VfkZ#7^FRyRon8lD3RabZ>cm>3w}X zeZ9ZW2ZjLsgio*Ti`hwqcJGzIQ8iri>}ShVrJiqEH1D4G=2I3&5f_n~V6P zMeXDg)@2i22K|znAh-D^yfrl?u%B@|xF0MheIF7{d|s3j8Ag{geBT0XXik?CkS`Go zmFI~)TuY4_e##lWuSSXdeYv72V-!>E#D&rGXbVrMkqkDDkd zZg);!ilcwH!2p9}2P;HX&$wy_Za1yI!Dug@hZwwmm;qXKwc~pm^zx3{o@?XJU2LY_ zMrvP>ZYrzgLqR-!2Jo)In{}=l6nn%?9Wp)arK5&(Qr%+$*7(vOYtSI@SV-d~wuXQ$RiwA1*6m zk$N-cXRH>%EXn!<0GtK$jw5xps0EAdebLOPfp|4^iliYHD+)^#((v_%1-!H?@*l?f zDfWId8=!!_^fq`R?ok-0ASmmQgpy$xx?~{uqs-$}eoI>2m+St=UCTfe?GT{r^9*M-{1P<~SQod9T zu2yl#p0FI3IH%cAlT0HKZ1q+}^T}r{zTNFOJ@Ig)EoAW%uBPE2b)`p(;c8RPEH+Ce zqtIV28?J#P*zmh>R@%G-EVM)BaInp!<;f-Oc!xPhCl%$28J$QM zDM??J4N?c(v&z*iX+~3!)aB9v$hz?XV0-*wFRstjeIHbLuFFEiksIIWHxo(^zx_bm z-+fHIjshnnW|i#s;9g>xyJwRN3ti8m$dokHIt9J2Em&5F*!TAVdPWG7`9AT+6m&)8 zB+eC?v z3dtKCVh9{AzowMi1NULDyFwY_x-1OIhb?Sj1LoFHz2nuJJ(jWOnqeN25CW#Cp>$>w z)O|4o;2V2lTk1|8#ik|2qjP8LHJt6W@T>yk7K>(OmQX80w|)-g2j(|w_dVvZZJg8& zTi@H_8Z2F-y>~hkYRseV%5t!Ztpur{L?3ertGL0~PKuW#39l2HY0AfT4vf0)1Q5~4 zX8l?sgrq~u>7+u^UI2=Qk5<-RId&q0sF`G4%NH++bNfp~+vyslCZmbXD~kkq8BCyJ zgCi_Xa{def_Z3nm^fj2QVtv!CO-8oMj(_x$(qrql0! ztrsK~xM>~#hApQMrlS}$u*Ac2{7#ghX(yH^4*k0~_J%{7?xE-g3$p|+jZW`bWVx5i zk#Fwj>FzY4NaLzF&xH9-u3H2WvynOmLcMlmJS#F8yqOes7;=bc7~pEQ3CzBqry-l- zL=iZ5cl*W%^lDUDC;DsVI{O)j%%Ib`nl14v^j*0B_ind>7=MVMG{3@?6gmf%8+^UP z$U#C0)hUXnO0(PnX(~v?#XS|ZNSm<+oWQ`B#j^pgIMl@-H0$qK$`z%{0cS+$D`hNa z<)WF0a@M&ti&2A493AnYwkeb?$`aRs6Vv+3iG?Z}i#BDJ+F2aAh~M&AE@I))A^^WI zW9{&na<`I647i;Wxpr-I#=2jpPn}20z8XNVI}Ab&`;jRwdi}EP$9>XQvCxbu6SN;1 zIkrZw7-Rhms|L)FdZUqm6J>4u#8S z!sx25wJCB+774lriL!i#yvQG)ljp`BH~oc;GjwZ7`7t7LQac2ILBL;Le@F9-u;U3E z+OPpFoW{l(g=S?BkNRs9ImCO;DqX_Hj&3l&!pWZX*sQ{XY-t1BRbCrr(=pUhp=exO zFO`92X~WDTVyu#?V60*p^KApH7fI;`HTa$GMp1&NOCs`-raKjNx^1pO|;zy(l&u{o&<~1H#~p$)y!sZ`|FwEYcLr zAVUul@p7~SME7dhlY8LZ_^6L%eW3$YJxP{K#TZ9y^3qr~?f5gJHH%l`kAb5xFV?r1!hCe0z+m3*g?Ak;+!lg)ztH1a$Tu+Vi?fk}5 z=W-47XP7kSP|ja05yFm{X!Z(XPoA(Abe5OJ1e-Xgb>!p%RyYlAs|4p@lo)!SFO(eL zD2gzIr!g1k0-c@x9RB`9ZC_J|sMXF7aUE6QziASscFOG3M-qR1?U-^Hq#X`7eogRe z(qh@LAVR$#{N&~~7kgmO@3UCg&s|Zb+4#0pbP~`jglNXBwFtk0b(9Hb+~hbOhhzH4 zX*kHKaP_o-;Xa=te{gZ`&N+`x(22c$k3#kR*n2dwe6pL%x;jX~m;xq7A>W<3bB)Plya2j6?D^QLq5_*GF9B76wl`A$KHTZcazNI1%43*fkVfE zXns3k?gMqT9pLEfds1pIq85=lmC|2|y}39dm%pNNosoH}1tap0YbX)X7@;xP<=_FL z6__tG`f6p$5)!y=6SC%u%`?W_3u^~5d{nh@?Mm_*sUViLa$Bx@U=0dWJxmyl6wz&Y zl$P~ANBQ{*_#dy`_>hxz9%>doFG(fIy0$Pss(TKeg3#z@3y#7n6^m4q(k5UNZNGc5 z5%r4BgE|}clU-7HodZ&6|HoL~K^KDf_5pQ6=Q5>6@$IIK8IiqmtjZT?ui<(!nM3z- z?++P)hXsE3C<|%&l`0V$rUUu$57C^=BivdQzP$)%>QUSzzz%74U)Q9kOK>e6xlt1Bd2>Bc{PV%np)4lSWQ2w?s-Exb#zuFi2(%Va- zF14q_&#$B=SD%$cal>*aG>rE?=wU-=nfCD}&t?27AHW9NA6!i3YgWZ_p?%z_eR|g< zKYr$fuX|{vt*cmu!AWN-{&f;hA`c zcw!|T4nqA55nQbyVBScB8aV}(zXEMRj+HaEa-=wz$yefQM!DrS)Vv`Y*%ow$|AK1a zF%-QC+@a_HL4roV2HFw<(yxxX;|4S!zL!>0%{?Pa$SFwzToksj!&v7 zqJ&SYX*%|TYTX8( zbo_QZUXs0JMh)!3nAGTZe-5xbF`Co`uO!~;Q?#{SKBOHn6u@-EC( zlNTP=ZN?vmN%AEXS#BO(bwA%*)|1SOq8Q*zJeZLkrj$lb72$spIup=h;Hi=I4ev^y zr2ObV(UO~9^UZ?sHz*;=cAmU&;9uc_*30K~0+Jyf zBQ-7N!}~;s5pERUE`_?kF_}l{ke)Zy7+Zcp@J(kcRFu?lt=LfFxp;4i)9TN6|V zFLVaz;I*=q6BLzRg_`vn-{%Hi#ZO80(}dVM%^g9(n333xykshkn%Egd2DfzIn`?r% zdAOEe!FQlCUA>gy-o1l*78ZOc2^n`vWUdsX8EM5Ep$`ay3)4KcK>XWaKRYRQrgjTMKi`S0%9<4&p!tOy^CN za7xttY(+Snkl?@`@jUo5|8rITf=-Y!7>RIoGq>jlzEF$3Omefz2@)sN^CvtQPjt!_LTdxZ z2fBWc>oXFMN-LBb+4$zDlR{lbT2ehYQx>f|#W>&St=Uq+dE&lXE05NtR5Hgp5gLN> z3Xny*EAfnAhq zjCZV#XoY@*8!Qi$?7-%0_iOep(5t=jYy2+otNpWU1aB1n9Jm*QXZL4B0l%-E5C>R+ z02EmvlYS*b{Rxx7ku-w()wGgYC)^?QJqLAv5={{F8gktJzGFijN7{D$;rew4;&u#} z)j-a$i{h>jM`$k~pK~}`v#UK9G6b2#8%)Ixk0#|v7*qjzr8&`&!RzyLN-b9`L>(tLJcaIXM+|?xR)H z3Bk^ZMr(G1xPR(!fCqZ7LQ{kffjs@Lqak64|2^@k#IvkaV(drI*FSUl{LH zM*d!V4eT?<_m>YFqJ#+4(7tIj1oaaL_zQcg*!%h}N#wu^z$3v|a}nOF@caM5{T$ex zCII4rC&T@83h?Gm=|78Sjw7?_%LRhBSA46MeA_!Wj{Ozjt$%?4&#ZTD_}ct-1A4O| zV55#*aZ44MOxroSYfsRhxUVRB{xX!AW1IDq2c+tAhB?7QjxyZ5n`y%Dn0imfUOZ-E zQ=0boQwZ3%#b{`^4z`fCp0J*9-z}9npRk@amTfbkP;sGE1mIHULb@YgR=pi3)%!Gf zf*K^6Y+bC9Z-L)4xzmRz+s8PO@5E%6AJZ^Xt$uH8U z#-Vz`s?C9cMEWc4{*%VtJjwG4z2~Ls>mU0=UsnmXe&6z8T!bG#*#56isje=THkK}y zrp^o^|C)(Qn7X)_I{nZ2xWBH8>+Cw9BK0TN?##e)p;s1L1GT2 zr8ikngO&`Am$4L$n+B_$43{)a@D>DXp}91UGy*boT`%0dtd8e9-$!A=_QY7Njf|kR z7E3;d{g(HYm;Kgx*TdtP{g3A#pM|^Z2WqIStf5;=iUT0nxGmVciLAV#3RaRk9jTg% zH&kfZ>Ni+$>9GiVM6Ic##GYguInPv!M4*2)hdQ z#zQSX&axn(J0F`PJ{3@bQ~j7w+6m3gm% zOz+?tSDQ&0OApIn+sB*=h?~^LVu)+pSdBmY6BciNNIT8EIp8qm@NF(U&5{WOR#{&} zK~}_L#xoo_(ZM7Waie*fag!4_f)%_v&~l_1yz1Y=fSio%&J|r7Tc;aC9uR%9Mn=(Z z%JD)CHZLQKuiz+8H#LnO*#X+sOIXbExdh#`$h39LjRnT@uC+Xoh&!$$3F$U;n5Al| zBQq-O7@T~m%??rSAUO=t4gd#On9a9HT*Y9Dwf>PR+{+7?X%U0yh!^p4@6u2{y+j&Y z6<3!=JukPnbtPJ+-1s%^`D^WQ=v8_&sFK1Jzo8)b# znc#tzhpful;Wu+ZGP(GAz}&ZRo(ZLO}hbS+6rXs!g@_ zuPF!Q4QJH}NP+@sZSthk)K+5v2Ze;4sp!YzY^vy5*K9^AA{J$Z7BNVGFoRhl zyzU_x?r3A(VN+bQ=q?@n@4s4x%itK;p~be^mE|WwMw7yZhs>|VIE^tGX>P`2m41mB z5+lQXKy-Y(;0VURg2we6CAb=*fqL$F#4-SR;(=yrc6u+pS21!hKYP=bYKdMI!W#j7oQVvzdZx6}h!4!F-NMtF>rb5&dY6!=MW*4$778};^A1BLdj;CA|3TV2MTyof z$)bf-wr$(Ss#;~+wr$(CZDW;f+qP}vR(J1x@96*Gj&r)-=JOnpk@;mtMqUN0)-cr~ zuC-xy01jxW26-HVR#;qR(Ju}z?h9C{$yK*~{8Cm6Q#ZJc5=ntHu^Of`1T0WxhEfCJ zxt5PvHtcNiE#p&;R)+c<>bsw!H&d&z zU%V^JE3uhNP0Z^)f_?{8f?zkIg zLtVtX>?i*;s7jP>OsAOd{4?^u6J*Gdq9YHVRHYVQke% z;M3bt^E7vJ{bFYL_#la1@HIA7dO~c$-r?VF^~}Qt>GI=_e5Z_*3@rz+Dg*P#boMS|W5|m2}@6`mv*A5rgmWE)*Eb^`TuPws|3?5_=)P zOj?D2-(8mx8^+6wPRLT~!m>AzS2cwt(7NMjEXP8r_0KaX4(k~QFOT}HrnPPAevWYm?OR&=ICnwAv30;VT=KC>P zOO?w#vN)2r0Ek37Q+2RB5eLlbV*GfDCl;c@2t6g&T?1W(2BSB9qRn8zB+ZW6nGg>h zP28_wz%&x8ySI9bf7VA_pu7*Zs<#I>l{N)d8?s||fnM@4YYIO<6rIax{bAp{XEZH& z4tIQq)ZVp-&Vf{b=0)Fw?_U>Zd}8wTg0}fB;1Qa`+|MEAFRhF0Hgrocbb}#$!x8Tm z$E@8a$18(fGHIrswIjtgh;<)G{AJhGr$uar)Bs;x#FUv~951;?%mQmajg%M)Z;IW` zcgi2XG4@>h&W^b2g;~OGPMR-b`&*hR@>6wZ@&khOrs5;pk09Z`TvA~qPE zltR8ogi(OFD=L!vmx@sz>j*Ns&<-bA0A)R;WLnG7*tZ(W-=1~$D*dUHPpr%3*4o=( zR$I}aBIWvHZ2pOHxqt32x>d@9;Qt7SzJ4}?IQ|b)`o9Gk3N}vGhW{326eU>whlXhQ zJB7zFL+Hp8a|c*FNGgs~ZaX*Fh{~@8W)HM$XHm=Juhxb7oHIIaT+QMDy8aX3hwP98 zmLv5o48iGV&VBnO&+);=yiT`_2!OUOO^DirQCz=gat9aWwRua)PFFk#30xxgLT%|T zLVxk>7co)$_JPO{AA0o#C^!3VG|}bAkEtBim@Im~Xd7cZA@iAuhLz6=hj3+90#Pr$ zQ|)A|n^pTY~?F#XQr8`Oha%$H8^L-`J8m#?)t{&v7e%66USzB%V(T; zSQ@3th+KFNY6c@ObDY;>ES^KSm0Qz!$lN)L(84ngj09$~Q{t^^NVFM_Ol|%?g)+v` z0>b>E_O#{eW!~m?VxLnb{tYlr@!LgOe0cn^s-7wqxI;eK(ROy~x4XXdQ(<4OjYl@P zIW3$30^`B3noC2HJ8Vl=^5@4Lod|5CPo)=_vaxg2*h`x0VEtj~LPYVq~fddz-%uulx7fr4lsJ2L-m*Aiz z$h|~Qa}ySf;U~i~@QZgI9_>X_D40NT#0D*#B)E38ZyxaYDR^(Ip#6-xc%D*8R%l|2g^f$P(mIufQi!tR zs^KwC|GA*qHfODT^dYN!@wHuZoEYp1tGf9jwaN5d%gK^OS&Q;KYFGE#?1b8ty-$|j z86u0uD9_l__I=Y!SI4fp_i%x@U!bk&YWlpyR%@(=BiG~wpFw2;ZC0tuUmbe}z6QD< zFM38>rOZt=V71CJe3&#qb-TobXY2&bB-SLvNQqK(HDO`yW5T5|Mj&LUK=;wNxJF1#L z-hbra`HE=UJ%`T?)~Z1`Gw3V-(Gr{pUmI+3 zgLZc8qT&=oxV$H3nMrVldnTdX50A{{3Jgh|82tLjoiM%p9=;hg005I8j%E9w(CmMq zyipCpQ*rT;_j%Irhy+77K9&z0KO;7fq&~EMj5v)LI6*R1EEJFgb`)K>@7LcQb&Y2A z<~F((6(LQ8Y)D1Q!8QvGtIad@^|l4|M)iuNN1v|uD@&W9rM~Ow7|-LZ>r9WU&f{#4 zZIAoxkE1UhLFQp+N7~gvDYrf2x>X9!ti5DzIfAAG2Db`@4bVg9k`|&E`@yW64yf8i zimRyt0@A-UDw0U+vpqeFJiZ=)&w$SCgVH4{No3x%S1#e3(zg-Zm?T#VgTS#K0NuYX zCJW?mb*oE}yT|s8;RrtZPaY98c_3Y(y|}9*$nHu7xglywY#%LVy8X^=>>in`v;DrW zbHB9Fm@@ZPH8BaYfw|%CKqB9Tw6K32!TF{D&;e@$c0jtq+;D1smqw(?ZUKBi+?dSx z%nnkM+W>6=b-=vgXiWs)sr0n_b^~q&Twb@O0v~$yfce4!e*0b$X<XM%5GbD!jiunTb%PbA*$rb~Q0iyVduN0r@LnNB{p6VK(^Z^$^`YtXR z`)3zLn2)Tsl>&y5%*J}av@XH=UCL@L{E2IgRY-DB2VW=Da?Kk79NQi7=BZUW&xaL< zNmSQb5Qy7~Pc{d(g&k>LiAQMKtnKnJQ5=0Pi7+|S)sUQO2 zz+G!ZZU~^$7bZ7mF$miQFBgvq}ppo!N-UkiX`pz452_Y&s-h4(c46gt$1hsB4$_jjUC=}Te$ z*1WA=Rh4lFEJA;K?q1zosTs@fH&G=SM=70_>p)u-l?I30a;mj$9`wr?MHpB?k9^=+ zQ6HtMd_!Llf6K*e)M&ZO=gJ4jv6|b;8|T1uug0xhd=sgF8soI)uuk)tfWM?CkF5QB zr7+Ai_f1fkXODj^M7%1qRjXJgeZ zBmmlD0`sw; zQ)fBZdTF2{@^^clb{OYDQRRKcuGFujPXUsp;Vq>%5$*0(#WldGOBOhW ztYPB(xk(pPU_S-NT$h8OyJj|`Sjvx;gGq#2k0bA}s!JVLol0g=0m~+@=H~S?+x>L* z$f9f)7MmK251NUNGahGc9q5bmDHP5-)onHodhZN+n3IUd9^xGY z7Wz`WDuX(UHJHuzzFN|G_ggzT0dcVt|D8N5LD}`AYAZIEqvEOT3ZK*_7-;=W0fBMGOBJpc80Iz=h+?)JsM+?nHDsw>Zn_n zYw$O6E9DQ!5;oE)wrZ`-M7d@txeAS_!+_%-P-daoI^noBiuAkiUayN7 z^0pNfXP9=eEVjD7tkr02yV-Wam*i%hD+$ST`gu*^z__8H_U%)S>*1EQf%3DmAE(Op zRJoN?O6;X)62s}#GPW|A;jTRhx_sTwBS`CktMlX}e3s9S137=eG!r0E*-K?nBGIn4 zPHlShy%8Z%xoE8iFURXxpIJvcTVl0aKUJ#08hWmkuT|+7Ml^T^jmDdxl`nvOIA@Jw z(mG(a=a}M*rDN6%d0R1KoAgyLfE(%Mk9w&^cS(isp?=XdfZs$b|YtSX=c zC+yKi=+)6+wfkkaIU5zX(sI+%yV9n5ZC7X4d54d6JlABl4j3%aF4B&M)HPjnIpf^c zptUxwwf4DYo$>^A37FCZb|Ya`BcVx2+rK*~@&cXml-n{v($=8U+7PnBpGh|5Vg|Q= zW?wg2#N#g63jv0L0Wxqm!NQQ zwSVlK^2BKg*8e2Z(gpZ}v@`A74Y2jA1H={U26m^$*Jak3cI^x1%)_@kfa}-ByX1ttO6duTw91IvN!0o~}aK?Qgf(H2N#L-=qY(LtyBGfRVeVX6US z!O8s_L4$W?BLGQ!5$G5C=n>8TGpB*lK^NF5g;X%mM}lAjpo0nUK=0>C14#ao^v?qf z2F{ZPl>|%#rUXdxExWnzwZU9C^~Kmp_OI}Fhu0<5MTH*!`4>*GJG!>swhno?K*^6zpNQ{=+V=AY5dLr6$3P2t3l0adZ0>y7l1K$5CbFN&g6R- zZ3%3>OQU>A`F?Vm1(fg%WXj==zb||)$PA<^;D4qyk-sRWb%i)z6Ah!?9IJy zFbmRrX!t<=yZPbU(sMRwAG9Cc+uO#F>a}<-Li`cWyF!GQZiFR&OW20|f>TrsJ%D)G zA1VHPp~qfITedpbx5rz;-L;IbVW|gvP+Gz@?ntqRY^!R#OfFni46Zj849ySFEo@vq zrzz6gJHo}pUlT>`qW=cEkum`PJ+}A|6cfFDK$c?S_Gk17`UKo&1)e|RRBbz_YoE5U zXAjQ@`5W%*jnC#IJ1zTeK(?N@#qQ{gG$=X()^U%P$IQ!6UfrE^aGr@GE?aC{jcJV% zuedWdyH<6Z58B zN)Hpo9DD~YM=!kcslhRo+Q-l-YXjyODNNHIl#%xxf>Jorre!zh11Rk1F$1ds;V(-W2 zEF+N+DJ)mQ$vd&Me|_r@#M}yQLVhmA}S}T1y@132sE^7)@?lC~d^4QB$6j zQWt-t*G*lUNmm!YBH896M^rVO83iWEILhfa2Db2VM9N#7;ci(+!q&}63@jmq9J z0d^s(wu#;yX-DKpy~O8gLdjE%15&mQcp{2q4Y%d8lszXaHXkkN(r>~Q1;zx9EuY*g*3{>|JZt4Y5Ks`_N&f+B!37O9};`M1Pw zM&@BC^JwI;Y~#GVf^zy~VSbX)U!zEtuiY7YQc~0Lc+!_h2Yfv<2zPTYsmDuuC9ea1>)bn>hgy6$;fGjL$u1<67xA9$YvZO$QgAS`#G8!JXTU^m96==L}+*h zG;}EOjLjnaltvWHqectWhUc$`gEkN=)V~8uT&Ozd)Ppf!KKuF_SzgjRMt==P5YY68 zOZsTY7Lr(mPm&W2zNepcu+WT7mYEq)?oy)XR;Mk^qad zQnhN1=Ef6{Xe3%H*$2g2iQ~eGVRpI2!dDzTB7C?Ms?yYO4ah<8Uf>4FFnL}UYtE7o zT5_Z}LJ)(0-$5gCiLOgDSye*JPM*Xzc|Pe-<&XKmn#E62HK<(WXLcHHlkS(iL>QoJ z6{o0@xvL(9KZb#a{1q}NbMP2u?Oq|}xl9z0t{-I=7#(t@Wjc14fHLerwBFzG*3VaY zJ2y70>%CY$M;@Ltd(rLX-H1q?V$igVP?E;!On6_DYQ5y5xaJ+JaoiN4T?(n?ec;7Z z=Ger4mZmJFZp2a~r?ZEqj7NhF_*u9wbLi48zfQ}r$jDI1RLS%pN=iN(bo+aBtde|$ zr8q%rau7zd-PM`p!F)_F@#IYsbBRcqE8+H$GV8h~h~kK{UR@002(vin)R1nSYn^<4 zO3E<}I@M=Bwd{+2FmeAfDBL>M!Wqqx(ZQKrb8&a}t7|Myh3qa#Ks$?AnzUqM0(q{h z$au^p9FKjFqL0Em_3m5bL&ui(cgbwIsPtj?{J`napIiS`BeJ1|;gK${vjD~Vu)C70 zqWEGONB9aN)>&C)k&FDeiO5Zs5>q%(b%oEox5 zk`z4(6vnNg`<8(B_6W2?YfS0&vdF8v(T0Tg&K&m>K+f!^8L@_xseG_gZ1+&wk`T8# z+@i?`^i6RY+lZ2bJL)53G}{ZNmKRIzw-*!>iaOa~_Jou_BNccNe_L#M94k-B(29KT z?1ND~g$i87C`0akXCZwd*)^@_-U9?G2B)EMxk<1xfH5{9wclPwVQ`F6~^XYRM91sU$w`DcxadUbqFh8rU znci24^q!{`C?!29z}9PP=2Fs(Xq`>i9Em&Jd9Nvt5@pqkX=RY~+^-0Nks?nN)Ovy` zSrR@gI`v)!tvkyZ%|GxsTsF0G3~~%UVVS)?>}9Im7ZE^rxmpN+g)}A zVQZNF*#N0K=90*YsXsf2liU=HmLG0nvUiQJK^eVJx>pl_U^O|!!ToBl>>M6^1e`2@ zJEeaMH9tX87s|2M^O7!^NpZyWl0utpc0{>uvsiUbupRj|xjV-l18Eq>-YV2M!Txl2 zG(c&2lz$c%wn0scjAjS<^Y0H9?oB)e+@$U5;C1AZ6g2NZqCPW$Aw7|mmFh&5gscx? z(}$4Ky-nW!gnc9?O-ntb{b(om?CpXe50At7Cl8dQvxcyIz$RC+Lz6HY z142_wl;b-%6*R-RAiBgVMuzLH6N<(wyrFW&HDx``70a@s_ISvROnww-h=ZOpQMrV2 zLnbS!iPB7CD%yIS>K(BWwU^b1Div2~71$hW zn_}r^QEX`m%!eLir)z@oZ;A(Xr()>?Vwi*p%rGW-ED{PF67w7qOdMc;72I($PMj?B zm+O+L5AUj;IPE%DyS;-ts^abkHw|s*GL4Wv=#Bx?H?5gWrAxD}bHPHK=Qcb};7@JI zk?sTee_UR76s@6(*7Ie#wvEt2*4*B4j9JwPGh9=vk4RZS7mo^A)GXWFiZpPVE7(eV z@$qz4R^%{K#P=C_AwED^#4YU$g&<0!i#+~1>QrMPGm{(2M(|gKsZtfzO-}OQXs=k$ zh{w@a#TOH8Y)t=ru$J~$Rd`3oe+C-;wmA63C2)DMiei2oO_=8_$ej-2uzAG3H0CPD zwjQ(FTEkRIHoNR@7SZYeb7r&-8W1g&Bd2o~`BwDon~`%2%1|E#ii76zTe~d>e^Z8e zQzrh3to@bZ2n;k!e+CZbO)mdjq3Dshc|3Q%^_&TsQ$gnZZJ46MH97M@W}?MpJo&gK z1l`eEuU*vmirb8Rn`a?6$9@D#-o!nxLF?cM=}SNI6ET2xGpACUbYJVr8Ot$F>Qj=gGWF%%So$X&a}ii)YU9# zr|AqHwEJjo3eu8F;iJ;?&#q#>qBh$}%=_O9n-NzZ`xus!Y0%HXT(*Q(H;J_^XFS~* zF7D=T%m-`FCm$w_ZZe*)E8LVvPd6R)-?lMqCj!>rZ~?sHE4;}~K5b;^4-iMUbOF4Z zIc}b$`(9VsrZe5GHFVH#j9m%c@v~jYvt10G-9avK_|L=v(}n`3!L@@Sq!+~u!(O?) z)7Zhbn15urVuY;i$s)Kh$O{J!B^4t-jc&TNK zdQ0|Jsb505VnFar(du{po-?9)9%xSbPbZ(N-SFEpLGdzL>-C!SXHmNzV^O3rj9Gs&M2M?G|zBFs-&0Yo{GtYd>s${lrn#>w=WLm|nvMzbw7-Aatgo#t^ z#gF^r)LZ9PI<>?P)1+XQc8O`;uqgw$UeT~I)wyCKo3SZ#`D9_*=!J%3cB1-+j5E3*0Y~FiYPDFK+8X|M!ksXK67QF3J|Y~o zwU#7NdumtV!}mXi1R4d!Mdm+i@mW7>@jU;RLjt9L3$Fg(d93oKjD`~WHx7B`+}7<; zFx5N*&eUA*SYjt1nZj0KH3*Ikr<1#fhbdg5hO^EJz1m)PFWECp_vr$`OYcQSm~a$> zumSTBwcIygiskIC11(L1uQy+O_C5Es+m_EXN6Ivw=N*MFZHH0-y!!$oR4&Fb5PO6P z(8=H{K=z=6`RV=%Tu+Q204M|Uz&$!FVKmx;y&n;RAWb|r5&wdLA`Km7MM~l*{jkuX zog~A)dD_m8<+1(@>VswlJe^g)#*^WoH#I9VG(B&<7@nUdC|Mr(u0 zX!2ZQ{OoQQg9w{(!dr(5#_;$rmb{5uNC92yYxQ9C`0|5d9Jd_VSJ`n;DWa6-qBJo` zvJ4pq&AA)OXjAq;5oYf2eoS@vr5jA`hl^qFf4s0%)Gxb`^9 zh`<>MXfrSZE6x@sCS?77wi@}^MCqxj2rZe`#`$*h2pIfoc5U0$=vl>a5W`T$MVNIs zt_gI(xp8bbTIo+9b)`Vb=+VW-fx821w6h=t=;+ax&TR^U%Oxj?`pFM&1?|u*2a_4t zoHo={3%a=c5%tm1944B{W|M3saLkRJ1- z7~*ZmN?Gy(AG)F90ZB|8qJcN!6SM~DF?MJ@e)Gg@t_3*UPZ4sSO3X>>B!|DbJB+P3M9feeU5&u#Jg{o_LIPqM%9SRZ=b0^02q0we>zx8X)bsu+yZ3gx$l@VSj4sPT z+ILAu@?pB!1V~_}17CpsvHM^w?TA%15>^QT3mH%L_QJ_oQ1W7(BeG+csK&>&uS%c> zqcxDhydjo0B9GzV%C3V%Qr-LQ8ybgxkq;0)gcy)qb8`vm;WJ%Z%A4y;kvVDk6Y~6prc;B4oLCSppdQOAqoJFH_n~a9 zmv%~jfp2G!1P_wU<#E;D%!9yK@@y7DGWj2 zy+l2pq6g4k1l#lcPApeObf2tAPi>+PxJRXaP(2aK38Ds-(yXPAh#))zL$ZA?#z>2tiQpfZKgUoaK38S zLS?&(OyFvvZbp-iU@{VVZmy!X8??BsQ5rdP>H8RT{<@akE-=>M0Fy$nG|_tVQQMB0 z|0=UQoRp2={G{*}urNuoXHyWxzxwrFTVwj|l1ReF%UiYb0olAKjY0pu|_ z88O~(0uhxzo^x2?CyMBFT$8DYXpo7!phDL1Lm}19E4TqIs~WJyo6Ir{eZT}YwHma5 ztj7ZrLj;6w>gNveV;)WGlb|no*_Ai9dl^xHMhlsq!m!bcZ8Mk=?G#w+NkH~^dYor+ ziDj@$teZw}HP&As?lur}A7&7q>tUDP0jS!;I{))=`T7s5vIB;? z`L&-oqx@eL3ylBLWGij{m?k2BPX^aJs)6(KSyfcgSP8t58U z=A8axbg_38Jhr_X@qqp4%FV;;5v}{!D}v|w04INKiCA}7ni`VT>hL_(+5O(`a{cx8 zF7q2W)z<@^LUV5X+#REtK9r4Gb09ECOtZ-rM1@APKLfRx-fEZA_<^x%yQ|2_=2;(= zt-)Gar`=3{YrsED1A2+{Sr}MOA;aIVih;PX@0dkS5sHvf1q1Z&xn}|w?lYA%0c4?0 zntp9#8dbmekB0u3bnecQ}RQ|?!<*>=vF_ZCJ&Re-GN;qp*oKr)YB_!Kj>E%wL1h-T)De0IS(zTP; ze?~0|Vg8Dl+&(%MkUnMjcEAXuA0<(7^hZLiVsItHY%4IRsWml zow2o4;t%oEyOB(gVti(3`54P>bd*b6BSWAb7Ln`hkc8{%5W;~a^)4((UEHu1()B8N zuBra&5Tr6iWt4~dcUKh4M&m7DI4kdf2q|xq9Uh#eZDzgPpETF=Sg&BePUSWQb+p4! zy*vD=`g-K1PzyAho!4qZ^zUyYcHIxJQF>@4!3Fzz_)>N0Du<|E8J7<`$0eb#2I~>z zyfi1R-K~`|kErkmh+SLv%Gc8~?#y-WN>o8XHg}>VrI-_kJ$F&)#;R-_k}@wgGx7$J zIa|(mPlA#mQ^~Ba1Coy0>x6!Gm72b)rbZ^u%Yx+g{sNrnL-ONUXV% zj{!26D+C9x$u-2&N%b5twg?5e@;wNxg7iDHd+xD~QI-zTCD$xfuGej4WZB^RM)wAk zQwUc5&rl(eykAv`c}s0xsROdoFrLH0Rin58vu*{c{!5OHvE;oL!}OE1HDs zeb*@Ge4rBbE^i`>%TN9zk6Nq3>^*p~A=)+*YIqsiLCWOJ+HN(N2oXTx#rq* z`D@w>E8@}8Ymo;g?x9?7{$s=WLEoXIP`fNaxZOAG;#>6oAvAV9&oH-rs)MK+yXhCu z=O{9Uqd3xPRAZW`J?1=Kfjb6l%p=mNFMc&l(mB$h2k#|8(nT4&sX^+@VUV@@M{$1jN}7X~6%G#_#`ea%TGX8zW0eLjhX|`O7_+zLv|d^%woD zDY1kmE#t3H2*d(WQU6sEctqKbrzz)T(!Wd!4!yF6a5s}+IkoaeTX&X9fBxWBz8Id` z-1gR2)=TE!J^=WEEA3q=yX5eCO`YC*d9@uMcjI}&>4Gnx%|c2zeNr^+x9AKGS-Ba^|X`X^wK9bcZLg1>cCfb=)L-(xiuZD=74QH3&E>9gvoMtAF}kxV$qDy zuiNPQ_h#B^Aw+U;Lko@2XV!p^#|`>|jdv)L?{QpYmXJF?PdW^b}Al0M|t? zW1YOP^RED_lkk$Zs__^UYFsAN*-P%@+ji(5irNt$M$IXOJs?54cIzM3f5L1#D~JmMoIpyeH`db- zHlE602ciNqk)GQBPRiTU5e9b~7Z$U)MwV(~DmJGiS~ZKmGwy~VO#0)qomd1BO@Z{| zxnTjdbhzTQ%)woUc6C>eZjG(5bzeQ)6^1zC)?&Vgf%z@P*gs0yZ}mrlJT+9XhloxW z{pDLo^jH%WLCREX(3m~>Ts*w>!p%se)D~sBsMn6%r~;lVuF^IKvT(n<3LP3FTIIu( zgQDe?r@kAQVG*a<3L$va@5?(_S=CVV(&hP2MI(m#&EHr zKZ(G~!+M|yOB;Ed@@onzFMc_UQfP*@qJ0y8GiLN-f%eD)x)#D+)~^~ya8QF#*6D85 zubD?=z?dMmq^_r5%r2m*#x7x(&w3f>jN7HNs|?j)u~U!z&vpzee9a6d*5V_mX<@tc zHhR>WUWa5wO)RspL)MU_%d}SQ)mHmV+cp0;Ed%!-FB*(L?;tht8_Db@Gkyhpgk`aj zUk}NZV1{56nUJm(@30L@3zd3!{cJC9yyjy4S3Rmin~&Hg|%$52+T_!LX!6?viGb6GmpMX+SBM-cS^O)%v)&*ILG*qUoS`%ss3o@G3PDxCdNTEormmrSJk9l-_*$Yjl| z?4xoP!(GGZUj7B3ZP~f~e9uG;+~TfRVy2ga=gdnpB^_{d@e7h|0uXslj@F~s|4{E< ztASa#{4^@uA^taw3Z{S69?DhC1e)!87A|j?q8LZD(^^cyf_Uuc0|M^ofL$NBH<|d*Z)!fn_u#WgPxA?Xg|Ahhp zqfjlBY=v=E8&sQWuvH)Tw*X6PzE%Y~CgQWMmVn$Ah%K9far1~{`erQH$c|}-=IU7B ziirohWfFMG^Yg0iWHyZ0DT{Ah`vhJpVm#yim&dHbk5v|LI>TnZ^tZepho=gioApk5 zb=9@2aM=L2j!qQn(nT5yN8(6BJ7LSIRzecc6{q7;JPfph#TL2HOPM+1LM4_vX+~Hz zw@#3qD0{xABv84Sa6AJ@h+98)MyzK zTN%Rc9TrG%Ft#K_7K{FzuHW9uOsoh$@NjW34ZkHa3cJ37?2bA4t_B2}Hr=b?h*g9e zqPz?v_i;|{O%6#3&-7zFSK{jdDAWWH1sRKLuDQ$e>nQz!vVFfp#AtrI*q8O3p08{_ z>mLv1+g41prSq-FJ9pZRwLL#x42E<}WaA}jda4GYr1{e?$)IE( zd;3bCaN1E$;&kmF*u!=T5 zt1ZB*TVX2UnrL|FXLO8NRT#_KOa$-VLt)KTq(y`Px7_I2v$CWiy+o)w}K@@Mo z*HDe*_^r>NmIeyJ>riq^E@eTR+MS$}XLJsjglAuLJ)cA{rme?G{9a^P)3VZ-jy;dL zQqq3=_hTyqH&>!bn>Kd3r}XuP_^hi}k&g$t6EP%#&~ zlG*TPkDH*D#Sez$c{3rRg|HimrMS8UzG~U1;0o$5H#I-?C}fwN>uBrl&0s(oV+c^X z6Hr32F%-1=0Q%DWC76fOQGO0KS78I*dA=+;v1&_i(?8@J#V?uas=rT>%^>+!ex=y= z=~afaYgVQ)l{~KTXI1f9D0o()CC$~^0Aid~xpu5}!H5=p&SWPeiAQcxF_3BYedc~m zNcCb2xIY(>OZ->6kx&?NxZXWvr$eZ_n|tkvNev zYtc)AEaA|TjyUwQ{Ol+AlE>ZtIQ=hCh7E6i+0!Ro1$kraZ%v!al6K}kvNXqqyvS~{is1@kTUg2m_+80O733OU5+_O1Lyux%h` zm!JP}X(4Di?7H{|-$4H>e6##3V=HLMAn_yf%+pXO3XQ4s?vdpt-_`v{Pyz?=NlAr5 zg(BaWt%ezEH?5paAf!H!crgli-y;DfB_F_E3L;&S^9NAzOzR!4H!?krCbH&py1PCB z=mUbBiRsHzEZkeO`Jk**M~LZzE5mM`C3P7AkrYTRk>;UCajqhR7ZFwTCwEzPnF<{= zJVVxDUB;W}w7K$2FHrJWJLkND6NjKw#FR9i-Rv}8#;flvpn1sJl%X^h1W!<-su>$- zMODg$g2B?}N3kF0RtXa zoPxR!ZhqjOHLVnQIpRP4iAk44Tt+^ci#^7-k{2JXDF5rJ-~Dve&d4#D*61Zq!a~?0 zEKDo-3yCwuB_hAP@EEa{smAmVRR^Y6-YpaHo%RXZAW>OS5#~z?GlG`YDh;PL{^s4R zspLk3EmSj&>PdqwtQKm#`>Akx_RTg$T527A1Q&FtRA5@_Ut6?$)SqJkQ(1QK%vaq9 zG6Ksyn9mn!C+Jgg7@i20OHzZi>95mBIArC@ByCPtDM5%u25Sjjqf|LV=&!~%%*S!R zi`w_C5hzfY=D3D<(#YojA-(6Ypcm0&Ki!-O;nUmz ziIfA!oCk;s#SnvJE#Mg9LcH%+@U;-U`~-DbVw*J3H`(HlB+qagLAI%P(C7i%oilq6sCV>a>#{Ct$Omlh^2}r$f|7lIW>yx>%|+ zu`3Q6Wwpxo#Osb(oJg4Rty(72by~wz>;9e2Kek&~l2jLp;1=Y&q;q^M{Znrif30;ev#;}(gZd4QgdNTf{r%Y@`jKQJdc@WKf_ zMv@u~p}so^^Ox$iXCHyDlCTOGZ2SA9HtKcrmiss!)I`bWV~}}vzZDp3P4ytgF+tbC znQHZSS(Rxv0K+sn_VGR8;o!dS1D_`C5)snV0;10KskGeW3TFCC@=}W{x zyc&n%FlDu79t%#JW=^fB`94`#9{6O47b<`bPW6a#WN{hZ-Wd2w`NOYfIi$VGnH+x6 zFnI*38ef6CAMxygA-IQHlI7+3^wJL|hf`z>kh{Sg$C=xA5@hPfE)!kWb&Ob)V>Zx ziimec%H(i7mE|y<*~<0X+v^kb2lN<*w*CG=8K~BJO9NI=%eKPL((j1DRnS zq*qKUAsZQ0+&>adzum$oGPZp&sTJQ#Cg+HYO5Sh#Qk z{PT-GvY`zRg~^Fu%$Ms5(-(|5#8rejZ+|9!?zEua9eR0>;KaPcnB0$`(9i(q0EJMd zw}WYPB*_v)VN{C4Q>b*rGBk#D-y9p@bFLL%yYrKO4kgcc@NW)uz<{Y?u?Aa08_W&( zM}fJH(4&+FD@4G;7CHyk6j^hvyHi@P_L`@Quf=&sM8-z_3A7? z1y!6PPHEW?ZeMHm$;)7ff|EEWfj^gr2O@`aQ*|c83Irczg#Ce@57K|N+2yQobZC`* zc?`dCo_6V`(yYxZczF9>yvHL{Uduz3qO8WBGjSpTHqj8%QE5Qz5WA?ano4923nH*r z2!axb;8M-S+XCvxSEWTuf$IdOFz+9UXG`gTEE_OLI^y+9;w5s*9Eg&Y_WKF1d@K?{WbtVLiz;!BHzD|OI+ClOW&BdI7l*@%mNyZp-TID8$&9A^WlJd4K)(MF`A;c>X{v>iEo%X~#H5nI zhRAF@!R9wsP3<0ctxA=C+A#D;WDhp_p|T5Wy4kt-j=ia zfO5l5h@Vl-peP<6g#;l{0Kt|_u@6Q3rpHZLrn7Y%4#VA$NnIim596e}(BZyx zq(b}!7m({doU~!EJPsMN+fQ%{&M59Tn!0+qpN~3{oJGce@c3@hw1|P;(h&BM)yheO z9k3Q_{F)Hrb&PbH(KT3;85f)&G0m{QFFj`^%}x14vJ72|QM?zq56 z6L8S0?Nvs8&wQW5)&{OvCGN>3ncTWp1hr)<1zMxdtS+*P^9EMvOfui1kC$$#^>?$2 z`RS*I>G;F78*(@ZLX1VyUg_lW)t+ZSlY-cLH!fofk%qK_8}#EDH(YlX+<9k=WyP+c@S_? z+DS1U81RF zNjLtqyL$;gSr^*VY`1?U2MXDi4oY0oOV}He?t1IKn2x&M> z<7;pol(}9VeBVWZHlC}g@&^|bK+62d&G$lOBo59k{h)VE*$5ZHm*+%UC}jJvR3em} zHze<|BSNfyZk99K!4IHwDwU?yERalSv3cj!;9CRD9r9nk`|49+7s&2o5x3Ih%l&t;$4rR zH?8BmcN-+5Mpqq3dAR zyG8Lcn%*h1&5-dzJ7d{6J>O^BtZ~`QTt$3N6cxQq{qFoB%O6p+zLOvHuNNF2i2Q*| zU`8KU{=E*TH#{#r?;S`VM4yBXKi`l#Ge3p0KZ8D#et(ocAQQ}w2*;iTo&**l5ie-a z!$u9Dg$}50k3YWfJDgK%JkvV737m`T92rU=@^di?isQ|EMVVpxKkq1Rfvkip0Mx}-~1RKaW+TYFCB-$^Fs5$ zIY%jZ2|;4ji!EA|fAkL38&|uS)WDN2yHhm{<_Sy8sf>|TB@?CK+hb3X;GA5hr_?Kr z{<_7D4?&b*mH2pz?0msp^P5t*RRh*P|oK-=&6Klh`(D+rzWO zv?_7uVamADLtvU$*&0LF<1BqgJ)+m6nGLTA_8 zc3o|sFwhMuN%ROGoPAz)bk$x!fUM`c>?`kShiN%=@~l|#UVSy_mog}mArO{eE4aV?w63+ve#gv(jt<+;AhiQgw2n^LVY^{zLc{+==QL zvdWDDCgy3U-w|2aH&IjPrQPHIiQS2_Qa^KTTHw`J5ssp}!A=HNtl`65u^;Gxztxt1 zW#b{_)Yq}7pVB^aT3zGz_HJ`rt7go3%1%$vK2yN=Pm6Cs4#9=lcOlNwWJxsK)q5FW>D`*t$C6^wa-uRmh2()6EB zyXwj%T`lTO1LeAk03q&O&Epwj-0k)*7RwSQ;piH z)9v1Y@|DRF47YM0wFE&rq%BGuXkCzAK?RpV;f2SE@ zY$stj8?ql4aIlkX_stj$2=Uwlby$X z%k1^>LJT1#&HceCq}{g`ktypoIPVM`jbc<{jAyx&KDRf_jT1$SmPo_zSl`Sn@lFHv z5;u`Y15WRYX-9Wjd23zoH>zP>Q@ZvAu~q5;4zgd)S{DJ~GqrmYCRk%;TBR&qik!N4~!E1I`KPtsMdc#UE{@jH7OehoVx1u1XE^#H4Vo>eZ#A{1H<>>A~` z-|0<6{T^JMJ#%|^QueB5X7FnJq*}Tx?ytFMLy@ldcfjLV-QngL2rbk7WQpt zVhBFnWIvX7jlhMVZ6_gSXV2_~I8r(hq@_s#NaB7B+;nlHY$^^Q?R)RuDJL* zHC1)0 z{b9R=LX>6F4DR=RJBo-N{|qM+MUFB%gr+t1i2+?Z7P#G}Ab?~krN?&ghl$64zVm@y-GkdG?2QCx*bV5Q5AuE z0=>3zF`xa7Jc;LX4^MK2#Q?h4?a1woTZa|*FS-W~wp|*hV+I_4Px%1c)*t-d)K50N z-_-_x9MvD)UBHU*kPy=5D`o0s2KQ;ymr`OqDmRHS?-ubCe^8f0D-qc}AyWErwdv) zuG}@$$BefHDhKQ&OyOH!(2hq1cdf*!X2KanM9h{!6e4tqmdO`$`K}$;8YdJ?V0ais zbAK-|6PM0Xv>7E8oG^9pT#5n%B#M;s$@?*NjU#D0e#m_5 zDCsyqD%stM)5Y324mK_@P(gT|Gf?m9Bh$JJLzbr9vl6|eU>h0^T9|NZ`}kwDYq=<= zuKgs4v0Sqi>XJ5_;^6}2%97k)6u*c~Si8)eCI-u;ZBe#)Q@~;|l^UN=^_Y}9pW*gn zaNefKxqK{!1QDaZOa}L z0iO;V^_`%Ts4w2ntF5Lvi3g$s0bBl6i2aFiV_Bv+&VA#us)3r#nu*T`fYQ-igSb3O z+1-f&o$8J6mv(JX798$5xuskl1f@SIhoGgD0M|YQn67M%*Zh6JCT_swiB}tmiGKk1 z6bAaBt>+lg)S<4&TEjWebID_x-0ON>vKfG12PjL=N?;1&oP`%hPw~aL|BBgC06QcUU*QuXM;xB7Y5bt<6 zg+ToxdXhXmVyUAk;nqb;buWNV^E9XgG_T*qGbmRFv>a%>hOX)1JS6#2Z0tBF>ExUv z><3U^apO!=H6@CTA&$JpWCvIJ}+)20g!%J1&-qR>fF`R0y@;_W^PEOT|kDsStVro;{+zUE_Bx>&Q7sxOjNs(Tsyp7Akg1 zBW&ZOBR_}8z?jdogMsjuf)}Wn�E%?w3`RUD7L;wFI04-yqaARdE7zVVnaVxNZm^ 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
7giz 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 E2Xx=5k^lez literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/commands/CloneDisguiseCommand.class b/target/classes/me/libraryaddict/disguise/commands/CloneDisguiseCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..ff71eb005e6c7c11ac8ee35b228cfc37c15aceb5 GIT binary patch literal 4086 zcmd5;TXPi075-XUX=YbL0D-{5SPX_B2^p>JIBTPoAwtNuY=ImWuqEHp+HI`{?anMS zvw-4+#IX}Q&ix+QjuUdzi(ldg8Ip>t{E|xLF~1>IuF7kk6Y}-!EE-ky+%=yw^lBJSU46`LCDA%1pWs6?5D&10$9j|z< zIv$J18&U%)f!rM&J|=_KvjUx?j_ZU+1lk7%&kCf*y^_kH9cc?4=oHvI<+$o(y*j7- z({iq&1iGiZqO6>izN6Q%FcmI1fxzLZJFsITC-MSm&y772m>-z({Bm}#zPRXwP4~0$ z?}Bnm%Fo|sM}F#@ydbj`>6WvF(0AN&{<-y{!Pzcs#Wn-o0`@0eXJI>f1dOr@Ps%F8 zuzg@~y-E{1xo3R(WMO)0B7 z@rb~Frd!ZVvS7G5yD=&1Y}1-YEaWjNuxUXCPb6egll^cN>xr!=|D<720udWj4(ahh7rxQniL(Y3u=$Pn56CRkOb`t3vZSy^#Pu{^M)uk8ND zWl@Z($_@MN{^LpW*4B+#ba#IS&w{Bj!&uz9*h~@GW}Re2pTqNngt8_14ZIpr z!!5-f_DrL6K5{2rI3jbMg)94n3>J80UcV#K1(qHe)-`$`{ZDE}ZRzeVt?Mt7^m^ zbC=ds1r1%klA*FMI+cn&r)<7_9CE6{4(!>IvRXwhDW4@bmg(la-mGBQ#Loo!ZoE39 z?q|1@XcNn%+JFwo+ZNu@0qKZi@h*G8bX4_a#l)|;ZICHYl{NA=0YQ@`(Ss!UkR*EX zWAdH#+y8&qKn4`Nx?fa}Ir=r+8^h~)=7cAp#OZ}gI|UTo%|YHWjP9t9S1*v z`3Fwgkl|PV1~#LMU#qc!<0h^IK1F$Sxa}JESrm;AUBebujUB7FYZ>;?pU^k+0qpm& zcNP8JL#sHniuoD zG4!~K@|y0*-6}O+g|~`&_oamL74)@i{9@v7>OF?GJqrD0?BRSH!@QjhrUygVi5%|2 zVZM(>u?t6WH%{}({vz&S^X+3V-GfW8@iH;K%vAUm_TjtOkGJ{WeisLD1^u{&0er;q zFVy%~p8q@U!@qGz?7*<-SkGQL8R=-F5C zislq&U&E_N(ZYY?HGG}y8pX#r!C5D*{RgHwGiY;&Z}5bP*LlNbbPZjn#g+kKV5@;Q z4D=d!QwZ{rk~e|tbasQ^+!t@?=-#~fIz8NAQ&UIVb&InYm}fpiU&C6aD?t0MU|t^cf5wmZkXJJijS8VD$cIp*L3bT+||foE%_}a0>7iI H4Zr^{rz&-q literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/commands/DisguiseCommand.class b/target/classes/me/libraryaddict/disguise/commands/DisguiseCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..326bf8d43c712ce0a53b2b3b41cdf9ee110939e9 GIT binary patch literal 4904 zcmd5=X;&N98GbGZM!+~uaEy)P*z%UJ7~~{w7K;#r0Gk>EF6&h&>5`^xy0}Z6Mz)hSjk_dm+7IG9{Brq7jT#2~PX`>BU>Ml<)l?{eSg z-7fF^`?WU!?8QGc)Ck<2Gvbz+a-=gaGZ{1O#WSXxEtswmPusbi%xB#AfWML~FKCDe z+`9_Ce(4%jyaM$-X5RFA1!~*cj|)VScE)H#EgE#xpro0V!eQtHM~)oqX%wnYhNxh ziVfV892=b&8yRdwD{j-UN#N#cb98LR?ex3xL_u0~+4{DStg+N7Bkd*HCpByp*ig;e zUob76zY$x|(17jOsbL4r2^}CgBfX?;*^Z7~xPz!385|I32|KK^C86ZB>1am>?UA#y zbgn?xO7?_IEIZY=BoW1Kf$o!bA(oT#vApfY3a$}T!4UJ~H8$>Y*T8x zmD+ffHXpC$&JDCF&bxHnt>B1yc6q--a<7i};a-6zmuEO^xUS3+rzNfpgdcB&!2LQN zz&?SSi0QcDz|jnI`b$DrBw@ zqh+5j(b9gM^a|>PH$Q7E)(9H5AN?Bo1P-qvHCHGRJA-r`SEm|0n>J=W`btMqq0mSN z`u=XfAP#64S{n27u4m+Q9Kp`>9PK=W!x}~e)-6VTNZTmJ zSd3=N95Q|Ss3X&ac%vV!Rnppt^23&{h9AiB&U6tlz)8m$$ zH=KzXdoJIXvd>g%XQ@_BHsS)|O)q^`^$*j+q z(D0Z*?`kcWE30$kBjy>FMqh}ADS9$gMU1>>dh_wJ1DfzSq>hw=TjdL#HcQVaA2lL_ zX${2Tp4D0qvRy}3y0Ne*>FY+oTGFSvVS=5ZHBX8-qaT8z0u;f>F9AfbOW>XITPcOOn`k&|t|= zi5t&KW!4Ft(J`maxz=<81BUa*TqBBkropH^7YmHY#H1UOF~#&@9Z%vT<#u$Gxz1vC z1ECY>QJl=VkKri|A7|gbwrc_tmev);uj3P?65!cK2#y*CqWBa8X-Jxuk%@VB#r(4M zY%;1mt7zXIZb*KksOs^|vUHC9X!CWpa&)M(WXd2u&C6O8i4o~!S=869P+i$Tf|GIT zx^V;rYK*fCi|cUu=W^q#ud1}!FOQ`Grc(d7zGlK>*<-IMOi89Y&Fna3n=GC^;d63!v^asX!G~QJ%udU5EQ*(z)~X+1Z#L6;aJ*o-xM)8`!)tnG5#m)f|E9e*aO&@1Kj*7)U8SjK^xBJ4JTSoe!M=$SNL)gkudK-6d$1&`{W7vr)+yMi3aAV}a1T zfIWB{ci|mg)BeT(YbZ1xMT7FVkA`~tG(J;8=qh=ird?|7bNGA-?yL9$oLwcy4sj)!$QL@S}(S?9V~(YX1F-a{dt7 ztnwyOLchC&Q4c-&AaU-+K0HK^_j118&+)pC_$2Wn2Jk8`c>lzK((aD3Q!0pFsUUg< zm+?osuO5HLpYUg5_!nwwDPgQ=Z&he-lcuoaznk90(;8mcy@|BHa-{};WBe$JpbfQ@ GB>n@RP_kqI literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/commands/DisguiseViewSelf.class b/target/classes/me/libraryaddict/disguise/commands/DisguiseViewSelf.class new file mode 100644 index 0000000000000000000000000000000000000000..00ef1334812cc00d4776172032ca48638de20372 GIT binary patch literal 1794 zcmbVNOLx;o6#gc*BF7OVBq0!<3guzPP1KZ99)|ERCZ#xb8mDQKo-W4rScu3{st1rw z4}XJS&AJtEr>A#hnJ6T9(antJ&b@cO@7`}lfB*aYp8&qXMivv89mX7t z48F)>9$%`soP~nfA=XyxSM1|atUTdQxnXn1H0pt8IcD*v{igf|5%!~G4Cnf!iw|T_WBd%K`nVGp z#pVrR%R21?LRICSNp%`O01^S(viY{~7)~Tl5KdqP+s1OVNBIxc1K!+R;#*Pasj&>% zx*K{;@xYS(Ir?#Z=OhjdlQ^cLtlAXxUV26^}Gj zu%w}i8pGVW8|odttvha@hrZBdyeQrv*r$>2!X1ZK79;cN-Gox9Vc?zA%#E0kU61&_prW0lVoBR) lI8XWI*9BZenljdK2|4;*<;j{ws_+lyRm{l90$B#|`F|3v;3fb7 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/commands/EntityDisguiseCommand.class b/target/classes/me/libraryaddict/disguise/commands/EntityDisguiseCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..7b957cc8e2c060633acd48d693266a683f319419 GIT binary patch literal 4833 zcmd5=X?Gh}8Gf!Udt_zOCT`<2E90h3yu?vyvtbz%Z%IuYJF$~M(iU?ijpd0)GwRGJ zjiFGsLfQ8vr7We;1_(<7Rg$(WW%~eM$p7h~JXadYV_9)sK5=}`%;?_xZqK`3|MNeu z{t>`_{9Qwnz~Q`^w5_x!y+xVLTA3i3wftPs^37z%&F7_)^^;>xU*!h#i40Z4}1Gp3U@z0@iv zQWF>CMVYjvlS|G7p5^3HkE~qkKEDndahHa60psn&>9`x41hkwPOv*fQxVx)+CCfNA z^UTQ9SOQzHO~Y1!4fX2i*p3}U-+a6%Z34HcE5d6keZkBGsqXU{-X*ZPo_4rs z*|a}_ooH*ry|_=qE~*nTU}RnfBd+awI_}4A`gVG3RG=dYSnWtk@#)ghjUMVF3k8BJ z(AP+xh>8_ZLrqd~>=oE|&Mg{wxo9|UU=)4RP$6N2v1`nEZk{V97aZTU%}ynDpAws_ zlNS1GCAd{-it^n$9#rm#2X5uO^5lLU2XIheolhH1n7%J_^wTnEtIW?Pz?9SR9`p;` zL7$#9y}af77PS*Nw1(&l^(zLJoqSmO^Cx71Pzns_crTbw>kHCb$~S>0*TAzuj8-sT zCZ&6oB&*hpV6kBO$!fM!u_GAPFeGqd4GG$yP~2B#by8V1b}3^P0%E0OM0p`W07Jan zFot6qjxLY+ML#g}Iv&P2gV8Mp^h(7r%T1nSdIt21Df86xI8JDo5ZJvG_0#5@&3v#f zno|YSlS*zxfk{lUN);+hWM<*CCo}Z=Jz)UX3FxNdPhm#Gw7{O*Los2c{i?;jj?*~9 zsG^bMjvq)z@$Y5!uaTZsox%rnd=Tdqd#4XWqK=n*`o;ZcE}+sm$} z((xh83T*Vvpt@D5zyimjSstdwDpqB~##0wu-Dl&F0-e)VZay$Fwv|~hq+ynOm0>yM ztar>yfssH4rUsUmuD4fz#C7JZoQ^r??Y$0H4NtS$Di4fQCc-n7#&>uP9j8%y;TYI9W91wf6jg@3@jtN{ zSOveTf0n0DIr3NPGZ0xC@;teys$sYoo$m&tGvBbw5koquLH?Y-}=)?+c_x=3SSQ zk6fxN9C;kWYg8GRSD(%}eju<-%}^QXg!7YG!)~8 z!_NeEsVI>JnVGNL8aT~Fhu||DR@ly7!WE{_1=n&ou0$>8%vkQUt`h~bIy0?I#5jJz z+%MR2QH`Tl@oNpgBE$_~)A1WM@5Whp18F&a951sH*RD8Wv#4+~2GoE(7{~7f?yo;G zQ1zM$mqBA-Sf&?w^c4X;>$#j>v$GawjX16|jpn3nbM~K2+iqqdj++95EBS>~z>&6|9LnF5IeUsVPQT6fiVH2Iq z<7Qr&!6$P7t$b?ymE>FS-O_U%@t670gan^z8@v{*<5RC3;CnrPapcFHe3DqaPDYB! zmEN1!z;@G7!abK^^uC6j=dQ!JhRzc9wD*?KSHc4~@lX?DS9^N5#Co`NsDxC1%S+hZ z-@2u>g!laecl4G&!gFf*8b(Waf9&cFoGjsNMaY(x63*92_%J2hK)Qta_62^bBl!}1 zezsp)CY;9i^4>DQkzT!L@R9KSBzKhE!`Q&*CfeA+nP@Y2xAEL|3}Oe4a#T76gH)Y3 z!-Db{c43y6!~%BX^Voyu`F;^yWy~H$o5Cf;OnrSEPnB`Jf=}R+L|LtU3ZE`JOkVrf%z6WUH_J_auK7dS82~ zA)gzO!z#36Wf$)&JLn<8xSx(ZfPNe#+y{`wA>?tG5clH+r0@#EN`amVC^dK9 zs=4zPUd3yKuND8o>-Ym5sQxk4!4-nYy+76V{>(k)IR1y|O+2IF>fWu~dxI-Y_zV78 M-VyX$GyVqgUo(oNx&QzG literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/commands/HelpDisguiseCommand$EnumHelp.class b/target/classes/me/libraryaddict/disguise/commands/HelpDisguiseCommand$EnumHelp.class new file mode 100644 index 0000000000000000000000000000000000000000..7af27153afcd08cd6afbfe945a466b264bc546f8 GIT binary patch literal 1897 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 Uu!ba^E}el=+-doUrD~G?7Z*p7NB{r; literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/commands/LibsDisguisesCommand.class b/target/classes/me/libraryaddict/disguise/commands/LibsDisguisesCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..fc906669c940c2dbe703f167627862ad21a995fe GIT binary patch literal 2401 zcmbVNTT>KA6#jZym~j~tSLEU?gC+u^yT%ZW!FXXoB`in)NdS%M*=d$`XJ^)#S=6dL zr}7ufLmuOcFUi9yNtIP8-}0AImCEVe0cH`XR34@;=X`xGU!T+S*FV3%1u%l=DV)NH zhEG#SVB`QUm9jdgV_wY*I_~RO)bO>2Z!|11v|W>~46ie^3=S@rEuZ_(xoyirn6+h4tja)S3tqX* zT|3C;r4@`v(jeE6jxrqZ+-SqFI+*wTV%DmbN;2F$nT^!*!nK7zx({MB|Cq1yti#=6 zc0Tl_TO3_^Uo^B#Ne6Xf45#-o7da$m3T2zD2Uqt)S-a1>AP1wpKGzeqeC*(Dr? zj`@%mO4Ga&k(!$Ks(wM-mWuYi-Dt}w7Y0o9GxY3qH&&Gn5v5_-zzQB1c!+Nawm>&! z2Etz#zDX;;>bgXbsnm~D)Y2LV%&q$|*E1TvGr(a{fK4%IC>XFIG^`pZVoifI@E9eA zbEfs&bmC=j-Yj$JhV%(rDQEb)w5Kj+QVh%Y17WJ72{ucGf)b9$Z8P+?R%^m6cflLt4!OTN=MaW#(;y8hOz+{9z$1?lT5>jfeM~bAvAUxd;pn4t1^1xn}cR=a-$kC$kgSwM0aofbhrOfwwajTHK!bgc1UR`_KZG+ghBqbE65t(!4) ziYHa>1d~PA^F@va&D@c_h(FvUh#S zw?AQG_zxtOUZdqVBx`6*x7DDfbsFB_KsvR7_5?OyFx1eYGzZmih=v+EH*h$Cm-wFS z{EYSCbb13v5_o~xzGTa#bXN^WU*PN;bl1?c?W9*Z>5CaizS>qEQ_ABp7rAK@XPD3xPhAa11}-IDRBve<3#iq?3xOkp>+R uRYVMiaIQ|@I}GDIaj#?-kRe}cmBmG(@MBu*NdAqxH%=ZS^d;IS@X5anilvwU literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/commands/PlayerDisguiseCommand.class b/target/classes/me/libraryaddict/disguise/commands/PlayerDisguiseCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..a9bd62a5ddcacf07d4c1d5856b569001e83243f6 GIT binary patch literal 5859 zcmd5=`F|W`9e&Kuw#OHJx^W>iUKufl!x~G9su(t%?Px5jdmY%o^JYnS_xa z)Dvk#pswFa>ggdpZ_00PGUSY!wm@tDJouPVinu_nmGwjt7_RTP@*}ZC;m{$|@f8sB zmIsV%%E-s(*b(nPs2|p2X+1j<8*uVwb|k)k`c%Wd2n5bjQHLc0i$@G+hmp^iwryHj z3bSb*JT#Q3792Aj+pOE8TlHK#f~7b|!7`F|xd<+*SdOTGV%j~KoHOpKeV>AJ1jWiq*J)w08D%3oHxjWoiq#T7e5yT!ghW zx}M8XhXT#@0j+FL95j+n+!HCFJCBoi81({c_gV!_&l}pXl~0(dl#$gOODouhCLy4C zSZ$HlHOlMOSKQ*6WA1me> zEVL>3R>QXS5n_31P=24YA&H7jDz3nl0%ywo9`1IP4qY)1T+9HAhM_Qs@=K-uvWAh8 zYO@QuTzXv7HQ(1Y-PXp8bXvZhQA5kQ9v{I~xLN_d^sIoGovw4JxCR|`9*JIevp~yC zQUy_AWF6BP_reLy+9j~OOV4I4M;kV?ql+*L4BbUIf^U(hc-aeB_ z<_K55MV#@RVaNQqNjDn6E(L=ETjvq#W(c_#`lNP9sd{co8aapYM#Yc>e1vB7&{<2} z?oqK9`{>zL!68~pBA8Ze2Sb`eyc&9j99@SS6kIQ`4T(xkCIrsCt$916`Ll@`XG%+@6cON4z&#RTputq(FVv21)D@bY<)CmA;G z#%C3LM&Pp9)#r0p9t7oi6`ynCm1FIs0j2wd@p&eS)nVMjNYtyF^iP@Md=eT3k-1d* z#09}*G-I}AqO4A4SfQ+(V=Ff;Nb3oMR;&x85igGuCVGB^?zm)zWI*y6J;${fvH}?` zrCos)!Q0FHhIcDjW30oyA?yn&u;KM%Mxe@|i*BFeq^Bc0Hvfb|2EBaYR&rAbf%B{o zgB3ij=~eM}PuE7<99;QQPe+GWe+MhywgBx8Srhb|w&P6(YR!1Nch;Tjw5+tDXF1tU zz84KR%wH_AU3L{bOaletS_P04+|Tl3z#PfyP9aZMd7{kID|Y)m#k7k3|3?9(s_1bQ z-^LR}E<*$Zm^Egky1j;wSoce;pyvIG-kqCLeO&ewPpWuIb`Fv5j-6W$T)VTUXImIg zGhO&3HJwEv^O#qN(!0MWaIP$2lX}*x`i&_cw_7zy^;s3qNvaDxfQ*EaWJf#X1zr?TDY%uRTx+z<~vcACYi}r=_Yif9^FE0fNt*ulN$Z*~6 zsYz>dzry$p1Hzp9+k8dKnA)zjb?S-n_Aq`Ypr-N`yR_5+lf`rxuM+;ldOFSG=RhKD zB@c!1M}aN>gSbbck0fHf-sw(xnpgFu_~n*CWdf1Q9& zq6{^BD*TG^E%;v0cpTveIjBN}Pq_>%!9qUO(gwa4@r!j2&ft@Ws~;dC?iPaM>tf^a9L_-lxCvb5ULPw*alXpRFTrW3obU#B!rX6Xm zI8wb~5^b$D(VAz_R6)IyTce@s4SdygR~$PTNV__y919&IeiSfi`Y*N!$s&5SUZW~yQVREsO-i`WG2ug59FSJGlA9a zFj{j0hXsnbWfHedKy@cWMcf{(iH0ZfZu$Lz30zYl*oUQHJo-_2w4v@3@{>D1S;VL1 z_YppPt=@;LDh_`^?w;S_&`}!wD30S{_G$9{0=uJ-3xi{5qRG#pv6s{6Q8e;DLlahF z1J1*hj9PJM=p?qT#|1cm3o*){7a6Q&LADNeq5(&E;wYL)vjvY5Yfs@~MzjsQ;ZnTF zp9?SJa=d~~_y>O+{ENR1SeuC&w2Cm=#9~|}qU_)6akXf{HDVLGMLQeoUi6AlcGkD> zeH%85+tDZPWjj5|_hW3JC1h_VSP4rHvU2oA+$&+s(U))^<&~o^<15l9IQlB?r^E_r z9L3iN>QS*958&%`gCk-UzQI+6GF0P197C8Kzv_)1ke)JUZYHN z61naa7AiA7`ar`81U?RRA&*MfHNsT4t z_(&phJtT1?u~J2<&*4w_GtnU}zf5AwT{}Lt_7|>64DcWEDcqsprKS~J`zvRv@HhP3 MT@f^AHT^*R7hJ2&O#lD@ literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/commands/RadiusDisguiseCommand.class b/target/classes/me/libraryaddict/disguise/commands/RadiusDisguiseCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..a95d53bf3436a8170d66bdc73890b2923be85d11 GIT binary patch literal 9422 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 Jq~hx#{|!J8bFKgY literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/commands/UndisguiseCommand.class b/target/classes/me/libraryaddict/disguise/commands/UndisguiseCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..e71d23e54efa20c22f8d591ecb06bc4241c98e72 GIT binary patch literal 1876 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 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/commands/UndisguiseRadiusCommand.class b/target/classes/me/libraryaddict/disguise/commands/UndisguiseRadiusCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..3ba456b69253bcdbc80fb296cc7b3099259c9827 GIT binary patch literal 2976 zcmbVOTX!4P75{kT~N&h;4xtZb^upKw^vFVmq!KOp~woA!;H9v_vuFPO!#}?S@F3n#VLwKjaTk7;!V?(NFy4X*oYpa!!p||KVLAm}S)9R>YBrljPg1P8j3AQL$+WRr54P=R>K7i^C>te ztHIUb=~&S5tOj30pdl1!E?bLJR?)5m0%BAkIb^$bcw8XSJK8tH$FNtF0-D zy!6jld54mYF|S}bGnQ|wbxoKE=WIF}8Y|1JW9NO#U$TltyAWoJc2KI=fy@@Xa@lf= zLH0?vE~~~Lt||tZlN~UW^zDK`XYber>!Ou)EVq=M4t?7#4fdTAh{;7N8+5tFf?Nn~ z&!vN85E-f@H*6NzG96ll`EhF@N}6~uqUYAa3(WS8d44IIuguTeVLjb!O+78$qVxwh zu^8MK^87}TIzm#qp&c#>>}qsZ6=rjhPMyWCq0?3`SFx&Nos&V7j=;V~548%fOIaXZ zC>I5GZ(_=DO^%h94so~q5+iK8MeZ6Zq?JHw+N<~l`IxQfu=_S}4k!Q&^x>j`1L)Oo z$-p9b=xwXW+=NcUa|WKr3j*5k>51vnV>u1KG4NZwD6nJIzDk3W726>e8eTH+GAhTa<-L==m&k zw67A{PIfeuz7+}My{dz?ueuy{Ls^nE*B2~5kX+uT!LSjUw+~xw0wh35h7(qq?BCwo zxABgzIZc(b>e4@3u^is4HI1!$)~K;$D+-i4+8`s#^`|Bq5dg#@U(xST0IJsk$Sb{a@sXJo%x6E0=r1Z;n5U@G3 z!JL}PU}%oop9K8H{CIV9)1Aq2QMT4G1X7`i4o_#5B(f7Tuo9Q*Iz)e4_h*Rp-@)Ny z%3`>OV+RsS&v7eKXh$n0_fpbT-G>2Wxl$I&zly_dSMxr{XPmlJ=5xfKN?aR{U!w#_ zLZiQUga0lxVF#r<`F)a({F~J4^macUh$5wKMoRHB=^^?#6nPS-G#uvY2p;ChGsQ;f zrx_4uGAn4}T~97Uy8<)w1@yDm(fkQg%V_B^ma%0STUXE;L*iPdqiqH4F}Aow|EGu@ zYDy=*`~a8x(~0=~*U|Alj;!0hjoUxLc6w4K(IRr&xyG&1@#u$|I-8W+4{>mvn=YCw z%`$d$>}=RtO(K3MnfVIo&ZgI^zZLA#u!1|-HMO+1g53gFkWsTe0$-u~sGim{A0c`5 z$N#4F&$0Ikv*XizH7TzC_@8y5dl;^hwb{|JuOaYNbg#3!vq77<#+p}gnk+WfpkbR0hd(oV^ff;f9d)8D#?gqLwJoX)0zeDU>9N0xCr)U<#<39mp C7X_>U literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/AnimalColor.class b/target/classes/me/libraryaddict/disguise/disguisetypes/AnimalColor.class new file mode 100644 index 0000000000000000000000000000000000000000..b4ed8680057ebb4d24c1cfc01476fca2830cb074 GIT binary patch literal 2288 zcmbVMTXz#x6#k|&nVh84^cbMf+H#XiFF?4o+*)cw329_{F;iM2Do)c726Dk%K=i>E z*Ya<;eDTEx928i(Wby1D@elam6T0_KRxL}PnzgdO`S$Gdo%8K|lHXtd@)E!#zKp@b zM{#_NPokKM;&vPp_%u#QpTh>zBG+sxoZw7}$sL7LjAexs<6VW*jDf-##(N598Sg8c zW2`7lGFBC)7;6gW8S4rc7#}EHWc*Cw5@SQ*GGkL=nz5xY!`P1Ep@GO%H$8vDz?54p zr7FQj!*4wHH#dV~E43Lk%k7|9+Ina`eo$(r(zT%KSLW-LdSlvvb=AF@VVV5$`V!Ik zLYg6)PZubg&1W)1<8CgyuzI^wYPq>ZS`l4LXERHyX#@6hKE0Hsl(mvuqNCU=H}fkl zaWkK}M%2r>YneQ$tuN$ODQy=ruDiTWiHClrT{2+gNbbm5noi;wIDc!0R&0@L8n`$* zwo?sjzP?E(>UV=$X{lY^C^c67jS6L=BEEdbKyK8%=RfpQ6~9(ad96lJD^HK@@W@HG zUi2$#ek0&rx?5Q_ze+nM|GSL=RW7w;bnG&>(`_R~o<0qrR&C}s4fJ^}zj%Mqf6zUF zJrmS|)~tcO|Kl~68(X7Ux9$eiYE>&eTI)=vDkiXwDc);CATXvAu! zSn29gf?j90In31B)tMc2ah7gz+^e@6#nSbFN2Ryj@KZc02k-LFdCtKjd~V>}4t^;P zGI;DDjjIlBV$H!azHo2_v;4H;-~>)OIK?5w;WURc9L{n$$6=Dg6o>O1E^xTW;Sz_- z9Hu$U;G}`XzgLVqL#-@U>NPUAdvt7D*OoW#m5MEDz|{6Z%~$+pb9!6Z)-8QgmDUYx zU)L?8(aoKqKbQ&nQ%uecvNwQ`>wJ_X6DAh{JJ!-C{lkZcQ*b3rmMNd5(> z1%lKCL23k@pohB*=ph~=aT_rn0}RX)J50!*cnISedS1bNLd?K5inhEnsXl}2-TFz= z;}!9wHU0vTSFpIg=Z*R-Wt>hG7LX$r!+W^VRrrdkBa}P-0=7Hx@`^b-GW;EeCPvO) zwg#?BAdn% zeG@QWBNl~e7<>LAjUK*n6xsd)X>+|ZJ~8|pYJB8p#C{~+F+?lrc^@@m5WN`M+KKJG zFU{qrJndw{lU1u^lCF2xYKoAX6&e2tu^+Z%JAFMQa-BX!x^fEZ_@J}c_(tr)DE|tp zkc^wU|2cY}!V%hM>0Y4;q5To<2-QO0vUN;oQs}Ozjtbo^bdS<~LI;HI)wV5kpU^=a zRYHe^zO7Y6=&;Zc9kYb)7kWU)b!YKG;fHjuj?4SQ!r#%3P6$6D{HX5J9ra_vkL!df zuSbQB>Hf|^$F=^AT$>>ruV95pc!fv^?G@}0Nv{wMvD+)C5CdL8Q)(Xp<%S3-IZO}> zv7dl$^+AH(5Qhnz5Jw35LL4JVgcv304>9gNg~3zrT>H+{BX~x0|C1)$)17SrAIb=C F{R4KQ*l+*< literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/Disguise$1.class b/target/classes/me/libraryaddict/disguise/disguisetypes/Disguise$1.class new file mode 100644 index 0000000000000000000000000000000000000000..a1bc40e3949c7a5bf82ac72c0d312a450a12fe58 GIT binary patch literal 8210 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 XB_#hEz^B!Z)OCO_tLxPb%X0n~hMuqy literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/DisguiseType$1.class b/target/classes/me/libraryaddict/disguise/disguisetypes/DisguiseType$1.class new file mode 100644 index 0000000000000000000000000000000000000000..f05c3af474a1eea43438a8a8b5a64692f557345a GIT binary patch literal 1309 zcmbW1%TE(g6vn@yrPG!{3O+!5p;R6|s2~p!1Pe1j!?ZPRfhdbQolanI=#ZHf!_GuE z?o9L#Fww-ViXp}rVq)C*M;Xtll&OhvLDKtu=XZMUxp!{w^yjZH`v8WagmD2~A++LR zh@wl3-6En4msxsPdRh8d`dO~9TxGe&a-C&>B_`sAh#>*f(d=Whtgk1vt>~r^wakK} zIXhahXzJx?(R9};rfVDq<()0Vjmih<9Fc&A)r5fHq;8odvpglh*Vn%+z&~pj>B|qZpHL3*!PhxjtrTrL|bf&Q|pGIn%I;isRUh zgxg#;!7|Bmhh>Uon&mD_oMnb(mPN*xfYD7O_Sad(YG-vARL?3_zwzjx04Y%_8P2Sw zxvt>~hC~cfpDsmmNu|cpQc70ha(*G5$r2vRE-I>$OQ&jymIvwNOhU;oCsZ{) zuVm=AUPNs|;+ro{YGJR>LKDO%*uBms>FZG&EMuvQl7qW7nb-X|f_!PkT% z1aT6l$lD2?!$%SD<1>W)ui;%ZeB_UB4}O389sG+`3=lSYC=v!d3=)bSh6sZmh6y8e z)lJNG~RZolgANesmdQ9Aw&<^jz)B#8$IN`7{UnoC|zrrT){nL z$#ZxJoxF%Gxa4I#!Bg^Qc!8JXukadg$lu~UcF8~C8@`kKs520#9@-vGQ`|tKlg1P} lRz#dZ@*k4o-2a6-pRIN~hx6oq`qKgiX@qI5R&qpwzX4S#EI|MO literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/DisguiseType.class b/target/classes/me/libraryaddict/disguise/disguisetypes/DisguiseType.class new file mode 100644 index 0000000000000000000000000000000000000000..eba30215489b254d433a0d809dbb2b6b2fed045a GIT binary patch literal 12757 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 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/FlagWatcher$1.class b/target/classes/me/libraryaddict/disguise/disguisetypes/FlagWatcher$1.class new file mode 100644 index 0000000000000000000000000000000000000000..09e8adfec79c97133b3286a36973fc19d8e47f28 GIT binary patch literal 952 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 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/MiscDisguise.class b/target/classes/me/libraryaddict/disguise/disguisetypes/MiscDisguise.class new file mode 100644 index 0000000000000000000000000000000000000000..6833c383c39a64a3e51e3f43b930658f1dc50482 GIT binary patch literal 13036 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 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/MobDisguise.class b/target/classes/me/libraryaddict/disguise/disguisetypes/MobDisguise.class new file mode 100644 index 0000000000000000000000000000000000000000..7da4f6f6a91cc22d9796ea40ffd724b16cf46929 GIT binary patch literal 8761 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 Ku~hwebDsmD->ZE9 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/PlayerDisguise$1.class b/target/classes/me/libraryaddict/disguise/disguisetypes/PlayerDisguise$1.class new file mode 100644 index 0000000000000000000000000000000000000000..58d8feba6b35491e93f747e97529f8b0de4dfc31 GIT binary patch literal 1918 zcmbVNTT>G;6#fFpN?8TP3*rs6Vq4UuND*DB7evRIqRen{#$%;j8`t z-yIcEM<0FgM>(FXt;mdYu${>!IZ3{J=j1!5KYo7x24DiWEp#wU)r8~Avf^ruS1Qtr zor=`ey42#&AYO}vcIJJ)Ce-c5Vmfc3i=qDsf5si32UX`m`HApi3*8Kb?J?`I^kpmw zuO!QQUWJdPFG^v!T8|jI;}xmXV??U7JwlV-zgW41aZLs?E;6{8c0sbs3|%u}Mf8AS zj|~gEQ|LsWjUMzfbY{$kzLE^Y{d%n|)FLnYf?+KCK};&v&$(AV#vY~hROCK zYvU-6G4ycH6I!Ro^9)bh4{(cUv=E4Eyf|UwB!(F*E#ie$888Ix#iRv?mJ&uppErfODi91w583wkJy=V$E1$8#?{7}oF zIw#_luws(u7DFjh+AQ1)v7&W1+rqs{qv~%{bM1RUAk>V{wH6w~R5d%P?E>rXH^r0w zZ91s+AVt<*8cosMSW>ys53q9|vG;AVXP>bpE9Ue&?5DX+XN+|K2dHN_h(isOmkpF+ z?mg@c9L~K#Ve~ulW;(i#;}7X`>J!c}yvBjwdoH}9JCog)Ovg5G+1%U-bMp|o>AQ|T ze55+FL7DQ2l=%hI_?j>|lrSqcm;gn%xJF#2=~Ndw3KroMY21P9xRKZfaT7B%GJYE` G==TfJJVpQj literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.class b/target/classes/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.class new file mode 100644 index 0000000000000000000000000000000000000000..0f1a12cd508bce006626a75dad83af9dfac3febe GIT binary patch literal 10303 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 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/RabbitType.class b/target/classes/me/libraryaddict/disguise/disguisetypes/RabbitType.class new file mode 100644 index 0000000000000000000000000000000000000000..c3ccb81885447248e45cc2eeeca11ae0a7147489 GIT binary patch literal 1793 zcmbVMU2_v<6n@_9W_PnJX$&PaAuUirl2nP*R+N^~Hl!qWNn$rGlkvjYd>9wgl*tD( zTzTV<@Y3*Fgh|^`$zl>UZLl_SxXqbF`emq-sj|;=bZDrC;9!=FE0SBU_S&E zH%)9}OUET0+a}`3ndH31N1ovh$J{oMU{8TT(Lj>zCkE!(?iyHNYa2Mn_Ktz`Y)b|% zur2GT2n4t7t=z7_ihbD1cD#De?LBmxO|LP?Hobm(==EF2m%+pPt$udTt=GLlmF{bt zzE{3m5>RiK?OOuYZqc^$d!KLbmr6AOy|Pu!74nXNR>@Z?`8`UwTPRlZl)z*HqDWB} z54P-mj#~X}x-PT_ZfDr)3tUU3r=(DGM@{Ny#`e0c((tg}>Q&u(hdjFEE`K3VNZI$? z2X40GcH3EJ(DSQ@2W_|N-9ln zX{wA8w^)V;Jc0A&VvU?7rUISFeBu_6#i5n3e6f943{DFQE{JR&5Jrc;xj zDHNZhz#H-JlE)fH;XPa-6hap7`wU-GbdY?PpF^{kUffVN z=9Aweu{6JYU5%?xp(nnB7FQpAqlh2=`a>|iBI#o?&BQ4pPa;e&Wzs-VaJd+fvVW0A zR+$`Ed1x%te;CRugmfrEoc@zI0{r-N^7sYf=6EZ!lzavwGygL}KM@`eM45D-BO&5A zLGu4oiN{-&;_{8ZMxyqZBFH7f>TUPAj>A}1Ve^d84K|Pxj@A(rI=Ed>|ZHM zoY83Z*&k&*w<8-<6B9$5+?R8nd!FZKQcbI9`_#6PHgA)H@Sn5{ zfvjnp?k2;Hzo;t2Dh!hQ&ZHWJbhBl1x93nKe^fYv*@iVZd^i+ZvwQ9ANYdG)-ca;T z&uJLDrl{fk?|qaMg;Wt1%|EN+F*am8VaSc3FI6nysfydUqhbQnDrPXvFnM)zB2R{~ zhSjl2+FUd?RD)9e$Y{7E|M~waVR$xtA>KEa8DhBXo9luyTO0JDtMqs9Z!HSl0L>&F zn2v}#kw-!ZbC?I+Iqgg`vl)P{2yq?aFfP>=bIw@0u~4OG<=>_2}|+M7(0g~ z@V;yK2wBt%6mDV3^HU)SB^Wp0rx%dpiKR0HK6>t9x~tZsRl~CX48c=`yp1AxoAI%4V7o|8AvvJZL@-5imTB$7J*;{2 PeX>zW2q__k$*sj-Ma^jS literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.class b/target/classes/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.class new file mode 100644 index 0000000000000000000000000000000000000000..71d7b52cfd509f4e8b746a5ec8df217963797bc8 GIT binary patch literal 3448 zcmbtWYf}?f7=BKO2_y>$f+E!#C@KVN?8R2a8^oy82$X~%ww7*^Ls$tLy1P+v+7JC1 z`UC72KeU}%ZJlYq_cwJqea`OY!gUy&%$%It`#$gGdEc}D{P*Wy06xWc5gfrp7|93% zm}tXc+-O4|QfhWHid(oH;cPOBFK|Z<=?Ly(DuQXusNqX>IvYU-Sv8weS90oLDvbG7 z+>7847Q(n6##do{EfC4-R!KV9^))G=O`4{(l4aetr7h4|H0)BL0%KeXxivbQelW+{~8futMrJ>7)X*gE}T82k*0>NaZNQ*kthAF42t9fZ< z^?aE--RVj}FXwd2P-}lP=qwv_@6x_)QGuZKGi7~US^~M@bj2zq^3|0U!%0ZfF`V^; zcQ`ikE+C;bAEAF|0D-CDt$}|h*oX&f>Z@)9T@o~BRiHiN=!KQL`kEinP(e2{lDCiV z7K-}u&|2VvF7Bm~afA>k)c2hoXln^6q8)Z_pyguF_a!+kfS zEZz zRb+D#nrI?0n7KVYznGm~OyyFu3)54n#fiD>V)k|_lUkffk1wQVGXi}(wJd=!%VWwd z{+?P9Y%KqdMw(TI1zHOg)6or+U3Ei+Pv;-Xf-^S4if&=U6gauFgS9A(&rGtD8+L6y zY0lZ?-TA%OP)*XsJ-;)ede{ud;A2yhn5*pwbQG3lVI^5Hm&$yl=-Bk$4cMHWv27YO zU#$*HE?LrE&RT4y>LKZE#5Gwdml-;;na~HT=4z#AEV+-E7x6*Akv1OZZF*S9YfYPy z;=j!!x!?f58IJHfB)}hw6zt#b>V2+Rs+?=wV`X#vfU8Nga0VQSzlMmvMPT7IT3#U- z{}l&bA@mE60vO`h!HY^bh#qvJ7bo47D~eM%&6QyJkN9d+t^q)MeDn{51%5~CeEer# z@|3AhBj6~av{5NK?5^8=MHE9Eqg16-p7B+F@2eb*|Arv7wgvDUC;UYufcf|vM4u_d zH_+73?gF;B*7qYsm>3lg@>^_(p*Y3yH0>R2GGMfBz$iY%Spp|0#Q-U{&fz29l54&t z(YkXTFL}>%EyPRU<%V0)y4GmjEp|X(*;C4?$PP5zy25FQ@qdB#W6u!|{)Ax5%VP?{ zbEca~0M0XdpED5`>C9ypF6Jq!!wvXOL>b>t_+=V!-DyM1zc?Q~I+1z*1)`UUD#EK<&>vsUHA8+2}#zu6?;>dSk)yhyoAyU^y~R@&U5 z<9D0lyB%%#s8F#oZ5!G=tJ9`yPqdjOZL*|Ij*-4c+APrC2Tca-N}Dkz$FoFddKB&Z zNYri;^(_u9boabQ@89uJmRb{Ay#(hG<{R3D64Pfi!S&S>+=nZOQM=F5E>5r39bY7v zg6nS(>p437gJ_G1Y)qPJ}Py!SGZ3 z1>Sh$4H{#N*ZwHuncbD5(xmPtlQ}c*Jm)=UXMg;6X7{;x!*VxUC-HR30`-_i!e5zGi?7iq$2yW-HI3t@dvUk{cVQ( zcICXR-NEx5m3t#nGbfA4-p5 z=iFJ(XhVr1@w;&hch8L*6~SOgZ>QOFeFn`g9GGC3voMbgbw_$-ULP=|sy=VLdCE@$ z_a<^!G_b&sIpTfpxV+tR%AJlYc-z7yED^KM-JaNg&5*SZ3YC9kC6#8y!ev~c0$Rea zDLq5p-WwC|*N;TQFO8p%mXw7x3+u|IRS#1~h=eEn(|T$u(G3fE*yM_~!h&>i6>JqP zY~Ut&psfgyo#-J@Z(4A0J5aZqyWHmtQ}(MpbrIMBgIVqLx()F}s?R?6=Y8E&J-`~d z(daJ#;xwZRL!&{_He&SBYH{Ne5+7+6gGr+qteT`uAxUvIRKcQHJ#kE9h8PTKWFl5M zh=Ejbh}m~AwD-{U4i$rRH`?K84N zEPqFCh*iZ5ZHCPGF=i%WGF-*A2((3N1&SB7A+G;jg!}}8K7p`Igq1T0 zcI2U|DkKj%DrPAtrcl(snlH63TZ@3cxSTcfV82iUOtxyTqns7rSUOg~=G HihI8RkjnqR literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..c72824debea61869027ff7b38be3c92be457d085 GIT binary patch literal 1809 zcma)++fNfg6vn@yrQ2>7XhG`*F9<57RaU`zs~2dcxKaf#!GyPIJJdC6mu$BX|0iRj z50&^}eD;qrp4}bma%pUuYew!X*R`a9vY^<_u!mF;a&cgvRDX}k^g6+{^p2ZdEE-joL!Vh_xg z={{m8WUGS$o=B0!xlM*>*=`6G5hOGWBgQaRHCy6E=R-|6Z+OiT4C7V1&aF-EnBH1$ zM%{O2o52{k>VG^aGQ|J7$FMLkw$}_pqAA>0ykT}oS0p=EQ89s&3QkZ@@A)p*E#7MC z70c$Xh73+ID7)P1i1lrT6WPjK^-xk#1;ZH)XE90Ih`s4$Gt6dNK$=0__R30t$12;F?f5c{1g3FW!3@KwuYm8lx*yhX1y>n{OV#D_8bd0m+6$Au zX=F9bVT$g7*ZXQoMIP4`Tw_T8>&9rgqA47&>3N1s)(DH0L4xIRL&HrE7B^dewT_x? zquH_@5i)j5MFDpd+&)mHWZRbDEw9R5ugX@qiVRYf0`6-lVv#|s1t+8{Bh z38O*NZ2y~Pl*Y5^jbll}GD@V7g7O^obIdsCX2%?P7g!}YAU%(g0Tdpt2P0qx-4DVY zY%@ywJ%;Hw&%m}AMkp(+P~8d1RbSg3r!Fd{_r**e|DDf!Gr=Y5BSQZoK!V=ro1>>f zt4A239}vsszajpG-iDykQ}uU8DRT@-T4#bRXc(atmrC zcX9eBCb~HHnf3yzR}~odiCT~=i3}GpB{@rylgXuGUva66*?r`ETD}YY(;-?WM9cJO z3s{u2qNJsBDJ8OxTRy1J#l6FzvmsEr2YS$x6#~Tx)L+qsV?hte>%j98De^p5bMYD9 zr^knVpQb6z_>{nRwdcEvGM*5JVFeY*D@$II{F?NI9RXgYfzF12$sRC?RXp{92A&-S mDg-3UjsSB6%=ZDVq3Q#lAEz+hN8vmH^*+ECQsKHk`i(z8plsFv literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..b6243f9be41a28bc305c7e787b75a84ca7b66835 GIT binary patch literal 2233 zcmb7_T~8ZF6o%jN*P3NX025M5oVKJNYp21GHeV%i8$(H)8jJ*WReH6yw`LP#N4pCV zH&OpWF7pd2Rk`U6L{(MwI=`u^`p$Y-Z<|F>Te4Slcen3u`c|*~-C#;XN}&9| zIW=eB>2(xCAamF0IeuB-hFLo+Yekj1RA>mKmiuj6M-n3j(#Qy$uQ@$?eQ&pEyIWSX zYYR-)`Yo&5uv|wztI3qV<9GrqXU=-E6H5ZwWBUZIpP3l$Ltvs~`$LCUyH?HZWIMFDN!>h9U~9|fkVsJ#`oq(flFz`K}bp-j|} z@dBTi)ktu?`PgpxOHsX=k|pE~T*iBpJH2Ch(kxU3(m`?o!SNW6N9)O&^;B6r=6LJ< zisjiGUCU=eD!3nkj}44tLSR&`KX9#m$3GCz9dC1||BNoMEgBzot!`Il^wuo*iS5z> z?`@OPW_7#J&@qn%4JCnd!|hiNd|O(yD3CKN(T&L!x-yT?4Bm(v0wYb%C|g)%MOJys zz-`=N0nDnF=x>Z;%r3BG;4bb3(Y^MH}haqUISveCXClZ|K}8mxk75z0gHjy0USE!($)y&HkR-vR55>Ii`ol zPF>1*X(2w~rjmSP0An2SX7N|!QyB?lz`4(J($%QIm$2Sdk_VKdilxV z9L|%GkiA!|1~bU0nc}#fe2vLNyz?h=hqyHR{3X( z)R$w`g&1`zMtvn#T@2Ncjq5RTGa}bi=?Qu8lyASVlPQ{YXV9B#L2u>{alL%$B}VhJ zKfNgbjBI}P`HM0m@~^>&o5j@c`uE9ky?%%<%BI{*Lx literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..ec163a8279768a707863f3f7e3db92a60f951d77 GIT binary patch literal 1053 zcma)4O-~b16g{^ybjmP*fKU~w)Gww*nZ%D(6(bN5OtlM4jktQ9KFh<>l9?%lr9Z)? zJ9lo_xT(e%NzW4jj_n!bBz_XAdJl>aHQ`G_y9E*Bg z`H@#wVWXo$+22IR2Qu`IMC9+vAoQLFLHp=cFSB40?hi|`*%XbWk&u3*S}Iy4Jao&$ z5^N;aN`)%HTyNK<4FjVNMvx{==3uSa>-gI{gRjq&1!7bcoeg2*F&z-9uqg@9D6k~L&z9Aw( z7;)ch>C4Ud{mIY{k7~Q!34FP!^sP<}zQ7ed1>{-V;8zWfOoB8=i?davcme6+@>gWO z@Gb?Lqa9aA8EIpT^SK@h4#qiSJSH&79E1y)O1PfI+(5RNF}`8Ci%Y*S)5TTu6GqGv zfd}(L?bAA6gEaMLIFETQZ)TutO1)^R&YuW6g`g_7#N0+f>N|9;#UW%9W}Z_yTC?mL|N2e#MJ|y@G6Cd88F@YFWk9v z(~TQ6#u(TBDC>R06l>B2%}Z|Hy*c-sd)|G&|9t-m;2!Q62r*Q4h0~X<5g+aIPDi#q zrz73&Sh`|<@%HzG>%8Y)yC+7jQ{~>P+1-H7uyJaFnw-c%H{f81JdgwFZ7|%oYm0Ji z1~XPl4F>(uup>-ph*=0DVuB%V!9s$;bcOen54xmBIJ>FfshS*!7vtTQ7`^1JzF^4I zhHc(&@R3w`P}IGibQvBlJktpeRAGo7JtxE6g{kKD7-G_$8_?`h)5J2)8OSpvcld-m zeRAhi_dQ|ZJXRQt3Ga_Z{VhY*u9j;5V=C%xE?T&R0!`KxUPFNyR_(20$a-r>w7tsl z=Afj+ix#fnDh<{m(V(9Ot1=|EJ>GuzobUNBsHARKScOeew1xnhJ5j2k&}9p2xap$@ zolWj>hOqr+OYO|)9W9YHX{+1A@u)2xOSQbzzyG+d+@eTS8vSrkBnCt%8k9Xjhz<}h zuYE3DsLl5#NPpE+2f88fus>@f$0xq||3VVwk&ViBQ3vJ^7F*eo7Wb(U(X LsEj(Qgxh}sUH9_k literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/BlazeWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/BlazeWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..8cb54bf964be26fdc99bed204d4d2e2e2150da82 GIT binary patch literal 977 zcmb7?OK;Oa6ot=C+_-T}8#iqNlvjDxNfDM1tO7wQ6;dUOEQ*2%t4T7XQ@IYZouKlY z*suu*A;g*=g}CFG5Q#2=ERE)l&;8Ds$IoA1zXN!PdnR&(C#TX2R4)?InHUUIKk)`C z9*$Kk=ab~@os7NrBIzH?DE9UP@j%S4cny7G?F$jgnDpW~}@W}O-WgTQG zoAnOCcs3eH3wac6te`+x_f;rgj8A(qdMSE=By9Mjz6d%ZQo7C-jpSIxgr`fpo_h#Q z!s?$xBRp6dHs1oFsA7Grd?*|>~t&Nq}vN9zf@?%{&C-8+%}q`BCiE$IkXZCryxuzNG>3}MAG zna4HQy`#Nu+PH<=?8SdGVf9?ERDIXRF5FZd4h}>j2rKTJLw%dnC0IwJanzU3mA*S? z@yXrSJH-wg=J^?eNA5&{N0X}-a{K{>#@=VFe&SgU7LQiCT4be#64%w43N|iq#d@q^ zof(8OoQ%~>*?`k1m-1h*F~!9ns7!I?BR9;j+7{fZk#;(FG9=+TZe*Y%w$-6(4BAdX qI}PKT^*UcJwWqlAH|1KorwV7>fgc5PcK7aT83Nh7h-WmbOqQg<9g{lqiQ1S*jF~Ls1aow28N_DD8yH0 zbr$X^p$Ys%!@gy2ZH&EAC zT6k%Ps#82-RgE7nc;|BDc{ljfLXH=ZuOEEH>KBf3JW4fAmA%QxHQeB+Izz$aoci*d zUuO>1!bZl`Ou2z_y=0Wj-*9V+tzW22asM+{%y^Y9BT`N?i)WmK?bM}mb;7zz-(sfS rlxU}}|0urKN=A2zCs#Jt(xxo7yU7-}7OYxxs}|}wU@5}W)W);F?K#^@6Uqisx@5HYF2h))AM(rLE4WOt$IfAYl_ zG{zX8{ZYoVm##EYgV|)V=gc?X<;?v2_4PY|$9Sk9#qjJ{7?$k2+&$%{DF?n`N^dxp zo=ATD(~leFbT+QXQGA^TL?(r+<5(c6o1?ZrNu z^)5qZ*D-~PH1ZmjkY!kDOIy4eANPg(hW9POu-bM8-0E^y26f!b_=nPCc)qae1!HJ3 z6n7t zzIIN88@N?H;V0HJW?gN}NLw#_~6bA~1T{eEz_iaZ+& z>qTOTvNB3M95`clAYRJgs>|o!=uR*g+$2wFdikISLgdKOs!-KJiasFQ*#3;%C;Cf4 zrBw~PIYQ=fiRwy(f`$TBgvT;gh=ZYsQq0vP1x91MoHdHQ rPEji}k*i7MDjL`(&kXnH325g9w0Qy>B(O>JwF?9u!~#3yIR)c4jU5Hr literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/DroppedItemWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/DroppedItemWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..9f862e2958790294bf8094d4f5533a17805fe1bf GIT binary patch literal 1044 zcma)5%Wl&^6g`u;i7}?7rcHU4K6u!vge4xUpl%u}MY7sOQBcKdVvpQu96PedMfoe( zq!J*+nvX(UCnkW3+St-)?)AOroO?X;1ebd(spo961!7+%Z^v>)-XY-Fgtma$a346kf&UVwHf zu;p|aw7nz{2CBGbVgWUVB~QlUARqKZ`j+=1!C-lb&!a9+Wf7N2O`XV$;mzEvm(1T{ z(0{we@O*B_*&qyNC{*F-k>Y-zVas;BBn{nO-tSB0%J@vgDoID~tfp1REr#{Wiwsy; zEqrN^QFh1a8eq6>;tuYTWTNcyC?|)W+8ytdpK&+hap)fQPKB>p&czhz%>L22ZC@pG z%DHahAvTDU+Dp#He>o=#w@hr~(WE*K+FWsl1^Ye8rzs?v#ISJ{ErW5CCC~u@6{4)B tzB9&yruNl1uIh(lZ2l3rI2mV!gshT)#$O_>nMezd@q{qx$4?a4zX0A^2|EA) literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/EnderCrystalWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/EnderCrystalWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..107a4b1898d28698a66f990117984d78534410c8 GIT binary patch literal 1581 zcmb7^?Nbs_6vm$m2uQ1f3RqUYl>(M)zGY#2Ky$_!CTehOvQHPd!P>Hy*;bAMFR*=0i}9mQeT*?ae#=lsrd?(XkD-+uyFLoNg#!%jn}x>h#1dCIF*tzxTH z&8oFDOLTAS)26W06K+@P!nD+vMpc;G=BZ_K{cUG6gaE^8ze>A0uX%|K!7a_u>>R^- zs?e{%jz^eHA20;AWmQDr$Do1%1Q|vOnjv1b8f9Vb^Rg}&MhmjS^#g8d&f41y*mccf z*zLRORR&}k!vB0@Sm|4{+X=&vCG5Q5jeTy`giRu;LPa)I`Zw#s&_1b6Q`)j3b@jyL z&89Pnye=yrUrS4~HEEC;5sV=o!Z^c}lUkFqrVB@*Aq}<6X{5!b6Uuc32_zYO@`G#q z5kKat&W)N{EFX!AolU#7uMo&az;Ii^9ZXW|gnq#F7FnH0?G-Mn5gEfh1@|%KMjO=~ zZgYl#)cZYWhT*2y1cQ3RuE{vEtJk=>)b;cXgC(tIaJyv^^#1i3TQ|hYkwIfvP>{kL z9dcf_gkd`_WE3po5w%Rzo@Wb}dUnyq&KW7y`bRf!%k2}kFpm=$2U->3_n2bM;|H4 zmRS+In)9YjT=H>Pa;Pvvz5D6A1A0km@Ced1M5`Qp^aFyK#cv3Ir8^%Ybd9*XQHqS= z7OfMVC@2`B6~$v1Bc#C)rHGE!8;W+c;+gQ`8AjWf$OL{w-uc7DHtwEF54#|743g+L zl0EYAu6!KRE;7R`=1BAb$@=inMc$x%Mr$P#KEr$)>0cQ8;y!o4oyLGkS5@i6d8!PL zvE-qaJk(?+8k{_X+GULfFN2*XKV}Gbwg)!Zg-v1|8zju|6q{awtOpsR0)DpuVJ^4v S?DK!5^F5@oF6ovV_2MrA&xgkV literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..b7b6201046f1da575bdfb54ee3e4d49f580211b3 GIT binary patch literal 996 zcmb7?-*3`T6vw}Zc7UaBFgB{rU-Q=rQ=1rl!tgR?LehxI7L4)fLa*g6tSoK8?0@pb z7c|BgpZ%kZr==pvjKMUyJ?Hd$KIeOH?~k8fz5#fOM+M{v2dB~*seUNJbK!Yv5IdfV z{E3R>B8bn=WaPXT@n9&!$T@O;zA$3_||73RK)8JhRW;!lpYOh*3|3D#^2=9uHMSI9z$^ zKaQeFDE>Y`!jqMei;ZxiUo!WoIccRE2VeHogl!6Fo< zVlW zD*1)h#ryX-*)eu`yv8>hymCMCycRfXA;%ApZ|r|U@gqk$7`z&3wZuvjCC+Pe6=#<@ zV?EZf!3;tfm5kL)*+8XHE@_{!Im4CjsLpWx12@dE$yjh>f;7{(k|7DVa61DX@z}(a u#h{%OwA;|X8gI06sXN2{KQ7nPJyqH57CYQta%wG{TBxJJV8VWC;|-~?L99@y*o!C0FdRu{(#ZrDzoSq6 z4}GvNk!8EOeD1I459#XaJ~Km%iiIu~aL$?U>~DYjyPQA&dG!Z?D|l|8OWVDyke<71eN>s$sVm!DiiVSkGlpUbFp%b=R%feoeZ|(Sd=4K>mND6xD`uoft!) zcUrkB$O~Le7x#)a6BEs4mIM-ayo#MfH~LNVpjY5PQMvYmX02rVi?UR;1r8RyvaBvi zU+H~(mR3gE^D4^l_aZSz8)ygl~ohRa9p6vBN&tQ25P?a z%q|DHOmPcp6Y9-cTrNC6Cwe&idvM$+5vAT^gUze?*S*PL;rSd7zReWOLn!v;! z%uRf%!!;Og(OwPo<{4PVxe0_7o#4NKq3};Ju0rBrEgn_TAS$HWF3@AvCOdbf7XENP|ZO+3`)*UuC!GS)&xpFT3NfJK26PiLCGEa^Ji3~PHq zx6P7?B9@sJ=0~TeUvUaF^b`;{xtn7u%?jkLUOmyZLkr)T_#Qt*4m)c#biig1kS0nf zvz8ca+^L))9SUvtJ%Rh!`eC^Xn5uEhaoC#;wZXaUKp9wjYeL=jys9l-J)xfIxwO*R zsPRX(f&-46nr?Qp6y1nfq)6zE3mx2wmR8_L6FxZ8$=I#TgtgU^eiBA5Rs@m@Uehnz zvr4}S!|%Lim-MW_I8nO!NCE~|d`|e+;4Y6Y{s6t%^Doi&D_31e@^3Oc-A~H{*vI`y zWCar`?r4ww{K9I-00v{Mzi8dVZ^i7uzQh&|ZsBkXCtl-7@q7!Xe#TY)JNp_#Eo8TF zY3@P`SE5~>%g>_awZw0jetbM}DDl%vaR_J0X%eHj&fR?+ z4Ow1^{KqT@IWlhHHrbu!Y`udS#xTiodKa_Q;yNSwf~y4X(T9#NvM;pl@AK?Se(Qty z8}|*~6s*;`INH0!(8{H<4C?`ZziQ#@cLh92D&rjjrrH9g@C_alN<*&1kT+sTBRkf; z1K4S*ex?J=XoDGe!bl>pw|VB|_;ya7zM;9FR^aQ>iwxh~Y>1wX z?zPc}V{~GLigktAuY@WJ*yI$|QjS=HXoJ}SvwI7xVe*|8)_>t)R93p|fQz9UGcu0d z2)OWKparH;OFK%Su@LBKHt~D%arb~Z-$MOe_LHoSDQ56;hc=^a_M>DN5LloY(%ASH DIBRd$ literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..b8dafebfabe917e5b242f61d72654cb23d0a6f9c GIT binary patch literal 2100 zcmcIl+fvg|6kVsK4b&hga#2)@S7_0Azi?4etX2y+QgQSxZDTnSS|>?$@E`mDf52yT zv^qXGKKbBBIj)l?6&S(FjMJIqWM}WS*IwCs_s7pKUjdxMJq;0onH9^hWx+9>RkKu* zMb9Wnw_KC1)jW8s&n(w?VS2?S%W;j2Y1^_=zHV2G%MTky4Q&EvTSdy)W;qBHh!qr$ zKr&Z#%0{8KyevIKR-RiGuj;HCS{ zB`bj_cIeR1F3^>e6>F}xQm~x7S+FgE-MMPfv=>cBs^`Gi<}FEAAk%Wzt+Zkx?V-d1 zXIjQ=Rzl5+cC|vXFSnyZ%L%tELaErRV>kK);k^6NVz(Gd3&B((ee+yK7qXklQ5M)?K4DkdGX-s&yi2;FFC`-FOHXp?h7vpoEjqHeLvV;V~-aV{)p;~i_Rz|A*IPiz6 zaW%zv4dYFvQPkIHpReZ-HA=FWVP@fE;|MNuyZqK{yjj+`{{;l@D)NZ-#Rt2m)vgYx Y9Sf-OQ`C{$SeWo36?K6*UL%;$vnUE`SWTS4naXvL?F99m z*suu*A;g-8LR>p0SfYy{OQX4?GvEDY#y@|3{SM$E?v;=uJUNw?rv`xt&ctx2oX8rg z(4DAIE+*00dl_0EMC6QQ5L&NBB8=Y5s}c%?&VM6pHC4WwG6==T%2!c`@W`~6W$mYy z?PiZqcrhMI4SB5USV57nVJlxAPEH3hcr6B=B-HG&BfOpnR9vTvg=nNg!qcU@o_h&x zLix|75gsfJTO5I)tMHlY1~LrQlx6c~v#((j7fZN6Fiyl&Sf21*>-l)>N#X0Lqd_Q5 zg*TDicZ9mxZ`%LF+8PL#bzH#~E4ni3#d*T6d5{Tr2Pe{r+S&c-Qmk-I$8{KNIGDFi z5o@80vc?4#=*8`Jblk#iZpVQ%TR*p5lD?~B7iN<7hx;NDgcbAcLHwrFCum3GN#Mwr zDt+Zb@Rg2; z!1Atb)|`@SxrbJz;*@=};&|1D-%x^5e{M>du^M1o}D~?rv9B$~)1Ty~{ zCGQ+K^{T=U=(+3E9X}(mn9QFPYefl7&lCl;dwUf-jwt#J#Ly#fI`7o&jmB=tcDJlj z%@#PD-z!_SqUAbrtu{6Px#J0BPt1Cp4{3qkmURL*PK?*Cg87cOWw}+`7l7{RE3eqhxa_U1Ezkz{Tr|DUjQ90FqoE+9d8A{S-6 zz;rU#5xiM?VVC`MXTI8!62=W&!h2F(y_HUNIe}9J-zx8{Tl>n&KF{`B`ZdZaO7d$4 zCNafq9x8H5?LrpB)_*`8Z9OO2f!$2YUVKLa;#Q=pG7JgixVwkt5-4J6-@8FHFoe7YZtxUJ&@f%C`3 z7`P+7>L7i__dW|0mh+_i}b!<}AQMuVe-IW;A-o#Q4?II9~d7}&xW>{5w4YF;>PS%FA> zkD{Lig+)s2u;6CAu-9@CnKdqPRN672`30)5H)M#2JP4fDD3Xqp3k7`UYp4IR6KRnz;A_ zV%n?dD;`Aya7hl{DG6+ZDGGQZh!Mlwyo@V+N{t1okn9pS5#U};X}`svL-> z4+JG9$Z?T^$2)|NwuO&k7IOra1n(Jac^F|4L+%|H7r_!OGRIG`N z^et>k=-X_EZ#@d1pKjb!)hv-&+NGyri6&N#>)s~vd{?=56Q*tR7 z;w4(TjA2%Dg}s`jMT=PFYAq0%3R&ACvq~hD;4z(uF#9^b#1l%E!ug}+EhdG$f!kb0 G@bn+jSjDyg literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/HorseWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/HorseWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..46b3323b7685771ed67e6e6cd6cbbd6c267ca83f GIT binary patch literal 5881 zcmb7I`+pQy75`3>&Fn6dunCd`LLmuIl1^cA|>&d(E`bH#Rb8WOoRC2zD|dWn&YSSl-xlO}gbKlGB2C&{~ z+M+DvBV^fv9u0R2cWNe^Fw=TU2khK(F8*+F}R7$4AZ6klK^%$%*7 zEh#kzgO0 zxgGk5kr08tqT#Ff8Vgbom=lROI;ndzjN|yGifMXJQY#3Qzc zY<7YvNx}lWq~t7du2I?wp4MSAJv1E>XBo@q73+*!L7_WK_S^g_2N;KWiwWj( zswNBUmK6}n9uDYEFE5`Vb)Pn*>P2gu)$lydk$-Z%gO@A?)iWoD+a)1(=>-jgxTs*E z7yXPKFK8ISMX`5MLk1TG0WWHJ&K{X2=ZJzjudyF8vNSG-_lQmbiYj;|G%_tGan+D5 zxIm7C>2?trj^kGvevRKKD9Z5Y;pJ{xGwxY(omOHyl#Gp;EO=ygM>=(J6A*5R@j}brDnA`S35xhP8f~6L zFgk_s1w{D!avoJJc`V^doxM^gS5}_q?jkhtcO`9sh4fa%`(-uPY7pg0mE#f3xP_nS z8@J*%##0c(Y8iJkZ56&-IE6LQNLld|*5|SDRcy$kz2zKVI3WZ~V2SNka}1^S5Dgw|As1T+z1T)K!rfNsZj>1bcMY{qAy}(EgFx{{ zVyv|>_C-rBg?AT6%KG!zF5(p1TvX8pxEUcdaxz58N;5gX#S^o^joHAMyBO;pT9Eya zh)x~J=v|VTMPxo2DWAbi1^#>FDt1J&}Wm@sc35^XD83uG11NMuItXSnDU#THN66>i#}LzcU8_Fl_Y z_y*~)EE<_Vg)v)Y${Bf&`=nVs8CkGblaAM-Ph_?YkUHGk00yw1mbpRf5BUGo+RJ{YaQQ6Kw+$3Ezy z|B`F(Nxt33-1L}FC;w&Fe6uoR4*pxF^ZF-No3Vm&&4( zc)0e+2?R>c6pQLP{ostN!?qJ=3Kqmf6MWs(J|#Ynet0dCem$z!sQO22l^)OIvDwPF z-ve-3^-thQ>8PDZ1i&EMr*;zGo;?YVu_qq%;49RJ7I+HZqZb9=_wyF?^Y#$EJ$wys zKak$|f4jtH$hq3Y4&tExp_pczNhkC8Q6zZy=#24NUKp=V%a=1PkiaE)gzk=eLN>`7 zgJbx|c!r^h#AQ#0Jj;;ckm`s=X7aje$q6jr;!U+jAGP`JJB>>FbJ4LQaz##htpLTT z@lt!LJjO3=9_N&Qg6GPUSjmuU$zMBj7IQD^1a+Zx$l8m+`z-eq(Rwvb;WX0{rvSe< z`w%OYa-#l;ANh5DLWC8%yGZfm}RCKmYTeYak~`BMm%w4Fu`pMSyU0G~BJ=T9L} z+7?}s$JF#Gx}IGE`Yxi^Qk>;U`aEwL=lKQK1>P?%^82V4c+TXp9FxTLBG1=LSc6w= zj1K25F2)wTgqMk}h)iE1+9Gfi7L@KS$;Z$+EF;o|i)eY+pr zx2Tl2J>I-Z`JIIOrt599%wCPEe$L)uW&Z4ORv6Jj#lM%%_`RXb-P`l*^|xf(Qyn+h z^Y5|e-)GN%;0fvN`9I)~HXDEP!5{F${}1B-r^lHW|2sDRBIYOV8h^oG`FAntsK>i_ UzkLxE^e#T&-xmJ;Tl=E_0X-Sd*#H0l literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/ItemFrameWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/ItemFrameWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..6cf31d4271a99a2c5d744fc3f0d9f9defa48cc17 GIT binary patch literal 1526 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 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/MinecartWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/MinecartWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..cd317483bf874aaa024463c8981aa7b219122c5b GIT binary patch literal 2070 zcma)6T~`}b6x}xo1g296l!BDcQd=gWkbY1_1K0whqiLfJ#sxl2k|Dh%Ou8l$Dt&PI zAM|JVpf9OQT`r&fQEm5~nS=zYWwDstd*|G}_u1#1`S;Zye*;)XA&!W^{X;ull||Qb zkF9c9mb`RX)+-HJx7!Qv_?cZ#KexQn6Wgt)A4RjdQd9SMnKwzLsACcg~I1&O%_IVtX6aTIs-aHtDLsoRQ4d+)BFGI5?1A zS~^Fzb}c5Yu_ z)G(9TGhxIK7}s$H6U>1c3MyV;-Y`3YbH%52$;))!508|DDIL?8;dSY>u1Afe83kUy zj$=+>`v3FLa24;X%3WtK7^az5HI2x!fG}CyvgKJUY0ID8-2Q&ura?opUXb?lF4M@n zr(qH4IF`Cx*{Id3w&f^SZYeMJI&%qM(u+mh(Qy|G0(vpH5&AJe$}XmB#=EMMEU3gj z)Ul$>>8Ji3PLNqvryuLcU{&BEPq!MbRg_if9Scx@UR7jW$0xW?OGz6lVEx`w5puAB zb!=kGk9NvizFj@WccwoYlHDRO`!2C;z*dGWe`9PI7DCAGcX{Q#wq-waIsTr_DvdvG zIG#MT3$iXbTn`+l=2@PsIh?K04$UWb{I1LC_za(OG*ynL3mIdDNZx+F+ya6*ou8Nzzx|)xW9pUvKl-wxQcL{#7w9o!)U=i96IyKI_GzH;w*oEWUI_Fvor#ffWub`=*7*2noqi}^ zrV@$ofAqatOC_|JPqLQk`Agf4Ci-%_v4oau;=xH>uF!d4ig?qk(F`ViFE~(`^EIRb zo_3v9@F}*bqKEUVJX0Po`JO3{*lD4{JR?*ejM1}+P*2QP(cdi~D9?4m++b78`=mj0 zjI~L}VEW||_<{scd`Vy+%YWtjL;iNR-b53RPErh7Z-IhtcA)pR(Rpsr(G&WWv{UW6#xpG2?g?K(h?Rd+{7ZKOaC}MZWmn>dE7QoU|2ZQhJ|S?F%-1EGlA4yBRuX-!9E9EtZM;2FdG|C&K#uIrLJMw70uIIU>h>1j~3 zju_p*c&Ypa6Q5}ngGoa8I_(1IsDzNV{deuvEiQjp{2;kw8>nAuP&z-3lB9y7zo2fq`Pvu9~HG zt)?7v&2|a`@nzLe&WgZdt{4{nsh@jcdRrj+q*;+EbfL#U0^I`rMb(hc+q)%cZ&{_f z6c{Wv%T|5cvXwsj%BZuWS^|$lM?H%g7SSEBDKH-z@2CoaSh?P8Fwy<F^to$<=drmr_FRPB>WPS zbjcWqA+DXT8Muxc0zC{8kS?&yNMRdp%d+V!D}gt2zlrGtaso@|#W0Y^j6jmW&p2t$ zA*(!DymZy3_ty=1%fK8=ffSwm!4$av4~3lM{|*)snCIx7T|?VZb>%2-hM@MBfyUr= zS>(9c@{KK9J6pC@u5oh+JPO}Je-W#1v8N#qg7qWNyXg>k!`gG_R^R6X-KuG_u-RNCJn&3Oh(+c$we&hL>&q#fs6oJ8a%GLJK zx*xqfk9bz-<5@p(4B!GW*sw_ZSg&cLW2H6L(07Q9*?b2VJGe6Yo@x)c&og20Ap#7$ z;FG>C08jhiNv1KufDs1Zl=xvxeg*Mj`Hz_V0~~jiqb{J~8Ti=>Jv!9rdTRvJ^=9)k zpD@YvvK>tQz_2IH=HDTu#V@$6x#)7a7(|rv7`Yf{5)#gNA{2rVA`#Q4Np?)9Y!lhtRQf;p z;!6|}@!3C0JhNHTfPIK84Cl;#^ZUNJ{QCXv2Y`pTS3ri~9Vs`^{ZNJ{()aZsc6}WU zCpuE|B0l+`BKM<=2L~#Q+}C>ec2*aVBRu_Yz_X!}{XnG3E0m$Z0JL+f74y zjV>YgV(cpmS(F4;kSCN|dZb=Wj`}KmW2^|()_5R;t_-#5)5%@A4f{X;c~y~XwEl!O7`mVqhoJ2kHcV#RIE6)C&xl8I1tj>564%AC+ZmxX# z-tL=yVuS6n{DQ$FuS1^40(U#e@CW3Z+h0)p%vA;!k5)2UWMv8GxUbDr5ID~r>#>S5 zGYA#fDa%XPfZeQ!>{nE$xbzciQ(XPT3uahj3x*h^NNPJp5^msT3hJ<}2~}s%dIH*L o=Du6+vK7&u;?8Nx)nrcO#``JZYU1HW*B3CNZ}E0Nw=VN&o-= literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/PlayerWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/PlayerWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..c0de0b9e070a898284fdaa41dc30888c172c4116 GIT binary patch literal 7901 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 KW>^cDy!Z>ssiHdo literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..a30ccd661f05add19e574868fce109ce87b9aaa4 GIT binary patch literal 1939 zcmbW2T~8B16o%jF2i0W@EutdeH^R24i$WDe#1{Oh7P-J+)T?PbmX)O?+pVTI=wI;C zdlPTC(3?t(F<$#;^amK@ncbmQsYx|Wc6VmZdCxQFoSA<4@!=DIDJ(`1V3=JOrfuaN z?$mj)Xcb(uXjMx!t16lwZhb>k&1c*#tO}=UF0Tr)ao-U@ZOwN7I$mwdEwlX z+hXX;RSMi*;f^K8YBJ=mT2;zc$2)AB@fl*;sSv~Yj>VekBL9+b=PP!_VYp}{I#x)R zt#xjDj$Vom>o|g=zMM+YSlbls&YG;xaUCacl3{P2>Z1IEMk1r(6viSLWti-=6G2*eR)ZyF_MF!$|$Pit2d0}mlZ>U1bo>2Ll?z~@HAgOEQE=?U1IL8pC zdSv}*Sq+m&MKDF3S#e5czP7ezx#mJ$cmZ`>z(oQghfMu`rD88|mop5=CT?TymFbd> z)3_{++M3AI6E67OkowPFn8Z~bbF!G-M7F~vk5O7j2J_xADi?j&u<gYIvO!w|?% zFt7}RMrm$VB4j-D&iP}TmuQ))qAgcyPC?wTdB$-HAEb*8=%O#W6zCbD zQI2K<^o}LR-(ycQrU$p7H4uA8a{=_zv&Zx6CLbNWh+;p@9q@hVeUL`vjR71YMMnKL zq?FU-$7t)qVO$Xiz! zqnN=Jl9G~_mE?0umrQr+Puf|U7>?uHCWV@%OuV3QGT+J2N9{o{rY|*c?N{hNgh*r< zaU6z0_sbNHdI-mS@g_ow5EdwO93!}n8wAX76Sox1YXy_u1vB&t{Sqh^+u?YFxHs{2 z^Dkh2hL3p7bAke%B%l#`p28^orU>&IRZZ5?hfFsi)5zks2RWf2Wi{w;_d8v0QChe| I!vJzW0sgVX`Tzg` literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..50c68c3ccf8ddbda68ea22e3871cb4703c56b528 GIT binary patch literal 1458 zcmb7DTTc@~6#k~I6lxU#K`l1{(Q*ls5P2%80SWP;QIaA)&u%BXW4Ak--6_a_@Xn%dD?FB!}z39S((5LX7hN+ zP`bUUh&eoB$h<#cSoj|rX^3vnkS)g(o+Wt)#t7SON#C64NOcshkwROyxTCe>Nlsx) z``i+=K<|RMM0hluiMn!pVcH@6h||Fx`w1jr1+MhfCmw{_Xj^;yA{0RoZ(%Znu8K;v zQou4+@_5RyJU~qmtC**i6IMh<$QXIP$=GgrL=o|nvVo>`;v;s_y3%y(u99BkjZ}_H zvS{jubWh^0-xun-9oq6(#XCK7{W0!*6z2jfpl*8NK%OFc4Rq!yt0F@mFt)k%9phgq z%Ai1JA-SER%4yuCe6CZ4BJNQ}^|+5o!eDrSsT6A`$${KAOn;%84pPhn%qA$sB+jKM z43F_7?cJi9xQ<;(=ror48dld=1Z1^1TG-2J+QD x?_Kg(=Q^I#$?yW@6k`U_dcT>$_9 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/SkeletonWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/SkeletonWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..b633023dd0607a283900922f8c75c6b8df12bb02 GIT binary patch literal 1338 zcmb7EYflqF6g|_HE-cF%(bgx5cH1JW2);mqmY8g^(nLs&@zb^)%fPZVyHgDRO8roY zF~-mSDC3>&wvr&pnkLhkn=|L0bMCaiet-J`U02x#fv^;0DKTvnd+VYKpMc z5g{LJ~6T*M%?S2E(f9B<0$Q zg{~EA44F#1$#tYLVqgeah6zXbe7kd4=fSR9_c+6}({8w4%?*S)$Hk1?6CuNk#9hzJ zVU1z9A05MTV!nY31})@rm%?UPG@W+Pvg)0K10gN$OCgU3!7ubDps-|K#|$oLm}Mv= zykuYw7a4|HT-r^Bv{|%ujKZ=1jZj zoPn+BV7PAJ2IeUX@={ay2z?4%t?%=OjAS$1GO&Q#5!!EVxzZ(3<~utYsCsq`#l%67 zK=RYeuWTm2H$w514J@KS&v3i?`qgts8Cf!5;T}mN(%4ABwEtn`Y)NIgY~X>)cv$$o z>uO4?224Cu|6 z@3W}9Fi(Ed^rrw?X#&X7s?li!Df$4}Qu!-}KhrJ+omM@njuCPkqja9@pXAKLOsS4`c_Y2 K22ZiRnfn88BwCRG literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/SlimeWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/SlimeWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..b5b0de62b89c40e912ffba734cc0c7b9d08d46f7 GIT binary patch literal 1197 zcmb7@T~8B16o%hv7Z$b)v_*E4kl`UR|L*0t{U6I51gti+u})oWx`iA0<2XU7K&YyGBl;=w zKUJ2Vc+hRvh5v}xT}q_Ood$Pn+?RSC1r4<=1BT5bH|fwjD>94??wDca$gn}1NN=_V z1;q2Zw0T@Gkz+`Oy>PkLa;S3A626U#SRlb3ce|qUf+0iA=(lrt8}*Z6(MADF5kB#yU~6A=N1u->j$cWTMi;HElZ{+Rl&)q2XyvUFfwA-8EBL-98lX&*KK literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/SplashPotionWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/SplashPotionWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..d6963af99f823f1db25d149e42e2545b56abd59f GIT binary patch literal 1710 zcmcIkTTc^F5dNlDT9#WY7X<{WVq1_^5J8J3MkHwh#stLpxNVQ^u}j|0&0dNx=afAq)2SPVx$ug`Xqf(J& zN3Te`+LpHH3C>YV*!rR2lxxDW_1%_f*tN$^M>ZQzJ!Kpb!b(u2Ez_v_hJ?PB3skHS zs7Q!y$cA+85mvL?LGd>IfD5^OLgYcSB9aKBUqc*ygrRNO5RcjiC1LFuB~uVm+s(3J z?i-d=dtVuGYSJcb1@?Lt9|g{UE zYZxagqL2h(Lc@7nAoN#-;}x2!k8n0uRHsuKrg4!^?USdGY*D>`+)pXN7w0rY5mP3Y zG+f3N53oxzVI!Lh%+#J?aWJCNwdOdlA{R%NupYEfPh)7vV}X!h;D-%II!Bxvht#yH zdZ}HnOGg*3TK7&}m)A5bK_?{HsMkbmf04+qT;IS-9LwBpf6k%pNK-nJM?g3CCtZ!k zV`P|^LAV>dTuzhXc5#1093DUXz^=o(h#}tbeGFrSF?gmR?PERTJIYsDVV(O5+F8tZFy6uB;#*dGz=Q6U5q6$p zfV2xf>zVby(>{2D!xWfJfbDugDU`I`{pT-(V)$<(4q$-SSyd(QdJ_g&}DzkhoP;1<4A5fj+y zSVr5fcg^mR*=*Vk-)P!it7m)GaN!>vTAuOL^c##+5BBg~~O+dNhHmwxmn9z_wQediVJJ!8kr*3ucOT7Z;%WlJL z*UYXh_fb&sAK9Kj@yx8RGom1HZs483jWgp7tKj*TMm6*(Tvc)owYa-|Mov_0vymmLHo>Orz)9ZR5d%(q3V!kismoD&_>P zoIDR>ZEma+LG}k4KEy{sw$t1*eN!Nze^Uyk_+e15V6lmy2x_4yi5m^Z zjDE6-Qo<~X8t!0^`dyaIOZ3W^VHZwmFy|@ZhSQfh$sv%Ugki%JJu3Wj4e#Ry9rp&k zlv1TlO``eXZ>s9{x(#dJmY49tz{BYMu_}eK?VJL>mVgPacz^k=a<_#TKR`0S@+;2$ z!c`0@ey4)yBr~V*2KRGe7Br-}V?HMNgytcGX+As8SPU}(<_4Jr_vw5leT)lz%>RMe zpMwMmEvdm&39E&P5v;%>E;Ay9tr1S=sngj@@o5(sRr(xVZ5B4*~bhAEUkUt^X_v<(1!4U&k|ArH>8Sv{20Dz`12M zMCZWfSwA5A39$enawkV4Tcoa}5*J`B+))M2VZ99~Kc9(3oAb-T)p?;{u z7~^Mul<}SIVFPF|o0-hK$MZh#G5hn^*Y5ykkoKd4Az9{nN#q>UIW`Lgk$3fis1&QB z!dnOT_<&dRBh$_Aa;Kta#K8eCEIE#Sv|X3^p)f4`H&8nSL)W~pguBQvtEDaqwbG!P zh-Dd+q+Q@a_|UDQ6J6c7gv)-Y1o(Hjsw+yu6_j2R>P=Ik;tG0*mSb84yUfs^+A|ML zU3%zSo-7eW9|rvBXXrhxQ!$7TgWuxsUBhyToo2+0AR-v@BT5doQ`B?S{e9u;NxNh_ zDuyva4m*xr-dbN~h-ijk#8Rj2C@902imSNB5U6n1^JWNXXH8{QdQ!sTo7HlTI~g-q z;xZ9CZHjef2_n`UB8KS;LpEDL{>-6e&??f(5ni#C=%98^ zQM#$H_fU6Wxo?%=w+Kkh=J)U+!mMI$A-c`hY1Vx{5sJ?UoVE}o!v%1bPP~b`S0@ZaTB-b zMv+K+hobk8_AbT=Wrzx=(aA>|6)`#~q>p2w!EuW;9ppJ2CxZ8Cm^#5s4NreywuZ&| zkrOO^ByF8d(6bC9M3^#qxbE4A9wII)gimuS-(&+nLsE$!jRz*0=&Nz%Tkx$fkgmb_ elj{|)h9kssl<>#eB1BvHMJa;rMR?`0+WZZRy<$@U literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..7df271092e205278e64796033d2887d2609ff158 GIT binary patch literal 1680 zcmb7E+foxj5IsWzOO^owa`lE6kR&LpDBgnHMOP!BU@VKLO)`XmWkc<5RQ^hRh?Hef zKKoIYJ)2F4lvKr+*`1#5)2F-7%&*_yj{)4nYYi<7^ZUZEWzMzSL#t4bdEY2VuUM9z zsQ>tf2f{NxT7G^txx5M`MAZ3i&M;PTi$<=zwm`h?yQOX6d9vhibfKGQ ze6Z}Y@EB5w`Pnvk{VfK{kCS|=tDoHb}gq++Gps^>{=fz zLq!;G0$WR`CUaTy~Fou2Sd3RR^wS(s{T zcSbs5wY;Ab?xq@;qF2gWcGhyG+K0xdzayz@i%rk&EIFka+G`4Am}(lY)>Vq{EdE_@ zGLdYuU>!+JXh<>i1Z}o0r)W@91<9S`CT>xm1A(k#5pL>%$4QGw%4Q`a|2Wj8NYq*7krsi$XB4T;E@jw9S9+wwf&X;@=8e|BdW^b;ny zN+cun8Uj)Jqi2Iwjdq)~Z=vr{YT_H(Q%BIhB2MdZ1p`wRT>L_3Ex1B!R}kMpv7GK` zCm{j@)mU7^b=naMMlnXnjAl0;W|*ZoMrVDgcsz21L=eI(A;DwsV@whub`iR3^7*}*#5K`dg4fK`H# zFu?-Bs|2ysLfr*a)+J3;+V zY}f>Z5Ms@bLR>p0SfYy{OQU6^Z$w*-Rp4a|Lg}drRNNvwvD)*p_Og^t zqf02h8oE-4hD!z(P$I0fRUi*WXMGvI5q)10R@=jY@Vg>ZNuLdi@rjBE&*yf%@Dd!t z;-5<+JenIeI|9K_(F@NDWfZ9~ht;e`PsbWI%2+3ur(!H@Uj&~0ayay*2n^IvCzQv+ zAIZ);Le1(m+W*KL9fT_eu40oTdNS@NdcuyipA&cbr*aTG`Tf}_iE!P(4Vav;Kef&f zOOcH8iHjVdo7im|xQ#n($AU~-yU;FG-!rfSD^&;Xo`?lu!8+bg-c%R43!xql4u_*~ zAYZHGInDfE_%Jy+w%A?cKO4L<1|?q0+_g~P4=6QvKV$I|R|V+2>glw?N&^+{Yf}|> zOWd&@%UEFsp$ao&IVl@3o7IZ;1*;QW{(-d#u6^VUQ*2@j-jX1Vv^Fy&;U;cnphLDz wLe&|xnS!>O#c%psty<|!aQAP@<@8MJoOXi~)^bVfv!r!2&}1-SH;r-sH`wg&;{X5v literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/WitherSkullWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/WitherSkullWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..e696f55e20af68f51f3483b41a5ec0611225e26b GIT binary patch literal 982 zcma))OK;Oa6ot=?(>O7vP0}U>%B#HUxPT=d8-luMOQlK?5h_YWSdE<_o#MvGc8dC+ z*suu*A;g*=g}8o@Rw_b~rSaVBGv7JmnP0!Z{Q&R;4|Eg=TSwCIl^criL<|PXi=Bar zhGP}U=_Ee+AS36ah`j?DM$W#9`Mvjk?ECv!Pe+mPcvjGkFNXO-Lg~30sd$6%)auL% z*vYcz7eourdsq5W`7TLO&7~L{)8+X`aVgV}TijDr!0FS;_{gc3Jz1`UIDLVsV12pIDz!6IU=HA)4vDniB~(a5Lw;V%H>7 u!!EC+oK?H{-FTywyA#|!jX0lfsD=vaSmI+ijoFySY@h|3v4r(B#Qi_w`|9Ta literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/WitherWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/WitherWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..fed2221ee7f435cd77adb7138e3a56d09d09a691 GIT binary patch literal 1856 zcmbVMU31z-6g_LcY*{$6k^P!{lj^Hh5z!7_pG} zvA?8$pbu>yaHr|GdG3$u^hyW}4iBE98L@kH_ndRjz0yDb{&@yq6Xh7D7`Bf^t|4nK zcTc!&OH1W!*{*kFTMQTKq$S$9S6o?#!fofCNk#w9`r8=7{|BQeyV9u#7!1+-(vfPL z;htH%te(9I^M?(5=ulBFQ4JISr|z!)m{oq z`#QEj6CdTRmT+u_JLUu*MnYqv^3&L1*w}yF zqLv9exsi1IS#Kv_G~MJY{|!x^yOB*E2usK=WqRBXJnr2KlzsfM_K#C~C-=RR4;hxn z=j`3Y?{pOKJ@rmC`wz)3b9A%t|cBy|1BT;I%U0{VudCzM4vnm4UG_@bdS+)8&h-v(RAh%)4$Pb3L4!tKkA8! zW0v+y{VeFT_kK~#;R<0e7?=;R^2EUC*?iiV3;ltG9hlRhguB&|q7Yb5o&$JVe23y)DE@lObWI&0GM JN8i+g{{RgJyz&45 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..842d8f9702de009f88aed94245074067b4d2a3f8 GIT binary patch literal 2542 zcmbVNT~pge6g_Kfi#Urh5CVm?Nt!f~O%o@4Bs6vi7{{$!C$xb=Li)9~g%QXSm1Q#i z19|UjU-}0+o%F?JI-O3R`=dI&E6GA3bjHniMx$Nbd+s^s-d+Fw&+mT%n8%@l2t&T9 zWevS*3%eugb-m_f>w2rv)>~Te;&cwQR`!K(YP*`<%5GW4&X%`O5M@~Y-v}F`sfntg z`6vwWyl(2w62pR8=@+f&)6Ate8KSFJT}xm9XE3Xr>Me$)zN?<*LXKguXBxw7-&lbHhGau?RxQI2Ha#ty;jWtQ8)wDTo5FAt za|w)LT){bpkv(xJvW74l*|O? zU0Rd^-U5j_CLJ$|rfAS8>}w_i@hj1G>%?|cEu}XTn86JNAJSYM+f_0w;Yd$!GMuBR zkU8!r*T-8Nw=qkk3D@_LTn~lze54u-^BfDf<3^kHqHqL5OnqLK6CSU-WEmK-JfpV? zTBD(x4VU+J0(mScxc^$$3zlVQ!judj$X;)U8TucIV;(CU1>9rcRWHNmnIOtRl_;eX z3#HmC%eHByw^q!C-I3JG9G~JdGEi^zj(5or#4k!cqF8A_5d4^94WE;nwE22;Of9>G zVl=mQ$Lj|*`}kli_J2c!Mu#p5IeTAnY|62WQS;071fF7B!83+2%Wh<=?fre-$rd}B zJ6#;l@fE`mg%&znpO~ zX682x{z`8VijYxq_bf$ndV%L$~35YlLXq$2Gjt&<2z zeu9v$93j(1HWU3L@oXTKTw1kCUe?)e3BKGl&- zYM7|zT-o_9mVZ9M^lFIdNWgRz#W$G_PrE=pro*Q(Rf%bum}dTi=|hxUrXL4PZ;=tw z{CFnT#V04}-3ZZ(2lOfdJ=tGrq>_nEck$@hIB!^P(@@NYs3?JH3cm2EJi)rJ^&vq? zu%XOM7aKnuVXKR;PeLvb#GMf2PyjiE?;u=tbmo1?mwuz?sm0YFF_?*Vp%MBntqm&j z6E4tX(uV2IQ_tH}&)Wfa@~21!sJjZe#_58d!hIUbCCp(t#AH5TGLP?J6N46IMG@iG L=-r|B2-^Pw2kkOk literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.class b/target/classes/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.class new file mode 100644 index 0000000000000000000000000000000000000000..e0127a1912d6c95cee3aef8b2d3b1c41358d93af GIT binary patch literal 2615 zcmbVNZ&MRT82@c9aC%%KAVPsw!73!7^(15`(z1{u&d!AkX`un#(04(4;9WjQbJ#N)R z$+g`>yHXKl->L|&+7KRZzxapy+_S#7{qhcXJ!`wZR}y?H9O{VwAB=)H5KdKLF!V19 zNBBz&*HeXF^{gtH*>sU1zEZDn0~$`7=tDolnSyZm!^U2TyHD&=jWY}v>SeoDv|S;` z>SNsB5gx;G&#c{3$TFO2#l|q-Gg{jNgD$)~l}62H&{FAb0}N+Pj9`eu5nj$N9Wo>~ zeY?E-z}^qU8yLg5j`tXbUfKt?RkNL{m8;il+;&V%V3IHo>{^4bzhD?mZKn(WT9%bG zADB3g3uK_m{i0mYFq_Ip7O$6H^0J?e?pL3rglQ8OrAo6DQY(nl!rR=jcd5t>hVY7_ zRt-p}ty2Fr8r3-bpYLyzhyTZ4);|u@LYH7OESxPMPSkQ5e;c`zKOjx+ikdc~u z+8{f{<9?^qMOlNJCT@YIbeall9jAf?Q@2el;q!2p%9ax9Ql4P-9TPdM1go9Os_okh zeW~a9;E0rhCSu!E5Ta4lF>nv}bx?-MNP8UmTvp>tYQj`5T8$jd1Ug%_O%PNkKRSq% z1f9p2s4y@>&7^wFMY^5GrimxA!hKZ1JV6-ykuuKq2t^GbBaSqLzGFKTudz>noAriU z=4&Fj5{_MES7ZRxOL@oP?n=$}JnrfEhGF9El_kKAdrVU)HM(1YB)!o+L{FVYONh}A z=+Dgkic`PPTMPz0jo_<6D+lNYjE1XVB0(csPdH}?gJBRu3M&_kfkdW>;aAYLpAe6~ zro~zSDJdnrgfoNpgn~OqU-}RmSeAHnvCva$%hE=wVpV6AQak4cm zs@T;CLVp|KRu_bL7ldnsu<#aytkSS4`+_u3-~*FE3oK^hzZ=iA!GZNAmOG-7WE@0n z;0E>T%>Xv+*;eobf>nG$zzl2DTVap=pa`ZigNaG%**NvA_Tv%mHql~Aw3xy+4w)8l z7PoPM&QIrbOsNQfDHH-G+1S&Fy`e=h9gHp?`FulP!=WaJQqTiDRDvRoO>#^v*3x0N zbcC%R>R2PkcggX+h>ob^b!-r@BzU9wa8o(kN=xvgU4`Fj8W literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/events/DisguiseEvent.class b/target/classes/me/libraryaddict/disguise/events/DisguiseEvent.class new file mode 100644 index 0000000000000000000000000000000000000000..9615a09742f8904ecb5be55beb4ff6c6ef96086d GIT binary patch literal 1422 zcmbVM-%ry}7(I9EIyNf9si1%eBC-`+5qXpFf*2nbdC-u+Tesc7m9m+(BiaAtgTDxg zCjJ5bQO0xIZgeiDZ<2R z9_x8L&0|Ag?AUF$Jn07l^YxB@tk%wp4J`Re==PsGmy5 zQw`tsdv2?xnxWIbIoO1~_cCx^BpBig{gjr#%uum*sKTDJ8wDngt6;}%H>KxEriw#> zi6a@N#0V@@szVGToz=|m|Lo?!fk=Q$`Hqpihpmgx-U?! zcbcxZ@A^uYO6nQmv7*20*HA`wUz)Y6+o2IA1D&BG?7#1%z$TmjAOA@bdn_<_#lNB6 z<9dnTRGzI=IRh(@VQMT!wP0CoZcGg>WQ zv5b}(MQV;B6*KD0Te!{aJG`1>)IZ}h#79O-;A%#vC9c!B%T;F{kTJ_xvM-RaSI?2P z*Un*l;!!37m029z83Yvwo4`H(frS`GVY9p<0gFy11+>Hr_xCZMlyMlfq@4W~hE^1l z$BO16LMu*42n8OnM659l&RzvCj07(Ztf(cG`&Oh2FQ>5DV%>@0Bk*uU;oOHSs_hgw zHvli;Q3Bp(j~QZ2d-fc;OGAs%se>HWBZjFsYha{_Wloe|JUqrq!nG9T0OQ|b9$X;* Q1ws?1$ExkCL=vmN0V75z4gdfE literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/events/UndisguiseEvent.class b/target/classes/me/libraryaddict/disguise/events/UndisguiseEvent.class new file mode 100644 index 0000000000000000000000000000000000000000..9cffe4cee082c0ee532d93fd1e8aec542a65db62 GIT binary patch literal 1428 zcmbVM-%ry}7(I9EIyNdpL{LBl5!nh-MBXI4AjXG9A5;=}>$V%XQaaOiB>Yc4_=}Ke z;ve82Wjwd-MmHykZpr;_Z@=@M^PR8l&tKnu0NBKn5=LN`QNoJet?K2GUe=0m$}q7~ z#Cj2ri`WntIdc7$CxcMnZoM5GI*rcpv5FjdD*ecLk=(4SFnY?|mI@C$DwF~n^%LoM zsu8%sncHfqX5@5l_BPSkdl@>Zc0mFrjN{zRCMO-#({~WD%^4Xru00?RB<3M zb||Ba7=ig}t*^omxyDYrMX8m#^5x6UNkay2+=j;!b4&Ru+7@_K?W@tJ;@=yr?FmfO z+fCQoa|5NRQa&R(QuOyK&tkhn=dIthXjeBxD@+D@Lr>^H*Gqv-w*Nm9V3EXSfw=(( z`?^o~Qpc%1U#)QpRw$#)V2tX4?zz;woYlxy(@V`Igg48t+nt~(pDS(r11YfncL#?1DKPa%#n|X!RB5Anj#%K^Qv$nzff=or zFIr9ujU!dZk(wEG<_%0T`zEjE81>Ki4DpeX61bZ2X@%=FZgJI_`>dE}tk@UG*(>MB z+pFg=KJh3QgCeWOQvxk9$Ne4LO=%oPEvaCCg`pKC z#S=wyaX~9dNDB(wBSoSy3(gOM=ZAt9dRDBZ%v~$8#7h~hwpe!}_z>J5LR|PTpxVxW z3q9~69;D!H_Lw8av}eyzxHPmJpE@XDJ+3g7Wc7?RvBZh;yN8EZPHQd3Il$<5nEMwf Qeu2;hvt!lvRbz>@-xY-_y#N3J literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/ClassGetter.class b/target/classes/me/libraryaddict/disguise/utilities/ClassGetter.class new file mode 100644 index 0000000000000000000000000000000000000000..beff9276a0eed7e460c2489fc0ae8b20d4884527 GIT binary patch literal 3868 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 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/DisguiseSound$1.class b/target/classes/me/libraryaddict/disguise/utilities/DisguiseSound$1.class new file mode 100644 index 0000000000000000000000000000000000000000..c01d68703731f1ea36a017f1077667f58f194abc GIT binary patch literal 1022 zcmbu8TTc@~6vzKVx81fbQtOS27nBuRMb?V?f*P833BFxvux4UF77(S8D zYGMpA{Q!O_C5;nL#9&QVbB_ZOFt)C(ifd%&=+Bk_dVJvw*rTIJ3N$% zPdCTAF?T*vDJfIs3`I&2I$}+xPUo^O9q=Pgv2EY+f=K#%Z4vJWu8w&f3kIrqY{0;{ zfhSlr@Dxi7)5^v2xW8w0f^OpMuSwy#b{Gbs0ZScwrbJDN=U8M|9ti8)omhYG#QJw9 z*14+88iTRn`yy<3Jc>lbP#R_3>>mgxW~f~_F2l-&ea`l$aHdzeBkm=tveim;w{?lI zE7alj?e{%~HV&xw<_Yx?76|hx zenA!m+`w(plbFLi=>-~>m!w~zjwWdvTj-L`;2M>YON%){nd~uI*J;h5_(7*A?f(dJ dyO|!nMM(gS(f}r{GPxH?qm-vdJc-Kc)E^n(0XF~u literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/DisguiseSound$SoundType.class b/target/classes/me/libraryaddict/disguise/utilities/DisguiseSound$SoundType.class new file mode 100644 index 0000000000000000000000000000000000000000..50a5a484cd58426f76dd15c2786963d02282e482 GIT binary patch literal 1439 zcmbtUO>YuW6g{s43{1ziqOJY1T3Z!pEuwAxfD#B`N~Enil!Uk%V8m&Lp_v()urx0H zGfEe2G&ZjNQO5gTvBiZ81BA>{ zgA|EYs7$WiFoN(aUs_!xtDP4B0d5&o}lf`HyM7~oh{0Iagb1$+9Z9g|~msX#)Q zn0oI`m&hIIR>z=2CK4TP8VXjiCgTCa#6Xu_*E3ow;&{jq(j7k=SKk`$KIC@cw4SkfRcG0PQ55k6Au6^v2*IH6C3`LFp6tQww> zPH^=YlLFlE2{0|dtY3gR0d58aSPSua$PUAcqyPyyvojvO3h>;JkrG#1R6pw#^ a{X0&=rpWmOPlbJk=RA_)>8}`DnVH|8wp~L2 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/DisguiseSound.class b/target/classes/me/libraryaddict/disguise/utilities/DisguiseSound.class new file mode 100644 index 0000000000000000000000000000000000000000..facbe731649a7d0a93c9ac6cf36543d01b622fab GIT binary patch literal 15201 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 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$1.class b/target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$1.class new file mode 100644 index 0000000000000000000000000000000000000000..0741e97254900363e14bc0dda770e84fc72c69af GIT binary patch literal 2266 zcmbVNOK%%h6#j1PcpUqZhiOC8@+dTv*iGXW+NMp~&^B?X6DNTtPH4+(JifIjnT*|e zq-24_kLV_JgM=X4R%%1S0(Hd#1PCF7#0DXx!VdtJgmcH9W@~VV6!qJPPL;N(~_*#x(j8I{k;$323kB<dUbf^=0(t;=Nda1OwP)r zyv^|rRI2#0YEOFn6A4t8ebD5+l5!<_Y(4*pulzSKSNbv(U>?iKtV+@~I(kCd%zIJSas*74E?&QOu8;=SGt zyv*2;X9P^J*xNtx9}rw)B9umgilC!hio?RGgso0ROGCt9{)jz~aR2_f8|XA>;g^bV6V2TQb)1t#_M`v<>FQ*i(Q literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$10.class b/target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$10.class new file mode 100644 index 0000000000000000000000000000000000000000..b8da76ce59984ef4cee051ed76d5f8218eb46f49 GIT binary patch literal 1611 zcmb_cTW=Fb6#mBE%@TV_(u7b#10)crFEJBn($WM1RZ1nK4UKS!RCpS%2WQB7)|#Dl z$$S4upLnJ!z3{*f=r8H7XnJ<-2=!ti5SGSg=FGXxcfPZK{PpTJfK`0up}=sXD|w_^ zMwmmbGj z%?3j$3((8_4a3ZtDg%XXuTMO^Z5 z@$Gqs(S0o8G7%?{y4{qfFU_FSS+hoiKdPJ&WO-EG8^@=pdZ_$^qs_y_%C3(Z>I7Sy zT87ymC##D2j#1h+t&yU;Q9=XU!&Qd*8!j99BqECQd%91Zv?|uS!VrFUpM|oQ9eu3e z8nwPRh(rwDH6kSLpQ-$BmW(H3y`1O_{2kxOz$kKK5ICQ}x7J5oIoY(7Z(H0xy0b0qe%$tOlVR<>SnFdGw;3h|6o{T26Cn6- z1jvx}?`isQY(*kTWP$~n)gmnyg{kRmcma|$y7Vn9&?>{H+mp1rMdu>P$y)s-CThzs zF;)8&(=T$vS^6*K4g{Rr!D%{Yj%1FHafT$r98L{Gy@EptfwkJtnD}npdA(V@^&E3^ z&iwV@H=HHyRK55+799LgVDsmGJo@uF%0c}nT=@mdFY>TeEE5-t$P%BYy5VZfxIHYA zthxrvZi0rJV%7aVFJ>XHeQj9G3?^_LpHZX+`L1G(cArzEML0)v<$82x%)=MJ>=9Ye emJ}Wu9)-CGwAX`o7Wt literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$2.class b/target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$2.class new file mode 100644 index 0000000000000000000000000000000000000000..5934cdfe34e742f8e7e90ddd690ed9bc4133bc07 GIT binary patch literal 2082 zcmbVNTT>iG6#jbHFv&1n1-v9CiUfBzmr;a3vO(pVpbJ@DE)g$D?@nj8VRm|*nI-Z! ze3DeDWm%~_TP27-_~?U={vh@A?oNQRKoY8kbGqyFxqaU``{&=k{SIIR_e~fKV-?|e zvJmiKi@UBYMvg1PQcZ@!sYTM0krbgb)4W=aZw7}=BpABZ`6hQf?w6c9g>_MkOtdnL zp2THV7Q$Sh9!O7QmD;FP8LUn24F;m3HU$G)W9ZZuKCg%+H7BBCnV~1UA2A;V(l2Eg zY;6{2%`l!lI(}>wZB?nPoX59B5En3RL8Ru~e~$`xn8&~3xS zX|26r;|wgV_1S2HZJ`A(+Gxj13@u6hs52{lu~@4VM6kpQ9(AQBtBTxP;epiW=4B!( z%aGyvG5H+}B^7>J`7sJ($!t+o9Qvwd;mfa_YM>%jRG#xN;MJ-KLT9zExVH$ICWM*P ziiOuOVB+-?;vaYYDWz<@fkEm|Nko&bE8MBAoL4JJpDOE1rW$DIGMw8yEayd(u`qRoT_rOwwTdn{bWRTEbzaGhBPBiL~87Lg*RWMA?C zCmMXuq}D79W5mQe3>S~)U0m&CZr;Wyt`W8}j4$W?Wu4z>@)!W!<^(o~8^5fFAIA+7 z*BOSN9X1;o-6xZJzDQtNn814`i2v7)F6D40heyc9`?0_LhV-?+8yco*8#DD*iZ5&2 z3oVRe&c-d=W@x9_L?Ysq-ZTtDgpw|#q*TchnuZnSlkhxRFU~^Ei)4jYGi~?)SrZ>J z4E(>fjRh=HnKGQMRHLo>coA+B$l3S^=NURe5glN&rgGlK5|#<4Ks*RUSY8Tvaf8Uu zFmZC6mUuwr33nean(DUF{@gH(JkPXI+wu|Rv%ss(9bn~EEhvgPTBi*CalEI)bybs_ zikbC`o(gGgE{LeCTpOR`3!01u26`9I1*)>3)@h?N_$M#)Fby&d2nm>HSs}E@=Y5~1 z)#G6(Lc)N6qVE)1x_b1|1W3}#tV>#$^ebl2*NzUd>LhK7&Iyve>9afNN?+bVPx{IZ z9e+XpPj%~;>AzKfMK6r6@d}-7dQER|7UxJZyo&Qpe}9psj&MKyGrG3Xy@v~=_3Yx} zE-tN-+PjChw=sQb7i0Rgi<^I-y{SEc)zBt)F}00OGMfDr^9+wDD>A0@9WD3pvCgdp zI=2B`rST0+;}QCdZ*jr+4l~C0$QeK2uJI%88IS8Z_c!ut=1du41*??xUGi}br~0^w qp?}Z{!vr&F+DHzWXzA{tIG>P>fi-+eGC^Jb4EIR0=(X+x{rwBM5Kz_t literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$3$1.class b/target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$3$1.class new file mode 100644 index 0000000000000000000000000000000000000000..684481d81550e3e11f17a65899eb8ede5ee798ab GIT binary patch literal 2102 zcmbVN-E$LF6#w1bv|Exb4WShL1TjL=6qd9gtw9vp0+l2{3$5Z;Z#LKTmd$QvcT=g4 zjx)Z>WBCVocE(ofgM&}bIQ}QTIF2)p<48Ssn|@6gN3%1#_nvdlIrn!y_ot`deGlL) zss=QMvAVDvS@F5Q%&S#thgMYvwWbV&)eNO0Ln#7lqQ$zi#YvB(^9EuJ$wj`zEr+`` z>qcc!*r9=LhSUysy6L*S;s}QBa6ty?JY8Ar@Xi85-x7DyHC`7teeV;g%$_aUUfrU% zu^?P|-)i_?=-HlQed_Z@L->I;7j3FnceKdRer2fP@MYnb>3}d7cRw>@?%IqqM%}y(132q+eO^jlU;8V<0q@E$y&Qgj66BqC% zDK?sA*%Z}0YdMA^S=Vq5|1_C?)W5(XxzTz9;^(eUgGzlhM+wlULY$Xvccr^bj zgt?kWOzG^kh;^Cm@+pvng6>GSNRrqqi6PNve-_mx+$i z+CP|EMRIUx6{*2ft3-Z_fv+R!=ja=cv`9ny1$u7A2#1L^y@DjMrj@mI+}1$S?-GEGpOrH@lrzIB4BD^c%x}nQ zzhhMU1C!dHnAiS7P5T=S?I{9n1E1*(UlRW-y*qMxAPT~Rmecb%iTCjVx&0y897EUW z28CZYh+$AAVT0~cl%c*6eQ?idk2+FO)bSC0HGGVDT4Uh21)Fv$;&EElqvYuM2b0M@ AW&i*H literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$3.class b/target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$3.class new file mode 100644 index 0000000000000000000000000000000000000000..201cda4e6ae40adff875b2758550b59474b0c81f GIT binary patch literal 2447 zcmbVO+j0{}5Iv(ctSqm=2pa;qi9`m;1~1nT5SL)Exyi;LU$6;DR=Z_Kl0B!RgP~`^TCz;n@+#(o@&dO* z9eWwl8`4LS=UHW!GZ;&jo0Yz(j9WEYri&X&rO+2%rNFRH>C|0oh5HSyy;p=M!fOmC za$EJcO7hbT9XF-JJ3+<_=t!zrkAY4kQ_zq$kitO*EvHoX7lp^iqgt8!lMN@+MQK~^ zwB-x6ZVEfXst6b^6?cgg1*Z9tm%>qeq~k+|3%fF8;A4EkaKM#vF{)a2_nRw!~St_KE!Dl*-(KXVqnB{13QH17j zJQ(;KS;}LDhb6npoyg@rLoSyuwy6fKo#vr+O)`BH#|@l7jv;B;HV=aA8HPbR|9&`% zq8zkpFDU33pftQ+d&hdso=G8(ld1qtG5nC*;np4P6n2B_cBR?{6K8asW}voM$NIeh z8aRt{3_4ZPq!lbOJj}HNUw5O5@XU#LD74+z>cGN|c~U0h6kRaz1ukx+=qy7Yr6_Jz zg^PK|3aVpPos=(uGIE(pWy_|4E4a$gWlJx#gcscBE6PlpR}Ho(ju8U4eAmq zEr#RU>1{o#4&F3yOC8+n^O{`Zs>DVO+{PVpifr9*9PSLSG%%qK-Wo`WhZM*?6m{I+ z5(sT7`&Th$sl=P~pDM}7xA|zyw1--3wEhwfDLCjY8S!ja z29&BX9#*AeU>VN{1VW@q)1w6ESd1pa+%{=x%Sx*|b{Cv+*Ymi4)3t(t2Sn&ppY-iP zq9?6hM1V$m59v2Rg1!{GXxE_GRa$E_?jIO@h3b$6}2DA`T_D$^#w68DMD<;=V?2Xq1)YNc9zgzAqMJ;1=FZ%E&b@Q){P_9x8-PWunTRngw}kD;s^Y4{>vdVvc3t|7 zK>ETCv~;AF!na@aOmF*^`9%|PhSWYk;I_lvhP_qY7d35Sh#`GyeG|AYuR4OkI^fQH zKQzNy>3rP&Dcxxkc7>~k(4yYwP-GZ-DqX3cGd#=wdzjn~LwwzDT=`*YjU^B3ol#`(XH;GHQY+{;W z!YB&cK?u9mvPFq6%dJk_wPL9;2fEh4ks-7T7!WtjeRd)wh1p^~_c8z$x$ zmd+8Qx{j;M4^z4yfW^q>xbvGf%N<{fmW3>G zRA?{I3{#~@q|&pum2`DkE5TdEBnr51;vU1qsfITWYoe{C=UP~RO`2$TJ$S8IQM^Xl zp3a^bEfi2p9G-wheR2|w?tG-IDaa;o_hghTdx5HnmojXaOutwsO}7woBK!@v=6Jqz z8=FG!d36iRSYa4dVpj=&FXYq|iec+NnxmUfM3_oLP{lAA>y_&YweE1=7e3~wZwwk2 zz*6b3edtw*(MTXk)?u2h&^ojv^My~a@}Dt!6rC9lZP5;S8v7&ls&G+ay>ZOj-d w0?S0;vpujWBL4snDZ(T2qgSzFqF_>($Fz*mOSweeI9x%fNQG*_|ac@kjWk z#`x?r1~4(vAK;HNo^2PYpgz!KJ7>2LkxGideh|B!9(cxQbtD*iHux5|9qyLx<-&$2DjjVM$wTjx&~Z=wT+ z0Sze=CejRACQ9ngNmo1$D+S@NHcp<*c}4E5abHIJ*qKo4GGLg`olt%{v*w4cfpZwq zah_rDUs{^DfKgILx?A2RHDbP5nfUxK|02L~S3AaWNyo)M`kt=^N>of-MusSPp<)qK`jrh5b}lDb7~ z|1MUa!QW`4PG?>b$P%x{f*W}+^o!!5jD|6FY@lZ%PE>!FV7Y&~;g7tWa8J08u>G{FkQ?)8xyH)O&g%YI$w%MkhkgCKo8|h#^a$VssI6MeM zfDsx_jhnqJHUH%q&OmtFI7g_gdpP;qhn%qOTHMNIcYkCiT))x%y z)T0OK->7GiMA{piroBnol!GA*)5>rL=@{=d+Ul`m)-J*AqBrpk+H;MpzWhGUKKq1@ z+~jAB?PFr64w5Dii%3UhQbZiuTcovj7}DNjSo?rc?PI-UssS699HztBxIze5DUUv8 eFLYQs!Ca$l3$D{A4s@GumD&P)#g literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$6.class b/target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$6.class new file mode 100644 index 0000000000000000000000000000000000000000..855c7b003c54c459f42fc604152fea9cce39834b GIT binary patch literal 1234 zcmbVMT~8B16g|@|tSpN_fr224fLfN1^$QSdOcXIODM~D2)TeDbmZ96-W_Fg)#Q)mZ)Y@ zLbpZe8bkYS;R$tz;clh{_7{1}FEPP!&(sD(a@jBO4p8kTbexK;l!*=)k=1Xa6NUi| zX%i*}8MI6k)SVL^e-u^=T&_1ePv!ig<8C-oMEBU4RGT7TSjwGn{M551L(jlDjOjSf zF!aA!nz(>*nvC$a{R%B&sdX}O|1bYBfa9(XOyZJ`i+}7rUk?5PBm-5!i6wWTWYHj%OsH-)HUfnokcJ2G(- zOTD&c+pDxJq&KZhE1^(uw98T@$!Y TZ!Az>^H{_!vJ3)771QSzgQPlS literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$7.class b/target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$7.class new file mode 100644 index 0000000000000000000000000000000000000000..f655bf8ca8aa2ecdadeb96363d590ad164ef5802 GIT binary patch literal 1275 zcmbVMT~8B16g|@}tX&o<1u7~iDr!HJ^$P(}Ul0?MqQq8wp0-07y4`JNX9@j9K4TP( z55{MIlQG`iwh$xKgon+{oSA#ixp&XZ&)?s^19*fL6A6Z;mT+8IRa|v=y)J9osmq`d z%0M`wmaf!N1kQ^d^sbN0FPShH(z|?*J1+Mc&YSA4sA&_!44Gr}ZRmNt>Iw#XkGu2z z)C^Bbr}Oqt=}w!tD_k{%7WKY{RfgfG(v$i*!?WDk)8w}pj5WV5QeYUhVd9*HB*tu{ zkY-5cq61?k>5122t148bTSunk*SNdIm5kOs(9ko0GXJAoE08#&~u z(SE2Irb@9%rSEJi>FKgog11&J6mi$Y9fpZx53ldnL|aSWv#|h&Jkjn(@LIE?c#XV0 zojWmGWT1rDKO&3o$x$}?=c8p!Nj7-9XCtfZhpHxC%ILym`^`GKbPJIt;$Qb_t{+IR zu_5%1U$?OYi(nYlarig|7fDn^kR@R-Xl@voG=?x`n3yqAFdswmRPVltZk0g)?c<6L_{1@!|>t~)z7^USj|&)&~p-+lnNhn#_ghQ%s(Tv3!v)>*kMO3EpV zpc0CJJE0P;P=W`}v)J|K*fYLlK-bW-&32jNGOyyiDsJ)w$F#ls^rW{G&_x&Kg%+emSQh9mR7`302>athB@Bs;6X~&|9*aMJc*1 zimqvBe<(bm9&31#Z3#OA-tr~}IPaO<)S$2UW!?eeZo$B%$Vyr0fEii+7CK>?NFr^) zLPkR}8zpt;g~wlp)gqT0&6B6{eu=r8Op0h9J9V`s0u9Ug3$~xmoRpzw;yOkQ+|V%i zuU=ZXiBal|@OJ$j8pLvIXX5jJ_)7!MyE-tA2?MwOn0uifC|O1!3o?^&3^EOoEe%%FisQzyEEG2Jt0QL7Vt@1$5m zgC}Uzovwl+kTq6|8*Uc-P?q>}5s5Ksd|m>-3F5tu6X&FZZ0~u^}_SGTya?t@BkyE#Uwp#NcN;6 znF6$uNE<6jlrO*t6CFs&M{A`|0%LVF{2%swEv1N7?Ok$jgVtFLf`Yi~cJGe7kOV@H_WZ-8V7 z#3s^FnKTiHK7))tiy_^?us(-TeZEmL-Gq%x4%6Wr+#!TH%A;@BdjqyXFn4L2z&w4? R2nh>V!~?QS3XB-j?>EwSLty{_ literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$9.class b/target/classes/me/libraryaddict/disguise/utilities/DisguiseUtilities$9.class new file mode 100644 index 0000000000000000000000000000000000000000..dc8fd82628efdf5ccaf43b5b91ad4fa4bfbbfd19 GIT binary patch literal 1082 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 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/DisguiseValues$1.class b/target/classes/me/libraryaddict/disguise/utilities/DisguiseValues$1.class new file mode 100644 index 0000000000000000000000000000000000000000..6a5ac80251610730da5c77430cd3fc09abe349d3 GIT binary patch literal 1407 zcmbW0?N8HC6vm&zShrDRyr_t8s8hkW2?B~DIJN={YfIJvQ9sPmHBc=ZX*&$xO!SN2 zO!N;h(ZsJR#u#IaiSdhnl<}MiDf(1R0EwBclw zW~UevB2F`$VL8jv%hJbkj^#Yd1(u5}mspZ4mqql8xFTRYp+B^Jb6GJ~6DwB2u@_y# zT{lW4+w>D9+gqyIo>iat>#LTR$ZUoSL;@P_W(7n>O~)?V{+NKq-oAMOp>(B0f41iA zvZYp67A?16EIJfv&s9vrnKxXUc{A9e`-b^|YN#AZpD=_%FAxDjIoTf++sZ z(Jw&Cmdlo#b_~z6JOS~bGHvm`W%>dJ{yp)Y)ohhjdwuna{=B~MTCJr5Mtb}1=5{}L z_Z-ySa7I&SE2^&eK8lNI|7Eopn^SiK0H6 zT2Oga>q53LE$53{Wl-dfrc7kz;(RujOHIl7cn{sscDk`byo;!1{&V;ukj;7A?*!9Gc^noHU%gWh69WciUCFmBLT(;hPn z!W<3u?_-Vy+{)Y>aGY7H@jFO}(nB6Z6S{B;XUNZD07K-%bbB)7GG?KZ7jO?Ic?qlV z$bCG*WAZ0>hUerj@Di`cU*jz{$Uop4zLPgnW*}T^nuJ3%Z=lglV+>sjA`V0Oi>Msi aTPX99TDGG&Mjpa((g7MVI;)Kw@yKt5n@t7) literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/DisguiseValues.class b/target/classes/me/libraryaddict/disguise/utilities/DisguiseValues.class new file mode 100644 index 0000000000000000000000000000000000000000..9d8112b6b0486ba97a67230b2c27a87ce56871a8 GIT binary patch literal 8234 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 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/FakeBoundingBox.class b/target/classes/me/libraryaddict/disguise/utilities/FakeBoundingBox.class new file mode 100644 index 0000000000000000000000000000000000000000..38cee3770a0ddb0093b278049e35a60c6daa2720 GIT binary patch literal 719 zcmbVIPfrs;9DTEYTDq)KaKS1fa+2Cc-8JBsGA1@A z9{d1&D8icou_2t?!~4DY&AdO^^NZhq0KC9ffCW5mp^0?^PYi4{4tQt2CZ0C2Dd3&H zDN+H^BR#X!`({UDPv^SY7ietvdcE#|_pggo2`u$>uHM#@p(;PfVaCl$zZl7EAWLn| z*GsSZtfvAm`xBL9dRWTxOs1(GRY|I+<62KuQdc_Dl~&W_NPba=MV+TQA0HN{uNXE~ z)v=~3~t=< zXYhVlS(~^9pV*=}ATClKBBISQw=uUgzzQC48fJopWhUCS%!K>gM!dg@-nCWe8vle7 z!7sk^p#u}wu=2LG4=rz9+Y46tYmo4@iScRR-WEr5V*f_`@J2kJ?%kE%nKSs8-mx7Y FT>?>xZ)*Sm literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/LibsProfileLookup.class b/target/classes/me/libraryaddict/disguise/utilities/LibsProfileLookup.class new file mode 100644 index 0000000000000000000000000000000000000000..5115cdf30a87c38180ca9d6cef1a482622666788 GIT binary patch literal 228 zcmZWkyG{c^5c7nP3#q91256Wj5d}SIP67!D>b<>5GGXs#wY$gT*C_Y^J_>OGItp91 zEL-yD*ZT*6B~B_-73PGw^|jg45D8c3wYQE(#GUl|$}w3nZ-HNui&0YM#~;zIT_<_jTzYeDtG;lnc{^wp9*PDnDw+S4 h38#lT2iI@;w%Lm>GXh~U{s3r7IKuRxa6Iw^vu|RhL_z=n literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/LibsProfileLookupCaller.class b/target/classes/me/libraryaddict/disguise/utilities/LibsProfileLookupCaller.class new file mode 100644 index 0000000000000000000000000000000000000000..ea6aeea778cfcc60b3eb2fda952a0da17a26925b GIT binary patch literal 1170 zcmbtTU2oGc6g^HmLbI^3LC1gr9Rt)2i3l_yr1Bv&G4>EKq@nTbBwp(-i6bY0@vlGv zfq38t@S_mdX+=LYG%+4>ZO1<69-n*t^Vjzu05);Q!3$qW~WnaOSa0W$~1u)?VLd zsBfu=$mV^SidSV42>pf!hJMjkA&>XDmS#QtSuc7rXL#Z#!i!~~x&FYTNQQ+M$-G<2 zTzF+6V_8U%d%g_vp;}+5!!q0AaV#`xnCpsSOcle!_WJ2=(^Tn1ifvBbL=2DG6jGc=FoU|60KwO59r5RuWf zcA_pL!KPXcitOyEQio!@s`$!Z9KC0*;-Ue^g^jZ|)?D1eZHCT&l!@W|$f4b!FT#SM zZCY;1)CvDhi31)UGCcVA?qqNdv`Th(8kr89dSQ^wR1y zC&wtx(#oTe(Kxg573>pDEVvX600cNk(H$JX9Oh|7_F#eHB=|F|kF+@sc8>)w;=&O8 zjLz2#;dIu83fLNK4zrrPHZD>$vnG}(6~iSgQ#4AR)7ql3v2phsYF}WDNS$hu(fQ6#w1s(rKqtDWyCrD2P?N-O}j;d{8XV0=2k(NNce?tkc;yE0w#wf-VJg=ewJyjT&^C1;=ctJuFDh}g_f};wKDR@z!`nc@};fNQ6 z0^+bhWtg{vrgnj?nUj|8*i*jY&l=gRZH9W*4su01u=HYRJ9cPWfj(%3zHJ8G6x?aM zcGx4(-dvVsYFr@M=VdK{l^NT$hKeVrEPu?Ha)_zVc&6cu8@?^qC1g^XD4-3vuI2YR zMi5wB>gDX()Ip0Ae$nOFEG<}(^Nm8DbALQ{m8C5bqDDcJ*JMr@rw!fq^nu}hGp1Dt zZOn3Lt0*&$H3xZCj53CpCX^^2&3Mb|B*S%j2X ztq+8jZ-gEVioJ?V9n1UPnV2+Mlj8-HZ8-#24EVl zX*o+x=@d9so++7Sw&_kS%du!cmyAVEc?P87I7hiKYK5|J7n6es8T8vJvbK3C`$Fna zM#&q&kTpZ@q#I2Q3!HZypy%FwfZL?e9pxE)Shlc*4A?Fel-q=vovW6FK0bQh4mm5# zc)6S`(2WZ&M6q#*W%=qcl`hAXeJ9O2E%PBcFtnfTt#L_YZ%a!K3RfD1g5_pe;mu3( zJnj%Y^2M6HqiIl3rGbO2DI>?8d1sJI(mb%xi(!HFi)VS;gpzv+A_Uq>``_zF_dQm0 zr^eZRH}C=%cmNgrvjYQlb+RY(im%|e1rL+jM5sUF09Ll7FGI9kK}AdQG7^^}#z#1+ zk-&9S;|n~>_1b8?5|1Ip6$K-;ykyXVbgWc3NMZ$PAGUl9aTUpl%$E|H$BK&>h;fx) zVOI&d28F_;leOwljI6!}Rba678fpYCqJe-Wa2>TnTjz1#+^xUUH|C)3NTzQzCO?-V z{1Wd&NzNgexJqvlbYhOLg;?FHi`a4%^&esNr)ZeCf;IJP=dmt5kM*49(KwI$FCjr+ zk7AN`Pr{65@OC)IH%bCB5h zQt~%m7Qf>?{DBYfR}{U?)HTZJw4#mBdB#vjJEO)}l_J_fxD{3ZV7G!!1zk7MxL3ip yo2cZ2YWpoxg@VUX!G$=W;E5FVJV|T?p27~!Nj|xDqM1-VaT_?xUoEj)QT-plmAaw; literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/Metrics$Graph.class b/target/classes/me/libraryaddict/disguise/utilities/Metrics$Graph.class new file mode 100644 index 0000000000000000000000000000000000000000..1e58dc547dddcb8639787af370a4089f42d704c9 GIT binary patch literal 2195 zcmbVOS##S|7(G|EB``hcpY!3;mthW!crc~c-z2b^;|V@MIi0j9VsxqcHO>dTdwW3twtC) zUb`-k?Ye##%AhAO8SnQ)$F&+V;(&tblpN^JK8(+P$7+I;tNgo^^lONYsp zx0uS3-(o70YmO&3`kieVT(h^`C^^4ryIXePsClxO4tE^V%UllZ?vB9uv3Ny6%kJ2{omie!sZ87H^3%TU^5T7BZf;+f&9Gknm@rpj=j%!V?X$CLm>00djHU}3em`i+6-T+zOw4^o zb)1QlcvKDN1WraR7zscN-;k|U7LCnjVhYDhOkmQ$nu&GPOl+WLVAI4^yl3Ej6J=Bk zGz8|y>8{AdCaS0jObz=#t}-a6_lc=Smz_~={frFEV9L)D68Gqyis$oa_w9*E2X|#F* zIqp$Wt~|z-5BM?G_&i?Og;x0usgHJ%zKcwydKdbgC}fu7G}6TU0%`4YOln_ZM*9kn zbNxgdj3@9EXM~9^6$F18bIBDJpMrat%1_XLj=h-4d@4-}vsi^v~pue-8eO!?37D`bvWBw} zhRD$o^HJ)GdX@i5V=>ew*7v~(XAz@Lf&ROYa8~*%&U&S~dpP>m2q%5ONykMxTV1E) jCA>@o4VO66@Cpsc{E7GoRxp!RKQLDCBt3tg>-_r{Z~*K> literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/Metrics$Plotter.class b/target/classes/me/libraryaddict/disguise/utilities/Metrics$Plotter.class new file mode 100644 index 0000000000000000000000000000000000000000..0cc89304ff8d07a9e1522d5a0088d64091484593 GIT binary patch literal 1176 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 ZLpcU)3Bf&o$DK!$QN9dIt3f~h{U0}F^xpsg literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/PacketsManager$1.class b/target/classes/me/libraryaddict/disguise/utilities/PacketsManager$1.class new file mode 100644 index 0000000000000000000000000000000000000000..33c959bb1a56fc188c230e9f83dfe1e8b0b2e3de GIT binary patch literal 4508 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 L&+!6N)}Q|Z3HyCa literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/PacketsManager$3$1.class b/target/classes/me/libraryaddict/disguise/utilities/PacketsManager$3$1.class new file mode 100644 index 0000000000000000000000000000000000000000..7a84e24d8ccbbb852b62d3c11383c1925cdde745 GIT binary patch literal 1642 zcmbVN+iuf95Ix&$YX~k4DYrs_76Rnb)P!rH&|;-7_M(fFH+4!B%2}( zRbaeOrLB%irPnbkQbx(tTN1&#H0h$yq9v2kl~Th2XDGZ7UExJSx4ehV7cwvoh8T*! zt&cidi)JJlhRm8uOAU(W?M<-(oU2%%ZAvul8C_4 zsGTv9!P{jj42<0C{w|WBmJVmJ7ezZ85(jyP{Bqn$0(nnaR*(L9F-%)@N_#;EQJgB> zT9jrj4jtTNxVjhGyO_mo0*v)epk?Y7!7@yj|EvB5dkM^17P$8{(SJS?X)04p5MOfi z4kA}5SSkU9q9sx$iAHom4$wP{gLGTPRegwot6rw@CenqwliQWAvNP zyvTz;!wJ$|@+Kdg#5hTYQ#jtk`$%YmWV>8_kK*H7{Oerq&RdL)@$t+4C!8kh;acu9 zN*u2T*!Zb8+uz?}pI`fc>bnfHf+?D;9BkCnQ~`JsqddeU$qIjtDc(YzD>V3emdOO2 zrD(lOMyW0jmk6m&c{Iq*aE10K!MAB^&>@{MhyEmRWSh`wNd^ZsPB7Q#-~g`U21$+? S+`=7N70EV3(mu9mdVT`j;l*kI literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/PacketsManager$3.class b/target/classes/me/libraryaddict/disguise/utilities/PacketsManager$3.class new file mode 100644 index 0000000000000000000000000000000000000000..ec46af70b0a1691670ecfb2b93e3a03a65751596 GIT binary patch literal 7453 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 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/PacketsManager$4$1.class b/target/classes/me/libraryaddict/disguise/utilities/PacketsManager$4$1.class new file mode 100644 index 0000000000000000000000000000000000000000..438f01d3da076dbabae70bd8b54402c8d5117566 GIT binary patch literal 1086 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 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/PacketsManager$5$1.class b/target/classes/me/libraryaddict/disguise/utilities/PacketsManager$5$1.class new file mode 100644 index 0000000000000000000000000000000000000000..54c0d2173ccf5a53d2f3254918f5e3a1dcf17150 GIT binary patch literal 1635 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 AsQ>@~ literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/PacketsManager$6.class b/target/classes/me/libraryaddict/disguise/utilities/PacketsManager$6.class new file mode 100644 index 0000000000000000000000000000000000000000..5686ba81cde9cb9a36466106cdaf7e601b29c647 GIT binary patch literal 2736 zcmb`IU2qds7>2*IO`9~NB|xDC5kUeiDnzjs5Cpf$wh2u(F}pM%YS<=AyEIK|vS}&* zC<^}L$c$b(BQtoZz#!ufSI)?&m(Jkmt>fRdj(Fqveo50UGZaV1ndEu*IeYf(+3%c9 zzWnRsYedvdZ+hu5+TKj-X-6}T9%q%^)XNfLgc%B>kI~PFFrti|i~&Z>OL0g7Gmy82N=9kQ$mOi89mrYb;fhr@XAbPCakCr5{#8Alk;Gfpv%GLA7`V7$mU%{aq&iSaVy6~?QK*BGxe-e8=ilY+X(%-}7H9IP*L zuwq+z%eKsN@YWgzdIb5Rg@RcM<&ARLEDQ2GHA)N}FtaGz#(zJspyk*r!P;I4*7izp z_Fie4F!B|?->R;4dt-O%yH$`U9#xf)oYDoY_@}<^Vku`84D5gGL2TdF`n8!*MA0yU zf2N^tS4x#b3ii-UQzVg0Dk(v2GcEB%Z$?YXX_cFOGtIh+p?r!OR#KU8O72gn&~#Lf zz_o#0v6!GnIh9JJG5e$(RrRRakNq6gm3XEvCC72sJFHiI;i@lX@Ya`d3m0te6`A`| z6td^PUg#7pl!(V=HH@d#qo`FlGyRmUT2cw=DLGbeXy}zuB3EyMqe1D%ik}+9}WReLz%0*wGM^I%o zqwG#*dK0=HLuH%LWlwdz!YN+RaE9ydUx^>-4fyq!{2lzx5+U&mffn3>Hqyh$ZX(xy zYQPamd#;kW_Nn(0Nf-IkaD`m1#07Eg&g?9I;gt?XXM=d;hN`c?8*=e*z|;j{1xEvnBM+6Jx98M+u+p9ORYv_1)FJG4Fr zXa{s=&hVw|v$`*1pVj{^_WGRBe>r=7&hWe0Yjdtnbp^X``k8S49`+W;SF*P{zKVUm zdz<5(?28@mVqfC;I`($Q?_=+9{C@VOjz7S@tm+@q z8fvCCYNtl(pw+Y%*@+GK2(pJ{3L_Otl7`f2A7zm_8poelBiVEU{~V3@<2XxiAlwuZX*8_F5#v|;Sp^D_ZJ-^AUcs;NtP7EVQge@kK2gNCI8hJ*X6K^Bm5$DAPx4EJ^%A8mH-zV^BTdI%pC~ZZ$Xd5_+ NuNS{Q>yhO5{0-`ocx(Uw literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/PacketsManager.class b/target/classes/me/libraryaddict/disguise/utilities/PacketsManager.class new file mode 100644 index 0000000000000000000000000000000000000000..198d1111fb38e0d28f7e6093cb1b0b85fb6487b1 GIT binary patch literal 35417 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 X$L$vWCtvg7I|kx|z51V;Z{Ys{<7irr literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/ReflectionManager$1.class b/target/classes/me/libraryaddict/disguise/utilities/ReflectionManager$1.class new file mode 100644 index 0000000000000000000000000000000000000000..a9db7606a429fa0446e5736f3c74a12a80343f94 GIT binary patch literal 962 zcmbV~TTj$L6vzL=Ub?#!SrGy8#-(ymp`xG<8WRFtA?_~5Zt#Hzoo&ZuU}$mLV)#Tp ztBEnj@B#b^ei!4J#kh%@XiPf)bAFR^YtDT6_UQz`GFB=W$Hg-Gaj8t+WrJ5NTs1IZ zWYWl#k!d52g=-dO85SJ>wM>KE20wIS-ErF4{=Q5d86AlzjrFnPy~^a_0fDdLl%a2D zlcDq=P%@I~Lx$Yk{5C^=Ee-|4U|mL{nH{u+Zt=FFo1uCfaJ9{~H2mXoz)yLwPaV5V zQ!-TiIMacsNs~14RJ>FoNM#%~c*HwGFYfUpPW8PgP;nxoPD7--acE)A!n}>^xM5=e zXKdWWf{jJE4C5xnRXpmr&DhU^-I^3C^t6t(jaw#c$;fRZcZ@7!f#KePaFuLpu8(;b z${=+^nRGIl2scZmlBpDl``dWV5`(=NMMAGBo+Kh+sP@`#wfE>}7*_tPHp3L{#Xa4N z`*SbuFMBB-ag~|Ivvc!1^}lD_r=@MIHrE-Pe~Y$a9mfR%tp|G~$`35(<)%EHGJxQCMD65W{4H*w545CW*EYVlw$OFVju#?Y~_vm|PzT5}o z^ILC_f850)VWEc>VX=oLLaT>m!cq?_gw@mNw?}Qj6|#4+igmIc zp1>#D!V3gsa~PuWie|{%B+ilFM`xJM1ng%P&ZF@MX_`CA9qGo8Qa2!v3#2o2DpakX HEUKmN3FYDC literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/ReflectionManager.class b/target/classes/me/libraryaddict/disguise/utilities/ReflectionManager.class new file mode 100644 index 0000000000000000000000000000000000000000..2045371377483c8bb954feb4121538cfac4b7908 GIT binary patch literal 26585 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 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/utilities/UpdateChecker.class b/target/classes/me/libraryaddict/disguise/utilities/UpdateChecker.class new file mode 100644 index 0000000000000000000000000000000000000000..fee239f06eae3e013051ebb298fe4c1e16506847 GIT binary patch literal 3094 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%0AwPxdVpqg42N94FVp^ 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 RBpCd82C`7~E)eV>{|9T{swDsb literal 0 HcmV?d00001 diff --git a/target/classes/README.md b/target/classes/README.md new file mode 100644 index 00000000..bb2734f7 --- /dev/null +++ b/target/classes/README.md @@ -0,0 +1,15 @@ +LibsDisguises (1.9+) +============= + +A disguise plugin made by libraryaddict which is pretty cool.
+ +NOTE: These versions will NOT work with Spigot 1.8.8 and before. + +Spigot page:
Link + + +When posting an issue:
+Please make sure you
+1) Post a stack trace error, if no stack trace, then post the odd behavior
+2) Post the exact steps you used in order to reproduce the issue.
+3) Give as much information as possible as to what the issue is and why it occurred so that we can fix it.
diff --git a/target/classes/config.yml b/target/classes/config.yml new file mode 100644 index 00000000..282c1e11 --- /dev/null +++ b/target/classes/config.yml @@ -0,0 +1,130 @@ +# Shall I notify people of a LibsDisguises update? +NotifyUpdate: true +# Whats the permission to get the notification? +Permission: 'libsdisguises.update' +# Whats the max size allowed for command disguiseradius +DisguiseRadiusMax: 50 +# Whats the max size allowed for command undisguiseradius +UndisguiseRadiusMax: 50 +# Shall the players view their disguises? +# Best used when viewing yourself in 3rd person +ViewSelfDisguises: true +# Shall I disguise the sounds? +# This turns your damage sound into a MOOOO +DisguiseSounds: true +# Shall the disguised hear their disguise sounds or their damage sounds. +# I disable this as it can be a little confusing when not used with self disguises +HearSelfDisguise: true +# Shall I send the velocity packets? I REALLY recommend you don't disable. +# This is the only thing allowing the mobs to fly without glitching out. +SendVelocity: true +# For self disguises, they need to have the armor and the held item removed +# Else they see floating armor, floating held items. +# This turns the items invisible in the disguised players inventory. It does not actually remove them! +RemoveArmor: true +RemoveHeldItem: false +# If you set a disguise to burning, it will no longer be able to be shown as sneaking or invisible. +# Set this to true if you want the disguise to get the animations of the disguised entity. Such as invisible, on fire, sprinting, sneaking, blocking +# This is only valid if you set a animation on the disguise itself. Because the entitys animations are applied otherwise. +AddEntityAnimations: true +# When a sheep or wolf is right clicked with dye. The client automatically assumes it was successful and displays the sheeps wool or the wolfs collar as dyed. +# This is a option that either prevents that happening, or it changes their color officially in the plugin so that everyone sees it changed. +# Its currently set to false which means that the color is not changed and will refresh itself to the player. +# Please note that this will not remove the dye from their hands. This also does not check if the disguised entity is actually a sheep/wolf and wants a say in its color. +DyeableSheep: false +DyeableWolf: false +# This is only called into action when the disguise is constructed using the commands. +# And when the disguise supports that. This will not be used at all for plugins constructing the disguises for instance. +# Such as prophunt. Its also false because its kind of a retarded feature. +# This is pretty simple. It shows the players displayname (Name as it appears in chat) above their head. +# This also overrides any custom name they have set in their disguise options. +ShowNamesAboveDisguises: false +# This supports the above option. +# If this is true, then the name shown above the head appears regardless of if you are looking at the disguise directly or not. +NameAboveHeadAlwaysVisible: true +# This modifys the bounding box, This is stuff like can a arrow hit them. +# If you turn this to true, arrows will act like they hit the disguise in the right place! +# So someone disguised as a enderdragon will easily get shot down by arrows! +# This WILL conflict with NoCheatPlus. Other plugins may also get problems. +# This shouldn't really be enabled for players as it also interferes with their movement because the server thinks the player is larger than he really is. +# That makes the player unable to approach this building because the server thinks he is trying to glitch inside blocks. +ModifyBoundingBox: false +# This prevents disguised players from being targeted by monsters. +# This doesn't prevent their targeting you if already targeting when disguised +# They will just ignore you unless provoked. +MonstersIgnoreDisguises: false +# Sigh. People are going to want this. +# So lets make your disguise blown if you are attacked.. +# Works only for disguised players when attacked by a entity (arrow, monster. etc) +# This will blow all disguises he has on him +BlowDisguises: false +BlownDisguiseMessage: '&cYour disguise was blown!' + +#Stop shulker disguises from moving, they're weird. This option only effects PLAYERS that are disguised, other entities disguised as shulkers will NOT be effected! +StopShulkerDisguisesFromMoving: true + +# A option to choose how many seconds a DisguiseEntity command is valid for people to right click a entity to disguise it before expiring +DisguiseEntityExpire: 10 + +# Another option to choose the same thing for DisguiseClone command +DisguiseCloneExpire: 10 +# Max disguises to store at a time with the DisguiseClone command +DisguiseCloneSize: 3 + +# This I don't really recommend turning on as it can make a memory leak.. +# These disguises, as normal will not persist after a server restart. +# There is also no EntityDeath option as entities do not revive after death. +KeepDisguises: + EntityDespawn: false + PlayerDeath: false + PlayerLogout: false + +# This controls if a entitys max health is determined by the entity, or by the disguise. +# Wither is 200, a player is 20. With this enabled, a player disguised as a wither will have the boss bar health accurate to the players health. +# Else it will be 1/20 of the boss bar when he is full health. +# Setting this in LivingWatcher overrides both values. +MaxHealthDeterminedByEntity: true + +# This here is a option to turn off misc disguises. +# This means you can not have a living entity disguise as a non-living entity. +# This disables the Attributes packet, Non-living entities can still disguise as other non-living +# This means that the above option will not work as it uses the attribute packet. +MiscDisguisesForLiving: true + +# Turn this to true to have players undisguised when switching worlds +UndisguiseOnWorldChange: false + +# Contact Mojang's servers? Disabling this option will disable player skin disguises! +ContactMojangServers: true + +# This will help performance, especially with CPU +# Due to safety reasons, self disguises can never have their packets disabled. +PacketsEnabled: + # This disables the animation packet. If a disguised entity sends a animation packet and they are using a non-living disguise. People will crash. + # Disabling this also means that if a player disguised as a non-player leaves a bug. People will crash + Animation: true + # Disabling this means that you can't use the setSleeping option on a player disguise. Also you will crash anyone watching when you try to sleep in a bed if disguised as a non-player + # This also sends a chunk packet at key positions else it doesn't work for 1.8. Lazyness means it does it for older versions too currently. + Bed: true + # This disguises the collect packet. If a living entity disguised as a non-living entity picks up a item. People will crash. This fixes it + # This also fixes people crashing if a item disguised as a sleeping player is picked up - Only true if Bed is enabled as well + Collect: true + # This disables a fix for when a disguised entity wearing armor dies, if the disguise can wear armor. It drops unpickupable items to anyone watching. + EntityStatus: true + # Entity equipment is the packets that are sent to ensure that a disguise has or doesn't have armor, and their held item. + # Disabling this means that any disguises which can wear armor or hold items will show the armor/held item that the disguised is wearing. + Equipment: true + # This doesn't actually disable the packet. It would introduce problems. Instead it does the next best thing and caches the data. + # This means that entity metadata will not change, and will only be sent in the spawn packet. + # This is good if performance is extremely in need. + # This is bad to disable unless you are ONLY going to use the disguises for decorations. + # To be honest. This is basically "Disable entity animations". That option is called 'AddEntityAnimations' in the config but unlike that, this is always in effect. + # Animations set by use of the api or through the disguise command are still in effect. + Metadata: true + # Movement packets are the biggest cpu hit. These are majorly used to ensure that the disguises facing direction isn't bugged up. + # If you are using the Item_Frame disguise, when a packet is sent (Roughly every 2min) the disguise will bug up until they move. + Movement: true + # Disable this if you don't mind crashing everytime you see someone riding something disguised as a non-living entity + Riding: true + # When disguised as a wither skull, it sends a look packet every tick so that the wither skull is facing the right way. + WitherSkull: true diff --git a/target/classes/me/libraryaddict/disguise/DisguiseAPI.class b/target/classes/me/libraryaddict/disguise/DisguiseAPI.class new file mode 100644 index 0000000000000000000000000000000000000000..2fd42a41089b82759024a772cb8b7019803f7298 GIT binary patch literal 14375 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 blyYxE@)&*aD0z!7dS#X(=7p%If=~Se+|jb- literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/DisguiseListener$1$1.class b/target/classes/me/libraryaddict/disguise/DisguiseListener$1$1.class new file mode 100644 index 0000000000000000000000000000000000000000..a220bc5d02aaf96c753665cd31a6f75b0fe719a4 GIT binary patch literal 1746 zcmb7EU31$+6g_LZQKM|BlQyOlXrZ{^IB67@0tqhta+8u)PSUzDB;{o-Z=7uuDI={J z@>Ads@XQPhc4z4D%#Whnl@;oC!W3&p+TFXl_n!N8{`&jba{$-y#6pH)eqTDiYDFSC z6z#V1w9{5`r>kP=+)X#GinR=6RIC&$7IF;vr{a6z_#)^y>#e8K(-y`Urd~=Pb%Q{( ze917TcU4@hkRNvxM^)0it^%cRFjPvTsm?SRa<#B6$H8!l!@@}$S)Aq=N1h>DGC!Pl zRUp^8`z;wg9w41^Lr?fk5h-&{g*gMCVPPZ$#R|dCM%}>1+jz&qIfltF>Nu_L-k#FV zon+xSk9R4R9jVs?pTKPR;!sB9>|ANaO;Xv_%6Dp^?^A|V7*r?lJ}z3gz;O1sdyWtA zA;U?fWh8VMF%(|0w3^Dv&PTXxp?FlX#Lv+!$H(}D5*WxIG&wr5FjVZSg&9IQ6p;+H z(ud9<0vofqVquP<^yZ4!!eB>rIOgFnT%=rV9<+s)YoS&<$`dB+4H@mLIHuj}a2h&N zL5IRAp~7($pHjJZMLeu9T^gh^fuH_Avuz-L#__pvY6>uLT9zO=B!F!yHs zFGqu;itChp;dx}IxWMq;sC_#^lT~fpz%2_m8Or}3rNMZc;npa?s%bM0XV5sWaojb= zjsm`FV+CJZxc3S@3{uXqiu*LtJ7KghsH>Kasmha~LJdgeIM1fmE=L_}3=^>o+G)`k zj;(alwE70eLp)-zs5jP^N^`l89wF@cb~Q#;i-d8@4&74eRjLfEcvqi#V1s4Jr`?y(hr(c|%Y{$QgRaVUu)% zc8hd261zP68+iG5y!A`+&!mwhH%9w5rs&K`$4JlMEUg3$`P51uW8?>D_E6~KJ%;+v zsLl0piQ!L_+}R$=eJo_~Bd*Z?+KE4q-O84K1@GaD9=>X9<^Da~Y4ot%$Ab(=f1Tl{ z7tai$EDWLx6a%Oq3RuP^>VqZRqtgmp`flQWg0hgHZl)*;G<^*`CY+n3If={*3L|UL i*`ku+CK+zhMF!vCTUv9JkS%P}Zi-}!w3^3+P0v3j%F+)2 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/DisguiseListener$1.class b/target/classes/me/libraryaddict/disguise/DisguiseListener$1.class new file mode 100644 index 0000000000000000000000000000000000000000..13589dc53a4e3d0b0df7afd196bc95cb8004b829 GIT binary patch literal 2448 zcmb7FZC4XV6n=&P8u|UgdKlVfaP`~u_^v-S|ya&-1;XR{-PWWaJfGX#P3IJJGbGlHXNGPWc1?d!S?4Cj>19Z^SC<0Y zHYyfp==Ilxm%c)$6i$9jp8ReJTljYv^h_s?*%CwdtW)KEU^t~gL0m-)0~-2}V2EX; z!9YRS{C?1=aCbREnJhS_VU-M5$nVx-w}j3x-og3l96^t{fvw;iL+J4_Xqd&_b|MoDD;*`0J*MCbqT=lojh9z2PyKQ7@=E8@ zITdsGLRRiQYLHHFQEz2S{rCzC3JMJAlMtfeJ{~YA)RD`ES7&&b*-K>83TndE7sDaH z=K^>1D}OBSGGx9F4^dRGv`-a_FGw#N8kX^h^uP&x>e48@aP&oLXP=6g8;yJ%E5zXH zK3boo<_%%-YRY#~VFjn2I&LZmb>e1f$Wu|qs)BDA&b0e}?zzdEKGm{@$Fjy%s-Okx zVWY-Xe2ecDe77HAC@LBZRH!fMfQCUJZ@i%|SNHG|sXejMJ~-+|s=O+mDj>y=K<&>{ zLrpehPgAB&!W<73ny&=mf6G=jq-E(?NrANf*64bGB(Y9*Ow^_t%`N>;mfU(c_@)s|;!Y(uR9B zy~MMY;d$Icir%>x{d&L>3HjX7!ycnwA5>cHr`aUB=pRsrM}CDiyotA7(N`Bv%e8Pv zdQT!r-x~SI)iXFtBV~d_E6Ts<4Q*d;W3ar5cM2ohIA2b_yNUOQUqjnMY6F)yFuZ|r z`8~3M+!n4yTa$lbNzM**5xkY`}aK0=3{!FT}!BE>p@NWsT!DF5wQwNJ+0_idt|Q78cMXDfkhKVVbFsqL-~S z<5aq95EQXVkHk9aG_xpHAG-d5qo6#Ph|{~+XfZKFqhzT^LjIX15tY5+Vnm~)I|e)4 Xb0{j%O~U*GJenoRUb@S_xoG$wJ;$u| literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/DisguiseListener$2.class b/target/classes/me/libraryaddict/disguise/DisguiseListener$2.class new file mode 100644 index 0000000000000000000000000000000000000000..34cfd2943e5532b3d8c89676238154fbd48af66a GIT binary patch literal 1328 zcmbVMTTc@~6#hZfnQgHzY**--{k*a*oiK?`LiX7DvaYqLxRTHrZmA$Y z!&SlDu8LK35di8k70VGI`uX%#FB?MT;^)d=$| zlkSp*%NXa&sL8O=YQkutc%o4{RN+DMA{I>06$@8!jnKhC8y;ckWPmw#s65TSMNA}7 zB9uTHA#9s5dQ|n&ccjT%vlQQu8uuYqJV(P4D$MpiGYilyx@~ReY;|?L^=_B3~ zW(uuH|2ZOtk=7H<1HJ5uAdmra%-uM@9f)NzhRi@FYpBfsi5S0WSiIZA(tXzBy!MqQ z4$)hhJVd7S3EB6N;{bnCQ2+y^2N-1C1hPAZFw86A9QvE7-XIa}EtNhX^ARI&G0IYJ zL(4UmJbgyt9mf9H$bG>y!R(sSahTGBj32bZrB{)oM@-$vSfr;dFqWDyZm@R(vGEa( XoMSnLdEAU_Mcl$&mQoDO0O#i?j4Wet literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/DisguiseListener$3.class b/target/classes/me/libraryaddict/disguise/DisguiseListener$3.class new file mode 100644 index 0000000000000000000000000000000000000000..1a918aab430eae9fd5e4f0d2cf5de0eefb1435c0 GIT binary patch literal 1210 zcma)5OLG!I5dH>`HOmT!Nr)OXDn>#g8*16N&A{XSJ`bh2kBliZI)>_udM0ZxZByIH zFjh9M;+lnJh6mHf9&71KEzbW!t@!XzYF7-*?$BGaaF=1}Z}$tI_eGe&D%KoS z%$8D}fL-mLu2#MH!6~v(@_N3X}g>lp4^{<)@r?9&6{2-F5^Hk_=(6-<*RHnBz zN#o!?wivR3+815v`JyR!kMdQ^e>7!^a(hFBJ3`jqNnJONnpq^Lq3BWW`aFt6gcVx3 zB%O0ez<)4j%bru VC!z#4aF1jPRcvCLG<%eS)L$32P9OjP literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/DisguiseListener$4.class b/target/classes/me/libraryaddict/disguise/DisguiseListener$4.class new file mode 100644 index 0000000000000000000000000000000000000000..875bb77bcd90423279ab5b21b0034e14ab3becd2 GIT binary patch literal 1030 zcma)5TWb?R6#ga~vu3+BYub9hRih@cbc;j~qQ1lmLcCx~3cgKt$7I^=Y}uVn$(x{m zNU#b%_yhb=;+dGJgeJH!d*;lX^PTTp=Eu)(-vKmGvyo%iI1qj$dkIfQJPc)^{ZOX; zOs2wrI@z>ks)Z6srC}q_;O+4t_am!Jw9frS+pOIT&Fs>Za`mP)+L4tgTl`CX-QI}Ui%<%u-<E}nWmt~YZk$A6=Sb>cz|g3+ zRJBgZgRFI)$9) znFa%1*|e7)QjXRVT)JJR-DA=%lBN2+W1OjP9K)-BMfua%aE<=X*nw)o-s2qU#*xf% z9v4V5T*T@G>LFR0JE#5`Uj7R%?arXE4=A#a|DZS%6pIKOV(Yj`GLKuhjjBN+JcCHz EF9R4DH2?qr literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/DisguiseListener$5.class b/target/classes/me/libraryaddict/disguise/DisguiseListener$5.class new file mode 100644 index 0000000000000000000000000000000000000000..4bc34b777122ca48d3494dcec5bfae9caee1e0e4 GIT binary patch literal 1025 zcmb7D%Wl&^6g`uKq%kH*1LaLqs40mXVipt@0VEngMM^sQLByj&?s?LU9Z#xZ zB9(BSq(Wb+SOg-nHcBWktcKCh86^ArGIo?Z5?6HvEC0|?(gzQYCSa;bmI)2Icl>u zsI7dI1O_hQN(q-4?2`}8#8q5lSm3TJl(O#4JDApNGD$3bXN#-RHb3YZXyAGYD-4TM z2C_~QH?T@HL}DCHi0QRvX0$H{d%}&oDdv>8)TDd6X<{u~>wV&TCrlz&Jd=89mi}G2 zj?PY_e;T-csEGe<5syO8#5&pxH6`NX8$CY^2%(iNCS93#nff-v&=)-DYC_HD0c~~9 z=Sm5M6{0>*KSr)r)0+U)>Us~fh2Am@@}DN@A?Z4l23a&uW`faHeD{PVV!Bi8}L~E@kRHHTZdDxx6w978pnI+-xn5fSt zR*et-0DqM64lGJEF=dn8xp(HyxgY23kDuSZ1GtT57Ab~CUpT((L_8XC&y%ipJgK^| zRKj_j7;UMv2t-uf%p$|E7DipC6CWN*?I^b=yx13!^Ju*BDh>kP@dd+z?nza>MG4x+ z&(LDX54m3*_pzG}ENCsVsShyzxsUI*rtjz=cFI0V>A+r^FA_s<3 z7EWNnSVaq2Eas8Ml7$?~4C$H)Ew*JKp2z);h+a>6EVo0K`};hS#!oggrg4Vm9JN(9 zsjYMr2YFn;r7SKo*vB85h0D0Yu*h9kC{?{X?_lba$;4Xv&Qq>>yL`~fqk^khtTHT( z8JIn^a1CojLnQj)keFVt&5ZU%=Rml+m0*sEOSVjJ*Db8i)_RBd-V5W%6;GrQ&GO%p zYntpd`t88=Lq+`W3f&7m3ma%qZA$3rjqN~7J!06IttQdTf2f#>U5^Gr{Z@R-@NGQ{ zNc3AiS4t?Xk}}ft-=s<X2l6pm$_rIq0v$_dmP;$oegVp=6ny{y literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/DisguiseListener$7.class b/target/classes/me/libraryaddict/disguise/DisguiseListener$7.class new file mode 100644 index 0000000000000000000000000000000000000000..71d654955851c39051c793c959f1706f2f056972 GIT binary patch literal 1047 zcmbVLT~8B16g@*rx2=m*C>1~79BIYe zIifBSPW>|ETR|^$L{+M!iA@=GdNL9<8O6dE;p!nj;Z)x89WRKa->HkZ8@L(_4GTJo zDCxKXUB?oZb*$hC!>md%J??kRM$qax-KrFxYlUGD>R44_rZP{l%&>ASOi#8$9-ea7 zl}>EB=M9*bJ274|=vzMZRPlHeiHM;vP-?ahg%dL@UA>@&XAJ8!4YNNDGnt0jpN9Fr zY3LV+lR4pDPxZ7>EbZ5>S9F76(k}13v+RSiZI>(C*5-lLu(#|F46m+VQwu^@`rJ!y z3|*m#%NotShP6Zc2@a(DVGNnd`E;)tw-cHnIy|5n(aeBmiE0V`iZtnsV+zCc=;pCNxQI2p zAY4Zon}jJ8NH3#Q*&=R{KSXPc)+Dlf8g8S0(NM;C5;Z{)AcZNik7$iiW{wbrEU7)l H;@g>jXK)T; literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/DisguiseListener.class b/target/classes/me/libraryaddict/disguise/DisguiseListener.class new file mode 100644 index 0000000000000000000000000000000000000000..acb7a7a2221cbaf0fcd5539bedc757615444eb3f GIT binary patch literal 21611 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 C*qwj? literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/LibsDisguises$1.class b/target/classes/me/libraryaddict/disguise/LibsDisguises$1.class new file mode 100644 index 0000000000000000000000000000000000000000..225b600c5c78f921c02b0f0bd6fcfda033d55dcc GIT binary patch literal 2105 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 literal 0 HcmV?d00001 diff --git a/target/classes/me/libraryaddict/disguise/commands/BaseDisguiseCommand.class b/target/classes/me/libraryaddict/disguise/commands/BaseDisguiseCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..eaf260d76091973392d3351c0a058b69bb5b70fc GIT binary patch literal 30326 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