initial commit
This commit is contained in:
		
							
								
								
									
										9
									
								
								.idea/ant.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								.idea/ant.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <project version="4"> | ||||||
|  |   <component name="AntConfiguration"> | ||||||
|  |     <buildFile url="file://$PROJECT_DIR$/ant_build_increment.xml"> | ||||||
|  |       <executeOn event="afterCompilation" target="end" /> | ||||||
|  |       <executeOn event="beforeCompilation" target="init" /> | ||||||
|  |     </buildFile> | ||||||
|  |   </component> | ||||||
|  | </project> | ||||||
							
								
								
									
										9
									
								
								.idea/artifacts/Spigot_Complete_Plugin__Debugger__Listener__CommandExecutor__jar.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								.idea/artifacts/Spigot_Complete_Plugin__Debugger__Listener__CommandExecutor__jar.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | <component name="ArtifactManager"> | ||||||
|  |   <artifact type="jar" name="Spigot Complete Plugin (Debugger, Listener, CommandExecutor):jar"> | ||||||
|  |     <output-path>D:/Coding/# Server per Test Plugins #/plugins</output-path> | ||||||
|  |     <root id="archive" name="lasergun.jar"> | ||||||
|  |       <element id="module-output" name="LaserGun" /> | ||||||
|  |       <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar" path-in-jar="/" /> | ||||||
|  |     </root> | ||||||
|  |   </artifact> | ||||||
|  | </component> | ||||||
							
								
								
									
										0
									
								
								.idea/description.html
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								.idea/description.html
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
								
								
									
										11
									
								
								.idea/dictionaries/Lorenzo.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								.idea/dictionaries/Lorenzo.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | <component name="ProjectDictionaryState"> | ||||||
|  |   <dictionary name="Lorenzo"> | ||||||
|  |     <words> | ||||||
|  |       <w>bukkit</w> | ||||||
|  |       <w>bungeecord</w> | ||||||
|  |       <w>lasergun</w> | ||||||
|  |       <w>textcomponent</w> | ||||||
|  |       <w>yamls</w> | ||||||
|  |     </words> | ||||||
|  |   </dictionary> | ||||||
|  | </component> | ||||||
							
								
								
									
										6
									
								
								.idea/encodings.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.idea/encodings.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <project version="4"> | ||||||
|  |   <component name="Encoding"> | ||||||
|  |     <file url="PROJECT" charset="UTF-8" /> | ||||||
|  |   </component> | ||||||
|  | </project> | ||||||
							
								
								
									
										6
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <project version="4"> | ||||||
|  |   <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> | ||||||
|  |     <output url="file://$PROJECT_DIR$/out" /> | ||||||
|  |   </component> | ||||||
|  | </project> | ||||||
							
								
								
									
										8
									
								
								.idea/modules.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.idea/modules.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <project version="4"> | ||||||
|  |   <component name="ProjectModuleManager"> | ||||||
|  |     <modules> | ||||||
|  |       <module fileurl="file://$PROJECT_DIR$/LaserGun.iml" filepath="$PROJECT_DIR$/LaserGun.iml" /> | ||||||
|  |     </modules> | ||||||
|  |   </component> | ||||||
|  | </project> | ||||||
							
								
								
									
										3
									
								
								.idea/project-template.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.idea/project-template.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | <template> | ||||||
|  |   <input-field default="net.mindoverflow.pluginpackage">IJ_BASE_PACKAGE</input-field> | ||||||
|  | </template> | ||||||
							
								
								
									
										5
									
								
								.idea/template-meta.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								.idea/template-meta.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | <template unencoded="false"> | ||||||
|  |   <roots> | ||||||
|  |     <root index="0" path="" /> | ||||||
|  |   </roots> | ||||||
|  | </template> | ||||||
							
								
								
									
										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> | ||||||
							
								
								
									
										80
									
								
								.idea/workspace.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								.idea/workspace.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <project version="4"> | ||||||
|  |   <component name="ArtifactsWorkspaceSettings"> | ||||||
|  |     <artifacts-to-build> | ||||||
|  |       <artifact name="Spigot Complete Plugin (Debugger, Listener, CommandExecutor):jar" /> | ||||||
|  |     </artifacts-to-build> | ||||||
|  |   </component> | ||||||
|  |   <component name="ChangeListManager"> | ||||||
|  |     <list default="true" id="89416e2e-2c77-406b-b1ba-832a73db08e5" name="Default Changelist" comment="" /> | ||||||
|  |     <option name="SHOW_DIALOG" value="false" /> | ||||||
|  |     <option name="HIGHLIGHT_CONFLICTS" value="true" /> | ||||||
|  |     <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> | ||||||
|  |     <option name="LAST_RESOLUTION" value="IGNORE" /> | ||||||
|  |   </component> | ||||||
|  |   <component name="FileTemplateManagerImpl"> | ||||||
|  |     <option name="RECENT_TEMPLATES"> | ||||||
|  |       <list> | ||||||
|  |         <option value="Class" /> | ||||||
|  |       </list> | ||||||
|  |     </option> | ||||||
|  |   </component> | ||||||
|  |   <component name="ProjectId" id="1WtCBtrdbQ7L1kO8DRxBrBxDqoC" /> | ||||||
|  |   <component name="ProjectViewState"> | ||||||
|  |     <option name="hideEmptyMiddlePackages" value="true" /> | ||||||
|  |     <option name="showExcludedFiles" value="true" /> | ||||||
|  |     <option name="showLibraryContents" value="true" /> | ||||||
|  |   </component> | ||||||
|  |   <component name="PropertiesComponent"> | ||||||
|  |     <property name="GenerateAntBuildDialog.backupFiles" value="true" /> | ||||||
|  |     <property name="GenerateAntBuildDialog.enableUiFormCompile" value="true" /> | ||||||
|  |     <property name="GenerateAntBuildDialog.forceTargetJdk" value="true" /> | ||||||
|  |     <property name="GenerateAntBuildDialog.outputFileNameProperty" value="lasergun" /> | ||||||
|  |     <property name="last_opened_file_path" value="$PROJECT_DIR$/../../../spigot-1.14.4.jar!/" /> | ||||||
|  |     <property name="project.structure.last.edited" value="Modules" /> | ||||||
|  |     <property name="project.structure.proportion" value="0.15" /> | ||||||
|  |     <property name="project.structure.side.proportion" value="0.2" /> | ||||||
|  |   </component> | ||||||
|  |   <component name="SvnConfiguration"> | ||||||
|  |     <configuration /> | ||||||
|  |   </component> | ||||||
|  |   <component name="TaskManager"> | ||||||
|  |     <task active="true" id="Default" summary="Default task"> | ||||||
|  |       <changelist id="89416e2e-2c77-406b-b1ba-832a73db08e5" name="Default Changelist" comment="" /> | ||||||
|  |       <created>1579959371190</created> | ||||||
|  |       <option name="number" value="Default" /> | ||||||
|  |       <option name="presentableId" value="Default" /> | ||||||
|  |       <updated>1579959371190</updated> | ||||||
|  |     </task> | ||||||
|  |     <servers /> | ||||||
|  |   </component> | ||||||
|  |   <component name="WindowStateProjectService"> | ||||||
|  |     <state x="873" y="359" key="#Project_Structure" timestamp="1584407966734"> | ||||||
|  |       <screen x="0" y="0" width="2560" height="1400" /> | ||||||
|  |     </state> | ||||||
|  |     <state x="873" y="359" key="#Project_Structure/0.0.2560.1400/3840.1065.1600.860@0.0.2560.1400" timestamp="1579970197122" /> | ||||||
|  |     <state x="873" y="359" key="#Project_Structure/3840.1065.1600.840/-1360.1191.1360.728/0.0.2560.1400@0.0.2560.1400" timestamp="1584407966734" /> | ||||||
|  |     <state x="1086" y="404" key="#com.intellij.ide.util.MemberChooser" timestamp="1579975786283"> | ||||||
|  |       <screen x="0" y="0" width="2560" height="1400" /> | ||||||
|  |     </state> | ||||||
|  |     <state x="1086" y="404" key="#com.intellij.ide.util.MemberChooser/0.0.2560.1400/3840.1065.1600.860@0.0.2560.1400" timestamp="1579975786283" /> | ||||||
|  |     <state x="721" y="0" key="#com.intellij.refactoring.rename.AutomaticRenamingDialog" timestamp="1579959743873"> | ||||||
|  |       <screen x="0" y="0" width="2560" height="1400" /> | ||||||
|  |     </state> | ||||||
|  |     <state x="721" y="0" key="#com.intellij.refactoring.rename.AutomaticRenamingDialog/0.0.2560.1400/3840.1065.1600.860@0.0.2560.1400" timestamp="1579959743873" /> | ||||||
|  |     <state x="1011" y="446" key="#com.intellij.refactoring.safeDelete.UnsafeUsagesDialog" timestamp="1580576147910"> | ||||||
|  |       <screen x="0" y="0" width="2560" height="1400" /> | ||||||
|  |     </state> | ||||||
|  |     <state x="1011" y="446" key="#com.intellij.refactoring.safeDelete.UnsafeUsagesDialog/0.0.2560.1400/3840.1065.1600.860@0.0.2560.1400" timestamp="1579973457686" /> | ||||||
|  |     <state x="1011" y="446" key="#com.intellij.refactoring.safeDelete.UnsafeUsagesDialog/3840.1065.1600.840/-1360.1191.1360.728/0.0.2560.1400@0.0.2560.1400" timestamp="1580576147910" /> | ||||||
|  |     <state x="1035" y="403" key="DetectedRootsChooserDialog" timestamp="1584407120941"> | ||||||
|  |       <screen x="0" y="0" width="2560" height="1400" /> | ||||||
|  |     </state> | ||||||
|  |     <state x="1035" y="403" key="DetectedRootsChooserDialog/3840.1065.1600.840/-1360.1191.1360.728/0.0.2560.1400@0.0.2560.1400" timestamp="1584407120941" /> | ||||||
|  |     <state x="967" y="441" key="FileChooserDialogImpl" timestamp="1584407941660"> | ||||||
|  |       <screen x="0" y="0" width="2560" height="1400" /> | ||||||
|  |     </state> | ||||||
|  |     <state x="967" y="441" key="FileChooserDialogImpl/0.0.2560.1400/3840.1065.1600.860@0.0.2560.1400" timestamp="1579972638166" /> | ||||||
|  |     <state x="967" y="441" key="FileChooserDialogImpl/3840.1065.1600.840/-1360.1191.1360.728/0.0.2560.1400@0.0.2560.1400" timestamp="1584407941660" /> | ||||||
|  |   </component> | ||||||
|  | </project> | ||||||
							
								
								
									
										40
									
								
								LaserGun.iml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								LaserGun.iml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <module type="JAVA_MODULE" version="4"> | ||||||
