Initial work
This commit is contained in:
		
							
								
								
									
										13
									
								
								.idea/libraries/Maven__cglib_cglib_nodep_2_2_2.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								.idea/libraries/Maven__cglib_cglib_nodep_2_2_2.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | <component name="libraryTable"> | ||||||
|  |   <library name="Maven: cglib:cglib-nodep:2.2.2"> | ||||||
|  |     <CLASSES> | ||||||
|  |       <root url="jar://$MAVEN_REPOSITORY$/cglib/cglib-nodep/2.2.2/cglib-nodep-2.2.2.jar!/" /> | ||||||
|  |     </CLASSES> | ||||||
|  |     <JAVADOC> | ||||||
|  |       <root url="jar://$MAVEN_REPOSITORY$/cglib/cglib-nodep/2.2.2/cglib-nodep-2.2.2-javadoc.jar!/" /> | ||||||
|  |     </JAVADOC> | ||||||
|  |     <SOURCES> | ||||||
|  |       <root url="jar://$MAVEN_REPOSITORY$/cglib/cglib-nodep/2.2.2/cglib-nodep-2.2.2-sources.jar!/" /> | ||||||
|  |     </SOURCES> | ||||||
|  |   </library> | ||||||
|  | </component> | ||||||
							
								
								
									
										13
									
								
								.idea/libraries/Maven__com_comphenix_executors_BukkitExecutors_1_1_SNAPSHOT.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								.idea/libraries/Maven__com_comphenix_executors_BukkitExecutors_1_1_SNAPSHOT.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | <component name="libraryTable"> | ||||||
|  |   <library name="Maven: com.comphenix.executors:BukkitExecutors:1.1-SNAPSHOT"> | ||||||
|  |     <CLASSES> | ||||||
|  |       <root url="jar://$MAVEN_REPOSITORY$/com/comphenix/executors/BukkitExecutors/1.1-SNAPSHOT/BukkitExecutors-1.1-20170429.151522-2.jar!/" /> | ||||||
|  |     </CLASSES> | ||||||
|  |     <JAVADOC> | ||||||
|  |       <root url="jar://$MAVEN_REPOSITORY$/com/comphenix/executors/BukkitExecutors/1.1-SNAPSHOT/BukkitExecutors-1.1-20170429.151522-2-javadoc.jar!/" /> | ||||||
|  |     </JAVADOC> | ||||||
|  |     <SOURCES> | ||||||
|  |       <root url="jar://$MAVEN_REPOSITORY$/com/comphenix/executors/BukkitExecutors/1.1-SNAPSHOT/BukkitExecutors-1.1-20170429.151522-2-sources.jar!/" /> | ||||||
|  |     </SOURCES> | ||||||
|  |   </library> | ||||||
|  | </component> | ||||||
							
								
								
									
										13
									
								
								.idea/libraries/Maven__com_comphenix_protocol_ProtocolLib_API_4_2_0_SNAPSHOT.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								.idea/libraries/Maven__com_comphenix_protocol_ProtocolLib_API_4_2_0_SNAPSHOT.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | <component name="libraryTable"> | ||||||
|  |   <library name="Maven: com.comphenix.protocol:ProtocolLib-API:4.2.0-SNAPSHOT"> | ||||||
|  |     <CLASSES> | ||||||
|  |       <root url="jar://$MAVEN_REPOSITORY$/com/comphenix/protocol/ProtocolLib-API/4.2.0-SNAPSHOT/ProtocolLib-API-4.2.0-SNAPSHOT.jar!/" /> | ||||||
|  |     </CLASSES> | ||||||
|  |     <JAVADOC> | ||||||
|  |       <root url="jar://$MAVEN_REPOSITORY$/com/comphenix/protocol/ProtocolLib-API/4.2.0-SNAPSHOT/ProtocolLib-API-4.2.0-SNAPSHOT-javadoc.jar!/" /> | ||||||
|  |     </JAVADOC> | ||||||
|  |     <SOURCES> | ||||||
|  |       <root url="jar://$MAVEN_REPOSITORY$/com/comphenix/protocol/ProtocolLib-API/4.2.0-SNAPSHOT/ProtocolLib-API-4.2.0-SNAPSHOT-sources.jar!/" /> | ||||||
|  |     </SOURCES> | ||||||
|  |   </library> | ||||||
|  | </component> | ||||||
							
								
								
									
										124
									
								
								.idea/uiDesigner.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								.idea/uiDesigner.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <project version="4"> | ||||||
|  |   <component name="Palette2"> | ||||||
|  |     <group name="Swing"> | ||||||
|  |       <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" /> | ||||||
|  |       </item> | ||||||
|  |       <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" /> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" /> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true"> | ||||||
|  |         <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" /> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" /> | ||||||
|  |         <initial-values> | ||||||
|  |           <property name="text" value="Button" /> | ||||||
|  |         </initial-values> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" /> | ||||||
|  |         <initial-values> | ||||||
|  |           <property name="text" value="RadioButton" /> | ||||||
|  |         </initial-values> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" /> | ||||||
|  |         <initial-values> | ||||||
|  |           <property name="text" value="CheckBox" /> | ||||||
|  |         </initial-values> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" /> | ||||||
|  |         <initial-values> | ||||||
|  |           <property name="text" value="Label" /> | ||||||
|  |         </initial-values> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true"> | ||||||
|  |         <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1"> | ||||||
|  |           <preferred-size width="150" height="-1" /> | ||||||
|  |         </default-constraints> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true"> | ||||||
|  |         <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1"> | ||||||
|  |           <preferred-size width="150" height="-1" /> | ||||||
|  |         </default-constraints> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true"> | ||||||
|  |         <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1"> | ||||||
|  |           <preferred-size width="150" height="-1" /> | ||||||
|  |         </default-constraints> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true"> | ||||||
|  |         <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> | ||||||
|  |           <preferred-size width="150" height="50" /> | ||||||
|  |         </default-constraints> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true"> | ||||||
|  |         <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> | ||||||
|  |           <preferred-size width="150" height="50" /> | ||||||
|  |         </default-constraints> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true"> | ||||||
|  |         <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> | ||||||
|  |           <preferred-size width="150" height="50" /> | ||||||
|  |         </default-constraints> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true"> | ||||||
|  |         <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" /> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> | ||||||
|  |           <preferred-size width="150" height="50" /> | ||||||
|  |         </default-constraints> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3"> | ||||||
|  |           <preferred-size width="150" height="50" /> | ||||||
|  |         </default-constraints> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> | ||||||
|  |           <preferred-size width="150" height="50" /> | ||||||
|  |         </default-constraints> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3"> | ||||||
|  |           <preferred-size width="200" height="200" /> | ||||||
|  |         </default-constraints> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3"> | ||||||
|  |           <preferred-size width="200" height="200" /> | ||||||
|  |         </default-constraints> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true"> | ||||||
|  |         <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" /> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" /> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" /> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" /> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1"> | ||||||
|  |           <preferred-size width="-1" height="20" /> | ||||||
|  |         </default-constraints> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" /> | ||||||
|  |       </item> | ||||||
|  |       <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false"> | ||||||
|  |         <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" /> | ||||||
|  |       </item> | ||||||
|  |     </group> | ||||||
|  |   </component> | ||||||
|  | </project> | ||||||
							
								
								
									
										51
									
								
								config.yml
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								config.yml
									
									
									
									
									
								
							| @@ -1,6 +1,47 @@ | |||||||
