From a2da3bae4a0fb21f4b25add2c05bf6afe76a7c88 Mon Sep 17 00:00:00 2001 From: Morlok8k Date: Fri, 10 Aug 2012 03:16:20 -0700 Subject: [PATCH] 1.7.0 (Finally! Now to add things for 1.7.1! *Sigh*) --- .settings/org.eclipse.jdt.ui.prefs | 54 ++- README | 153 +++++---- bin/MLG-BuildID | 1 + bin/MinecraftLandGenerator.conf | 5 +- bin/MinecraftLandGenerator.jar | Bin 139723 -> 165008 bytes ..._(Linux).sh => MLG_Initial_Setup_Linux.sh} | 0 ....command => MLG_Initial_Setup_Mac.command} | 0 ...ows).cmd => MLG_Initial_Setup_Windows.cmd} | 0 ...awn_(Linux).sh => MLG_Printspawn_Linux.sh} | 0 ...ac).command => MLG_Printspawn_Mac.command} | 0 ...indows).cmd => MLG_Printspawn_Windows.cmd} | 0 scripts/MLG_Update_Files.txt | 48 +-- ...(Linux).txt => MLG_Update_Files_Linux.txt} | 16 +- ...les_(Mac).txt => MLG_Update_Files_Mac.txt} | 16 +- ...dows).txt => MLG_Update_Files_Windows.txt} | 16 +- .../{Run_MLG_(Linux).sh => Run_MLG_Linux.sh} | 0 ..._MLG_(Mac).command => Run_MLG_Mac.command} | 0 ..._MLG_(Windows).cmd => Run_MLG_Windows.cmd} | 0 ..._Server_(Linux).sh => Run_Server_Linux.sh} | 0 ...r_(Mac).command => Run_Server_Mac.command} | 0 ...r_(Windows).cmd => Run_Server_Windows.cmd} | 0 ...ux).sh => Update_MLG_Extra_Files_Linux.sh} | 0 ...and => Update_MLG_Extra_Files_Mac.command} | 0 ...cmd => Update_MLG_Extra_Files_Windows.cmd} | 0 ...ate_MLG_(Linux).sh => Update_MLG_Linux.sh} | 0 ...G_(Mac).command => Update_MLG_Mac.command} | 0 ...G_(Windows).cmd => Update_MLG_Windows.cmd} | 0 ...rver_(Linux).sh => Update_Server_Linux.sh} | 0 ...Mac).command => Update_Server_Mac.command} | 0 ...Windows).cmd => Update_Server_Windows.cmd} | 0 .../Arraylist.java} | 9 +- .../Coordinates.java | 38 +-- .../DownloadFile.java} | 25 +- .../FileRead.java} | 23 +- .../FileWrite.java} | 23 +- .../Input_CLI.java} | 7 +- .../MD5.java} | 22 +- .../MinecraftLandGenerator}/Main.java | 196 +++++------ .../MinecraftLandGenerator/Misc.java} | 30 +- .../RCON.java} | 9 +- .../Readme_and_HelpInfo.java | 316 ++++++++++++++++++ .../SelfAware.java} | 9 +- .../MinecraftLandGenerator/Server.java} | 30 +- .../MinecraftLandGenerator/SpawnPoint.java} | 57 ++-- .../StringArrayParse.java} | 12 +- .../Time.java} | 57 ++-- .../Update.java} | 106 +++--- .../MinecraftLandGenerator/WorldVerify.java} | 14 +- .../MLG_Readme_and_HelpInfo.java | 316 ------------------ src/org/w3c/bert_bos/UTF8URL/Unescape.java | 20 +- 50 files changed, 835 insertions(+), 793 deletions(-) rename scripts/{MLG_Initial_Setup_(Linux).sh => MLG_Initial_Setup_Linux.sh} (100%) rename scripts/{MLG_Initial_Setup_(Mac).command => MLG_Initial_Setup_Mac.command} (100%) rename scripts/{MLG_Initial_Setup_(Windows).cmd => MLG_Initial_Setup_Windows.cmd} (100%) rename scripts/{MLG_Printspawn_(Linux).sh => MLG_Printspawn_Linux.sh} (100%) rename scripts/{MLG_Printspawn_(Mac).command => MLG_Printspawn_Mac.command} (100%) rename scripts/{MLG_Printspawn_(Windows).cmd => MLG_Printspawn_Windows.cmd} (100%) rename scripts/{MLG_Update_Files_(Linux).txt => MLG_Update_Files_Linux.txt} (67%) rename scripts/{MLG_Update_Files_(Mac).txt => MLG_Update_Files_Mac.txt} (66%) rename scripts/{MLG_Update_Files_(Windows).txt => MLG_Update_Files_Windows.txt} (65%) rename scripts/{Run_MLG_(Linux).sh => Run_MLG_Linux.sh} (100%) rename scripts/{Run_MLG_(Mac).command => Run_MLG_Mac.command} (100%) rename scripts/{Run_MLG_(Windows).cmd => Run_MLG_Windows.cmd} (100%) rename scripts/{Run_Server_(Linux).sh => Run_Server_Linux.sh} (100%) rename scripts/{Run_Server_(Mac).command => Run_Server_Mac.command} (100%) rename scripts/{Run_Server_(Windows).cmd => Run_Server_Windows.cmd} (100%) rename scripts/{Update_MLG_Extra_Files_(Linux).sh => Update_MLG_Extra_Files_Linux.sh} (100%) rename scripts/{Update_MLG_Extra_Files_(Mac).command => Update_MLG_Extra_Files_Mac.command} (100%) rename scripts/{Update_MLG_Extra_Files_(Windows).cmd => Update_MLG_Extra_Files_Windows.cmd} (100%) rename scripts/{Update_MLG_(Linux).sh => Update_MLG_Linux.sh} (100%) rename scripts/{Update_MLG_(Mac).command => Update_MLG_Mac.command} (100%) rename scripts/{Update_MLG_(Windows).cmd => Update_MLG_Windows.cmd} (100%) rename scripts/{Update_Server_(Linux).sh => Update_Server_Linux.sh} (100%) rename scripts/{Update_Server_(Mac).command => Update_Server_Mac.command} (100%) rename scripts/{Update_Server_(Windows).cmd => Update_Server_Windows.cmd} (100%) rename src/morlok8k/{minecraft/landgenerator/MLG_ArrayList.java => MinecraftLandGenerator/Arraylist.java} (50%) rename src/morlok8k/{minecraft/landgenerator => MinecraftLandGenerator}/Coordinates.java (86%) rename src/morlok8k/{minecraft/landgenerator/MLG_DownloadFile.java => MinecraftLandGenerator/DownloadFile.java} (76%) rename src/morlok8k/{minecraft/landgenerator/MLG_FileRead.java => MinecraftLandGenerator/FileRead.java} (89%) rename src/morlok8k/{minecraft/landgenerator/MLG_FileWrite.java => MinecraftLandGenerator/FileWrite.java} (84%) rename src/morlok8k/{minecraft/landgenerator/MLG_input_CLI.java => MinecraftLandGenerator/Input_CLI.java} (76%) rename src/morlok8k/{minecraft/landgenerator/MLG_MD5.java => MinecraftLandGenerator/MD5.java} (61%) rename src/{corrodias/minecraft/landgenerator => morlok8k/MinecraftLandGenerator}/Main.java (82%) rename src/{corrodias/minecraft/landgenerator/MLG_Misc.java => morlok8k/MinecraftLandGenerator/Misc.java} (64%) rename src/morlok8k/{minecraft/landgenerator/MLG_RCON.java => MinecraftLandGenerator/RCON.java} (82%) create mode 100644 src/morlok8k/MinecraftLandGenerator/Readme_and_HelpInfo.java rename src/morlok8k/{minecraft/landgenerator/MLG_SelfAware.java => MinecraftLandGenerator/SelfAware.java} (69%) rename src/{corrodias/minecraft/landgenerator/MLG_Server.java => morlok8k/MinecraftLandGenerator/Server.java} (90%) rename src/{corrodias/minecraft/landgenerator/MLG_SpawnPoint.java => morlok8k/MinecraftLandGenerator/SpawnPoint.java} (71%) rename src/morlok8k/{minecraft/landgenerator/MLG_StringArrayParse.java => MinecraftLandGenerator/StringArrayParse.java} (76%) rename src/morlok8k/{minecraft/landgenerator/MLG_Time.java => MinecraftLandGenerator/Time.java} (70%) rename src/morlok8k/{minecraft/landgenerator/MLG_Update.java => MinecraftLandGenerator/Update.java} (81%) rename src/{corrodias/minecraft/landgenerator/MLG_WorldVerify.java => morlok8k/MinecraftLandGenerator/WorldVerify.java} (90%) delete mode 100644 src/morlok8k/minecraft/landgenerator/MLG_Readme_and_HelpInfo.java diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs index 57a75ed..d031ec4 100644 --- a/.settings/org.eclipse.jdt.ui.prefs +++ b/.settings/org.eclipse.jdt.ui.prefs @@ -1,4 +1,56 @@ -#Wed Nov 02 01:36:56 PDT 2011 +cleanup.add_default_serial_version_id=false +cleanup.add_generated_serial_version_id=true +cleanup.add_missing_annotations=true +cleanup.add_missing_deprecated_annotations=true +cleanup.add_missing_methods=true +cleanup.add_missing_nls_tags=false +cleanup.add_missing_override_annotations=true +cleanup.add_missing_override_annotations_interface_methods=true +cleanup.add_serial_version_id=true +cleanup.always_use_blocks=true +cleanup.always_use_parentheses_in_expressions=true +cleanup.always_use_this_for_non_static_field_access=false +cleanup.always_use_this_for_non_static_method_access=false +cleanup.convert_to_enhanced_for_loop=false +cleanup.correct_indentation=true +cleanup.format_source_code=true +cleanup.format_source_code_changes_only=false +cleanup.make_local_variable_final=true +cleanup.make_parameters_final=true +cleanup.make_private_fields_final=true +cleanup.make_type_abstract_if_missing_method=false +cleanup.make_variable_declarations_final=true +cleanup.never_use_blocks=false +cleanup.never_use_parentheses_in_expressions=false +cleanup.organize_imports=true +cleanup.qualify_static_field_accesses_with_declaring_class=false +cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +cleanup.qualify_static_member_accesses_with_declaring_class=true +cleanup.qualify_static_method_accesses_with_declaring_class=false +cleanup.remove_private_constructors=true +cleanup.remove_trailing_whitespaces=true +cleanup.remove_trailing_whitespaces_all=true +cleanup.remove_trailing_whitespaces_ignore_empty=false +cleanup.remove_unnecessary_casts=true +cleanup.remove_unnecessary_nls_tags=true +cleanup.remove_unused_imports=true +cleanup.remove_unused_local_variables=false +cleanup.remove_unused_private_fields=true +cleanup.remove_unused_private_members=false +cleanup.remove_unused_private_methods=true +cleanup.remove_unused_private_types=true +cleanup.sort_members=false +cleanup.sort_members_all=false +cleanup.use_blocks=true +cleanup.use_blocks_only_for_return_and_throw=false +cleanup.use_parentheses_in_expressions=true +cleanup.use_this_for_non_static_field_access=true +cleanup.use_this_for_non_static_field_access_only_if_necessary=true +cleanup.use_this_for_non_static_method_access=true +cleanup.use_this_for_non_static_method_access_only_if_necessary=true +cleanup_profile=_Morlok8k +cleanup_settings_version=2 eclipse.preferences.version=1 editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true formatter_profile=_Morlok8k diff --git a/README b/README index 8a0165b..eb597c6 100644 --- a/README +++ b/README @@ -1,10 +1,10 @@ -Minecraft Land Generator version 1.6.3 +Minecraft Land Generator version 1.7.0 -Updated June 12, 2012 -(BuildID: 1339559312000) +Updated August 10, 2012 +(BuildID: 1344593776000) Original Code by Corrodias November 2010 -Enhanced Code by Morlok8k Feb. 2011 to Now (or at least to June 12, 2012!) +Enhanced Code by Morlok8k Feb. 2011 to Now (or at least to August 10, 2012!) Additional Code by pr0f1x October 2011 Website: https://sites.google.com/site/minecraftlandgenerator/ @@ -25,8 +25,85 @@ The "unescape" method/function is also not Public Domain. Its License is the W3 Other Public Domain code has been used in this program, and references to sources are included in the comments of Minecraft Land Generator's source code. ----------------------------------------------- +Usage: java -jar MinecraftLandGenerator.jar x z [serverpath] [switches] + +Arguments: + x : X range to generate + z : Z range to generate + serverpath : the path to the directory in which the server runs (takes precedence over the config file setting) + +Switches: + -verbose : causes the application to output the server's messages to the console + -v : same as -verbose + -w : Ignore [WARNING] and [SEVERE] messages. + -alt : alternate server launch sequence + -a : same as -alt + -nowait : don't pause for anything + -n : same as -nowait + -i# : override the iteration spawn offset increment (default 380) (example: -i100) + -x# : set the X offset to generate land around (example: -x0 or -x1000 or -x-500) + -z# : set the Z offset to generate land around (example: -z0 or -z1000 or -z-500) + +Other options: + java -jar MinecraftLandGenerator.jar -update + Checks for and downloads new versions of MLG online. + + java -jar MinecraftLandGenerator.jar -printspawn + java -jar MinecraftLandGenerator.jar -ps + Outputs the current world's spawn point coordinates. + + java -jar MinecraftLandGenerator.jar -conf + java -jar MinecraftLandGenerator.jar -conf download + Generates or downloads a MinecraftLandGenerator.conf file. + + java -jar MinecraftLandGenerator.jar -readme readme.txt + java -jar MinecraftLandGenerator.jar -readme + Generates a readme file using supplied name or the default _MLG_Readme.txt + + java -jar MinecraftLandGenerator.jar -downloadfile http://example.com/file.txt + Downloads whatever file from the internet you give it. + java -jar MinecraftLandGenerator.jar -downloadlist list.txt + list.txt (or any other file) contains a URL on each line which will be downloaded. + + java -jar MinecraftLandGenerator.jar -version + java -jar MinecraftLandGenerator.jar -help + java -jar MinecraftLandGenerator.jar /? + Prints this message. + +When launched with the -conf switch, this application creates a MinecraftLandGenerator.conf file that contains configuration options. +If this file does not exist or does not contain all required properties, the application will not run. + +MinecraftLandGenerator.conf properties: + Java : The command line to use to launch the server + ServerPath : The path to the directory in which the server runs (can be overridden by the serverpath argument) + Done_Text : The output from the server that tells us that we are done + Preparing_Text : The output from the server that tells us the percentage +Preparing_Level : The output from the server that tells us the level it is working on + Level-0 : Name of Level 0: The Overworld + Level-1 : Name of Level 1: The Nether + Level-2 : Name of Level 2: The End + Level-3 : Name of Level 3: (Future Level) + Level-4 : Name of Level 4: (Future Level) + Level-5 : Name of Level 5: (Future Level) + Level-6 : Name of Level 6: (Future Level) + Level-7 : Name of Level 7: (Future Level) + Level-8 : Name of Level 8: (Future Level) + Level-9 : Name of Level 9: (Future Level) + WaitSave : Optional: Wait before saving. + +----------------------------------------------- + Version History: Morlok8k: +1.7.0 +- Major Code Optimization +- Drastically reduced the amount of time it takes for MLG to expand a world after it has already done so before! + (To do this, I rewrote the Main loop of the program, and add my own Coordinate object) +- Added Resume Functionality +- Updated Time Output yet again. +- Made xx% output nicer by rewriting previous existing line. +- Misc. Tweaks +- Misc. Additions 1.6.3 - Minor Code Optimization - Finely got on the ball and added the JNBT source and everything (as an internal .zip) to be completely faithful to his license @@ -151,71 +228,3 @@ Notes: Due to changes in server beta 1.6, it now generates the nether as well as the world at the same time. However, Since beta 1.9 and Minecraft 1.0, the nether or the end is no longer generated.I recommend using MCEDIT to relight the map after you generate it. This will take a long time, but should fix all those incorrectly dark spots in your level. ------------------------------------------------ - -Usage: java -jar MinecraftLandGenerator.jar x z [serverpath] [switches] - -Arguments: - x : X range to generate - z : Z range to generate - serverpath : the path to the directory in which the server runs (takes precedence over the config file setting) - -Switches: - -verbose : causes the application to output the server's messages to the console - -v : same as -verbose - -w : Ignore [WARNING] and [SEVERE] messages. - -alt : alternate server launch sequence - -a : same as -alt - -nowait : don't pause for anything - -n : same as -nowait - -i# : override the iteration spawn offset increment (default 380) (example: -i100) - -x# : set the X offset to generate land around (example: -x0 or -x1000 or -x-500) - -z# : set the Z offset to generate land around (example: -z0 or -z1000 or -z-500) - -Other options: - java -jar MinecraftLandGenerator.jar -update - Checks for and downloads new versions of MLG online. - - java -jar MinecraftLandGenerator.jar -printspawn - java -jar MinecraftLandGenerator.jar -ps - Outputs the current world's spawn point coordinates. - - java -jar MinecraftLandGenerator.jar -conf - java -jar MinecraftLandGenerator.jar -conf download - Generates or downloads a MinecraftLandGenerator.conf file. - - java -jar MinecraftLandGenerator.jar -readme readme.txt - java -jar MinecraftLandGenerator.jar -readme - Generates a readme file using supplied name or the default _MLG_Readme.txt - - java -jar MinecraftLandGenerator.jar -downloadfile http://example.com/file.txt - Downloads whatever file from the internet you give it. - java -jar MinecraftLandGenerator.jar -downloadlist list.txt - list.txt (or any other file) contains a URL on each line which will be downloaded. - - java -jar MinecraftLandGenerator.jar -version - java -jar MinecraftLandGenerator.jar -help - java -jar MinecraftLandGenerator.jar /? - Prints this message. - -When launched with the -conf switch, this application creates a MinecraftLandGenerator.conf file that contains configuration options. -If this file does not exist or does not contain all required properties, the application will not run. - -MinecraftLandGenerator.conf properties: - Java : The command line to use to launch the server - ServerPath : The path to the directory in which the server runs (can be overridden by the serverpath argument) - Done_Text : The output from the server that tells us that we are done - Preparing_Text : The output from the server that tells us the percentage -Preparing_Level : The output from the server that tells us the level it is working on - Level-0 : Name of Level 0: The Overworld - Level-1 : Name of Level 1: The Nether - Level-2 : Name of Level 2: The End - Level-3 : Name of Level 3: (Future Level) - Level-4 : Name of Level 4: (Future Level) - Level-5 : Name of Level 5: (Future Level) - Level-6 : Name of Level 6: (Future Level) - Level-7 : Name of Level 7: (Future Level) - Level-8 : Name of Level 8: (Future Level) - Level-9 : Name of Level 9: (Future Level) - WaitSave : Optional: Wait before saving. - diff --git a/bin/MLG-BuildID b/bin/MLG-BuildID index ae5696b..a3dd111 100644 --- a/bin/MLG-BuildID +++ b/bin/MLG-BuildID @@ -55,3 +55,4 @@ F96F4F3862138D498B203C2848086289=1338535367000# MLG v1.6.3 F00F81A5C5833DBFF95E85EFD1B8460B=1338951984000# MLG v1.6.3 A28CD4B9DE8E3CB25AB56368A4C44A51=1339493851000# MLG v1.6.3 15241C4B45D9711F4AA4EF25004FEDA6=1339559312000# MLG v1.6.3 +21ECF491552F4A706B7874A1C0A31534=1344593776000# MLG v1.7.0 diff --git a/bin/MinecraftLandGenerator.conf b/bin/MinecraftLandGenerator.conf index cf5a0ab..a99432a 100644 --- a/bin/MinecraftLandGenerator.conf +++ b/bin/MinecraftLandGenerator.conf @@ -1,6 +1,6 @@ -#Minecraft Land Generator Configuration File: Version: 1.6.3 +#Minecraft Land Generator Configuration File: Version: 1.7.0 #Authors: Corrodias, Morlok8k, pr0f1x -#Auto-Generated: Tuesday, June 12, 2012 at 8:48 PM Pacific Daylight Time +#Auto-Generated: Friday, August 10, 2012 at 3:16 AM Pacific Daylight Time #Line to run server: Java=java -Djava.awt.headless=true -Djline.terminal=jline.UnsupportedTerminal -Duser.language=en -Xms1024m -Xmx1024m -Xincgc -jar minecraft_server.jar nogui @@ -25,3 +25,4 @@ Level-9=Level 9 (Future Level) #Optional: Wait a few seconds after saving. WaitSave=false +webLaunch=true diff --git a/bin/MinecraftLandGenerator.jar b/bin/MinecraftLandGenerator.jar index 6ba14c203a643be0ce4039b63bf5f18808536484..5bb77476dfd01dbee3a8c07c5daa81cad14cb7a1 100755 GIT binary patch delta 100555 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 D5S@+L delta 75117 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 z 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