|  |   <component name="NewModuleRootManager" inherit-compiler-output="true"> | ||||||
|  |     <exclude-output /> | ||||||
|  |     <content url="file://$MODULE_DIR$"> | ||||||
|  |       <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /> | ||||||
|  |     </content> | ||||||
|  |     <orderEntry type="inheritedJdk" /> | ||||||
|  |     <orderEntry type="sourceFolder" forTests="false" /> | ||||||
|  |     <orderEntry type="module-library"> | ||||||
|  |       <library> | ||||||
|  |         <CLASSES> | ||||||
|  |           <root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar!/" /> | ||||||
|  |         </CLASSES> | ||||||
|  |         <JAVADOC /> | ||||||
|  |         <SOURCES /> | ||||||
|  |       </library> | ||||||
|  |     </orderEntry> | ||||||
|  |     <orderEntry type="module-library" scope="PROVIDED"> | ||||||
|  |       <library> | ||||||
|  |         <CLASSES> | ||||||
|  |           <root url="jar://$MODULE_DIR$/../../../ProtocolLib.jar!/" /> | ||||||
|  |         </CLASSES> | ||||||
|  |         <JAVADOC /> | ||||||
|  |         <SOURCES /> | ||||||
|  |       </library> | ||||||
|  |     </orderEntry> | ||||||
|  |     <orderEntry type="module-library" scope="PROVIDED"> | ||||||
|  |       <library> | ||||||
|  |         <CLASSES> | ||||||
|  |           <root url="jar://$MODULE_DIR$/../../../spigot-1.14.4.jar!/" /> | ||||||
|  |         </CLASSES> | ||||||
|  |         <JAVADOC /> | ||||||
|  |         <SOURCES> | ||||||
|  |           <root url="jar://$MODULE_DIR$/../../../spigot-1.14.4.jar!/" /> | ||||||
|  |         </SOURCES> | ||||||
|  |       </library> | ||||||
|  |     </orderEntry> | ||||||
|  |   </component> | ||||||
|  | </module> | ||||||
							
								
								
									
										38
									
								
								ant_build_increment.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								ant_build_increment.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | <project name="BuildIncrement" default="init" basedir="."> | ||||||
|  |     <description> | ||||||
|  |         simple example increment build variable | ||||||
|  |     </description> | ||||||
|  |   <!-- set global properties for this build --> | ||||||
|  |   <property name="src" location="src"/> | ||||||
|  |     <property name="version" value="0.0"/> | ||||||
|  | 	<loadproperties> | ||||||
|  | 		<file file="build.number"/>	 | ||||||
|  | 	</loadproperties> | ||||||
|  |  | ||||||
|  |   <target name="init"> | ||||||
|  |     <echo file="ant_buildversion_init.txt">Changing build version from BUILD_VERSION to ${version}.${build.number} in file plugin.yml...</echo> | ||||||
|  |  | ||||||
|  |     <replaceregexp file="${src}/plugin.yml" | ||||||
|  |                match="BUILD_NUMBER" | ||||||
|  |                replace="${version}.${build.number}" | ||||||
|  |                byline="true" | ||||||
|  |     /> | ||||||
|  |     <echo file="ant_buildversion_init.txt">Changed!</echo> | ||||||
|  |  | ||||||
|  |   </target> | ||||||
|  |    | ||||||
|  |    | ||||||
|  |   <target name="end"> | ||||||
|  |     <echo file="ant_buildversion_end.txt">Changing back build version ${version}.${build.number} in file plugin.yml to BUILD_VERSION...</echo> | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  |     <replaceregexp file="${src}/plugin.yml" | ||||||
|  |                match="${version}.${build.number}" | ||||||
|  |                replace="BUILD_NUMBER" | ||||||
|  |                byline="true" | ||||||
|  |     /> | ||||||
|  |     <buildnumber/> | ||||||
|  |     <echo file="ant_buildversion_init.txt">Changed!</echo> | ||||||
|  |  | ||||||
|  |   </target> | ||||||
|  | </project> | ||||||
							
								
								
									
										1
									
								
								ant_buildversion_end.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								ant_buildversion_end.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | Changing back build version 0.0.153 in file plugin.yml to BUILD_VERSION... | ||||||
							
								
								
									
										1
									
								
								ant_buildversion_init.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								ant_buildversion_init.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | Changed! | ||||||
							
								
								
									
										5
									
								
								build.number
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								build.number
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | #Build Number for ANT. Do not edit! | ||||||
|  | #Tue Mar 17 02:22:36 CET 2020 | ||||||
|  | \#Build=Number for ANT. Do not edit\! | ||||||
|  | build.number=154 | ||||||
|  | \#Tue=Jul 30 16\:09\:09 CEST 2019 | ||||||
							
								
								
									
										4
									
								
								src/config.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								src/config.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | radius: 10 | ||||||
|  | damage: 6.0 | ||||||
|  | sound: true | ||||||
|  | update-checker: true | ||||||
							
								
								
									
										6
									
								
								src/lang.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/lang.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | error: | ||||||
|  |   console_access_blocked: '&cSorry, but this command is not available via console.' | ||||||
|  |   no_permissions: '&cYou do not have permissions!' | ||||||
|  | info: | ||||||
|  |   lasergun_name: '&6&lLaser Gun' | ||||||
|  |   lasergun_lore: '&eUse this gun to shoot other players!' | ||||||
							
								
								
									
										124
									
								
								src/net/mindoverflow/lasergun/LaserGun.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								src/net/mindoverflow/lasergun/LaserGun.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | |||||||