| # Shall I notify people of a LibsDisguises update? | # Shall I notify people of a LibsDisguises update? | ||||||
| NotifyUpdate: true | NotifyUpdate: true | ||||||
|  |  | ||||||
|  | # The disguise plugin stores all GameProfiles inside a file called 'cache.yml' | ||||||
|  | # This means that the plugin doesn't need to constantly call Mojang just to find a skin for an offline player | ||||||
|  | # However some people may prefer to disable this. | ||||||
|  | # Even if you disable this, if there was disguises in the cache already then it will use them | ||||||
|  | SaveCache: true | ||||||
|  |  | ||||||
|  | # This option is useless if you don't enable SaveCache! | ||||||
|  | # If a player has been disguised before and their skin saved into the cache | ||||||
|  | # When they join the server will automatically update the cache incase they changed their skin | ||||||
|  | UpdatePlayersCache: true | ||||||
|  |  | ||||||
|  | # Should the server save the disguises so that when they are alive again, they are disguised again | ||||||
|  | # Players - Are player disguises saved | ||||||
|  | # Entities - Are entities disguises saved | ||||||
|  | SaveDisguises: | ||||||
|  |     Players: false | ||||||
|  |     Entities: false | ||||||
|  |  | ||||||
|  | # Where does it save the disguises and gameprofiles to | ||||||
|  | SaveData: | ||||||
|  |   # If this is true, then it saves to mysql. If this is false, then it saves to file | ||||||
|  |   # I do not provide help for setting up Mysql or the databases, there are guides online for that | ||||||
|  |   UseMySQL: false | ||||||
|  |   # What is the IP and Port required to connect | ||||||
|  |   IP: 'localhost:3306' | ||||||
|  |   User: 'root' | ||||||
|  |   Password: 'password' | ||||||
|  |   Database: 'LibsDisguises' | ||||||
|  |   # What is the table for GameProfiles called? You shouldn't need to touch this | ||||||
|  |   GameProfiles: 'GameProfileCache' | ||||||
|  |   # What is the table for disguises called? | ||||||
|  |   Disguises: 'DisguisesCache' | ||||||
|  |  | ||||||
|  | # This I don't really recommend turning on as it can make a memory leak.. | ||||||
|  | # These disguises, as normal will not persist after a server restart. | ||||||
|  | # There is also no EntityDeath option as entities do not revive after death. | ||||||
|  | # The EntityDespawn option is when you leave the chunk the entity is and the chunk is unloaded | ||||||
|  | KeepDisguises: | ||||||
|  |     EntityDespawn: false | ||||||
|  |     PlayerDeath: false | ||||||
|  |  | ||||||
| # How should the plugin handle self disguises scoreboards? | # How should the plugin handle self disguises scoreboards? | ||||||
| # MODIFY_SCOREBOARD - Modifies the player's current team if possible, otherwise assigns them to a new scoreboard team | # MODIFY_SCOREBOARD - Modifies the player's current team if possible, otherwise assigns them to a new scoreboard team | ||||||
| # IGNORE_SCOREBOARD - Doesn't touch scoreboards at all, effectively means that if you didn't disable pushing in their scoreboard team; They will still be pushed around | # IGNORE_SCOREBOARD - Doesn't touch scoreboards at all, effectively means that if you didn't disable pushing in their scoreboard team; They will still be pushed around | ||||||
| @@ -68,6 +109,7 @@ NameAboveHeadAlwaysVisible: true | |||||||
| # This WILL conflict with NoCheatPlus. Other plugins may also get problems. | # This WILL conflict with NoCheatPlus. Other plugins may also get problems. | ||||||
| # This shouldn't really be enabled for players as it also interferes with their movement because the server thinks the player is larger than he really is. | # This shouldn't really be enabled for players as it also interferes with their movement because the server thinks the player is larger than he really is. | ||||||
| # That makes the player unable to approach this building because the server thinks he is trying to glitch inside blocks. | # That makes the player unable to approach this building because the server thinks he is trying to glitch inside blocks. | ||||||
|  | # This feature is highly experimental and is garanteed to cause problems for players who are disguised | ||||||
| ModifyBoundingBox: false | ModifyBoundingBox: false | ||||||
|  |  | ||||||
| # This prevents disguised players from being targeted by monsters. | # This prevents disguised players from being targeted by monsters. | ||||||
| @@ -93,15 +135,6 @@ DisguiseCloneExpire: 10 | |||||||
| # Max disguises to store at a time with the DisguiseClone command | # Max disguises to store at a time with the DisguiseClone command | ||||||
| DisguiseCloneSize: 3 | DisguiseCloneSize: 3 | ||||||
|  |  | ||||||
| # This I don't really recommend turning on as it can make a memory leak.. |  | ||||||
| # These disguises, as normal will not persist after a server restart. |  | ||||||
| # There is also no EntityDeath option as entities do not revive after death. |  | ||||||
| # The EntityDespawn option is when you leave the chunk the entity is and the chunk is unloaded |  | ||||||
| KeepDisguises: |  | ||||||
|     EntityDespawn: false |  | ||||||
|     PlayerDeath: false |  | ||||||
|     PlayerLogout: false |  | ||||||
|  |  | ||||||
| # This controls if a entitys max health is determined by the entity, or by the disguise. | # This controls if a entitys max health is determined by the entity, or by the disguise. | ||||||
| # Wither is 200, a player is 20. With this enabled, a player disguised as a wither will have the boss bar health accurate to the players health. | # Wither is 200, a player is 20. With this enabled, a player disguised as a wither will have the boss bar health accurate to the players health. | ||||||
| # Else it will be 1/20 of the boss bar when he is full health. | # Else it will be 1/20 of the boss bar when he is full health. | ||||||
|   | |||||||
| @@ -58,6 +58,36 @@ public class DisguiseConfig { | |||||||
|     private static boolean viewSelfDisguise; |     private static boolean viewSelfDisguise; | ||||||
|     private static boolean witherSkullEnabled; |     private static boolean witherSkullEnabled; | ||||||
|     private static DisguisePushing disablePushing = DisguisePushing.MODIFY_SCOREBOARD; |     private static DisguisePushing disablePushing = DisguisePushing.MODIFY_SCOREBOARD; | ||||||
|  |     private static boolean saveCache; | ||||||
|  |     private static boolean updatePlayerCache; | ||||||
|  |     private static boolean savePlayerDisguises; | ||||||
|  |     private static boolean saveEntityDisguises; | ||||||
|  |     private static boolean useSQL; | ||||||
|  |     private static String ip, database, user, pass, disguiseTable, profileTable; | ||||||
|  |  | ||||||
|  |     public static String getDatabaseIP() { | ||||||
|  |         return ip; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static String getDatabase() { | ||||||
|  |         return database; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static String getDatabaseUser() { | ||||||
|  |         return user; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static String getDatabasePass() { | ||||||
|  |         return pass; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static String getDatabaseProfileTable() { | ||||||
|  |         return disguiseTable; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static String getDatabaseDisguiseTable() { | ||||||
|  |         return profileTable; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public static Entry<String, Disguise> getCustomDisguise(String disguise) { |     public static Entry<String, Disguise> getCustomDisguise(String disguise) { | ||||||
|         for (Entry<String, Disguise> entry : customDisguises.entrySet()) { |         for (Entry<String, Disguise> entry : customDisguises.entrySet()) { | ||||||
| @@ -71,6 +101,22 @@ public class DisguiseConfig { | |||||||
|         return null; |         return null; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public static boolean isSavePlayerDisguises() { | ||||||
|  |         return savePlayerDisguises; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static boolean isSaveEntityDisguises() { | ||||||
|  |         return saveEntityDisguises; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static void setSavePlayerDisguises(boolean saveDisguises) { | ||||||
|  |         savePlayerDisguises = saveDisguises; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static void setSaveEntityDisguises(boolean saveDisguises) { | ||||||
|  |         saveEntityDisguises = saveDisguises; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public static DisguisePushing getPushingOption() { |     public static DisguisePushing getPushingOption() { | ||||||
|         return disablePushing; |         return disablePushing; | ||||||
|     } |     } | ||||||
| @@ -103,6 +149,22 @@ public class DisguiseConfig { | |||||||
|         return updateNotificationPermission; |         return updateNotificationPermission; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public static boolean isSaveCache() { | ||||||
|  |         return saveCache; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static void setSaveCache(boolean doCache) { | ||||||
|  |         saveCache = doCache; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static boolean isUpdatePlayerCache() { | ||||||
|  |         return updatePlayerCache; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static void setUpdatePlayerCache(boolean setUpdatePlayerCache) { | ||||||
|  |         updatePlayerCache = setUpdatePlayerCache; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public static void initConfig(ConfigurationSection config) { |     public static void initConfig(ConfigurationSection config) { | ||||||
|         setSoundsEnabled(config.getBoolean("DisguiseSounds")); |         setSoundsEnabled(config.getBoolean("DisguiseSounds")); | ||||||
|         setVelocitySent(config.getBoolean("SendVelocity")); |         setVelocitySent(config.getBoolean("SendVelocity")); | ||||||
| @@ -144,6 +206,15 @@ public class DisguiseConfig { | |||||||
|         setHideDisguisedPlayers(config.getBoolean("HideDisguisedPlayersFromTab")); |         setHideDisguisedPlayers(config.getBoolean("HideDisguisedPlayersFromTab")); | ||||||
|         setShowDisguisedPlayersInTab(config.getBoolean("ShowPlayerDisguisesInTab")); |         setShowDisguisedPlayersInTab(config.getBoolean("ShowPlayerDisguisesInTab")); | ||||||
|         setDisabledInvisibility(config.getBoolean("DisableInvisibility")); |         setDisabledInvisibility(config.getBoolean("DisableInvisibility")); | ||||||
|  |         setSaveCache(config.getBoolean("SaveCache")); | ||||||
|  |         setUpdatePlayerCache(config.getBoolean("UpdatePlayerCache")); | ||||||
|  |         setSaveEntityDisguises(config.getBoolean("SaveDisguises.Entities")); | ||||||
|  |         setSavePlayerDisguises(config.getBoolean("SaveDisguises.Players")); | ||||||
|  |         useSQL = config.getBoolean("SaveData.UseMySQL", false); | ||||||
|  |         ip = config.getString("SaveData.IP", "localhost:3306"); | ||||||
|  |         user = config.getString("SaveData.User", "root"); | ||||||
|  |         pass = config.getString("SaveData.Password", "password"); | ||||||
|  |         database | ||||||
|  |  | ||||||
|         try { |         try { | ||||||
|             String option = config.getString("SelfDisguisesScoreboard", |             String option = config.getString("SelfDisguisesScoreboard", | ||||||
| @@ -193,7 +264,8 @@ public class DisguiseConfig { | |||||||
|             } |             } | ||||||
|             catch (DisguiseParseException e) { |             catch (DisguiseParseException e) { | ||||||
|                 System.err.println( |                 System.err.println( | ||||||
|                         "[LibsDisguises] Error while loading custom disguise '" + key + "'" + (e.getMessage() == null ? "" : ": " + e.getMessage())); |                         "[LibsDisguises] Error while loading custom disguise '" + key + "'" + (e.getMessage() == null ? | ||||||
|  |                                 "" : ": " + e.getMessage())); | ||||||
|  |  | ||||||
|                 if (e.getMessage() == null) |                 if (e.getMessage() == null) | ||||||
|                     e.printStackTrace(); |                     e.printStackTrace(); | ||||||
| @@ -204,7 +276,8 @@ public class DisguiseConfig { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         System.out.println( |         System.out.println( | ||||||
|                 "[LibsDisguises] Loaded " + customDisguises.size() + " custom disguise" + (customDisguises.size() == 1 ? "" : "s")); |                 "[LibsDisguises] Loaded " + customDisguises.size() + " custom disguise" + (customDisguises.size() == 1 ? | ||||||
|  |                         "" : "s")); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static boolean isAnimationPacketsEnabled() { |     public static boolean isAnimationPacketsEnabled() { | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ import java.util.Arrays; | |||||||
| import java.util.HashMap; | import java.util.HashMap; | ||||||
| import java.util.HashSet; | import java.util.HashSet; | ||||||
|  |  | ||||||
|  | import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||||
| import org.bukkit.Bukkit; | import org.bukkit.Bukkit; | ||||||
| import org.bukkit.ChatColor; | import org.bukkit.ChatColor; | ||||||
| import org.bukkit.Location; | import org.bukkit.Location; | ||||||
| @@ -26,6 +27,8 @@ import org.bukkit.event.player.PlayerRespawnEvent; | |||||||
| import org.bukkit.event.player.PlayerTeleportEvent; | import org.bukkit.event.player.PlayerTeleportEvent; | ||||||
| import org.bukkit.event.vehicle.VehicleEnterEvent; | import org.bukkit.event.vehicle.VehicleEnterEvent; | ||||||
| import org.bukkit.event.vehicle.VehicleExitEvent; | import org.bukkit.event.vehicle.VehicleExitEvent; | ||||||
|  | import org.bukkit.event.world.ChunkLoadEvent; | ||||||
|  | import org.bukkit.event.world.ChunkUnloadEvent; | ||||||
| import org.bukkit.scheduler.BukkitRunnable; | import org.bukkit.scheduler.BukkitRunnable; | ||||||
| import org.bukkit.scheduler.BukkitTask; | import org.bukkit.scheduler.BukkitTask; | ||||||
|  |  | ||||||
| @@ -89,14 +92,15 @@ public class DisguiseListener implements Listener { | |||||||
|                                         continue; |                                         continue; | ||||||
|                                     } |                                     } | ||||||
|  |  | ||||||
|                                     p.sendMessage( |                                     p.sendMessage(String.format(DisguiseConfig.getUpdateMessage(), currentVersion, | ||||||
|                                             String.format(DisguiseConfig.getUpdateMessage(), currentVersion, latestVersion)); |                                             latestVersion)); | ||||||
|                                 } |                                 } | ||||||
|                             } |                             } | ||||||
|                         }); |                         }); | ||||||
|                     } |                     } | ||||||
|                     catch (Exception ex) { |                     catch (Exception ex) { | ||||||
|                         System.out.print(String.format("[LibsDisguises] Failed to check for update: %s", ex.getMessage())); |                         System.out.print( | ||||||
|  |                                 String.format("[LibsDisguises] Failed to check for update: %s", ex.getMessage())); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             }, 0, (20 * 60 * 60 * 6)); // Check every 6 hours |             }, 0, (20 * 60 * 60 * 6)); // Check every 6 hours | ||||||
| @@ -189,6 +193,39 @@ public class DisguiseListener implements Listener { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @EventHandler | ||||||
|  |     public void onChunkUnload(ChunkUnloadEvent event) { | ||||||
|  |         if (!DisguiseConfig.isSaveEntityDisguises()) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|  |         for (Entity entity : event.getChunk().getEntities()) { | ||||||
|  |             Disguise[] disguises = DisguiseAPI.getDisguises(entity); | ||||||
|  |  | ||||||
|  |             if (disguises.length <= 0) | ||||||
|  |                 continue; | ||||||
|  |  | ||||||
|  |             DisguiseUtilities.saveDisguises(entity.getUniqueId(), disguises); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @EventHandler | ||||||
|  |     public void onChunkLoad(ChunkLoadEvent event) { | ||||||
|  |         if (!DisguiseConfig.isSaveEntityDisguises()) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|  |         for (Entity entity : event.getChunk().getEntities()) { | ||||||
|  |             Disguise[] disguises = DisguiseUtilities.getSavedDisguises(entity.getUniqueId()); | ||||||
|  |  | ||||||
|  |             if (disguises.length <= 0) | ||||||
|  |                 continue; | ||||||
|  |  | ||||||
|  |             for (Disguise disguise : disguises) { | ||||||
|  |                 disguise.setEntity(entity); | ||||||
|  |                 disguise.startDisguise(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @EventHandler |     @EventHandler | ||||||
|     public void onJoin(PlayerJoinEvent event) { |     public void onJoin(PlayerJoinEvent event) { | ||||||
|         Player p = event.getPlayer(); |         Player p = event.getPlayer(); | ||||||
| @@ -201,6 +238,24 @@ public class DisguiseListener implements Listener { | |||||||
|             chunkMove(p, p.getLocation(), null); |             chunkMove(p, p.getLocation(), null); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         if (DisguiseConfig.isSaveCache() && DisguiseConfig.isUpdatePlayerCache() && DisguiseUtilities.hasCacheEntry( | ||||||
|  |                 p.getName())) { | ||||||
|  |             WrappedGameProfile profile = WrappedGameProfile.fromPlayer(p); | ||||||
|  |  | ||||||
|  |             if (!profile.getProperties().isEmpty()) { | ||||||
|  |                 DisguiseUtilities.addGameProfile(p.getName(), profile); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (DisguiseConfig.isSavePlayerDisguises()) { | ||||||
|  |             Disguise[] disguises = DisguiseUtilities.getSavedDisguises(p.getUniqueId()); | ||||||
|  |  | ||||||
|  |             for (Disguise disguise : disguises) { | ||||||
|  |                 disguise.setEntity(p); | ||||||
|  |                 disguise.startDisguise(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         for (HashSet<TargetedDisguise> disguiseList : DisguiseUtilities.getDisguises().values()) { |         for (HashSet<TargetedDisguise> disguiseList : DisguiseUtilities.getDisguises().values()) { | ||||||
|             for (TargetedDisguise targetedDisguise : disguiseList) { |             for (TargetedDisguise targetedDisguise : disguiseList) { | ||||||
|                 if (targetedDisguise.getEntity() == null) |                 if (targetedDisguise.getEntity() == null) | ||||||
| @@ -239,8 +294,9 @@ public class DisguiseListener implements Listener { | |||||||
|                         PacketContainer addTab = new PacketContainer(PacketType.Play.Server.PLAYER_INFO); |                         PacketContainer addTab = new PacketContainer(PacketType.Play.Server.PLAYER_INFO); | ||||||
|  |  | ||||||
|                         addTab.getPlayerInfoAction().write(0, PlayerInfoAction.ADD_PLAYER); |                         addTab.getPlayerInfoAction().write(0, PlayerInfoAction.ADD_PLAYER); | ||||||
|                         addTab.getPlayerInfoDataLists().write(0, Arrays.asList(new PlayerInfoData(disguise.getGameProfile(), 0, |                         addTab.getPlayerInfoDataLists().write(0, Arrays.asList( | ||||||
|                                 NativeGameMode.SURVIVAL, WrappedChatComponent.fromText(disguise.getGameProfile().getName())))); |                                 new PlayerInfoData(disguise.getGameProfile(), 0, NativeGameMode.SURVIVAL, | ||||||
|  |                                         WrappedChatComponent.fromText(disguise.getGameProfile().getName())))); | ||||||
|  |  | ||||||
|                         ProtocolLibrary.getProtocolManager().sendServerPacket(p, addTab); |                         ProtocolLibrary.getProtocolManager().sendServerPacket(p, addTab); | ||||||
|                     } |                     } | ||||||
| @@ -261,8 +317,9 @@ public class DisguiseListener implements Listener { | |||||||
|             Location to = event.getTo(); |             Location to = event.getTo(); | ||||||
|             Location from = event.getFrom(); |             Location from = event.getFrom(); | ||||||
|  |  | ||||||
|             if (DisguiseUtilities.getChunkCord(to.getBlockX()) != DisguiseUtilities.getChunkCord(from.getBlockX()) |             if (DisguiseUtilities.getChunkCord(to.getBlockX()) != DisguiseUtilities.getChunkCord( | ||||||
|                     || DisguiseUtilities.getChunkCord(to.getBlockZ()) != DisguiseUtilities.getChunkCord(from.getBlockZ())) { |                     from.getBlockX()) || DisguiseUtilities.getChunkCord( | ||||||
|  |                     to.getBlockZ()) != DisguiseUtilities.getChunkCord(from.getBlockZ())) { | ||||||
|                 chunkMove(event.getPlayer(), to, from); |                 chunkMove(event.getPlayer(), to, from); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -286,7 +343,17 @@ public class DisguiseListener implements Listener { | |||||||
|  |  | ||||||
|     @EventHandler |     @EventHandler | ||||||
|     public void onQuit(PlayerQuitEvent event) { |     public void onQuit(PlayerQuitEvent event) { | ||||||
|         ReflectionManager.removePlayer(event.getPlayer()); |         if (!DisguiseConfig.isSavePlayerDisguises()) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|  |         Player player = event.getPlayer(); | ||||||
|  |  | ||||||
|  |         Disguise[] disguises = DisguiseAPI.getDisguises(player); | ||||||
|  |  | ||||||
|  |         if (disguises.length <= 0) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|  |         DisguiseUtilities.saveDisguises(player.getUniqueId(), disguises); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @EventHandler |     @EventHandler | ||||||
| @@ -315,7 +382,8 @@ public class DisguiseListener implements Listener { | |||||||
|  |  | ||||||
|     @EventHandler |     @EventHandler | ||||||
|     public void onRightClick(PlayerInteractEntityEvent event) { |     public void onRightClick(PlayerInteractEntityEvent event) { | ||||||
|         if (!disguiseEntity.containsKey(event.getPlayer().getName()) && !disguiseClone.containsKey(event.getPlayer().getName())) { |         if (!disguiseEntity.containsKey(event.getPlayer().getName()) && !disguiseClone.containsKey( | ||||||
|  |                 event.getPlayer().getName())) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -329,8 +397,7 @@ public class DisguiseListener implements Listener { | |||||||
|  |  | ||||||
|         if (entity instanceof Player && !disguiseClone.containsKey(p.getName())) { |         if (entity instanceof Player && !disguiseClone.containsKey(p.getName())) { | ||||||
|             entityName = entity.getName(); |             entityName = entity.getName(); | ||||||
|         } |         } else { | ||||||
|         else { |  | ||||||
|             entityName = DisguiseType.getType(entity).toReadable(); |             entityName = DisguiseType.getType(entity).toReadable(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -338,17 +405,14 @@ public class DisguiseListener implements Listener { | |||||||
|             Boolean[] options = disguiseClone.remove(p.getName()); |             Boolean[] options = disguiseClone.remove(p.getName()); | ||||||
|  |  | ||||||
|             DisguiseUtilities.createClonedDisguise(p, entity, options); |             DisguiseUtilities.createClonedDisguise(p, entity, options); | ||||||
|         } |         } else if (disguiseEntity.containsKey(p.getName())) { | ||||||
|         else if (disguiseEntity.containsKey(p.getName())) { |  | ||||||
|             Disguise disguise = disguiseEntity.remove(p.getName()); |             Disguise disguise = disguiseEntity.remove(p.getName()); | ||||||
|  |  | ||||||
|             if (disguise != null) { |             if (disguise != null) { | ||||||
|                 if (disguise.isMiscDisguise() && !DisguiseConfig.isMiscDisguisesForLivingEnabled() |                 if (disguise.isMiscDisguise() && !DisguiseConfig.isMiscDisguisesForLivingEnabled() && entity instanceof LivingEntity) { | ||||||
|                         && entity instanceof LivingEntity) { |                     p.sendMessage( | ||||||
|                     p.sendMessage(ChatColor.RED |                             ChatColor.RED + "Can't disguise a living entity as a misc disguise. This has been disabled in the config!"); | ||||||
|                             + "Can't disguise a living entity as a misc disguise. This has been disabled in the config!"); |                 } else { | ||||||
|                 } |  | ||||||
|                 else { |  | ||||||
|                     if (entity instanceof Player && DisguiseConfig.isNameOfPlayerShownAboveDisguise()) { |                     if (entity instanceof Player && DisguiseConfig.isNameOfPlayerShownAboveDisguise()) { | ||||||
|                         if (disguise.getWatcher() instanceof LivingWatcher) { |                         if (disguise.getWatcher() instanceof LivingWatcher) { | ||||||
|                             disguise.getWatcher().setCustomName(((Player) entity).getDisplayName()); |                             disguise.getWatcher().setCustomName(((Player) entity).getDisplayName()); | ||||||
| @@ -365,33 +429,30 @@ public class DisguiseListener implements Listener { | |||||||
|  |  | ||||||
|                     if (disguise instanceof PlayerDisguise) { |                     if (disguise instanceof PlayerDisguise) { | ||||||
|                         disguiseName = "the player " + ((PlayerDisguise) disguise).getName(); |                         disguiseName = "the player " + ((PlayerDisguise) disguise).getName(); | ||||||
|                     } |                     } else { | ||||||
|                     else { |  | ||||||
|                         disguiseName += disguise.getType().toReadable(); |                         disguiseName += disguise.getType().toReadable(); | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|                     if (disguise.isDisguiseInUse()) { |                     if (disguise.isDisguiseInUse()) { | ||||||
|                         p.sendMessage(ChatColor.RED + "Disguised " + (entity instanceof Player ? "" : "the ") + entityName |                         p.sendMessage(ChatColor.RED + "Disguised " + (entity instanceof Player ? "" : | ||||||
|                                 + " as " + disguiseName + "!"); |                                 "the ") + entityName + " as " + disguiseName + "!"); | ||||||
|                     } |                     } else { | ||||||
|                     else { |                         p.sendMessage(ChatColor.RED + "Failed to disguise " + (entity instanceof Player ? "" : | ||||||
|                         p.sendMessage(ChatColor.RED + "Failed to disguise " + (entity instanceof Player ? "" : "the ") |                                 "the ") + entityName + " as " + disguiseName + "!"); | ||||||
|                                 + entityName + " as " + disguiseName + "!"); |  | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } else { | ||||||
|             else { |  | ||||||
|                 if (DisguiseAPI.isDisguised(entity)) { |                 if (DisguiseAPI.isDisguised(entity)) { | ||||||
|                     DisguiseAPI.undisguiseToAll(entity); |                     DisguiseAPI.undisguiseToAll(entity); | ||||||
|  |  | ||||||
|                     p.sendMessage(ChatColor.RED + "Undisguised " + (entity instanceof Player ? "" : "the ") + entityName); |                     p.sendMessage( | ||||||
|                 } |                             ChatColor.RED + "Undisguised " + (entity instanceof Player ? "" : "the ") + entityName); | ||||||
|                 else { |                 } else { | ||||||
|                     p.sendMessage(ChatColor.RED + (entity instanceof Player ? "" : "the") + entityName + " isn't disguised!"); |                     p.sendMessage( | ||||||
|  |                             ChatColor.RED + (entity instanceof Player ? "" : "the") + entityName + " isn't disguised!"); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } else if (disguiseModify.containsKey(p.getName())) { | ||||||
|         else if (disguiseModify.containsKey(p.getName())) { |  | ||||||
|             String[] options = disguiseModify.remove(p.getName()); |             String[] options = disguiseModify.remove(p.getName()); | ||||||
|  |  | ||||||
|             Disguise disguise = DisguiseAPI.getDisguise(p, entity); |             Disguise disguise = DisguiseAPI.getDisguise(p, entity); | ||||||
| @@ -410,8 +471,8 @@ public class DisguiseListener implements Listener { | |||||||
|             } |             } | ||||||
|  |  | ||||||
|             try { |             try { | ||||||
|                 DisguiseParser.callMethods(p, disguise, perms.get(new DisguisePerm(disguise.getType())), new ArrayList<String>(), |                 DisguiseParser.callMethods(p, disguise, perms.get(new DisguisePerm(disguise.getType())), | ||||||
|                         options); |                         new ArrayList<String>(), options); | ||||||
|                 p.sendMessage(ChatColor.RED + "Modified the disguise!"); |                 p.sendMessage(ChatColor.RED + "Modified the disguise!"); | ||||||
|             } |             } | ||||||
|             catch (DisguiseParseException ex) { |             catch (DisguiseParseException ex) { | ||||||
| @@ -427,17 +488,17 @@ public class DisguiseListener implements Listener { | |||||||
|  |  | ||||||
|     @EventHandler |     @EventHandler | ||||||
|     public void onTarget(EntityTargetEvent event) { |     public void onTarget(EntityTargetEvent event) { | ||||||
|         if (DisguiseConfig.isMonstersIgnoreDisguises() && event.getTarget() != null && event.getTarget() instanceof Player |         if (DisguiseConfig.isMonstersIgnoreDisguises() && event.getTarget() != null && event.getTarget() instanceof Player && DisguiseAPI.isDisguised( | ||||||
|                 && DisguiseAPI.isDisguised(event.getTarget())) { |                 event.getTarget())) { | ||||||
|             switch (event.getReason()) { |             switch (event.getReason()) { | ||||||
|             case TARGET_ATTACKED_ENTITY: |                 case TARGET_ATTACKED_ENTITY: | ||||||
|             case TARGET_ATTACKED_OWNER: |                 case TARGET_ATTACKED_OWNER: | ||||||
|             case OWNER_ATTACKED_TARGET: |                 case OWNER_ATTACKED_TARGET: | ||||||
|             case CUSTOM: |                 case CUSTOM: | ||||||
|                 break; |                     break; | ||||||
|             default: |                 default: | ||||||
|                 event.setCancelled(true); |                     event.setCancelled(true); | ||||||
|                 break; |                     break; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -449,8 +510,9 @@ public class DisguiseListener implements Listener { | |||||||
|         Location from = event.getFrom(); |         Location from = event.getFrom(); | ||||||
|  |  | ||||||
|         if (DisguiseConfig.isBedPacketsEnabled()) { |         if (DisguiseConfig.isBedPacketsEnabled()) { | ||||||
|             if (DisguiseUtilities.getChunkCord(to.getBlockX()) != DisguiseUtilities.getChunkCord(from.getBlockX()) |             if (DisguiseUtilities.getChunkCord(to.getBlockX()) != DisguiseUtilities.getChunkCord( | ||||||
|                     || DisguiseUtilities.getChunkCord(to.getBlockZ()) != DisguiseUtilities.getChunkCord(from.getBlockZ())) { |                     from.getBlockX()) || DisguiseUtilities.getChunkCord( | ||||||
|  |                     to.getBlockZ()) != DisguiseUtilities.getChunkCord(from.getBlockZ())) { | ||||||
|                 chunkMove(player, null, from); |                 chunkMove(player, null, from); | ||||||
|  |  | ||||||
|                 Bukkit.getScheduler().runTask(plugin, new Runnable() { |                 Bukkit.getScheduler().runTask(plugin, new Runnable() { | ||||||
| @@ -466,8 +528,7 @@ public class DisguiseListener implements Listener { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (DisguiseConfig.isUndisguiseOnWorldChange() && to.getWorld() != null && from.getWorld() != null |         if (DisguiseConfig.isUndisguiseOnWorldChange() && to.getWorld() != null && from.getWorld() != null && to.getWorld() != from.getWorld()) { | ||||||
|                 && to.getWorld() != from.getWorld()) { |  | ||||||
|             for (Disguise disguise : DisguiseAPI.getDisguises(event.getPlayer())) { |             for (Disguise disguise : DisguiseAPI.getDisguises(event.getPlayer())) { | ||||||
|                 disguise.removeDisguise(); |                 disguise.removeDisguise(); | ||||||
|             } |             } | ||||||
| @@ -476,7 +537,8 @@ public class DisguiseListener implements Listener { | |||||||
|  |  | ||||||
|     @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) |     @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) | ||||||
|     public void onVehicleEnter(VehicleEnterEvent event) { |     public void onVehicleEnter(VehicleEnterEvent event) { | ||||||
|         if (event.getEntered() instanceof Player && DisguiseAPI.isDisguised((Player) event.getEntered(), event.getEntered())) { |         if (event.getEntered() instanceof Player && DisguiseAPI.isDisguised((Player) event.getEntered(), | ||||||
|  |                 event.getEntered())) { | ||||||
|             DisguiseUtilities.removeSelfDisguise((Player) event.getEntered()); |             DisguiseUtilities.removeSelfDisguise((Player) event.getEntered()); | ||||||
|  |  | ||||||
|             ((Player) event.getEntered()).updateInventory(); |             ((Player) event.getEntered()).updateInventory(); | ||||||
| @@ -515,8 +577,7 @@ public class DisguiseListener implements Listener { | |||||||
|             for (Disguise disguise : DisguiseAPI.getDisguises(event.getPlayer())) { |             for (Disguise disguise : DisguiseAPI.getDisguises(event.getPlayer())) { | ||||||
|                 disguise.removeDisguise(); |                 disguise.removeDisguise(); | ||||||
|             } |             } | ||||||
|         } |         } else { | ||||||
|         else { |  | ||||||
|             // Stupid hack to fix worldswitch invisibility bug |             // Stupid hack to fix worldswitch invisibility bug | ||||||
|             final boolean viewSelfToggled = DisguiseAPI.isViewSelfToggled(event.getPlayer()); |             final boolean viewSelfToggled = DisguiseAPI.isViewSelfToggled(event.getPlayer()); | ||||||
|  |  | ||||||
| @@ -597,5 +658,4 @@ public class DisguiseListener implements Listener { | |||||||
|         disguiseRunnable.put(player, runnable); |         disguiseRunnable.put(player, runnable); | ||||||
|         disguiseModify.put(player, args); |         disguiseModify.put(player, args); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,22 +1,5 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes; | package me.libraryaddict.disguise.disguisetypes; | ||||||
|  |  | ||||||
| import java.lang.reflect.InvocationTargetException; |  | ||||||
| import java.util.ArrayList; |  | ||||||
| import java.util.Arrays; |  | ||||||
| import java.util.HashMap; |  | ||||||
| import java.util.HashSet; |  | ||||||
| import java.util.Iterator; |  | ||||||
| import java.util.List; |  | ||||||
| import java.util.UUID; |  | ||||||
|  |  | ||||||
| import org.bukkit.Bukkit; |  | ||||||
| import org.bukkit.Location; |  | ||||||
| import org.bukkit.entity.Entity; |  | ||||||
| import org.bukkit.entity.LivingEntity; |  | ||||||
| import org.bukkit.entity.Player; |  | ||||||
| import org.bukkit.scheduler.BukkitTask; |  | ||||||
| import org.bukkit.util.Vector; |  | ||||||
|  |  | ||||||
| import com.comphenix.protocol.PacketType; | import com.comphenix.protocol.PacketType; | ||||||
| import com.comphenix.protocol.PacketType.Play.Server; | import com.comphenix.protocol.PacketType.Play.Server; | ||||||
| import com.comphenix.protocol.ProtocolLibrary; | import com.comphenix.protocol.ProtocolLibrary; | ||||||
| @@ -26,7 +9,6 @@ import com.comphenix.protocol.wrappers.EnumWrappers.NativeGameMode; | |||||||
| import com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction; | import com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction; | ||||||
| import com.comphenix.protocol.wrappers.PlayerInfoData; | import com.comphenix.protocol.wrappers.PlayerInfoData; | ||||||
| import com.comphenix.protocol.wrappers.WrappedChatComponent; | import com.comphenix.protocol.wrappers.WrappedChatComponent; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.DisguiseAPI; | import me.libraryaddict.disguise.DisguiseAPI; | ||||||
| import me.libraryaddict.disguise.DisguiseConfig; | import me.libraryaddict.disguise.DisguiseConfig; | ||||||
| import me.libraryaddict.disguise.LibsDisguises; | import me.libraryaddict.disguise.LibsDisguises; | ||||||
| @@ -39,9 +21,20 @@ import me.libraryaddict.disguise.events.UndisguiseEvent; | |||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
| import me.libraryaddict.disguise.utilities.PacketsManager; | import me.libraryaddict.disguise.utilities.PacketsManager; | ||||||
| import me.libraryaddict.disguise.utilities.ReflectionManager; | import me.libraryaddict.disguise.utilities.ReflectionManager; | ||||||
|  | import org.bukkit.Bukkit; | ||||||
|  | import org.bukkit.Location; | ||||||
|  | import org.bukkit.entity.Entity; | ||||||
|  | import org.bukkit.entity.LivingEntity; | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  | import org.bukkit.scheduler.BukkitTask; | ||||||
|  | import org.bukkit.util.Vector; | ||||||
|  |  | ||||||
| public abstract class Disguise { | import java.io.Serializable; | ||||||
|     private static List<UUID> viewSelf = new ArrayList<>(); | import java.lang.reflect.InvocationTargetException; | ||||||
|  | import java.util.*; | ||||||
|  |  | ||||||
|  | public abstract class Disguise implements Serializable { | ||||||
|  |     private transient static List<UUID> viewSelf = new ArrayList<>(); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Returns the list of people who have /disguiseViewSelf toggled on |      * Returns the list of people who have /disguiseViewSelf toggled on | ||||||
| @@ -52,9 +45,9 @@ public abstract class Disguise { | |||||||
|         return viewSelf; |         return viewSelf; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private boolean disguiseInUse; |     private transient boolean disguiseInUse; | ||||||
|     private DisguiseType disguiseType; |     private DisguiseType disguiseType; | ||||||
|     private Entity entity; |     private transient Entity entity; | ||||||
|     private boolean hearSelfDisguise = DisguiseConfig.isSelfDisguisesSoundsReplaced(); |     private boolean hearSelfDisguise = DisguiseConfig.isSelfDisguisesSoundsReplaced(); | ||||||
|     private boolean hideArmorFromSelf = DisguiseConfig.isHidingArmorFromSelf(); |     private boolean hideArmorFromSelf = DisguiseConfig.isHidingArmorFromSelf(); | ||||||
|     private boolean hideHeldItemFromSelf = DisguiseConfig.isHidingHeldItemFromSelf(); |     private boolean hideHeldItemFromSelf = DisguiseConfig.isHidingHeldItemFromSelf(); | ||||||
| @@ -65,8 +58,8 @@ public abstract class Disguise { | |||||||
|     private boolean playerHiddenFromTab = DisguiseConfig.isHideDisguisedPlayers(); |     private boolean playerHiddenFromTab = DisguiseConfig.isHideDisguisedPlayers(); | ||||||
|     private boolean replaceSounds = DisguiseConfig.isSoundEnabled(); |     private boolean replaceSounds = DisguiseConfig.isSoundEnabled(); | ||||||
|     private boolean showName; |     private boolean showName; | ||||||
|     private BukkitTask task; |     private transient BukkitTask task; | ||||||
|     private Runnable velocityRunnable; |     private transient Runnable velocityRunnable; | ||||||
|     private boolean velocitySent = DisguiseConfig.isVelocitySent(); |     private boolean velocitySent = DisguiseConfig.isVelocitySent(); | ||||||
|     private boolean viewSelfDisguise = DisguiseConfig.isViewDisguises(); |     private boolean viewSelfDisguise = DisguiseConfig.isViewDisguises(); | ||||||
|     private FlagWatcher watcher; |     private FlagWatcher watcher; | ||||||
| @@ -81,13 +74,12 @@ public abstract class Disguise { | |||||||
|     /** |     /** | ||||||
|      * Seems I do this method so I can make cleaner constructors on disguises.. |      * Seems I do this method so I can make cleaner constructors on disguises.. | ||||||
|      * |      * | ||||||
|      * @param newType |      * @param newType The disguise | ||||||
|      *            The disguise |  | ||||||
|      */ |      */ | ||||||
|     protected void createDisguise() { |     protected void createDisguise() { | ||||||
|         if (getType().getEntityType() == null) { |         if (getType().getEntityType() == null) { | ||||||
|             throw new RuntimeException("DisguiseType " + getType() |             throw new RuntimeException( | ||||||
|                     + " was used in a futile attempt to construct a disguise, but this Minecraft version does not have that entity"); |                     "DisguiseType " + getType() + " was used in a futile attempt to construct a disguise, but this Minecraft version does not have that entity"); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // Get if they are a adult now.. |         // Get if they are a adult now.. | ||||||
| @@ -106,14 +98,15 @@ public abstract class Disguise { | |||||||
|             catch (Exception e) { |             catch (Exception e) { | ||||||
|                 e.printStackTrace(); |                 e.printStackTrace(); | ||||||
|             } |             } | ||||||
|  |         } else { | ||||||
|  |             getWatcher().setDisguise((TargetedDisguise) this); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // Set the disguise if its a baby or not |         // Set the disguise if its a baby or not | ||||||
|         if (!isAdult) { |         if (!isAdult) { | ||||||
|             if (getWatcher() instanceof AgeableWatcher) { |             if (getWatcher() instanceof AgeableWatcher) { | ||||||
|                 ((AgeableWatcher) getWatcher()).setBaby(true); |                 ((AgeableWatcher) getWatcher()).setBaby(true); | ||||||
|             } |             } else if (getWatcher() instanceof ZombieWatcher) { | ||||||
|             else if (getWatcher() instanceof ZombieWatcher) { |  | ||||||
|                 ((ZombieWatcher) getWatcher()).setBaby(true); |                 ((ZombieWatcher) getWatcher()).setBaby(true); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -121,69 +114,69 @@ public abstract class Disguise { | |||||||
|         final boolean alwaysSendVelocity; |         final boolean alwaysSendVelocity; | ||||||
|  |  | ||||||
|         switch (getType()) { |         switch (getType()) { | ||||||
|         case EGG: |             case EGG: | ||||||
|         case ENDER_PEARL: |             case ENDER_PEARL: | ||||||
|         case BAT: |             case BAT: | ||||||
|         case EXPERIENCE_ORB: |             case EXPERIENCE_ORB: | ||||||
|         case FIREBALL: |             case FIREBALL: | ||||||
|         case SMALL_FIREBALL: |             case SMALL_FIREBALL: | ||||||
|         case SNOWBALL: |             case SNOWBALL: | ||||||
|         case SPLASH_POTION: |             case SPLASH_POTION: | ||||||
|         case THROWN_EXP_BOTTLE: |             case THROWN_EXP_BOTTLE: | ||||||
|         case WITHER_SKULL: |             case WITHER_SKULL: | ||||||
|         case FIREWORK: |             case FIREWORK: | ||||||
|             alwaysSendVelocity = true; |                 alwaysSendVelocity = true; | ||||||
|             break; |                 break; | ||||||
|         default: |             default: | ||||||
|             alwaysSendVelocity = false; |                 alwaysSendVelocity = false; | ||||||
|             break; |                 break; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         double velocitySpeed = 0.0005; |         double velocitySpeed = 0.0005; | ||||||
|  |  | ||||||
|         switch (getType()) { |         switch (getType()) { | ||||||
|         case FIREWORK: |             case FIREWORK: | ||||||
|             velocitySpeed = -0.040; |                 velocitySpeed = -0.040; | ||||||
|             break; |                 break; | ||||||
|         case WITHER_SKULL: |             case WITHER_SKULL: | ||||||
|             velocitySpeed = 0.000001D; |                 velocitySpeed = 0.000001D; | ||||||
|             break; |                 break; | ||||||
|         case ARROW: |             case ARROW: | ||||||
|         case TIPPED_ARROW: |             case TIPPED_ARROW: | ||||||
|         case SPECTRAL_ARROW: |             case SPECTRAL_ARROW: | ||||||
|         case BOAT: |             case BOAT: | ||||||
|         case ENDER_CRYSTAL: |             case ENDER_CRYSTAL: | ||||||
|         case ENDER_DRAGON: |             case ENDER_DRAGON: | ||||||
|         case GHAST: |             case GHAST: | ||||||
|         case ITEM_FRAME: |             case ITEM_FRAME: | ||||||
|         case MINECART: |             case MINECART: | ||||||
|         case MINECART_CHEST: |             case MINECART_CHEST: | ||||||
|         case MINECART_COMMAND: |             case MINECART_COMMAND: | ||||||
|         case MINECART_FURNACE: |             case MINECART_FURNACE: | ||||||
|         case MINECART_HOPPER: |             case MINECART_HOPPER: | ||||||
|         case MINECART_MOB_SPAWNER: |             case MINECART_MOB_SPAWNER: | ||||||
|         case MINECART_TNT: |             case MINECART_TNT: | ||||||
|         case PAINTING: |             case PAINTING: | ||||||
|         case PLAYER: |             case PLAYER: | ||||||
|         case SQUID: |             case SQUID: | ||||||
|             velocitySpeed = 0; |                 velocitySpeed = 0; | ||||||
|             break; |                 break; | ||||||
|         case DROPPED_ITEM: |             case DROPPED_ITEM: | ||||||
|         case PRIMED_TNT: |             case PRIMED_TNT: | ||||||
|         case WITHER: |             case WITHER: | ||||||
|         case FALLING_BLOCK: |             case FALLING_BLOCK: | ||||||
|             velocitySpeed = 0.04; |                 velocitySpeed = 0.04; | ||||||
|             break; |                 break; | ||||||
|         case EXPERIENCE_ORB: |             case EXPERIENCE_ORB: | ||||||
|             velocitySpeed = 0.0221; |                 velocitySpeed = 0.0221; | ||||||
|             break; |                 break; | ||||||
|         case SPIDER: |             case SPIDER: | ||||||
|         case BAT: |             case BAT: | ||||||
|         case CAVE_SPIDER: |             case CAVE_SPIDER: | ||||||
|             velocitySpeed = 0.004; |                 velocitySpeed = 0.004; | ||||||
|             break; |                 break; | ||||||
|         default: |             default: | ||||||
|             break; |                 break; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         final double vectorY = velocitySpeed; |         final double vectorY = velocitySpeed; | ||||||
| @@ -209,16 +202,14 @@ public abstract class Disguise { | |||||||
|  |  | ||||||
|                         if (isRemoveDisguiseOnDeath()) { |                         if (isRemoveDisguiseOnDeath()) { | ||||||
|                             removeDisguise(); |                             removeDisguise(); | ||||||
|                         } |                         } else { | ||||||
|                         else { |  | ||||||
|                             entity = null; |                             entity = null; | ||||||
|                             watcher = getWatcher().clone(disguise); |                             watcher = getWatcher().clone(disguise); | ||||||
|                             task.cancel(); |                             task.cancel(); | ||||||
|                             task = null; |                             task = null; | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } else { | ||||||
|                 else { |  | ||||||
|                     deadTicks = 0; |                     deadTicks = 0; | ||||||
|  |  | ||||||
|                     // If the disguise type is tnt, we need to resend the entity packet else it will turn invisible |                     // If the disguise type is tnt, we need to resend the entity packet else it will turn invisible | ||||||
| @@ -230,8 +221,7 @@ public abstract class Disguise { | |||||||
|  |  | ||||||
|                             DisguiseUtilities.refreshTrackers(disguise); |                             DisguiseUtilities.refreshTrackers(disguise); | ||||||
|                         } |                         } | ||||||
|                     } |                     } else if (getType() == DisguiseType.EVOKER_FANGS) { | ||||||
|                     else if (getType() == DisguiseType.EVOKER_FANGS) { |  | ||||||
|                         refreshDisguise++; |                         refreshDisguise++; | ||||||
|  |  | ||||||
|                         if (refreshDisguise == 23) { |                         if (refreshDisguise == 23) { | ||||||
| @@ -239,14 +229,12 @@ public abstract class Disguise { | |||||||
|  |  | ||||||
|                             DisguiseUtilities.refreshTrackers(disguise); |                             DisguiseUtilities.refreshTrackers(disguise); | ||||||
|                         } |                         } | ||||||
|                     } |                     } else if (getType() == DisguiseType.ITEM_FRAME) { | ||||||
|                     else if (getType() == DisguiseType.ITEM_FRAME) { |  | ||||||
|                         Location loc = getEntity().getLocation(); |                         Location loc = getEntity().getLocation(); | ||||||
|  |  | ||||||
|                         int newFacing = (((int) loc.getYaw() + 720 + 45) / 90) % 4; |                         int newFacing = (((int) loc.getYaw() + 720 + 45) / 90) % 4; | ||||||
|  |  | ||||||
|                         if (loc.getBlockX() != blockX || loc.getBlockY() != blockY || loc.getBlockZ() != blockZ |                         if (loc.getBlockX() != blockX || loc.getBlockY() != blockY || loc.getBlockZ() != blockZ || newFacing != facing) { | ||||||
|                                 || newFacing != facing) { |  | ||||||
|                             blockX = loc.getBlockX(); |                             blockX = loc.getBlockX(); | ||||||
|                             blockY = loc.getBlockY(); |                             blockY = loc.getBlockY(); | ||||||
|                             blockZ = loc.getBlockZ(); |                             blockZ = loc.getBlockZ(); | ||||||
| @@ -289,8 +277,9 @@ public abstract class Disguise { | |||||||
|  |  | ||||||
|                                 mods.write(4, PacketsManager.getYaw(getType(), getEntity().getType(), |                                 mods.write(4, PacketsManager.getYaw(getType(), getEntity().getType(), | ||||||
|                                         (byte) Math.floor(loc.getYaw() * 256.0F / 360.0F))); |                                         (byte) Math.floor(loc.getYaw() * 256.0F / 360.0F))); | ||||||
|                                 mods.write(5, PacketsManager.getPitch(getType(), DisguiseType.getType(getEntity().getType()), |                                 mods.write(5, | ||||||
|                                         (byte) Math.floor(loc.getPitch() * 256.0F / 360.0F))); |                                         PacketsManager.getPitch(getType(), DisguiseType.getType(getEntity().getType()), | ||||||
|  |                                                 (byte) Math.floor(loc.getPitch() * 256.0F / 360.0F))); | ||||||
|  |  | ||||||
|                                 if (isSelfDisguiseVisible() && getEntity() instanceof Player) { |                                 if (isSelfDisguiseVisible() && getEntity() instanceof Player) { | ||||||
|                                     PacketContainer selfLookPacket = lookPacket.shallowClone(); |                                     PacketContainer selfLookPacket = lookPacket.shallowClone(); | ||||||
| @@ -322,19 +311,20 @@ public abstract class Disguise { | |||||||
|                                         } |                                         } | ||||||
|  |  | ||||||
|                                         mods.write(0, DisguiseAPI.getSelfDisguiseId()); |                                         mods.write(0, DisguiseAPI.getSelfDisguiseId()); | ||||||
|                                     } |                                     } else { | ||||||
|                                     else { |  | ||||||
|                                         mods.write(0, getEntity().getEntityId()); |                                         mods.write(0, getEntity().getEntityId()); | ||||||
|                                     } |                                     } | ||||||
|  |  | ||||||
|                                     mods.write(2, (int) (8000D * (vectorY * ReflectionManager.getPing(player)) * 0.069D)); |                                     mods.write(2, | ||||||
|  |                                             (int) (8000D * (vectorY * ReflectionManager.getPing(player)) * 0.069D)); | ||||||
|  |  | ||||||
|                                     if (lookPacket != null && player != getEntity()) { |                                     if (lookPacket != null && player != getEntity()) { | ||||||
|                                         ProtocolLibrary.getProtocolManager().sendServerPacket(player, lookPacket, false); |                                         ProtocolLibrary.getProtocolManager().sendServerPacket(player, lookPacket, | ||||||
|  |                                                 false); | ||||||
|                                     } |                                     } | ||||||
|  |  | ||||||
|                                     ProtocolLibrary.getProtocolManager().sendServerPacket(player, velocityPacket.shallowClone(), |                                     ProtocolLibrary.getProtocolManager().sendServerPacket(player, | ||||||
|                                             false); |                                             velocityPacket.shallowClone(), false); | ||||||
|                                 } |                                 } | ||||||
|                             } |                             } | ||||||
|                             catch (Exception e) { |                             catch (Exception e) { | ||||||
| @@ -352,15 +342,14 @@ public abstract class Disguise { | |||||||
|                             for (Player player : DisguiseUtilities.getPerverts(disguise)) { |                             for (Player player : DisguiseUtilities.getPerverts(disguise)) { | ||||||
|                                 if (getEntity() != player) { |                                 if (getEntity() != player) { | ||||||
|                                     ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, false); |                                     ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, false); | ||||||
|                                 } |                                 } else if (isSelfDisguiseVisible()) { | ||||||
|                                 else if (isSelfDisguiseVisible()) { |  | ||||||
|                                     PacketContainer selfPacket = packet.shallowClone(); |                                     PacketContainer selfPacket = packet.shallowClone(); | ||||||
|  |  | ||||||
|                                     selfPacket.getModifier().write(0, DisguiseAPI.getSelfDisguiseId()); |                                     selfPacket.getModifier().write(0, DisguiseAPI.getSelfDisguiseId()); | ||||||
|  |  | ||||||
|                                     try { |                                     try { | ||||||
|                                         ProtocolLibrary.getProtocolManager().sendServerPacket((Player) getEntity(), selfPacket, |                                         ProtocolLibrary.getProtocolManager().sendServerPacket((Player) getEntity(), | ||||||
|                                                 false); |                                                 selfPacket, false); | ||||||
|                                     } |                                     } | ||||||
|                                     catch (InvocationTargetException e) { |                                     catch (InvocationTargetException e) { | ||||||
|                                         e.printStackTrace(); |                                         e.printStackTrace(); | ||||||
| @@ -461,9 +450,9 @@ public abstract class Disguise { | |||||||
|      * Internal use |      * Internal use | ||||||
|      */ |      */ | ||||||
|     public boolean isRemoveDisguiseOnDeath() { |     public boolean isRemoveDisguiseOnDeath() { | ||||||
|         return getEntity() == null || (getEntity() instanceof Player |         return getEntity() == null || (getEntity() instanceof Player ? | ||||||
|                 ? (!((Player) getEntity()).isOnline() ? !isKeepDisguiseOnPlayerLogout() : !isKeepDisguiseOnPlayerDeath()) |                 (!((Player) getEntity()).isOnline() ? !isKeepDisguiseOnPlayerLogout() : | ||||||
|                 : (!isKeepDisguiseOnEntityDespawn() || getEntity().isDead())); |                         !isKeepDisguiseOnPlayerDeath()) : (!isKeepDisguiseOnEntityDespawn() || getEntity().isDead())); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isSelfDisguiseSoundsReplaced() { |     public boolean isSelfDisguiseSoundsReplaced() { | ||||||
| @@ -525,8 +514,8 @@ public abstract class Disguise { | |||||||
|                         if (disguise.isDisplayedInTab()) { |                         if (disguise.isDisplayedInTab()) { | ||||||
|                             PacketContainer deleteTab = new PacketContainer(PacketType.Play.Server.PLAYER_INFO); |                             PacketContainer deleteTab = new PacketContainer(PacketType.Play.Server.PLAYER_INFO); | ||||||
|                             deleteTab.getPlayerInfoAction().write(0, PlayerInfoAction.REMOVE_PLAYER); |                             deleteTab.getPlayerInfoAction().write(0, PlayerInfoAction.REMOVE_PLAYER); | ||||||
|                             deleteTab.getPlayerInfoDataLists().write(0, |                             deleteTab.getPlayerInfoDataLists().write(0, Arrays.asList( | ||||||
|                                     Arrays.asList(new PlayerInfoData(disguise.getGameProfile(), 0, NativeGameMode.SURVIVAL, |                                     new PlayerInfoData(disguise.getGameProfile(), 0, NativeGameMode.SURVIVAL, | ||||||
|                                             WrappedChatComponent.fromText(disguise.getName())))); |                                             WrappedChatComponent.fromText(disguise.getName())))); | ||||||
|  |  | ||||||
|                             try { |                             try { | ||||||
| @@ -546,8 +535,8 @@ public abstract class Disguise { | |||||||
|                     if (isHidePlayer() && getEntity() instanceof Player) { |                     if (isHidePlayer() && getEntity() instanceof Player) { | ||||||
|                         PacketContainer deleteTab = new PacketContainer(PacketType.Play.Server.PLAYER_INFO); |                         PacketContainer deleteTab = new PacketContainer(PacketType.Play.Server.PLAYER_INFO); | ||||||
|                         deleteTab.getPlayerInfoAction().write(0, PlayerInfoAction.ADD_PLAYER); |                         deleteTab.getPlayerInfoAction().write(0, PlayerInfoAction.ADD_PLAYER); | ||||||
|                         deleteTab.getPlayerInfoDataLists().write(0, |                         deleteTab.getPlayerInfoDataLists().write(0, Arrays.asList( | ||||||
|                                 Arrays.asList(new PlayerInfoData(ReflectionManager.getGameProfile((Player) getEntity()), 0, |                                 new PlayerInfoData(ReflectionManager.getGameProfile((Player) getEntity()), 0, | ||||||
|                                         NativeGameMode.SURVIVAL, |                                         NativeGameMode.SURVIVAL, | ||||||
|                                         WrappedChatComponent.fromText(((Player) getEntity()).getDisplayName())))); |                                         WrappedChatComponent.fromText(((Player) getEntity()).getDisplayName())))); | ||||||
|  |  | ||||||
| @@ -574,13 +563,11 @@ public abstract class Disguise { | |||||||
|                         // Better refresh the entity to undisguise it |                         // Better refresh the entity to undisguise it | ||||||
|                         if (getEntity().isValid()) { |                         if (getEntity().isValid()) { | ||||||
|                             DisguiseUtilities.refreshTrackers((TargetedDisguise) this); |                             DisguiseUtilities.refreshTrackers((TargetedDisguise) this); | ||||||
|                         } |                         } else { | ||||||
|                         else { |  | ||||||
|                             DisguiseUtilities.destroyEntity((TargetedDisguise) this); |                             DisguiseUtilities.destroyEntity((TargetedDisguise) this); | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } else { | ||||||
|                 else { |  | ||||||
|                     // Loop through the disguises because it could be used with a unknown entity id. |                     // Loop through the disguises because it could be used with a unknown entity id. | ||||||
|                     HashMap<Integer, HashSet<TargetedDisguise>> future = DisguiseUtilities.getFutureDisguises(); |                     HashMap<Integer, HashSet<TargetedDisguise>> future = DisguiseUtilities.getFutureDisguises(); | ||||||
|  |  | ||||||
| @@ -595,22 +582,6 @@ public abstract class Disguise { | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 if (isPlayerDisguise()) { |  | ||||||
|                     String name = ((PlayerDisguise) this).getName(); |  | ||||||
|  |  | ||||||
|                     if (!DisguiseUtilities.getAddedByPlugins().contains(name.toLowerCase())) { |  | ||||||
|                         for (HashSet<TargetedDisguise> disguise : disguises.values()) { |  | ||||||
|                             for (Disguise d : disguise) { |  | ||||||
|                                 if (d.isPlayerDisguise() && ((PlayerDisguise) d).getName().equals(name)) { |  | ||||||
|                                     return true; |  | ||||||
|                                 } |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|  |  | ||||||
|                         DisguiseUtilities.getGameProfiles().remove(name.toLowerCase()); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 return true; |                 return true; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -640,7 +611,9 @@ public abstract class Disguise { | |||||||
|  |  | ||||||
|         this.entity = entity; |         this.entity = entity; | ||||||
|  |  | ||||||
|         setupWatcher(); |         if (entity != null) { | ||||||
|  |             setupWatcher(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         return this; |         return this; | ||||||
|     } |     } | ||||||
| @@ -731,7 +704,8 @@ public abstract class Disguise { | |||||||
|      */ |      */ | ||||||
|     private void setupWatcher() { |     private void setupWatcher() { | ||||||
|         ArrayList<MetaIndex> disguiseFlags = MetaIndex.getFlags(getType().getWatcherClass()); |         ArrayList<MetaIndex> disguiseFlags = MetaIndex.getFlags(getType().getWatcherClass()); | ||||||
|         ArrayList<MetaIndex> entityFlags = MetaIndex.getFlags(DisguiseType.getType(getEntity().getType()).getWatcherClass()); |         ArrayList<MetaIndex> entityFlags = MetaIndex.getFlags( | ||||||
|  |                 DisguiseType.getType(getEntity().getType()).getWatcherClass()); | ||||||
|  |  | ||||||
|         for (MetaIndex flag : entityFlags) { |         for (MetaIndex flag : entityFlags) { | ||||||
|             if (disguiseFlags.contains(flag)) |             if (disguiseFlags.contains(flag)) | ||||||
| @@ -770,8 +744,7 @@ public abstract class Disguise { | |||||||
|                 if (DisguiseAPI.getDisguise((Player) getEntity(), getEntity()) == this) { |                 if (DisguiseAPI.getDisguise((Player) getEntity(), getEntity()) == this) { | ||||||
|                     if (isSelfDisguiseVisible()) { |                     if (isSelfDisguiseVisible()) { | ||||||
|                         DisguiseUtilities.setupFakeDisguise(this); |                         DisguiseUtilities.setupFakeDisguise(this); | ||||||
|                     } |                     } else { | ||||||
|                     else { |  | ||||||
|                         DisguiseUtilities.removeSelfDisguise((Player) getEntity()); |                         DisguiseUtilities.removeSelfDisguise((Player) getEntity()); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| @@ -783,8 +756,8 @@ public abstract class Disguise { | |||||||
|  |  | ||||||
|     public Disguise setWatcher(FlagWatcher newWatcher) { |     public Disguise setWatcher(FlagWatcher newWatcher) { | ||||||
|         if (!getType().getWatcherClass().isInstance(newWatcher)) { |         if (!getType().getWatcherClass().isInstance(newWatcher)) { | ||||||
|             throw new IllegalArgumentException(newWatcher.getClass().getSimpleName() + " is not a instance of " |             throw new IllegalArgumentException( | ||||||
|                     + getType().getWatcherClass().getSimpleName() + " for DisguiseType " + getType().name()); |                     newWatcher.getClass().getSimpleName() + " is not a instance of " + getType().getWatcherClass().getSimpleName() + " for DisguiseType " + getType().name()); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         watcher = newWatcher; |         watcher = newWatcher; | ||||||
| @@ -823,8 +796,9 @@ public abstract class Disguise { | |||||||
|                 if (disguise.isDisplayedInTab()) { |                 if (disguise.isDisplayedInTab()) { | ||||||
|                     PacketContainer addTab = new PacketContainer(PacketType.Play.Server.PLAYER_INFO); |                     PacketContainer addTab = new PacketContainer(PacketType.Play.Server.PLAYER_INFO); | ||||||
|                     addTab.getPlayerInfoAction().write(0, PlayerInfoAction.ADD_PLAYER); |                     addTab.getPlayerInfoAction().write(0, PlayerInfoAction.ADD_PLAYER); | ||||||
|                     addTab.getPlayerInfoDataLists().write(0, Arrays.asList(new PlayerInfoData(disguise.getGameProfile(), 0, |                     addTab.getPlayerInfoDataLists().write(0, Arrays.asList( | ||||||
|                             NativeGameMode.SURVIVAL, WrappedChatComponent.fromText(disguise.getName())))); |                             new PlayerInfoData(disguise.getGameProfile(), 0, NativeGameMode.SURVIVAL, | ||||||
|  |                                     WrappedChatComponent.fromText(disguise.getName())))); | ||||||
|  |  | ||||||
|                     try { |                     try { | ||||||
|                         for (Player player : Bukkit.getOnlinePlayers()) { |                         for (Player player : Bukkit.getOnlinePlayers()) { | ||||||
| @@ -861,8 +835,8 @@ public abstract class Disguise { | |||||||
|             if (isHidePlayer() && getEntity() instanceof Player) { |             if (isHidePlayer() && getEntity() instanceof Player) { | ||||||
|                 PacketContainer addTab = new PacketContainer(PacketType.Play.Server.PLAYER_INFO); |                 PacketContainer addTab = new PacketContainer(PacketType.Play.Server.PLAYER_INFO); | ||||||
|                 addTab.getPlayerInfoAction().write(0, PlayerInfoAction.REMOVE_PLAYER); |                 addTab.getPlayerInfoAction().write(0, PlayerInfoAction.REMOVE_PLAYER); | ||||||
|                 addTab.getPlayerInfoDataLists().write(0, |                 addTab.getPlayerInfoDataLists().write(0, Arrays.asList( | ||||||
|                         Arrays.asList(new PlayerInfoData(ReflectionManager.getGameProfile((Player) getEntity()), 0, |                         new PlayerInfoData(ReflectionManager.getGameProfile((Player) getEntity()), 0, | ||||||
|                                 NativeGameMode.SURVIVAL, WrappedChatComponent.fromText("")))); |                                 NativeGameMode.SURVIVAL, WrappedChatComponent.fromText("")))); | ||||||
|  |  | ||||||
|                 try { |                 try { | ||||||
|   | |||||||
| @@ -1,12 +1,17 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes; | package me.libraryaddict.disguise.disguisetypes; | ||||||
|  |  | ||||||
| import java.lang.reflect.InvocationTargetException; | import com.comphenix.protocol.PacketType.Play.Server; | ||||||
| import java.util.ArrayList; | import com.comphenix.protocol.ProtocolLibrary; | ||||||
| import java.util.Arrays; | import com.comphenix.protocol.events.PacketContainer; | ||||||
| import java.util.HashMap; | import com.comphenix.protocol.reflect.StructureModifier; | ||||||
| import java.util.HashSet; | import com.comphenix.protocol.wrappers.WrappedDataWatcher; | ||||||
| import java.util.List; | import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||||
|  | import com.comphenix.protocol.wrappers.WrappedSignedProperty; | ||||||
|  | import com.comphenix.protocol.wrappers.WrappedWatchableObject; | ||||||
|  | import me.libraryaddict.disguise.DisguiseAPI; | ||||||
|  | import me.libraryaddict.disguise.DisguiseConfig; | ||||||
|  | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
|  | import me.libraryaddict.disguise.utilities.ReflectionManager; | ||||||
| import org.bukkit.Bukkit; | import org.bukkit.Bukkit; | ||||||
| import org.bukkit.entity.LivingEntity; | import org.bukkit.entity.LivingEntity; | ||||||
| import org.bukkit.entity.Player; | import org.bukkit.entity.Player; | ||||||
| @@ -14,30 +19,37 @@ import org.bukkit.inventory.EntityEquipment; | |||||||
| import org.bukkit.inventory.EquipmentSlot; | import org.bukkit.inventory.EquipmentSlot; | ||||||
| import org.bukkit.inventory.ItemStack; | import org.bukkit.inventory.ItemStack; | ||||||
|  |  | ||||||
| import com.comphenix.protocol.PacketType.Play.Server; | import java.io.IOException; | ||||||
| import com.comphenix.protocol.ProtocolLibrary; | import java.io.Serializable; | ||||||
| import com.comphenix.protocol.events.PacketContainer; | import java.lang.reflect.InvocationTargetException; | ||||||
| import com.comphenix.protocol.reflect.StructureModifier; | import java.util.*; | ||||||
| import com.comphenix.protocol.wrappers.WrappedDataWatcher; |  | ||||||
| import com.comphenix.protocol.wrappers.WrappedWatchableObject; |  | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.DisguiseAPI; | public class FlagWatcher implements Serializable { | ||||||
| import me.libraryaddict.disguise.DisguiseConfig; |  | ||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; |  | ||||||
| import me.libraryaddict.disguise.utilities.ReflectionManager; |  | ||||||
|  |  | ||||||
| public class FlagWatcher { |  | ||||||
|     private boolean addEntityAnimations = DisguiseConfig.isEntityAnimationsAdded(); |     private boolean addEntityAnimations = DisguiseConfig.isEntityAnimationsAdded(); | ||||||
|     /** |     /** | ||||||
|      * These are the entity values I need to add else it could crash them.. |      * These are the entity values I need to add else it could crash them.. | ||||||
|      */ |      */ | ||||||
|     private HashMap<Integer, Object> backupEntityValues = new HashMap<>(); |     private HashMap<Integer, Object> backupEntityValues = new HashMap<>(); | ||||||
|     private TargetedDisguise disguise; |     private transient TargetedDisguise disguise; | ||||||
|     private HashMap<Integer, Object> entityValues = new HashMap<>(); |     private HashMap<Integer, Object> entityValues = new HashMap<>(); | ||||||
|     private LibsEquipment equipment; |     private LibsEquipment equipment; | ||||||
|     private boolean hasDied; |     private boolean hasDied; | ||||||
|     private boolean[] modifiedEntityAnimations = new boolean[8]; |     private boolean[] modifiedEntityAnimations = new boolean[8]; | ||||||
|     private List<WrappedWatchableObject> watchableObjects; |     private transient List<WrappedWatchableObject> watchableObjects; | ||||||
|  |  | ||||||
|  |     private void writeObject(java.io.ObjectOutputStream out) throws IOException { | ||||||
|  |         out.writeBoolean(isEntityAnimationsAdded()); | ||||||
|  |         out. | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { | ||||||
|  |         profile = new WrappedGameProfile((UUID) in.readObject(), in.readUTF()); | ||||||
|  |  | ||||||
|  |         for (int i = in.readByte(); i > 0; i--) { | ||||||
|  |             profile.getProperties().put(in.readUTF(), | ||||||
|  |                     new WrappedSignedProperty(in.readUTF(), in.readUTF(), in.readUTF())); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public FlagWatcher(Disguise disguise) { |     public FlagWatcher(Disguise disguise) { | ||||||
|         this.disguise = (TargetedDisguise) disguise; |         this.disguise = (TargetedDisguise) disguise; | ||||||
| @@ -97,8 +109,7 @@ public class FlagWatcher { | |||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 value = entityValues.get(id); |                 value = entityValues.get(id); | ||||||
|             } |             } else if (backupEntityValues.containsKey(id)) { | ||||||
|             else if (backupEntityValues.containsKey(id)) { |  | ||||||
|                 if (backupEntityValues.get(id) == null) { |                 if (backupEntityValues.get(id) == null) { | ||||||
|                     continue; |                     continue; | ||||||
|                 } |                 } | ||||||
| @@ -121,8 +132,7 @@ public class FlagWatcher { | |||||||
|                 if (!isDirty) { |                 if (!isDirty) { | ||||||
|                     watch.setDirtyState(false); |                     watch.setDirtyState(false); | ||||||
|                 } |                 } | ||||||
|             } |             } else { | ||||||
|             else { |  | ||||||
|                 boolean isDirty = watch.getDirtyState(); |                 boolean isDirty = watch.getDirtyState(); | ||||||
|  |  | ||||||
|                 watch = ReflectionManager.createWatchable(id, watch.getValue()); |                 watch = ReflectionManager.createWatchable(id, watch.getValue()); | ||||||
| @@ -160,8 +170,7 @@ public class FlagWatcher { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         // Here we check for if there is a health packet that says they died. |         // Here we check for if there is a health packet that says they died. | ||||||
|         if (getDisguise().isSelfDisguiseVisible() && getDisguise().getEntity() != null |         if (getDisguise().isSelfDisguiseVisible() && getDisguise().getEntity() != null && getDisguise().getEntity() instanceof Player) { | ||||||
|                 && getDisguise().getEntity() instanceof Player) { |  | ||||||
|             for (WrappedWatchableObject watch : newList) { |             for (WrappedWatchableObject watch : newList) { | ||||||
|                 // Its a health packet |                 // Its a health packet | ||||||
|                 if (watch.getIndex() == 6) { |                 if (watch.getIndex() == 6) { | ||||||
| @@ -173,19 +182,20 @@ public class FlagWatcher { | |||||||
|                         if (newHealth > 0 && hasDied) { |                         if (newHealth > 0 && hasDied) { | ||||||
|                             hasDied = false; |                             hasDied = false; | ||||||
|  |  | ||||||
|                             Bukkit.getScheduler().scheduleSyncDelayedTask(DisguiseUtilities.getPlugin(), new Runnable() { |                             Bukkit.getScheduler().scheduleSyncDelayedTask(DisguiseUtilities.getPlugin(), | ||||||
|                                 @Override |                                     new Runnable() { | ||||||
|                                 public void run() { |                                         @Override | ||||||
|                                     try { |                                         public void run() { | ||||||
|                                         DisguiseUtilities.sendSelfDisguise((Player) getDisguise().getEntity(), disguise); |                                             try { | ||||||
|                                     } |                                                 DisguiseUtilities.sendSelfDisguise((Player) getDisguise().getEntity(), | ||||||
|                                     catch (Exception ex) { |                                                         disguise); | ||||||
|                                         ex.printStackTrace(); |                                             } | ||||||
|                                     } |                                             catch (Exception ex) { | ||||||
|                                 } |                                                 ex.printStackTrace(); | ||||||
|                             }, 2); |                                             } | ||||||
|                         } |                                         } | ||||||
|                         else if (newHealth <= 0 && !hasDied) { |                                     }, 2); | ||||||
|  |                         } else if (newHealth <= 0 && !hasDied) { | ||||||
|                             hasDied = true; |                             hasDied = true; | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
| @@ -300,11 +310,9 @@ public class FlagWatcher { | |||||||
|  |  | ||||||
|             if (entityValues.containsKey(i) && entityValues.get(i) != null) { |             if (entityValues.containsKey(i) && entityValues.get(i) != null) { | ||||||
|                 watchable = ReflectionManager.createWatchable(i, entityValues.get(i)); |                 watchable = ReflectionManager.createWatchable(i, entityValues.get(i)); | ||||||
|             } |             } else if (backupEntityValues.containsKey(i) && backupEntityValues.get(i) != null) { | ||||||
|             else if (backupEntityValues.containsKey(i) && backupEntityValues.get(i) != null) { |  | ||||||
|                 watchable = ReflectionManager.createWatchable(i, backupEntityValues.get(i)); |                 watchable = ReflectionManager.createWatchable(i, backupEntityValues.get(i)); | ||||||
|             } |             } else { | ||||||
|             else { |  | ||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -330,7 +338,8 @@ public class FlagWatcher { | |||||||
|             Object value = entityValues.get(data.getIndex()); |             Object value = entityValues.get(data.getIndex()); | ||||||
|  |  | ||||||
|             if (isEntityAnimationsAdded() && DisguiseConfig.isMetadataPacketsEnabled() && data == MetaIndex.ENTITY_META) { |             if (isEntityAnimationsAdded() && DisguiseConfig.isMetadataPacketsEnabled() && data == MetaIndex.ENTITY_META) { | ||||||
|                 value = addEntityAnimations((byte) value, WrappedDataWatcher.getEntityWatcher(disguise.getEntity()).getByte(0)); |                 value = addEntityAnimations((byte) value, | ||||||
|  |                         WrappedDataWatcher.getEntityWatcher(disguise.getEntity()).getByte(0)); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             WrappedWatchableObject watch = ReflectionManager.createWatchable(data.getIndex(), value); |             WrappedWatchableObject watch = ReflectionManager.createWatchable(data.getIndex(), value); | ||||||
| @@ -356,8 +365,7 @@ public class FlagWatcher { | |||||||
|                         temp.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); |                         temp.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); | ||||||
|  |  | ||||||
|                         ProtocolLibrary.getProtocolManager().sendServerPacket(player, temp); |                         ProtocolLibrary.getProtocolManager().sendServerPacket(player, temp); | ||||||
|                     } |                     } else { | ||||||
|                     else { |  | ||||||
|                         ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); |                         ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| @@ -407,8 +415,7 @@ public class FlagWatcher { | |||||||
|  |  | ||||||
|         if (flag) { |         if (flag) { | ||||||
|             setData(MetaIndex.ENTITY_META, (byte) (b0 | 1 << byteValue)); |             setData(MetaIndex.ENTITY_META, (byte) (b0 | 1 << byteValue)); | ||||||
|         } |         } else { | ||||||
|         else { |  | ||||||
|             setData(MetaIndex.ENTITY_META, (byte) (b0 & ~(1 << byteValue))); |             setData(MetaIndex.ENTITY_META, (byte) (b0 & ~(1 << byteValue))); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -453,34 +460,34 @@ public class FlagWatcher { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     protected void sendItemStack(EquipmentSlot slot, ItemStack itemStack) { |     protected void sendItemStack(EquipmentSlot slot, ItemStack itemStack) { | ||||||
|         if (!DisguiseAPI.isDisguiseInUse(getDisguise()) || getDisguise().getWatcher() != this |         if (!DisguiseAPI.isDisguiseInUse( | ||||||
|                 || getDisguise().getEntity() == null) |                 getDisguise()) || getDisguise().getWatcher() != this || getDisguise().getEntity() == null) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         if (itemStack == null && getDisguise().getEntity() instanceof LivingEntity) { |         if (itemStack == null && getDisguise().getEntity() instanceof LivingEntity) { | ||||||
|             EntityEquipment equip = ((LivingEntity) getDisguise().getEntity()).getEquipment(); |             EntityEquipment equip = ((LivingEntity) getDisguise().getEntity()).getEquipment(); | ||||||
|  |  | ||||||
|             switch (slot) { |             switch (slot) { | ||||||
|             case HAND: |                 case HAND: | ||||||
|                 itemStack = equip.getItemInMainHand(); |                     itemStack = equip.getItemInMainHand(); | ||||||
|                 break; |                     break; | ||||||
|             case OFF_HAND: |                 case OFF_HAND: | ||||||
|                 itemStack = equip.getItemInOffHand(); |                     itemStack = equip.getItemInOffHand(); | ||||||
|                 break; |                     break; | ||||||
|             case HEAD: |                 case HEAD: | ||||||
|                 itemStack = equip.getHelmet(); |                     itemStack = equip.getHelmet(); | ||||||
|                 break; |                     break; | ||||||
|             case CHEST: |                 case CHEST: | ||||||
|                 itemStack = equip.getChestplate(); |                     itemStack = equip.getChestplate(); | ||||||
|                 break; |                     break; | ||||||
|             case LEGS: |                 case LEGS: | ||||||
|                 itemStack = equip.getLeggings(); |                     itemStack = equip.getLeggings(); | ||||||
|                 break; |                     break; | ||||||
|             case FEET: |                 case FEET: | ||||||
|                 itemStack = equip.getBoots(); |                     itemStack = equip.getBoots(); | ||||||
|                 break; |                     break; | ||||||
|             default: |                 default: | ||||||
|                 break; |                     break; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -536,4 +543,7 @@ public class FlagWatcher { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     protected void setDisguise(TargetedDisguise disguise) { | ||||||
|  |         this.disguise = disguise; | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -5,7 +5,9 @@ import org.bukkit.inventory.EntityEquipment; | |||||||
| import org.bukkit.inventory.EquipmentSlot; | import org.bukkit.inventory.EquipmentSlot; | ||||||
| import org.bukkit.inventory.ItemStack; | import org.bukkit.inventory.ItemStack; | ||||||
|  |  | ||||||
| public class LibsEquipment implements EntityEquipment { | import java.io.Serializable; | ||||||
|  |  | ||||||
|  | public class LibsEquipment implements EntityEquipment, Serializable { | ||||||
|     private ItemStack[] equipment = new ItemStack[EquipmentSlot.values().length]; |     private ItemStack[] equipment = new ItemStack[EquipmentSlot.values().length]; | ||||||
|     private FlagWatcher flagWatcher; |     private FlagWatcher flagWatcher; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,14 +1,5 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes; | package me.libraryaddict.disguise.disguisetypes; | ||||||
|  |  | ||||||
| import java.lang.reflect.InvocationTargetException; |  | ||||||
| import java.util.Arrays; |  | ||||||
| import java.util.UUID; |  | ||||||
|  |  | ||||||
| import org.apache.commons.lang.Validate; |  | ||||||
| import org.bukkit.Bukkit; |  | ||||||
| import org.bukkit.entity.Entity; |  | ||||||
| import org.bukkit.entity.Player; |  | ||||||
|  |  | ||||||
| import com.comphenix.protocol.PacketType; | import com.comphenix.protocol.PacketType; | ||||||
| import com.comphenix.protocol.ProtocolLibrary; | import com.comphenix.protocol.ProtocolLibrary; | ||||||
| import com.comphenix.protocol.events.PacketContainer; | import com.comphenix.protocol.events.PacketContainer; | ||||||
| @@ -17,16 +8,24 @@ import com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction; | |||||||
| import com.comphenix.protocol.wrappers.PlayerInfoData; | import com.comphenix.protocol.wrappers.PlayerInfoData; | ||||||
| import com.comphenix.protocol.wrappers.WrappedChatComponent; | import com.comphenix.protocol.wrappers.WrappedChatComponent; | ||||||
| import com.comphenix.protocol.wrappers.WrappedGameProfile; | import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.LibsDisguises; | import me.libraryaddict.disguise.LibsDisguises; | ||||||
| import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; | import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; | ||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
| import me.libraryaddict.disguise.utilities.LibsProfileLookup; | import me.libraryaddict.disguise.utilities.LibsProfileLookup; | ||||||
|  | import me.libraryaddict.disguise.utilities.WrappedProfile; | ||||||
| import me.libraryaddict.disguise.utilities.ReflectionManager; | import me.libraryaddict.disguise.utilities.ReflectionManager; | ||||||
|  | import org.apache.commons.lang.Validate; | ||||||
|  | import org.bukkit.Bukkit; | ||||||
|  | import org.bukkit.entity.Entity; | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  |  | ||||||
|  | import java.lang.reflect.InvocationTargetException; | ||||||
|  | import java.util.Arrays; | ||||||
|  | import java.util.UUID; | ||||||
|  |  | ||||||
| public class PlayerDisguise extends TargetedDisguise { | public class PlayerDisguise extends TargetedDisguise { | ||||||
|     private LibsProfileLookup currentLookup; |     private transient LibsProfileLookup currentLookup; | ||||||
|     private WrappedGameProfile gameProfile; |     private WrappedProfile gameProfile; | ||||||
|     private String playerName; |     private String playerName; | ||||||
|     private String skinToUse; |     private String skinToUse; | ||||||
|     private UUID uuid = UUID.randomUUID(); |     private UUID uuid = UUID.randomUUID(); | ||||||
| @@ -66,7 +65,8 @@ public class PlayerDisguise extends TargetedDisguise { | |||||||
|  |  | ||||||
|         setName(gameProfile.getName()); |         setName(gameProfile.getName()); | ||||||
|  |  | ||||||
|         this.gameProfile = ReflectionManager.getGameProfileWithThisSkin(uuid, gameProfile.getName(), gameProfile); |         this.gameProfile = new WrappedProfile( | ||||||
|  |                 ReflectionManager.getGameProfileWithThisSkin(uuid, gameProfile.getName(), gameProfile)); | ||||||
|  |  | ||||||
|         createDisguise(); |         createDisguise(); | ||||||
|     } |     } | ||||||
| @@ -76,7 +76,7 @@ public class PlayerDisguise extends TargetedDisguise { | |||||||
|  |  | ||||||
|         setName(gameProfile.getName()); |         setName(gameProfile.getName()); | ||||||
|  |  | ||||||
|         this.gameProfile = ReflectionManager.getGameProfile(uuid, gameProfile.getName()); |         this.gameProfile = new WrappedProfile(ReflectionManager.getGameProfile(uuid, gameProfile.getName())); | ||||||
|  |  | ||||||
|         setSkin(skinToUse); |         setSkin(skinToUse); | ||||||
|  |  | ||||||
| @@ -101,8 +101,9 @@ public class PlayerDisguise extends TargetedDisguise { | |||||||
|  |  | ||||||
|         if (currentLookup == null && gameProfile != null) { |         if (currentLookup == null && gameProfile != null) { | ||||||
|             disguise.skinToUse = getSkin(); |             disguise.skinToUse = getSkin(); | ||||||
|             disguise.gameProfile = ReflectionManager.getGameProfileWithThisSkin(disguise.uuid, |             disguise.gameProfile = new WrappedProfile( | ||||||
|                     getGameProfile().getName(), getGameProfile()); |                     ReflectionManager.getGameProfileWithThisSkin(disguise.uuid, getGameProfile().getName(), | ||||||
|  |                             getGameProfile())); | ||||||
|         } else { |         } else { | ||||||
|             disguise.setSkin(getSkin()); |             disguise.setSkin(getSkin()); | ||||||
|         } |         } | ||||||
| @@ -127,14 +128,14 @@ public class PlayerDisguise extends TargetedDisguise { | |||||||
|     public WrappedGameProfile getGameProfile() { |     public WrappedGameProfile getGameProfile() { | ||||||
|         if (gameProfile == null) { |         if (gameProfile == null) { | ||||||
|             if (getSkin() != null) { |             if (getSkin() != null) { | ||||||
|                 gameProfile = ReflectionManager.getGameProfile(uuid, getName()); |                 gameProfile = new WrappedProfile(ReflectionManager.getGameProfile(uuid, getName())); | ||||||
|             } else { |             } else { | ||||||
|                 gameProfile = ReflectionManager.getGameProfileWithThisSkin(uuid, getName(), |                 gameProfile = new WrappedProfile(ReflectionManager.getGameProfileWithThisSkin(uuid, getName(), | ||||||
|                         DisguiseUtilities.getProfileFromMojang(this)); |                         DisguiseUtilities.getProfileFromMojang(this))); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return gameProfile; |         return gameProfile.getProfile(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public String getName() { |     public String getName() { | ||||||
| @@ -184,7 +185,8 @@ public class PlayerDisguise extends TargetedDisguise { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setGameProfile(WrappedGameProfile gameProfile) { |     public void setGameProfile(WrappedGameProfile gameProfile) { | ||||||
|         this.gameProfile = ReflectionManager.getGameProfileWithThisSkin(uuid, gameProfile.getName(), gameProfile); |         this.gameProfile = new WrappedProfile( | ||||||
|  |                 ReflectionManager.getGameProfileWithThisSkin(uuid, gameProfile.getName(), gameProfile)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
| @@ -304,7 +306,8 @@ public class PlayerDisguise extends TargetedDisguise { | |||||||
|         currentLookup = null; |         currentLookup = null; | ||||||
|  |  | ||||||
|         this.skinToUse = gameProfile.getName(); |         this.skinToUse = gameProfile.getName(); | ||||||
|         this.gameProfile = ReflectionManager.getGameProfileWithThisSkin(uuid, getName(), gameProfile); |         this.gameProfile = new WrappedProfile( | ||||||
|  |                 ReflectionManager.getGameProfileWithThisSkin(uuid, getName(), gameProfile)); | ||||||
|  |  | ||||||
|         if (DisguiseUtilities.isDisguiseInUse(this)) { |         if (DisguiseUtilities.isDisguiseInUse(this)) { | ||||||
|             if (isDisplayedInTab()) { |             if (isDisplayedInTab()) { | ||||||
|   | |||||||
| @@ -1,27 +1,30 @@ | |||||||
| package me.libraryaddict.disguise.utilities; | package me.libraryaddict.disguise.utilities; | ||||||
|  |  | ||||||
| import java.lang.reflect.Array; | import com.comphenix.protocol.PacketType; | ||||||
| import java.lang.reflect.Field; | import com.comphenix.protocol.PacketType.Play.Server; | ||||||
| import java.lang.reflect.InvocationTargetException; | import com.comphenix.protocol.ProtocolLibrary; | ||||||
| import java.lang.reflect.Method; | import com.comphenix.protocol.ProtocolManager; | ||||||
| import java.util.ArrayList; | import com.comphenix.protocol.events.PacketContainer; | ||||||
| import java.util.HashMap; | import com.comphenix.protocol.reflect.StructureModifier; | ||||||
| import java.util.HashSet; | import com.comphenix.protocol.wrappers.BlockPosition; | ||||||
| import java.util.Iterator; | import com.comphenix.protocol.wrappers.WrappedDataWatcher; | ||||||
| import java.util.LinkedHashMap; | import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||||
| import java.util.List; | import me.libraryaddict.disguise.DisguiseAPI; | ||||||
| import java.util.Map; | import me.libraryaddict.disguise.DisguiseConfig; | ||||||
| import java.util.Random; | import me.libraryaddict.disguise.DisguiseConfig.DisguisePushing; | ||||||
| import java.util.Set; | import me.libraryaddict.disguise.LibsDisguises; | ||||||
| import java.util.UUID; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
| import java.util.regex.Pattern; | import me.libraryaddict.disguise.disguisetypes.DisguiseType; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; | ||||||
| import org.bukkit.Bukkit; | import me.libraryaddict.disguise.disguisetypes.TargetedDisguise; | ||||||
| import org.bukkit.ChatColor; | import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType; | ||||||
| import org.bukkit.Location; | import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; | ||||||
| import org.bukkit.Material; | import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; | ||||||
| import org.bukkit.World; | import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; | ||||||
|  | import me.libraryaddict.disguise.utilities.PacketsManager.LibsPackets; | ||||||
|  | import org.bukkit.*; | ||||||
| import org.bukkit.block.BlockFace; | import org.bukkit.block.BlockFace; | ||||||
|  | import org.bukkit.configuration.file.YamlConfiguration; | ||||||
| import org.bukkit.entity.Ageable; | import org.bukkit.entity.Ageable; | ||||||
| import org.bukkit.entity.Entity; | import org.bukkit.entity.Entity; | ||||||
| import org.bukkit.entity.Player; | import org.bukkit.entity.Player; | ||||||
| @@ -36,37 +39,16 @@ import org.bukkit.scoreboard.Team.Option; | |||||||
| import org.bukkit.scoreboard.Team.OptionStatus; | import org.bukkit.scoreboard.Team.OptionStatus; | ||||||
| import org.bukkit.util.Vector; | import org.bukkit.util.Vector; | ||||||
|  |  | ||||||
| import com.comphenix.protocol.PacketType; | import java.io.*; | ||||||
| import com.comphenix.protocol.PacketType.Play.Server; | import java.lang.reflect.Array; | ||||||
| import com.comphenix.protocol.ProtocolLibrary; | import java.lang.reflect.Field; | ||||||
| import com.comphenix.protocol.ProtocolManager; | import java.lang.reflect.InvocationTargetException; | ||||||
| import com.comphenix.protocol.events.PacketContainer; | import java.lang.reflect.Method; | ||||||
| import com.comphenix.protocol.reflect.StructureModifier; | import java.util.*; | ||||||
| import com.comphenix.protocol.wrappers.BlockPosition; | import java.util.regex.Pattern; | ||||||
| import com.comphenix.protocol.wrappers.WrappedDataWatcher; |  | ||||||
| import com.comphenix.protocol.wrappers.WrappedGameProfile; |  | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.DisguiseAPI; |  | ||||||
| import me.libraryaddict.disguise.DisguiseConfig; |  | ||||||
| import me.libraryaddict.disguise.DisguiseConfig.DisguisePushing; |  | ||||||
| import me.libraryaddict.disguise.LibsDisguises; |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseType; |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.TargetedDisguise; |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType; |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; |  | ||||||
| import me.libraryaddict.disguise.utilities.PacketsManager.LibsPackets; |  | ||||||
|  |  | ||||||
| public class DisguiseUtilities { | public class DisguiseUtilities { | ||||||
|     public static final Random random = new Random(); |     public static final Random random = new Random(); | ||||||
|     /** |  | ||||||
|      * This is a list of names which was called by other plugins. As such, don't remove from the gameProfiles as its the duty of |  | ||||||
|      * the plugin to do that. |  | ||||||
|      */ |  | ||||||
|     private static HashSet<String> addedByPlugins = new HashSet<>(); |  | ||||||
|     private static LinkedHashMap<String, Disguise> clonedDisguises = new LinkedHashMap<>(); |     private static LinkedHashMap<String, Disguise> clonedDisguises = new LinkedHashMap<>(); | ||||||
|     /** |     /** | ||||||
|      * A hashmap of the uuid's of entitys, alive and dead. And their disguises in use |      * A hashmap of the uuid's of entitys, alive and dead. And their disguises in use | ||||||
| @@ -77,16 +59,16 @@ public class DisguiseUtilities { | |||||||
|      * a max of a second. |      * a max of a second. | ||||||
|      */ |      */ | ||||||
|     private static HashMap<Integer, HashSet<TargetedDisguise>> futureDisguises = new HashMap<>(); |     private static HashMap<Integer, HashSet<TargetedDisguise>> futureDisguises = new HashMap<>(); | ||||||
|     /** |     private static HashSet<UUID> savedDisguiseList = new HashSet<>(); | ||||||
|      * A hashmap storing the uuid and skin of a playername |     private static HashSet<String> cachedNames = new HashSet<>(); | ||||||
|      */ |  | ||||||
|     private static HashMap<String, WrappedGameProfile> gameProfiles = new HashMap<>(); |  | ||||||
|     private static LibsDisguises libsDisguises; |     private static LibsDisguises libsDisguises; | ||||||
|     private static HashMap<String, ArrayList<Object>> runnables = new HashMap<>(); |     private static HashMap<String, ArrayList<Object>> runnables = new HashMap<>(); | ||||||
|     private static HashSet<UUID> selfDisguised = new HashSet<>(); |     private static HashSet<UUID> selfDisguised = new HashSet<>(); | ||||||
|     private static Thread mainThread; |     private static Thread mainThread; | ||||||
|     private static PacketContainer spawnChunk; |     private static PacketContainer spawnChunk; | ||||||
|     private static HashMap<UUID, String> preDisguiseTeam = new HashMap<UUID, String>(); |     private static HashMap<UUID, String> preDisguiseTeam = new HashMap<>(); | ||||||
|  |     private static File profileCache = new File("plugins/LibsDisguises/GameProfiles"), savedDisguises = new File( | ||||||
|  |             "plugins/LibsDisguises/SavedDisguises"); | ||||||
|  |  | ||||||
|     static { |     static { | ||||||
|         try { |         try { | ||||||
| @@ -142,6 +124,10 @@ public class DisguiseUtilities { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public static boolean hasCacheEntry(String playername) { | ||||||
|  |         return cachedNames.contains(playername.toLowerCase()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public static void createClonedDisguise(Player player, Entity toClone, Boolean[] options) { |     public static void createClonedDisguise(Player player, Entity toClone, Boolean[] options) { | ||||||
|         Disguise disguise = DisguiseAPI.getDisguise(player, toClone); |         Disguise disguise = DisguiseAPI.getDisguise(player, toClone); | ||||||
|  |  | ||||||
| @@ -177,10 +163,103 @@ public class DisguiseUtilities { | |||||||
|             player.sendMessage(ChatColor.RED + "Example usage: /disguise " + reference); |             player.sendMessage(ChatColor.RED + "Example usage: /disguise " + reference); | ||||||
|         } else { |         } else { | ||||||
|             player.sendMessage( |             player.sendMessage( | ||||||
|                     ChatColor.RED + "Failed to store the reference, too many cloned disguises. Please set this in the config"); |                     ChatColor.RED + "Failed to store the reference, too many cloned disguises. Please raise the " + | ||||||
|  |                             "maximum cloned disguises, or lower the time they last"); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private static void saveDisguiseToFile | ||||||
|  |  | ||||||
|  |     public static void saveDisguises(UUID owningEntity, Disguise[] disguise) { | ||||||
|  |         try { | ||||||
|  |             File disguiseFile = new File(savedDisguises, owningEntity.toString()); | ||||||
|  |  | ||||||
|  |             if (disguise == null || disguise.length == 0) { | ||||||
|  |                 if (savedDisguiseList.contains(owningEntity)) { | ||||||
|  |                     disguiseFile.delete(); | ||||||
|  |                 } else { | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |             } else { | ||||||
|  |                 Disguise[] disguises = new Disguise[disguise.length]; | ||||||
|  |  | ||||||
|  |                 for (int i = 0; i < disguise.length; i++) { | ||||||
|  |                     Disguise dis = disguise[i].clone(); | ||||||
|  |                     dis.setEntity(null); | ||||||
|  |  | ||||||
|  |                     disguises[i] = dis; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 FileOutputStream files = new FileOutputStream(disguiseFile); | ||||||
|  |                 ObjectOutputStream obj = new ObjectOutputStream(files); | ||||||
|  |  | ||||||
|  |                 obj.writeObject(disguises); | ||||||
|  |  | ||||||
|  |                 savedDisguiseList.add(owningEntity); | ||||||
|  |  | ||||||
|  |                 obj.close(); | ||||||
|  |                 files.close(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             savedDisguises.save(new File(libsDisguises.getDataFolder(), "saveddisguises.yml")); | ||||||
|  |         } | ||||||
|  |         catch (Exception e) { | ||||||
|  |             e.printStackTrace(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static Disguise[] getSavedDisguises(UUID entityUUID) { | ||||||
|  |         return getSavedDisguises(entityUUID, false); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static Disguise[] getSavedDisguises(UUID entityUUID, boolean remove) { | ||||||
|  |         if (isSavedDisguise(entityUUID)) | ||||||
|  |             return new Disguise[0]; | ||||||
|  |  | ||||||
|  |         String cached = savedDisguises.getString(entityUUID.toString()); | ||||||
|  |  | ||||||
|  |         if (cached == null) { | ||||||
|  |             cachedNames.remove(entityUUID.toString()); | ||||||
|  |             return new Disguise[0]; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         try { | ||||||
|  |             ObjectInputStream outputStream = new ObjectInputStream(new ByteArrayInputStream(cached.getBytes())); | ||||||
|  |  | ||||||
|  |             Disguise[] toReturn = (Disguise[]) outputStream.readObject(); | ||||||
|  |  | ||||||
|  |             if (remove) { | ||||||
|  |                 removeSavedDisguise(entityUUID); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return toReturn; | ||||||
|  |         } | ||||||
|  |         catch (Exception e) { | ||||||
|  |             System.out.println("Error while loading Entity Disguises, malformed config?"); | ||||||
|  |             e.printStackTrace(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return new Disguise[0]; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static void removeSavedDisguise(UUID entityUUID) { | ||||||
|  |         if (!savedDisguiseList.remove(entityUUID)) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|  |         savedDisguises.set(entityUUID.toString(), null); | ||||||
|  |  | ||||||
|  |         try { | ||||||
|  |             savedDisguises.save(new File(libsDisguises.getDataFolder(), "saveddisguises.yml")); | ||||||
|  |         } | ||||||
|  |         catch (IOException e) { | ||||||
|  |             e.printStackTrace(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static boolean isSavedDisguise(UUID entityUUID) { | ||||||
|  |         return savedDisguiseList.contains(entityUUID); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public static boolean addClonedDisguise(String key, Disguise disguise) { |     public static boolean addClonedDisguise(String key, Disguise disguise) { | ||||||
|         if (DisguiseConfig.getMaxClonedDisguises() > 0) { |         if (DisguiseConfig.getMaxClonedDisguises() > 0) { | ||||||
|             if (clonedDisguises.containsKey(key)) { |             if (clonedDisguises.containsKey(key)) { | ||||||
| @@ -250,8 +329,21 @@ public class DisguiseUtilities { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static void addGameProfile(String string, WrappedGameProfile gameProfile) { |     public static void addGameProfile(String string, WrappedGameProfile gameProfile) { | ||||||
|         getGameProfiles().put(string, gameProfile); |         try { | ||||||
|         getAddedByPlugins().add(string.toLowerCase()); |             ByteArrayOutputStream bytes = new ByteArrayOutputStream(); | ||||||
|  |             ObjectOutputStream obj = new ObjectOutputStream(bytes); | ||||||
|  |             obj.writeObject(new WrappedProfile(gameProfile)); | ||||||
|  |  | ||||||
|  |             gameProfileCache.set(string.toLowerCase(), new String(bytes.toByteArray())); | ||||||
|  |             cachedNames.add(string.toLowerCase()); | ||||||
|  |  | ||||||
|  |             if (DisguiseConfig.isSaveCache()) { | ||||||
|  |                 gameProfileCache.save(new File(libsDisguises.getDataFolder(), "cache.yml")); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         catch (Exception ex) { | ||||||
|  |             ex.printStackTrace(); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -388,10 +480,6 @@ public class DisguiseUtilities { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static HashSet<String> getAddedByPlugins() { |  | ||||||
|         return addedByPlugins; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public static int getChunkCord(int blockCord) { |     public static int getChunkCord(int blockCord) { | ||||||
|         int cord = (int) Math.floor(blockCord / 16D) - 17; |         int cord = (int) Math.floor(blockCord / 16D) - 17; | ||||||
|  |  | ||||||
| @@ -511,11 +599,26 @@ public class DisguiseUtilities { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static WrappedGameProfile getGameProfile(String playerName) { |     public static WrappedGameProfile getGameProfile(String playerName) { | ||||||
|         return gameProfiles.get(playerName.toLowerCase()); |         if (!cachedNames.contains(playerName.toLowerCase())) | ||||||
|     } |             return null; | ||||||
|  |  | ||||||
|     public static HashMap<String, WrappedGameProfile> getGameProfiles() { |         String cached = gameProfileCache.getString(playerName.toLowerCase()); | ||||||
|         return gameProfiles; |  | ||||||
|  |         if (cached == null) { | ||||||
|  |             cachedNames.remove(playerName.toLowerCase()); | ||||||
|  |             return null; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         try { | ||||||
|  |             ObjectInputStream outputStream = new ObjectInputStream(new ByteArrayInputStream(cached.getBytes())); | ||||||
|  |  | ||||||
|  |             return ((WrappedProfile) outputStream.readObject()).getProfile(); | ||||||
|  |         } | ||||||
|  |         catch (Exception e) { | ||||||
|  |             e.printStackTrace(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return null; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static TargetedDisguise getMainDisguise(UUID entityId) { |     public static TargetedDisguise getMainDisguise(UUID entityId) { | ||||||
| @@ -577,18 +680,13 @@ public class DisguiseUtilities { | |||||||
|     public static WrappedGameProfile getProfileFromMojang(final PlayerDisguise disguise) { |     public static WrappedGameProfile getProfileFromMojang(final PlayerDisguise disguise) { | ||||||
|         final String nameToFetch = disguise.getSkin() != null ? disguise.getSkin() : disguise.getName(); |         final String nameToFetch = disguise.getSkin() != null ? disguise.getSkin() : disguise.getName(); | ||||||
|  |  | ||||||
|         final boolean remove = getAddedByPlugins().contains(nameToFetch.toLowerCase()); |  | ||||||
|  |  | ||||||
|         return getProfileFromMojang(nameToFetch, new LibsProfileLookup() { |         return getProfileFromMojang(nameToFetch, new LibsProfileLookup() { | ||||||
|  |  | ||||||
|             @Override |             @Override | ||||||
|             public void onLookup(WrappedGameProfile gameProfile) { |             public void onLookup(WrappedGameProfile gameProfile) { | ||||||
|                 if (remove) { |  | ||||||
|                     getAddedByPlugins().remove(nameToFetch.toLowerCase()); |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 if (DisguiseAPI.isDisguiseInUse(disguise) && (!gameProfile.getName().equals( |                 if (DisguiseAPI.isDisguiseInUse(disguise) && (!gameProfile.getName().equals( | ||||||
|                         disguise.getSkin() != null ? disguise.getSkin() : disguise.getName()) || !gameProfile.getProperties().isEmpty())) { |                         disguise.getSkin() != null ? disguise.getSkin() : | ||||||
|  |                                 disguise.getName()) || !gameProfile.getProperties().isEmpty())) { | ||||||
|                     disguise.setGameProfile(gameProfile); |                     disguise.setGameProfile(gameProfile); | ||||||
|  |  | ||||||
|                     DisguiseUtilities.refreshTrackers(disguise); |                     DisguiseUtilities.refreshTrackers(disguise); | ||||||
| @@ -634,37 +732,22 @@ public class DisguiseUtilities { | |||||||
|             boolean contactMojang) { |             boolean contactMojang) { | ||||||
|         final String playerName = origName.toLowerCase(); |         final String playerName = origName.toLowerCase(); | ||||||
|  |  | ||||||
|         if (gameProfiles.containsKey(playerName)) { |         if (cachedNames.contains(playerName)) { | ||||||
|             if (gameProfiles.get(playerName) != null) { |             return getGameProfile(playerName); | ||||||
|                 return gameProfiles.get(playerName); |  | ||||||
|             } |  | ||||||
|         } else if (Pattern.matches("([A-Za-z0-9_]){1,16}", origName)) { |         } else if (Pattern.matches("([A-Za-z0-9_]){1,16}", origName)) { | ||||||
|             getAddedByPlugins().add(playerName); |             final Player player = Bukkit.getPlayerExact(playerName); | ||||||
|  |  | ||||||
|             Player player = Bukkit.getPlayerExact(playerName); |  | ||||||
|  |  | ||||||
|             if (player != null) { |             if (player != null) { | ||||||
|                 WrappedGameProfile gameProfile = ReflectionManager.getGameProfile(player); |                 WrappedGameProfile gameProfile = ReflectionManager.getGameProfile(player); | ||||||
|  |  | ||||||
|                 if (!gameProfile.getProperties().isEmpty()) { |                 if (!gameProfile.getProperties().isEmpty()) { | ||||||
|                     gameProfiles.put(playerName, gameProfile); |                     addGameProfile(playerName, gameProfile); | ||||||
|  |  | ||||||
|                     return gameProfile; |                     return gameProfile; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             if (runnable != null && (contactMojang || gameProfiles.containsKey(playerName))) { |             if (contactMojang && !runnables.containsKey(playerName)) { | ||||||
|                 if (!runnables.containsKey(playerName)) { |  | ||||||
|                     runnables.put(playerName, new ArrayList<>()); |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 runnables.get(playerName).add(runnable); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             if (contactMojang) { |  | ||||||
|                 // Add null so that if this is called again. I already know I'm doing something about it |  | ||||||
|                 gameProfiles.put(playerName, null); |  | ||||||
|  |  | ||||||
|                 Bukkit.getScheduler().runTaskAsynchronously(libsDisguises, new Runnable() { |                 Bukkit.getScheduler().runTaskAsynchronously(libsDisguises, new Runnable() { | ||||||
|                     @Override |                     @Override | ||||||
|                     public void run() { |                     public void run() { | ||||||
| @@ -678,9 +761,7 @@ public class DisguiseUtilities { | |||||||
|                                         return; |                                         return; | ||||||
|                                     } |                                     } | ||||||
|  |  | ||||||
|                                     if (gameProfiles.containsKey(playerName) && gameProfiles.get(playerName) == null) { |                                     addGameProfile(playerName, gameProfile); | ||||||
|                                         gameProfiles.put(playerName, gameProfile); |  | ||||||
|                                     } |  | ||||||
|  |  | ||||||
|                                     if (runnables.containsKey(playerName)) { |                                     if (runnables.containsKey(playerName)) { | ||||||
|                                         for (Object obj : runnables.remove(playerName)) { |                                         for (Object obj : runnables.remove(playerName)) { | ||||||
| @@ -695,10 +776,7 @@ public class DisguiseUtilities { | |||||||
|                             }); |                             }); | ||||||
|                         } |                         } | ||||||
|                         catch (Exception e) { |                         catch (Exception e) { | ||||||
|                             if (gameProfiles.containsKey(playerName) && gameProfiles.get(playerName) == null) { |                             runnables.remove(playerName); | ||||||
|                                 gameProfiles.remove(playerName); |  | ||||||
|                                 getAddedByPlugins().remove(playerName); |  | ||||||
|                             } |  | ||||||
|  |  | ||||||
|                             System.out.print( |                             System.out.print( | ||||||
|                                     "[LibsDisguises] Error when fetching " + playerName + "'s uuid from mojang: " + e.getMessage()); |                                     "[LibsDisguises] Error when fetching " + playerName + "'s uuid from mojang: " + e.getMessage()); | ||||||
| @@ -706,6 +784,14 @@ public class DisguiseUtilities { | |||||||
|                     } |                     } | ||||||
|                 }); |                 }); | ||||||
|  |  | ||||||
|  |                 if (runnable != null && contactMojang) { | ||||||
|  |                     if (!runnables.containsKey(playerName)) { | ||||||
|  |                         runnables.put(playerName, new ArrayList<>()); | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                     runnables.get(playerName).add(runnable); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 return null; |                 return null; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -740,6 +826,16 @@ public class DisguiseUtilities { | |||||||
|  |  | ||||||
|     public static void init(LibsDisguises disguises) { |     public static void init(LibsDisguises disguises) { | ||||||
|         libsDisguises = disguises; |         libsDisguises = disguises; | ||||||
|  |  | ||||||
|  |         gameProfileCache = YamlConfiguration.loadConfiguration(new File(disguises.getDataFolder(), "cache.yml")); | ||||||
|  |  | ||||||
|  |         cachedNames.addAll(gameProfileCache.getKeys(false)); | ||||||
|  |  | ||||||
|  |         savedDisguises = YamlConfiguration.loadConfiguration(new File(disguises.getDataFolder(), "saveddisguises.yml")); | ||||||
|  |  | ||||||
|  |         for (String key : savedDisguises.getKeys(false)) { | ||||||
|  |             savedDisguiseList.add(UUID.fromString(key)); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static boolean isDisguiseInUse(Disguise disguise) { |     public static boolean isDisguiseInUse(Disguise disguise) { | ||||||
| @@ -809,7 +905,7 @@ public class DisguiseUtilities { | |||||||
|                 for (final Object p : trackedPlayers) { |                 for (final Object p : trackedPlayers) { | ||||||
|                     Player pl = (Player) ReflectionManager.getBukkitEntity(p); |                     Player pl = (Player) ReflectionManager.getBukkitEntity(p); | ||||||
|  |  | ||||||
|                     if (!player.equalsIgnoreCase((pl).getName())) |                     if (pl == null || !player.equalsIgnoreCase((pl).getName())) | ||||||
|                         continue; |                         continue; | ||||||
|  |  | ||||||
|                     clear.invoke(entityTrackerEntry, p); |                     clear.invoke(entityTrackerEntry, p); | ||||||
| @@ -991,7 +1087,17 @@ public class DisguiseUtilities { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static void removeGameProfile(String string) { |     public static void removeGameProfile(String string) { | ||||||
|         gameProfiles.remove(string.toLowerCase()); |         cachedNames.remove(string.toLowerCase()); | ||||||
|  |         gameProfileCache.set(string.toLowerCase(), null); | ||||||
|  |  | ||||||
|  |         if (DisguiseConfig.isSaveCache()) { | ||||||
|  |             try { | ||||||
|  |                 gameProfileCache.save(new File(libsDisguises.getDataFolder(), "cache.yml")); | ||||||
|  |             } | ||||||
|  |             catch (IOException e) { | ||||||
|  |                 e.printStackTrace(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static void removeSelfDisguise(Player player) { |     public static void removeSelfDisguise(Player player) { | ||||||
|   | |||||||
| @@ -297,15 +297,6 @@ public class PacketsManager { | |||||||
|  |  | ||||||
|             String name = playerDisguise.getName(); |             String name = playerDisguise.getName(); | ||||||
|             int entityId = disguisedEntity.getEntityId(); |             int entityId = disguisedEntity.getEntityId(); | ||||||
|             boolean removeName = false; |  | ||||||
|  |  | ||||||
|             if (!DisguiseUtilities.hasGameProfile(name)) { |  | ||||||
|                 removeName = !DisguiseUtilities.getAddedByPlugins().contains(name); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             if (removeName) { |  | ||||||
|                 DisguiseUtilities.getAddedByPlugins().remove(name); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             // Send player info along with the disguise |             // Send player info along with the disguise | ||||||
|             PacketContainer sendTab = new PacketContainer(Server.PLAYER_INFO); |             PacketContainer sendTab = new PacketContainer(Server.PLAYER_INFO); | ||||||
|   | |||||||
| @@ -627,10 +627,6 @@ public class ReflectionManager { | |||||||
|         return null; |         return null; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static void removePlayer(Player player) { |  | ||||||
|         // Some future remove code if needed |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public static void setBoundingBox(Entity entity, FakeBoundingBox newBox) { |     public static void setBoundingBox(Entity entity, FakeBoundingBox newBox) { | ||||||
|         try { |         try { | ||||||
|             Location loc = entity.getLocation(); |             Location loc = entity.getLocation(); | ||||||
| @@ -888,15 +884,18 @@ public class ReflectionManager { | |||||||
|         if (value instanceof Optional) { |         if (value instanceof Optional) { | ||||||
|             Optional opt = (Optional) value; |             Optional opt = (Optional) value; | ||||||
|  |  | ||||||
|             serializer = Registry.get((opt.isPresent() ? getNmsClass("IBlockData").isInstance(opt.get()) ? getNmsClass( |             serializer = Registry.get((opt.isPresent() ? | ||||||
|                     "IBlockData") : opt.get().getClass() : UUID.class), true); |                     getNmsClass("IBlockData").isInstance(opt.get()) ? getNmsClass("IBlockData") : opt.get().getClass() : | ||||||
|  |                     UUID.class), true); | ||||||
|         } else { |         } else { | ||||||
|             serializer = Registry.get(value.getClass()); |             serializer = Registry.get(value.getClass()); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (serializer == null) { |         if (serializer == null) { | ||||||
|             throw new IllegalArgumentException( |             throw new IllegalArgumentException("Unable to find Serializer for " + value + ( | ||||||
|                     "Unable to find Serializer for " + value + (value instanceof Optional && ((Optional) value).isPresent() ? " (" + ((Optional) value).get().getClass().getName() + ")" : "") + "! Are you running the latest version of ProtocolLib?"); |                     value instanceof Optional && ((Optional) value).isPresent() ? | ||||||
|  |                             " (" + ((Optional) value).get().getClass().getName() + ")" : | ||||||
|  |                             "") + "! Are you running the latest version of ProtocolLib?"); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         WrappedDataWatcherObject watcherObject = new WrappedDataWatcherObject(id, serializer); |         WrappedDataWatcherObject watcherObject = new WrappedDataWatcherObject(id, serializer); | ||||||
|   | |||||||
							
								
								
									
										48
									
								
								src/me/libraryaddict/disguise/utilities/WrappedProfile.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/me/libraryaddict/disguise/utilities/WrappedProfile.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | |||||||
|  | package me.libraryaddict.disguise.utilities; | ||||||
|  |  | ||||||
|  | import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||||
|  | import com.comphenix.protocol.wrappers.WrappedSignedProperty; | ||||||
|  |  | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.io.Serializable; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.UUID; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Created by libraryaddict on 15/05/2017. | ||||||
|  |  */ | ||||||
|  | public class WrappedProfile implements Serializable { | ||||||
|  |     private WrappedGameProfile profile; | ||||||
|  |  | ||||||
|  |     public WrappedProfile(WrappedGameProfile profile) { | ||||||
|  |         this.profile = profile; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public WrappedGameProfile getProfile() { | ||||||
|  |         return profile; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void writeObject(java.io.ObjectOutputStream out) throws IOException { | ||||||
|  |         out.writeObject(profile.getUUID()); | ||||||
|  |         out.writeObject(profile.getName()); | ||||||
|  |         out.writeByte(profile.getProperties().size()); | ||||||
|  |  | ||||||
|  |         for (Map.Entry<String, WrappedSignedProperty> entry : profile.getProperties().entries()) { | ||||||
|  |             WrappedSignedProperty property = entry.getValue(); | ||||||
|  |  | ||||||
|  |             out.writeUTF(entry.getKey()); | ||||||
|  |             out.writeUTF(property.getName()); | ||||||
|  |             out.writeUTF(property.getSignature()); | ||||||
|  |             out.writeUTF(property.getValue()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { | ||||||
|  |         profile = new WrappedGameProfile((UUID) in.readObject(), in.readUTF()); | ||||||
|  |  | ||||||
|  |         for (int i = in.readByte(); i > 0; i--) { | ||||||
|  |             profile.getProperties().put(in.readUTF(), | ||||||
|  |                     new WrappedSignedProperty(in.readUTF(), in.readUTF(), in.readUTF())); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user