~yWVi?s;t>s`Oo=2zNEu2Qqh}~XNOj%F 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 E2a4%1pa1{> diff --git a/scripts/MLG_Initial_Setup_(Linux).sh b/scripts/MLG_Initial_Setup_Linux.sh similarity index 100% rename from scripts/MLG_Initial_Setup_(Linux).sh rename to scripts/MLG_Initial_Setup_Linux.sh diff --git a/scripts/MLG_Initial_Setup_(Mac).command b/scripts/MLG_Initial_Setup_Mac.command similarity index 100% rename from scripts/MLG_Initial_Setup_(Mac).command rename to scripts/MLG_Initial_Setup_Mac.command diff --git a/scripts/MLG_Initial_Setup_(Windows).cmd b/scripts/MLG_Initial_Setup_Windows.cmd similarity index 100% rename from scripts/MLG_Initial_Setup_(Windows).cmd rename to scripts/MLG_Initial_Setup_Windows.cmd diff --git a/scripts/MLG_Printspawn_(Linux).sh b/scripts/MLG_Printspawn_Linux.sh similarity index 100% rename from scripts/MLG_Printspawn_(Linux).sh rename to scripts/MLG_Printspawn_Linux.sh diff --git a/scripts/MLG_Printspawn_(Mac).command b/scripts/MLG_Printspawn_Mac.command similarity index 100% rename from scripts/MLG_Printspawn_(Mac).command rename to scripts/MLG_Printspawn_Mac.command diff --git a/scripts/MLG_Printspawn_(Windows).cmd b/scripts/MLG_Printspawn_Windows.cmd similarity index 100% rename from scripts/MLG_Printspawn_(Windows).cmd rename to scripts/MLG_Printspawn_Windows.cmd diff --git a/scripts/MLG_Update_Files.txt b/scripts/MLG_Update_Files.txt index 9a3de5f..33f6098 100644 --- a/scripts/MLG_Update_Files.txt +++ b/scripts/MLG_Update_Files.txt @@ -1,26 +1,26 @@ https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Update_Files.txt ###RECHECK### -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Update_Files_%28Linux%29.txt -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Update_Files_%28Mac%29.txt -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Update_Files_%28Windows%29.txt -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_MLG_%28Linux%29.sh -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_MLG_%28Mac%29.command -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_MLG_%28Windows%29.cmd -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_Server_%28Linux%29.sh -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_Server_%28Mac%29.command -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_Server_%28Windows%29.cmd -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_%28Linux%29.sh -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_%28Mac%29.command -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_%28Windows%29.cmd -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_Server_%28Linux%29.sh -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_Server_%28Mac%29.command -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_Server_%28Windows%29.cmd -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Extra_Files_%28Linux%29.sh -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Extra_Files_%28Mac%29.command -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Extra_Files_%28Windows%29.cmd -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Printspawn_%28Linux%29.sh -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Printspawn_%28Mac%29.command -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Printspawn_%28Windows%29.cmd -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Initial_Setup_%28Linux%29.sh -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Initial_Setup_%28Mac%29.command -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Initial_Setup_%28Windows%29.cmd +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Update_Files_Linux.txt +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Update_Files_Mac.txt +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Update_Files_Windows.txt +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_MLG_Linux.sh +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_MLG_Mac.command +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_MLG_Windows.cmd +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_Server_Linux.sh +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_Server_Mac.command +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_Server_Windows.cmd +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Linux.sh +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Mac.command +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Windows.cmd +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_Server_Linux.sh +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_Server_Mac.command +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_Server_Windows.cmd +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Extra_Files_Linux.sh +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Extra_Files_Mac.command +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Extra_Files_Windows.cmd +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Printspawn_Linux.sh +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Printspawn_Mac.command +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Printspawn_Windows.cmd +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Initial_Setup_Linux.sh +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Initial_Setup_Mac.command +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Initial_Setup_Windows.cmd diff --git a/scripts/MLG_Update_Files_(Linux).txt b/scripts/MLG_Update_Files_Linux.txt similarity index 67% rename from scripts/MLG_Update_Files_(Linux).txt rename to scripts/MLG_Update_Files_Linux.txt index 32ca249..2ebc981 100644 --- a/scripts/MLG_Update_Files_(Linux).txt +++ b/scripts/MLG_Update_Files_Linux.txt @@ -1,10 +1,10 @@ -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Update_Files_%28Linux%29.txt +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Update_Files_Linux.txt ###RECHECK### https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Update_Files.txt -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_MLG_%28Linux%29.sh -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_Server_%28Linux%29.sh -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_%28Linux%29.sh -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_Server_%28Linux%29.sh -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Extra_Files_%28Linux%29.sh -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Printspawn_%28Linux%29.sh -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Initial_Setup_%28Linux%29.sh +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_MLG_Linux.sh +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_Server_Linux.sh +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Linux.sh +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_Server_Linux.sh +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Extra_Files_Linux.sh +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Printspawn_Linux.sh +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Initial_Setup_Linux.sh diff --git a/scripts/MLG_Update_Files_(Mac).txt b/scripts/MLG_Update_Files_Mac.txt similarity index 66% rename from scripts/MLG_Update_Files_(Mac).txt rename to scripts/MLG_Update_Files_Mac.txt index fa1ece5..4970577 100644 --- a/scripts/MLG_Update_Files_(Mac).txt +++ b/scripts/MLG_Update_Files_Mac.txt @@ -1,10 +1,10 @@ -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Update_Files_%28Mac%29.txt +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Update_Files_Mac.txt ###RECHECK### https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Update_Files.txt -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_MLG_%28Mac%29.command -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_Server_%28Mac%29.command -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_%28Mac%29.command -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_Server_%28Mac%29.command -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Extra_Files_%28Mac%29.command -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Printspawn_%28Mac%29.command -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Initial_Setup_%28Mac%29.command +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_MLG_Mac.command +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_Server_Mac.command +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Mac.command +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_Server_Mac.command +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Extra_Files_Mac.command +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Printspawn_Mac.command +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Initial_Setup_Mac.command diff --git a/scripts/MLG_Update_Files_(Windows).txt b/scripts/MLG_Update_Files_Windows.txt similarity index 65% rename from scripts/MLG_Update_Files_(Windows).txt rename to scripts/MLG_Update_Files_Windows.txt index aac646a..01804b5 100644 --- a/scripts/MLG_Update_Files_(Windows).txt +++ b/scripts/MLG_Update_Files_Windows.txt @@ -1,10 +1,10 @@ -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Update_Files_%28Windows%29.txt +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Update_Files_Windows.txt ###RECHECK### https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Update_Files.txt -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_MLG_%28Windows%29.cmd -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_Server_%28Windows%29.cmd -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_%28Windows%29.cmd -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_Server_%28Windows%29.cmd -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Extra_Files_%28Windows%29.cmd -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Printspawn_%28Windows%29.cmd -https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Initial_Setup_%28Windows%29.cmd +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_MLG_Windows.cmd +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Run_Server_Windows.cmd +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Windows.cmd +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_Server_Windows.cmd +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/Update_MLG_Extra_Files_Windows.cmd +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Printspawn_Windows.cmd +https://raw.github.com/Morlok8k/MinecraftLandGenerator/master/scripts/MLG_Initial_Setup_Windows.cmd diff --git a/scripts/Run_MLG_(Linux).sh b/scripts/Run_MLG_Linux.sh similarity index 100% rename from scripts/Run_MLG_(Linux).sh rename to scripts/Run_MLG_Linux.sh diff --git a/scripts/Run_MLG_(Mac).command b/scripts/Run_MLG_Mac.command similarity index 100% rename from scripts/Run_MLG_(Mac).command rename to scripts/Run_MLG_Mac.command diff --git a/scripts/Run_MLG_(Windows).cmd b/scripts/Run_MLG_Windows.cmd similarity index 100% rename from scripts/Run_MLG_(Windows).cmd rename to scripts/Run_MLG_Windows.cmd diff --git a/scripts/Run_Server_(Linux).sh b/scripts/Run_Server_Linux.sh similarity index 100% rename from scripts/Run_Server_(Linux).sh rename to scripts/Run_Server_Linux.sh diff --git a/scripts/Run_Server_(Mac).command b/scripts/Run_Server_Mac.command similarity index 100% rename from scripts/Run_Server_(Mac).command rename to scripts/Run_Server_Mac.command diff --git a/scripts/Run_Server_(Windows).cmd b/scripts/Run_Server_Windows.cmd similarity index 100% rename from scripts/Run_Server_(Windows).cmd rename to scripts/Run_Server_Windows.cmd diff --git a/scripts/Update_MLG_Extra_Files_(Linux).sh b/scripts/Update_MLG_Extra_Files_Linux.sh similarity index 100% rename from scripts/Update_MLG_Extra_Files_(Linux).sh rename to scripts/Update_MLG_Extra_Files_Linux.sh diff --git a/scripts/Update_MLG_Extra_Files_(Mac).command b/scripts/Update_MLG_Extra_Files_Mac.command similarity index 100% rename from scripts/Update_MLG_Extra_Files_(Mac).command rename to scripts/Update_MLG_Extra_Files_Mac.command diff --git a/scripts/Update_MLG_Extra_Files_(Windows).cmd b/scripts/Update_MLG_Extra_Files_Windows.cmd similarity index 100% rename from scripts/Update_MLG_Extra_Files_(Windows).cmd rename to scripts/Update_MLG_Extra_Files_Windows.cmd diff --git a/scripts/Update_MLG_(Linux).sh b/scripts/Update_MLG_Linux.sh similarity index 100% rename from scripts/Update_MLG_(Linux).sh rename to scripts/Update_MLG_Linux.sh diff --git a/scripts/Update_MLG_(Mac).command b/scripts/Update_MLG_Mac.command similarity index 100% rename from scripts/Update_MLG_(Mac).command rename to scripts/Update_MLG_Mac.command diff --git a/scripts/Update_MLG_(Windows).cmd b/scripts/Update_MLG_Windows.cmd similarity index 100% rename from scripts/Update_MLG_(Windows).cmd rename to scripts/Update_MLG_Windows.cmd diff --git a/scripts/Update_Server_(Linux).sh b/scripts/Update_Server_Linux.sh similarity index 100% rename from scripts/Update_Server_(Linux).sh rename to scripts/Update_Server_Linux.sh diff --git a/scripts/Update_Server_(Mac).command b/scripts/Update_Server_Mac.command similarity index 100% rename from scripts/Update_Server_(Mac).command rename to scripts/Update_Server_Mac.command diff --git a/scripts/Update_Server_(Windows).cmd b/scripts/Update_Server_Windows.cmd similarity index 100% rename from scripts/Update_Server_(Windows).cmd rename to scripts/Update_Server_Windows.cmd diff --git a/src/morlok8k/minecraft/landgenerator/MLG_ArrayList.java b/src/morlok8k/MinecraftLandGenerator/Arraylist.java similarity index 50% rename from src/morlok8k/minecraft/landgenerator/MLG_ArrayList.java rename to src/morlok8k/MinecraftLandGenerator/Arraylist.java index 82af88b..7404993 100644 --- a/src/morlok8k/minecraft/landgenerator/MLG_ArrayList.java +++ b/src/morlok8k/MinecraftLandGenerator/Arraylist.java @@ -1,20 +1,19 @@ /** * */ -package morlok8k.minecraft.landgenerator; +package morlok8k.MinecraftLandGenerator; import java.util.ArrayList; -import corrodias.minecraft.landgenerator.Main; /** * @author morlok8k * */ -public class MLG_ArrayList { +public class Arraylist { - public static ArrayList arrayListRemove(ArrayList list, - ArrayList remove) { + public static ArrayList arrayListRemove(final ArrayList list, + final ArrayList remove) { boolean changed = false; changed = list.removeAll(remove); diff --git a/src/morlok8k/minecraft/landgenerator/Coordinates.java b/src/morlok8k/MinecraftLandGenerator/Coordinates.java similarity index 86% rename from src/morlok8k/minecraft/landgenerator/Coordinates.java rename to src/morlok8k/MinecraftLandGenerator/Coordinates.java index 8c457e9..d355dfd 100644 --- a/src/morlok8k/minecraft/landgenerator/Coordinates.java +++ b/src/morlok8k/MinecraftLandGenerator/Coordinates.java @@ -1,4 +1,4 @@ -package morlok8k.minecraft.landgenerator; +package morlok8k.MinecraftLandGenerator; /** * Coordinates are in the form of [X,Y,Z] or (X,Z)
@@ -22,7 +22,7 @@ public class Coordinates { * @param y * @param z */ - public Coordinates(int x, int y, int z) { + public Coordinates(final int x, final int y, final int z) { super(); X = x; Y = y; @@ -61,7 +61,7 @@ public class Coordinates { * @param x * the x to set */ - public void setX(int x) { + public void setX(final int x) { X = x; } @@ -69,7 +69,7 @@ public class Coordinates { * @param y * the y to set */ - public void setY(int y) { + public void setY(final int y) { Y = y; } @@ -77,7 +77,7 @@ public class Coordinates { * @param z * the z to set */ - public void setZ(int z) { + public void setZ(final int z) { Z = z; } @@ -143,7 +143,7 @@ public class Coordinates { x = Integer.parseInt(sX); y = Integer.parseInt(sY); z = Integer.parseInt(sZ); - } catch (NumberFormatException e) { + } catch (final NumberFormatException e) { return new Coordinates(0, 0, 0); } @@ -169,7 +169,7 @@ public class Coordinates { } - public String toString(boolean Short) { + public String toString(final boolean Short) { if (Short) { // We are overloading toString with an additional option: return ("(" + X + "," + Z + ")"); // Basically just an option to return just X and Z (formatted differently as well: "(X,Z)") } @@ -188,9 +188,9 @@ public class Coordinates { final int prime = 31; // My hard coded prime number int result = 1; // The hard coded number I start with - result = prime * result + X; // Add the X data - result = prime * result + Y; // Add the Y data - result = prime * result + Z; // Add the Z data + result = (prime * result) + X; // Add the X data + result = (prime * result) + Y; // Add the Y data + result = (prime * result) + Z; // Add the Z data return result; //this result will consistently give the same result for the same data. // [0,0,0] will always give 29791. [1,2,3] will always give 30817. //yes, If I was lazy, I could just do a "return 0;" and it would still be technically valid. @@ -201,27 +201,27 @@ public class Coordinates { * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { // I am overriding the inherited equals method. // Because it doesn't know how to deal with my custom data. // So instead of always failing, it actually works! // (by default it gets the memory addresses of each object.) // An object must equal itself - if (this == obj) return true; + if (this == obj) { return true; } // No object equals null - if (obj == null) return false; - if (this == null) return false; + if (obj == null) { return false; } + if (this == null) { return false; } // Objects of different types are never equal - if (getClass() != obj.getClass()) return false; + if (getClass() != obj.getClass()) { return false; } // Cast to an Coordinates, then compare the data - Coordinates c = (Coordinates) obj; - if (X != c.X) return false; - if (Y != c.Y) return false; - if (Z != c.Z) return false; + final Coordinates c = (Coordinates) obj; + if (X != c.X) { return false; } + if (Y != c.Y) { return false; } + if (Z != c.Z) { return false; } return true; // If none of the above returned something, they must be equal! } } diff --git a/src/morlok8k/minecraft/landgenerator/MLG_DownloadFile.java b/src/morlok8k/MinecraftLandGenerator/DownloadFile.java similarity index 76% rename from src/morlok8k/minecraft/landgenerator/MLG_DownloadFile.java rename to src/morlok8k/MinecraftLandGenerator/DownloadFile.java index fe7c3d6..8b0793a 100644 --- a/src/morlok8k/minecraft/landgenerator/MLG_DownloadFile.java +++ b/src/morlok8k/MinecraftLandGenerator/DownloadFile.java @@ -1,4 +1,4 @@ -package morlok8k.minecraft.landgenerator; +package morlok8k.MinecraftLandGenerator; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; @@ -10,9 +10,8 @@ import java.net.URL; import org.w3c.bert_bos.UTF8URL.Unescape; -import corrodias.minecraft.landgenerator.Main; -public class MLG_DownloadFile { +public class DownloadFile { /** * @@ -29,7 +28,7 @@ public class MLG_DownloadFile { * Displays output if true * @return Boolean: true if download was successful, false if download wasn't */ - public static boolean downloadFile(String URL, boolean Output) { + public static boolean downloadFile(final String URL, final boolean Output) { boolean success = true; @@ -41,7 +40,7 @@ public class MLG_DownloadFile { } } - int size = 1024 * 4; // 1024 * n should be tested to get the optimum size (for download speed.) + final int size = 1024 * 4; // 1024 * n should be tested to get the optimum size (for download speed.) if (fileName.equals("")) { fileName = String.valueOf(System.currentTimeMillis()); @@ -54,8 +53,8 @@ public class MLG_DownloadFile { Main.out("Saving as: " + fileName); } - long differenceTime = System.currentTimeMillis(); - Long[] timeTracking = new Long[] { differenceTime, differenceTime }; + final long differenceTime = System.currentTimeMillis(); + final Long[] timeTracking = new Long[] { differenceTime, differenceTime }; timeTracking[0] = System.currentTimeMillis(); if (Output) { @@ -67,8 +66,8 @@ public class MLG_DownloadFile { in = new BufferedInputStream(new URL(URL).openStream()); FileOutputStream fos; fos = new FileOutputStream(fileName); - BufferedOutputStream bout = new BufferedOutputStream(fos, size); - byte[] data = new byte[size]; + final BufferedOutputStream bout = new BufferedOutputStream(fos, size); + final byte[] data = new byte[size]; int x = 0; int count = 0; while ((x = in.read(data, 0, size)) >= 0) { @@ -88,15 +87,15 @@ public class MLG_DownloadFile { timeTracking[1] = System.currentTimeMillis(); //differenceTime = (timeTracking[1] - timeTracking[0]); if (Output) { - Main.out("Elapsed Time: " + MLG_Time.displayTime(timeTracking[0], timeTracking[1])); + Main.out("Elapsed Time: " + Time.displayTime(timeTracking[0], timeTracking[1])); } - } catch (FileNotFoundException e) { + } catch (final FileNotFoundException e) { e.printStackTrace(); success = false; - } catch (MalformedURLException e) { + } catch (final MalformedURLException e) { e.printStackTrace(); success = false; - } catch (IOException e) { + } catch (final IOException e) { e.printStackTrace(); success = false; } diff --git a/src/morlok8k/minecraft/landgenerator/MLG_FileRead.java b/src/morlok8k/MinecraftLandGenerator/FileRead.java similarity index 89% rename from src/morlok8k/minecraft/landgenerator/MLG_FileRead.java rename to src/morlok8k/MinecraftLandGenerator/FileRead.java index b303a7e..88e2f65 100644 --- a/src/morlok8k/minecraft/landgenerator/MLG_FileRead.java +++ b/src/morlok8k/MinecraftLandGenerator/FileRead.java @@ -1,4 +1,4 @@ -package morlok8k.minecraft.landgenerator; +package morlok8k.MinecraftLandGenerator; import java.io.BufferedReader; import java.io.File; @@ -7,16 +7,15 @@ import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; -import corrodias.minecraft.landgenerator.Main; -public class MLG_FileRead { +public class FileRead { - public static ArrayList readArrayListCoordLog(String file) { + public static ArrayList readArrayListCoordLog(final String file) { - ArrayList Return = new ArrayList(); + final ArrayList Return = new ArrayList(); try { - BufferedReader in = new BufferedReader(new FileReader(new File(file))); + final BufferedReader in = new BufferedReader(new FileReader(new File(file))); String line = ""; while ((line = in.readLine()) != null) { @@ -55,10 +54,10 @@ public class MLG_FileRead { } in.close(); - } catch (FileNotFoundException ex) { + } catch (final FileNotFoundException ex) { Main.out("Could not find " + file + "."); return Return; - } catch (IOException ex) { + } catch (final IOException ex) { Main.err("Could not read " + file + "."); return Return; } @@ -74,8 +73,8 @@ public class MLG_FileRead { //String errorMsg = ""; try { - File config = new File(Main.MinecraftLandGeneratorConf); - BufferedReader in = new BufferedReader(new FileReader(config)); + final File config = new File(Main.MinecraftLandGeneratorConf); + final BufferedReader in = new BufferedReader(new FileReader(config)); String line = ""; String property = ""; String value = ""; @@ -175,12 +174,12 @@ public class MLG_FileRead { Main.outD(" waitSave: " + Main.waitSave); Main.outD(" webLaunch: " + Main.webLaunch); } - } catch (FileNotFoundException ex) { + } catch (final FileNotFoundException ex) { Main.out("Could not find " + Main.MinecraftLandGeneratorConf + ". It is recommended that you run the application with the -conf option to create it."); return; - } catch (IOException ex) { + } catch (final IOException ex) { Main.err("Could not read " + Main.MinecraftLandGeneratorConf + "."); return; } diff --git a/src/morlok8k/minecraft/landgenerator/MLG_FileWrite.java b/src/morlok8k/MinecraftLandGenerator/FileWrite.java similarity index 84% rename from src/morlok8k/minecraft/landgenerator/MLG_FileWrite.java rename to src/morlok8k/MinecraftLandGenerator/FileWrite.java index 209e61d..4889068 100644 --- a/src/morlok8k/minecraft/landgenerator/MLG_FileWrite.java +++ b/src/morlok8k/MinecraftLandGenerator/FileWrite.java @@ -1,17 +1,16 @@ -package morlok8k.minecraft.landgenerator; +package morlok8k.MinecraftLandGenerator; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; -import corrodias.minecraft.landgenerator.Main; /** * http://www.roseindia.net/java/example/java/io/java-append-to-file.shtml
* Append To File - Java Tutorial */ -public class MLG_FileWrite { +public class FileWrite { public static final String newLine = Main.newLine; @@ -19,16 +18,16 @@ public class MLG_FileWrite { * @param file * @param appendTxt */ - public static void AppendTxtFile(String file, String appendTxt) { + public static void AppendTxtFile(final String file, final String appendTxt) { try { // Create file - FileWriter fstream = new FileWriter(file, true); - BufferedWriter out = new BufferedWriter(fstream); + final FileWriter fstream = new FileWriter(file, true); + final BufferedWriter out = new BufferedWriter(fstream); //String output = "Hello Java" + newLine; out.write(appendTxt); //Close the output stream out.close(); - } catch (Exception e) {//Catch exception if any + } catch (final Exception e) {//Catch exception if any System.err.println("Error: " + e.getMessage()); } } @@ -37,7 +36,7 @@ public class MLG_FileWrite { * @param file * @param txt */ - public static void writeTxtFile(String file, String txt) { + public static void writeTxtFile(final String file, final String txt) { //TODO: element comment /* @@ -47,14 +46,14 @@ public class MLG_FileWrite { */ try { - File oFile = new File(file); - BufferedWriter outFile = new BufferedWriter(new FileWriter(oFile)); + final File oFile = new File(file); + final BufferedWriter outFile = new BufferedWriter(new FileWriter(oFile)); outFile.write(txt); outFile.newLine(); outFile.close(); Main.out(file + " file created."); return; - } catch (IOException ex) { + } catch (final IOException ex) { Main.err("Could not create " + Main.MinecraftLandGeneratorConf + "."); ex.printStackTrace(); return; @@ -69,7 +68,7 @@ public class MLG_FileWrite { * true: Uses Default values. false: uses existing values * @author Morlok8k */ - public static void saveConf(boolean newConf) { + public static void saveConf(final boolean newConf) { String jL = null; //javaLine String sP = null; //serverPath diff --git a/src/morlok8k/minecraft/landgenerator/MLG_input_CLI.java b/src/morlok8k/MinecraftLandGenerator/Input_CLI.java similarity index 76% rename from src/morlok8k/minecraft/landgenerator/MLG_input_CLI.java rename to src/morlok8k/MinecraftLandGenerator/Input_CLI.java index fd08701..7ac66c5 100644 --- a/src/morlok8k/minecraft/landgenerator/MLG_input_CLI.java +++ b/src/morlok8k/MinecraftLandGenerator/Input_CLI.java @@ -1,8 +1,7 @@ -package morlok8k.minecraft.landgenerator; +package morlok8k.MinecraftLandGenerator; -import corrodias.minecraft.landgenerator.Main; -public class MLG_input_CLI { +public class Input_CLI { /** * getInt(String msg) - outputs a message, will only accept a valid integer from keyboard @@ -12,7 +11,7 @@ public class MLG_input_CLI { * @return int * @author Morlok8k */ - public static int getInt(String msg) { + public static int getInt(final String msg) { int Return = 0; diff --git a/src/morlok8k/minecraft/landgenerator/MLG_MD5.java b/src/morlok8k/MinecraftLandGenerator/MD5.java similarity index 61% rename from src/morlok8k/minecraft/landgenerator/MLG_MD5.java rename to src/morlok8k/MinecraftLandGenerator/MD5.java index 1538a72..81b10a4 100644 --- a/src/morlok8k/minecraft/landgenerator/MLG_MD5.java +++ b/src/morlok8k/MinecraftLandGenerator/MD5.java @@ -1,4 +1,4 @@ -package morlok8k.minecraft.landgenerator; +package morlok8k.MinecraftLandGenerator; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -9,7 +9,7 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Locale; -public class MLG_MD5 { +public class MD5 { /** * This gets the MD5 of a file
@@ -19,29 +19,29 @@ public class MLG_MD5 { * * @author Morlok8k */ - public static String fileMD5(String fileName) throws NoSuchAlgorithmException, + public static String fileMD5(final String fileName) throws NoSuchAlgorithmException, FileNotFoundException { // out(""); // out(""); - MessageDigest digest = MessageDigest.getInstance("MD5"); - InputStream is = new FileInputStream(fileName); - byte[] buffer = new byte[8192]; + final MessageDigest digest = MessageDigest.getInstance("MD5"); + final InputStream is = new FileInputStream(fileName); + final byte[] buffer = new byte[8192]; int read = 0; try { while ((read = is.read(buffer)) > 0) { digest.update(buffer, 0, read); } - byte[] md5sum = digest.digest(); - BigInteger bigInt = new BigInteger(1, md5sum); - String output = String.format("%1$032X", bigInt); //pad on left to 32 chars with 0's, also capitalize. + final byte[] md5sum = digest.digest(); + final BigInteger bigInt = new BigInteger(1, md5sum); + final String output = String.format("%1$032X", bigInt); //pad on left to 32 chars with 0's, also capitalize. // out("MD5: " + output); return output.toUpperCase(Locale.ENGLISH); - } catch (IOException e) { + } catch (final IOException e) { throw new RuntimeException("Unable to process file for MD5", e); } finally { try { is.close(); - } catch (IOException e) { + } catch (final IOException e) { throw new RuntimeException("Unable to close input stream for MD5 calculation", e); } } diff --git a/src/corrodias/minecraft/landgenerator/Main.java b/src/morlok8k/MinecraftLandGenerator/Main.java similarity index 82% rename from src/corrodias/minecraft/landgenerator/Main.java rename to src/morlok8k/MinecraftLandGenerator/Main.java index 0fa3efd..8dd28a0 100644 --- a/src/corrodias/minecraft/landgenerator/Main.java +++ b/src/morlok8k/MinecraftLandGenerator/Main.java @@ -1,4 +1,4 @@ -package corrodias.minecraft.landgenerator; +package morlok8k.MinecraftLandGenerator; import java.io.BufferedReader; import java.io.File; @@ -17,19 +17,6 @@ import java.util.Scanner; import java.util.logging.Level; import java.util.logging.Logger; -import morlok8k.minecraft.landgenerator.Coordinates; -import morlok8k.minecraft.landgenerator.MLG_ArrayList; -import morlok8k.minecraft.landgenerator.MLG_DownloadFile; -import morlok8k.minecraft.landgenerator.MLG_FileRead; -import morlok8k.minecraft.landgenerator.MLG_FileWrite; -import morlok8k.minecraft.landgenerator.MLG_MD5; -import morlok8k.minecraft.landgenerator.MLG_Readme_and_HelpInfo; -import morlok8k.minecraft.landgenerator.MLG_SelfAware; -import morlok8k.minecraft.landgenerator.MLG_StringArrayParse; -import morlok8k.minecraft.landgenerator.MLG_Time; -import morlok8k.minecraft.landgenerator.MLG_Update; -import morlok8k.minecraft.landgenerator.MLG_input_CLI; - /** * * @author Corrodias, Morlok8k, pr0f1x @@ -37,13 +24,13 @@ import morlok8k.minecraft.landgenerator.MLG_input_CLI; */ public class Main { - //java.awt.Desktop.getDesktop().browse(splashPage); + // // // Public Vars: public static boolean testing = false; // display more output when debugging public static final String PROG_NAME = "Minecraft Land Generator"; // Program Name - public static final String VERSION = "1.7.0 test7"; // Version Number! + public static final String VERSION = "1.7.0"; // Version Number! public static final String AUTHORS = "Corrodias, Morlok8k, pr0f1x"; // Authors public static final String fileSeparator = System.getProperty("file.separator"); @@ -188,7 +175,7 @@ public class Main { String[] argsNOGUI = new String[args.length]; argsNOGUI = args; - argsNOGUI = MLG_StringArrayParse.Parse(argsNOGUI, "nogui"); //parse out "nogui" + argsNOGUI = StringArrayParse.Parse(argsNOGUI, "nogui"); //parse out "nogui" if (!(args.equals(argsNOGUI))) { //do the freshly parsed args match the original? args = argsNOGUI; //use the freshly parsed args for everything else now... NOGUI = true; @@ -221,7 +208,7 @@ public class Main { } catch (Exception e) { e.printStackTrace(); } - */ + */ } else { //No GUI // Finally, Lets Start MLG! @@ -241,7 +228,7 @@ public class Main { // Lets get the date, and our BuildID date = new Date(); - MLG_Update.readBuildID(); + Update.readBuildID(); // The following displays no matter what happens, so we needed this date stuff to happen first. @@ -262,8 +249,8 @@ public class Main { // (-nowait is the only universal switch - it can be used with anything. its basically for scripting, as it turns off the 10sec wait for human readability) String[] newArgs = new String[args.length]; newArgs = args; - newArgs = MLG_StringArrayParse.Parse(newArgs, "-n"); //parse out -n - newArgs = MLG_StringArrayParse.Parse(newArgs, "-nowait"); //parse out -nowait + newArgs = StringArrayParse.Parse(newArgs, "-n"); //parse out -n + newArgs = StringArrayParse.Parse(newArgs, "-nowait"); //parse out -nowait if (!(args.equals(newArgs))) { //do the freshly parsed args match the original? dontWait = true; //if not, we dont wait for anything! args = newArgs; //use the freshly parsed args for everything else now... @@ -273,9 +260,9 @@ public class Main { if (args.length == 0) { //we didnt find a an X and Z size, so lets ask for one. out("Please Enter the size of world you want. Example: X:1000 Z:1000"); outP(MLG + "X:"); - xRange = MLG_input_CLI.getInt("X:"); + xRange = Input_CLI.getInt("X:"); outP(MLG + "Z:"); - zRange = MLG_input_CLI.getInt("Z:"); + zRange = Input_CLI.getInt("Z:"); args = new String[] { String.valueOf(xRange), String.valueOf(zRange) }; } @@ -283,7 +270,7 @@ public class Main { if (args[0].equalsIgnoreCase("-version") || args[0].equalsIgnoreCase("-help") || args[0].equals("/?")) { - MLG_Readme_and_HelpInfo.showHelp(true); + Readme_and_HelpInfo.showHelp(true); return; } @@ -297,8 +284,8 @@ public class Main { if (args.length == 2) { if (args[1].equalsIgnoreCase("download")) { - boolean fileSuccess = - MLG_DownloadFile.downloadFile(github_MLG_Conf_URL, testing); + final boolean fileSuccess = + DownloadFile.downloadFile(github_MLG_Conf_URL, testing); if (fileSuccess) { out(MinecraftLandGeneratorConf + " file downloaded."); return; @@ -306,35 +293,35 @@ public class Main { } } - MLG_FileWrite.saveConf(true); //new conf file + FileWrite.saveConf(true); //new conf file return; } else if (args[0].equalsIgnoreCase("-ps") || args[0].equalsIgnoreCase("-printspawn")) { // okay, sorry, this is an ugly hack, but it's just a last-minute feature. - MLG_Misc.printSpawn(); - MLG_Time.waitTenSec(false); + Misc.printSpawn(); + Time.waitTenSec(false); return; } else if (args[0].equalsIgnoreCase("-build")) { - MLG_Update.buildID(false); + Update.buildID(false); return; } else if (args[0].equalsIgnoreCase("-update")) { - MLG_Update.updateMLG(); - MLG_Time.waitTenSec(false); + Update.updateMLG(); + Time.waitTenSec(false); return; } else if (args[0].equalsIgnoreCase("-readme")) { if (args.length == 2) { - MLG_Readme_and_HelpInfo.readMe(args[1]); + Readme_and_HelpInfo.readMe(args[1]); } else { - MLG_Readme_and_HelpInfo.readMe(null); + Readme_and_HelpInfo.readMe(null); } return; } else if (args[0].equalsIgnoreCase("-downloadfile")) { if (args.length == 2) { - MLG_DownloadFile.downloadFile(args[1], true); + DownloadFile.downloadFile(args[1], true); } else { out("No File to Download!"); - MLG_Time.waitTenSec(false); + Time.waitTenSec(false); } return; @@ -345,38 +332,39 @@ public class Main { String recheckMD5 = ""; try { - File config = new File(args[1]); + final File config = new File(args[1]); try { - origMD5 = MLG_MD5.fileMD5(config.toString()); - } catch (NoSuchAlgorithmException e) { + origMD5 = MD5.fileMD5(config.toString()); + } catch (final NoSuchAlgorithmException e) { e.printStackTrace(); } - BufferedReader in = new BufferedReader(new FileReader(config)); + final BufferedReader in = new BufferedReader(new FileReader(config)); String line; while ((line = in.readLine()) != null) { if (line.contains("###RECHECK###")) { recheckFlag = !recheckFlag; } else { - MLG_DownloadFile.downloadFile(line, true); + DownloadFile.downloadFile(line, true); } } in.close(); if (recheckFlag == true) { try { - recheckMD5 = MLG_MD5.fileMD5(config.toString()); - } catch (NoSuchAlgorithmException e) { + recheckMD5 = MD5.fileMD5(config.toString()); + } catch (final NoSuchAlgorithmException e) { e.printStackTrace(); } if (!origMD5.contentEquals(recheckMD5)) { - BufferedReader in_recheck = new BufferedReader(new FileReader(config)); + final BufferedReader in_recheck = + new BufferedReader(new FileReader(config)); String line_recheck; while ((line_recheck = in_recheck.readLine()) != null) { if (line_recheck.contains("###RECHECK###")) { recheckFlag = !recheckFlag; } else { - MLG_DownloadFile.downloadFile(line_recheck, true); + DownloadFile.downloadFile(line_recheck, true); } } in_recheck.close(); @@ -384,32 +372,32 @@ public class Main { } - } catch (FileNotFoundException ex) { + } catch (final FileNotFoundException ex) { System.err.println(args[1] + " - File not found"); - MLG_Time.waitTenSec(false); + Time.waitTenSec(false); return; - } catch (IOException ex) { + } catch (final IOException ex) { System.err.println(args[1] + " - Could not read file."); - MLG_Time.waitTenSec(false); + Time.waitTenSec(false); return; } } else { out("No File with links!"); - MLG_Time.waitTenSec(false); + Time.waitTenSec(false); } return; } else if (args.length == 1) { out("For help, use java -jar " + MLGFileNameShort + " -help"); - MLG_Time.waitTenSec(false); + Time.waitTenSec(false); return; } - MLG_FileRead.readConf(); + FileRead.readConf(); boolean oldConf = false; // This next section checks to see if we have a old configuration file (or none!) - if (serverPath == null || javaLine == null) { // MLG 1.2 Check for a valid .conf file. + if ((serverPath == null) || (javaLine == null)) { // MLG 1.2 Check for a valid .conf file. err(MinecraftLandGeneratorConf + " does not contain all required properties. Making New File!"); // Please recreate it by running this application with -conf. @@ -437,9 +425,9 @@ public class Main { if (oldConf) { err("Old Version of " + MinecraftLandGeneratorConf + " found. Updating..."); - MLG_FileWrite.saveConf(false); //old conf + FileWrite.saveConf(false); //old conf - MLG_Time.waitTenSec(false); + Time.waitTenSec(false); return; } @@ -458,11 +446,11 @@ public class Main { err("Z size too small - Changing Z to 1000"); } - } catch (NumberFormatException ex) { + } catch (final NumberFormatException ex) { err("Invalid X or Z argument."); err("Please Enter the size of world you want. Example: X:1000 Z:1000"); - xRange = MLG_input_CLI.getInt("X:"); - zRange = MLG_input_CLI.getInt("Z:"); + xRange = Input_CLI.getInt("X:"); + zRange = Input_CLI.getInt("Z:"); //return; } @@ -472,8 +460,8 @@ public class Main { // This is embarrassing. Don't look. try { - for (int i = 0; i < args.length - 2; i++) { - String nextSwitch = args[i + 2].toLowerCase(); + for (int i = 0; i < (args.length - 2); i++) { + final String nextSwitch = args[i + 2].toLowerCase(); if (nextSwitch.equals("-verbose") || nextSwitch.equals("-v")) { verbose = true; out("Notice: Verbose Mode"); @@ -508,7 +496,7 @@ public class Main { out("Notice: Z Offset: " + zOffset); if (nextSwitch.startsWith("-y")) { out("Notice: MLG now uses Z instead of Y. Please use the -z switch instead"); - MLG_Time.waitTenSec(false); + Time.waitTenSec(false); } } else { @@ -516,36 +504,36 @@ public class Main { out("Notice: Attempting to use Alternate Server:" + serverPath); } } - } catch (NumberFormatException ex) { + } catch (final NumberFormatException ex) { err("Invalid switch value."); return; } - MLG_WorldVerify.verifyWorld(); + WorldVerify.verifyWorld(); { - File backupLevel = new File(worldPath + fileSeparator + "level_backup.dat"); + final File backupLevel = new File(worldPath + fileSeparator + "level_backup.dat"); if (backupLevel.exists()) { //err("There is a level_backup.dat file left over from a previous attempt that failed. You should go determine whether to keep the current level.dat" // + " or restore the backup."); //err("You most likely will want to restore the backup!"); - //MLG_Time.waitTenSec(false); + //Time.waitTenSec(false); err("There is a level_backup.dat file left over from a previous attempt that failed."); out("Resuming..."); //use resume data - File serverLevel = new File(worldPath + fileSeparator + "level.dat"); + final File serverLevel = new File(worldPath + fileSeparator + "level.dat"); try { - MLG_Misc.copyFile(backupLevel, serverLevel); - } catch (IOException e) { + Misc.copyFile(backupLevel, serverLevel); + } catch (final IOException e) { e.printStackTrace(); } backupLevel.delete(); //return; - MLG_FileRead.readArrayListCoordLog(worldPath + fileSeparator + FileRead.readArrayListCoordLog(worldPath + fileSeparator + "MinecraftLandGenerator.log"); // we read the .log just for any resume data, if any. System.gc(); //run the garbage collector - hopefully free up some memory! @@ -575,9 +563,9 @@ public class Main { try { out("Launching server once to make sure there is a world."); - long generationStartTimeTracking = System.currentTimeMillis(); //Start of time remaining calculations. + final long generationStartTimeTracking = System.currentTimeMillis(); //Start of time remaining calculations. - boolean serverLaunch = MLG_Server.runMinecraft(alternate); + final boolean serverLaunch = Server.runMinecraft(alternate); if (!(serverLaunch)) { System.exit(1); // we got a warning or severe error @@ -590,26 +578,26 @@ public class Main { xRange = (int) (Math.ceil(((double) xRange) / ((double) 16))) * 16; //say xRange was entered as 1000. this changes it to be 1008, a multiple of 16. (the size of a chunk) zRange = (int) (Math.ceil(((double) zRange) / ((double) 16))) * 16; //say zRange was entered as 2000. there is no change, as it already is a multiple of 16. - MLG_FileWrite.AppendTxtFile( + FileWrite.AppendTxtFile( worldPath + fileSeparator + "MinecraftLandGenerator.log", - "# " + PROG_NAME + " " + VERSION + " - " + MLG_SelfAware.JVMinfo() + newLine - + "# " + MC_Server_Version + newLine + "# Started: " + "# " + PROG_NAME + " " + VERSION + " - " + SelfAware.JVMinfo() + newLine + "# " + + MC_Server_Version + newLine + "# Started: " + dateFormat.format(generationStartTimeTracking) + newLine + "##Size: X" + xRange + "Z" + zRange + newLine); out(""); - File serverLevel = new File(worldPath + fileSeparator + "level.dat"); - File backupLevel = new File(worldPath + fileSeparator + "level_backup.dat"); + final File serverLevel = new File(worldPath + fileSeparator + "level.dat"); + final File backupLevel = new File(worldPath + fileSeparator + "level_backup.dat"); out("Backing up level.dat to level_backup.dat."); - MLG_Misc.copyFile(serverLevel, backupLevel); + Misc.copyFile(serverLevel, backupLevel); out(""); - Coordinates spawn = MLG_SpawnPoint.getSpawn(serverLevel); + final Coordinates spawn = SpawnPoint.getSpawn(serverLevel); out("Spawn point detected: [X,Y,Z] " + spawn); - MLG_FileWrite.AppendTxtFile(worldPath + fileSeparator + "MinecraftLandGenerator.log", + FileWrite.AppendTxtFile(worldPath + fileSeparator + "MinecraftLandGenerator.log", "# Seed: " + randomSeed + newLine + "# Spawn: " + spawn.toString() + newLine); { @@ -663,7 +651,7 @@ public class Main { Long timeTracking = 0L; - ArrayList launchList = new ArrayList(totalIterations); + final ArrayList launchList = new ArrayList(totalIterations); for (int currentX = 0; currentX <= (xRangeAdj / 2); currentX += increment) { curXloops++; @@ -685,7 +673,7 @@ public class Main { { // add Coordinates to arraylist here - Coordinates tempCoords = + final Coordinates tempCoords = new Coordinates(currentX + xOffset, 64, currentZ + zOffset); launchList.add(tempCoords); @@ -706,12 +694,12 @@ public class Main { } //get existing list, and remove this list from launchList - ArrayList removeList = - MLG_FileRead.readArrayListCoordLog(worldPath + fileSeparator + final ArrayList removeList = + FileRead.readArrayListCoordLog(worldPath + fileSeparator + "MinecraftLandGenerator.log"); if (!(removeList.isEmpty())) { - MLG_ArrayList.arrayListRemove(launchList, removeList); + Arraylist.arrayListRemove(launchList, removeList); } removeList.clear(); // we are done with this now. @@ -721,7 +709,7 @@ public class Main { currentIteration = 0; totalIterations = launchList.size(); Coordinates xyz = null; - Iterator coordArrayIterator = launchList.iterator(); + final Iterator coordArrayIterator = launchList.iterator(); while (coordArrayIterator.hasNext()) { currentIteration++; xyz = coordArrayIterator.next(); @@ -730,7 +718,7 @@ public class Main { String percentDone = Double.toString(((double) currentIteration / (double) totalIterations) * 100); - int percentIndex = + final int percentIndex = ((percentDone.indexOf(".") + 3) > percentDone.length()) ? percentDone .length() : (percentDone.indexOf(".") + 3); //fix index on numbers like 12.3 percentDone = @@ -747,22 +735,22 @@ public class Main { differenceTime = (timeTracking - generationStartTimeTracking) / (currentIteration + 1); // Updated. we now count all runs, instead of the last 4. differenceTime *= 1 + (totalIterations - currentIteration); // this should provide a more accurate result. - out("Estimated time remaining: " + MLG_Time.displayTime(differenceTime)); // I've noticed it gets pretty accurate after about 8 launches! + out("Estimated time remaining: " + Time.displayTime(differenceTime)); // I've noticed it gets pretty accurate after about 8 launches! // Set the spawn point - MLG_SpawnPoint.setSpawn(serverLevel, xyz); + SpawnPoint.setSpawn(serverLevel, xyz); // Launch the server boolean serverSuccess = false; - serverSuccess = MLG_Server.runMinecraft(alternate); + serverSuccess = Server.runMinecraft(alternate); out(""); //////// End server launch code if (serverSuccess) { // Write the current Coordinates to log file! - MLG_FileWrite.AppendTxtFile(worldPath + fileSeparator + FileWrite.AppendTxtFile(worldPath + fileSeparator + "MinecraftLandGenerator.log", xyz.toString() + newLine); } else { System.exit(1); // we got a warning or severe error @@ -776,13 +764,13 @@ public class Main { out("Finished generating chunks."); } - MLG_Misc.copyFile(backupLevel, serverLevel); + Misc.copyFile(backupLevel, serverLevel); backupLevel.delete(); out("Restored original level.dat."); out("Generation complete in: " - + MLG_Time.displayTime(startTime, System.currentTimeMillis())); - MLG_Time.waitTenSec(false); + + Time.displayTime(startTime, System.currentTimeMillis())); + Time.waitTenSec(false); //TODO: add if's @@ -790,21 +778,21 @@ public class Main { if (java.awt.GraphicsEnvironment.isHeadless()) { webLaunch = false; //headless enviroment - cant bring up webpage! } - File web1 = new File("web"); - File web2 = new File("web.txt"); //user has put in the magical file to not launch the webpage - File web3 = new File("web.txt.txt"); + final File web1 = new File("web"); + final File web2 = new File("web.txt"); //user has put in the magical file to not launch the webpage + final File web3 = new File("web.txt.txt"); if (web2.exists() || (web1.exists() || web3.exists())) { //check for "web.txt", if not found, check for "web", and if still not found, check for "web.txt.txt" webLaunch = false; } } if (webLaunch && java.awt.Desktop.isDesktopSupported()) { - URI splashPage = + final URI splashPage = //URI.create("https://sites.google.com/site/minecraftlandgenerator/home/mlg_splash"); URI.create("http://adf.ly/520855/splashbanner"); try { java.awt.Desktop.getDesktop().browse(splashPage); - } catch (IOException e) { + } catch (final IOException e) { err("Error displaying webpage... " + e.getLocalizedMessage()); } } else { @@ -813,7 +801,7 @@ public class Main { out("Thanks!"); } - } catch (IOException ex) { + } catch (final IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, ex.getMessage(), ex); } } @@ -825,7 +813,7 @@ public class Main { * String to display and format * @author Morlok8k */ - public static void out(String str) { + public static void out(final String str) { System.out.println(MLG + str); // is there a better/easier way to do this? I just wanted a lazier way to write "System.out.println(MLG + blah..." } @@ -836,7 +824,7 @@ public class Main { * String to display and format * @author Morlok8k */ - public static void err(String str) { + public static void err(final String str) { System.err.println(MLGe + str); } @@ -847,7 +835,7 @@ public class Main { * String to display and format * @author Morlok8k */ - public static void outP(String str) { + public static void outP(final String str) { System.out.print(str); } @@ -858,7 +846,7 @@ public class Main { * String to display and format * @author Morlok8k */ - static void outS(String str) { + static void outS(final String str) { System.out.println("[Server] " + str); } @@ -869,7 +857,7 @@ public class Main { * String to display and format * @author Morlok8k */ - public static void outD(String str) { + public static void outD(final String str) { System.out.println(MLG + "[DEBUG] " + str); } diff --git a/src/corrodias/minecraft/landgenerator/MLG_Misc.java b/src/morlok8k/MinecraftLandGenerator/Misc.java similarity index 64% rename from src/corrodias/minecraft/landgenerator/MLG_Misc.java rename to src/morlok8k/MinecraftLandGenerator/Misc.java index 9377b3c..b7e3447 100644 --- a/src/corrodias/minecraft/landgenerator/MLG_Misc.java +++ b/src/morlok8k/MinecraftLandGenerator/Misc.java @@ -1,4 +1,4 @@ -package corrodias.minecraft.landgenerator; +package morlok8k.MinecraftLandGenerator; import java.io.File; import java.io.FileInputStream; @@ -7,10 +7,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import morlok8k.minecraft.landgenerator.Coordinates; -import morlok8k.minecraft.landgenerator.MLG_FileRead; -public class MLG_Misc { +public class Misc { //TODO: add description /** @@ -19,16 +17,16 @@ public class MLG_Misc { static boolean printSpawn() { // ugh, sorry, this is an ugly hack, but it's a last-minute feature. this is a lot of duplicated code. // - Fixed by Morlok8k - - MLG_FileRead.readConf(); - MLG_WorldVerify.verifyWorld(); - - File level = new File(Main.worldPath + Main.fileSeparator + "level.dat"); + + FileRead.readConf(); + WorldVerify.verifyWorld(); + + final File level = new File(Main.worldPath + Main.fileSeparator + "level.dat"); try { - Coordinates spawn = MLG_SpawnPoint.getSpawn(level); + final Coordinates spawn = SpawnPoint.getSpawn(level); Main.out("The current spawn point is: [X,Y,Z] " + spawn); return true; - } catch (IOException ex) { + } catch (final IOException ex) { Main.err("Error while reading " + level.getPath()); return false; } @@ -45,12 +43,12 @@ public class MLG_Misc { * @param dst * @throws IOException */ - public static void copyFile(File src, File dst) throws IOException { - InputStream copyIn = new FileInputStream(src); - OutputStream copyOut = new FileOutputStream(dst); - + public static void copyFile(final File src, final File dst) throws IOException { + final InputStream copyIn = new FileInputStream(src); + final OutputStream copyOut = new FileOutputStream(dst); + // Transfer bytes from in to out - byte[] buf = new byte[1024]; + final byte[] buf = new byte[1024]; int len; while ((len = copyIn.read(buf)) >= 0) { if (len > 0) { diff --git a/src/morlok8k/minecraft/landgenerator/MLG_RCON.java b/src/morlok8k/MinecraftLandGenerator/RCON.java similarity index 82% rename from src/morlok8k/minecraft/landgenerator/MLG_RCON.java rename to src/morlok8k/MinecraftLandGenerator/RCON.java index ce8bb1d..f9a4f4b 100644 --- a/src/morlok8k/minecraft/landgenerator/MLG_RCON.java +++ b/src/morlok8k/MinecraftLandGenerator/RCON.java @@ -1,8 +1,7 @@ -package morlok8k.minecraft.landgenerator; +package morlok8k.MinecraftLandGenerator; -import corrodias.minecraft.landgenerator.Main; -public class MLG_RCON { +public class RCON { /** * connects to server using RCON, sends a message, and disconnects. Not Functional yet. @@ -10,7 +9,7 @@ public class MLG_RCON { * @param message */ @SuppressWarnings("unused") - private static void rconConnectAndSendMsg(String message) { + private static void rconConnectAndSendMsg(final String message) { //This is a placeholder for future code. /* step 1: connect to rcon_IPaddress : rcon_Port, with rcon_Password. @@ -30,7 +29,7 @@ public class MLG_RCON { */ @SuppressWarnings("unused") private static boolean rconQueryServer() { - boolean QuerySucess = false; + final boolean QuerySucess = false; //This is a placeholder for future code. /* diff --git a/src/morlok8k/MinecraftLandGenerator/Readme_and_HelpInfo.java b/src/morlok8k/MinecraftLandGenerator/Readme_and_HelpInfo.java new file mode 100644 index 0000000..6dd6222 --- /dev/null +++ b/src/morlok8k/MinecraftLandGenerator/Readme_and_HelpInfo.java @@ -0,0 +1,316 @@ +package morlok8k.MinecraftLandGenerator; + + +public class Readme_and_HelpInfo { + + static String newLine = Main.newLine; + static String MLGFileNameShort = Main.MLGFileNameShort; + static String MinecraftLandGeneratorConf = Main.MinecraftLandGeneratorConf; + static String defaultReadmeFile = Main.defaultReadmeFile; + + /** + * Saves a Readme file. + * + * @param readmeFile + * @author Morlok8k + * + */ + public static void readMe(String readmeFile) { + + if ((readmeFile == "") || (readmeFile == null)) { + readmeFile = defaultReadmeFile; + } + + final String MLG_Last_Modified_MDY = + Main.dateFormat_MDY.format(Main.MLG_Last_Modified_Date); + final String PROG_NAME = Main.PROG_NAME; + final String VERSION = Main.VERSION; + + String showHelpSTR = ""; + String ReadMeText = ""; + String VersionInfo = ""; + + //@formatter:off + ReadMeText = PROG_NAME + " version " + VERSION + newLine + + newLine + + "Updated " + MLG_Last_Modified_MDY + newLine + + "(BuildID: " + Main.MLG_Last_Modified_Date.getTime() + ")" + newLine + + newLine + + "Original Code by Corrodias November 2010" + newLine + + "Enhanced Code by Morlok8k Feb. 2011 to Now (or at least to " + MLG_Last_Modified_MDY + "!)" + newLine + + "Additional Code by pr0f1x October 2011" + newLine + + newLine + + "Website: https://sites.google.com/site/minecraftlandgenerator/" + newLine + + "Forum: http://www.minecraftforum.net/topic/187737-minecraft-land-generator/" + newLine + + "Source: https://github.com/Morlok8k/MinecraftLandGenerator" + newLine + + newLine + + "-----------------------------------------------" + newLine + + newLine + + "This program lets you generate an area of land with your Minecraft Beta SMP server (and is prossibly future-proof for newer versions). You set up your java command line and minecraft server paths in the MinecraftLandGenerator.conf file, set up the server's server.properties file with the name of the world you wish to use, and then run this program." + newLine + + "When a Minecraft server is launched, it automatically generates chunks within a square area of 25x25 chunks (400x400 blocks), centered on the current spawn point (formally 20x20 chunks, 320x320 blocks). When provided X and Z ranges as arguments, this program will launch the server repeatedly, editing the level.dat file between sessions, to generate large amounts of land without players having to explore them. The generated land will have about the X and Z ranges as requested by the arguments, though it will not be exact due to the spawn point typically not on the border of a chunk. (Because of this, MLG by default adds a slight overlap with each pass - 380x380 blocks) You can use the -x and -z switches to override the spawn offset and center the land generation on a different point." + newLine + + "The program makes a backup of level.dat as level_backup.dat before editing, and restores the backup at the end. In the event that a level_backup.dat file already exists, the program will refuse to proceed, leaving the user to determine why the level_backup.dat file exists and whether they would rather restore it or delete it, which must be done manually." + newLine + + newLine + + "This program is public domain, and the source code is included in the .jar file. (If accidently missing, like in 1.3.0 and 1.4.0, it is always available at Github.)" + newLine + + "The JNLP library is included (inside the .jar). It is not public domain. Its license is included, as LICENSE.TXT." + newLine + + "It is also available at: http://jnbt.sourceforge.net/" + newLine + + newLine + + "The \"unescape\" method/function is also not Public Domain. Its License is the W3C\u00A9 Software License, and located here: http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231" + + newLine + + "Other Public Domain code has been used in this program, and references to sources are included in the comments of " + PROG_NAME + "'s source code." + + newLine + + "-----------------------------------------------" + newLine + + newLine; + //@formatter:on + + showHelpSTR = showHelp(false); //stored as a string for easier manipulation in the future + + //@formatter:off + VersionInfo = newLine + + "-----------------------------------------------" + newLine + + newLine + + "Version History:" + newLine + + "Morlok8k:" + newLine + + "1.7.0" + newLine + + "- Major Code Optimization" + newLine + + "- Drastically reduced the amount of time it takes for MLG to expand a world after it has already done so before!" + newLine + + " (To do this, I rewrote the Main loop of the program, and add my own Coordinate object)" + newLine + + "- Added Resume Functionality" + newLine + + "- Updated Time Output yet again." + newLine + + "- Made xx% output nicer by rewriting previous existing line." + newLine + + "- Misc. Tweaks" + newLine + + "- Misc. Additions" + newLine + + "1.6.3" + newLine + + "- Minor Code Optimization" + newLine + + "- Finely got on the ball and added the JNBT source and everything (as an internal .zip) to be completely faithful to his license" + newLine + + "- Also adding script files internally in the .jar for archive (or offline) purposes. (Manual Extract needed for use)" + newLine + + "- Modified output of MLG slightly to show whats the server and whats MLG. (I may do more with this later.)" + newLine + + "1.6.2" + newLine + + "- Major Code Optimization" + newLine + + "- Updated Time Output again. Now says \"1 Minute\" instead of \"1 Minutes\"." + newLine + + "- Updated Location Code - the center of the square is now truely centered, and it trys to get as close to the given size as possible." + newLine + + "- Added \"-nowait\" and its shorter version \"-n\"" + newLine + + "- Added currently non-functional RCON code. Will try to make functional in the future." + newLine + + newLine + + "1.6.11" + newLine + + "- Removed End-of-Generation ASCII-Graphic - It didn't really fit with MLG." + newLine + + "- Updated Time Output." + newLine + + "- Changed estimated time remaining to count all runs, not just the last four." + newLine + + "- Added the time it took to complete at the end of generation." + newLine + + newLine + + "1.6.1" + newLine + + "- Added some modifications for scripting (Mainly for a new Initial setup script)" + newLine + + "- Changed MLG's Y to Z. Now it matches Minecraft. Y in the game is Height." + newLine + + "- Renamed -y switch to -z. MLG will remain backwards compatible if you use the old -y switch." + newLine + + "- Updated -printspawn to show X,Y,Z" + newLine + + "- Added End-of-Generation ASCII-Graphic" + newLine + + "- Slightly altered some text output" + newLine + + newLine + + "1.6.05" + newLine + + "- MLG displays if the server is converting the Map format, when not in verbose mode. (McRegion -> Anvil, or Chunk-File -> McRegion)" + newLine + + "- Minor fixes/edits/typos" + newLine + + "- Added link to new MLG website to readme file" + + newLine + + "1.6.03" + newLine + + "- added decoding of escape characters of URL's (so a space is a \" \" and not \"%20\")" + newLine + + "- added \"-downloadlist [list]\" where [list] is a text file with URL's on each line" + newLine + + newLine + + "1.6.02" + newLine + + "- small fix on caculating md5sum where old version didnt pad out to 32chars with zeros on the left side" + + "- quick Archive intergity fix after injecting source code into .jar after it compiled." + + "- no new functionality, md5 issue doesnt affect -update on old versions." + + newLine + + "1.6.0" + newLine + + "- NOW DOES NOT NEED ANY SCRIPT FILES!" + newLine + + "- Added the ability to download files from the internet" + newLine + + "- Added a switch to download any file off the internet, if needed (useless for most people, but included it in case I wanted it in the future.)" + newLine + + "- Added the ability to check what version the .jar is. (Using MD5 hashes, timestamps, and the BuildID file)" + newLine + + "- Added \"-update\" to download new versions of MLG directly from github." + newLine + + "- Updated estimated time. Now shows up on loop 2+ instead of loop 4+." + newLine + + "- Standard % output of the Server should look nicer now." + newLine + + "- Code Refactoring" + newLine + + "- Code Formatting" + newLine + + "- Code Optimization" + newLine + + "- Duplicate sections of code have been turned into Methods/\"Functions\"" + newLine + + newLine + + "1.5.1" + newLine + + "- pr0f1x: Added the \"save-all\" command to be sent to the server before shutting it down." + newLine + + "- pr0f1x: Added a 40 second wait before shutting down." + newLine + + "- Morlok8k: Made 40 second wait optional." + newLine + + "- Morlok8k: Changed the Dimensions code. (I had assumed it would be DIM-1, DIM-2, etc. but it turned out to be DIM-1 and DIM1. Change reflects Server output of \"Level n\")" + newLine + + "- Morlok8k: Config file is automatically updated to reflect these changes." + newLine + + "- Morlok8k: Cleaned up code." + newLine + + newLine + + "1.5.0" + newLine + + "- Supports Server Beta 1.6.4 (& hopefully future versions as well, while remaining backward compatible.)" + newLine + + "- Added \"-a\",\"-alt\" to use alternate method (a slightly simplier version of 1.3.0's code - pure verbose only)" + newLine + + "- Added world specific output for 9 dimensions (DIM-1 is the Nether, DIM-2 through DIM-9 dont exist yet, but if and when they do, you can configure it's text). (\"Level 0\", the default world, is displayed as the worlds name)" + newLine + + "- Updated Config File for these Dimensions." + newLine + + "- Reads and outputs the Seed to the output. (If you had used text for the Seed, Minecraft converts it into a number. This outputs the number.)" + newLine + + "- Changed the default 300 blocks to 380. The server now makes a 400x400 square block terrain instead of 320x320. Thus it is faster because there are less loops. To use the old way, use \"-i300\"" + newLine + + "- Added total Percentage done (technically, it displays the % done once the server finishes...)" + newLine + + "- Added debugging output vars of conf file (disabled - need to re-compile source to activate)" + newLine + + newLine + + "\t\t+ (the goal is to have MLG be configureable, so it can work on any version of the server, past or present.)" + newLine + + newLine + + "*** 1.4.5 (pre 1.5.0) ***" + newLine + + "- sorry! I shouldn't release untested code..." + newLine + + "*************************" + newLine + + newLine + + "1.4.4" + newLine + + "- Added ablilty to ignore [WARNING] and [SEVERE] errors with \"-w\"" + newLine + + newLine + + "1.4.3" + newLine + + "- Fixed \"-ps\",\"-printspawn\" as I had forgot I had broken it in 1.4.0 - due to config file change." + newLine + + newLine + + "1.4.2" + newLine + + "- No New Features" + newLine + + "- Changed non-verbose mode to display server progress on the same line, saving a lot of space." + newLine + + " - This couldn't wait for 1.5.0 ... I (Morlok8k) liked it too much." + newLine + + newLine + + "1.4.0" + newLine + + "- Future Proofing" + newLine + + "- Configurble Server Message reading. (If server updates and breaks MLG, you can add the new text!)" + newLine + + "- Updated config file, and auto updating from old format." + newLine + + "- Added % of spawn area to non-verbose output." + newLine + + "- Removed datetime stamps from server output in verbose mode" + newLine + + "- Other Misc fixes." + newLine + + newLine + + "1.3.0" + newLine + + "- Fixed Problems with Minecraft Beta 1.3 -- Morlok8k" + newLine + + newLine + + "-----------------------------------------------" + newLine + + newLine + + "Corrodias:" + newLine + + "1.2.0" + newLine + + "- land generation now centers on the spawn point instead of [0, 0]" + newLine + + "- the server is launched once before the spawn point is changed, to verify that it can run and to create a world if one doesn't exist" + newLine + + "- added -printspawn [-ps] switch to print the current spawn coordinates to the console" + newLine + + "- added -x and -y switches to override the X and Y offsets" + newLine + + "- added -v switch, does the same as -verbose" + newLine + + "- improved status message spacing to make things easier to read" + newLine + + "- improved time estimation algorithm: it now averages the last 3 launches" + newLine + + newLine + + "1.1.0" + newLine + + "- added MinecraftLandGenerator.conf file to hold the java command line and the server path" + newLine + + "- added -conf solo switch to generate a .conf file" + newLine + + "- added -verbose switch to output server output to the console (default is to ignore it)" + newLine + + "- added -i switch to allow customizing the block increment size (default is 300)" + newLine + + "- added instructions output in this version, i think" + newLine + + "- improved status message output to include current iteration and total iterations" + newLine + + newLine + + "1.0.0" + newLine + + "- initial release" + newLine + + newLine + + "-----------------------------------------------" + newLine + + newLine + + "Notes:" + newLine + + "Due to changes in server beta 1.6, it now generates the nether as well as the world at the same time." + newLine + + "However, Since beta 1.9 and Minecraft 1.0, the nether or the end is no longer generated." + + "I recommend using MCEDIT to relight the map after you generate it. This will take a long time, but should fix all those incorrectly dark spots in your level." + newLine; + //@formatter:on + + FileWrite.writeTxtFile(readmeFile, ReadMeText + showHelpSTR + VersionInfo); + + } + + /** + * Displays or returns Help information + * + * @param SysOut + *
+ * Set TRUE to display info to System.out. (Returns null)
+ * Set FALSE to return info as String. + * @author Morlok8k + */ + public static String showHelp(final boolean SysOut) { + String Str = null; + String NewLine = newLine; + if (SysOut) { + NewLine = NewLine + Main.MLG; + } + + MLGFileNameShort = Main.MLGFileNameShort; + MinecraftLandGeneratorConf = Main.MinecraftLandGeneratorConf; + defaultReadmeFile = Main.defaultReadmeFile; + + //@formatter:off + Str = "Usage: java -jar " + MLGFileNameShort + " x z [serverpath] [switches]" + NewLine + + NewLine + + "Arguments:" + NewLine + + " x : X range to generate" + NewLine + + " z : Z range to generate" + NewLine + + " serverpath : the path to the directory in which the server runs (takes precedence over the config file setting)" + NewLine + + NewLine + + "Switches:" + NewLine + + " -verbose : causes the application to output the server's messages to the console" + NewLine + + " -v : same as -verbose" + NewLine + + " -w : Ignore [WARNING] and [SEVERE] messages." + NewLine + + " -alt : alternate server launch sequence" + NewLine + + " -a : same as -alt" + NewLine + + " -nowait : don't pause for anything" + NewLine + + " -n : same as -nowait" + NewLine + + " -i# : override the iteration spawn offset increment (default 380) (example: -i100)" + NewLine + + " -x# : set the X offset to generate land around (example: -x0 or -x1000 or -x-500)" + NewLine + + " -z# : set the Z offset to generate land around (example: -z0 or -z1000 or -z-500)" + NewLine + + NewLine + + "Other options:" + NewLine + + " java -jar " + MLGFileNameShort + " -update" + NewLine + + " Checks for and downloads new versions of MLG online." + NewLine + + NewLine + + " java -jar " + MLGFileNameShort + " -printspawn" + NewLine + + " java -jar " + MLGFileNameShort + " -ps" + NewLine + + " Outputs the current world's spawn point coordinates." + NewLine + + NewLine + + " java -jar " + MLGFileNameShort + " -conf" + NewLine + + " java -jar " + MLGFileNameShort + " -conf download" + NewLine + + " Generates or downloads a "+ MinecraftLandGeneratorConf + " file." + NewLine + + NewLine + + " java -jar " + MLGFileNameShort + " -readme readme.txt" + NewLine + + " java -jar " + MLGFileNameShort + " -readme" + NewLine + + " Generates a readme file using supplied name or the default " + defaultReadmeFile + NewLine + + NewLine + + " java -jar " + MLGFileNameShort + " -downloadfile http://example.com/file.txt" + NewLine + + " Downloads whatever file from the internet you give it." + NewLine + + " java -jar " + MLGFileNameShort + " -downloadlist list.txt" + NewLine + + " list.txt (or any other file) contains a URL on each line which will be downloaded." + NewLine + + NewLine + + " java -jar " + MLGFileNameShort + " -version" + NewLine + + " java -jar " + MLGFileNameShort + " -help" + NewLine + + " java -jar " + MLGFileNameShort + " /?" + NewLine + + " Prints this message." + NewLine + + NewLine + + "When launched with the -conf switch, this application creates a " + MinecraftLandGeneratorConf + " file that contains configuration options." + NewLine + + "If this file does not exist or does not contain all required properties, the application will not run." + NewLine + + NewLine + + MinecraftLandGeneratorConf + " properties:" + NewLine + + " Java : The command line to use to launch the server" + NewLine + + " ServerPath : The path to the directory in which the server runs (can be overridden by the serverpath argument)" + NewLine + + " Done_Text : The output from the server that tells us that we are done" + NewLine + + " Preparing_Text : The output from the server that tells us the percentage" + NewLine + + "Preparing_Level : The output from the server that tells us the level it is working on" + NewLine + + " Level-0 : Name of Level 0: The Overworld" + NewLine + + " Level-1 : Name of Level 1: The Nether" + NewLine + + " Level-2 : Name of Level 2: The End" + NewLine + + " Level-3 : Name of Level 3: (Future Level)" + NewLine + + " Level-4 : Name of Level 4: (Future Level)" + NewLine + + " Level-5 : Name of Level 5: (Future Level)" + NewLine + + " Level-6 : Name of Level 6: (Future Level)" + NewLine + + " Level-7 : Name of Level 7: (Future Level)" + NewLine + + " Level-8 : Name of Level 8: (Future Level)" + NewLine + + " Level-9 : Name of Level 9: (Future Level)" + NewLine + + " WaitSave : Optional: Wait before saving." + NewLine; + //@formatter:on + + String returnString = null; + + if (SysOut) { + Main.out(Str); + Main.out(""); + } else { + returnString = Str; + } + return returnString; + + } + +} diff --git a/src/morlok8k/minecraft/landgenerator/MLG_SelfAware.java b/src/morlok8k/MinecraftLandGenerator/SelfAware.java similarity index 69% rename from src/morlok8k/minecraft/landgenerator/MLG_SelfAware.java rename to src/morlok8k/MinecraftLandGenerator/SelfAware.java index 4a11a56..dac2fcc 100644 --- a/src/morlok8k/minecraft/landgenerator/MLG_SelfAware.java +++ b/src/morlok8k/MinecraftLandGenerator/SelfAware.java @@ -1,19 +1,18 @@ -package morlok8k.minecraft.landgenerator; +package morlok8k.MinecraftLandGenerator; import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; import java.util.List; -import corrodias.minecraft.landgenerator.Main; -public class MLG_SelfAware { +public class SelfAware { public static String JVMinfo() { String Return = ""; - RuntimeMXBean RuntimemxBean = ManagementFactory.getRuntimeMXBean(); - List aList = RuntimemxBean.getInputArguments(); + final RuntimeMXBean RuntimemxBean = ManagementFactory.getRuntimeMXBean(); + final List aList = RuntimemxBean.getInputArguments(); for (int i = 0; i < aList.size(); i++) { Return = Return + (aList.get(i)) + " "; diff --git a/src/corrodias/minecraft/landgenerator/MLG_Server.java b/src/morlok8k/MinecraftLandGenerator/Server.java similarity index 90% rename from src/corrodias/minecraft/landgenerator/MLG_Server.java rename to src/morlok8k/MinecraftLandGenerator/Server.java index f949c83..210a520 100644 --- a/src/corrodias/minecraft/landgenerator/MLG_Server.java +++ b/src/morlok8k/MinecraftLandGenerator/Server.java @@ -1,11 +1,11 @@ -package corrodias.minecraft.landgenerator; +package morlok8k.MinecraftLandGenerator; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; -public class MLG_Server { +public class Server { /** * Starts the process in the given ProcessBuilder, monitors its output for a "[INFO] Done!" message, and sends it a "stop\r\n" message. One message is printed to the console before launching and @@ -16,7 +16,7 @@ public class MLG_Server { * @throws IOException * @author Corrodias */ - protected static boolean runMinecraft(boolean alternate) throws IOException { + protected static boolean runMinecraft(final boolean alternate) throws IOException { if (Main.verbose) { Main.out("Starting server."); } @@ -30,21 +30,21 @@ public class MLG_Server { if (alternate) { // Alternate - a replication (slightly stripped down) of MLG 1.3.0's code. simplest code possible. Main.out("Alternate Launch"); - Process process = Main.minecraft.start(); + final Process process = Main.minecraft.start(); //byte[] saveAll = { 's', 'a', 'v', 'e', '-', 'a', 'l', 'l', '\r', '\n' }; - byte[] stop = { 's', 't', 'o', 'p', '\r', '\n' }; + final byte[] stop = { 's', 't', 'o', 'p', '\r', '\n' }; // monitor output and print to console where required. // STOP the server when it's done. - BufferedReader pOut = + final BufferedReader pOut = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = pOut.readLine().trim()) != null) { // readLine() returns null when the process exits System.out.println(line); if (line.contains(Main.doneText)) { // EDITED By Morlok8k for Minecraft 1.3+ Beta - OutputStream outputStream = process.getOutputStream(); + final OutputStream outputStream = process.getOutputStream(); Main.out("Stopping server... (Please Wait...)"); outputStream.write(stop); @@ -55,11 +55,11 @@ public class MLG_Server { // End while loop } else { // start minecraft server normally! - Process process = Main.minecraft.start(); + final Process process = Main.minecraft.start(); if (Main.verbose) { Main.out("Started Server."); } - BufferedReader pOut = + final BufferedReader pOut = new BufferedReader(new InputStreamReader(process.getInputStream())); if (Main.verbose) { Main.out("Accessing Server Output..."); @@ -70,20 +70,20 @@ public class MLG_Server { String outTmp = ""; String outTmp2 = null; - byte[] stop = { 's', 't', 'o', 'p', '\r', '\n' }; // Moved here, so this code wont run every loop, thus Faster! + final byte[] stop = { 's', 't', 'o', 'p', '\r', '\n' }; // Moved here, so this code wont run every loop, thus Faster! // and no, i can't use a string here! - byte[] saveAll = { 's', 'a', 'v', 'e', '-', 'a', 'l', 'l', '\r', '\n' }; + final byte[] saveAll = { 's', 'a', 'v', 'e', '-', 'a', 'l', 'l', '\r', '\n' }; boolean prepTextFirst = true; - OutputStream outputStream = process.getOutputStream(); // moved here to remove some redundancy + final OutputStream outputStream = process.getOutputStream(); // moved here to remove some redundancy boolean convertedMapFormattingFlag = false; // This allows MLG to track if we converted a map to a new format (such as Chunk-file -> McRegion, or McRegion -> Anvil) // just so it gets a line ending after the % output finishes while ((line = pOut.readLine().trim()) != null) { // readLine() returns null when the process exits - int posBracket = line.indexOf("]"); //changed from .lastIndexOf to .indexOf, in case we have a custom server that outputs something with an "]". we want the first one anyways. + final int posBracket = line.indexOf("]"); //changed from .lastIndexOf to .indexOf, in case we have a custom server that outputs something with an "]". we want the first one anyways. if (posBracket != -1) { shortLine = line.substring(posBracket + 2); shortLine = shortLine.trim(); @@ -182,7 +182,7 @@ public class MLG_Server { try { Thread.sleep(1000); - } catch (InterruptedException e) { + } catch (final InterruptedException e) { e.printStackTrace(); } count += 1; @@ -207,7 +207,7 @@ public class MLG_Server { try { Thread.sleep(1000); - } catch (InterruptedException e) { + } catch (final InterruptedException e) { e.printStackTrace(); } count += 1; diff --git a/src/corrodias/minecraft/landgenerator/MLG_SpawnPoint.java b/src/morlok8k/MinecraftLandGenerator/SpawnPoint.java similarity index 71% rename from src/corrodias/minecraft/landgenerator/MLG_SpawnPoint.java rename to src/morlok8k/MinecraftLandGenerator/SpawnPoint.java index e54f337..ab1326e 100644 --- a/src/corrodias/minecraft/landgenerator/MLG_SpawnPoint.java +++ b/src/morlok8k/MinecraftLandGenerator/SpawnPoint.java @@ -1,4 +1,4 @@ -package corrodias.minecraft.landgenerator; +package morlok8k.MinecraftLandGenerator; import java.io.File; import java.io.FileInputStream; @@ -8,7 +8,6 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; -import morlok8k.minecraft.landgenerator.Coordinates; import org.jnbt.CompoundTag; import org.jnbt.IntTag; @@ -17,7 +16,7 @@ import org.jnbt.NBTInputStream; import org.jnbt.NBTOutputStream; import org.jnbt.Tag; -public class MLG_SpawnPoint { +public class SpawnPoint { /** * Changes the spawn point in the given Alpha/Beta level to the given coordinates.
@@ -32,11 +31,11 @@ public class MLG_SpawnPoint { * if there are any problems reading/writing the file * @author Corrodias */ - protected static void setSpawn(File level, Coordinates xyz) throws IOException { + protected static void setSpawn(final File level, final Coordinates xyz) throws IOException { try { - NBTInputStream input = new NBTInputStream(new FileInputStream(level)); - CompoundTag originalTopLevelTag = (CompoundTag) input.readTag(); + final NBTInputStream input = new NBTInputStream(new FileInputStream(level)); + final CompoundTag originalTopLevelTag = (CompoundTag) input.readTag(); input.close(); //@formatter:off @@ -69,35 +68,35 @@ public class MLG_SpawnPoint { //@formatter:on - Map originalData = + final Map originalData = ((CompoundTag) originalTopLevelTag.getValue().get("Data")).getValue(); // This is our map of data. It is an unmodifiable map, for some reason, so we have to make a copy. - Map newData = new LinkedHashMap(originalData); + final Map newData = new LinkedHashMap(originalData); // .get() a couple of values, just to make sure we're dealing with a valid level file, here. Good for debugging, too. @SuppressWarnings("unused") - IntTag spawnX = (IntTag) newData.get("SpawnX"); // we never use these... Its only here for potential debugging. + final IntTag spawnX = (IntTag) newData.get("SpawnX"); // we never use these... Its only here for potential debugging. @SuppressWarnings("unused") - IntTag spawnY = (IntTag) newData.get("SpawnY"); // but whatever... so I (Morlok8k) suppressed these warnings. + final IntTag spawnY = (IntTag) newData.get("SpawnY"); // but whatever... so I (Morlok8k) suppressed these warnings. @SuppressWarnings("unused") - IntTag spawnZ = (IntTag) newData.get("SpawnZ"); // I don't want to remove existing code, either by myself (Morlok8k) or Corrodias + final IntTag spawnZ = (IntTag) newData.get("SpawnZ"); // I don't want to remove existing code, either by myself (Morlok8k) or Corrodias newData.put("SpawnX", new IntTag("SpawnX", xyz.getX())); // pulling the data out of the Coordinates, newData.put("SpawnY", new IntTag("SpawnY", xyz.getY())); // and putting it into our IntTag's newData.put("SpawnZ", new IntTag("SpawnZ", xyz.getZ())); // Again, we can't modify the data map in the old Tag, so we have to make a new one. - CompoundTag newDataTag = new CompoundTag("Data", newData); - Map newTopLevelMap = new HashMap(1); + final CompoundTag newDataTag = new CompoundTag("Data", newData); + final Map newTopLevelMap = new HashMap(1); newTopLevelMap.put("Data", newDataTag); - CompoundTag newTopLevelTag = new CompoundTag("", newTopLevelMap); + final CompoundTag newTopLevelTag = new CompoundTag("", newTopLevelMap); - NBTOutputStream output = new NBTOutputStream(new FileOutputStream(level)); + final NBTOutputStream output = new NBTOutputStream(new FileOutputStream(level)); output.writeTag(newTopLevelTag); output.close(); - } catch (ClassCastException ex) { + } catch (final ClassCastException ex) { throw new IOException("Invalid level format."); - } catch (NullPointerException ex) { + } catch (final NullPointerException ex) { throw new IOException("Invalid level format."); } } @@ -109,33 +108,33 @@ public class MLG_SpawnPoint { * @throws IOException * @author Corrodias */ - protected static Coordinates getSpawn(File level) throws IOException { + protected static Coordinates getSpawn(final File level) throws IOException { try { - NBTInputStream input = new NBTInputStream(new FileInputStream(level)); - CompoundTag originalTopLevelTag = (CompoundTag) input.readTag(); + final NBTInputStream input = new NBTInputStream(new FileInputStream(level)); + final CompoundTag originalTopLevelTag = (CompoundTag) input.readTag(); input.close(); - Map originalData = + final Map originalData = ((CompoundTag) originalTopLevelTag.getValue().get("Data")).getValue(); // This is our map of data. It is an unmodifiable map, for some // reason, so we have to make a copy. - Map newData = new LinkedHashMap(originalData); + final Map newData = new LinkedHashMap(originalData); // .get() a couple of values, just to make sure we're dealing with a // valid level file, here. Good for debugging, too. - IntTag spawnX = (IntTag) newData.get("SpawnX"); - IntTag spawnY = (IntTag) newData.get("SpawnY"); - IntTag spawnZ = (IntTag) newData.get("SpawnZ"); + final IntTag spawnX = (IntTag) newData.get("SpawnX"); + final IntTag spawnY = (IntTag) newData.get("SpawnY"); + final IntTag spawnZ = (IntTag) newData.get("SpawnZ"); - LongTag Seed = (LongTag) newData.get("RandomSeed"); + final LongTag Seed = (LongTag) newData.get("RandomSeed"); Main.randomSeed = Seed.getValue(); Main.out("Seed: " + Main.randomSeed); // lets output the seed, cause why not? - Coordinates ret = + final Coordinates ret = new Coordinates(spawnX.getValue(), spawnY.getValue(), spawnZ.getValue()); return ret; - } catch (ClassCastException ex) { + } catch (final ClassCastException ex) { throw new IOException("Invalid level format."); - } catch (NullPointerException ex) { + } catch (final NullPointerException ex) { throw new IOException("Invalid level format."); } } diff --git a/src/morlok8k/minecraft/landgenerator/MLG_StringArrayParse.java b/src/morlok8k/MinecraftLandGenerator/StringArrayParse.java similarity index 76% rename from src/morlok8k/minecraft/landgenerator/MLG_StringArrayParse.java rename to src/morlok8k/MinecraftLandGenerator/StringArrayParse.java index 4828a82..7263af8 100644 --- a/src/morlok8k/minecraft/landgenerator/MLG_StringArrayParse.java +++ b/src/morlok8k/MinecraftLandGenerator/StringArrayParse.java @@ -1,15 +1,15 @@ -package morlok8k.minecraft.landgenerator; +package morlok8k.MinecraftLandGenerator; -public class MLG_StringArrayParse { +public class StringArrayParse { - public static String[] Parse(String[] array, String ParseOut) { + public static String[] Parse(final String[] array, final String ParseOut) { //There is probably a better way to do this. //We input a String[] array, and a String. //if the String matches one inside the array, it gets "deleted" //(actually a new String[] without it is returned) - String[] workingArray = new String[array.length]; //workingArray is our working array. we don't modify the original. + final String[] workingArray = new String[array.length]; //workingArray is our working array. we don't modify the original. boolean removed = false; @@ -26,7 +26,7 @@ public class MLG_StringArrayParse { ii++; } - } catch (Exception ex) { + } catch (final Exception ex) { System.err.println("Something went wrong! (Parsing Error?)"); ex.fillInStackTrace(); return array; //we got some error... return the original array, just in case. @@ -34,7 +34,7 @@ public class MLG_StringArrayParse { if (removed) { // at this point, workingArray has null for its last string. we need to remove it. - String[] returnArray = new String[workingArray.length - 1]; + final String[] returnArray = new String[workingArray.length - 1]; for (int i = 0; i < returnArray.length; i++) { returnArray[i] = workingArray[i]; } diff --git a/src/morlok8k/minecraft/landgenerator/MLG_Time.java b/src/morlok8k/MinecraftLandGenerator/Time.java similarity index 70% rename from src/morlok8k/minecraft/landgenerator/MLG_Time.java rename to src/morlok8k/MinecraftLandGenerator/Time.java index ecbb09b..914def8 100644 --- a/src/morlok8k/minecraft/landgenerator/MLG_Time.java +++ b/src/morlok8k/MinecraftLandGenerator/Time.java @@ -1,31 +1,30 @@ -package morlok8k.minecraft.landgenerator; +package morlok8k.MinecraftLandGenerator; -import corrodias.minecraft.landgenerator.Main; -public class MLG_Time { +public class Time { /** * waits ten seconds. outputs 10%, 20%, etc after each second. * * @author Morlok8k */ - public static void waitTenSec(boolean output) { - + public static void waitTenSec(final boolean output) { + if (Main.dontWait) { return; } //Don't wait! - + if (output) { Main.outP(Main.MLG); //here we wait 10 sec. } - + int count = 0; while (count <= 100) { if (output) { Main.outP(count + "% "); } - + try { Thread.sleep(1000); - } catch (InterruptedException e) { + } catch (final InterruptedException e) { e.printStackTrace(); } count += 10; @@ -34,7 +33,7 @@ public class MLG_Time { Main.outP(Main.newLine); } return; - + } /** @@ -45,11 +44,11 @@ public class MLG_Time { * @author Morlok8k * @return String of Readable Time */ - public static String displayTime(long startTimeMillis, long endTimeMillis) { - - long millis = (endTimeMillis - startTimeMillis); + public static String displayTime(final long startTimeMillis, final long endTimeMillis) { + + final long millis = (endTimeMillis - startTimeMillis); //I just duplicated displayTime to have a start & end times, because it just made things simpler to code. - return (MLG_Time.displayTime(millis)); + return (Time.displayTime(millis)); } /** @@ -59,14 +58,14 @@ public class MLG_Time { * @author Morlok8k * @return String of Readable Time */ - public static String displayTime(long timeMillis) { - - long seconds = timeMillis / 1000; - long minutes = seconds / 60; - long hours = minutes / 60; - long days = hours / 24; - long years = days / 365; - + public static String displayTime(final long timeMillis) { + + final long seconds = timeMillis / 1000; + final long minutes = seconds / 60; + final long hours = minutes / 60; + final long days = hours / 24; + final long years = days / 365; + String took = (years > 0 ? String.format("%d " + ((years) == 1 ? "Year, " : "Years, "), years) : "") @@ -79,23 +78,23 @@ public class MLG_Time { : "") + String.format("%d " + ((seconds % 60) == 1 ? "Second" : "Seconds"), seconds % 60); - + if (!(Main.verbose)) { - int commaFirst = took.indexOf(","); - int commaSecond = took.substring((commaFirst + 1), took.length()).indexOf(","); + final int commaFirst = took.indexOf(","); + final int commaSecond = took.substring((commaFirst + 1), took.length()).indexOf(","); int end = (commaFirst + 1 + commaSecond); - + if (commaSecond == -1) { end = commaFirst; } - + if (commaFirst == -1) { end = took.length(); } - + took = took.substring(0, end); } - + took = took.trim(); return (took); } diff --git a/src/morlok8k/minecraft/landgenerator/MLG_Update.java b/src/morlok8k/MinecraftLandGenerator/Update.java similarity index 81% rename from src/morlok8k/minecraft/landgenerator/MLG_Update.java rename to src/morlok8k/MinecraftLandGenerator/Update.java index ec0352c..da34340 100644 --- a/src/morlok8k/minecraft/landgenerator/MLG_Update.java +++ b/src/morlok8k/MinecraftLandGenerator/Update.java @@ -1,4 +1,4 @@ -package morlok8k.minecraft.landgenerator; +package morlok8k.MinecraftLandGenerator; import java.io.BufferedReader; import java.io.BufferedWriter; @@ -16,10 +16,8 @@ import java.util.Iterator; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import corrodias.minecraft.landgenerator.MLG_Misc; -import corrodias.minecraft.landgenerator.Main; -public class MLG_Update { +public class Update { /** * This is an "undocumented" function to create a BuildID file. It should only be used right after compiling a .jar file
@@ -34,11 +32,11 @@ public class MLG_Update { * * @author Morlok8k */ - public static void buildID(boolean downloadOnly) { + public static void buildID(final boolean downloadOnly) { // download BuildID from Github. - boolean fileSuccess = - MLG_DownloadFile.downloadFile(Main.github_MLG_BuildID_URL, Main.testing); + final boolean fileSuccess = + DownloadFile.downloadFile(Main.github_MLG_BuildID_URL, Main.testing); if (fileSuccess) { Main.out(Main.buildIDFile + " file downloaded."); Main.flag_downloadedBuildID = true; @@ -58,7 +56,7 @@ public class MLG_Update { if (Main.MLGFileName == null) { try { Main.MLGFileName = getClassLoader(Main.cls); - } catch (Exception e) { + } catch (final Exception e) { Main.out("Error: Finding file failed"); e.printStackTrace(); } @@ -68,10 +66,10 @@ public class MLG_Update { if (Main.MLG_Current_Hash == null) { try { - Main.MLG_Current_Hash = MLG_MD5.fileMD5(Main.MLGFileName); + Main.MLG_Current_Hash = MD5.fileMD5(Main.MLGFileName); // out(hash + " " + MLGFileName); - } catch (Exception e) { - Main.out("Error: MLG_MD5 from file failed"); + } catch (final Exception e) { + Main.out("Error: MD5 from file failed"); e.printStackTrace(); } } @@ -80,7 +78,7 @@ public class MLG_Update { try { time = getCompileTimeStamp(Main.cls); - } catch (Exception e) { + } catch (final Exception e) { Main.out("Error: TimeStamp from file failed"); e.printStackTrace(); } @@ -95,8 +93,9 @@ public class MLG_Update { try { String line; - BufferedReader inFile = new BufferedReader(new FileReader(Main.buildIDFile)); - BufferedWriter outFile = new BufferedWriter(new FileWriter(Main.buildIDFile + ".temp")); + final BufferedReader inFile = new BufferedReader(new FileReader(Main.buildIDFile)); + final BufferedWriter outFile = + new BufferedWriter(new FileWriter(Main.buildIDFile + ".temp")); while ((line = inFile.readLine()) != null) { @@ -119,20 +118,20 @@ public class MLG_Update { outFile.close(); inFile.close(); - File fileDelete = new File(Main.buildIDFile); + final File fileDelete = new File(Main.buildIDFile); fileDelete.delete(); - File fileRename = new File(Main.buildIDFile + ".temp"); + final File fileRename = new File(Main.buildIDFile + ".temp"); fileRename.renameTo(new File(Main.buildIDFile)); - } catch (FileNotFoundException ex) { + } catch (final FileNotFoundException ex) { Main.out("\"" + Main.buildIDFile + "\" file not Found. Generating New \"" + Main.buildIDFile + "\" File"); - MLG_FileWrite.writeTxtFile(Main.buildIDFile, + FileWrite.writeTxtFile(Main.buildIDFile, Main.MLG_Current_Hash + "=" + String.valueOf(time.getTime()) + "#MLG v" + Main.VERSION + INFO); - } catch (IOException ex) { + } catch (final IOException ex) { Main.err("Could not create \"" + Main.buildIDFile + "\"."); return; } @@ -156,7 +155,7 @@ public class MLG_Update { if (Main.MLGFileName == null) { try { Main.MLGFileName = getClassLoader(Main.cls); - } catch (Exception e) { + } catch (final Exception e) { Main.out("Error: Finding file failed"); e.printStackTrace(); } @@ -174,10 +173,10 @@ public class MLG_Update { if (Main.MLG_Current_Hash == null) { try { - Main.MLG_Current_Hash = MLG_MD5.fileMD5(Main.MLGFileName); + Main.MLG_Current_Hash = MD5.fileMD5(Main.MLGFileName); // out(hash + " " + MLGFileName); - } catch (Exception e) { - Main.out("Error: MLG_MD5 from file failed"); + } catch (final Exception e) { + Main.out("Error: MD5 from file failed"); e.printStackTrace(); } } @@ -189,7 +188,7 @@ public class MLG_Update { if (Main.MLG_Last_Modified_Date == null) { boolean foundLine = false; try { - BufferedReader in = new BufferedReader(new FileReader(Main.buildIDFile)); + final BufferedReader in = new BufferedReader(new FileReader(Main.buildIDFile)); String line; if (Main.testing) { @@ -239,9 +238,9 @@ public class MLG_Update { new Long(line.substring(pos + 1, end)); Main.MLG_Last_Modified_Date = new Date(Main.MLG_Last_Modified_Long); - Long highestModTime = - MLG_Update.ZipGetModificationTime(Main.MLGFileName); - long tCalc = Main.MLG_Last_Modified_Long - highestModTime; + final Long highestModTime = + Update.ZipGetModificationTime(Main.MLGFileName); + final long tCalc = Main.MLG_Last_Modified_Long - highestModTime; if (Main.testing) { Main.outD("tCalc\tMLG_Last_Modified_Long\thighestModTime" @@ -293,7 +292,7 @@ public class MLG_Update { readBuildID(); // yes I'm calling the function from itself. potential infinite loop? possibly. I haven't encountered it yet! return; } - } catch (Exception e) { + } catch (final Exception e) { Main.err("Cant Read " + Main.buildIDFile + "!"); Main.err(e.getLocalizedMessage()); Main.err(""); @@ -319,7 +318,7 @@ public class MLG_Update { Main.MLG_Last_Modified_Date = null; readBuildID(); - Iterator e = Main.timeStamps.iterator(); + final Iterator e = Main.timeStamps.iterator(); String s; int diff; @@ -334,18 +333,18 @@ public class MLG_Update { Main.out("There is a NEW VERSION Of " + Main.PROG_NAME + " available online!"); try { - File fileRename = new File(Main.MLG_JarFile); + final File fileRename = new File(Main.MLG_JarFile); fileRename.renameTo(new File(Main.MLG_JarFile + ".old")); - } catch (Exception e1) { + } catch (final Exception e1) { Main.out("Rename attempt #1 failed!"); e1.printStackTrace(); try { - MLG_Misc.copyFile(new File(Main.MLG_JarFile), new File(Main.MLG_JarFile + Misc.copyFile(new File(Main.MLG_JarFile), new File(Main.MLG_JarFile + ".old")); - File fileDelete = new File(Main.MLG_JarFile); + final File fileDelete = new File(Main.MLG_JarFile); fileDelete.delete(); - } catch (Exception e2) { + } catch (final Exception e2) { Main.out("Rename attempt #2 failed!"); e2.printStackTrace(); //renameFailed = true; @@ -354,7 +353,8 @@ public class MLG_Update { } - boolean fileSuccess = MLG_DownloadFile.downloadFile(Main.github_MLG_jar_URL, true); + final boolean fileSuccess = + DownloadFile.downloadFile(Main.github_MLG_jar_URL, true); if (fileSuccess) { Main.out(Main.MLG_JarFile + " downloaded."); return; @@ -370,10 +370,10 @@ public class MLG_Update { * * @author Morlok8k */ - public static String getClassLoader(Class classFile) throws IOException { - ClassLoader loader = classFile.getClassLoader(); + public static String getClassLoader(final Class classFile) throws IOException { + final ClassLoader loader = classFile.getClassLoader(); String filename = classFile.getName().replace('.', '/') + ".class"; - URL resource = + final URL resource = (loader != null) ? loader.getResource(filename) : ClassLoader .getSystemResource(filename); filename = URLDecoder.decode(resource.toString(), "UTF-8"); @@ -399,7 +399,7 @@ public class MLG_Update { Main.isCompiledAsJar = true; } filename = filename.replace('/', File.separatorChar); - String returnString = filename.substring(file, bang); + final String returnString = filename.substring(file, bang); // END Garbage removal return returnString; } @@ -412,18 +412,18 @@ public class MLG_Update { * * @author Morlok8k */ - public static Date getCompileTimeStamp(Class classFile) throws IOException { - ClassLoader loader = classFile.getClassLoader(); - String filename = classFile.getName().replace('.', '/') + ".class"; + public static Date getCompileTimeStamp(final Class classFile) throws IOException { + final ClassLoader loader = classFile.getClassLoader(); + final String filename = classFile.getName().replace('.', '/') + ".class"; // get the corresponding class file as a Resource. - URL resource = + final URL resource = (loader != null) ? loader.getResource(filename) : ClassLoader .getSystemResource(filename); - URLConnection connection = resource.openConnection(); + final URLConnection connection = resource.openConnection(); // Note, we are using Connection.getLastModified not File.lastModifed. // This will then work both or members of jars or standalone class files. // NOTE: NOT TRUE! IT READS THE JAR, NOT THE FILES INSIDE! - long time = connection.getLastModified(); + final long time = connection.getLastModified(); return (time != 0L) ? new Date(time) : null; } @@ -441,26 +441,26 @@ public class MLG_Update { * @param timeBuildID * @author Morlok8k */ - public static Long ZipGetModificationTime(String zipFile) { + public static Long ZipGetModificationTime(final String zipFile) { Long highestModTime = 0L; try { - ZipFile zipF = new ZipFile(zipFile); + final ZipFile zipF = new ZipFile(zipFile); /* * Get list of zip entries using entries method of ZipFile class. */ - Enumeration e = zipF.entries(); + final Enumeration e = zipF.entries(); if (Main.testing) { Main.outD("File Name\t\tCRC\t\tModification Time\n---------------------------------\n"); } while (e.hasMoreElements()) { - ZipEntry entry = e.nextElement(); + final ZipEntry entry = e.nextElement(); Long modTime = entry.getTime(); @@ -474,9 +474,9 @@ public class MLG_Update { if (Main.testing) { - String entryName = entry.getName(); - Date modificationTime = new Date(modTime); - String CRC = Long.toHexString(entry.getCrc()); + final String entryName = entry.getName(); + final Date modificationTime = new Date(modTime); + final String CRC = Long.toHexString(entry.getCrc()); Main.outD(entryName + "\t" + CRC + "\t" + modificationTime + "\t" + modTime.toString()); @@ -488,7 +488,7 @@ public class MLG_Update { return highestModTime; - } catch (IOException ioe) { + } catch (final IOException ioe) { Main.out("Error opening zip file" + ioe); return 0L; //return Jan. 1, 1970 12:00 GMT for failures } diff --git a/src/corrodias/minecraft/landgenerator/MLG_WorldVerify.java b/src/morlok8k/MinecraftLandGenerator/WorldVerify.java similarity index 90% rename from src/corrodias/minecraft/landgenerator/MLG_WorldVerify.java rename to src/morlok8k/MinecraftLandGenerator/WorldVerify.java index 44e92b3..1f57aa8 100644 --- a/src/corrodias/minecraft/landgenerator/MLG_WorldVerify.java +++ b/src/morlok8k/MinecraftLandGenerator/WorldVerify.java @@ -1,4 +1,4 @@ -package corrodias.minecraft.landgenerator; +package morlok8k.MinecraftLandGenerator; import java.io.BufferedReader; import java.io.File; @@ -8,7 +8,7 @@ import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; -public class MLG_WorldVerify { +public class WorldVerify { /** * @@ -17,7 +17,7 @@ public class MLG_WorldVerify { //TODO: element comment // verify that we ended up with a good server path, either from the file or from an argument. - File file = new File(Main.serverPath); + final File file = new File(Main.serverPath); if (!file.exists() || !file.isDirectory()) { Main.err("The server directory is invalid: " + Main.serverPath); return; @@ -25,7 +25,7 @@ public class MLG_WorldVerify { try { // read the name of the current world from the server.properties file - BufferedReader props = + final BufferedReader props = new BufferedReader(new FileReader(new File(Main.serverPath + Main.fileSeparator + "server.properties"))); String line; @@ -98,15 +98,15 @@ public class MLG_WorldVerify { } } - } catch (FileNotFoundException ex) { + } catch (final FileNotFoundException ex) { Main.err("Could not open " + Main.serverPath + Main.fileSeparator + "server.properties"); return; - } catch (IOException ex) { + } catch (final IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); return; } - File level = new File(Main.worldPath + Main.fileSeparator + "level.dat"); + final File level = new File(Main.worldPath + Main.fileSeparator + "level.dat"); if (!level.exists() || !level.isFile()) { Main.err("The currently-configured world does not exist."); return; diff --git a/src/morlok8k/minecraft/landgenerator/MLG_Readme_and_HelpInfo.java b/src/morlok8k/minecraft/landgenerator/MLG_Readme_and_HelpInfo.java deleted file mode 100644 index c7dbdd3..0000000 --- a/src/morlok8k/minecraft/landgenerator/MLG_Readme_and_HelpInfo.java +++ /dev/null @@ -1,316 +0,0 @@ -package morlok8k.minecraft.landgenerator; - -import corrodias.minecraft.landgenerator.Main; - -public class MLG_Readme_and_HelpInfo { - - static String newLine = Main.newLine; - static String MLGFileNameShort = Main.MLGFileNameShort; - static String MinecraftLandGeneratorConf = Main.MinecraftLandGeneratorConf; - static String defaultReadmeFile = Main.defaultReadmeFile; - - /** - * Saves a Readme file. - * - * @param readmeFile - * @author Morlok8k - * - */ - public static void readMe(String readmeFile) { - - if (readmeFile == "" || readmeFile == null) { - readmeFile = defaultReadmeFile; - } - - String MLG_Last_Modified_MDY = Main.dateFormat_MDY.format(Main.MLG_Last_Modified_Date); - String PROG_NAME = Main.PROG_NAME; - String VERSION = Main.VERSION; - - String showHelpSTR = ""; - String ReadMeText = ""; - String VersionInfo = ""; - - //@formatter:off - ReadMeText = PROG_NAME + " version " + VERSION + newLine - + newLine - + "Updated " + MLG_Last_Modified_MDY + newLine - + "(BuildID: " + Main.MLG_Last_Modified_Date.getTime() + ")" + newLine - + newLine - + "Original Code by Corrodias November 2010" + newLine - + "Enhanced Code by Morlok8k Feb. 2011 to Now (or at least to " + MLG_Last_Modified_MDY + "!)" + newLine - + "Additional Code by pr0f1x October 2011" + newLine - + newLine - + "Website: https://sites.google.com/site/minecraftlandgenerator/" + newLine - + "Forum: http://www.minecraftforum.net/topic/187737-minecraft-land-generator/" + newLine - + "Source: https://github.com/Morlok8k/MinecraftLandGenerator" + newLine - + newLine - + "-----------------------------------------------" + newLine - + newLine - + "This program lets you generate an area of land with your Minecraft Beta SMP server (and is prossibly future-proof for newer versions). You set up your java command line and minecraft server paths in the MinecraftLandGenerator.conf file, set up the server's server.properties file with the name of the world you wish to use, and then run this program." + newLine - + "When a Minecraft server is launched, it automatically generates chunks within a square area of 25x25 chunks (400x400 blocks), centered on the current spawn point (formally 20x20 chunks, 320x320 blocks). When provided X and Z ranges as arguments, this program will launch the server repeatedly, editing the level.dat file between sessions, to generate large amounts of land without players having to explore them. The generated land will have about the X and Z ranges as requested by the arguments, though it will not be exact due to the spawn point typically not on the border of a chunk. (Because of this, MLG by default adds a slight overlap with each pass - 380x380 blocks) You can use the -x and -z switches to override the spawn offset and center the land generation on a different point." + newLine - + "The program makes a backup of level.dat as level_backup.dat before editing, and restores the backup at the end. In the event that a level_backup.dat file already exists, the program will refuse to proceed, leaving the user to determine why the level_backup.dat file exists and whether they would rather restore it or delete it, which must be done manually." + newLine - + newLine - + "This program is public domain, and the source code is included in the .jar file. (If accidently missing, like in 1.3.0 and 1.4.0, it is always available at Github.)" + newLine - + "The JNLP library is included (inside the .jar). It is not public domain. Its license is included, as LICENSE.TXT." + newLine - + "It is also available at: http://jnbt.sourceforge.net/" + newLine - + newLine - + "The \"unescape\" method/function is also not Public Domain. Its License is the W3C\u00A9 Software License, and located here: http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231" - + newLine - + "Other Public Domain code has been used in this program, and references to sources are included in the comments of " + PROG_NAME + "'s source code." - + newLine - + "-----------------------------------------------" + newLine - + newLine; - //@formatter:on - - showHelpSTR = showHelp(false); //stored as a string for easier manipulation in the future - - //@formatter:off - VersionInfo = newLine - + "-----------------------------------------------" + newLine - + newLine - + "Version History:" + newLine - + "Morlok8k:" + newLine - + "1.7.0" + newLine - + "- Major Code Optimization" + newLine - + "- Drastically reduced the amount of time it takes for MLG to expand a world after it has already done so before!" + newLine - + " (To do this, I needed to rewrite the Main loop of the program, and add my own Coordinate object)" + newLine - + "- Added Resume Functionality" + newLine - + "- Updated Time Output yet again." + newLine - + "- Made xx% output nicer by rewriting previous existing line." + newLine - + "- Misc. Tweaks" + newLine - + "- Misc. Additions" + newLine - + "1.6.3" + newLine - + "- Minor Code Optimization" + newLine - + "- Finely got on the ball and added the JNBT source and everything (as an internal .zip) to be completely faithful to his license" + newLine - + "- Also adding script files internally in the .jar for archive (or offline) purposes. (Manual Extract needed for use)" + newLine - + "- Modified output of MLG slightly to show whats the server and whats MLG. (I may do more with this later.)" + newLine - + "1.6.2" + newLine - + "- Major Code Optimization" + newLine - + "- Updated Time Output again. Now says \"1 Minute\" instead of \"1 Minutes\"." + newLine - + "- Updated Location Code - the center of the square is now truely centered, and it trys to get as close to the given size as possible." + newLine - + "- Added \"-nowait\" and its shorter version \"-n\"" + newLine - + "- Added currently non-functional RCON code. Will try to make functional in the future." + newLine - + newLine - + "1.6.11" + newLine - + "- Removed End-of-Generation ASCII-Graphic - It didn't really fit with MLG." + newLine - + "- Updated Time Output." + newLine - + "- Changed estimated time remaining to count all runs, not just the last four." + newLine - + "- Added the time it took to complete at the end of generation." + newLine - + newLine - + "1.6.1" + newLine - + "- Added some modifications for scripting (Mainly for a new Initial setup script)" + newLine - + "- Changed MLG's Y to Z. Now it matches Minecraft. Y in the game is Height." + newLine - + "- Renamed -y switch to -z. MLG will remain backwards compatible if you use the old -y switch." + newLine - + "- Updated -printspawn to show X,Y,Z" + newLine - + "- Added End-of-Generation ASCII-Graphic" + newLine - + "- Slightly altered some text output" + newLine - + newLine - + "1.6.05" + newLine - + "- MLG displays if the server is converting the Map format, when not in verbose mode. (McRegion -> Anvil, or Chunk-File -> McRegion)" + newLine - + "- Minor fixes/edits/typos" + newLine - + "- Added link to new MLG website to readme file" - + newLine - + "1.6.03" + newLine - + "- added decoding of escape characters of URL's (so a space is a \" \" and not \"%20\")" + newLine - + "- added \"-downloadlist [list]\" where [list] is a text file with URL's on each line" + newLine - + newLine - + "1.6.02" + newLine - + "- small fix on caculating md5sum where old version didnt pad out to 32chars with zeros on the left side" - + "- quick Archive intergity fix after injecting source code into .jar after it compiled." - + "- no new functionality, md5 issue doesnt affect -update on old versions." - + newLine - + "1.6.0" + newLine - + "- NOW DOES NOT NEED ANY SCRIPT FILES!" + newLine - + "- Added the ability to download files from the internet" + newLine - + "- Added a switch to download any file off the internet, if needed (useless for most people, but included it in case I wanted it in the future.)" + newLine - + "- Added the ability to check what version the .jar is. (Using MD5 hashes, timestamps, and the BuildID file)" + newLine - + "- Added \"-update\" to download new versions of MLG directly from github." + newLine - + "- Updated estimated time. Now shows up on loop 2+ instead of loop 4+." + newLine - + "- Standard % output of the Server should look nicer now." + newLine - + "- Code Refactoring" + newLine - + "- Code Formatting" + newLine - + "- Code Optimization" + newLine - + "- Duplicate sections of code have been turned into Methods/\"Functions\"" + newLine - + newLine - + "1.5.1" + newLine - + "- pr0f1x: Added the \"save-all\" command to be sent to the server before shutting it down." + newLine - + "- pr0f1x: Added a 40 second wait before shutting down." + newLine - + "- Morlok8k: Made 40 second wait optional." + newLine - + "- Morlok8k: Changed the Dimensions code. (I had assumed it would be DIM-1, DIM-2, etc. but it turned out to be DIM-1 and DIM1. Change reflects Server output of \"Level n\")" + newLine - + "- Morlok8k: Config file is automatically updated to reflect these changes." + newLine - + "- Morlok8k: Cleaned up code." + newLine - + newLine - + "1.5.0" + newLine - + "- Supports Server Beta 1.6.4 (& hopefully future versions as well, while remaining backward compatible.)" + newLine - + "- Added \"-a\",\"-alt\" to use alternate method (a slightly simplier version of 1.3.0's code - pure verbose only)" + newLine - + "- Added world specific output for 9 dimensions (DIM-1 is the Nether, DIM-2 through DIM-9 dont exist yet, but if and when they do, you can configure it's text). (\"Level 0\", the default world, is displayed as the worlds name)" + newLine - + "- Updated Config File for these Dimensions." + newLine - + "- Reads and outputs the Seed to the output. (If you had used text for the Seed, Minecraft converts it into a number. This outputs the number.)" + newLine - + "- Changed the default 300 blocks to 380. The server now makes a 400x400 square block terrain instead of 320x320. Thus it is faster because there are less loops. To use the old way, use \"-i300\"" + newLine - + "- Added total Percentage done (technically, it displays the % done once the server finishes...)" + newLine - + "- Added debugging output vars of conf file (disabled - need to re-compile source to activate)" + newLine - + newLine - + "\t\t+ (the goal is to have MLG be configureable, so it can work on any version of the server, past or present.)" + newLine - + newLine - + "*** 1.4.5 (pre 1.5.0) ***" + newLine - + "- sorry! I shouldn't release untested code..." + newLine - + "*************************" + newLine - + newLine - + "1.4.4" + newLine - + "- Added ablilty to ignore [WARNING] and [SEVERE] errors with \"-w\"" + newLine - + newLine - + "1.4.3" + newLine - + "- Fixed \"-ps\",\"-printspawn\" as I had forgot I had broken it in 1.4.0 - due to config file change." + newLine - + newLine - + "1.4.2" + newLine - + "- No New Features" + newLine - + "- Changed non-verbose mode to display server progress on the same line, saving a lot of space." + newLine - + " - This couldn't wait for 1.5.0 ... I (Morlok8k) liked it too much." + newLine - + newLine - + "1.4.0" + newLine - + "- Future Proofing" + newLine - + "- Configurble Server Message reading. (If server updates and breaks MLG, you can add the new text!)" + newLine - + "- Updated config file, and auto updating from old format." + newLine - + "- Added % of spawn area to non-verbose output." + newLine - + "- Removed datetime stamps from server output in verbose mode" + newLine - + "- Other Misc fixes." + newLine - + newLine - + "1.3.0" + newLine - + "- Fixed Problems with Minecraft Beta 1.3 -- Morlok8k" + newLine - + newLine - + "-----------------------------------------------" + newLine - + newLine - + "Corrodias:" + newLine - + "1.2.0" + newLine - + "- land generation now centers on the spawn point instead of [0, 0]" + newLine - + "- the server is launched once before the spawn point is changed, to verify that it can run and to create a world if one doesn't exist" + newLine - + "- added -printspawn [-ps] switch to print the current spawn coordinates to the console" + newLine - + "- added -x and -y switches to override the X and Y offsets" + newLine - + "- added -v switch, does the same as -verbose" + newLine - + "- improved status message spacing to make things easier to read" + newLine - + "- improved time estimation algorithm: it now averages the last 3 launches" + newLine - + newLine - + "1.1.0" + newLine - + "- added MinecraftLandGenerator.conf file to hold the java command line and the server path" + newLine - + "- added -conf solo switch to generate a .conf file" + newLine - + "- added -verbose switch to output server output to the console (default is to ignore it)" + newLine - + "- added -i switch to allow customizing the block increment size (default is 300)" + newLine - + "- added instructions output in this version, i think" + newLine - + "- improved status message output to include current iteration and total iterations" + newLine - + newLine - + "1.0.0" + newLine - + "- initial release" + newLine - + newLine - + "-----------------------------------------------" + newLine - + newLine - + "Notes:" + newLine - + "Due to changes in server beta 1.6, it now generates the nether as well as the world at the same time." + newLine - + "However, Since beta 1.9 and Minecraft 1.0, the nether or the end is no longer generated." - + "I recommend using MCEDIT to relight the map after you generate it. This will take a long time, but should fix all those incorrectly dark spots in your level." + newLine; - //@formatter:on - - MLG_FileWrite.writeTxtFile(readmeFile, ReadMeText + showHelpSTR + VersionInfo); - - } - - /** - * Displays or returns Help information - * - * @param SysOut - *
- * Set TRUE to display info to System.out. (Returns null)
- * Set FALSE to return info as String. - * @author Morlok8k - */ - public static String showHelp(boolean SysOut) { - String Str = null; - String NewLine = newLine; - if (SysOut) { - NewLine = NewLine + Main.MLG; - } - - MLGFileNameShort = Main.MLGFileNameShort; - MinecraftLandGeneratorConf = Main.MinecraftLandGeneratorConf; - defaultReadmeFile = Main.defaultReadmeFile; - - //@formatter:off - Str = "Usage: java -jar " + MLGFileNameShort + " x z [serverpath] [switches]" + NewLine - + NewLine - + "Arguments:" + NewLine - + " x : X range to generate" + NewLine - + " z : Z range to generate" + NewLine - + " serverpath : the path to the directory in which the server runs (takes precedence over the config file setting)" + NewLine - + NewLine - + "Switches:" + NewLine - + " -verbose : causes the application to output the server's messages to the console" + NewLine - + " -v : same as -verbose" + NewLine - + " -w : Ignore [WARNING] and [SEVERE] messages." + NewLine - + " -alt : alternate server launch sequence" + NewLine - + " -a : same as -alt" + NewLine - + " -nowait : don't pause for anything" + NewLine - + " -n : same as -nowait" + NewLine - + " -i# : override the iteration spawn offset increment (default 380) (example: -i100)" + NewLine - + " -x# : set the X offset to generate land around (example: -x0 or -x1000 or -x-500)" + NewLine - + " -z# : set the Z offset to generate land around (example: -z0 or -z1000 or -z-500)" + NewLine - + NewLine - + "Other options:" + NewLine - + " java -jar " + MLGFileNameShort + " -update" + NewLine - + " Checks for and downloads new versions of MLG online." + NewLine - + NewLine - + " java -jar " + MLGFileNameShort + " -printspawn" + NewLine - + " java -jar " + MLGFileNameShort + " -ps" + NewLine - + " Outputs the current world's spawn point coordinates." + NewLine - + NewLine - + " java -jar " + MLGFileNameShort + " -conf" + NewLine - + " java -jar " + MLGFileNameShort + " -conf download" + NewLine - + " Generates or downloads a "+ MinecraftLandGeneratorConf + " file." + NewLine - + NewLine - + " java -jar " + MLGFileNameShort + " -readme readme.txt" + NewLine - + " java -jar " + MLGFileNameShort + " -readme" + NewLine - + " Generates a readme file using supplied name or the default " + defaultReadmeFile + NewLine - + NewLine - + " java -jar " + MLGFileNameShort + " -downloadfile http://example.com/file.txt" + NewLine - + " Downloads whatever file from the internet you give it." + NewLine - + " java -jar " + MLGFileNameShort + " -downloadlist list.txt" + NewLine - + " list.txt (or any other file) contains a URL on each line which will be downloaded." + NewLine - + NewLine - + " java -jar " + MLGFileNameShort + " -version" + NewLine - + " java -jar " + MLGFileNameShort + " -help" + NewLine - + " java -jar " + MLGFileNameShort + " /?" + NewLine - + " Prints this message." + NewLine - + NewLine - + "When launched with the -conf switch, this application creates a " + MinecraftLandGeneratorConf + " file that contains configuration options." + NewLine - + "If this file does not exist or does not contain all required properties, the application will not run." + NewLine - + NewLine - + MinecraftLandGeneratorConf + " properties:" + NewLine - + " Java : The command line to use to launch the server" + NewLine - + " ServerPath : The path to the directory in which the server runs (can be overridden by the serverpath argument)" + NewLine - + " Done_Text : The output from the server that tells us that we are done" + NewLine - + " Preparing_Text : The output from the server that tells us the percentage" + NewLine - + "Preparing_Level : The output from the server that tells us the level it is working on" + NewLine - + " Level-0 : Name of Level 0: The Overworld" + NewLine - + " Level-1 : Name of Level 1: The Nether" + NewLine - + " Level-2 : Name of Level 2: The End" + NewLine - + " Level-3 : Name of Level 3: (Future Level)" + NewLine - + " Level-4 : Name of Level 4: (Future Level)" + NewLine - + " Level-5 : Name of Level 5: (Future Level)" + NewLine - + " Level-6 : Name of Level 6: (Future Level)" + NewLine - + " Level-7 : Name of Level 7: (Future Level)" + NewLine - + " Level-8 : Name of Level 8: (Future Level)" + NewLine - + " Level-9 : Name of Level 9: (Future Level)" + NewLine - + " WaitSave : Optional: Wait before saving." + NewLine; - //@formatter:on - - String returnString = null; - - if (SysOut) { - Main.out(Str); - Main.out(""); - } else { - returnString = Str; - } - return returnString; - - } - -} diff --git a/src/org/w3c/bert_bos/UTF8URL/Unescape.java b/src/org/w3c/bert_bos/UTF8URL/Unescape.java index 02bc104..3ebb5a0 100644 --- a/src/org/w3c/bert_bos/UTF8URL/Unescape.java +++ b/src/org/w3c/bert_bos/UTF8URL/Unescape.java @@ -30,8 +30,8 @@ public class Unescape { */ public static String unescape(final String s) { - StringBuffer sbuf = new StringBuffer(); - int l = s.length(); + final StringBuffer sbuf = new StringBuffer(); + final int l = s.length(); int ch = -1; int b, sumb = 0; for (int i = 0, more = -1; i < l; i++) { @@ -39,13 +39,13 @@ public class Unescape { switch (ch = s.charAt(i)) { case '%': ch = s.charAt(++i); - int hb = - (Character.isDigit((char) ch) ? ch - '0' : 10 + Character - .toLowerCase((char) ch) - 'a') & 0xF; + final int hb = + (Character.isDigit((char) ch) ? ch - '0' : (10 + Character + .toLowerCase((char) ch)) - 'a') & 0xF; ch = s.charAt(++i); - int lb = - (Character.isDigit((char) ch) ? ch - '0' : 10 + Character - .toLowerCase((char) ch) - 'a') & 0xF; + final int lb = + (Character.isDigit((char) ch) ? ch - '0' : (10 + Character + .toLowerCase((char) ch)) - 'a') & 0xF; b = (hb << 4) | lb; break; case '+': @@ -57,7 +57,9 @@ public class Unescape { /* Decode byte b as UTF-8, sumb collects incomplete chars */ if ((b & 0xc0) == 0x80) { // 10xxxxxx (continuation byte) sumb = (sumb << 6) | (b & 0x3f); // Add 6 bits to sumb - if (--more == 0) sbuf.append((char) sumb); // Add char to sbuf + if (--more == 0) { + sbuf.append((char) sumb); // Add char to sbuf + } } else if ((b & 0x80) == 0x00) { // 0xxxxxxx (yields 7 bits) sbuf.append((char) b); // Store in sbuf } else if ((b & 0xe0) == 0xc0) { // 110xxxxx (yields 5 bits)