|  | package net.mindoverflow.lasergun; | ||||||
|  |  | ||||||
|  | import com.comphenix.protocol.PacketType; | ||||||
|  | import com.comphenix.protocol.ProtocolLibrary; | ||||||
|  | import com.comphenix.protocol.ProtocolManager; | ||||||
|  | import com.comphenix.protocol.events.ListenerPriority; | ||||||
|  | import com.comphenix.protocol.events.PacketAdapter; | ||||||
|  | import com.comphenix.protocol.events.PacketContainer; | ||||||
|  | import com.comphenix.protocol.events.PacketEvent; | ||||||
|  | import com.comphenix.protocol.wrappers.WrappedDataWatcher; | ||||||
|  | import com.comphenix.protocol.wrappers.WrappedWatchableObject; | ||||||
|  | import net.mindoverflow.lasergun.commands.LaserGunCommand; | ||||||
|  | import net.mindoverflow.lasergun.completers.InfoCompleter; | ||||||
|  | import net.mindoverflow.lasergun.listeners.*; | ||||||
|  | import net.mindoverflow.lasergun.utils.Debugger; | ||||||
|  | import net.mindoverflow.lasergun.utils.FileUtils; | ||||||
|  | import net.mindoverflow.lasergun.utils.MessageUtils; | ||||||
|  | import net.mindoverflow.lasergun.utils.stats.UpdateChecker; | ||||||
|  | import org.bukkit.command.CommandSender; | ||||||
|  | import org.bukkit.plugin.PluginManager; | ||||||
|  | import org.bukkit.plugin.java.JavaPlugin; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.logging.Level; | ||||||
|  | import java.util.logging.Logger; | ||||||
|  |  | ||||||
|  | public class LaserGun extends JavaPlugin | ||||||
|  | { | ||||||
|  |     // Instantiate a Debugger for this class. | ||||||
|  |     private Debugger debugger = new Debugger(getClass().getName()); | ||||||
|  |  | ||||||
|  |     // Initializing needed variables. | ||||||
|  |     public static Logger logger; | ||||||
|  |     private PluginManager pluginManager; | ||||||
|  |     public ProtocolManager protocolManager; | ||||||
|  |     public UpdateChecker updateChecker; | ||||||
|  |  | ||||||
|  |     // Method called when the plugin is being loaded. | ||||||
|  |     @Override | ||||||
|  |     public void onEnable() | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |         // Give the initialized variables their respective values. Absolutely don't do this before as they will look good in the IDE but will result null. | ||||||
|  |         logger = getLogger(); | ||||||
|  |         pluginManager = getServer().getPluginManager(); | ||||||
|  |  | ||||||
|  |         // Check and report if the Debugger is enabled (the method itself does the checking). Would do it before but we need the logger to be initialized! :( | ||||||
|  |         debugger.sendDebugMessage(Level.WARNING, "---[ DEBUGGER IS ENABLED! ]---"); | ||||||
|  |         debugger.sendDebugMessage(Level.WARNING, "---[ INITIALIZING PLUGIN ]---"); | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Logger and PluginManager already initialized."); | ||||||
|  |  | ||||||
|  |         // Register instances and give them the plugin parameter (this, because this class is the JavaPlugin) so they can access all of its info. | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Instantiating some classes that need to access to plugin data..."); | ||||||
|  |         FileUtils fileUtilsInstance = new FileUtils(this); | ||||||
|  |         PlayerJoinListener playerJoinListenerInstance = new PlayerJoinListener(this); | ||||||
|  |         LaserGunCommand laserGunCommandInstance = new LaserGunCommand(this); | ||||||
|  |         MessageUtils messageUtils = new MessageUtils(this); | ||||||
|  |         updateChecker = new UpdateChecker(this); | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Done instantiating classes!"); | ||||||
|  |  | ||||||
|  |         // Register Listeners | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Registering listeners..."); | ||||||
|  |         pluginManager.registerEvents(playerJoinListenerInstance, this); | ||||||
|  |         pluginManager.registerEvents(new PlayerInteractListener(this), this); | ||||||
|  |         pluginManager.registerEvents(new ArrowDamageListener(this), this); | ||||||
|  |         pluginManager.registerEvents(new ArrowHitListener(), this); | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Done registering listeners!"); | ||||||
|  |  | ||||||
|  |         // Register Commands | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Registering commands..."); | ||||||
|  |         getCommand("lasergun").setExecutor(laserGunCommandInstance); | ||||||
|  |         getCommand("lasergun").setTabCompleter(new InfoCompleter()); | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Done registering commands!"); | ||||||
|  |  | ||||||
|  |         // Check if all needed files exist and work correctly, also loading their YAMLs. | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Checking files..."); | ||||||
|  |         FileUtils.checkFiles(); | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Done checking files!"); | ||||||
|  |  | ||||||
|  |         /* | ||||||
|  |         Load all the YAML files. We are already loading them in FileUtils's checkFiles() method but we are loading them singularly. | ||||||
|  |         With this method we are sure that all the files get successfully loaded. Better twice than never... | ||||||
|  |          */ | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Reloading YAML config..."); | ||||||
|  |         FileUtils.reloadYamls(); | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Done!"); | ||||||
|  |  | ||||||
|  |         // Loading ProtocolManager | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Loading ProtocolManager...!"); | ||||||
|  |         if(pluginManager.getPlugin("ProtocolLib") == null) | ||||||
|  |         { | ||||||
|  |             getServer().getScheduler().runTask(this, () -> | ||||||
|  |             { | ||||||
|  |                 CommandSender console = getServer().getConsoleSender(); | ||||||
|  |                 String pluginName = getName(); | ||||||
|  |                 MessageUtils.sendColorizedMessage(console, pluginName + ": &c-------------[ &4" + pluginName + "&c ]-------------"); | ||||||
|  |                 MessageUtils.sendColorizedMessage(console, pluginName + ": &cWARNING! This plugin needs ProtocolLib to work correctly."); | ||||||
|  |                 MessageUtils.sendColorizedMessage(console, pluginName + ": &cThe plugin will now be disabled."); | ||||||
|  |                 MessageUtils.sendColorizedMessage(console, pluginName + ": &cDownload ProtocolLib at: &nhttp://bit.ly/38PMAy3"); | ||||||
|  |                 pluginManager.disablePlugin(this); | ||||||
|  |             }); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         protocolManager = ProtocolLibrary.getProtocolManager(); | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Done!"); | ||||||
|  |  | ||||||
|  |         // Send success output message to console. | ||||||
|  |         logger.log(Level.INFO, "Plugin " + getDescription().getName() + " Successfully Loaded!"); | ||||||
|  |         debugger.sendDebugMessage(Level.WARNING, "---[ INITIALIZATION DONE ]---"); | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Method called when the plugin is being unloaded. | ||||||
|  |     @Override | ||||||
|  |     public void onDisable() { | ||||||
|  |         debugger.sendDebugMessage(Level.WARNING, "---[ DEBUGGER IS ENABLED! ]---"); | ||||||
|  |         debugger.sendDebugMessage(Level.WARNING, "---[ DISABLING PLUGIN ]---"); | ||||||
|  |         logger.log(Level.INFO, "Plugin " + getDescription().getName() + " Successfully Unloaded!"); | ||||||
|  |         debugger.sendDebugMessage(Level.WARNING, "---[ PLUGIN DISABLED ]---"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										79
									
								
								src/net/mindoverflow/lasergun/commands/LaserGunCommand.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								src/net/mindoverflow/lasergun/commands/LaserGunCommand.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | |||||||
|  | package net.mindoverflow.lasergun.commands; | ||||||
|  |  | ||||||
|  | import net.mindoverflow.lasergun.LaserGun; | ||||||
|  | import net.mindoverflow.lasergun.commands.laserguncommands.GetCommand; | ||||||
|  | import net.mindoverflow.lasergun.commands.laserguncommands.HelpCommand; | ||||||
|  | import net.mindoverflow.lasergun.commands.laserguncommands.ReloadCommand; | ||||||
|  | import net.mindoverflow.lasergun.utils.Debugger; | ||||||
|  | import net.mindoverflow.lasergun.utils.MessageUtils; | ||||||
|  | import net.mindoverflow.lasergun.utils.LocalizedMessages; | ||||||
|  | import org.bukkit.command.Command; | ||||||
|  | import org.bukkit.command.CommandExecutor; | ||||||
|  | import org.bukkit.command.CommandSender; | ||||||
|  | import org.bukkit.command.ConsoleCommandSender; | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  |  | ||||||
|  | import java.util.logging.Level; | ||||||
|  |  | ||||||
|  | public class LaserGunCommand implements CommandExecutor | ||||||
|  | { | ||||||
|  |  | ||||||
|  |     // Initialize the plugin variable so we can access all of the plugin's data. | ||||||
|  |     private LaserGun plugin; | ||||||
|  |  | ||||||
|  |     // Initialize the debugger so I can debug the plugin. | ||||||
|  |     private Debugger debugger = new Debugger(getClass().getName()); | ||||||
|  |  | ||||||
|  |     // Constructor to actually give "plugin" a value. | ||||||
|  |     public LaserGunCommand(LaserGun givenPlugin) | ||||||
|  |     { | ||||||
|  |         plugin = givenPlugin; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     // Override the default command. Set the instructions for this particular command (registered in the main class). | ||||||
|  |     @Override | ||||||
|  |     public boolean onCommand(CommandSender commandSender, Command command, String s, String[] args) | ||||||
|  |     { | ||||||
|  |         // Log who is using the command. | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Sender is instance of: " + commandSender.getClass().getName()); | ||||||
|  |  | ||||||
|  |         // If the command comes from Console, give a warning. | ||||||
|  |         boolean senderIsConsole = !(commandSender instanceof Player); | ||||||
|  |  | ||||||
|  |         // Check if there are any args. | ||||||
|  |         if(args.length == 0) | ||||||
|  |         { | ||||||
|  |             MessageUtils.sendColorizedMessage(commandSender, "&7"  + plugin.getName() + " version &6" + plugin.getDescription().getVersion()); | ||||||
|  |             MessageUtils.sendColorizedMessage(commandSender, "&7Coded by &6mind_overflow&7, all rights reserved (&6Copyright © '20&7)."); | ||||||
|  |             commandSender.sendMessage(""); | ||||||
|  |             MessageUtils.sendColorizedMessage(commandSender, "&7Write &6/" + plugin.getName().toLowerCase() + " help&7 to see plugin commands."); | ||||||
|  |         } | ||||||
|  |         // Check if there is a single argument after the command itself. | ||||||
|  |         else if (args.length == 1) | ||||||
|  |         { | ||||||
|  |             // Check if the args are "help" and send help message. | ||||||
|  |             if(args[0].equalsIgnoreCase("help")) { | ||||||
|  |                 HelpCommand.infoCommand(commandSender, plugin); | ||||||
|  |             } | ||||||
|  |             // Check if the args are "reload" and in case, do it. | ||||||
|  |             else if(args[0].equalsIgnoreCase("reload")) | ||||||
|  |             { | ||||||
|  |                 ReloadCommand.reloadCommand(commandSender, plugin); | ||||||
|  |             } | ||||||
|  |             // Check if the args are "textcomponent" and run that command. | ||||||
|  |             else if (args[0].equalsIgnoreCase("get")) | ||||||
|  |             { | ||||||
|  |                 // We do not want the console to receive the item, so we're gonna disable it. | ||||||
|  |                 if(senderIsConsole) | ||||||
|  |                 { | ||||||
|  |                     MessageUtils.sendLocalizedMessage(commandSender, LocalizedMessages.ERROR_CONSOLE_ACCESS_BLOCKED); | ||||||
|  |                     return true; | ||||||
|  |                 } | ||||||
|  |                 GetCommand.getCommand((Player)commandSender); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,51 @@ | |||||||
|  | package net.mindoverflow.lasergun.commands.laserguncommands; | ||||||
|  |  | ||||||
|  | import net.mindoverflow.lasergun.utils.LocalizedMessages; | ||||||
|  | import net.mindoverflow.lasergun.utils.MessageUtils; | ||||||
|  | import net.mindoverflow.lasergun.utils.PermissionUtils; | ||||||
|  | import net.mindoverflow.lasergun.utils.Permissions; | ||||||
|  | import org.bukkit.Material; | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  | import org.bukkit.inventory.ItemStack; | ||||||
|  | import org.bukkit.inventory.meta.ItemMeta; | ||||||
|  |  | ||||||
|  | import java.util.ArrayList; | ||||||
|  |  | ||||||
|  | public class GetCommand | ||||||
|  | { | ||||||
|  |  | ||||||
|  |     public static void getCommand(Player player) | ||||||
|  |     { | ||||||
|  |         if(!PermissionUtils.playerHasPermission(player, Permissions.ITEM_GET)) | ||||||
|  |         { | ||||||
|  |             MessageUtils.sendLocalizedMessage(player, LocalizedMessages.ERROR_NO_PERMISSIONS); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /*Material itemMat; | ||||||
|  |         if(Material.getMaterial("REPEATER") != null) | ||||||
|  |         { | ||||||
|  |             itemMat = Material.getMaterial("REPEATER"); | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             itemMat = Material.getMaterial("REDSTONE_COMPARATOR"); | ||||||
|  |         }*/ | ||||||
|  |  | ||||||
|  |         // Material itemMat = Material.REDSTONE_COMPARATOR; LEGACY! | ||||||
|  |         Material itemMat = Material.REPEATER; | ||||||
|  |         ItemStack lasergunItem = new ItemStack(itemMat); | ||||||
|  |         ItemMeta lasergunIM = lasergunItem.getItemMeta(); | ||||||
|  |  | ||||||
|  |         lasergunIM.setDisplayName(MessageUtils.getLocalizedMessage(LocalizedMessages.LASERGUN_NAME, true)); | ||||||
|  |  | ||||||
|  |         ArrayList<String>lore = new ArrayList<String>(); | ||||||
|  |         lore.add(MessageUtils.getLocalizedMessage(LocalizedMessages.LASERGUN_LORE, true)); | ||||||
|  |         lasergunIM.setLore(lore); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         lasergunItem.setItemMeta(lasergunIM); | ||||||
|  |         player.getInventory().addItem(lasergunItem); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,24 @@ | |||||||
|  | package net.mindoverflow.lasergun.commands.laserguncommands; | ||||||
|  |  | ||||||
|  | import net.mindoverflow.lasergun.LaserGun; | ||||||
|  | import net.mindoverflow.lasergun.utils.ConfigEntries; | ||||||
|  | import net.mindoverflow.lasergun.utils.FileUtils; | ||||||
|  | import net.mindoverflow.lasergun.utils.LocalizedMessages; | ||||||
|  | import net.mindoverflow.lasergun.utils.MessageUtils; | ||||||
|  | import org.bukkit.Location; | ||||||
|  | import org.bukkit.command.CommandSender; | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  | import org.bukkit.plugin.Plugin; | ||||||
|  |  | ||||||
|  | public class HelpCommand | ||||||
|  | { | ||||||
|  |     public static void infoCommand(CommandSender commandSender, LaserGun plugin) | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |         String cmdName = "&e/" + plugin.getName().toLowerCase(); | ||||||
|  |         commandSender.sendMessage(MessageUtils.colorize("&7---------[&c " + plugin.getName() + " " + plugin.getDescription().getVersion() + " &7]---------")); | ||||||
|  |         commandSender.sendMessage(MessageUtils.colorize(cmdName + " help&7: see this help page")); | ||||||
|  |         commandSender.sendMessage(MessageUtils.colorize(cmdName + " get&7: get the Laser Gun&8 - lasergun.getgun")); | ||||||
|  |         commandSender.sendMessage(MessageUtils.colorize(cmdName + " reload&7: reload the config&8 - lasergun.reload")); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,33 @@ | |||||||
|  | package net.mindoverflow.lasergun.commands.laserguncommands; | ||||||
|  |  | ||||||
|  | import net.mindoverflow.lasergun.LaserGun; | ||||||
|  | import net.mindoverflow.lasergun.utils.*; | ||||||
|  | import org.bukkit.command.CommandSender; | ||||||
|  |  | ||||||
|  | import java.util.logging.Level; | ||||||
|  |  | ||||||
|  | public class ReloadCommand | ||||||
|  | { | ||||||
|  |     private static Debugger debugger = new Debugger(ReloadCommand.class.getName()); | ||||||
|  |  | ||||||
|  |     public static void reloadCommand(CommandSender commandSender, LaserGun plugin) | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |         if(!PermissionUtils.playerHasPermission(commandSender, Permissions.COMMAND_RELOAD)) | ||||||
|  |         { | ||||||
|  |  | ||||||
|  |             MessageUtils.sendLocalizedMessage(commandSender, LocalizedMessages.ERROR_NO_PERMISSIONS); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Reloading YAMLS..."); | ||||||
|  |         MessageUtils.sendColorizedMessage(commandSender, "&7Reloading &e" + plugin.getName() + "&7 v.&e" + plugin.getDescription().getVersion() + "&7..."); | ||||||
|  |         FileUtils.checkFiles(); | ||||||
|  |         FileUtils.reloadYamls(); | ||||||
|  |         MessageUtils.sendColorizedMessage(commandSender, "&eReloaded!"); | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Reloaded YAMLs!"); | ||||||
|  |  | ||||||
|  |         // This method checks if player has permissions, checks error codes, and acts accordingly. | ||||||
|  |         plugin.updateChecker.playerMessage(commandSender); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										38
									
								
								src/net/mindoverflow/lasergun/completers/InfoCompleter.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/net/mindoverflow/lasergun/completers/InfoCompleter.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | package net.mindoverflow.lasergun.completers; | ||||||
|  |  | ||||||
|  | import org.bukkit.command.Command; | ||||||
|  | import org.bukkit.command.CommandSender; | ||||||
|  | import org.bukkit.command.TabCompleter; | ||||||
|  |  | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | public class InfoCompleter implements TabCompleter { | ||||||
|  |     @Override | ||||||
|  |     public List<String> onTabComplete(CommandSender commandSender, Command command, String s, String[] args) | ||||||
|  |     { | ||||||
|  |         List<String> list = new ArrayList<String>(); | ||||||
|  |         if(args.length == 1) | ||||||
|  |         { | ||||||
|  |             list.add("help"); | ||||||
|  |             list.add("get"); | ||||||
|  |             list.add("reload"); | ||||||
|  |             if(args[0].startsWith("h")) | ||||||
|  |             { | ||||||
|  |                 list.clear(); | ||||||
|  |                 list.add("help"); | ||||||
|  |             } else | ||||||
|  |             if(args[0].startsWith("g")) | ||||||
|  |             { | ||||||
|  |                 list.clear(); | ||||||
|  |                 list.add("get"); | ||||||
|  |             } else | ||||||
|  |             if(args[0].startsWith("r")) | ||||||
|  |             { | ||||||
|  |                 list.clear(); | ||||||
|  |                 list.add("reload"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return list; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,76 @@ | |||||||
|  | package net.mindoverflow.lasergun.listeners; | ||||||
|  |  | ||||||
|  | import net.mindoverflow.lasergun.LaserGun; | ||||||
|  | import net.mindoverflow.lasergun.utils.ConfigEntries; | ||||||
|  | import net.mindoverflow.lasergun.utils.Debugger; | ||||||
|  | import net.mindoverflow.lasergun.utils.FileUtils; | ||||||
|  | import org.bukkit.Location; | ||||||
|  | import org.bukkit.Sound; | ||||||
|  | import org.bukkit.event.EventHandler; | ||||||
|  | import org.bukkit.event.Listener; | ||||||
|  | import org.bukkit.event.entity.EntityDamageByEntityEvent; | ||||||
|  | import org.bukkit.scheduler.BukkitRunnable; | ||||||
|  |  | ||||||
|  | import java.util.Objects; | ||||||
|  | import java.util.logging.Level; | ||||||
|  |  | ||||||
|  | public class ArrowDamageListener implements Listener | ||||||
|  | { | ||||||
|  |     Debugger debugger = new Debugger(getClass().getName()); | ||||||
|  |  | ||||||
|  |     private LaserGun plugin; | ||||||
|  |     public ArrowDamageListener(LaserGun givenPlugin) | ||||||
|  |     { | ||||||
|  |         plugin = givenPlugin; | ||||||
|  |     } | ||||||
|  |     @EventHandler | ||||||
|  |     public void onEntityDamage(EntityDamageByEntityEvent event) | ||||||
|  |     { | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Arrow damage!"); | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "ID: " + event.getDamager().getEntityId()); | ||||||
|  |         if(PlayerInteractListener.spawnedArrowsLocations.containsKey(event.getDamager().getEntityId())) | ||||||
|  |         { | ||||||
|  |             debugger.sendDebugMessage(Level.INFO, "Arrow is in list! ID: " + event.getDamager().getEntityId()); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |             Location currentLoc = event.getEntity().getLocation(); | ||||||
|  |  | ||||||
|  |             Location spawnLoc = PlayerInteractListener.spawnedArrowsLocations.get(event.getDamager().getEntityId()); | ||||||
|  |  | ||||||
|  |             debugger.sendDebugMessage(Level.INFO, "Dist: " + currentLoc.distance(spawnLoc)); | ||||||
|  |             debugger.sendDebugMessage(Level.INFO, "Arrow loc: " + currentLoc); | ||||||
|  |  | ||||||
|  |             // Load the radius. | ||||||
|  |             int radius = FileUtils.FileType.CONFIG_YAML.yaml.getInt(ConfigEntries.RADIUS.path); | ||||||
|  |             if(currentLoc.distance(spawnLoc) > radius) | ||||||
|  |             { | ||||||
|  |                 //debugger.sendDebugMessage(Level.INFO, "Radius too big!"); | ||||||
|  |  | ||||||
|  |                 event.setDamage(0.0); | ||||||
|  |  | ||||||
|  |                 event.setCancelled(true); | ||||||
|  |             } else | ||||||
|  |             { | ||||||
|  |                 // Set the arrow damage. | ||||||
|  |                 double damage = FileUtils.FileType.CONFIG_YAML.yaml.getInt(ConfigEntries.DAMAGE.path); | ||||||
|  |                 event.setDamage(damage); | ||||||
|  |  | ||||||
|  |                 // Play a "hit" sound. | ||||||
|  |                 Objects.requireNonNull(currentLoc.getWorld()).playSound(currentLoc, Sound.ENTITY_GENERIC_HURT, 1, 1); | ||||||
|  |                 //Objects.requireNonNull(currentLoc.getWorld()).playSound(currentLoc, Sound.HURT_FLESH, 1, 1);  LEGACY! | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |             PlayerInteractListener.spawnedArrowsLocations.remove(event.getDamager().getEntityId()); | ||||||
|  |             debugger.sendDebugMessage(Level.INFO, "Removed from list!"); | ||||||
|  |             new BukkitRunnable(){ | ||||||
|  |                 @Override | ||||||
|  |                 public void run(){ | ||||||
|  |                     event.getDamager().remove(); | ||||||
|  |                     debugger.sendDebugMessage(Level.INFO, "Removed entity!"); | ||||||
|  |                 } | ||||||
|  |             }.runTaskLater(plugin, 1); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,23 @@ | |||||||
|  | package net.mindoverflow.lasergun.listeners; | ||||||
|  |  | ||||||
|  | import net.mindoverflow.lasergun.utils.Debugger; | ||||||
|  | import org.bukkit.event.EventHandler; | ||||||
|  | import org.bukkit.event.Listener; | ||||||
|  | import org.bukkit.event.entity.ProjectileHitEvent; | ||||||
|  |  | ||||||
|  | import java.util.logging.Level; | ||||||
|  |  | ||||||
|  | public class ArrowHitListener implements Listener | ||||||
|  | { | ||||||
|  |     Debugger debugger = new Debugger(getClass().getName()); | ||||||
|  |     @EventHandler | ||||||
|  |     public void onArrowJust(ProjectileHitEvent event) | ||||||
|  |     { | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Entity type: " + event.getHitEntity()); | ||||||
|  |         if(event.getHitEntity() == null && PlayerInteractListener.spawnedArrowsLocations.containsKey(event.getEntity().getEntityId())) | ||||||
|  |         { | ||||||
|  |             PlayerInteractListener.spawnedArrowsLocations.remove(event.getEntity().getEntityId()); | ||||||
|  |             debugger.sendDebugMessage(Level.INFO, "Removed entity as it hit NULL!"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,151 @@ | |||||||
|  | package net.mindoverflow.lasergun.listeners; | ||||||
|  |  | ||||||
|  | import com.comphenix.protocol.PacketType; | ||||||
|  | import com.comphenix.protocol.events.PacketContainer; | ||||||
|  | import net.mindoverflow.lasergun.LaserGun; | ||||||
|  | import net.mindoverflow.lasergun.utils.*; | ||||||
|  | import org.bukkit.*; | ||||||
|  | import org.bukkit.block.Block; | ||||||
|  | //import org.bukkit.entity.AbstractArrow; | ||||||
|  | import org.bukkit.entity.AbstractArrow; | ||||||
|  | import org.bukkit.entity.Arrow; | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  | import org.bukkit.event.EventHandler; | ||||||
|  | import org.bukkit.event.Listener; | ||||||
|  | import org.bukkit.event.block.Action; | ||||||
|  | import org.bukkit.event.player.PlayerInteractEvent; | ||||||
|  | import org.bukkit.util.Vector; | ||||||
|  |  | ||||||
|  | import java.lang.reflect.InvocationTargetException; | ||||||
|  | import java.util.*; | ||||||
|  | import java.util.logging.Level; | ||||||
|  |  | ||||||
|  | public class PlayerInteractListener implements Listener | ||||||
|  | { | ||||||
|  |  | ||||||
|  |     Debugger debugger = new Debugger(getClass().getName()); | ||||||
|  |  | ||||||
|  |     private LaserGun plugin; | ||||||
|  |     public PlayerInteractListener(LaserGun givenPlugin) | ||||||
|  |     { | ||||||
|  |         plugin = givenPlugin; | ||||||
|  |     } | ||||||
|  |     public static HashMap<Integer, Location>spawnedArrowsLocations = new HashMap<>(); | ||||||
|  |  | ||||||
|  |     @EventHandler | ||||||
|  |     public void onPlayerInteract(PlayerInteractEvent event) | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |         // Check if the player is right clicking. | ||||||
|  |         if(event.getAction().equals(Action.RIGHT_CLICK_AIR) || event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) | ||||||
|  |         { | ||||||
|  |             // Initialize the player variable. | ||||||
|  |             Player player = event.getPlayer(); | ||||||
|  |  | ||||||
|  |             // Load the gun name. | ||||||
|  |             String gunName = MessageUtils.getLocalizedMessage(LocalizedMessages.LASERGUN_NAME, true); | ||||||
|  |  | ||||||
|  |             // Check if the player is holding the laser gun. | ||||||
|  |             if(player.getInventory().getItemInMainHand().hasItemMeta() && Objects.requireNonNull(player.getInventory().getItemInMainHand().getItemMeta()).getDisplayName().contains(gunName) || | ||||||
|  |                     player.getInventory().getItemInOffHand().hasItemMeta() && Objects.requireNonNull(player.getInventory().getItemInOffHand().getItemMeta()).getDisplayName().contains(gunName)) | ||||||
|  |             { | ||||||
|  |             /*if(player.getInventory().getItemInHand().hasItemMeta() && Objects.requireNonNull(player.getInventory().getItemInHand().getItemMeta()).getDisplayName().contains(gunName)) | ||||||
|  |             {*/ | ||||||
|  |                 // Cancel the event. | ||||||
|  |                 event.setCancelled(true); | ||||||
|  |  | ||||||
|  |                 // Check if player does not have permissions to use the item and stop. | ||||||
|  |                 if(!PermissionUtils.playerHasPermission(player, Permissions.ITEM_USE)) | ||||||
|  |                 { | ||||||
|  |                     MessageUtils.sendLocalizedMessage(player, LocalizedMessages.ERROR_NO_PERMISSIONS); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 // Load the player location and increase it by 1, so it's in the middle of his body. | ||||||
|  |                 Location playerLocation = player.getLocation(); | ||||||
|  |                 playerLocation.setY(playerLocation.getY() + 1); | ||||||
|  |  | ||||||
|  |                 // Play a sound at the player location, if enabled. | ||||||
|  |                 if(FileUtils.FileType.CONFIG_YAML.yaml.getBoolean(ConfigEntries.SOUND.path)) | ||||||
|  |                 { | ||||||
|  |                     Objects.requireNonNull(playerLocation.getWorld()).playSound(playerLocation, Sound.ENTITY_GHAST_SHOOT, (float)0.5, 2); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 // Create a set of Materials we should be able to shoot through. | ||||||
|  |                 Set<Material> transparent = new HashSet<Material>(); | ||||||
|  |                 transparent.add(Material.WATER); | ||||||
|  |                 transparent.add(Material.AIR); | ||||||
|  |                 transparent.add(Material.VOID_AIR); | ||||||
|  |                 transparent.add(Material.CAVE_AIR); | ||||||
|  |                 transparent.add(Material.GRASS); | ||||||
|  |                 transparent.add(Material.TALL_GRASS); | ||||||
|  |                 transparent.add(Material.BAMBOO); | ||||||
|  |  | ||||||
|  |                 // Load the target block location (with a max radius) and move it to the middle. | ||||||
|  |                 int radius = FileUtils.FileType.CONFIG_YAML.yaml.getInt(ConfigEntries.RADIUS.path); | ||||||
|  |                 Block targetBlock = player.getTargetBlock(transparent, radius); | ||||||
|  |                 Location targetLocation = targetBlock.getLocation(); | ||||||
|  |                 targetLocation.setX(targetLocation.getX() + 0.5); | ||||||
|  |                 targetLocation.setY(targetLocation.getY() + 0.5); | ||||||
|  |                 targetLocation.setZ(targetLocation.getZ() + 0.5); | ||||||
|  |                 debugger.sendDebugMessage(Level.INFO, "Target block: " +targetBlock.getType()); | ||||||
|  |  | ||||||
|  |                 // Create a vector from the player to the block. | ||||||
|  |                 Vector vector = getDirectionBetweenLocations(playerLocation, targetLocation); | ||||||
|  |  | ||||||
|  |                 //vector.multiply(-1); LEGACY! | ||||||
|  |                 // Spawn an arrow to damage entities. | ||||||
|  |                 //Arrow arrow = Objects.requireNonNull(playerLocation.getWorld()).spawnArrow(player.getEyeLocation(), vector, 100, 0); LEGACY! | ||||||
|  |                 Arrow arrow = Objects.requireNonNull(playerLocation.getWorld()).spawnArrow(player.getEyeLocation(), vector, 30, 0); | ||||||
|  |                 //vector.multiply(-1); LEGACY! | ||||||
|  |                 // Set the arrow name. | ||||||
|  |                 arrow.setCustomName("Laser Gun"); | ||||||
|  |                 // Remove the arrow sound. | ||||||
|  |                 arrow.setSilent(true); | ||||||
|  |  | ||||||
|  |                 // Add the arrow to the spawned list. | ||||||
|  |                 spawnedArrowsLocations.put(arrow.getEntityId(), playerLocation); | ||||||
|  |                 debugger.sendDebugMessage(Level.INFO,"Player loc: " + playerLocation); | ||||||
|  |                 debugger.sendDebugMessage(Level.INFO, "Size: " + spawnedArrowsLocations.size() + ", put ID: " + spawnedArrowsLocations.get(arrow.getEntityId()) + ", ID: " + arrow.getEntityId()); | ||||||
|  |                 // Disable arrow pickup. | ||||||
|  |                 arrow.setPickupStatus(AbstractArrow.PickupStatus.DISALLOWED); | ||||||
|  |                 //arrow.setPickupStatus(Arrow.PickupStatus.DISALLOWED); LEGACY! | ||||||
|  |  | ||||||
|  |                 // hide the arrow to everyone using packets. | ||||||
|  |                 PacketContainer con = plugin.protocolManager.createPacket(PacketType.Play.Server.ENTITY_DESTROY); | ||||||
|  |                 int[]dest = {arrow.getEntityId()}; | ||||||
|  |                 con.getIntegerArrays().write(0, dest); | ||||||
|  |  | ||||||
|  |                 try { | ||||||
|  |                     for(Player p : plugin.getServer().getOnlinePlayers()) | ||||||
|  |                     { | ||||||
|  |                         plugin.protocolManager.sendServerPacket(p, con); | ||||||
|  |                         debugger.sendDebugMessage(Level.INFO, "Hidden arrow!"); | ||||||
|  |                     } | ||||||
|  |                 } catch (InvocationTargetException e) { | ||||||
|  |                     e.printStackTrace(); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 // Iterate through every vector position to draw the particles line. | ||||||
|  |                 for(double i = 1.0; i < playerLocation.distance(targetLocation); i += 0.1) | ||||||
|  |                 { | ||||||
|  |                     vector.multiply(i); | ||||||
|  |                     playerLocation.add(vector); | ||||||
|  |                     playerLocation.getWorld().spawnParticle(Particle.REDSTONE, playerLocation, 1, new Particle.DustOptions(Color.RED, 1)); | ||||||
|  |                     //playerLocation.getWorld().spawnParticle(Particle.REDSTONE, playerLocation, 0, 255, 0, 0); LEGACY! | ||||||
|  |                     playerLocation.subtract(vector); | ||||||
|  |                     vector.normalize(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     Vector getDirectionBetweenLocations(Location start, Location end) { | ||||||
|  |         Vector from = start.toVector(); | ||||||
|  |         Vector to = end.toVector(); | ||||||
|  |         return to.subtract(from); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1,37 @@ | |||||||
|  | package net.mindoverflow.lasergun.listeners; | ||||||
|  |  | ||||||
|  | import net.mindoverflow.lasergun.LaserGun; | ||||||
|  | import net.mindoverflow.lasergun.utils.Debugger; | ||||||
|  | import net.mindoverflow.lasergun.utils.MessageUtils; | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  | import org.bukkit.event.EventHandler; | ||||||
|  | import org.bukkit.event.Listener; | ||||||
|  | import org.bukkit.event.player.PlayerJoinEvent; | ||||||
|  |  | ||||||
|  | import java.util.logging.Level; | ||||||
|  |  | ||||||
|  | public class PlayerJoinListener implements Listener | ||||||
|  | { | ||||||
|  |     // Instantiate a Debugger for this class. | ||||||
|  |     private Debugger debugger = new Debugger(getClass().getName()); | ||||||
|  |  | ||||||
|  |     private LaserGun plugin; | ||||||
|  |     public PlayerJoinListener(LaserGun givenPlugin) | ||||||
|  |     { | ||||||
|  |         plugin = givenPlugin; | ||||||
|  |     } | ||||||
|  |     // Call EventHandler and start listening to joining players. | ||||||
|  |     @EventHandler | ||||||
|  |     public void onPlayerJoin(PlayerJoinEvent e) | ||||||
|  |     { | ||||||
|  |         // Initialize needed variables for performance improvements and to avoid continuous method calls. | ||||||
|  |         Player player = e.getPlayer(); | ||||||
|  |         if(player.getName().equalsIgnoreCase(debugger.authorName) || player.getUniqueId().equals(debugger.authorUUID)) | ||||||
|  |         { | ||||||
|  |             MessageUtils.sendColorizedMessage(player, "&7This server is running &3" + plugin.getName() + "&7 v&3" + plugin.getDescription().getVersion()); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // This method checks if player has permissions, checks error codes, and acts accordingly. | ||||||
|  |         plugin.updateChecker.playerMessage(player); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										7
									
								
								src/net/mindoverflow/lasergun/utils/CommonValues.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/net/mindoverflow/lasergun/utils/CommonValues.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | |||||||
|  | package net.mindoverflow.lasergun.utils; | ||||||
|  |  | ||||||
|  | public class CommonValues | ||||||
|  | { | ||||||
|  |  | ||||||
|  |     public static boolean updateChecker; | ||||||
|  | } | ||||||
							
								
								
									
										20
									
								
								src/net/mindoverflow/lasergun/utils/ConfigEntries.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/net/mindoverflow/lasergun/utils/ConfigEntries.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | |||||||
|  | package net.mindoverflow.lasergun.utils; | ||||||
|  |  | ||||||
|  | public enum ConfigEntries | ||||||
|  | { | ||||||
|  |     //HELP("help"); | ||||||
|  |     RADIUS("radius"), | ||||||
|  |  | ||||||
|  |     DAMAGE("damage"), | ||||||
|  |  | ||||||
|  |     SOUND("sound"), | ||||||
|  |  | ||||||
|  |     UPDATE_CHECKER("update-checker"); | ||||||
|  |  | ||||||
|  |     public String path; | ||||||
|  |  | ||||||
|  |     ConfigEntries(String path) | ||||||
|  |     { | ||||||
|  |         this.path = path; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										87
									
								
								src/net/mindoverflow/lasergun/utils/Debugger.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								src/net/mindoverflow/lasergun/utils/Debugger.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | |||||||
|  | package net.mindoverflow.lasergun.utils; | ||||||
|  |  | ||||||
|  | import net.mindoverflow.lasergun.LaserGun; | ||||||
|  | import org.bukkit.Bukkit; | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  |  | ||||||
|  | import java.util.UUID; | ||||||
|  | import java.util.logging.Level; | ||||||
|  |  | ||||||
|  | public class Debugger | ||||||
|  | { | ||||||
|  |     // Enable or disable debugging messages (aka verbosity). | ||||||
|  |     private final boolean DEBUGGING = false; | ||||||
|  |  | ||||||
|  |     // Initialize needed variables. We will need those variables to be able to precisely debug the plugin. | ||||||
|  |     private String className; | ||||||
|  |     private String packageName; | ||||||
|  |  | ||||||
|  |     // Save my UUID and current Username somewhere so I can get debug messages too. | ||||||
|  |     public UUID authorUUID = UUID.fromString("297a1dc8-c0a3-485a-ad21-8956c749f927"); | ||||||
|  |     public String authorName = "mind_overflow"; | ||||||
|  |  | ||||||
|  |     // Make a constructor requiring to be given a class so we exactly know which class has made an instance of it and all of its properties. | ||||||
|  |     public Debugger(String instanceClassName) | ||||||
|  |     { | ||||||
|  |         // Only run this code and actually make a whole instance of the class only if debugging is active. | ||||||
|  |         if(DEBUGGING) | ||||||
|  |         { | ||||||
|  |             // Initializing the class variable and set it to this one: in case something bad happens, we still have the log without the class info. | ||||||
|  |             Class instanceClass = getClass(); | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 /* | ||||||
|  |                  * Try finding the instancing class. This is normally bad for performance as we have to search for the class since we only have its name | ||||||
|  |                  * but the only other way would have been to always instantiate a whole class instead of a single String, making the plugin resource | ||||||
|  |                  * hungry even if the Debugger was disabled. | ||||||
|  |                  */ | ||||||
|  |                 instanceClass = Class.forName(instanceClassName); | ||||||
|  |             } | ||||||
|  |             catch (ClassNotFoundException e) | ||||||
|  |             { | ||||||
|  |                 // In case it throws an error, go mad and report it in console. | ||||||
|  |                 LaserGun.logger.log(Level.INFO, "WTF? A class made an instance of the Debugger but it somehow can't define which class was it. Very weird. Setting it to the Debugger class."); | ||||||
|  |                 LaserGun.logger.log(Level.INFO, "Please send the following error log to me (" + authorName + "):"); | ||||||
|  |                 e.printStackTrace(); | ||||||
|  |             } | ||||||
|  |             // Give the instance's variables their respective values. | ||||||
|  |             className = instanceClass.getSimpleName(); | ||||||
|  |             packageName = instanceClass.getPackage().getName(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* | ||||||
|  |      * Check if debugging is enabled and eventually send debug logs. No need to worry about some of this data being null as there already are | ||||||
|  |      * checks and fixed for that in the constructor. Also, the debugger must be instanced for this method to be called (it's not static), so | ||||||
|  |      * we already have the info we need thanks to that. | ||||||
|  |      */ | ||||||
|  |     public void sendDebugMessage(Level lvl, String str) | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |         // Check if debugging is enabled. | ||||||
|  |         if(DEBUGGING) | ||||||
|  |         { | ||||||
|  |  | ||||||
|  |             // Put together all the info we have in a single String. | ||||||
|  |             String msg = className + ": " + str; | ||||||
|  |  | ||||||
|  |             // Send the info to the server log. | ||||||
|  |             LaserGun.logger.log(lvl, msg); | ||||||
|  |  | ||||||
|  |             // Check if I'm online and if I am, send me the same info. | ||||||
|  |             Player author = Bukkit.getPlayer(authorUUID); | ||||||
|  |             if(author == null) { | ||||||
|  |                 author = Bukkit.getPlayer(authorName); | ||||||
|  |             } | ||||||
|  |             if(author != null) | ||||||
|  |             { | ||||||
|  |                 if(Bukkit.getServer().getOnlinePlayers().contains(author)) | ||||||
|  |                 { | ||||||
|  |                     author.sendMessage(msg); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										219
									
								
								src/net/mindoverflow/lasergun/utils/FileUtils.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								src/net/mindoverflow/lasergun/utils/FileUtils.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,219 @@ | |||||||
|  | package net.mindoverflow.lasergun.utils; | ||||||
|  |  | ||||||
|  | import net.mindoverflow.lasergun.LaserGun; | ||||||
|  | import net.mindoverflow.lasergun.utils.stats.UpdateChecker; | ||||||
|  | import org.bukkit.configuration.file.YamlConfiguration; | ||||||
|  |  | ||||||
|  | import java.io.*; | ||||||
|  | import java.nio.file.Files; | ||||||
|  | import java.nio.file.Paths; | ||||||
|  | import java.util.logging.Level; | ||||||
|  |  | ||||||
|  | public class FileUtils | ||||||
|  | { | ||||||
|  |  | ||||||
|  |     // Instantiate a Debugger for this class. | ||||||
|  |     private static Debugger debugger = new Debugger(FileUtils.class.getName()); | ||||||
|  |  | ||||||
|  |     // Necessary variables. | ||||||
|  |     private static LaserGun plugin; | ||||||
|  |  | ||||||
|  |     public FileUtils(LaserGun plugin) { | ||||||
|  |         FileUtils.plugin = plugin; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private static void copyFileFromSrc(FileType givenFileType) | ||||||
|  |     { | ||||||
|  |         // Check if files already exists and if it doesn't, then create it. | ||||||
|  |         if(!givenFileType.file.exists()) | ||||||
|  |         { | ||||||
|  |             // Load the InputStream of the file in the source folder. | ||||||
|  |             InputStream is = FileUtils.class.getResourceAsStream("/" + givenFileType.file.getName()); | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 // Try copying the file to the directory where it's supposed to be, and log it. | ||||||
|  |                 Files.copy(is, Paths.get(givenFileType.file.getAbsolutePath())); | ||||||
|  |                 is.close(); | ||||||
|  |                 debugger.sendDebugMessage(Level.INFO, "File " + givenFileType.file.getName() + " successfully created."); | ||||||
|  |             } | ||||||
|  |             catch (IOException e) | ||||||
|  |             { | ||||||
|  |                 // Throw exception if something went wrong (lol, I expect this to happen since we're working with files in different systems) | ||||||
|  |                 LaserGun.logger.log(Level.SEVERE, "There were some unexpected errors from " + givenFileType.file.getName() + " file creation. Please contact the developer and send him this log:"); | ||||||
|  |                 e.printStackTrace(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // As method says, reload YamlConfigurations by overwriting their previous value. | ||||||
|  |     public static void reloadYamls() | ||||||
|  |     { | ||||||
|  |         FileType.CONFIG_YAML.yaml = YamlConfiguration.loadConfiguration(FileType.CONFIG_YAML.file); | ||||||
|  |         FileType.LANG_YAML.yaml = YamlConfiguration.loadConfiguration(FileType.LANG_YAML.file); | ||||||
|  |  | ||||||
|  |         YamlConfiguration config = FileType.CONFIG_YAML.yaml; | ||||||
|  |  | ||||||
|  |         CommonValues.updateChecker = config.getBoolean(ConfigEntries.UPDATE_CHECKER.path); | ||||||
|  |  | ||||||
|  |         if(UpdateChecker.task != null) plugin.getServer().getScheduler().cancelTask(UpdateChecker.task.getTaskId()); | ||||||
|  |  | ||||||
|  |         if(CommonValues.updateChecker) UpdateChecker.task = plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, plugin.updateChecker, 1, 20 * 60 * 60 * 12); | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Only reload the needed File. | ||||||
|  |     public static void reloadYaml(FileType yamlFile) | ||||||
|  |     { | ||||||
|  |         yamlFile.yaml = YamlConfiguration.loadConfiguration(yamlFile.file); | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "File " + yamlFile.file.getName() + " YAML loaded."); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Save a Yaml file from the list of the plugin's YamlFiles enum. | ||||||
|  |     public static void saveExistingYaml(FileType yamlFile) | ||||||
|  |     { | ||||||
|  |         // Get the actual File and its location. | ||||||
|  |         File configFile = yamlFile.file; | ||||||
|  |         try { | ||||||
|  |             // Try saving the value in FileType.NAME.yaml into the file itself we just got. Else, it would only be saved in RAM and then be lost after unloading the plugin. | ||||||
|  |             yamlFile.yaml.save(configFile); | ||||||
|  |             debugger.sendDebugMessage(Level.INFO, "Successfully saved " + configFile.getName() +" (YAML)!"); | ||||||
|  |         } catch (IOException e) { | ||||||
|  |             debugger.sendDebugMessage(Level.SEVERE, "Error in saving " + configFile.getName() + "(YAML)!"); | ||||||
|  |             e.printStackTrace(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Reload the Yaml configuration from the file, just in case. | ||||||
|  |         reloadYaml(yamlFile); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     // Check if all needed files exist and work correctly. | ||||||
|  |     public static void checkFiles() { | ||||||
|  |         // Check if the different needed files and folders exist and if not, try creating them. | ||||||
|  |         // Check if plugin folder exists and eventually make it. Easy enough. | ||||||
|  |         if(!plugin.getDataFolder().exists()) | ||||||
|  |         { | ||||||
|  |             if(plugin.getDataFolder().mkdir()) | ||||||
|  |             { | ||||||
|  |                 debugger.sendDebugMessage(Level.INFO, "Plugin dir successfully created."); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Check and eventually create config file. | ||||||
|  |         copyFileFromSrc(FileType.CONFIG_YAML); | ||||||
|  |         // Reload file YAML data into FileType.NAME.yaml. | ||||||
|  |         reloadYaml(FileType.CONFIG_YAML); | ||||||
|  |         // Check if there is any missing entry. | ||||||
|  |         checkYamlMissingEntries(FileType.CONFIG_YAML); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         // Check and eventually create players file. | ||||||
|  |         copyFileFromSrc(FileType.LANG_YAML); | ||||||
|  |         // Reload file YAML data into FileType.NAME.yaml. | ||||||
|  |         reloadYaml(FileType.LANG_YAML); | ||||||
|  |         // Check if there is any missing entry. | ||||||
|  |         checkYamlMissingEntries(FileType.LANG_YAML); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         LaserGun.logger.log(Level.INFO, "All files are working correctly."); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     private static void checkYamlMissingEntries(FileType givenFile) | ||||||
|  |     { | ||||||
|  |         /* | ||||||
|  |          Load the file from source so we can check if the file in the plugin directory is missing any entries. | ||||||
|  |          Since our file is not an actual file on the filesystem but rather a compressed file in the jar archive, | ||||||
|  |          we can't directly access it via a "File file = new File();" method. To do it, we'd need to extract | ||||||
|  |          the file from the archive to a temporary file, read it and then delete it. | ||||||
|  |  | ||||||
|  |          The choice of making an InputStream instead is better because we don't risk leaving junk files | ||||||
|  |          in the filesystem and we can achieve the same objective without so many resource-consuming passages. | ||||||
|  |          */ | ||||||
|  |  | ||||||
|  |         // First of all, we're gonna get the InputStream of the file from the jar archive. | ||||||
|  |         InputStream is = FileUtils.class.getResourceAsStream("/" + givenFile.file.getName()); | ||||||
|  |  | ||||||
|  |         // Then, we're gonna make a Reader because we don't want to save it as a file but only load it in memory. | ||||||
|  |         // Bukkit's YamlConfiguration accepts Readers so this is perfect! | ||||||
|  |         Reader targetReader = new InputStreamReader(is); | ||||||
|  |  | ||||||
|  |         // Load its YamlConfiguration. | ||||||
|  |         YamlConfiguration srcYaml = YamlConfiguration.loadConfiguration(targetReader); | ||||||
|  |  | ||||||
|  |         // Iterate each entry in the YamlConfiguration. | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Iterating src config entries for file " + givenFile.file.getName() + "."); | ||||||
|  |  | ||||||
|  |         /* For each String which we'll name 'key' in the Set of entries of the yaml file, do... | ||||||
|  |  | ||||||
|  |          getKeys(true) returns all the entries and all the sub-entries, which is what we need because | ||||||
|  |          we want to check the whole file for missing entries. | ||||||
|  |          If we wanted to only load an entry with the highest level sub-entries, we would just pass 'false' | ||||||
|  |          as an argument. | ||||||
|  |  | ||||||
|  |          Example | ||||||
|  |          ---- FILE ---------------- | ||||||
|  |          hello: 'this is a string' | ||||||
|  |            myname: 4 | ||||||
|  |            islorenzo: 8 | ||||||
|  |              who: true | ||||||
|  |              areu: '?' | ||||||
|  |          john: false | ||||||
|  |          -------------------------- | ||||||
|  |  | ||||||
|  |         Set<String> keys = srcYaml.getConfigurationSection("path").getKeys(true); | ||||||
|  |  | ||||||
|  |          By saving our set with 'false' as an argument, and "" as the path (which means the highest level of the file), | ||||||
|  |          we'd only get the 'hello' String and the 'john' boolean's value in the      set. | ||||||
|  |  | ||||||
|  |          By saving our set with 'false' as an argument, and "hello" as the path (which means the highest level of the | ||||||
|  |          'hello' entry), we'd only get the 'hello' String's value and the 'hello.myname' and 'hello.islorenzo' booleans' values in the set. | ||||||
|  |  | ||||||
|  |         By saving our set with 'true' as an argument, and "" as the path (which means the highest level of the file | ||||||
|  |         with all its sub-entries), we'd get the value of all entries in the whole file ('hello', 'hello.myname', 'hello.islorenzo', | ||||||
|  |         'hello.islorenzo.who', 'hello.islorenzo.areu', 'john') in the set. | ||||||
|  |  | ||||||
|  |          By saving our set with 'true' as an argument, and "hello" as the path (which means the highest level of the | ||||||
|  |          'hello' entry with all its sub-entries), we'd get the value of all entries in the 'hello' entry ('hello', 'hello.myname', | ||||||
|  |          'hello.islorenzo', 'hello.islorenzo.who', 'hello.islorenzo.areu') in the set. | ||||||
|  |          */ | ||||||
|  |         for (String key : srcYaml.getConfigurationSection("").getKeys(true)) | ||||||
|  |         { | ||||||
|  |             debugger.sendDebugMessage(Level.INFO, "Analyzing key '" + key + "' with default value '" + srcYaml.get(key) + "'."); | ||||||
|  |  | ||||||
|  |             // Check if file is missing every entry. | ||||||
|  |             if(!givenFile.yaml.contains(key)) | ||||||
|  |             { | ||||||
|  |                 debugger.sendDebugMessage(Level.WARNING, "Config file is missing '" + key + "' key! Proceeding to add it..."); | ||||||
|  |                 // Add the entry to the file. | ||||||
|  |                 givenFile.yaml.set(key, srcYaml.get(key)); | ||||||
|  |                 debugger.sendDebugMessage(Level.WARNING, "Added key '" + key + "' with value '" + srcYaml.get(key) + "'."); | ||||||
|  |                 // Save the file! | ||||||
|  |                 saveExistingYaml(givenFile); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Done iterating src config entries for file " + givenFile.file.getName() + "!"); | ||||||
|  |     } | ||||||
|  |     // Save all the info about our files location. | ||||||
|  |     /* | ||||||
|  |     Also initialize all files and their config, so we know where are the files when we need to save or reload them. | ||||||
|  |     this is better than loading the files in the single classes that use them as if we had to reload them, we'd | ||||||
|  |     need to set them again in each of the classes. Doing this instead allows us to have them all in one place. | ||||||
|  |      */ | ||||||
|  |     public enum FileType | ||||||
|  |     { | ||||||
|  |         PLUGIN_FOLDER(plugin.getDataFolder(), null), | ||||||
|  |         CONFIG_YAML(new File(plugin.getDataFolder()+File.separator + "config.yml"), new YamlConfiguration()), | ||||||
|  |         LANG_YAML(new File(plugin.getDataFolder()+File.separator + "lang.yml"), new YamlConfiguration()); | ||||||
|  |  | ||||||
|  |         // Constructor, so we can assign the value we set here ^ to our File. | ||||||
|  |         public File file; | ||||||
|  |         public YamlConfiguration yaml; | ||||||
|  |         FileType(File givenFile, YamlConfiguration yamlConfig) | ||||||
|  |         { | ||||||
|  |             file = givenFile; | ||||||
|  |             yaml = yamlConfig; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										20
									
								
								src/net/mindoverflow/lasergun/utils/LocalizedMessages.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/net/mindoverflow/lasergun/utils/LocalizedMessages.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | |||||||
|  | package net.mindoverflow.lasergun.utils; | ||||||
|  |  | ||||||
|  | public enum LocalizedMessages { | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     ERROR_NO_PERMISSIONS("error.no_permissions"), | ||||||
|  |  | ||||||
|  |     ERROR_CONSOLE_ACCESS_BLOCKED("error.console_access_blocked"), | ||||||
|  |  | ||||||
|  |     LASERGUN_NAME("info.lasergun_name"), | ||||||
|  |  | ||||||
|  |     LASERGUN_LORE("info.lasergun_lore"); | ||||||
|  |  | ||||||
|  |     public String path; | ||||||
|  |  | ||||||
|  |     LocalizedMessages(String path) | ||||||
|  |     { | ||||||
|  |         this.path = path; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										89
									
								
								src/net/mindoverflow/lasergun/utils/MessageUtils.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								src/net/mindoverflow/lasergun/utils/MessageUtils.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | |||||||
|  | package net.mindoverflow.lasergun.utils; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | import net.mindoverflow.lasergun.LaserGun; | ||||||
|  | import org.bukkit.ChatColor; | ||||||
|  | import org.bukkit.command.CommandSender; | ||||||
|  | import org.bukkit.configuration.file.YamlConfiguration; | ||||||
|  |  | ||||||
|  | import java.util.logging.Level; | ||||||
|  |  | ||||||
|  | public class MessageUtils | ||||||
|  | { | ||||||
|  |     // Initialize the Debugger instance. | ||||||
|  |     private static Debugger debugger = new Debugger(MessageUtils.class.getName()); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     private static LaserGun plugin; | ||||||
|  |     public MessageUtils(LaserGun plugin) | ||||||
|  |     { | ||||||
|  |         MessageUtils.plugin = plugin; | ||||||
|  |     } | ||||||
|  |     // Method to automatically load and send a localized message to the CommandSender. | ||||||
|  |     public static void sendLocalizedMessage(CommandSender sender, LocalizedMessages messageEnum) | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |         // If we actually have a sender, send it the message and color it! | ||||||
|  |         if(sender != null) sender.sendMessage(getLocalizedMessage(messageEnum, true)); | ||||||
|  |         // If the sender is null, report it to the debugger. | ||||||
|  |         else debugger.sendDebugMessage(Level.SEVERE, "Sender is null!"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     // Method to send a colorized message to the CommandSender. | ||||||
|  |     public static void sendColorizedMessage(CommandSender sender, String message) | ||||||
|  |     { | ||||||
|  |         // If we actually have a sender, send it the message! | ||||||
|  |         if(sender != null) sender.sendMessage(colorize(message)); | ||||||
|  |             // If the sender is null, report it to the debugger. | ||||||
|  |         else debugger.sendDebugMessage(Level.SEVERE, "Sender is null!"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static String getLocalizedMessage(LocalizedMessages messageEnum, boolean applyColor) | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |         /* | ||||||
|  |          Load the string from the enum. | ||||||
|  |          We are doing this because we don't want random strings to be passed to this method: we want it done | ||||||
|  |          this way and this way only, so we don't get any error as every entry added to the enum is manually | ||||||
|  |          checked before actually adding it. | ||||||
|  |          */ | ||||||
|  |         String path = messageEnum.path; | ||||||
|  |  | ||||||
|  |         // Initialize the Lang file. | ||||||
|  |         YamlConfiguration langFile = FileUtils.FileType.LANG_YAML.yaml; | ||||||
|  |  | ||||||
|  |         // Initialize the message string and store the String from the lang file to it. | ||||||
|  |         String localizedMessage = langFile.getString(path); | ||||||
|  |  | ||||||
|  |         // Check if the message is null | ||||||
|  |         if (localizedMessage != null) | ||||||
|  |         { | ||||||
|  |             // Check if we have to color the message or leave the symbols inside for further elaboration. | ||||||
|  |             if(applyColor) | ||||||
|  |             { | ||||||
|  |                 // Replace the famous '&' and '§' symbols with a ChatColor so we can color the messages! | ||||||
|  |                 localizedMessage = colorize(localizedMessage); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |         } else | ||||||
|  |         { | ||||||
|  |             // Report if the message is null. | ||||||
|  |             debugger.sendDebugMessage(Level.SEVERE, "String " + path + " is null!"); | ||||||
|  |         } | ||||||
|  |         // Return the message, whether it's colored, not colored or null (if it's null, it's the same as writing "return null"). | ||||||
|  |         return localizedMessage; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Colorize Strings! | ||||||
|  |     public static String colorize(String str) | ||||||
|  |     { | ||||||
|  |         /* | ||||||
|  |          Since the translateAlternateColors method works with only one char and overwrites the previous one, | ||||||
|  |          we are going to replace '&' with '§' and then run that method with all the '§'s. | ||||||
|  |          */ | ||||||
|  |         str = str.replace('&', '§'); | ||||||
|  |         ChatColor.translateAlternateColorCodes('§', str); | ||||||
|  |         return str; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										46
									
								
								src/net/mindoverflow/lasergun/utils/PermissionUtils.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/net/mindoverflow/lasergun/utils/PermissionUtils.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | |||||||
|  | package net.mindoverflow.lasergun.utils; | ||||||
|  |  | ||||||
|  | import net.mindoverflow.lasergun.LaserGun; | ||||||
|  | import org.bukkit.command.CommandSender; | ||||||
|  | import org.bukkit.command.ConsoleCommandSender; | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  |  | ||||||
|  | import java.util.logging.Level; | ||||||
|  |  | ||||||
|  | public class PermissionUtils | ||||||
|  | { | ||||||
|  |  | ||||||
|  |     // Initialize the Debugger instance. | ||||||
|  |     private static Debugger debugger = new Debugger(PermissionUtils.class.getName()); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     private static LaserGun plugin; | ||||||
|  |     public PermissionUtils(LaserGun givenPlugin)  { plugin = givenPlugin;  } | ||||||
|  |  | ||||||
|  |     // Method to get the permission string from the Permissions enum. | ||||||
|  |     public static boolean playerHasPermission(String username, Permissions permission) | ||||||
|  |     { | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Permission: " + permission.permission + "; Player name is: " + username); | ||||||
|  |         Player user = plugin.getServer().getPlayer(username); | ||||||
|  |         { | ||||||
|  |             if (user != null && user.hasPermission(permission.permission)) | ||||||
|  |             { | ||||||
|  |                 return true; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     public static boolean playerHasPermission(CommandSender sender, Permissions permission) | ||||||
|  |     { | ||||||
|  |         debugger.sendDebugMessage(Level.INFO, "Permission: " + permission.permission + "; Player name is: " + sender.getName()); | ||||||
|  |         { | ||||||
|  |             if(sender.hasPermission(permission.permission) || sender instanceof ConsoleCommandSender) | ||||||
|  |             { | ||||||
|  |                 return true; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										18
									
								
								src/net/mindoverflow/lasergun/utils/Permissions.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/net/mindoverflow/lasergun/utils/Permissions.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | package net.mindoverflow.lasergun.utils; | ||||||
|  |  | ||||||
|  | public enum Permissions | ||||||
|  | { | ||||||
|  |     ITEM_GET("lasergun.command.getgun"), | ||||||
|  |  | ||||||
|  |     ITEM_USE("lasergun.usegun"), | ||||||
|  |  | ||||||
|  |     COMMAND_RELOAD("lasergun.command.reload"), | ||||||
|  |  | ||||||
|  |     GET_UPDATES_NOTIFICATIONS("lasergun.updates"), | ||||||
|  |  | ||||||
|  |     ; | ||||||
|  |  | ||||||
|  |     public String permission; | ||||||
|  |  | ||||||
|  |     Permissions(String permission) { this.permission = permission; } | ||||||
|  | } | ||||||
							
								
								
									
										268
									
								
								src/net/mindoverflow/lasergun/utils/stats/UpdateChecker.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										268
									
								
								src/net/mindoverflow/lasergun/utils/stats/UpdateChecker.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,268 @@ | |||||||
|  | package net.mindoverflow.lasergun.utils.stats; | ||||||
|  |  | ||||||
|  | import com.google.gson.JsonArray; | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | import com.google.gson.JsonObject; | ||||||
|  | import com.google.gson.JsonParser; | ||||||
|  | import net.mindoverflow.lasergun.LaserGun; | ||||||
|  | import net.mindoverflow.lasergun.utils.*; | ||||||
|  | import org.bukkit.command.CommandSender; | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  | import org.bukkit.scheduler.BukkitTask; | ||||||
|  |  | ||||||
|  | import javax.net.ssl.HttpsURLConnection; | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.io.InputStream; | ||||||
|  | import java.io.InputStreamReader; | ||||||
|  | import java.net.URL; | ||||||
|  | import java.nio.charset.StandardCharsets; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.logging.Level; | ||||||
|  |  | ||||||
|  | public class UpdateChecker implements Runnable | ||||||
|  | { | ||||||
|  |  | ||||||
|  |     public static BukkitTask task; | ||||||
|  |  | ||||||
|  |     Debugger debugger = new Debugger(getClass().getName()); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     public String newVersion, updateLink; | ||||||
|  |     public ArrayList<String> updateText = new ArrayList<>(), warningMessage = new ArrayList<>(); | ||||||
|  |     public Boolean updateWarningBoolean, isNewVersionOut = false; | ||||||
|  |  | ||||||
|  |     public Boolean isServerUnreachable = true; | ||||||
|  |     public String errorCode; | ||||||
|  |  | ||||||
|  |     private LaserGun plugin; | ||||||
|  |     public UpdateChecker(LaserGun givenPlugin) | ||||||
|  |     { | ||||||
|  |         plugin = givenPlugin; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private String servicesUrl = "https://services.mind-overflow.net/"; | ||||||
|  |     private String lasergunUrl = "java/plugins/lasergun/updates/"; | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void run() | ||||||
|  |     { | ||||||
|  |         CommandSender console = plugin.getServer().getConsoleSender(); | ||||||
|  |         updateText.clear(); | ||||||
|  |         warningMessage.clear(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         try | ||||||
|  |         { | ||||||
|  |             // Open an HTTPS Connection to the MOWS (Mind Overflow Web Services) | ||||||
|  |             HttpsURLConnection connection = (HttpsURLConnection) new URL(servicesUrl).openConnection(); | ||||||
|  |             connection.setRequestMethod("HEAD"); | ||||||
|  |  | ||||||
|  |             // Read the response code. | ||||||
|  |             int responseCode = connection.getResponseCode(); | ||||||
|  |  | ||||||
|  |             // If it's not "OK"... Stop | ||||||
|  |             if (responseCode != 200) | ||||||
|  |             { | ||||||
|  |                 setAndSendErrorCode(responseCode + "", console); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             errorCode = null; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         } // Exception means the server was unreachable. Stop | ||||||
|  |         catch (IOException e) | ||||||
|  |         { | ||||||
|  |             sendUnreachableCode(console); | ||||||
|  |             isServerUnreachable = true; | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         isServerUnreachable = false; | ||||||
|  |  | ||||||
|  |         // Now, try loading the JSON file... | ||||||
|  |         InputStream jsonIS; | ||||||
|  |         try | ||||||
|  |         { | ||||||
|  |  | ||||||
|  |             jsonIS = new URL( servicesUrl + lasergunUrl + "update.json").openStream(); | ||||||
|  |  | ||||||
|  |         } catch (IOException e) | ||||||
|  |         { | ||||||
|  |  | ||||||
|  |             setAndSendErrorCode("null json", console); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // And parsing it... | ||||||
|  |         JsonParser jsonParser = new JsonParser(); | ||||||
|  |         JsonObject json = (JsonObject)jsonParser.parse(new InputStreamReader(jsonIS, StandardCharsets.UTF_8)); | ||||||
|  |  | ||||||
|  |         // Close the input stream... | ||||||
|  |         try { | ||||||
|  |             jsonIS.close(); | ||||||
|  |         } catch (IOException ignored) | ||||||
|  |         { | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Check if the "version" String is present... | ||||||
|  |         newVersion = null; | ||||||
|  |         if(json.get("version") == null) | ||||||
|  |         { | ||||||
|  |             setAndSendErrorCode("null version", console); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Store it. | ||||||
|  |         newVersion = json.get("version").getAsString(); | ||||||
|  |  | ||||||
|  |         // Check if versions match... And stop | ||||||
|  |         if(newVersion.equalsIgnoreCase(plugin.getDescription().getVersion())) | ||||||
|  |         { | ||||||
|  |             isNewVersionOut = false; | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // If we are here, it means a new version is out. | ||||||
|  |         isNewVersionOut = true; | ||||||
|  |  | ||||||
|  |         // Load the update link... | ||||||
|  |         updateLink = null; | ||||||
|  |         if(json.get("link") == null) | ||||||
|  |         { | ||||||
|  |             setAndSendErrorCode("null link", console); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         updateLink = json.get("link").getAsString(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         // Load all the lines from the String Array... | ||||||
|  |         if(json.get("text") == null) | ||||||
|  |         { | ||||||
|  |             setAndSendErrorCode("null text", console); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         JsonArray updateTextArray = json.get("text").getAsJsonArray(); | ||||||
|  |         for(JsonElement obj : updateTextArray) | ||||||
|  |         { | ||||||
|  |             String relatedString = obj.getAsString(); | ||||||
|  |             updateText.add(relatedString); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Load the warning object... | ||||||
|  |         if(json.get("warning") == null) | ||||||
|  |         { | ||||||
|  |             setAndSendErrorCode("null warning", console); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         JsonObject warning = json.get("warning").getAsJsonObject(); | ||||||
|  |  | ||||||
|  |         // See if the warning is enabled... | ||||||
|  |         if(warning.get("enabled") == null) | ||||||
|  |         { | ||||||
|  |             setAndSendErrorCode("null warning boolean", console); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         updateWarningBoolean = warning.get("enabled").getAsBoolean(); | ||||||
|  |  | ||||||
|  |         // Load all the lines from the String Array... | ||||||
|  |         if(warning.get("text") == null) | ||||||
|  |         { | ||||||
|  |             setAndSendErrorCode("null warning text", console); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         JsonArray warningTextArray = warning.get("text").getAsJsonArray(); | ||||||
|  |         for(JsonElement obj : warningTextArray) | ||||||
|  |         { | ||||||
|  |             String relatedString = obj.getAsString(); | ||||||
|  |             warningMessage.add(relatedString); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // And finally send the message! | ||||||
|  |         sendUpdateMessages(console); | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     public void sendUnreachableCode(CommandSender sender) | ||||||
|  |     { | ||||||
|  |         String pluginName = plugin.getName(); | ||||||
|  |         MessageUtils.sendColorizedMessage(sender, "&7-----[&3 " + pluginName + " Updater &7]-----"); | ||||||
|  |         MessageUtils.sendColorizedMessage(sender, "&cWarning! Updates Server is unreachable."); | ||||||
|  |         MessageUtils.sendColorizedMessage(sender, "&cTry fixing connectivity problems and reload " + pluginName + " with &3/" + pluginName.toLowerCase() + " reload&c!"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setAndSendErrorCode(String code, CommandSender sender) | ||||||
|  |     { | ||||||
|  |         isNewVersionOut = false; | ||||||
|  |         errorCode = code; | ||||||
|  |         sendErrorCode(sender); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void sendErrorCode(CommandSender sender) | ||||||
|  |     { | ||||||
|  |         String pluginName = plugin.getName(); | ||||||
|  |         MessageUtils.sendColorizedMessage(sender, "&7-----[&3 " + pluginName + " Updater &7]-----"); | ||||||
|  |         MessageUtils.sendColorizedMessage(sender, "&cWarning! Updates Server returned error code: &4" + errorCode); | ||||||
|  |         MessageUtils.sendColorizedMessage(sender, "&cPlease contact the developer (" + debugger.authorName + ") immediately."); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     public void sendUpdateMessages(CommandSender sender) | ||||||
|  |     { | ||||||
|  |         String pluginName = plugin.getName(); | ||||||
|  |         MessageUtils.sendColorizedMessage(sender, "&7-----[&3 " + pluginName + " Updater &7]-----"); | ||||||
|  |         MessageUtils.sendColorizedMessage(sender, "&7A new version is out: &6" + newVersion); | ||||||
|  |         MessageUtils.sendColorizedMessage(sender, "&7Download: &6" + updateLink); | ||||||
|  |         for(String line : updateText) | ||||||
|  |         { | ||||||
|  |             MessageUtils.sendColorizedMessage(sender, line); | ||||||
|  |         } | ||||||
|  |         if(updateWarningBoolean) | ||||||
|  |         { | ||||||
|  |             for(String line : warningMessage) | ||||||
|  |             { | ||||||
|  |                 MessageUtils.sendColorizedMessage(sender, line); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void playerMessage(CommandSender player) | ||||||
|  |     { | ||||||
|  |         plugin.getServer().getScheduler().runTaskLater(plugin, () -> | ||||||
|  |         { | ||||||
|  |             // Stop this in case the sender is the console: it already receives intended messages. | ||||||
|  |             if(!(player instanceof Player)) return; | ||||||
|  |  | ||||||
|  |             // Check if the updater is enabled. | ||||||
|  |             if(CommonValues.updateChecker) | ||||||
|  |             { | ||||||
|  |                 debugger.sendDebugMessage(Level.INFO, "Update Checker is enabled!"); | ||||||
|  |                 // Check if the player has permissions to get notifications about updates. | ||||||
|  |                 if(PermissionUtils.playerHasPermission(player, Permissions.GET_UPDATES_NOTIFICATIONS)) | ||||||
|  |                 { | ||||||
|  |                     debugger.sendDebugMessage(Level.INFO, "Player has permissions to check updates."); | ||||||
|  |                     // Instantiate the update checker so we can access it. | ||||||
|  |  | ||||||
|  |                     if(isNewVersionOut) | ||||||
|  |                     { | ||||||
|  |                         sendUpdateMessages(player); | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                     if(isServerUnreachable) | ||||||
|  |                     {sendUnreachableCode(player); | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                     if(errorCode != null) | ||||||
|  |                     { | ||||||
|  |  | ||||||
|  |                         sendErrorCode(player); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, 40); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										11
									
								
								src/plugin.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/plugin.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | name: LaserGun | ||||||
|  | version: alpha-BUILD_NUMBER | ||||||
|  | author: mind_overflow | ||||||
|  | main: net.mindoverflow.lasergun.LaserGun | ||||||
|  | api-version: 1.13 | ||||||
|  | softdepend: [ProtocolLib] | ||||||
|  |  | ||||||
|  | commands: | ||||||
|  |   lasergun: | ||||||
|  |     description: LaserGun base command. | ||||||
|  |     usage: /lasergun <args> | ||||||
		Reference in New Issue
	
	Block a user