├── idisguise ├── .gitignore ├── src │ └── main │ │ ├── resources │ │ ├── plugin.yml │ │ ├── config.yml │ │ └── LICENSE.md │ │ └── java │ │ └── de │ │ └── luisagrether │ │ ├── idisguise │ │ ├── api │ │ │ ├── EventCancelledException.java │ │ │ ├── PlayerDisguiseAsPlayerEvent.java │ │ │ ├── PlayerDisguiseEvent.java │ │ │ ├── PlayerUndisguiseEvent.java │ │ │ ├── PlayerInteractDisguisedPlayerEvent.java │ │ │ └── DisguiseAPI.java │ │ └── io │ │ │ ├── UpdateCheck.java │ │ │ ├── Config.java │ │ │ └── Language.java │ │ └── util │ │ ├── StringOutputStream.java │ │ ├── ObjectUtil.java │ │ └── StringUtil.java ├── dependency-reduced-pom.xml └── pom.xml ├── idisguise-impl-v1_10_R1 ├── .gitignore ├── pom.xml └── src │ └── main │ └── java │ └── de │ └── luisagrether │ └── idisguise │ └── impl │ └── EntityTrackerEntry_v1_10_R1.java ├── idisguise-impl-v1_11_R1 ├── .gitignore ├── pom.xml └── src │ └── main │ └── java │ └── de │ └── luisagrether │ └── idisguise │ └── impl │ └── EntityTrackerEntry_v1_11_R1.java ├── idisguise-impl-v1_12_R1 ├── .gitignore ├── pom.xml └── src │ └── main │ └── java │ └── de │ └── luisagrether │ └── idisguise │ └── impl │ └── EntityTrackerEntry_v1_12_R1.java ├── idisguise-impl-v1_13_R1 ├── .gitignore ├── pom.xml └── src │ └── main │ └── java │ └── de │ └── luisagrether │ └── idisguise │ └── impl │ └── EntityTrackerEntry_v1_13_R1.java ├── idisguise-impl-v1_13_R2 ├── .gitignore ├── pom.xml └── src │ └── main │ └── java │ └── de │ └── luisagrether │ └── idisguise │ └── impl │ └── EntityTrackerEntry_v1_13_R2.java ├── idisguise-impl-v1_14_R1 ├── .gitignore ├── pom.xml └── src │ └── main │ └── java │ └── de │ └── luisagrether │ └── idisguise │ └── impl │ └── EntityTracker_v1_14_R1.java ├── idisguise-impl-v1_15_R1 ├── .gitignore ├── pom.xml └── src │ └── main │ └── java │ └── de │ └── luisagrether │ └── idisguise │ └── impl │ └── EntityTracker_v1_15_R1.java ├── idisguise-impl-v1_16_R1 ├── .gitignore ├── pom.xml └── src │ └── main │ └── java │ └── de │ └── luisagrether │ └── idisguise │ └── impl │ └── EntityTracker_v1_16_R1.java ├── idisguise-impl-v1_16_R2 ├── .gitignore ├── pom.xml └── src │ └── main │ └── java │ └── de │ └── luisagrether │ └── idisguise │ └── impl │ └── EntityTracker_v1_16_R2.java ├── idisguise-impl-v1_16_R3 ├── .gitignore ├── pom.xml └── src │ └── main │ └── java │ └── de │ └── luisagrether │ └── idisguise │ └── impl │ └── EntityTracker_v1_16_R3.java ├── idisguise-impl-v1_17_R1 ├── .gitignore ├── pom.xml └── src │ └── main │ └── java │ └── de │ └── luisagrether │ └── idisguise │ └── impl │ └── EntityTracker_v1_17_R1.java ├── idisguise-impl-v1_8_R1 ├── .gitignore ├── pom.xml └── src │ └── main │ └── java │ └── de │ └── luisagrether │ └── idisguise │ └── impl │ └── EntityTrackerEntry_v1_8_R1.java ├── idisguise-impl-v1_8_R2 ├── .gitignore ├── pom.xml └── src │ └── main │ └── java │ └── de │ └── luisagrether │ └── idisguise │ └── impl │ └── EntityTrackerEntry_v1_8_R2.java ├── idisguise-impl-v1_8_R3 ├── .gitignore ├── pom.xml └── src │ └── main │ └── java │ └── de │ └── luisagrether │ └── idisguise │ └── impl │ └── EntityTrackerEntry_v1_8_R3.java ├── idisguise-impl-v1_9_R1 ├── .gitignore ├── pom.xml └── src │ └── main │ └── java │ └── de │ └── luisagrether │ └── idisguise │ └── impl │ └── EntityTrackerEntry_v1_9_R1.java ├── idisguise-impl-v1_9_R2 ├── .gitignore ├── pom.xml └── src │ └── main │ └── java │ └── de │ └── luisagrether │ └── idisguise │ └── impl │ └── EntityTrackerEntry_v1_9_R2.java ├── clean-all.bat ├── deploy-all.bat ├── install-all.bat ├── LICENSE.md └── README.md /idisguise/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /idisguise-impl-v1_10_R1/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /idisguise-impl-v1_11_R1/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /idisguise-impl-v1_12_R1/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /idisguise-impl-v1_13_R1/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /idisguise-impl-v1_13_R2/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /idisguise-impl-v1_14_R1/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /idisguise-impl-v1_15_R1/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /idisguise-impl-v1_16_R1/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /idisguise-impl-v1_16_R2/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /idisguise-impl-v1_16_R3/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /idisguise-impl-v1_17_R1/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /idisguise-impl-v1_8_R1/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /idisguise-impl-v1_8_R2/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /idisguise-impl-v1_8_R3/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /idisguise-impl-v1_9_R1/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /idisguise-impl-v1_9_R2/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /idisguise/src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | name: iDisguise 2 | main: de.luisagrether.idisguise.iDisguise 3 | version: ${project.version} 4 | api-version: 1.13 5 | author: LuisaGrether 6 | description: Disguise as a mob or other player. 7 | website: https://www.spigotmc.org/resources/idisguise.5509/ 8 | loadbefore: [MinecraftTrainSimulator] 9 | commands: 10 | disguise: 11 | description: Disguise yourself as a mob or other player. 12 | odisguise: 13 | description: Disguise another player as a mob or other player. 14 | undisguise: 15 | description: Undisguise yourself or another player. 16 | -------------------------------------------------------------------------------- /idisguise/src/main/java/de/luisagrether/idisguise/api/EventCancelledException.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.api; 2 | 3 | /** 4 | * This exception is thrown when an attempt to disguise or undisguise a player via the DisguiseAPI fails because the fired event is cancelled by another plugin. 5 | * 6 | * @since 6.0.1 7 | * @author LuisaGrether 8 | */ 9 | public class EventCancelledException extends RuntimeException { 10 | 11 | public EventCancelledException() { 12 | super(); 13 | } 14 | 15 | public EventCancelledException(String message) { 16 | super(message); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /idisguise/src/main/java/de/luisagrether/util/StringOutputStream.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.util; 2 | 3 | import java.io.OutputStream; 4 | 5 | /** 6 | * A string output stream writes the data to a {@linkplain java.lang.String}. 7 | * 8 | * @author LuisaGrether 9 | */ 10 | public class StringOutputStream extends OutputStream { 11 | 12 | private StringBuilder builder = new StringBuilder(); 13 | 14 | /** 15 | * Writes the specified byte to this output stream. 16 | * 17 | * @param data the data 18 | */ 19 | public void write(int data) { 20 | builder.append((char)data); 21 | } 22 | 23 | /** 24 | * Returns a {@linkplain java.lang.String} cotaining the data written to this output stream. 25 | * 26 | * @return a string containing the data 27 | */ 28 | public String toString() { 29 | return builder.toString(); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /clean-all.bat: -------------------------------------------------------------------------------- 1 | call mvn.cmd clean -f idisguise-impl-v1_8_R1/pom.xml 2 | call mvn.cmd clean -f idisguise-impl-v1_8_R2/pom.xml 3 | call mvn.cmd clean -f idisguise-impl-v1_8_R3/pom.xml 4 | call mvn.cmd clean -f idisguise-impl-v1_9_R1/pom.xml 5 | call mvn.cmd clean -f idisguise-impl-v1_9_R2/pom.xml 6 | call mvn.cmd clean -f idisguise-impl-v1_10_R1/pom.xml 7 | call mvn.cmd clean -f idisguise-impl-v1_11_R1/pom.xml 8 | call mvn.cmd clean -f idisguise-impl-v1_12_R1/pom.xml 9 | call mvn.cmd clean -f idisguise-impl-v1_13_R1/pom.xml 10 | call mvn.cmd clean -f idisguise-impl-v1_13_R2/pom.xml 11 | call mvn.cmd clean -f idisguise-impl-v1_14_R1/pom.xml 12 | call mvn.cmd clean -f idisguise-impl-v1_15_R1/pom.xml 13 | call mvn.cmd clean -f idisguise-impl-v1_16_R1/pom.xml 14 | call mvn.cmd clean -f idisguise-impl-v1_16_R2/pom.xml 15 | call mvn.cmd clean -f idisguise-impl-v1_16_R3/pom.xml 16 | call mvn.cmd clean -f idisguise-impl-v1_17_R1/pom.xml 17 | call mvn.cmd clean -f idisguise/pom.xml 18 | -------------------------------------------------------------------------------- /deploy-all.bat: -------------------------------------------------------------------------------- 1 | call mvn.cmd deploy -f idisguise-impl-v1_8_R1/pom.xml 2 | call mvn.cmd deploy -f idisguise-impl-v1_8_R2/pom.xml 3 | call mvn.cmd deploy -f idisguise-impl-v1_8_R3/pom.xml 4 | call mvn.cmd deploy -f idisguise-impl-v1_9_R1/pom.xml 5 | call mvn.cmd deploy -f idisguise-impl-v1_9_R2/pom.xml 6 | call mvn.cmd deploy -f idisguise-impl-v1_10_R1/pom.xml 7 | call mvn.cmd deploy -f idisguise-impl-v1_11_R1/pom.xml 8 | call mvn.cmd deploy -f idisguise-impl-v1_12_R1/pom.xml 9 | call mvn.cmd deploy -f idisguise-impl-v1_13_R1/pom.xml 10 | call mvn.cmd deploy -f idisguise-impl-v1_13_R2/pom.xml 11 | call mvn.cmd deploy -f idisguise-impl-v1_14_R1/pom.xml 12 | call mvn.cmd deploy -f idisguise-impl-v1_15_R1/pom.xml 13 | call mvn.cmd deploy -f idisguise-impl-v1_16_R1/pom.xml 14 | call mvn.cmd deploy -f idisguise-impl-v1_16_R2/pom.xml 15 | call mvn.cmd deploy -f idisguise-impl-v1_16_R3/pom.xml 16 | call mvn.cmd deploy -f idisguise-impl-v1_17_R1/pom.xml 17 | call mvn.cmd deploy -f idisguise/pom.xml 18 | -------------------------------------------------------------------------------- /install-all.bat: -------------------------------------------------------------------------------- 1 | call mvn.cmd install -f idisguise-impl-v1_8_R1/pom.xml 2 | call mvn.cmd install -f idisguise-impl-v1_8_R2/pom.xml 3 | call mvn.cmd install -f idisguise-impl-v1_8_R3/pom.xml 4 | call mvn.cmd install -f idisguise-impl-v1_9_R1/pom.xml 5 | call mvn.cmd install -f idisguise-impl-v1_9_R2/pom.xml 6 | call mvn.cmd install -f idisguise-impl-v1_10_R1/pom.xml 7 | call mvn.cmd install -f idisguise-impl-v1_11_R1/pom.xml 8 | call mvn.cmd install -f idisguise-impl-v1_12_R1/pom.xml 9 | call mvn.cmd install -f idisguise-impl-v1_13_R1/pom.xml 10 | call mvn.cmd install -f idisguise-impl-v1_13_R2/pom.xml 11 | call mvn.cmd install -f idisguise-impl-v1_14_R1/pom.xml 12 | call mvn.cmd install -f idisguise-impl-v1_15_R1/pom.xml 13 | call mvn.cmd install -f idisguise-impl-v1_16_R1/pom.xml 14 | call mvn.cmd install -f idisguise-impl-v1_16_R2/pom.xml 15 | call mvn.cmd install -f idisguise-impl-v1_16_R3/pom.xml 16 | call mvn.cmd install -f idisguise-impl-v1_17_R1/pom.xml 17 | call mvn.cmd install -f idisguise/pom.xml 18 | -------------------------------------------------------------------------------- /idisguise/src/main/java/de/luisagrether/idisguise/api/PlayerDisguiseAsPlayerEvent.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.api; 2 | 3 | import org.bukkit.entity.EntityType; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.HandlerList; 6 | 7 | /** 8 | * This event is fired when a player is to be disguised as another player (either by command or via the API). 9 | * 10 | * @since 6.0.1 11 | * @author LuisaGrether 12 | */ 13 | public class PlayerDisguiseAsPlayerEvent extends PlayerDisguiseEvent { 14 | 15 | private static final HandlerList handlers = new HandlerList(); 16 | private final String targetSkin; 17 | 18 | public PlayerDisguiseAsPlayerEvent(Player player, String targetSkin) { 19 | super(player, EntityType.PLAYER); 20 | this.targetSkin = targetSkin; 21 | } 22 | 23 | /** 24 | * Gets the target skin that is to be applied. 25 | * 26 | * @since 6.0.1 27 | * @return the target skin 28 | */ 29 | public String getTargetSkin() { 30 | return targetSkin; 31 | } 32 | 33 | public HandlerList getHandlers() { 34 | return handlers; 35 | } 36 | 37 | public static HandlerList getHandlerList() { 38 | return handlers; 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # License for iDisguise 2 | 3 | Copyright © Luisa R. Grether 2025 4 | 5 | You may use, copy, and adapt excerpts of this repository — of any size — in your own projects, under the following conditions: 6 | 1. **Non-commercial use:** 7 | Your project must not be profit-oriented. Recovery of costs through donations or minimal ads is acceptable, but making a living or seeking profit from the project is not. 8 | 2. **No mimics or competitors:** 9 | You may not publish or distribute a project that substantially replicates or competes with the original project. 10 | 3. **Attribution:** 11 | Proper credit must be given to the original author. 12 | 4. **Private use:** 13 | Private forks or modifications for personal use are unrestricted, so long as they are not made public in violation of the above. 14 | 15 | ## Third-party components 16 | 17 | This repository contains third-party assets. These are **not covered by the above license** and remain subject to their own respective licenses. You must obtain any necessary rights from their original copyright holders before using these components. 18 | 19 | **Included third-party assets:** 20 | - **bStats** — © Bastian Oppermann 21 | Files included in this repository: none 22 | Files included in the JAR file: 23 | - the package `de.luisagrether.idisguise.io.bstats.*` -------------------------------------------------------------------------------- /idisguise/src/main/resources/config.yml: -------------------------------------------------------------------------------- 1 | # Options affecting the basic behavior of iDisguise (including the developer API) 2 | disguise: 3 | 4 | # Blacklist of disguise types: 5 | # Default ones are unsupported, add any one if you would like to disable it 6 | disguise-type-blacklist: DISGUISE_TYPE_BLACKLIST 7 | 8 | # Blacklist of player disguises: 9 | # Add any player name if you would like to disable it 10 | player-disguise-blacklist: PLAYER_DISGUISE_BLACKLIST 11 | 12 | # Options affecting the commands and permissions of iDisguise (these do NOT affect the developer API) 13 | commands: 14 | 15 | # Whitelist of statements to alter the disguises: 16 | # add/remove any one if you would like to enable/disable it 17 | statement-whitelist: STATEMENT_WHITELIST 18 | 19 | # Do we use permission nodes? 20 | # if true: require permission node 'iDisguise.disguise.' or 'iDisguise.disguise.*' to disguise 21 | # if false: only server operators can disguise 22 | use-permission-nodes: USE_PERMISSION_NODES 23 | 24 | # Options affecting the update checking feature 25 | updates: 26 | 27 | # Check whether an update is available at every server start 28 | check: UPDATE_CHECK 29 | 30 | # Automatically download new updates 31 | download: UPDATE_DOWNLOAD 32 | 33 | # For internal purposes only 34 | version: VERSION 35 | -------------------------------------------------------------------------------- /idisguise/src/main/resources/LICENSE.md: -------------------------------------------------------------------------------- 1 | # License for iDisguise 2 | 3 | Copyright © Luisa R. Grether 2025 4 | 5 | You may use, copy, and adapt excerpts of this repository — of any size — in your own projects, under the following conditions: 6 | 1. **Non-commercial use:** 7 | Your project must not be profit-oriented. Recovery of costs through donations or minimal ads is acceptable, but making a living or seeking profit from the project is not. 8 | 2. **No mimics or competitors:** 9 | You may not publish or distribute a project that substantially replicates or competes with the original project. 10 | 3. **Attribution:** 11 | Proper credit must be given to the original author. 12 | 4. **Private use:** 13 | Private forks or modifications for personal use are unrestricted, so long as they are not made public in violation of the above. 14 | 15 | ## Third-party components 16 | 17 | This repository contains third-party assets. These are **not covered by the above license** and remain subject to their own respective licenses. You must obtain any necessary rights from their original copyright holders before using these components. 18 | 19 | **Included third-party assets:** 20 | - **bStats** — © Bastian Oppermann 21 | Files included in this repository: none 22 | Files included in the JAR file: 23 | - the package `de.luisagrether.idisguise.io.bstats.*` -------------------------------------------------------------------------------- /idisguise/src/main/java/de/luisagrether/idisguise/api/PlayerDisguiseEvent.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.api; 2 | 3 | import org.bukkit.entity.EntityType; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.Cancellable; 6 | import org.bukkit.event.HandlerList; 7 | import org.bukkit.event.player.PlayerEvent; 8 | 9 | /** 10 | * This event is fired when a player is to be disguised (either by command or via the API). 11 | * 12 | * @since 6.0.1 13 | * @author LuisaGrether 14 | */ 15 | public class PlayerDisguiseEvent extends PlayerEvent implements Cancellable { 16 | 17 | private static final HandlerList handlers = new HandlerList(); 18 | private boolean cancel = false; 19 | private final EntityType type; 20 | 21 | public PlayerDisguiseEvent(Player player, EntityType type) { 22 | super(player); 23 | this.type = type; 24 | } 25 | 26 | /** 27 | * Gets the disguise that is to be applied. 28 | * 29 | * @since 6.0.1 30 | * @return the disguise 31 | */ 32 | public EntityType getDisguise() { 33 | return type; 34 | } 35 | 36 | public boolean isCancelled() { 37 | return cancel; 38 | } 39 | 40 | public void setCancelled(boolean cancel) { 41 | this.cancel = cancel; 42 | } 43 | 44 | public HandlerList getHandlers() { 45 | return handlers; 46 | } 47 | 48 | public static HandlerList getHandlerList() { 49 | return handlers; 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # iDisguise 2 | Plugin for CraftBukkit/Spigot 1.8–1.21 and Paper/Purpur 1.18–1.21. 3 | 4 | ## Basic information 5 | This plugin allows you to turn into almost every entity that exists in Minecraft. 6 | More information can be found here: https://www.spigotmc.org/resources/idisguise.5509/ 7 | 8 | ## Snapshot files 9 | Compiled snapshot files may be downloaded over here: https://www.luisagrether.de/mc/repo/de/luisagrether/idisguise/idisguise/ 10 | 11 | ## GitHub repository 12 | The master branch should always hold a (hopefully) bug-free recommended release version of iDisguise. Small changes (such as bug fixes etc.) get pushed to the snapshot branch until they are released officially. If you would like to develop your own fork of this repository, make sure to build it upon the master branch to ensure proper functionality. 13 | 14 | ## Maven repository 15 | ```` 16 | 17 | luisagrether-repo 18 | https://www.luisagrether.de/mc/repo/ 19 | 20 | 21 | 22 | 23 | de.luisagrether.idisguise 24 | idisguise 25 | 6.0.2 26 | 27 | ```` 28 | 29 | ## Compiling 30 | In order to compile the whole plugin you have to clone/download this repository and build the project _idisguise_ using Maven. 31 | On Windows, use _.\install-all.bat_ to compile and install all modules of iDisguise. The final jar file will be located under _/idisguise/target/idisguise-<VERSION>.jar_. 32 | -------------------------------------------------------------------------------- /idisguise/src/main/java/de/luisagrether/idisguise/api/PlayerUndisguiseEvent.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.api; 2 | 3 | import org.bukkit.entity.EntityType; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.Cancellable; 6 | import org.bukkit.event.HandlerList; 7 | import org.bukkit.event.player.PlayerEvent; 8 | 9 | import de.luisagrether.idisguise.iDisguise; 10 | 11 | /** 12 | * This event is fired when a player is to be undisguised (either by command or via the API). 13 | * WARNING: Players are also undisguised when they leave the server. No event is called in that case. 14 | * 15 | * @since 6.0.1 16 | * @author LuisaGrether 17 | */ 18 | public class PlayerUndisguiseEvent extends PlayerEvent implements Cancellable { 19 | 20 | private static final HandlerList handlers = new HandlerList(); 21 | private boolean cancel = false; 22 | private final EntityType type; 23 | 24 | public PlayerUndisguiseEvent(Player player) { 25 | super(player); 26 | this.type = iDisguise.getInstance().getDisguise(player); 27 | } 28 | 29 | /** 30 | * Gets the disguise that is to be removed. 31 | * 32 | * @since 6.0.1 33 | * @return the disguise 34 | */ 35 | public EntityType getDisguise() { 36 | return type; 37 | } 38 | 39 | public boolean isCancelled() { 40 | return cancel; 41 | } 42 | 43 | public void setCancelled(boolean cancel) { 44 | this.cancel = cancel; 45 | } 46 | 47 | public HandlerList getHandlers() { 48 | return handlers; 49 | } 50 | 51 | public static HandlerList getHandlerList() { 52 | return handlers; 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /idisguise/src/main/java/de/luisagrether/idisguise/api/PlayerInteractDisguisedPlayerEvent.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.api; 2 | 3 | import org.bukkit.entity.EntityType; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.HandlerList; 6 | import org.bukkit.event.player.PlayerEvent; 7 | 8 | import de.luisagrether.idisguise.iDisguise; 9 | 10 | /** 11 | * This event is fired whenever someone right clicks an entity that represents a disguised player.
12 | * This event was introduced to enable new plugin functionality (e.g. MobAbilities).
13 | * WARNING: Due to changes in the internal handling of disguises, this event does not extend PlayerInteractEntityEvent in the new API (6.0.1+). 14 | * 15 | * @since 6.0.1 16 | * @author LuisaGrether 17 | */ 18 | public class PlayerInteractDisguisedPlayerEvent extends PlayerEvent { 19 | 20 | private static final HandlerList handlers = new HandlerList(); 21 | private final Player clicked; 22 | private final EntityType type; 23 | 24 | public PlayerInteractDisguisedPlayerEvent(Player who, Player clicked) { 25 | super(who); 26 | this.clicked = clicked; 27 | this.type = iDisguise.getInstance().getDisguise(clicked); 28 | } 29 | 30 | /** 31 | * Gets the disguised player that was right-clicked by the player. 32 | * 33 | * @since 6.0.1 34 | * @return disguised player right-clicked by player 35 | */ 36 | public Player getRightClicked() { 37 | return clicked; 38 | } 39 | 40 | /** 41 | * Gets the disguise type of the right-clicked player. 42 | * 43 | * @since 6.0.1 44 | * @return disguise type of the right-clicked player 45 | */ 46 | public EntityType getDisguise() { 47 | return type; 48 | } 49 | 50 | public HandlerList getHandlers() { 51 | return handlers; 52 | } 53 | 54 | public static HandlerList getHandlerList() { 55 | return handlers; 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /idisguise-impl-v1_13_R1/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | de.luisagrether.idisguise 4 | idisguise-impl-v1_13_R1 5 | 6.0.1 6 | iDisguise Implementation for v1_13_R1 7 | 8 | 9 | UTF-8 10 | yyyy_MM_dd-HH_mm_ss 11 | 12 | 13 | 14 | 15 | org.spigotmc 16 | spigot 17 | 1.13-R0.1-SNAPSHOT 18 | provided 19 | 20 | 21 | 22 | 23 | 24 | 25 | src/main/resources 26 | true 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.11.0 34 | 35 | 1.8 36 | 1.8 37 | true 38 | true 39 | ${JAVA_8_HOME}/bin/javac 40 | 41 | 42 | 43 | 44 | 45 | org.apache.maven.wagon 46 | wagon-ssh 47 | 3.1.0 48 | 49 | 50 | 51 | 52 | 53 | 54 | luisagrether-repository-ftp 55 | sftp://ssh.strato.de/ 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /idisguise-impl-v1_8_R1/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | de.luisagrether.idisguise 4 | idisguise-impl-v1_8_R1 5 | 6.0.1 6 | iDisguise Implementation for v1_8_R1 7 | 8 | 9 | UTF-8 10 | yyyy_MM_dd-HH_mm_ss 11 | 12 | 13 | 14 | 15 | org.spigotmc 16 | spigot 17 | 1.8-R0.1-SNAPSHOT 18 | provided 19 | 20 | 21 | 22 | 23 | 24 | 25 | src/main/resources 26 | true 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.11.0 34 | 35 | 1.8 36 | 1.8 37 | true 38 | true 39 | ${JAVA_8_HOME}/bin/javac 40 | 41 | 42 | 43 | 44 | 45 | org.apache.maven.wagon 46 | wagon-ssh 47 | 3.1.0 48 | 49 | 50 | 51 | 52 | 53 | 54 | luisagrether-repository-ftp 55 | sftp://ssh.strato.de/ 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /idisguise-impl-v1_8_R2/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | de.luisagrether.idisguise 4 | idisguise-impl-v1_8_R2 5 | 6.0.1 6 | iDisguise Implementation for v1_8_R2 7 | 8 | 9 | UTF-8 10 | yyyy_MM_dd-HH_mm_ss 11 | 12 | 13 | 14 | 15 | org.spigotmc 16 | spigot 17 | 1.8.3-R0.1-SNAPSHOT 18 | provided 19 | 20 | 21 | 22 | 23 | 24 | 25 | src/main/resources 26 | true 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.11.0 34 | 35 | 1.8 36 | 1.8 37 | true 38 | true 39 | ${JAVA_8_HOME}/bin/javac 40 | 41 | 42 | 43 | 44 | 45 | org.apache.maven.wagon 46 | wagon-ssh 47 | 3.1.0 48 | 49 | 50 | 51 | 52 | 53 | 54 | luisagrether-repository-ftp 55 | sftp://ssh.strato.de/ 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /idisguise-impl-v1_8_R3/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | de.luisagrether.idisguise 4 | idisguise-impl-v1_8_R3 5 | 6.0.1 6 | iDisguise Implementation for v1_8_R3 7 | 8 | 9 | UTF-8 10 | yyyy_MM_dd-HH_mm_ss 11 | 12 | 13 | 14 | 15 | org.spigotmc 16 | spigot 17 | 1.8.8-R0.1-SNAPSHOT 18 | provided 19 | 20 | 21 | 22 | 23 | 24 | 25 | src/main/resources 26 | true 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.11.0 34 | 35 | 1.8 36 | 1.8 37 | true 38 | true 39 | ${JAVA_8_HOME}/bin/javac 40 | 41 | 42 | 43 | 44 | 45 | org.apache.maven.wagon 46 | wagon-ssh 47 | 3.1.0 48 | 49 | 50 | 51 | 52 | 53 | 54 | luisagrether-repository-ftp 55 | sftp://ssh.strato.de/ 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /idisguise-impl-v1_9_R1/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | de.luisagrether.idisguise 4 | idisguise-impl-v1_9_R1 5 | 6.0.1 6 | iDisguise Implementation for v1_9_R1 7 | 8 | 9 | UTF-8 10 | yyyy_MM_dd-HH_mm_ss 11 | 12 | 13 | 14 | 15 | org.spigotmc 16 | spigot 17 | 1.9.2-R0.1-SNAPSHOT 18 | provided 19 | 20 | 21 | 22 | 23 | 24 | 25 | src/main/resources 26 | true 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.11.0 34 | 35 | 1.8 36 | 1.8 37 | true 38 | true 39 | ${JAVA_8_HOME}/bin/javac 40 | 41 | 42 | 43 | 44 | 45 | org.apache.maven.wagon 46 | wagon-ssh 47 | 3.1.0 48 | 49 | 50 | 51 | 52 | 53 | 54 | luisagrether-repository-ftp 55 | sftp://ssh.strato.de/ 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /idisguise-impl-v1_9_R2/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | de.luisagrether.idisguise 4 | idisguise-impl-v1_9_R2 5 | 6.0.1 6 | iDisguise Implementation for v1_9_R2 7 | 8 | 9 | UTF-8 10 | yyyy_MM_dd-HH_mm_ss 11 | 12 | 13 | 14 | 15 | org.spigotmc 16 | spigot 17 | 1.9.4-R0.1-SNAPSHOT 18 | provided 19 | 20 | 21 | 22 | 23 | 24 | 25 | src/main/resources 26 | true 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.11.0 34 | 35 | 1.8 36 | 1.8 37 | true 38 | true 39 | ${JAVA_8_HOME}/bin/javac 40 | 41 | 42 | 43 | 44 | 45 | org.apache.maven.wagon 46 | wagon-ssh 47 | 3.1.0 48 | 49 | 50 | 51 | 52 | 53 | 54 | luisagrether-repository-ftp 55 | sftp://ssh.strato.de/ 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /idisguise-impl-v1_10_R1/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | de.luisagrether.idisguise 4 | idisguise-impl-v1_10_R1 5 | 6.0.1 6 | iDisguise Implementation for v1_10_R1 7 | 8 | 9 | UTF-8 10 | yyyy_MM_dd-HH_mm_ss 11 | 12 | 13 | 14 | 15 | org.spigotmc 16 | spigot 17 | 1.10.2-R0.1-SNAPSHOT 18 | provided 19 | 20 | 21 | 22 | 23 | 24 | 25 | src/main/resources 26 | true 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.11.0 34 | 35 | 1.8 36 | 1.8 37 | true 38 | true 39 | ${JAVA_8_HOME}/bin/javac 40 | 41 | 42 | 43 | 44 | 45 | org.apache.maven.wagon 46 | wagon-ssh 47 | 3.1.0 48 | 49 | 50 | 51 | 52 | 53 | 54 | luisagrether-repository-ftp 55 | sftp://ssh.strato.de/ 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /idisguise-impl-v1_11_R1/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | de.luisagrether.idisguise 4 | idisguise-impl-v1_11_R1 5 | 6.0.1 6 | iDisguise Implementation for v1_11_R1 7 | 8 | 9 | UTF-8 10 | yyyy_MM_dd-HH_mm_ss 11 | 12 | 13 | 14 | 15 | org.spigotmc 16 | spigot 17 | 1.11.2-R0.1-SNAPSHOT 18 | provided 19 | 20 | 21 | 22 | 23 | 24 | 25 | src/main/resources 26 | true 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.11.0 34 | 35 | 1.8 36 | 1.8 37 | true 38 | true 39 | ${JAVA_8_HOME}/bin/javac 40 | 41 | 42 | 43 | 44 | 45 | org.apache.maven.wagon 46 | wagon-ssh 47 | 3.1.0 48 | 49 | 50 | 51 | 52 | 53 | 54 | luisagrether-repository-ftp 55 | sftp://ssh.strato.de/ 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /idisguise-impl-v1_12_R1/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | de.luisagrether.idisguise 4 | idisguise-impl-v1_12_R1 5 | 6.0.1 6 | iDisguise Implementation for v1_12_R1 7 | 8 | 9 | UTF-8 10 | yyyy_MM_dd-HH_mm_ss 11 | 12 | 13 | 14 | 15 | org.spigotmc 16 | spigot 17 | 1.12.2-R0.1-SNAPSHOT 18 | provided 19 | 20 | 21 | 22 | 23 | 24 | 25 | src/main/resources 26 | true 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.11.0 34 | 35 | 1.8 36 | 1.8 37 | true 38 | true 39 | ${JAVA_8_HOME}/bin/javac 40 | 41 | 42 | 43 | 44 | 45 | org.apache.maven.wagon 46 | wagon-ssh 47 | 3.1.0 48 | 49 | 50 | 51 | 52 | 53 | 54 | luisagrether-repository-ftp 55 | sftp://ssh.strato.de/ 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /idisguise-impl-v1_13_R2/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | de.luisagrether.idisguise 4 | idisguise-impl-v1_13_R2 5 | 6.0.1 6 | iDisguise Implementation for v1_13_R2 7 | 8 | 9 | UTF-8 10 | yyyy_MM_dd-HH_mm_ss 11 | 12 | 13 | 14 | 15 | org.spigotmc 16 | spigot 17 | 1.13.2-R0.1-SNAPSHOT 18 | provided 19 | 20 | 21 | 22 | 23 | 24 | 25 | src/main/resources 26 | true 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.11.0 34 | 35 | 1.8 36 | 1.8 37 | true 38 | true 39 | ${JAVA_8_HOME}/bin/javac 40 | 41 | 42 | 43 | 44 | 45 | org.apache.maven.wagon 46 | wagon-ssh 47 | 3.1.0 48 | 49 | 50 | 51 | 52 | 53 | 54 | luisagrether-repository-ftp 55 | sftp://ssh.strato.de/ 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /idisguise-impl-v1_14_R1/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | de.luisagrether.idisguise 4 | idisguise-impl-v1_14_R1 5 | 6.0.1 6 | iDisguise Implementation for v1_14_R1 7 | 8 | 9 | UTF-8 10 | yyyy_MM_dd-HH_mm_ss 11 | 12 | 13 | 14 | 15 | org.spigotmc 16 | spigot 17 | 1.14.4-R0.1-SNAPSHOT 18 | provided 19 | 20 | 21 | 22 | 23 | 24 | 25 | src/main/resources 26 | true 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.11.0 34 | 35 | 1.8 36 | 1.8 37 | true 38 | true 39 | ${JAVA_8_HOME}/bin/javac 40 | 41 | 42 | 43 | 44 | 45 | org.apache.maven.wagon 46 | wagon-ssh 47 | 3.1.0 48 | 49 | 50 | 51 | 52 | 53 | 54 | luisagrether-repository-ftp 55 | sftp://ssh.strato.de/ 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /idisguise-impl-v1_15_R1/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | de.luisagrether.idisguise 4 | idisguise-impl-v1_15_R1 5 | 6.0.1 6 | iDisguise Implementation for v1_15_R1 7 | 8 | 9 | UTF-8 10 | yyyy_MM_dd-HH_mm_ss 11 | 12 | 13 | 14 | 15 | org.spigotmc 16 | spigot 17 | 1.15.2-R0.1-SNAPSHOT 18 | provided 19 | 20 | 21 | 22 | 23 | 24 | 25 | src/main/resources 26 | true 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.11.0 34 | 35 | 1.8 36 | 1.8 37 | true 38 | true 39 | ${JAVA_8_HOME}/bin/javac 40 | 41 | 42 | 43 | 44 | 45 | org.apache.maven.wagon 46 | wagon-ssh 47 | 3.1.0 48 | 49 | 50 | 51 | 52 | 53 | 54 | luisagrether-repository-ftp 55 | sftp://ssh.strato.de/ 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /idisguise-impl-v1_16_R1/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | de.luisagrether.idisguise 4 | idisguise-impl-v1_16_R1 5 | 6.0.1 6 | iDisguise Implementation for v1_16_R1 7 | 8 | 9 | UTF-8 10 | yyyy_MM_dd-HH_mm_ss 11 | 12 | 13 | 14 | 15 | org.spigotmc 16 | spigot 17 | 1.16.1-R0.1-SNAPSHOT 18 | provided 19 | 20 | 21 | 22 | 23 | 24 | 25 | src/main/resources 26 | true 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.11.0 34 | 35 | 1.8 36 | 1.8 37 | true 38 | true 39 | ${JAVA_8_HOME}/bin/javac 40 | 41 | 42 | 43 | 44 | 45 | org.apache.maven.wagon 46 | wagon-ssh 47 | 3.1.0 48 | 49 | 50 | 51 | 52 | 53 | 54 | luisagrether-repository-ftp 55 | sftp://ssh.strato.de/ 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /idisguise-impl-v1_16_R2/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | de.luisagrether.idisguise 4 | idisguise-impl-v1_16_R2 5 | 6.0.1 6 | iDisguise Implementation for v1_16_R2 7 | 8 | 9 | UTF-8 10 | yyyy_MM_dd-HH_mm_ss 11 | 12 | 13 | 14 | 15 | org.spigotmc 16 | spigot 17 | 1.16.3-R0.1-SNAPSHOT 18 | provided 19 | 20 | 21 | 22 | 23 | 24 | 25 | src/main/resources 26 | true 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.11.0 34 | 35 | 1.8 36 | 1.8 37 | true 38 | true 39 | ${JAVA_8_HOME}/bin/javac 40 | 41 | 42 | 43 | 44 | 45 | org.apache.maven.wagon 46 | wagon-ssh 47 | 3.1.0 48 | 49 | 50 | 51 | 52 | 53 | 54 | luisagrether-repository-ftp 55 | sftp://ssh.strato.de/ 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /idisguise-impl-v1_16_R3/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | de.luisagrether.idisguise 4 | idisguise-impl-v1_16_R3 5 | 6.0.1 6 | iDisguise Implementation for v1_16_R3 7 | 8 | 9 | UTF-8 10 | yyyy_MM_dd-HH_mm_ss 11 | 12 | 13 | 14 | 15 | org.spigotmc 16 | spigot 17 | 1.16.5-R0.1-SNAPSHOT 18 | provided 19 | 20 | 21 | 22 | 23 | 24 | 25 | src/main/resources 26 | true 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.11.0 34 | 35 | 1.8 36 | 1.8 37 | true 38 | true 39 | ${JAVA_8_HOME}/bin/javac 40 | 41 | 42 | 43 | 44 | 45 | org.apache.maven.wagon 46 | wagon-ssh 47 | 3.1.0 48 | 49 | 50 | 51 | 52 | 53 | 54 | luisagrether-repository-ftp 55 | sftp://ssh.strato.de/ 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /idisguise-impl-v1_17_R1/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | de.luisagrether.idisguise 4 | idisguise-impl-v1_17_R1 5 | 6.0.1 6 | iDisguise Implementation for v1_17_R1 7 | 8 | 9 | UTF-8 10 | yyyy_MM_dd-HH_mm_ss 11 | 12 | 13 | 14 | 15 | org.spigotmc 16 | spigot 17 | 1.17.1-R0.1-SNAPSHOT 18 | provided 19 | 20 | 21 | 22 | 23 | 24 | 25 | src/main/resources 26 | true 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.11.0 34 | 35 | 17 36 | 17 37 | true 38 | true 39 | ${JAVA_17_HOME}/bin/javac 40 | 41 | 42 | 43 | 44 | 45 | org.apache.maven.wagon 46 | wagon-ssh 47 | 3.1.0 48 | 49 | 50 | 51 | 52 | 53 | 54 | luisagrether-repository-ftp 55 | sftp://ssh.strato.de/ 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /idisguise/src/main/java/de/luisagrether/util/ObjectUtil.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.util; 2 | 3 | import java.util.Collection; 4 | 5 | /** 6 | * Some utility methods for objects. 7 | * 8 | * @author LuisaGrether 9 | */ 10 | public class ObjectUtil { 11 | 12 | /** 13 | * Tests whether an object equals any of the others. 14 | * 15 | * @param object the object 16 | * @param objects the other objects 17 | * @return true if the object equals any of the others 18 | */ 19 | public static boolean equals(Object object, Object... objects) { 20 | for(Object obj : objects) { 21 | if(object.equals(obj)) { 22 | return true; 23 | } 24 | } 25 | return false; 26 | } 27 | 28 | /** 29 | * Tests whether an object equals any of the others. 30 | * 31 | * @param object the object 32 | * @param objects the other objects 33 | * @return true if the object equals any of the others 34 | */ 35 | public static boolean equals(Object object, Collection objects) { 36 | for(Object obj : objects) { 37 | if(object.equals(obj)) { 38 | return true; 39 | } 40 | } 41 | return false; 42 | } 43 | 44 | /** 45 | * Tests whether an object is an instance of any of the given classes. 46 | * 47 | * @param object the object to test 48 | * @param classes the classes to test 49 | * @return true if the object is an instance of at least one of the given classes 50 | */ 51 | public static boolean instanceOf(Object object, Class... classes) { 52 | for(Class clazz : classes) { 53 | if(clazz.isInstance(object)) { 54 | return true; 55 | } 56 | } 57 | return false; 58 | } 59 | 60 | /** 61 | * Tests whether an object is an instance of any of the given classes. 62 | * 63 | * @param object the object to test 64 | * @param classes the classes to test 65 | * @return true if the object is an instance of at least one of the given classes 66 | */ 67 | public static boolean instanceOf(Object object, Collection> classes) { 68 | for(Class clazz : classes) { 69 | if(clazz.isInstance(object)) { 70 | return true; 71 | } 72 | } 73 | return false; 74 | } 75 | 76 | /** 77 | * Tests whether any of the given objects is an instance of the given class. 78 | * 79 | * @param clazz the class to test 80 | * @param objects the objects to test 81 | * @return true if at least one of the given objects is an instance of the given class 82 | */ 83 | public static boolean instanceOf(Class clazz, Object... objects) { 84 | for(Object obj : objects) { 85 | if(clazz.isInstance(obj)) { 86 | return true; 87 | } 88 | } 89 | return false; 90 | } 91 | 92 | /** 93 | * Tests whether any of the given objects is an instance of the given class. 94 | * 95 | * @param clazz the class to test 96 | * @param objects the objects to test 97 | * @return true if at least one of the given objects is an instance of the given class 98 | */ 99 | public static boolean instanceOf(Class clazz, Collection objects) { 100 | for(Object obj : objects) { 101 | if(clazz.isInstance(obj)) { 102 | return true; 103 | } 104 | } 105 | return false; 106 | } 107 | 108 | } 109 | -------------------------------------------------------------------------------- /idisguise/dependency-reduced-pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | de.luisagrether.idisguise 5 | idisguise 6 | iDisguise 7 | 6.0.2 8 | Recode of the famous iDisguse plugin! 9 | 10 | 11 | 12 | org.apache.maven.wagon 13 | wagon-ssh 14 | 3.1.0 15 | 16 | 17 | 18 | 19 | true 20 | src/main/resources 21 | 22 | 23 | 24 | 25 | maven-compiler-plugin 26 | 3.11.0 27 | 28 | 1.8 29 | 1.8 30 | true 31 | true 32 | ${JAVA_8_HOME}/bin/javac 33 | 34 | 35 | 36 | maven-shade-plugin 37 | 3.6.0 38 | 39 | 40 | package 41 | 42 | shade 43 | 44 | 45 | 46 | 47 | 48 | 49 | de.luisagrether.idisguise:* 50 | org.bstats:* 51 | 52 | 53 | 54 | 55 | org.bstats.bukkit 56 | de.luisagrether.idisguise.io.bstats 57 | 58 | 59 | 60 | 61 | 62 | maven-javadoc-plugin 63 | 64 | de.luisagrether.idisguise.api 65 | 66 | 67 | 68 | 69 | 70 | 71 | spigot-repo 72 | https://hub.spigotmc.org/nexus/content/repositories/snapshots/ 73 | 74 | 75 | codemc-repo 76 | https://repo.codemc.org/repository/maven-public/ 77 | 78 | 79 | 80 | 81 | org.spigotmc 82 | spigot-api 83 | 1.18.2-R0.1-SNAPSHOT 84 | provided 85 | 86 | 87 | com.googlecode.json-simple 88 | json-simple 89 | 1.1.1 90 | provided 91 | 92 | 93 | 94 | 95 | luisagrether-repository-ftp 96 | sftp://ssh.strato.de/ 97 | 98 | 99 | 100 | UTF-8 101 | yyyy_MM_dd-HH_mm_ss 102 | 103 | 104 | -------------------------------------------------------------------------------- /idisguise-impl-v1_8_R2/src/main/java/de/luisagrether/idisguise/impl/EntityTrackerEntry_v1_8_R2.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.impl; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.ArrayList; 5 | import java.util.Set; 6 | 7 | import org.bukkit.craftbukkit.v1_8_R2.entity.CraftEntity; 8 | import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer; 9 | import org.bukkit.entity.Entity; 10 | import org.bukkit.entity.Player; 11 | 12 | import net.minecraft.server.v1_8_R2.EntityPlayer; 13 | import net.minecraft.server.v1_8_R2.EntityTracker; 14 | import net.minecraft.server.v1_8_R2.EntityTrackerEntry; 15 | import net.minecraft.server.v1_8_R2.WorldServer; 16 | 17 | public class EntityTrackerEntry_v1_8_R2 extends EntityTrackerEntry { 18 | 19 | private static Field EntityTrackerEntry_u = null; 20 | private static Field EntityTracker_trackerSet = null; 21 | static { 22 | try { 23 | EntityTrackerEntry_u = EntityTrackerEntry.class.getDeclaredField("u"); 24 | EntityTrackerEntry_u.setAccessible(true); 25 | EntityTracker_trackerSet = EntityTracker.class.getDeclaredField("c"); 26 | EntityTracker_trackerSet.setAccessible(true); 27 | } catch(Exception e) {} 28 | } 29 | 30 | private final int targetId; 31 | private boolean intercept; 32 | 33 | EntityTrackerEntry_v1_8_R2(EntityTrackerEntry original, int targetId) throws IllegalAccessException { 34 | super( 35 | original.tracker, 36 | original.b, 37 | original.c, 38 | EntityTrackerEntry_u.getBoolean(original) 39 | ); 40 | this.targetId = targetId; 41 | this.intercept = false; 42 | } 43 | 44 | public void toggleIntercept(boolean intercept) { 45 | this.intercept = intercept; 46 | } 47 | 48 | @Override 49 | public void updatePlayer(EntityPlayer entityPlayer) { 50 | if(intercept && entityPlayer.getId() == targetId) { 51 | return; 52 | } 53 | super.updatePlayer(entityPlayer); 54 | } 55 | 56 | public static void inject(Entity entity, Player player) throws IllegalAccessException { 57 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 58 | EntityTrackerEntry original = tracker.trackedEntities.get(entity.getEntityId()); 59 | if(original instanceof EntityTrackerEntry_v1_8_R2) { 60 | return; 61 | } else { 62 | tracker.trackedEntities.d(entity.getEntityId()); 63 | Set entrySet = (Set)EntityTracker_trackerSet.get(tracker); 64 | entrySet.remove(original); 65 | EntityTrackerEntry_v1_8_R2 intruder = new EntityTrackerEntry_v1_8_R2(original, player.getEntityId()); 66 | tracker.trackedEntities.a(entity.getEntityId(), intruder); 67 | entrySet.add(intruder); 68 | for(EntityPlayer observer : new ArrayList<>(original.trackedPlayers)) { 69 | original.clear(observer); 70 | intruder.updatePlayer(observer); 71 | } 72 | } 73 | } 74 | 75 | public static void toggleIntercept(Entity entity, Player player, boolean intercept) { 76 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 77 | EntityTrackerEntry entry = tracker.trackedEntities.get(entity.getEntityId()); 78 | if(!(entry instanceof EntityTrackerEntry_v1_8_R2)) { 79 | throw new IllegalStateException(); 80 | } else { 81 | EntityTrackerEntry_v1_8_R2 intruder = (EntityTrackerEntry_v1_8_R2)entry; 82 | if(intruder.intercept == intercept) { 83 | return; 84 | } else { 85 | intruder.toggleIntercept(intercept); 86 | if(intercept) { 87 | intruder.clear(((CraftPlayer)player).getHandle()); 88 | } else { 89 | intruder.updatePlayer(((CraftPlayer)player).getHandle()); 90 | } 91 | } 92 | } 93 | } 94 | 95 | } 96 | -------------------------------------------------------------------------------- /idisguise-impl-v1_8_R3/src/main/java/de/luisagrether/idisguise/impl/EntityTrackerEntry_v1_8_R3.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.impl; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.ArrayList; 5 | import java.util.Set; 6 | 7 | import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; 8 | import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; 9 | import org.bukkit.entity.Entity; 10 | import org.bukkit.entity.Player; 11 | 12 | import net.minecraft.server.v1_8_R3.EntityPlayer; 13 | import net.minecraft.server.v1_8_R3.EntityTracker; 14 | import net.minecraft.server.v1_8_R3.EntityTrackerEntry; 15 | import net.minecraft.server.v1_8_R3.WorldServer; 16 | 17 | public class EntityTrackerEntry_v1_8_R3 extends EntityTrackerEntry { 18 | 19 | private static Field EntityTrackerEntry_u = null; 20 | private static Field EntityTracker_trackerSet = null; 21 | static { 22 | try { 23 | EntityTrackerEntry_u = EntityTrackerEntry.class.getDeclaredField("u"); 24 | EntityTrackerEntry_u.setAccessible(true); 25 | EntityTracker_trackerSet = EntityTracker.class.getDeclaredField("c"); 26 | EntityTracker_trackerSet.setAccessible(true); 27 | } catch(Exception e) {} 28 | } 29 | 30 | private final int targetId; 31 | private boolean intercept; 32 | 33 | EntityTrackerEntry_v1_8_R3(EntityTrackerEntry original, int targetId) throws IllegalAccessException { 34 | super( 35 | original.tracker, 36 | original.b, 37 | original.c, 38 | EntityTrackerEntry_u.getBoolean(original) 39 | ); 40 | this.targetId = targetId; 41 | this.intercept = false; 42 | } 43 | 44 | public void toggleIntercept(boolean intercept) { 45 | this.intercept = intercept; 46 | } 47 | 48 | @Override 49 | public void updatePlayer(EntityPlayer entityPlayer) { 50 | if(intercept && entityPlayer.getId() == targetId) { 51 | return; 52 | } 53 | super.updatePlayer(entityPlayer); 54 | } 55 | 56 | public static void inject(Entity entity, Player player) throws IllegalAccessException { 57 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 58 | EntityTrackerEntry original = tracker.trackedEntities.get(entity.getEntityId()); 59 | if(original instanceof EntityTrackerEntry_v1_8_R3) { 60 | return; 61 | } else { 62 | tracker.trackedEntities.d(entity.getEntityId()); 63 | Set entrySet = (Set)EntityTracker_trackerSet.get(tracker); 64 | entrySet.remove(original); 65 | EntityTrackerEntry_v1_8_R3 intruder = new EntityTrackerEntry_v1_8_R3(original, player.getEntityId()); 66 | tracker.trackedEntities.a(entity.getEntityId(), intruder); 67 | entrySet.add(intruder); 68 | for(EntityPlayer observer : new ArrayList<>(original.trackedPlayers)) { 69 | original.clear(observer); 70 | intruder.updatePlayer(observer); 71 | } 72 | } 73 | } 74 | 75 | public static void toggleIntercept(Entity entity, Player player, boolean intercept) { 76 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 77 | EntityTrackerEntry entry = tracker.trackedEntities.get(entity.getEntityId()); 78 | if(!(entry instanceof EntityTrackerEntry_v1_8_R3)) { 79 | throw new IllegalStateException(); 80 | } else { 81 | EntityTrackerEntry_v1_8_R3 intruder = (EntityTrackerEntry_v1_8_R3)entry; 82 | if(intruder.intercept == intercept) { 83 | return; 84 | } else { 85 | intruder.toggleIntercept(intercept); 86 | if(intercept) { 87 | intruder.clear(((CraftPlayer)player).getHandle()); 88 | } else { 89 | intruder.updatePlayer(((CraftPlayer)player).getHandle()); 90 | } 91 | } 92 | } 93 | } 94 | 95 | } 96 | -------------------------------------------------------------------------------- /idisguise-impl-v1_8_R1/src/main/java/de/luisagrether/idisguise/impl/EntityTrackerEntry_v1_8_R1.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.impl; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.ArrayList; 5 | import java.util.Set; 6 | 7 | import org.bukkit.craftbukkit.v1_8_R1.entity.CraftEntity; 8 | import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; 9 | import org.bukkit.entity.Entity; 10 | import org.bukkit.entity.Player; 11 | 12 | import net.minecraft.server.v1_8_R1.EntityPlayer; 13 | import net.minecraft.server.v1_8_R1.EntityTracker; 14 | import net.minecraft.server.v1_8_R1.EntityTrackerEntry; 15 | import net.minecraft.server.v1_8_R1.WorldServer; 16 | 17 | public class EntityTrackerEntry_v1_8_R1 extends EntityTrackerEntry { 18 | 19 | private static Field EntityTrackerEntry_u = null; 20 | private static Field EntityTracker_trackerSet = null; 21 | static { 22 | try { 23 | EntityTrackerEntry_u = EntityTrackerEntry.class.getDeclaredField("u"); 24 | EntityTrackerEntry_u.setAccessible(true); 25 | EntityTracker_trackerSet = EntityTracker.class.getDeclaredField("c"); 26 | EntityTracker_trackerSet.setAccessible(true); 27 | } catch(Exception e) {} 28 | } 29 | 30 | private final int targetId; 31 | private boolean intercept; 32 | 33 | EntityTrackerEntry_v1_8_R1(EntityTrackerEntry original, int targetId) throws IllegalAccessException { 34 | super( 35 | original.tracker, 36 | original.b, 37 | original.c, 38 | EntityTrackerEntry_u.getBoolean(original) 39 | ); 40 | this.targetId = targetId; 41 | this.intercept = false; 42 | } 43 | 44 | public void toggleIntercept(boolean intercept) { 45 | this.intercept = intercept; 46 | } 47 | 48 | @Override 49 | public void updatePlayer(EntityPlayer entityPlayer) { 50 | if(intercept && entityPlayer.getId() == targetId) { 51 | return; 52 | } 53 | super.updatePlayer(entityPlayer); 54 | } 55 | 56 | public static void inject(Entity entity, Player player) throws IllegalAccessException { 57 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 58 | EntityTrackerEntry original = (EntityTrackerEntry)tracker.trackedEntities.get(entity.getEntityId()); 59 | if(original instanceof EntityTrackerEntry_v1_8_R1) { 60 | return; 61 | } else { 62 | tracker.trackedEntities.d(entity.getEntityId()); 63 | Set entrySet = (Set)EntityTracker_trackerSet.get(tracker); 64 | entrySet.remove(original); 65 | EntityTrackerEntry_v1_8_R1 intruder = new EntityTrackerEntry_v1_8_R1(original, player.getEntityId()); 66 | tracker.trackedEntities.a(entity.getEntityId(), intruder); 67 | entrySet.add(intruder); 68 | for(Object observer : new ArrayList<>(original.trackedPlayers)) { 69 | original.clear((EntityPlayer)observer); 70 | intruder.updatePlayer((EntityPlayer)observer); 71 | } 72 | } 73 | } 74 | 75 | public static void toggleIntercept(Entity entity, Player player, boolean intercept) { 76 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 77 | EntityTrackerEntry entry = (EntityTrackerEntry)tracker.trackedEntities.get(entity.getEntityId()); 78 | if(!(entry instanceof EntityTrackerEntry_v1_8_R1)) { 79 | throw new IllegalStateException(); 80 | } else { 81 | EntityTrackerEntry_v1_8_R1 intruder = (EntityTrackerEntry_v1_8_R1)entry; 82 | if(intruder.intercept == intercept) { 83 | return; 84 | } else { 85 | intruder.toggleIntercept(intercept); 86 | if(intercept) { 87 | intruder.clear(((CraftPlayer)player).getHandle()); 88 | } else { 89 | intruder.updatePlayer(((CraftPlayer)player).getHandle()); 90 | } 91 | } 92 | } 93 | } 94 | 95 | } 96 | -------------------------------------------------------------------------------- /idisguise-impl-v1_17_R1/src/main/java/de/luisagrether/idisguise/impl/EntityTracker_v1_17_R1.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.impl; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.ArrayList; 5 | 6 | import org.bukkit.craftbukkit.v1_17_R1.entity.CraftEntity; 7 | import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; 8 | import org.bukkit.entity.Entity; 9 | import org.bukkit.entity.Player; 10 | 11 | import net.minecraft.server.level.EntityPlayer; 12 | import net.minecraft.server.level.EntityTrackerEntry; 13 | import net.minecraft.server.level.PlayerChunkMap; 14 | import net.minecraft.server.level.PlayerChunkMap.EntityTracker; 15 | import net.minecraft.server.level.WorldServer; 16 | import net.minecraft.server.network.ServerPlayerConnection; 17 | 18 | public class EntityTracker_v1_17_R1 extends EntityTracker { 19 | 20 | private static Field EntityTracker_tracker = null; 21 | private static Field EntityTracker_trackingDistance = null; 22 | private static Field EntityTracker_trackerEntry = null; 23 | private static Field EntityTrackerEntry_e = null; 24 | private static Field EntityTrackerEntry_f = null; 25 | static { 26 | try { 27 | EntityTracker_tracker = EntityTracker.class.getDeclaredField("c"); 28 | EntityTracker_tracker.setAccessible(true); 29 | EntityTracker_trackingDistance = EntityTracker.class.getDeclaredField("d"); 30 | EntityTracker_trackingDistance.setAccessible(true); 31 | EntityTracker_trackerEntry = EntityTracker.class.getDeclaredField("b"); 32 | EntityTracker_trackerEntry.setAccessible(true); 33 | EntityTrackerEntry_e = EntityTrackerEntry.class.getDeclaredField("e"); 34 | EntityTrackerEntry_e.setAccessible(true); 35 | EntityTrackerEntry_f = EntityTrackerEntry.class.getDeclaredField("f"); 36 | EntityTrackerEntry_f.setAccessible(true); 37 | } catch(Exception e) {} 38 | } 39 | 40 | private final int targetId; 41 | private boolean intercept; 42 | 43 | EntityTracker_v1_17_R1(PlayerChunkMap chunkMap, EntityTracker original, int targetId) throws IllegalAccessException { 44 | chunkMap.super( 45 | (net.minecraft.world.entity.Entity)EntityTracker_tracker.get(original), 46 | EntityTracker_trackingDistance.getInt(original), 47 | EntityTrackerEntry_e.getInt(EntityTracker_trackerEntry.get(original)), 48 | EntityTrackerEntry_f.getBoolean(EntityTracker_trackerEntry.get(original)) 49 | ); 50 | this.targetId = targetId; 51 | this.intercept = false; 52 | } 53 | 54 | public void toggleIntercept(boolean intercept) { 55 | this.intercept = intercept; 56 | } 57 | 58 | @Override 59 | public void updatePlayer(EntityPlayer entityPlayer) { 60 | if(intercept && entityPlayer.getId() == targetId) { 61 | return; 62 | } 63 | super.updatePlayer(entityPlayer); 64 | } 65 | 66 | public static void inject(Entity entity, Player player) throws IllegalAccessException { 67 | PlayerChunkMap chunkMap = ((WorldServer)((CraftEntity)entity).getHandle().t).getChunkProvider().a; 68 | EntityTracker original = chunkMap.G.get(entity.getEntityId()); 69 | if(original instanceof EntityTracker_v1_17_R1) { 70 | return; 71 | } else { 72 | chunkMap.G.remove(entity.getEntityId()); 73 | EntityTracker_v1_17_R1 intruder = new EntityTracker_v1_17_R1(chunkMap, original, player.getEntityId()); 74 | chunkMap.G.put(entity.getEntityId(), intruder); 75 | for(ServerPlayerConnection observer : new ArrayList<>(original.f)) { 76 | original.clear(observer.d()); 77 | intruder.updatePlayer(observer.d()); 78 | } 79 | } 80 | } 81 | 82 | public static void toggleIntercept(Entity entity, Player player, boolean intercept) { 83 | PlayerChunkMap chunkMap = ((WorldServer)((CraftEntity)entity).getHandle().t).getChunkProvider().a; 84 | EntityTracker tracker = chunkMap.G.get(entity.getEntityId()); 85 | if(!(tracker instanceof EntityTracker_v1_17_R1)) { 86 | throw new IllegalStateException(); 87 | } else { 88 | EntityTracker_v1_17_R1 intruder = (EntityTracker_v1_17_R1)tracker; 89 | if(intruder.intercept == intercept) { 90 | return; 91 | } else { 92 | intruder.toggleIntercept(intercept); 93 | if(intercept) { 94 | intruder.clear(((CraftPlayer)player).getHandle()); 95 | } else { 96 | intruder.updatePlayer(((CraftPlayer)player).getHandle()); 97 | } 98 | } 99 | } 100 | } 101 | 102 | } 103 | -------------------------------------------------------------------------------- /idisguise-impl-v1_9_R1/src/main/java/de/luisagrether/idisguise/impl/EntityTrackerEntry_v1_9_R1.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.impl; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.ArrayList; 5 | import java.util.Set; 6 | 7 | import org.bukkit.craftbukkit.v1_9_R1.entity.CraftEntity; 8 | import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer; 9 | import org.bukkit.entity.Entity; 10 | import org.bukkit.entity.Player; 11 | 12 | import net.minecraft.server.v1_9_R1.EntityPlayer; 13 | import net.minecraft.server.v1_9_R1.EntityTracker; 14 | import net.minecraft.server.v1_9_R1.EntityTrackerEntry; 15 | import net.minecraft.server.v1_9_R1.WorldServer; 16 | 17 | public class EntityTrackerEntry_v1_9_R1 extends EntityTrackerEntry { 18 | 19 | private static Field EntityTrackerEntry_e = null; 20 | private static Field EntityTrackerEntry_f = null; 21 | private static Field EntityTrackerEntry_g = null; 22 | private static Field EntityTrackerEntry_u = null; 23 | private static Field EntityTracker_trackerSet = null; 24 | static { 25 | try { 26 | EntityTrackerEntry_e = EntityTrackerEntry.class.getDeclaredField("e"); 27 | EntityTrackerEntry_e.setAccessible(true); 28 | EntityTrackerEntry_f = EntityTrackerEntry.class.getDeclaredField("f"); 29 | EntityTrackerEntry_f.setAccessible(true); 30 | EntityTrackerEntry_g = EntityTrackerEntry.class.getDeclaredField("g"); 31 | EntityTrackerEntry_g.setAccessible(true); 32 | EntityTrackerEntry_u = EntityTrackerEntry.class.getDeclaredField("u"); 33 | EntityTrackerEntry_u.setAccessible(true); 34 | EntityTracker_trackerSet = EntityTracker.class.getDeclaredField("c"); 35 | EntityTracker_trackerSet.setAccessible(true); 36 | } catch(Exception e) {} 37 | } 38 | 39 | private final int targetId; 40 | private boolean intercept; 41 | 42 | EntityTrackerEntry_v1_9_R1(EntityTrackerEntry original, int targetId) throws IllegalAccessException { 43 | super( 44 | original.b(), 45 | EntityTrackerEntry_e.getInt(original), 46 | EntityTrackerEntry_f.getInt(original), 47 | EntityTrackerEntry_g.getInt(original), 48 | EntityTrackerEntry_u.getBoolean(original) 49 | ); 50 | this.targetId = targetId; 51 | this.intercept = false; 52 | } 53 | 54 | public void toggleIntercept(boolean intercept) { 55 | this.intercept = intercept; 56 | } 57 | 58 | @Override 59 | public void updatePlayer(EntityPlayer entityPlayer) { 60 | if(intercept && entityPlayer.getId() == targetId) { 61 | return; 62 | } 63 | super.updatePlayer(entityPlayer); 64 | } 65 | 66 | public static void inject(Entity entity, Player player) throws IllegalAccessException { 67 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 68 | EntityTrackerEntry original = tracker.trackedEntities.get(entity.getEntityId()); 69 | if(original instanceof EntityTrackerEntry_v1_9_R1) { 70 | return; 71 | } else { 72 | tracker.trackedEntities.d(entity.getEntityId()); 73 | Set entrySet = (Set)EntityTracker_trackerSet.get(tracker); 74 | entrySet.remove(original); 75 | EntityTrackerEntry_v1_9_R1 intruder = new EntityTrackerEntry_v1_9_R1(original, player.getEntityId()); 76 | tracker.trackedEntities.a(entity.getEntityId(), intruder); 77 | entrySet.add(intruder); 78 | for(EntityPlayer observer : new ArrayList<>(original.trackedPlayers)) { 79 | original.clear(observer); 80 | intruder.updatePlayer(observer); 81 | } 82 | } 83 | } 84 | 85 | public static void toggleIntercept(Entity entity, Player player, boolean intercept) { 86 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 87 | EntityTrackerEntry entry = tracker.trackedEntities.get(entity.getEntityId()); 88 | if(!(entry instanceof EntityTrackerEntry_v1_9_R1)) { 89 | throw new IllegalStateException(); 90 | } else { 91 | EntityTrackerEntry_v1_9_R1 intruder = (EntityTrackerEntry_v1_9_R1)entry; 92 | if(intruder.intercept == intercept) { 93 | return; 94 | } else { 95 | intruder.toggleIntercept(intercept); 96 | if(intercept) { 97 | intruder.clear(((CraftPlayer)player).getHandle()); 98 | } else { 99 | intruder.updatePlayer(((CraftPlayer)player).getHandle()); 100 | } 101 | } 102 | } 103 | } 104 | 105 | } 106 | -------------------------------------------------------------------------------- /idisguise-impl-v1_9_R2/src/main/java/de/luisagrether/idisguise/impl/EntityTrackerEntry_v1_9_R2.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.impl; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.ArrayList; 5 | import java.util.Set; 6 | 7 | import org.bukkit.craftbukkit.v1_9_R2.entity.CraftEntity; 8 | import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer; 9 | import org.bukkit.entity.Entity; 10 | import org.bukkit.entity.Player; 11 | 12 | import net.minecraft.server.v1_9_R2.EntityPlayer; 13 | import net.minecraft.server.v1_9_R2.EntityTracker; 14 | import net.minecraft.server.v1_9_R2.EntityTrackerEntry; 15 | import net.minecraft.server.v1_9_R2.WorldServer; 16 | 17 | public class EntityTrackerEntry_v1_9_R2 extends EntityTrackerEntry { 18 | 19 | private static Field EntityTrackerEntry_e = null; 20 | private static Field EntityTrackerEntry_f = null; 21 | private static Field EntityTrackerEntry_g = null; 22 | private static Field EntityTrackerEntry_u = null; 23 | private static Field EntityTracker_trackerSet = null; 24 | static { 25 | try { 26 | EntityTrackerEntry_e = EntityTrackerEntry.class.getDeclaredField("e"); 27 | EntityTrackerEntry_e.setAccessible(true); 28 | EntityTrackerEntry_f = EntityTrackerEntry.class.getDeclaredField("f"); 29 | EntityTrackerEntry_f.setAccessible(true); 30 | EntityTrackerEntry_g = EntityTrackerEntry.class.getDeclaredField("g"); 31 | EntityTrackerEntry_g.setAccessible(true); 32 | EntityTrackerEntry_u = EntityTrackerEntry.class.getDeclaredField("u"); 33 | EntityTrackerEntry_u.setAccessible(true); 34 | EntityTracker_trackerSet = EntityTracker.class.getDeclaredField("c"); 35 | EntityTracker_trackerSet.setAccessible(true); 36 | } catch(Exception e) {} 37 | } 38 | 39 | private final int targetId; 40 | private boolean intercept; 41 | 42 | EntityTrackerEntry_v1_9_R2(EntityTrackerEntry original, int targetId) throws IllegalAccessException { 43 | super( 44 | original.b(), 45 | EntityTrackerEntry_e.getInt(original), 46 | EntityTrackerEntry_f.getInt(original), 47 | EntityTrackerEntry_g.getInt(original), 48 | EntityTrackerEntry_u.getBoolean(original) 49 | ); 50 | this.targetId = targetId; 51 | this.intercept = false; 52 | } 53 | 54 | public void toggleIntercept(boolean intercept) { 55 | this.intercept = intercept; 56 | } 57 | 58 | @Override 59 | public void updatePlayer(EntityPlayer entityPlayer) { 60 | if(intercept && entityPlayer.getId() == targetId) { 61 | return; 62 | } 63 | super.updatePlayer(entityPlayer); 64 | } 65 | 66 | public static void inject(Entity entity, Player player) throws IllegalAccessException { 67 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 68 | EntityTrackerEntry original = tracker.trackedEntities.get(entity.getEntityId()); 69 | if(original instanceof EntityTrackerEntry_v1_9_R2) { 70 | return; 71 | } else { 72 | tracker.trackedEntities.d(entity.getEntityId()); 73 | Set entrySet = (Set)EntityTracker_trackerSet.get(tracker); 74 | entrySet.remove(original); 75 | EntityTrackerEntry_v1_9_R2 intruder = new EntityTrackerEntry_v1_9_R2(original, player.getEntityId()); 76 | tracker.trackedEntities.a(entity.getEntityId(), intruder); 77 | entrySet.add(intruder); 78 | for(EntityPlayer observer : new ArrayList<>(original.trackedPlayers)) { 79 | original.clear(observer); 80 | intruder.updatePlayer(observer); 81 | } 82 | } 83 | } 84 | 85 | public static void toggleIntercept(Entity entity, Player player, boolean intercept) { 86 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 87 | EntityTrackerEntry entry = tracker.trackedEntities.get(entity.getEntityId()); 88 | if(!(entry instanceof EntityTrackerEntry_v1_9_R2)) { 89 | throw new IllegalStateException(); 90 | } else { 91 | EntityTrackerEntry_v1_9_R2 intruder = (EntityTrackerEntry_v1_9_R2)entry; 92 | if(intruder.intercept == intercept) { 93 | return; 94 | } else { 95 | intruder.toggleIntercept(intercept); 96 | if(intercept) { 97 | intruder.clear(((CraftPlayer)player).getHandle()); 98 | } else { 99 | intruder.updatePlayer(((CraftPlayer)player).getHandle()); 100 | } 101 | } 102 | } 103 | } 104 | 105 | } 106 | -------------------------------------------------------------------------------- /idisguise-impl-v1_10_R1/src/main/java/de/luisagrether/idisguise/impl/EntityTrackerEntry_v1_10_R1.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.impl; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.ArrayList; 5 | import java.util.Set; 6 | 7 | import org.bukkit.craftbukkit.v1_10_R1.entity.CraftEntity; 8 | import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; 9 | import org.bukkit.entity.Entity; 10 | import org.bukkit.entity.Player; 11 | 12 | import net.minecraft.server.v1_10_R1.EntityPlayer; 13 | import net.minecraft.server.v1_10_R1.EntityTracker; 14 | import net.minecraft.server.v1_10_R1.EntityTrackerEntry; 15 | import net.minecraft.server.v1_10_R1.WorldServer; 16 | 17 | public class EntityTrackerEntry_v1_10_R1 extends EntityTrackerEntry { 18 | 19 | private static Field EntityTrackerEntry_e = null; 20 | private static Field EntityTrackerEntry_f = null; 21 | private static Field EntityTrackerEntry_g = null; 22 | private static Field EntityTrackerEntry_u = null; 23 | private static Field EntityTracker_trackerSet = null; 24 | static { 25 | try { 26 | EntityTrackerEntry_e = EntityTrackerEntry.class.getDeclaredField("e"); 27 | EntityTrackerEntry_e.setAccessible(true); 28 | EntityTrackerEntry_f = EntityTrackerEntry.class.getDeclaredField("f"); 29 | EntityTrackerEntry_f.setAccessible(true); 30 | EntityTrackerEntry_g = EntityTrackerEntry.class.getDeclaredField("g"); 31 | EntityTrackerEntry_g.setAccessible(true); 32 | EntityTrackerEntry_u = EntityTrackerEntry.class.getDeclaredField("u"); 33 | EntityTrackerEntry_u.setAccessible(true); 34 | EntityTracker_trackerSet = EntityTracker.class.getDeclaredField("c"); 35 | EntityTracker_trackerSet.setAccessible(true); 36 | } catch(Exception e) {} 37 | } 38 | 39 | private final int targetId; 40 | private boolean intercept; 41 | 42 | EntityTrackerEntry_v1_10_R1(EntityTrackerEntry original, int targetId) throws IllegalAccessException { 43 | super( 44 | original.b(), 45 | EntityTrackerEntry_e.getInt(original), 46 | EntityTrackerEntry_f.getInt(original), 47 | EntityTrackerEntry_g.getInt(original), 48 | EntityTrackerEntry_u.getBoolean(original) 49 | ); 50 | this.targetId = targetId; 51 | this.intercept = false; 52 | } 53 | 54 | public void toggleIntercept(boolean intercept) { 55 | this.intercept = intercept; 56 | } 57 | 58 | @Override 59 | public void updatePlayer(EntityPlayer entityPlayer) { 60 | if(intercept && entityPlayer.getId() == targetId) { 61 | return; 62 | } 63 | super.updatePlayer(entityPlayer); 64 | } 65 | 66 | public static void inject(Entity entity, Player player) throws IllegalAccessException { 67 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 68 | EntityTrackerEntry original = tracker.trackedEntities.get(entity.getEntityId()); 69 | if(original instanceof EntityTrackerEntry_v1_10_R1) { 70 | return; 71 | } else { 72 | tracker.trackedEntities.d(entity.getEntityId()); 73 | Set entrySet = (Set)EntityTracker_trackerSet.get(tracker); 74 | entrySet.remove(original); 75 | EntityTrackerEntry_v1_10_R1 intruder = new EntityTrackerEntry_v1_10_R1(original, player.getEntityId()); 76 | tracker.trackedEntities.a(entity.getEntityId(), intruder); 77 | entrySet.add(intruder); 78 | for(EntityPlayer observer : new ArrayList<>(original.trackedPlayers)) { 79 | original.clear(observer); 80 | intruder.updatePlayer(observer); 81 | } 82 | } 83 | } 84 | 85 | public static void toggleIntercept(Entity entity, Player player, boolean intercept) { 86 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 87 | EntityTrackerEntry entry = tracker.trackedEntities.get(entity.getEntityId()); 88 | if(!(entry instanceof EntityTrackerEntry_v1_10_R1)) { 89 | throw new IllegalStateException(); 90 | } else { 91 | EntityTrackerEntry_v1_10_R1 intruder = (EntityTrackerEntry_v1_10_R1)entry; 92 | if(intruder.intercept == intercept) { 93 | return; 94 | } else { 95 | intruder.toggleIntercept(intercept); 96 | if(intercept) { 97 | intruder.clear(((CraftPlayer)player).getHandle()); 98 | } else { 99 | intruder.updatePlayer(((CraftPlayer)player).getHandle()); 100 | } 101 | } 102 | } 103 | } 104 | 105 | } 106 | -------------------------------------------------------------------------------- /idisguise-impl-v1_11_R1/src/main/java/de/luisagrether/idisguise/impl/EntityTrackerEntry_v1_11_R1.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.impl; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.ArrayList; 5 | import java.util.Set; 6 | 7 | import org.bukkit.craftbukkit.v1_11_R1.entity.CraftEntity; 8 | import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; 9 | import org.bukkit.entity.Entity; 10 | import org.bukkit.entity.Player; 11 | 12 | import net.minecraft.server.v1_11_R1.EntityPlayer; 13 | import net.minecraft.server.v1_11_R1.EntityTracker; 14 | import net.minecraft.server.v1_11_R1.EntityTrackerEntry; 15 | import net.minecraft.server.v1_11_R1.WorldServer; 16 | 17 | public class EntityTrackerEntry_v1_11_R1 extends EntityTrackerEntry { 18 | 19 | private static Field EntityTrackerEntry_e = null; 20 | private static Field EntityTrackerEntry_f = null; 21 | private static Field EntityTrackerEntry_g = null; 22 | private static Field EntityTrackerEntry_u = null; 23 | private static Field EntityTracker_trackerSet = null; 24 | static { 25 | try { 26 | EntityTrackerEntry_e = EntityTrackerEntry.class.getDeclaredField("e"); 27 | EntityTrackerEntry_e.setAccessible(true); 28 | EntityTrackerEntry_f = EntityTrackerEntry.class.getDeclaredField("f"); 29 | EntityTrackerEntry_f.setAccessible(true); 30 | EntityTrackerEntry_g = EntityTrackerEntry.class.getDeclaredField("g"); 31 | EntityTrackerEntry_g.setAccessible(true); 32 | EntityTrackerEntry_u = EntityTrackerEntry.class.getDeclaredField("u"); 33 | EntityTrackerEntry_u.setAccessible(true); 34 | EntityTracker_trackerSet = EntityTracker.class.getDeclaredField("c"); 35 | EntityTracker_trackerSet.setAccessible(true); 36 | } catch(Exception e) {} 37 | } 38 | 39 | private final int targetId; 40 | private boolean intercept; 41 | 42 | EntityTrackerEntry_v1_11_R1(EntityTrackerEntry original, int targetId) throws IllegalAccessException { 43 | super( 44 | original.b(), 45 | EntityTrackerEntry_e.getInt(original), 46 | EntityTrackerEntry_f.getInt(original), 47 | EntityTrackerEntry_g.getInt(original), 48 | EntityTrackerEntry_u.getBoolean(original) 49 | ); 50 | this.targetId = targetId; 51 | this.intercept = false; 52 | } 53 | 54 | public void toggleIntercept(boolean intercept) { 55 | this.intercept = intercept; 56 | } 57 | 58 | @Override 59 | public void updatePlayer(EntityPlayer entityPlayer) { 60 | if(intercept && entityPlayer.getId() == targetId) { 61 | return; 62 | } 63 | super.updatePlayer(entityPlayer); 64 | } 65 | 66 | public static void inject(Entity entity, Player player) throws IllegalAccessException { 67 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 68 | EntityTrackerEntry original = tracker.trackedEntities.get(entity.getEntityId()); 69 | if(original instanceof EntityTrackerEntry_v1_11_R1) { 70 | return; 71 | } else { 72 | tracker.trackedEntities.d(entity.getEntityId()); 73 | Set entrySet = (Set)EntityTracker_trackerSet.get(tracker); 74 | entrySet.remove(original); 75 | EntityTrackerEntry_v1_11_R1 intruder = new EntityTrackerEntry_v1_11_R1(original, player.getEntityId()); 76 | tracker.trackedEntities.a(entity.getEntityId(), intruder); 77 | entrySet.add(intruder); 78 | for(EntityPlayer observer : new ArrayList<>(original.trackedPlayers)) { 79 | original.clear(observer); 80 | intruder.updatePlayer(observer); 81 | } 82 | } 83 | } 84 | 85 | public static void toggleIntercept(Entity entity, Player player, boolean intercept) { 86 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 87 | EntityTrackerEntry entry = tracker.trackedEntities.get(entity.getEntityId()); 88 | if(!(entry instanceof EntityTrackerEntry_v1_11_R1)) { 89 | throw new IllegalStateException(); 90 | } else { 91 | EntityTrackerEntry_v1_11_R1 intruder = (EntityTrackerEntry_v1_11_R1)entry; 92 | if(intruder.intercept == intercept) { 93 | return; 94 | } else { 95 | intruder.toggleIntercept(intercept); 96 | if(intercept) { 97 | intruder.clear(((CraftPlayer)player).getHandle()); 98 | } else { 99 | intruder.updatePlayer(((CraftPlayer)player).getHandle()); 100 | } 101 | } 102 | } 103 | } 104 | 105 | } 106 | -------------------------------------------------------------------------------- /idisguise-impl-v1_12_R1/src/main/java/de/luisagrether/idisguise/impl/EntityTrackerEntry_v1_12_R1.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.impl; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.ArrayList; 5 | import java.util.Set; 6 | 7 | import org.bukkit.craftbukkit.v1_12_R1.entity.CraftEntity; 8 | import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; 9 | import org.bukkit.entity.Entity; 10 | import org.bukkit.entity.Player; 11 | 12 | import net.minecraft.server.v1_12_R1.EntityPlayer; 13 | import net.minecraft.server.v1_12_R1.EntityTracker; 14 | import net.minecraft.server.v1_12_R1.EntityTrackerEntry; 15 | import net.minecraft.server.v1_12_R1.WorldServer; 16 | 17 | public class EntityTrackerEntry_v1_12_R1 extends EntityTrackerEntry { 18 | 19 | private static Field EntityTrackerEntry_e = null; 20 | private static Field EntityTrackerEntry_f = null; 21 | private static Field EntityTrackerEntry_g = null; 22 | private static Field EntityTrackerEntry_u = null; 23 | private static Field EntityTracker_trackerSet = null; 24 | static { 25 | try { 26 | EntityTrackerEntry_e = EntityTrackerEntry.class.getDeclaredField("e"); 27 | EntityTrackerEntry_e.setAccessible(true); 28 | EntityTrackerEntry_f = EntityTrackerEntry.class.getDeclaredField("f"); 29 | EntityTrackerEntry_f.setAccessible(true); 30 | EntityTrackerEntry_g = EntityTrackerEntry.class.getDeclaredField("g"); 31 | EntityTrackerEntry_g.setAccessible(true); 32 | EntityTrackerEntry_u = EntityTrackerEntry.class.getDeclaredField("u"); 33 | EntityTrackerEntry_u.setAccessible(true); 34 | EntityTracker_trackerSet = EntityTracker.class.getDeclaredField("c"); 35 | EntityTracker_trackerSet.setAccessible(true); 36 | } catch(Exception e) {} 37 | } 38 | 39 | private final int targetId; 40 | private boolean intercept; 41 | 42 | EntityTrackerEntry_v1_12_R1(EntityTrackerEntry original, int targetId) throws IllegalAccessException { 43 | super( 44 | original.b(), 45 | EntityTrackerEntry_e.getInt(original), 46 | EntityTrackerEntry_f.getInt(original), 47 | EntityTrackerEntry_g.getInt(original), 48 | EntityTrackerEntry_u.getBoolean(original) 49 | ); 50 | this.targetId = targetId; 51 | this.intercept = false; 52 | } 53 | 54 | public void toggleIntercept(boolean intercept) { 55 | this.intercept = intercept; 56 | } 57 | 58 | @Override 59 | public void updatePlayer(EntityPlayer entityPlayer) { 60 | if(intercept && entityPlayer.getId() == targetId) { 61 | return; 62 | } 63 | super.updatePlayer(entityPlayer); 64 | } 65 | 66 | public static void inject(Entity entity, Player player) throws IllegalAccessException { 67 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 68 | EntityTrackerEntry original = tracker.trackedEntities.get(entity.getEntityId()); 69 | if(original instanceof EntityTrackerEntry_v1_12_R1) { 70 | return; 71 | } else { 72 | tracker.trackedEntities.d(entity.getEntityId()); 73 | Set entrySet = (Set)EntityTracker_trackerSet.get(tracker); 74 | entrySet.remove(original); 75 | EntityTrackerEntry_v1_12_R1 intruder = new EntityTrackerEntry_v1_12_R1(original, player.getEntityId()); 76 | tracker.trackedEntities.a(entity.getEntityId(), intruder); 77 | entrySet.add(intruder); 78 | for(EntityPlayer observer : new ArrayList<>(original.trackedPlayers)) { 79 | original.clear(observer); 80 | intruder.updatePlayer(observer); 81 | } 82 | } 83 | } 84 | 85 | public static void toggleIntercept(Entity entity, Player player, boolean intercept) { 86 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 87 | EntityTrackerEntry entry = tracker.trackedEntities.get(entity.getEntityId()); 88 | if(!(entry instanceof EntityTrackerEntry_v1_12_R1)) { 89 | throw new IllegalStateException(); 90 | } else { 91 | EntityTrackerEntry_v1_12_R1 intruder = (EntityTrackerEntry_v1_12_R1)entry; 92 | if(intruder.intercept == intercept) { 93 | return; 94 | } else { 95 | intruder.toggleIntercept(intercept); 96 | if(intercept) { 97 | intruder.clear(((CraftPlayer)player).getHandle()); 98 | } else { 99 | intruder.updatePlayer(((CraftPlayer)player).getHandle()); 100 | } 101 | } 102 | } 103 | } 104 | 105 | } 106 | -------------------------------------------------------------------------------- /idisguise-impl-v1_13_R1/src/main/java/de/luisagrether/idisguise/impl/EntityTrackerEntry_v1_13_R1.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.impl; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.ArrayList; 5 | import java.util.Set; 6 | 7 | import org.bukkit.craftbukkit.v1_13_R1.entity.CraftEntity; 8 | import org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer; 9 | import org.bukkit.entity.Entity; 10 | import org.bukkit.entity.Player; 11 | 12 | import net.minecraft.server.v1_13_R1.EntityPlayer; 13 | import net.minecraft.server.v1_13_R1.EntityTracker; 14 | import net.minecraft.server.v1_13_R1.EntityTrackerEntry; 15 | import net.minecraft.server.v1_13_R1.WorldServer; 16 | 17 | public class EntityTrackerEntry_v1_13_R1 extends EntityTrackerEntry { 18 | 19 | private static Field EntityTrackerEntry_e = null; 20 | private static Field EntityTrackerEntry_f = null; 21 | private static Field EntityTrackerEntry_g = null; 22 | private static Field EntityTrackerEntry_u = null; 23 | private static Field EntityTracker_trackerSet = null; 24 | static { 25 | try { 26 | EntityTrackerEntry_e = EntityTrackerEntry.class.getDeclaredField("e"); 27 | EntityTrackerEntry_e.setAccessible(true); 28 | EntityTrackerEntry_f = EntityTrackerEntry.class.getDeclaredField("f"); 29 | EntityTrackerEntry_f.setAccessible(true); 30 | EntityTrackerEntry_g = EntityTrackerEntry.class.getDeclaredField("g"); 31 | EntityTrackerEntry_g.setAccessible(true); 32 | EntityTrackerEntry_u = EntityTrackerEntry.class.getDeclaredField("u"); 33 | EntityTrackerEntry_u.setAccessible(true); 34 | EntityTracker_trackerSet = EntityTracker.class.getDeclaredField("c"); 35 | EntityTracker_trackerSet.setAccessible(true); 36 | } catch(Exception e) {} 37 | } 38 | 39 | private final int targetId; 40 | private boolean intercept; 41 | 42 | EntityTrackerEntry_v1_13_R1(EntityTrackerEntry original, int targetId) throws IllegalAccessException { 43 | super( 44 | original.b(), 45 | EntityTrackerEntry_e.getInt(original), 46 | EntityTrackerEntry_f.getInt(original), 47 | EntityTrackerEntry_g.getInt(original), 48 | EntityTrackerEntry_u.getBoolean(original) 49 | ); 50 | this.targetId = targetId; 51 | this.intercept = false; 52 | } 53 | 54 | public void toggleIntercept(boolean intercept) { 55 | this.intercept = intercept; 56 | } 57 | 58 | @Override 59 | public void updatePlayer(EntityPlayer entityPlayer) { 60 | if(intercept && entityPlayer.getId() == targetId) { 61 | return; 62 | } 63 | super.updatePlayer(entityPlayer); 64 | } 65 | 66 | public static void inject(Entity entity, Player player) throws IllegalAccessException { 67 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 68 | EntityTrackerEntry original = tracker.trackedEntities.get(entity.getEntityId()); 69 | if(original instanceof EntityTrackerEntry_v1_13_R1) { 70 | return; 71 | } else { 72 | tracker.trackedEntities.d(entity.getEntityId()); 73 | Set entrySet = (Set)EntityTracker_trackerSet.get(tracker); 74 | entrySet.remove(original); 75 | EntityTrackerEntry_v1_13_R1 intruder = new EntityTrackerEntry_v1_13_R1(original, player.getEntityId()); 76 | tracker.trackedEntities.a(entity.getEntityId(), intruder); 77 | entrySet.add(intruder); 78 | for(EntityPlayer observer : new ArrayList<>(original.trackedPlayers)) { 79 | original.clear(observer); 80 | intruder.updatePlayer(observer); 81 | } 82 | } 83 | } 84 | 85 | public static void toggleIntercept(Entity entity, Player player, boolean intercept) { 86 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 87 | EntityTrackerEntry entry = tracker.trackedEntities.get(entity.getEntityId()); 88 | if(!(entry instanceof EntityTrackerEntry_v1_13_R1)) { 89 | throw new IllegalStateException(); 90 | } else { 91 | EntityTrackerEntry_v1_13_R1 intruder = (EntityTrackerEntry_v1_13_R1)entry; 92 | if(intruder.intercept == intercept) { 93 | return; 94 | } else { 95 | intruder.toggleIntercept(intercept); 96 | if(intercept) { 97 | intruder.clear(((CraftPlayer)player).getHandle()); 98 | } else { 99 | intruder.updatePlayer(((CraftPlayer)player).getHandle()); 100 | } 101 | } 102 | } 103 | } 104 | 105 | } 106 | -------------------------------------------------------------------------------- /idisguise-impl-v1_13_R2/src/main/java/de/luisagrether/idisguise/impl/EntityTrackerEntry_v1_13_R2.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.impl; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.ArrayList; 5 | import java.util.Set; 6 | 7 | import org.bukkit.craftbukkit.v1_13_R2.entity.CraftEntity; 8 | import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer; 9 | import org.bukkit.entity.Entity; 10 | import org.bukkit.entity.Player; 11 | 12 | import net.minecraft.server.v1_13_R2.EntityPlayer; 13 | import net.minecraft.server.v1_13_R2.EntityTracker; 14 | import net.minecraft.server.v1_13_R2.EntityTrackerEntry; 15 | import net.minecraft.server.v1_13_R2.WorldServer; 16 | 17 | public class EntityTrackerEntry_v1_13_R2 extends EntityTrackerEntry { 18 | 19 | private static Field EntityTrackerEntry_e = null; 20 | private static Field EntityTrackerEntry_f = null; 21 | private static Field EntityTrackerEntry_g = null; 22 | private static Field EntityTrackerEntry_u = null; 23 | private static Field EntityTracker_trackerSet = null; 24 | static { 25 | try { 26 | EntityTrackerEntry_e = EntityTrackerEntry.class.getDeclaredField("e"); 27 | EntityTrackerEntry_e.setAccessible(true); 28 | EntityTrackerEntry_f = EntityTrackerEntry.class.getDeclaredField("f"); 29 | EntityTrackerEntry_f.setAccessible(true); 30 | EntityTrackerEntry_g = EntityTrackerEntry.class.getDeclaredField("g"); 31 | EntityTrackerEntry_g.setAccessible(true); 32 | EntityTrackerEntry_u = EntityTrackerEntry.class.getDeclaredField("u"); 33 | EntityTrackerEntry_u.setAccessible(true); 34 | EntityTracker_trackerSet = EntityTracker.class.getDeclaredField("c"); 35 | EntityTracker_trackerSet.setAccessible(true); 36 | } catch(Exception e) {} 37 | } 38 | 39 | private final int targetId; 40 | private boolean intercept; 41 | 42 | EntityTrackerEntry_v1_13_R2(EntityTrackerEntry original, int targetId) throws IllegalAccessException { 43 | super( 44 | original.b(), 45 | EntityTrackerEntry_e.getInt(original), 46 | EntityTrackerEntry_f.getInt(original), 47 | EntityTrackerEntry_g.getInt(original), 48 | EntityTrackerEntry_u.getBoolean(original) 49 | ); 50 | this.targetId = targetId; 51 | this.intercept = false; 52 | } 53 | 54 | public void toggleIntercept(boolean intercept) { 55 | this.intercept = intercept; 56 | } 57 | 58 | @Override 59 | public void updatePlayer(EntityPlayer entityPlayer) { 60 | if(intercept && entityPlayer.getId() == targetId) { 61 | return; 62 | } 63 | super.updatePlayer(entityPlayer); 64 | } 65 | 66 | public static void inject(Entity entity, Player player) throws IllegalAccessException { 67 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 68 | EntityTrackerEntry original = tracker.trackedEntities.get(entity.getEntityId()); 69 | if(original instanceof EntityTrackerEntry_v1_13_R2) { 70 | return; 71 | } else { 72 | tracker.trackedEntities.d(entity.getEntityId()); 73 | Set entrySet = (Set)EntityTracker_trackerSet.get(tracker); 74 | entrySet.remove(original); 75 | EntityTrackerEntry_v1_13_R2 intruder = new EntityTrackerEntry_v1_13_R2(original, player.getEntityId()); 76 | tracker.trackedEntities.a(entity.getEntityId(), intruder); 77 | entrySet.add(intruder); 78 | for(EntityPlayer observer : new ArrayList<>(original.trackedPlayers)) { 79 | original.clear(observer); 80 | intruder.updatePlayer(observer); 81 | } 82 | } 83 | } 84 | 85 | public static void toggleIntercept(Entity entity, Player player, boolean intercept) { 86 | EntityTracker tracker = ((WorldServer)((CraftEntity)entity).getHandle().world).tracker; 87 | EntityTrackerEntry entry = tracker.trackedEntities.get(entity.getEntityId()); 88 | if(!(entry instanceof EntityTrackerEntry_v1_13_R2)) { 89 | throw new IllegalStateException(); 90 | } else { 91 | EntityTrackerEntry_v1_13_R2 intruder = (EntityTrackerEntry_v1_13_R2)entry; 92 | if(intruder.intercept == intercept) { 93 | return; 94 | } else { 95 | intruder.toggleIntercept(intercept); 96 | if(intercept) { 97 | intruder.clear(((CraftPlayer)player).getHandle()); 98 | } else { 99 | intruder.updatePlayer(((CraftPlayer)player).getHandle()); 100 | } 101 | } 102 | } 103 | } 104 | 105 | } 106 | -------------------------------------------------------------------------------- /idisguise-impl-v1_14_R1/src/main/java/de/luisagrether/idisguise/impl/EntityTracker_v1_14_R1.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.impl; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.ArrayList; 5 | 6 | import org.bukkit.craftbukkit.v1_14_R1.entity.CraftEntity; 7 | import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer; 8 | import org.bukkit.entity.Entity; 9 | import org.bukkit.entity.Player; 10 | 11 | import net.minecraft.server.v1_14_R1.EntityPlayer; 12 | import net.minecraft.server.v1_14_R1.EntityTrackerEntry; 13 | import net.minecraft.server.v1_14_R1.PlayerChunkMap; 14 | import net.minecraft.server.v1_14_R1.PlayerChunkMap.EntityTracker; 15 | import net.minecraft.server.v1_14_R1.WorldServer; 16 | 17 | public class EntityTracker_v1_14_R1 extends EntityTracker { 18 | 19 | private static Field EntityTracker_tracker = null; 20 | private static Field EntityTracker_trackingDistance = null; 21 | private static Field EntityTracker_trackerEntry = null; 22 | private static Field EntityTrackerEntry_d = null; 23 | private static Field EntityTrackerEntry_e = null; 24 | static { 25 | try { 26 | EntityTracker_tracker = EntityTracker.class.getDeclaredField("tracker"); 27 | EntityTracker_tracker.setAccessible(true); 28 | EntityTracker_trackingDistance = EntityTracker.class.getDeclaredField("trackingDistance"); 29 | EntityTracker_trackingDistance.setAccessible(true); 30 | EntityTracker_trackerEntry = EntityTracker.class.getDeclaredField("trackerEntry"); 31 | EntityTracker_trackerEntry.setAccessible(true); 32 | EntityTrackerEntry_d = EntityTrackerEntry.class.getDeclaredField("d"); 33 | EntityTrackerEntry_d.setAccessible(true); 34 | EntityTrackerEntry_e = EntityTrackerEntry.class.getDeclaredField("e"); 35 | EntityTrackerEntry_e.setAccessible(true); 36 | } catch(Exception e) {} 37 | } 38 | 39 | private final int targetId; 40 | private boolean intercept; 41 | 42 | EntityTracker_v1_14_R1(PlayerChunkMap chunkMap, EntityTracker original, int targetId) throws IllegalAccessException { 43 | chunkMap.super( 44 | (net.minecraft.server.v1_14_R1.Entity)EntityTracker_tracker.get(original), 45 | EntityTracker_trackingDistance.getInt(original), 46 | EntityTrackerEntry_d.getInt(EntityTracker_trackerEntry.get(original)), 47 | EntityTrackerEntry_e.getBoolean(EntityTracker_trackerEntry.get(original)) 48 | ); 49 | this.targetId = targetId; 50 | this.intercept = false; 51 | } 52 | 53 | public void toggleIntercept(boolean intercept) { 54 | this.intercept = intercept; 55 | } 56 | 57 | @Override 58 | public void updatePlayer(EntityPlayer entityPlayer) { 59 | if(intercept && entityPlayer.getId() == targetId) { 60 | return; 61 | } 62 | super.updatePlayer(entityPlayer); 63 | } 64 | 65 | public static void inject(Entity entity, Player player) throws IllegalAccessException { 66 | PlayerChunkMap chunkMap = ((WorldServer)((CraftEntity)entity).getHandle().world).getChunkProvider().playerChunkMap; 67 | EntityTracker original = chunkMap.trackedEntities.get(entity.getEntityId()); 68 | if(original instanceof EntityTracker_v1_14_R1) { 69 | return; 70 | } else { 71 | chunkMap.trackedEntities.remove(entity.getEntityId()); 72 | EntityTracker_v1_14_R1 intruder = new EntityTracker_v1_14_R1(chunkMap, original, player.getEntityId()); 73 | chunkMap.trackedEntities.put(entity.getEntityId(), intruder); 74 | for(EntityPlayer observer : new ArrayList<>(original.trackedPlayers)) { 75 | original.clear(observer); 76 | intruder.updatePlayer(observer); 77 | } 78 | } 79 | } 80 | 81 | public static void toggleIntercept(Entity entity, Player player, boolean intercept) { 82 | PlayerChunkMap chunkMap = ((WorldServer)((CraftEntity)entity).getHandle().world).getChunkProvider().playerChunkMap; 83 | EntityTracker tracker = chunkMap.trackedEntities.get(entity.getEntityId()); 84 | if(!(tracker instanceof EntityTracker_v1_14_R1)) { 85 | throw new IllegalStateException(); 86 | } else { 87 | EntityTracker_v1_14_R1 intruder = (EntityTracker_v1_14_R1)tracker; 88 | if(intruder.intercept == intercept) { 89 | return; 90 | } else { 91 | intruder.toggleIntercept(intercept); 92 | if(intercept) { 93 | intruder.clear(((CraftPlayer)player).getHandle()); 94 | } else { 95 | intruder.updatePlayer(((CraftPlayer)player).getHandle()); 96 | } 97 | } 98 | } 99 | } 100 | 101 | } 102 | -------------------------------------------------------------------------------- /idisguise-impl-v1_15_R1/src/main/java/de/luisagrether/idisguise/impl/EntityTracker_v1_15_R1.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.impl; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.ArrayList; 5 | 6 | import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity; 7 | import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; 8 | import org.bukkit.entity.Entity; 9 | import org.bukkit.entity.Player; 10 | 11 | import net.minecraft.server.v1_15_R1.EntityPlayer; 12 | import net.minecraft.server.v1_15_R1.EntityTrackerEntry; 13 | import net.minecraft.server.v1_15_R1.PlayerChunkMap; 14 | import net.minecraft.server.v1_15_R1.PlayerChunkMap.EntityTracker; 15 | import net.minecraft.server.v1_15_R1.WorldServer; 16 | 17 | public class EntityTracker_v1_15_R1 extends EntityTracker { 18 | 19 | private static Field EntityTracker_tracker = null; 20 | private static Field EntityTracker_trackingDistance = null; 21 | private static Field EntityTracker_trackerEntry = null; 22 | private static Field EntityTrackerEntry_d = null; 23 | private static Field EntityTrackerEntry_e = null; 24 | static { 25 | try { 26 | EntityTracker_tracker = EntityTracker.class.getDeclaredField("tracker"); 27 | EntityTracker_tracker.setAccessible(true); 28 | EntityTracker_trackingDistance = EntityTracker.class.getDeclaredField("trackingDistance"); 29 | EntityTracker_trackingDistance.setAccessible(true); 30 | EntityTracker_trackerEntry = EntityTracker.class.getDeclaredField("trackerEntry"); 31 | EntityTracker_trackerEntry.setAccessible(true); 32 | EntityTrackerEntry_d = EntityTrackerEntry.class.getDeclaredField("d"); 33 | EntityTrackerEntry_d.setAccessible(true); 34 | EntityTrackerEntry_e = EntityTrackerEntry.class.getDeclaredField("e"); 35 | EntityTrackerEntry_e.setAccessible(true); 36 | } catch(Exception e) {} 37 | } 38 | 39 | private final int targetId; 40 | private boolean intercept; 41 | 42 | EntityTracker_v1_15_R1(PlayerChunkMap chunkMap, EntityTracker original, int targetId) throws IllegalAccessException { 43 | chunkMap.super( 44 | (net.minecraft.server.v1_15_R1.Entity)EntityTracker_tracker.get(original), 45 | EntityTracker_trackingDistance.getInt(original), 46 | EntityTrackerEntry_d.getInt(EntityTracker_trackerEntry.get(original)), 47 | EntityTrackerEntry_e.getBoolean(EntityTracker_trackerEntry.get(original)) 48 | ); 49 | this.targetId = targetId; 50 | this.intercept = false; 51 | } 52 | 53 | public void toggleIntercept(boolean intercept) { 54 | this.intercept = intercept; 55 | } 56 | 57 | @Override 58 | public void updatePlayer(EntityPlayer entityPlayer) { 59 | if(intercept && entityPlayer.getId() == targetId) { 60 | return; 61 | } 62 | super.updatePlayer(entityPlayer); 63 | } 64 | 65 | public static void inject(Entity entity, Player player) throws IllegalAccessException { 66 | PlayerChunkMap chunkMap = ((WorldServer)((CraftEntity)entity).getHandle().world).getChunkProvider().playerChunkMap; 67 | EntityTracker original = chunkMap.trackedEntities.get(entity.getEntityId()); 68 | if(original instanceof EntityTracker_v1_15_R1) { 69 | return; 70 | } else { 71 | chunkMap.trackedEntities.remove(entity.getEntityId()); 72 | EntityTracker_v1_15_R1 intruder = new EntityTracker_v1_15_R1(chunkMap, original, player.getEntityId()); 73 | chunkMap.trackedEntities.put(entity.getEntityId(), intruder); 74 | for(EntityPlayer observer : new ArrayList<>(original.trackedPlayers)) { 75 | original.clear(observer); 76 | intruder.updatePlayer(observer); 77 | } 78 | } 79 | } 80 | 81 | public static void toggleIntercept(Entity entity, Player player, boolean intercept) { 82 | PlayerChunkMap chunkMap = ((WorldServer)((CraftEntity)entity).getHandle().world).getChunkProvider().playerChunkMap; 83 | EntityTracker tracker = chunkMap.trackedEntities.get(entity.getEntityId()); 84 | if(!(tracker instanceof EntityTracker_v1_15_R1)) { 85 | throw new IllegalStateException(); 86 | } else { 87 | EntityTracker_v1_15_R1 intruder = (EntityTracker_v1_15_R1)tracker; 88 | if(intruder.intercept == intercept) { 89 | return; 90 | } else { 91 | intruder.toggleIntercept(intercept); 92 | if(intercept) { 93 | intruder.clear(((CraftPlayer)player).getHandle()); 94 | } else { 95 | intruder.updatePlayer(((CraftPlayer)player).getHandle()); 96 | } 97 | } 98 | } 99 | } 100 | 101 | } 102 | -------------------------------------------------------------------------------- /idisguise-impl-v1_16_R1/src/main/java/de/luisagrether/idisguise/impl/EntityTracker_v1_16_R1.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.impl; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.ArrayList; 5 | 6 | import org.bukkit.craftbukkit.v1_16_R1.entity.CraftEntity; 7 | import org.bukkit.craftbukkit.v1_16_R1.entity.CraftPlayer; 8 | import org.bukkit.entity.Entity; 9 | import org.bukkit.entity.Player; 10 | 11 | import net.minecraft.server.v1_16_R1.EntityPlayer; 12 | import net.minecraft.server.v1_16_R1.EntityTrackerEntry; 13 | import net.minecraft.server.v1_16_R1.PlayerChunkMap; 14 | import net.minecraft.server.v1_16_R1.PlayerChunkMap.EntityTracker; 15 | import net.minecraft.server.v1_16_R1.WorldServer; 16 | 17 | public class EntityTracker_v1_16_R1 extends EntityTracker { 18 | 19 | private static Field EntityTracker_tracker = null; 20 | private static Field EntityTracker_trackingDistance = null; 21 | private static Field EntityTracker_trackerEntry = null; 22 | private static Field EntityTrackerEntry_d = null; 23 | private static Field EntityTrackerEntry_e = null; 24 | static { 25 | try { 26 | EntityTracker_tracker = EntityTracker.class.getDeclaredField("tracker"); 27 | EntityTracker_tracker.setAccessible(true); 28 | EntityTracker_trackingDistance = EntityTracker.class.getDeclaredField("trackingDistance"); 29 | EntityTracker_trackingDistance.setAccessible(true); 30 | EntityTracker_trackerEntry = EntityTracker.class.getDeclaredField("trackerEntry"); 31 | EntityTracker_trackerEntry.setAccessible(true); 32 | EntityTrackerEntry_d = EntityTrackerEntry.class.getDeclaredField("d"); 33 | EntityTrackerEntry_d.setAccessible(true); 34 | EntityTrackerEntry_e = EntityTrackerEntry.class.getDeclaredField("e"); 35 | EntityTrackerEntry_e.setAccessible(true); 36 | } catch(Exception e) {} 37 | } 38 | 39 | private final int targetId; 40 | private boolean intercept; 41 | 42 | EntityTracker_v1_16_R1(PlayerChunkMap chunkMap, EntityTracker original, int targetId) throws IllegalAccessException { 43 | chunkMap.super( 44 | (net.minecraft.server.v1_16_R1.Entity)EntityTracker_tracker.get(original), 45 | EntityTracker_trackingDistance.getInt(original), 46 | EntityTrackerEntry_d.getInt(EntityTracker_trackerEntry.get(original)), 47 | EntityTrackerEntry_e.getBoolean(EntityTracker_trackerEntry.get(original)) 48 | ); 49 | this.targetId = targetId; 50 | this.intercept = false; 51 | } 52 | 53 | public void toggleIntercept(boolean intercept) { 54 | this.intercept = intercept; 55 | } 56 | 57 | @Override 58 | public void updatePlayer(EntityPlayer entityPlayer) { 59 | if(intercept && entityPlayer.getId() == targetId) { 60 | return; 61 | } 62 | super.updatePlayer(entityPlayer); 63 | } 64 | 65 | public static void inject(Entity entity, Player player) throws IllegalAccessException { 66 | PlayerChunkMap chunkMap = ((WorldServer)((CraftEntity)entity).getHandle().world).getChunkProvider().playerChunkMap; 67 | EntityTracker original = chunkMap.trackedEntities.get(entity.getEntityId()); 68 | if(original instanceof EntityTracker_v1_16_R1) { 69 | return; 70 | } else { 71 | chunkMap.trackedEntities.remove(entity.getEntityId()); 72 | EntityTracker_v1_16_R1 intruder = new EntityTracker_v1_16_R1(chunkMap, original, player.getEntityId()); 73 | chunkMap.trackedEntities.put(entity.getEntityId(), intruder); 74 | for(EntityPlayer observer : new ArrayList<>(original.trackedPlayers)) { 75 | original.clear(observer); 76 | intruder.updatePlayer(observer); 77 | } 78 | } 79 | } 80 | 81 | public static void toggleIntercept(Entity entity, Player player, boolean intercept) { 82 | PlayerChunkMap chunkMap = ((WorldServer)((CraftEntity)entity).getHandle().world).getChunkProvider().playerChunkMap; 83 | EntityTracker tracker = chunkMap.trackedEntities.get(entity.getEntityId()); 84 | if(!(tracker instanceof EntityTracker_v1_16_R1)) { 85 | throw new IllegalStateException(); 86 | } else { 87 | EntityTracker_v1_16_R1 intruder = (EntityTracker_v1_16_R1)tracker; 88 | if(intruder.intercept == intercept) { 89 | return; 90 | } else { 91 | intruder.toggleIntercept(intercept); 92 | if(intercept) { 93 | intruder.clear(((CraftPlayer)player).getHandle()); 94 | } else { 95 | intruder.updatePlayer(((CraftPlayer)player).getHandle()); 96 | } 97 | } 98 | } 99 | } 100 | 101 | } 102 | -------------------------------------------------------------------------------- /idisguise-impl-v1_16_R2/src/main/java/de/luisagrether/idisguise/impl/EntityTracker_v1_16_R2.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.impl; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.ArrayList; 5 | 6 | import org.bukkit.craftbukkit.v1_16_R2.entity.CraftEntity; 7 | import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer; 8 | import org.bukkit.entity.Entity; 9 | import org.bukkit.entity.Player; 10 | 11 | import net.minecraft.server.v1_16_R2.EntityPlayer; 12 | import net.minecraft.server.v1_16_R2.EntityTrackerEntry; 13 | import net.minecraft.server.v1_16_R2.PlayerChunkMap; 14 | import net.minecraft.server.v1_16_R2.PlayerChunkMap.EntityTracker; 15 | import net.minecraft.server.v1_16_R2.WorldServer; 16 | 17 | public class EntityTracker_v1_16_R2 extends EntityTracker { 18 | 19 | private static Field EntityTracker_tracker = null; 20 | private static Field EntityTracker_trackingDistance = null; 21 | private static Field EntityTracker_trackerEntry = null; 22 | private static Field EntityTrackerEntry_d = null; 23 | private static Field EntityTrackerEntry_e = null; 24 | static { 25 | try { 26 | EntityTracker_tracker = EntityTracker.class.getDeclaredField("tracker"); 27 | EntityTracker_tracker.setAccessible(true); 28 | EntityTracker_trackingDistance = EntityTracker.class.getDeclaredField("trackingDistance"); 29 | EntityTracker_trackingDistance.setAccessible(true); 30 | EntityTracker_trackerEntry = EntityTracker.class.getDeclaredField("trackerEntry"); 31 | EntityTracker_trackerEntry.setAccessible(true); 32 | EntityTrackerEntry_d = EntityTrackerEntry.class.getDeclaredField("d"); 33 | EntityTrackerEntry_d.setAccessible(true); 34 | EntityTrackerEntry_e = EntityTrackerEntry.class.getDeclaredField("e"); 35 | EntityTrackerEntry_e.setAccessible(true); 36 | } catch(Exception e) {} 37 | } 38 | 39 | private final int targetId; 40 | private boolean intercept; 41 | 42 | EntityTracker_v1_16_R2(PlayerChunkMap chunkMap, EntityTracker original, int targetId) throws IllegalAccessException { 43 | chunkMap.super( 44 | (net.minecraft.server.v1_16_R2.Entity)EntityTracker_tracker.get(original), 45 | EntityTracker_trackingDistance.getInt(original), 46 | EntityTrackerEntry_d.getInt(EntityTracker_trackerEntry.get(original)), 47 | EntityTrackerEntry_e.getBoolean(EntityTracker_trackerEntry.get(original)) 48 | ); 49 | this.targetId = targetId; 50 | this.intercept = false; 51 | } 52 | 53 | public void toggleIntercept(boolean intercept) { 54 | this.intercept = intercept; 55 | } 56 | 57 | @Override 58 | public void updatePlayer(EntityPlayer entityPlayer) { 59 | if(intercept && entityPlayer.getId() == targetId) { 60 | return; 61 | } 62 | super.updatePlayer(entityPlayer); 63 | } 64 | 65 | public static void inject(Entity entity, Player player) throws IllegalAccessException { 66 | PlayerChunkMap chunkMap = ((WorldServer)((CraftEntity)entity).getHandle().world).getChunkProvider().playerChunkMap; 67 | EntityTracker original = chunkMap.trackedEntities.get(entity.getEntityId()); 68 | if(original instanceof EntityTracker_v1_16_R2) { 69 | return; 70 | } else { 71 | chunkMap.trackedEntities.remove(entity.getEntityId()); 72 | EntityTracker_v1_16_R2 intruder = new EntityTracker_v1_16_R2(chunkMap, original, player.getEntityId()); 73 | chunkMap.trackedEntities.put(entity.getEntityId(), intruder); 74 | for(EntityPlayer observer : new ArrayList<>(original.trackedPlayers)) { 75 | original.clear(observer); 76 | intruder.updatePlayer(observer); 77 | } 78 | } 79 | } 80 | 81 | public static void toggleIntercept(Entity entity, Player player, boolean intercept) { 82 | PlayerChunkMap chunkMap = ((WorldServer)((CraftEntity)entity).getHandle().world).getChunkProvider().playerChunkMap; 83 | EntityTracker tracker = chunkMap.trackedEntities.get(entity.getEntityId()); 84 | if(!(tracker instanceof EntityTracker_v1_16_R2)) { 85 | throw new IllegalStateException(); 86 | } else { 87 | EntityTracker_v1_16_R2 intruder = (EntityTracker_v1_16_R2)tracker; 88 | if(intruder.intercept == intercept) { 89 | return; 90 | } else { 91 | intruder.toggleIntercept(intercept); 92 | if(intercept) { 93 | intruder.clear(((CraftPlayer)player).getHandle()); 94 | } else { 95 | intruder.updatePlayer(((CraftPlayer)player).getHandle()); 96 | } 97 | } 98 | } 99 | } 100 | 101 | } 102 | -------------------------------------------------------------------------------- /idisguise-impl-v1_16_R3/src/main/java/de/luisagrether/idisguise/impl/EntityTracker_v1_16_R3.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.impl; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.ArrayList; 5 | 6 | import org.bukkit.craftbukkit.v1_16_R3.entity.CraftEntity; 7 | import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer; 8 | import org.bukkit.entity.Entity; 9 | import org.bukkit.entity.Player; 10 | 11 | import net.minecraft.server.v1_16_R3.EntityPlayer; 12 | import net.minecraft.server.v1_16_R3.EntityTrackerEntry; 13 | import net.minecraft.server.v1_16_R3.PlayerChunkMap; 14 | import net.minecraft.server.v1_16_R3.PlayerChunkMap.EntityTracker; 15 | import net.minecraft.server.v1_16_R3.WorldServer; 16 | 17 | public class EntityTracker_v1_16_R3 extends EntityTracker { 18 | 19 | private static Field EntityTracker_tracker = null; 20 | private static Field EntityTracker_trackingDistance = null; 21 | private static Field EntityTracker_trackerEntry = null; 22 | private static Field EntityTrackerEntry_d = null; 23 | private static Field EntityTrackerEntry_e = null; 24 | static { 25 | try { 26 | EntityTracker_tracker = EntityTracker.class.getDeclaredField("tracker"); 27 | EntityTracker_tracker.setAccessible(true); 28 | EntityTracker_trackingDistance = EntityTracker.class.getDeclaredField("trackingDistance"); 29 | EntityTracker_trackingDistance.setAccessible(true); 30 | EntityTracker_trackerEntry = EntityTracker.class.getDeclaredField("trackerEntry"); 31 | EntityTracker_trackerEntry.setAccessible(true); 32 | EntityTrackerEntry_d = EntityTrackerEntry.class.getDeclaredField("d"); 33 | EntityTrackerEntry_d.setAccessible(true); 34 | EntityTrackerEntry_e = EntityTrackerEntry.class.getDeclaredField("e"); 35 | EntityTrackerEntry_e.setAccessible(true); 36 | } catch(Exception e) {} 37 | } 38 | 39 | private final int targetId; 40 | private boolean intercept; 41 | 42 | EntityTracker_v1_16_R3(PlayerChunkMap chunkMap, EntityTracker original, int targetId) throws IllegalAccessException { 43 | chunkMap.super( 44 | (net.minecraft.server.v1_16_R3.Entity)EntityTracker_tracker.get(original), 45 | EntityTracker_trackingDistance.getInt(original), 46 | EntityTrackerEntry_d.getInt(EntityTracker_trackerEntry.get(original)), 47 | EntityTrackerEntry_e.getBoolean(EntityTracker_trackerEntry.get(original)) 48 | ); 49 | this.targetId = targetId; 50 | this.intercept = false; 51 | } 52 | 53 | public void toggleIntercept(boolean intercept) { 54 | this.intercept = intercept; 55 | } 56 | 57 | @Override 58 | public void updatePlayer(EntityPlayer entityPlayer) { 59 | if(intercept && entityPlayer.getId() == targetId) { 60 | return; 61 | } 62 | super.updatePlayer(entityPlayer); 63 | } 64 | 65 | public static void inject(Entity entity, Player player) throws IllegalAccessException { 66 | PlayerChunkMap chunkMap = ((WorldServer)((CraftEntity)entity).getHandle().world).getChunkProvider().playerChunkMap; 67 | EntityTracker original = chunkMap.trackedEntities.get(entity.getEntityId()); 68 | if(original instanceof EntityTracker_v1_16_R3) { 69 | return; 70 | } else { 71 | chunkMap.trackedEntities.remove(entity.getEntityId()); 72 | EntityTracker_v1_16_R3 intruder = new EntityTracker_v1_16_R3(chunkMap, original, player.getEntityId()); 73 | chunkMap.trackedEntities.put(entity.getEntityId(), intruder); 74 | for(EntityPlayer observer : new ArrayList<>(original.trackedPlayers)) { 75 | original.clear(observer); 76 | intruder.updatePlayer(observer); 77 | } 78 | } 79 | } 80 | 81 | public static void toggleIntercept(Entity entity, Player player, boolean intercept) { 82 | PlayerChunkMap chunkMap = ((WorldServer)((CraftEntity)entity).getHandle().world).getChunkProvider().playerChunkMap; 83 | EntityTracker tracker = chunkMap.trackedEntities.get(entity.getEntityId()); 84 | if(!(tracker instanceof EntityTracker_v1_16_R3)) { 85 | throw new IllegalStateException(); 86 | } else { 87 | EntityTracker_v1_16_R3 intruder = (EntityTracker_v1_16_R3)tracker; 88 | if(intruder.intercept == intercept) { 89 | return; 90 | } else { 91 | intruder.toggleIntercept(intercept); 92 | if(intercept) { 93 | intruder.clear(((CraftPlayer)player).getHandle()); 94 | } else { 95 | intruder.updatePlayer(((CraftPlayer)player).getHandle()); 96 | } 97 | } 98 | } 99 | } 100 | 101 | } 102 | -------------------------------------------------------------------------------- /idisguise/src/main/java/de/luisagrether/idisguise/api/DisguiseAPI.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.api; 2 | 3 | import java.util.function.Consumer; 4 | 5 | import javax.annotation.Nullable; 6 | 7 | import org.bukkit.entity.Entity; 8 | import org.bukkit.entity.EntityType; 9 | import org.bukkit.entity.Player; 10 | 11 | /** 12 | * The API to hook into iDisguise. The following code returns an instance: 13 | * Bukkit.getServicesManager().getRegistration(DisguiseAPI.class).getProvider(); 14 | * 15 | * @since 6.0.1 16 | * @author LuisaGrether 17 | */ 18 | public interface DisguiseAPI { 19 | 20 | /** 21 | * Get a player's current disguise type. 22 | * 23 | * @since 6.0.1 24 | * @param player the player 25 | * @return the player's current disguise type, or null if the player is not disguised 26 | */ 27 | public EntityType getDisguise(Player player); 28 | 29 | 30 | /** 31 | * Indicates whether a player is disguised. 32 | * 33 | * @since 6.0.1 34 | * @param player the player 35 | * @return true if and only if the player is currently disguised 36 | */ 37 | public boolean isDisguised(Player player); 38 | 39 | /** 40 | * Disguise a player as some non-human entity. 41 | * 42 | * @since 6.0.1 43 | * @param player the player 44 | * @param type the disguise type 45 | * @return the disguise entity, may be edited to alter the disguise appearance 46 | * @throws EventCancelledException if the PlayerDisguiseEvent fired is cancelled by another plugin 47 | * @throws UnsupportedOperationException if the given type is not supported 48 | */ 49 | public default Entity disguise(Player player, EntityType type) throws EventCancelledException { 50 | return disguise(player, type, true); 51 | } 52 | 53 | /** 54 | * Disguise a player as some non-human entity. 55 | * 56 | * @since 6.0.1 57 | * @param player the player 58 | * @param type the disguise type 59 | * @param fireEvent whether a PlayerDisguiseEvent should be called 60 | * @return the disguise entity, may be edited to alter the disguise appearance 61 | * @throws EventCancelledException if the PlayerDisguiseEvent fired is cancelled by another plugin 62 | * @throws UnsupportedOperationException if the given type is not supported 63 | */ 64 | public Entity disguise(Player player, EntityType type, boolean fireEvent) throws EventCancelledException; 65 | 66 | /** 67 | * Disguise a player as another player. 68 | * 69 | * @since 6.0.1 70 | * @param player the player 71 | * @param targetSkin the target skin 72 | * @param callback is called after the operation is finished. true indicates success, false indicates that some error occurred 73 | * @throws EventCancelledException if the PlayerDisguiseAsPlayerEvent fired is cancelled by another plugin 74 | * @throws IllegalArgumentException if the given target skin is not a valid Minecraft username 75 | * @throws UnsupportedOperationException if player disguise is not supported 76 | */ 77 | public default void disguiseAsPlayer(Player player, String targetSkin, @Nullable Consumer callback) throws EventCancelledException { 78 | disguiseAsPlayer(player, targetSkin, true, callback); 79 | } 80 | 81 | /** 82 | * Disguise a player as another player. 83 | * 84 | * @since 6.0.1 85 | * @param player the player 86 | * @param targetSkin the target skin 87 | * @param fireEvent whether a PlayerDisguiseAsPlayerEvent should be called 88 | * @param callback is called after the operation is finished. true indicates success, false indicates that some error occurred 89 | * @throws EventCancelledException if the PlayerDisguiseAsPlayerEvent fired is cancelled by another plugin 90 | * @throws IllegalArgumentException if the given target skin is not a valid Minecraft username 91 | * @throws UnsupportedOperationException if player disguise is not supported 92 | */ 93 | public void disguiseAsPlayer(Player player, String targetSkin, boolean fireEvent, @Nullable Consumer callback) throws EventCancelledException; 94 | 95 | /** 96 | * Undisguise a player. 97 | * 98 | * @since 6.0.1 99 | * @param player the player 100 | * @throws EventCancelledException if the PlayerUndisguiseEvent fired is cancelled by another plugin 101 | * @return the disguise type before undisguising, or null if the player was not disguised 102 | */ 103 | public default EntityType undisguise(Player player) throws EventCancelledException { 104 | return undisguise(player, true); 105 | } 106 | 107 | /** 108 | * Undisguise a player. 109 | * 110 | * @since 6.0.1 111 | * @param player the player 112 | * @param fireEvent whether a PlayerUndisguiseEvent should be called 113 | * @throws EventCancelledException if the PlayerUndisguiseEvent fired is cancelled by another plugin 114 | * @return the disguise type before undisguising, or null if the player was not disguised 115 | */ 116 | public EntityType undisguise(Player player, boolean fireEvent) throws EventCancelledException; 117 | 118 | } 119 | -------------------------------------------------------------------------------- /idisguise/src/main/java/de/luisagrether/util/StringUtil.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.util; 2 | 3 | import java.io.IOException; 4 | import java.io.InputStream; 5 | import java.util.Locale; 6 | 7 | /** 8 | * Some utility methods for strings. 9 | * 10 | * @author LuisaGrether 11 | */ 12 | public class StringUtil { 13 | 14 | /** 15 | * Tests whether a string contains any of the others. 16 | * 17 | * @param string the string 18 | * @param strings the other strings 19 | * @return true if the string contains any of the others 20 | */ 21 | public static boolean contains(String string, String... strings) { 22 | for(String s : strings) { 23 | if(string.contains(s)) { 24 | return true; 25 | } 26 | } 27 | return false; 28 | } 29 | 30 | /** 31 | * Tests whether a string equals any of the others. 32 | * 33 | * @param string the string 34 | * @param strings the other strings 35 | * @return true if the string equals any of the others 36 | */ 37 | public static boolean equals(String string, String... strings) { 38 | for(String s : strings) { 39 | if(string.equals(s)) { 40 | return true; 41 | } 42 | } 43 | return false; 44 | } 45 | 46 | /** 47 | * Tests whether a string equals any of the others, ignoring case considerations. 48 | * 49 | * @param string the string 50 | * @param strings the other strings 51 | * @return true if the string equals any of the others, ignoring case considerations 52 | */ 53 | public static boolean equalsIgnoreCase(String string, String... strings) { 54 | for(String s : strings) { 55 | if(string.equalsIgnoreCase(s)) { 56 | return true; 57 | } 58 | } 59 | return false; 60 | } 61 | 62 | /** 63 | * Tests whether a string starts with any of the given prefixes. 64 | * 65 | * @param string the string 66 | * @param prefixes the prefixes to look for 67 | * @return true if the string starts with at least one of the given prefixes 68 | */ 69 | public static boolean startsWith(String string, String... prefixes) { 70 | for(String prefix : prefixes) { 71 | if(string.startsWith(prefix)) { 72 | return true; 73 | } 74 | } 75 | return false; 76 | } 77 | 78 | /** 79 | * Tests whether any of the strings starts with the given prefix. 80 | * 81 | * @param prefix the prefix to look for 82 | * @param strings the strings 83 | * @return true if at least one of the given strings starts with the given prefix 84 | */ 85 | public static boolean startsWith2(String prefix, String... strings) { 86 | for(String string : strings) { 87 | if(string.startsWith(prefix)) { 88 | return true; 89 | } 90 | } 91 | return false; 92 | } 93 | 94 | /** 95 | * Joins an array of strings with a specified seperator. 96 | * 97 | * @param seperator the seperator 98 | * @param strings the strings 99 | * @return the joined strings 100 | */ 101 | public static String join(char seperator, String... strings) { 102 | return join(String.valueOf(seperator), strings); 103 | } 104 | 105 | /** 106 | * Joins an array of strings with a specified seperator. 107 | * 108 | * @param seperator the seperator 109 | * @param strings the strings 110 | * @return the joined strings 111 | */ 112 | public static String join(String seperator, String... strings) { 113 | if(strings == null || strings.length == 0) return ""; 114 | StringBuilder builder = new StringBuilder(strings[0]); 115 | for(int i = 1; i < strings.length; i++) { 116 | builder.append(seperator); 117 | builder.append(strings[i]); 118 | } 119 | return builder.toString(); 120 | } 121 | 122 | /** 123 | * Capitalizes the first letter of every word of the given string.
124 | * e.g. "This is a STRING!" -> "This Is A STRING!" 125 | * 126 | * @param string string to capitalize 127 | * @return the capitalized string 128 | */ 129 | public static String capitalize(String string) { 130 | String[] words = string.split(" ", -1); 131 | for(int i = 0; i < words.length; i++) { 132 | if(words[i].length() > 0) { 133 | words[i] = Character.toString(words[i].charAt(0)).toUpperCase(Locale.ENGLISH) + words[i].substring(1); 134 | } 135 | } 136 | return join(' ', words); 137 | } 138 | 139 | /** 140 | * Capitalizes the first letter of every word of the given string and decapitalizes all other letters.
141 | * e.g. "This is a STRING!" -> "This Is A String!" 142 | * 143 | * @param string string to capitalize 144 | * @return the capitalized string 145 | */ 146 | public static String capitalizeFully(String string) { 147 | String[] words = string.split(" ", -1); 148 | for(int i = 0; i < words.length; i++) { 149 | if(words[i].length() > 0) { 150 | words[i] = Character.toString(words[i].charAt(0)).toUpperCase(Locale.ENGLISH) + words[i].substring(1).toLowerCase(Locale.ENGLISH); 151 | } 152 | } 153 | return join(' ', words); 154 | } 155 | 156 | /** 157 | * Indicates whether a string starts with a given prefix ignoring the case. 158 | * 159 | * @param string string to test 160 | * @param prefix prefix to look for 161 | * @return true, if and only if the given string starts with the given prefix (ignoring case) 162 | */ 163 | public static boolean startsWithIgnoreCase(String string, String prefix) { 164 | return string.toLowerCase(Locale.ENGLISH).startsWith(prefix.toLowerCase(Locale.ENGLISH)); 165 | } 166 | 167 | /** 168 | * Indicates whether a string object (may be null) is blank or not. 169 | * 170 | * @param string string to test 171 | * @return true, if and only if the given string is not null and contains at least one non-whitespace character 172 | */ 173 | public static boolean isNotBlank(String string) { 174 | return string != null && !string.isEmpty() && !string.trim().isEmpty(); 175 | } 176 | 177 | /** 178 | * Reads a string from the given input stream. 179 | * 180 | * @param input the input stream to read from 181 | * @return the string 182 | */ 183 | public static String readFrom(InputStream input) { 184 | try { 185 | StringOutputStream output = new StringOutputStream(); 186 | byte[] buffer = new byte[1024]; 187 | int read; 188 | while((read = input.read(buffer)) > 0) { 189 | output.write(buffer, 0, read); 190 | } 191 | output.close(); 192 | return output.toString(); 193 | } catch(IOException e) { 194 | return ""; 195 | } 196 | } 197 | 198 | public static final char[] hexChars = "0123456789abcdef".toCharArray(); 199 | 200 | /** 201 | * Convert an array of bytes into a hex string.
202 | * The length of the string will be two times the length of the given array.
203 | * The hex string will be lower case. 204 | */ 205 | public static String bytesToHex(byte[] bytes) { 206 | char[] chars = new char[bytes.length * 2]; 207 | for(int i = 0; i < bytes.length; i++) { 208 | chars[2*i] = hexChars[(bytes[i] >> 4) & 0xf]; 209 | chars[2*i + 1] = hexChars[bytes[i] & 0xf]; 210 | } 211 | return new String(chars); 212 | } 213 | 214 | } 215 | -------------------------------------------------------------------------------- /idisguise/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | de.luisagrether.idisguise 4 | idisguise 5 | 6.0.2 6 | iDisguise 7 | Recode of the famous iDisguse plugin! 8 | 9 | 10 | UTF-8 11 | yyyy_MM_dd-HH_mm_ss 12 | 13 | 14 | 15 | 16 | spigot-repo 17 | https://hub.spigotmc.org/nexus/content/repositories/snapshots/ 18 | 19 | 20 | codemc-repo 21 | https://repo.codemc.org/repository/maven-public/ 22 | 23 | 24 | 25 | 26 | 27 | org.spigotmc 28 | spigot-api 29 | 1.18.2-R0.1-SNAPSHOT 30 | provided 31 | 32 | 33 | com.googlecode.json-simple 34 | json-simple 35 | 1.1.1 36 | provided 37 | 38 | 39 | org.bstats 40 | bstats-bukkit 41 | 1.4 42 | compile 43 | 44 | 45 | de.luisagrether.idisguise 46 | idisguise-impl-v1_17_R1 47 | 6.0.1 48 | compile 49 | 50 | 51 | de.luisagrether.idisguise 52 | idisguise-impl-v1_16_R3 53 | 6.0.1 54 | compile 55 | 56 | 57 | de.luisagrether.idisguise 58 | idisguise-impl-v1_16_R2 59 | 6.0.1 60 | compile 61 | 62 | 63 | de.luisagrether.idisguise 64 | idisguise-impl-v1_16_R1 65 | 6.0.1 66 | compile 67 | 68 | 69 | de.luisagrether.idisguise 70 | idisguise-impl-v1_15_R1 71 | 6.0.1 72 | compile 73 | 74 | 75 | de.luisagrether.idisguise 76 | idisguise-impl-v1_14_R1 77 | 6.0.1 78 | compile 79 | 80 | 81 | de.luisagrether.idisguise 82 | idisguise-impl-v1_13_R2 83 | 6.0.1 84 | compile 85 | 86 | 87 | de.luisagrether.idisguise 88 | idisguise-impl-v1_13_R1 89 | 6.0.1 90 | compile 91 | 92 | 93 | de.luisagrether.idisguise 94 | idisguise-impl-v1_12_R1 95 | 6.0.1 96 | compile 97 | 98 | 99 | de.luisagrether.idisguise 100 | idisguise-impl-v1_11_R1 101 | 6.0.1 102 | compile 103 | 104 | 105 | de.luisagrether.idisguise 106 | idisguise-impl-v1_10_R1 107 | 6.0.1 108 | compile 109 | 110 | 111 | de.luisagrether.idisguise 112 | idisguise-impl-v1_9_R2 113 | 6.0.1 114 | compile 115 | 116 | 117 | de.luisagrether.idisguise 118 | idisguise-impl-v1_9_R1 119 | 6.0.1 120 | compile 121 | 122 | 123 | de.luisagrether.idisguise 124 | idisguise-impl-v1_8_R3 125 | 6.0.1 126 | compile 127 | 128 | 129 | de.luisagrether.idisguise 130 | idisguise-impl-v1_8_R2 131 | 6.0.1 132 | compile 133 | 134 | 135 | de.luisagrether.idisguise 136 | idisguise-impl-v1_8_R1 137 | 6.0.1 138 | compile 139 | 140 | 141 | 142 | 143 | 144 | 145 | src/main/resources 146 | true 147 | 148 | 149 | 150 | 151 | org.apache.maven.plugins 152 | maven-compiler-plugin 153 | 3.11.0 154 | 155 | 1.8 156 | 1.8 157 | true 158 | true 159 | ${JAVA_8_HOME}/bin/javac 160 | 161 | 162 | 163 | org.apache.maven.plugins 164 | maven-shade-plugin 165 | 3.6.0 166 | 167 | 168 | 169 | de.luisagrether.idisguise:* 170 | org.bstats:* 171 | 172 | 173 | 174 | 175 | org.bstats.bukkit 176 | de.luisagrether.idisguise.io.bstats 177 | 178 | 179 | 180 | 181 | 182 | package 183 | 184 | shade 185 | 186 | 187 | 188 | 189 | 190 | org.apache.maven.plugins 191 | maven-javadoc-plugin 192 | 193 | de.luisagrether.idisguise.api 194 | 195 | 196 | 197 | 198 | 199 | org.apache.maven.wagon 200 | wagon-ssh 201 | 3.1.0 202 | 203 | 204 | 205 | 206 | 207 | 208 | luisagrether-repository-ftp 209 | sftp://ssh.strato.de/ 210 | 211 | 212 | 213 | -------------------------------------------------------------------------------- /idisguise/src/main/java/de/luisagrether/idisguise/io/UpdateCheck.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.io; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.File; 5 | import java.io.FileOutputStream; 6 | import java.io.IOException; 7 | import java.io.InputStream; 8 | import java.io.InputStreamReader; 9 | import java.io.OutputStream; 10 | import java.net.HttpURLConnection; 11 | import java.net.URL; 12 | import java.net.URLConnection; 13 | import java.security.DigestInputStream; 14 | import java.security.MessageDigest; 15 | import java.security.NoSuchAlgorithmException; 16 | import java.util.logging.Level; 17 | 18 | import org.bukkit.command.CommandSender; 19 | import org.json.simple.JSONArray; 20 | import org.json.simple.JSONObject; 21 | import org.json.simple.JSONValue; 22 | 23 | import de.luisagrether.idisguise.iDisguise; 24 | import de.luisagrether.util.ObjectUtil; 25 | import de.luisagrether.util.StringUtil; 26 | 27 | public class UpdateCheck implements Runnable { 28 | 29 | public static final int PROJECT_ID = 46941; 30 | public static final String API_URL = "https://api.curseforge.com/servermods/files?projectIds="; 31 | public static final String API_CHECKSUM = "md5"; 32 | public static final String API_DOWNLOAD_URL = "downloadUrl"; 33 | public static final String API_FILE_NAME = "fileName"; 34 | public static final String API_GAME_VERSION = "gameVersion"; 35 | public static final String API_NAME = "name"; 36 | public static final String API_RELEASE_TYPE = "releaseType"; 37 | 38 | private iDisguise plugin; 39 | private String pluginVersion; 40 | private String latestVersion; 41 | private CommandSender toBeNotified; 42 | private String downloadUrl; 43 | private String checksum; 44 | private boolean autoDownload; 45 | 46 | public UpdateCheck(iDisguise plugin, CommandSender toBeNotified, boolean autoDownload) { 47 | this.plugin = plugin; 48 | this.pluginVersion = plugin.getNameAndVersion(); 49 | this.toBeNotified = toBeNotified; 50 | this.autoDownload = autoDownload; 51 | } 52 | 53 | public void run() { 54 | checkForUpdate(); 55 | if(isUpdateAvailable()) { 56 | toBeNotified.sendMessage(plugin.getLanguage().UPDATE_AVAILABLE.replace("%version%", latestVersion)); 57 | if(autoDownload) { 58 | downloadUpdate(); 59 | } else { 60 | toBeNotified.sendMessage(plugin.getLanguage().UPDATE_OPTION); 61 | } 62 | } 63 | } 64 | 65 | private boolean isUpdateAvailable() { 66 | if(latestVersion != null && !pluginVersion.equals(latestVersion)) { 67 | try { 68 | int current = extractVersionNumber(pluginVersion); 69 | int latest = extractVersionNumber(latestVersion); 70 | return latest > current; 71 | } catch(NumberFormatException e) { 72 | } catch(ArrayIndexOutOfBoundsException e) { 73 | } 74 | } 75 | return false; 76 | } 77 | 78 | private void checkForUpdate() { 79 | BufferedReader reader = null; 80 | try { 81 | URL url = new URL(API_URL + PROJECT_ID); 82 | URLConnection connection = url.openConnection(); 83 | connection.addRequestProperty("User-Agent", pluginVersion.replace(' ', '/') + " (by LuisaGrether)"); 84 | connection.setDoOutput(true); 85 | reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 86 | String response = reader.readLine(); 87 | JSONArray array = (JSONArray)JSONValue.parse(response); 88 | latestVersion = null; 89 | int latestVersionNumber = 0; 90 | for(Object obj : array) { 91 | JSONObject object = (JSONObject)obj; 92 | int versionNumber = extractVersionNumber((String)object.get(API_NAME)); 93 | if(versionNumber > latestVersionNumber) { 94 | latestVersionNumber = versionNumber; 95 | latestVersion = (String)object.get(API_NAME); 96 | downloadUrl = ((String)object.get(API_DOWNLOAD_URL)); 97 | checksum = (String)object.get(API_CHECKSUM); 98 | } 99 | } 100 | } catch(Exception e) { 101 | plugin.getLogger().log(Level.WARNING, "Update checking failed: " + e.getClass().getSimpleName()); 102 | } finally { 103 | if(reader != null) { 104 | try { 105 | reader.close(); 106 | } catch(IOException e) { 107 | } 108 | } 109 | } 110 | } 111 | 112 | private void downloadUpdate() { 113 | File oldFile = plugin.getFile(); 114 | File newFile = new File(plugin.getServer().getUpdateFolderFile(), oldFile.getName()); 115 | if(newFile.exists()) { 116 | toBeNotified.sendMessage(plugin.getLanguage().UPDATE_ALREADY_DOWNLOADED); 117 | } else { 118 | InputStream input = null; 119 | OutputStream output = null; 120 | try { 121 | URL url = new URL(downloadUrl); 122 | HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 123 | connection.addRequestProperty("User-Agent", pluginVersion.replace(' ', '/') + " (by LuisaGrether)"); 124 | connection.setDoOutput(true); 125 | if(ObjectUtil.equals(connection.getResponseCode(), 301, 302)) { 126 | downloadUrl = connection.getHeaderField("Location"); 127 | downloadUpdate(); 128 | return; 129 | } else if(connection.getResponseCode() != 200) { 130 | toBeNotified.sendMessage(plugin.getLanguage().UPDATE_DOWNLOAD_FAILED); 131 | plugin.getLogger().log(Level.WARNING, "Update download failed: HTTP error"); 132 | return; 133 | } 134 | toBeNotified.sendMessage(plugin.getLanguage().UPDATE_DOWNLOADING); 135 | MessageDigest messageDigest = MessageDigest.getInstance("MD5"); 136 | input = new DigestInputStream(connection.getInputStream(), messageDigest); 137 | plugin.getServer().getUpdateFolderFile().mkdir(); 138 | output = new FileOutputStream(newFile); 139 | int fetched; 140 | byte[] data = new byte[4096]; 141 | while((fetched = input.read(data)) > 0) { 142 | output.write(data, 0, fetched); 143 | } 144 | input.close(); 145 | output.close(); 146 | if(StringUtil.bytesToHex(messageDigest.digest()).equalsIgnoreCase(this.checksum)) { 147 | toBeNotified.sendMessage(plugin.getLanguage().UPDATE_DOWNLOAD_SUCCEEDED); 148 | } else { 149 | newFile.delete(); 150 | toBeNotified.sendMessage(plugin.getLanguage().UPDATE_DOWNLOAD_FAILED); 151 | plugin.getLogger().log(Level.WARNING, "Update download failed: checksum is bad"); 152 | } 153 | } catch(IOException | NoSuchAlgorithmException e) { 154 | toBeNotified.sendMessage(plugin.getLanguage().UPDATE_DOWNLOAD_FAILED); 155 | plugin.getLogger().log(Level.WARNING, "Update download failed: " + e.getClass().getSimpleName()); 156 | } finally { 157 | if(input != null) { 158 | try { 159 | input.close(); 160 | } catch(IOException e) { 161 | } 162 | } 163 | if(output != null) { 164 | try { 165 | output.close(); 166 | } catch(IOException e) { 167 | } 168 | } 169 | } 170 | } 171 | } 172 | 173 | public static int extractVersionNumber(String versionString) { 174 | try { 175 | String[] numbers = versionString.split(" |-")[1].split("\\."); 176 | int versionNumber = 0; 177 | for(int i = 0; i < numbers.length; i++) { 178 | if(numbers[i].length() > 2) 179 | return 0; 180 | 181 | versionNumber += Integer.parseInt(numbers[i]) * Math.pow(10.0, 2 * (numbers.length - i - 1)); 182 | } 183 | if(versionString.contains("SNAPSHOT")) 184 | versionNumber--; 185 | return versionNumber; 186 | } catch(ArrayIndexOutOfBoundsException|NumberFormatException e) { 187 | return 0; 188 | } 189 | } 190 | 191 | } 192 | -------------------------------------------------------------------------------- /idisguise/src/main/java/de/luisagrether/idisguise/io/Config.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.io; 2 | 3 | import java.io.File; 4 | import java.io.FileOutputStream; 5 | import java.io.OutputStream; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.RetentionPolicy; 8 | import java.lang.reflect.Field; 9 | import java.util.ArrayList; 10 | import java.util.Arrays; 11 | import java.util.List; 12 | import java.util.Locale; 13 | import java.util.logging.Level; 14 | 15 | import org.bukkit.configuration.file.FileConfiguration; 16 | 17 | import de.luisagrether.idisguise.iDisguise; 18 | import de.luisagrether.util.StringUtil; 19 | 20 | public class Config { 21 | 22 | /* Configuration options start here */ 23 | public static final String DISGUISE_TYPE_BLACKLIST_PATH = "disguise.disguise-type-blacklist"; 24 | public static final String PLAYER_DISGUISE_BLACKLIST_PATH = "disguise.player-disguise-blacklist"; 25 | public static final String STATEMENT_WHITELIST_PATH = "commands.statement-whitelist"; 26 | public static final String USE_PERMISSION_NODES_PATH = "commands.use-permission-nodes"; 27 | public static final String UPDATE_CHECK_PATH = "updates.check"; 28 | public static final String UPDATE_DOWNLOAD_PATH = "updates.download"; 29 | 30 | @LastUpdated(60001) 31 | public List DISGUISE_TYPE_BLACKLIST = new ArrayList<>(Arrays.asList( 32 | "ARROW", "BLOCK_DISPLAY", "BREEZE_WIND_CHARGE", "COMPLEX_PART", "DRAGON_FIREBALL", "EGG", "ENDER_CRYSTAL", "END_CRYSTAL", "ENDER_DRAGON", "ENDER_PEARL", 33 | "ENDER_SIGNAL", "EVOKER_FANGS", "EXPERIENCE_ORB", "EXPERIENCE_BOTTLE", "EYE_OF_ENDER", "FALLING_BLOCK", "FIREBALL", "FIREWORK", "FIREWORK_ROCKET", 34 | "FISHING_BOBBER", "FISHING_HOOK", "GLOW_ITEM_FRAME", "INTERACTION", "ITEM_DISPLAY", "ITEM_FRAME", "LEASH_HITCH", "LEASH_KNOT", "LIGHTNING", 35 | "LIGHTNING_BOLT", "LINGERING_POTION", "LLAMA_SPIT", "MARKER", "MINECART_CHEST", "CHEST_MINECART", "MINECART_COMMAND", "COMMAND_BLOCK_MINECART", 36 | "MINECART_FURNACE", "FURNACE_MINECART", "MINECART_HOPPER", "HOPPER_MINECART", "MINECART_MOB_SPAWNER", "SPAWNER_MINECART", "MINECART_TNT", "TNT_MINECART", 37 | "OMINOUS_ITEM_SPAWNER", "PAINTING", "PRIMED_TNT", "SHULKER_BULLET", "SMALL_FIREBALL", "SNOWBALL", "SPECTRAL_ARROW", "SPLASH_POTION", 38 | "TEXT_DISPLAY", "THROWN_EXP_BOTTLE", "TIPPED_ARROW", "TRIDENT", "UNKNOWN", "WEATHER", "WIND_CHARGE", "WITHER_SKULL" 39 | )); 40 | @LastUpdated(60002) 41 | public List PLAYER_DISGUISE_BLACKLIST = Arrays.asList("put player name here"); 42 | @LastUpdated(60002) 43 | public List STATEMENT_WHITELIST = Arrays.asList( 44 | "setCustomName", "setGlowing", "setFireTicks", "setFreezeTicks", "setSilent", "setAdult", "setBaby", "setVariant", "setPlayingDead", "setHasNectar", 45 | "setCatType", "setCollarColor", "setCarryingChest", "setFoxType", "setSleeping", "setLeftHorn", "setRightHorn", "setColor", "setStyle", "setMainGene", 46 | "setOnBack", "setRolling","setSneezing", "setDisplayBlock", "setDisplayBlockData", "setRabbitType", "setState", "setSaddle", "setShivering", "setAngry", 47 | "setSkeletonType", "setBoatType", "setAwake", "setProfession", "setVillagerType", "setSize", "setPuffState", "setVillager", "setItemStack", "setSitting", 48 | "setCarriedBlock", "setCarriedMaterial", "setSheared", "setBodyColor", "setPattern", "setPatternColor", "setVillagerProfession", "setPowered" 49 | ); 50 | public boolean USE_PERMISSION_NODES = false; 51 | public boolean UPDATE_CHECK = true; 52 | public boolean UPDATE_DOWNLOAD = false; 53 | /* Configuration options end here */ 54 | 55 | private iDisguise plugin; 56 | 57 | public Config(iDisguise plugin) { 58 | this.plugin = plugin; 59 | } 60 | 61 | public void loadData() { 62 | plugin.reloadConfig(); 63 | FileConfiguration fileConfiguration = plugin.getConfig(); 64 | try { 65 | int fileVersion = UpdateCheck.extractVersionNumber(fileConfiguration.getString("version", plugin.getNameAndVersion())); 66 | for(Field pathField : getClass().getDeclaredFields()) { 67 | if(pathField.getName().endsWith("_PATH")) { 68 | Field valueField = getClass().getDeclaredField(pathField.getName().substring(0, pathField.getName().length() - 5)); 69 | if(valueField.isAnnotationPresent(LastUpdated.class) && valueField.getAnnotation(LastUpdated.class).value() > fileVersion) continue; 70 | 71 | if(fileConfiguration.isSet((String)pathField.get(null))) { 72 | if(fileConfiguration.isString((String)pathField.get(null))) { 73 | valueField.set(this, fileConfiguration.getString((String)pathField.get(null), (String)valueField.get(this))); 74 | } else if(fileConfiguration.isBoolean((String)pathField.get(null))) { 75 | valueField.setBoolean(this, fileConfiguration.getBoolean((String)pathField.get(null), valueField.getBoolean(this))); 76 | } else if(fileConfiguration.isDouble((String)pathField.get(null))) { 77 | valueField.setDouble(this, fileConfiguration.getDouble((String)pathField.get(null), valueField.getDouble(this))); 78 | } else if(fileConfiguration.isInt((String)pathField.get(null))) { 79 | valueField.setInt(this, fileConfiguration.getInt((String)pathField.get(null), valueField.getInt(this))); 80 | } else if(fileConfiguration.isList((String)pathField.get(null))) { 81 | if(valueField.getName().equals("DISGUISE_TYPE_BLACKLIST")) { 82 | for(String value : (List)fileConfiguration.getList((String)pathField.get(null), (List)valueField.get(this))) { 83 | if(!DISGUISE_TYPE_BLACKLIST.contains(value)) { 84 | DISGUISE_TYPE_BLACKLIST.add(value); 85 | } 86 | } 87 | } else if(valueField.getName().equals("PLAYER_DISGUISE_BLACKLIST")) { 88 | PLAYER_DISGUISE_BLACKLIST = new ArrayList<>(); 89 | for(String value : (List)fileConfiguration.getList((String)pathField.get(null), (List)valueField.get(this))) { 90 | if(!PLAYER_DISGUISE_BLACKLIST.contains(value.toLowerCase(Locale.ENGLISH))) { 91 | PLAYER_DISGUISE_BLACKLIST.add(value.toLowerCase(Locale.ENGLISH)); 92 | } 93 | } 94 | } else { 95 | valueField.set(this, fileConfiguration.getList((String)pathField.get(null), (List)valueField.get(this))); 96 | } 97 | } 98 | } 99 | } 100 | } 101 | } catch(Exception e) { 102 | plugin.getLogger().log(Level.SEVERE, "An error occured while loading the config file.", e); 103 | } 104 | } 105 | 106 | public void saveData() { 107 | File configurationFile = new File(plugin.getDataFolder(), "config.yml"); 108 | String config = StringUtil.readFrom(plugin.getResource("config.yml")); 109 | try { 110 | for(Field pathField : getClass().getDeclaredFields()) { 111 | if(pathField.getName().endsWith("_PATH")) { 112 | Field valueField = getClass().getDeclaredField(pathField.getName().substring(0, pathField.getName().length() - 5)); 113 | if(valueField.getType() == List.class) { 114 | StringBuilder builder = new StringBuilder(); 115 | for(Object object : ((List)valueField.get(this))) { 116 | builder.append("\n - " + object.toString()); 117 | } 118 | config = config.replace(valueField.getName(), builder.toString()); 119 | } else { 120 | config = config.replace(valueField.getName(), valueField.get(this).toString()); 121 | } 122 | } 123 | } 124 | config = config.replace("VERSION", plugin.getNameAndVersion()); 125 | OutputStream output = new FileOutputStream(configurationFile); 126 | output.write(config.getBytes()); 127 | output.close(); 128 | } catch(Exception e) { 129 | plugin.getLogger().log(Level.SEVERE, "An error occured while saving the config file.", e); 130 | } 131 | } 132 | 133 | @Retention(RetentionPolicy.RUNTIME) 134 | private @interface LastUpdated { 135 | int value(); 136 | } 137 | 138 | } 139 | -------------------------------------------------------------------------------- /idisguise/src/main/java/de/luisagrether/idisguise/io/Language.java: -------------------------------------------------------------------------------- 1 | package de.luisagrether.idisguise.io; 2 | 3 | import java.io.File; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.reflect.Field; 7 | import java.util.Locale; 8 | import java.util.logging.Level; 9 | 10 | import org.bukkit.ChatColor; 11 | import org.bukkit.configuration.file.FileConfiguration; 12 | import org.bukkit.configuration.file.YamlConfiguration; 13 | 14 | import de.luisagrether.idisguise.iDisguise; 15 | 16 | public class Language { 17 | 18 | @LastUpdated(60001) 19 | public String CONSOLE_USE_COMMAND = ChatColor.RED + "This command is for players only."; 20 | @LastUpdated(60001) 21 | public String CURRENTLY_DISGUISED_AS_PLAYER = ChatColor.GOLD + "You are currently disguised as player: %targetSkin%"; 22 | @LastUpdated(60001) 23 | public String ODISGUISE_CURRENTLY_DISGUISED_AS_PLAYER = ChatColor.GOLD + "%player% is currently disguised as player: %targetSkin%"; 24 | @LastUpdated(60001) 25 | public String CURRENTLY_DISGUISED_AS_ENTITY = ChatColor.GOLD + "You are currently disguised as: %entityType%"; 26 | @LastUpdated(60001) 27 | public String ODISGUISE_CURRENTLY_DISGUISED_AS_ENTITY = ChatColor.GOLD + "%player% is currently disguised as: %entityType%"; 28 | @LastUpdated(60001) 29 | public String CURRENTLY_NOT_DISGUISED = ChatColor.GOLD + "You are not disguised."; 30 | @LastUpdated(60001) 31 | public String ODISGUISE_CURRENTLY_NOT_DISGUISED = ChatColor.GOLD + "%player% is not disguised."; 32 | @LastUpdated(60001) 33 | public String DISGUISE_TYPE_NOT_SUPPORTED = ChatColor.RED + "Currently not supported!"; 34 | @LastUpdated(60001) 35 | public String DISGUISE_TYPE_NOT_FOUND = ChatColor.RED + "Disguise type not found: %entityType%"; 36 | @LastUpdated(60001) 37 | public String DISGUISE_NO_PERMISSION = ChatColor.RED + "You don't have permission."; 38 | @LastUpdated(60001) 39 | public String DISGUISE_EVENT_CANCELLED = ChatColor.RED + "Another plugin prevents you from disguising."; 40 | @LastUpdated(60001) 41 | public String ODISGUISE_EVENT_CANCELLED = ChatColor.RED + "Another plugin prevents %player% from disguising."; 42 | @LastUpdated(60001) 43 | public String PLAYER_DISGUISE_ACCOUNT_NAME_MISSING = ChatColor.RED + "Please feed me an account name as well."; 44 | @LastUpdated(60001) 45 | public String PLAYER_DISGUISE_ACCOUNT_NAME_INVALID = ChatColor.RED + "This account name is invalid."; 46 | @LastUpdated(60002) 47 | public String PLAYER_DISGUISE_ACCOUNT_NAME_BLACKLISTED = ChatColor.RED + "This account name is blacklisted."; 48 | @LastUpdated(60001) 49 | public String DISGUISED_SUCCESSFULLY = ChatColor.GOLD + "Disguised successfully!"; 50 | @LastUpdated(60001) 51 | public String DISGUISE_ERROR = ChatColor.RED + "Something went wrong with the disguise."; 52 | @LastUpdated(60001) 53 | public String DISGUISE_STATEMENT_ERROR = ChatColor.RED + "Something went wrong with the additional statement: %statement%"; 54 | @LastUpdated(60001) 55 | public String DISGUISE_STATEMENT_FORBIDDEN = ChatColor.RED + "This statement is forbidden: %statement%"; 56 | @LastUpdated(60001) 57 | public String DISGUISE_STATEMENT_UNKNOWN = ChatColor.RED + "This statement is unknown or uses invalid syntax: %statement%"; 58 | @LastUpdated(60001) 59 | public String UNDISGUISED_SUCCESSFULLY = ChatColor.GOLD + "Undisguised successfully!"; 60 | @LastUpdated(60001) 61 | public String UNDISGUISE_NOT_DISGUISED = ChatColor.RED + "You are not disguised."; 62 | @LastUpdated(60001) 63 | public String UNDISGUISE_OTHER_NOT_DISGUISED = ChatColor.RED + "%player% is not disguised."; 64 | @LastUpdated(60001) 65 | public String UNDISGUISE_EVENT_CANCELLED = ChatColor.RED + "Another plugin prevents you from undisguising."; 66 | @LastUpdated(60001) 67 | public String UNDISGUISE_OTHER_EVENT_CANCELLED = ChatColor.RED + "Another plugin prevents %player% from undisguising."; 68 | @LastUpdated(60001) 69 | public String ODISGUISE_NO_PLAYERNAME_GIVEN = ChatColor.RED + "Please feed me the name of an online player."; 70 | @LastUpdated(60001) 71 | public String ODISGUISE_PLAYER_NOT_FOUND = ChatColor.RED + "Can't find player: %player%"; 72 | @LastUpdated(60001) 73 | public String ODISGUISE_NOTIFICATION = ChatColor.GOLD + "You were disguised by %sender%."; 74 | @LastUpdated(60001) 75 | public String UNDISGUISE_NOTIFICATION = ChatColor.GOLD + "You were undisguised by %sender%."; 76 | 77 | @LastUpdated(60001) 78 | public String HELP_PAGE_TITLE = ChatColor.DARK_GREEN + "===== " + ChatColor.BOLD + "iDisguise" + ChatColor.RESET + ChatColor.DARK_GREEN + " Help Page %number% ====="; 79 | @LastUpdated(60001) 80 | public String HELP_DISGUISE_MOB = ChatColor.GOLD.toString() + ChatColor.BOLD + "Disguise as a mob: " + ChatColor.ITALIC + "/disguise \\\\" 81 | + ChatColor.GOLD + "Example: " + ChatColor.ITALIC + "/disguise zombie\\\\" 82 | + ChatColor.GOLD + "Use [TAB] to get a list of all entity types.\\\\" 83 | + ChatColor.GOLD + "After disguising, you will be able to see your own disguise\\\\" 84 | + ChatColor.GOLD + "for five seconds."; 85 | @LastUpdated(60001) 86 | public String HELP_DISGUISE_PLAYER = ChatColor.GOLD.toString() + ChatColor.BOLD + "Disguise as a player: " + ChatColor.ITALIC + "/disguise player \\\\" 87 | + ChatColor.GOLD + "Example: " + ChatColor.ITALIC + "/disguise player Notch\\\\" 88 | + ChatColor.GOLD + "You can always see your own player disguise."; 89 | @LastUpdated(60001) 90 | public String HELP_DISGUISE_CHECK = ChatColor.GOLD.toString() + ChatColor.BOLD + "Check your disguise: " + ChatColor.ITALIC + "/disguise\\\\" 91 | + ChatColor.GOLD + "You will be able to see your own disguise for another five\\\\" 92 | + ChatColor.GOLD + "seconds."; 93 | @LastUpdated(60001) 94 | public String HELP_UNDISGUISE = ChatColor.GOLD.toString() + ChatColor.BOLD + "Undisguise: " + ChatColor.ITALIC + "/undisguise"; 95 | @LastUpdated(60001) 96 | public String HELP_DISGUISE_ALTER = ChatColor.GOLD.toString() + ChatColor.BOLD + "Alter your disguise: " + ChatColor.ITALIC + "/disguise ...\\\\" 97 | + ChatColor.GOLD + "Example: " + ChatColor.ITALIC + "/disguise horse setColor(WHITE) setBaby()\\\\" 98 | + ChatColor.GOLD + "Use [TAB] after entering the entity type to get a list of all\\\\" 99 | + ChatColor.GOLD + "possible statements."; 100 | @LastUpdated(60001) 101 | public String HELP_INGAME_HELP = ChatColor.GOLD.toString() + ChatColor.BOLD + "In-game help: " + ChatColor.ITALIC + "/disguise ? [page]"; 102 | @LastUpdated(60001) 103 | public String HELP_DISGUISE_PERMISSION = ChatColor.GOLD + "By default, only server operators can use the commands.\\\\" 104 | + ChatColor.GOLD + "If you enable " + ChatColor.ITALIC + "commands.use-permission-nodes" + ChatColor.RESET + ChatColor.GOLD + " in the\\\\" 105 | + ChatColor.GOLD + ChatColor.ITALIC + "config.yml" + ChatColor.RESET + ChatColor.GOLD + ", disguising requires the permission node\\\\" 106 | + ChatColor.GOLD + ChatColor.BOLD + "iDisguise.disguise.\\\\" 107 | + ChatColor.GOLD + "(e.g., " + ChatColor.ITALIC + "iDisguise.disguise.SNOW_GOLEM" + ChatColor.RESET + ChatColor.GOLD + " for the snow golem)\\\\" 108 | + ChatColor.GOLD + "or the wildcard " + ChatColor.BOLD + "iDisguise.disguise.*"; 109 | @LastUpdated(60001) 110 | public String HELP_ODISGUISE = ChatColor.GOLD.toString() + ChatColor.BOLD + "Disguise another player: " + ChatColor.ITALIC + "/odisguise \\\\" 111 | + ChatColor.GOLD + ChatColor.BOLD + ChatColor.ITALIC + ""; 112 | @LastUpdated(60001) 113 | public String HELP_UNDISGUISE_OTHER = ChatColor.GOLD.toString() + ChatColor.BOLD + "Undisguise another player: " + ChatColor.ITALIC + "/undisguise "; 114 | @LastUpdated(60001) 115 | public String HELP_ODISGUISE_INFO = ChatColor.GOLD + "Player disguise and statements work as well."; 116 | @LastUpdated(60001) 117 | public String HELP_INGAME_HELP_2 = ChatColor.GOLD.toString() + ChatColor.BOLD + "In-game help: " + ChatColor.ITALIC + "/odisguise ? [page]"; 118 | @LastUpdated(60001) 119 | public String HELP_ODISGUISE_PERMISSION = ChatColor.GOLD + "By default, only server operators can use these commands.\\\\" 120 | + ChatColor.GOLD + "If you enable " + ChatColor.ITALIC + "commands.use-permission-nodes" + ChatColor.RESET + ChatColor.GOLD + " in the\\\\" 121 | + ChatColor.GOLD + ChatColor.ITALIC + "config.yml" + ChatColor.RESET + ChatColor.GOLD + ", these commands require the permission node\\\\" 122 | + ChatColor.GOLD + ChatColor.BOLD + "iDisguise.others" + ChatColor.RESET + ChatColor.GOLD + " AND the respective disguise-specific\\\\" 123 | + ChatColor.GOLD + "permission node."; 124 | 125 | @LastUpdated(60001) 126 | public String UPDATE_AVAILABLE = ChatColor.GOLD + "[iDisguise] An update is available: %version%"; 127 | @LastUpdated(60001) 128 | public String UPDATE_ALREADY_DOWNLOADED = ChatColor.GOLD + "[iDisguise] Update already downloaded. Restart the server to apply."; 129 | @LastUpdated(60001) 130 | public String UPDATE_DOWNLOADING = ChatColor.GOLD + "[iDisguise] Downloading update..."; 131 | @LastUpdated(60001) 132 | public String UPDATE_DOWNLOAD_SUCCEEDED = ChatColor.GOLD + "[iDisguise] Download succeeded. Restart the server to apply."; 133 | @LastUpdated(60001) 134 | public String UPDATE_DOWNLOAD_FAILED = ChatColor.RED + "[iDisguise] Download failed."; 135 | @LastUpdated(60001) 136 | public String UPDATE_OPTION = ChatColor.GOLD + "[iDisguise] You can enable automatic updates in the config file."; 137 | 138 | private iDisguise plugin; 139 | 140 | public Language(iDisguise plugin) { 141 | this.plugin = plugin; 142 | } 143 | 144 | public void loadData() { 145 | File languageFile = new File(plugin.getDataFolder(), "language.yml"); 146 | FileConfiguration fileConfiguration = YamlConfiguration.loadConfiguration(languageFile); 147 | try { 148 | int fileVersion = UpdateCheck.extractVersionNumber(fileConfiguration.getString("version", plugin.getNameAndVersion())); 149 | for(Field field : getClass().getDeclaredFields()) { 150 | if(field.getType().equals(String.class)) { 151 | if(field.isAnnotationPresent(LastUpdated.class) && field.getAnnotation(LastUpdated.class).value() > fileVersion) continue; 152 | 153 | if(fileConfiguration.isString(field.getName().toLowerCase(Locale.ENGLISH).replace('_', '-'))) { 154 | field.set(this, fileConfiguration.getString(field.getName().toLowerCase(Locale.ENGLISH).replace('_', '-'))); 155 | } 156 | } 157 | } 158 | } catch(Exception e) { 159 | plugin.getLogger().log(Level.SEVERE, "An error occured while loading the language file.", e); 160 | } 161 | } 162 | 163 | public void saveData() { 164 | File languageFile = new File(plugin.getDataFolder(), "language.yml"); 165 | FileConfiguration fileConfiguration = new YamlConfiguration(); 166 | try { 167 | for(Field field : getClass().getDeclaredFields()) { 168 | if(field.getType().equals(String.class)) { 169 | fileConfiguration.set(field.getName().toLowerCase(Locale.ENGLISH).replace('_', '-'), field.get(this)); 170 | } 171 | } 172 | fileConfiguration.set("version", plugin.getNameAndVersion()); 173 | fileConfiguration.save(languageFile); 174 | } catch(Exception e) { 175 | plugin.getLogger().log(Level.SEVERE, "An error occured while saving the language file.", e); 176 | } 177 | } 178 | 179 | @Retention(RetentionPolicy.RUNTIME) 180 | private @interface LastUpdated { 181 | int value(); 182 | } 183 | 184 | } 185 | --------------------------------------------------------------------------------