2021-08-08 11:26:46 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  argparse  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  os ,  sys  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  re  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  atexit  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  subprocess  import  Popen  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  shutil  import  copyfile  
						 
					
						
							
								
									
										
										
										
											2021-08-08 15:36:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  time  import  strftime  
						 
					
						
							
								
									
										
										
										
											2021-11-10 15:35:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  logging  
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:26:46 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  requests  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:26:46 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  Utils  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								atexit . register ( input ,  " Press enter to exit. " )  
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# 1 or more digits followed by m or g, then optional b  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								max_heap_re  =  re . compile ( r " ^ \ d+[mMgG][bB]?$ " )  
						 
					
						
							
								
									
										
										
										
											2021-12-10 08:33:52 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								forge_version  =  " 1.17.1-37.1.1 "  
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:26:46 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  prompt_yes_no ( prompt ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    yes_inputs  =  { ' yes ' ,  ' ye ' ,  ' y ' } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    no_inputs  =  { ' no ' ,  ' n ' } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    while  True : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        choice  =  input ( prompt  +  "  [y/n]  " ) . lower ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  choice  in  yes_inputs :  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        elif  choice  in  no_inputs :  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            print ( ' Please respond with  " y "  or  " n " . ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# Create mods folder if needed; find AP randomizer jar; return None if not found.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  find_ap_randomizer_jar ( forge_dir ) :  
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:26:46 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    mods_dir  =  os . path . join ( forge_dir ,  ' mods ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  os . path . isdir ( mods_dir ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  entry  in  os . scandir ( mods_dir ) : 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-19 13:27:40 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  entry . name . startswith ( " aprandomizer " )  and  entry . name . endswith ( " .jar " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                logging . info ( f " Found AP randomizer mod:  { entry . name } " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  entry . name 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  None 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:26:46 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        os . mkdir ( mods_dir ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 15:35:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        logging . info ( f " Created mods folder in  { forge_dir } " ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:26:46 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# Create APData folder if needed; clean .apmc files from APData; copy given .apmc into directory.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  replace_apmc_files ( forge_dir ,  apmc_file ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  apmc_file  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    apdata_dir  =  os . path . join ( forge_dir ,  ' APData ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-15 08:16:30 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    copy_apmc  =  True 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  not  os . path . isdir ( apdata_dir ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        os . mkdir ( apdata_dir ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 15:35:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        logging . info ( f " Created APData folder in  { forge_dir } " ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  entry  in  os . scandir ( apdata_dir ) : 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-15 08:16:30 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  entry . name . endswith ( " .apmc " )  and  entry . is_file ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  not  os . path . samefile ( apmc_file ,  entry . path ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                os . remove ( entry . path ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 15:35:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                logging . info ( f " Removed  { entry . name }  in  { apdata_dir } " ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-15 08:16:30 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            else :  # apmc already in apdata 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                copy_apmc  =  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  copy_apmc : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        copyfile ( apmc_file ,  os . path . join ( apdata_dir ,  os . path . basename ( apmc_file ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 15:35:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        logging . info ( f " Copied  { os . path . basename ( apmc_file ) }  to  { apdata_dir } " ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												MC: 1.17 support (#120)
* MC: add death_link option
* Minecraft: 1.17 advancements and logic support
* Update Minecraft tracker to 1.17
* Minecraft: add tests for new advancements
* removed jdk/forge download install out of iss and into MinecraftClient.py using flag --install
* Add required_bosses option
choices are none, ender_dragon, wither, both
postgame advancements are set according to the required boss for completion
* fix docstring for PostgameAdvancements
* Minecraft: add starting_items
List of dicts: item, amount, nbt
* Update descriptions for AdvancementGoal and EggShardsRequired
* Minecraft: fix tests for required_bosses attribute
* Minecraft: updated logic for various dragon-related advancements
Split the logic into can_respawn and can_kill dragon
Free the End, Monsters Hunted, The End Again still require both respawn and kill, since the player needs to kill and be credited with the kill
You Need a Mint and Is It a Plane now require only respawn, since the dragon need only be alive; if killed out of logic, it's ok
The Next Generation only requires kill, since the egg spawns regardless of whether the player was credited with the kill or not
* Minecraft client: ignore prereleases unless --prerelease flag is on
* explicitly state all defaults
change structure shuffle and structure compass defaults to true
update install tutorial to point to player-settings page, as well as removing instructions for manual install
* Minecraft client: add Minecraft version check
Adds a minecraft_version field in the apmc, and downloads only mods which contain that version in the name of the .jar file.
This ensures that the client remains compatible even if new mods are released for later versions, since they won't download a mod for a later version than the apmc says.
Co-authored-by: Kono Tyran <Kono.Tyran@gmail.com>
											 
										 
										
											2021-11-30 20:37:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								def  read_apmc_file ( apmc_file ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    from  base64  import  b64decode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    import  json 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    with  open ( apmc_file ,  ' r ' )  as  f : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        data  =  json . loads ( b64decode ( f . read ( ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  data 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# Check mod version, download new mod from GitHub releases page if needed.   
						 
					
						
							
								
									
										
											 
										
											
												MC: 1.17 support (#120)
* MC: add death_link option
* Minecraft: 1.17 advancements and logic support
* Update Minecraft tracker to 1.17
* Minecraft: add tests for new advancements
* removed jdk/forge download install out of iss and into MinecraftClient.py using flag --install
* Add required_bosses option
choices are none, ender_dragon, wither, both
postgame advancements are set according to the required boss for completion
* fix docstring for PostgameAdvancements
* Minecraft: add starting_items
List of dicts: item, amount, nbt
* Update descriptions for AdvancementGoal and EggShardsRequired
* Minecraft: fix tests for required_bosses attribute
* Minecraft: updated logic for various dragon-related advancements
Split the logic into can_respawn and can_kill dragon
Free the End, Monsters Hunted, The End Again still require both respawn and kill, since the player needs to kill and be credited with the kill
You Need a Mint and Is It a Plane now require only respawn, since the dragon need only be alive; if killed out of logic, it's ok
The Next Generation only requires kill, since the egg spawns regardless of whether the player was credited with the kill or not
* Minecraft client: ignore prereleases unless --prerelease flag is on
* explicitly state all defaults
change structure shuffle and structure compass defaults to true
update install tutorial to point to player-settings page, as well as removing instructions for manual install
* Minecraft client: add Minecraft version check
Adds a minecraft_version field in the apmc, and downloads only mods which contain that version in the name of the .jar file.
This ensures that the client remains compatible even if new mods are released for later versions, since they won't download a mod for a later version than the apmc says.
Co-authored-by: Kono Tyran <Kono.Tyran@gmail.com>
											 
										 
										
											2021-11-30 20:37:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								def  update_mod ( forge_dir ,  apmc_file ,  get_prereleases = False ) :  
						 
					
						
							
								
									
										
										
										
											2021-08-08 13:31:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ap_randomizer  =  find_ap_randomizer_jar ( forge_dir ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												MC: 1.17 support (#120)
* MC: add death_link option
* Minecraft: 1.17 advancements and logic support
* Update Minecraft tracker to 1.17
* Minecraft: add tests for new advancements
* removed jdk/forge download install out of iss and into MinecraftClient.py using flag --install
* Add required_bosses option
choices are none, ender_dragon, wither, both
postgame advancements are set according to the required boss for completion
* fix docstring for PostgameAdvancements
* Minecraft: add starting_items
List of dicts: item, amount, nbt
* Update descriptions for AdvancementGoal and EggShardsRequired
* Minecraft: fix tests for required_bosses attribute
* Minecraft: updated logic for various dragon-related advancements
Split the logic into can_respawn and can_kill dragon
Free the End, Monsters Hunted, The End Again still require both respawn and kill, since the player needs to kill and be credited with the kill
You Need a Mint and Is It a Plane now require only respawn, since the dragon need only be alive; if killed out of logic, it's ok
The Next Generation only requires kill, since the egg spawns regardless of whether the player was credited with the kill or not
* Minecraft client: ignore prereleases unless --prerelease flag is on
* explicitly state all defaults
change structure shuffle and structure compass defaults to true
update install tutorial to point to player-settings page, as well as removing instructions for manual install
* Minecraft client: add Minecraft version check
Adds a minecraft_version field in the apmc, and downloads only mods which contain that version in the name of the .jar file.
This ensures that the client remains compatible even if new mods are released for later versions, since they won't download a mod for a later version than the apmc says.
Co-authored-by: Kono Tyran <Kono.Tyran@gmail.com>
											 
										 
										
											2021-11-30 20:37:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  apmc_file  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        data  =  read_apmc_file ( apmc_file ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        minecraft_version  =  data . get ( ' minecraft_version ' ,  ' ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:26:46 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    client_releases_endpoint  =  " https://api.github.com/repos/KonoTyran/Minecraft_AP_Randomizer/releases " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    resp  =  requests . get ( client_releases_endpoint ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  resp . status_code  ==  200 :   # OK 
							 
						 
					
						
							
								
									
										
											 
										
											
												MC: 1.17 support (#120)
* MC: add death_link option
* Minecraft: 1.17 advancements and logic support
* Update Minecraft tracker to 1.17
* Minecraft: add tests for new advancements
* removed jdk/forge download install out of iss and into MinecraftClient.py using flag --install
* Add required_bosses option
choices are none, ender_dragon, wither, both
postgame advancements are set according to the required boss for completion
* fix docstring for PostgameAdvancements
* Minecraft: add starting_items
List of dicts: item, amount, nbt
* Update descriptions for AdvancementGoal and EggShardsRequired
* Minecraft: fix tests for required_bosses attribute
* Minecraft: updated logic for various dragon-related advancements
Split the logic into can_respawn and can_kill dragon
Free the End, Monsters Hunted, The End Again still require both respawn and kill, since the player needs to kill and be credited with the kill
You Need a Mint and Is It a Plane now require only respawn, since the dragon need only be alive; if killed out of logic, it's ok
The Next Generation only requires kill, since the egg spawns regardless of whether the player was credited with the kill or not
* Minecraft client: ignore prereleases unless --prerelease flag is on
* explicitly state all defaults
change structure shuffle and structure compass defaults to true
update install tutorial to point to player-settings page, as well as removing instructions for manual install
* Minecraft client: add Minecraft version check
Adds a minecraft_version field in the apmc, and downloads only mods which contain that version in the name of the .jar file.
This ensures that the client remains compatible even if new mods are released for later versions, since they won't download a mod for a later version than the apmc says.
Co-authored-by: Kono Tyran <Kono.Tyran@gmail.com>
											 
										 
										
											2021-11-30 20:37:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            latest_release  =  next ( filter ( lambda  release :  ( not  release [ ' prerelease ' ]  or  get_prereleases )  and  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ( apmc_file  is  None  or  minecraft_version  in  release [ ' assets ' ] [ 0 ] [ ' name ' ] ) ,  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                resp . json ( ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ap_randomizer  !=  latest_release [ ' assets ' ] [ 0 ] [ ' name ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                logging . info ( f " A new release of the Minecraft AP randomizer mod was found:  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                             f " { latest_release [ ' assets ' ] [ 0 ] [ ' name ' ] } " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ap_randomizer  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    logging . info ( f " Your current mod is  { ap_randomizer } . " ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:26:46 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                else : 
							 
						 
					
						
							
								
									
										
											 
										
											
												MC: 1.17 support (#120)
* MC: add death_link option
* Minecraft: 1.17 advancements and logic support
* Update Minecraft tracker to 1.17
* Minecraft: add tests for new advancements
* removed jdk/forge download install out of iss and into MinecraftClient.py using flag --install
* Add required_bosses option
choices are none, ender_dragon, wither, both
postgame advancements are set according to the required boss for completion
* fix docstring for PostgameAdvancements
* Minecraft: add starting_items
List of dicts: item, amount, nbt
* Update descriptions for AdvancementGoal and EggShardsRequired
* Minecraft: fix tests for required_bosses attribute
* Minecraft: updated logic for various dragon-related advancements
Split the logic into can_respawn and can_kill dragon
Free the End, Monsters Hunted, The End Again still require both respawn and kill, since the player needs to kill and be credited with the kill
You Need a Mint and Is It a Plane now require only respawn, since the dragon need only be alive; if killed out of logic, it's ok
The Next Generation only requires kill, since the egg spawns regardless of whether the player was credited with the kill or not
* Minecraft client: ignore prereleases unless --prerelease flag is on
* explicitly state all defaults
change structure shuffle and structure compass defaults to true
update install tutorial to point to player-settings page, as well as removing instructions for manual install
* Minecraft client: add Minecraft version check
Adds a minecraft_version field in the apmc, and downloads only mods which contain that version in the name of the .jar file.
This ensures that the client remains compatible even if new mods are released for later versions, since they won't download a mod for a later version than the apmc says.
Co-authored-by: Kono Tyran <Kono.Tyran@gmail.com>
											 
										 
										
											2021-11-30 20:37:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    logging . info ( f " You do not have the AP randomizer mod installed. " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  prompt_yes_no ( " Would you like to update? " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    old_ap_mod  =  os . path . join ( forge_dir ,  ' mods ' ,  ap_randomizer )  if  ap_randomizer  is  not  None  else  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    new_ap_mod  =  os . path . join ( forge_dir ,  ' mods ' ,  latest_release [ ' assets ' ] [ 0 ] [ ' name ' ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    logging . info ( " Downloading AP randomizer mod. This may take a moment... " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    apmod_resp  =  requests . get ( latest_release [ ' assets ' ] [ 0 ] [ ' browser_download_url ' ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  apmod_resp . status_code  ==  200 :  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        with  open ( new_ap_mod ,  ' wb ' )  as  f : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            f . write ( apmod_resp . content ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            logging . info ( f " Wrote new mod file to  { new_ap_mod } " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        if  old_ap_mod  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            os . remove ( old_ap_mod ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            logging . info ( f " Removed old mod file from  { old_ap_mod } " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        logging . error ( f " Error retrieving the randomizer mod (status code  { apmod_resp . status_code } ). " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        logging . error ( f " Please report this issue on the Archipelago Discord server. " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        sys . exit ( 1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        except  StopIteration : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            logging . warning ( f " No compatible mod version found for  { minecraft_version } . " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  not  prompt_yes_no ( " Run server anyway? " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                sys . exit ( 0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    else : 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 15:35:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        logging . error ( f " Error checking for randomizer mod updates (status code  { resp . status_code } ). " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        logging . error ( f " If this was not expected, please report this issue on the Archipelago Discord server. " ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  not  prompt_yes_no ( " Continue anyways? " ) : 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 15:36:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            sys . exit ( 0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# Check if the EULA is agreed to, and prompt the user to read and agree if necessary.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  check_eula ( forge_dir ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    eula_path  =  os . path . join ( forge_dir ,  " eula.txt " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  not  os . path . isfile ( eula_path ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Create eula.txt 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        with  open ( eula_path ,  ' w ' )  as  f : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            f . write ( " #By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula). \n " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            f . write ( f " # { strftime ( ' %a   % b  %d   %X   % Z  % Y ' ) } \n " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            f . write ( " eula=false \n " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    with  open ( eula_path ,  ' r+ ' )  as  f : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        text  =  f . read ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ' false '  in  text : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Prompt user to agree to the EULA 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 15:35:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            logging . info ( " You need to agree to the Minecraft EULA in order to run the server. " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            logging . info ( " The EULA can be found at https://account.mojang.com/documents/minecraft_eula " ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 15:36:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  prompt_yes_no ( " Do you agree to the EULA? " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                f . seek ( 0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                f . write ( text . replace ( ' false ' ,  ' true ' ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                f . truncate ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 15:35:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                logging . info ( f " Set  { eula_path }  to true " ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 15:36:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                sys . exit ( 0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:26:46 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												MC: 1.17 support (#120)
* MC: add death_link option
* Minecraft: 1.17 advancements and logic support
* Update Minecraft tracker to 1.17
* Minecraft: add tests for new advancements
* removed jdk/forge download install out of iss and into MinecraftClient.py using flag --install
* Add required_bosses option
choices are none, ender_dragon, wither, both
postgame advancements are set according to the required boss for completion
* fix docstring for PostgameAdvancements
* Minecraft: add starting_items
List of dicts: item, amount, nbt
* Update descriptions for AdvancementGoal and EggShardsRequired
* Minecraft: fix tests for required_bosses attribute
* Minecraft: updated logic for various dragon-related advancements
Split the logic into can_respawn and can_kill dragon
Free the End, Monsters Hunted, The End Again still require both respawn and kill, since the player needs to kill and be credited with the kill
You Need a Mint and Is It a Plane now require only respawn, since the dragon need only be alive; if killed out of logic, it's ok
The Next Generation only requires kill, since the egg spawns regardless of whether the player was credited with the kill or not
* Minecraft client: ignore prereleases unless --prerelease flag is on
* explicitly state all defaults
change structure shuffle and structure compass defaults to true
update install tutorial to point to player-settings page, as well as removing instructions for manual install
* Minecraft client: add Minecraft version check
Adds a minecraft_version field in the apmc, and downloads only mods which contain that version in the name of the .jar file.
This ensures that the client remains compatible even if new mods are released for later versions, since they won't download a mod for a later version than the apmc says.
Co-authored-by: Kono Tyran <Kono.Tyran@gmail.com>
											 
										 
										
											2021-11-30 20:37:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# get the current JDK16  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  find_jdk_dir ( )  - >  str :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  entry  in  os . listdir ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  os . path . isdir ( entry )  and  entry . startswith ( " jdk16 " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  os . path . abspath ( entry ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# get the java exe location  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  find_jdk ( )  - >  str :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    jdk  =  find_jdk_dir ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    jdk_exe  =  os . path . join ( jdk ,  " bin " ,  " java.exe " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  os . path . isfile ( jdk_exe ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  jdk_exe 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# Download Corretto 16 (Amazon JDK)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  download_java ( ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    jdk  =  find_jdk_dir ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  jdk  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print ( f " Removing old JDK... " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        from  shutil  import  rmtree 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        rmtree ( jdk ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( f " Downloading Java... " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    jdk_url  =  " https://corretto.aws/downloads/latest/amazon-corretto-16-x64-windows-jdk.zip " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    resp  =  requests . get ( jdk_url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  resp . status_code  ==  200 :   # OK 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print ( f " Extracting... " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        import  zipfile 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        from  io  import  BytesIO 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        with  zipfile . ZipFile ( BytesIO ( resp . content ) )  as  zf : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            zf . extractall ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print ( f " Error downloading Java (status code  { resp . status_code } ). " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print ( f " If this was not expected, please report this issue on the Archipelago Discord server. " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  prompt_yes_no ( " Continue anyways? " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            sys . exit ( 0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# download and install forge  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  install_forge ( directory :  str ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    jdk  =  find_jdk ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  jdk  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print ( f " Downloading Forge  { forge_version } ... " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        forge_url  =  f " https://maven.minecraftforge.net/net/minecraftforge/forge/ { forge_version } /forge- { forge_version } -installer.jar " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        resp  =  requests . get ( forge_url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  resp . status_code  ==  200 :   # OK 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            forge_install_jar  =  os . path . join ( directory ,  " forge_install.jar " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  not  os . path . exists ( directory ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                os . mkdir ( directory ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            with  open ( forge_install_jar ,  ' wb ' )  as  f : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                f . write ( resp . content ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            print ( f " Installing Forge... " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            argstring  =  '   ' . join ( [ jdk ,  " -jar " ,  " \" "  +  forge_install_jar +  " \" " ,  " --installServer " ,  " \" "  +  directory  +  " \" " ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            install_process  =  Popen ( argstring ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            install_process . wait ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            os . remove ( forge_install_jar ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# Run the Forge server. Return process object  
						 
					
						
							
								
									
										
											 
										
											
												MC: 1.17 support (#120)
* MC: add death_link option
* Minecraft: 1.17 advancements and logic support
* Update Minecraft tracker to 1.17
* Minecraft: add tests for new advancements
* removed jdk/forge download install out of iss and into MinecraftClient.py using flag --install
* Add required_bosses option
choices are none, ender_dragon, wither, both
postgame advancements are set according to the required boss for completion
* fix docstring for PostgameAdvancements
* Minecraft: add starting_items
List of dicts: item, amount, nbt
* Update descriptions for AdvancementGoal and EggShardsRequired
* Minecraft: fix tests for required_bosses attribute
* Minecraft: updated logic for various dragon-related advancements
Split the logic into can_respawn and can_kill dragon
Free the End, Monsters Hunted, The End Again still require both respawn and kill, since the player needs to kill and be credited with the kill
You Need a Mint and Is It a Plane now require only respawn, since the dragon need only be alive; if killed out of logic, it's ok
The Next Generation only requires kill, since the egg spawns regardless of whether the player was credited with the kill or not
* Minecraft client: ignore prereleases unless --prerelease flag is on
* explicitly state all defaults
change structure shuffle and structure compass defaults to true
update install tutorial to point to player-settings page, as well as removing instructions for manual install
* Minecraft client: add Minecraft version check
Adds a minecraft_version field in the apmc, and downloads only mods which contain that version in the name of the .jar file.
This ensures that the client remains compatible even if new mods are released for later versions, since they won't download a mod for a later version than the apmc says.
Co-authored-by: Kono Tyran <Kono.Tyran@gmail.com>
											 
										 
										
											2021-11-30 20:37:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								def  run_forge_server ( forge_dir :  str ,  heap_arg ) :  
						 
					
						
							
								
									
										
										
										
											2021-08-08 13:31:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												MC: 1.17 support (#120)
* MC: add death_link option
* Minecraft: 1.17 advancements and logic support
* Update Minecraft tracker to 1.17
* Minecraft: add tests for new advancements
* removed jdk/forge download install out of iss and into MinecraftClient.py using flag --install
* Add required_bosses option
choices are none, ender_dragon, wither, both
postgame advancements are set according to the required boss for completion
* fix docstring for PostgameAdvancements
* Minecraft: add starting_items
List of dicts: item, amount, nbt
* Update descriptions for AdvancementGoal and EggShardsRequired
* Minecraft: fix tests for required_bosses attribute
* Minecraft: updated logic for various dragon-related advancements
Split the logic into can_respawn and can_kill dragon
Free the End, Monsters Hunted, The End Again still require both respawn and kill, since the player needs to kill and be credited with the kill
You Need a Mint and Is It a Plane now require only respawn, since the dragon need only be alive; if killed out of logic, it's ok
The Next Generation only requires kill, since the egg spawns regardless of whether the player was credited with the kill or not
* Minecraft client: ignore prereleases unless --prerelease flag is on
* explicitly state all defaults
change structure shuffle and structure compass defaults to true
update install tutorial to point to player-settings page, as well as removing instructions for manual install
* Minecraft client: add Minecraft version check
Adds a minecraft_version field in the apmc, and downloads only mods which contain that version in the name of the .jar file.
This ensures that the client remains compatible even if new mods are released for later versions, since they won't download a mod for a later version than the apmc says.
Co-authored-by: Kono Tyran <Kono.Tyran@gmail.com>
											 
										 
										
											2021-11-30 20:37:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    java_exe  =  find_jdk ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:26:46 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  not  os . path . isfile ( java_exe ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        java_exe  =  " java "   # try to fall back on java in the PATH 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    heap_arg  =  max_heap_re . match ( max_heap ) . group ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  heap_arg [ - 1 ]  in  [ ' b ' ,  ' B ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        heap_arg  =  heap_arg [ : - 1 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    heap_arg  =  " -Xmx "  +  heap_arg 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												MC: 1.17 support (#120)
* MC: add death_link option
* Minecraft: 1.17 advancements and logic support
* Update Minecraft tracker to 1.17
* Minecraft: add tests for new advancements
* removed jdk/forge download install out of iss and into MinecraftClient.py using flag --install
* Add required_bosses option
choices are none, ender_dragon, wither, both
postgame advancements are set according to the required boss for completion
* fix docstring for PostgameAdvancements
* Minecraft: add starting_items
List of dicts: item, amount, nbt
* Update descriptions for AdvancementGoal and EggShardsRequired
* Minecraft: fix tests for required_bosses attribute
* Minecraft: updated logic for various dragon-related advancements
Split the logic into can_respawn and can_kill dragon
Free the End, Monsters Hunted, The End Again still require both respawn and kill, since the player needs to kill and be credited with the kill
You Need a Mint and Is It a Plane now require only respawn, since the dragon need only be alive; if killed out of logic, it's ok
The Next Generation only requires kill, since the egg spawns regardless of whether the player was credited with the kill or not
* Minecraft client: ignore prereleases unless --prerelease flag is on
* explicitly state all defaults
change structure shuffle and structure compass defaults to true
update install tutorial to point to player-settings page, as well as removing instructions for manual install
* Minecraft client: add Minecraft version check
Adds a minecraft_version field in the apmc, and downloads only mods which contain that version in the name of the .jar file.
This ensures that the client remains compatible even if new mods are released for later versions, since they won't download a mod for a later version than the apmc says.
Co-authored-by: Kono Tyran <Kono.Tyran@gmail.com>
											 
										 
										
											2021-11-30 20:37:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    args_file  =  os . path . join ( forge_dir ,  " libraries " ,  " net " ,  " minecraftforge " ,  " forge " ,  forge_version ,  " win_args.txt " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    win_args  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    with  open ( args_file )  as  argfile : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  line  in  argfile : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            win_args . append ( line . strip ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    argstring  =  '   ' . join ( [ java_exe ,  heap_arg ]  +  win_args  +  [ " -nogui " ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 15:35:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    logging . info ( f " Running Forge server:  { argstring } " ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:26:46 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    os . chdir ( forge_dir ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  Popen ( argstring ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								if  __name__  ==  ' __main__ ' :  
						 
					
						
							
								
									
										
										
										
											2021-11-10 15:35:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    Utils . init_logging ( " MinecraftClient " ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    parser  =  argparse . ArgumentParser ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 12:07:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    parser . add_argument ( " apmc_file " ,  default = None ,  nargs = ' ? ' ,  help = " Path to an Archipelago Minecraft data file (.apmc) " ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												MC: 1.17 support (#120)
* MC: add death_link option
* Minecraft: 1.17 advancements and logic support
* Update Minecraft tracker to 1.17
* Minecraft: add tests for new advancements
* removed jdk/forge download install out of iss and into MinecraftClient.py using flag --install
* Add required_bosses option
choices are none, ender_dragon, wither, both
postgame advancements are set according to the required boss for completion
* fix docstring for PostgameAdvancements
* Minecraft: add starting_items
List of dicts: item, amount, nbt
* Update descriptions for AdvancementGoal and EggShardsRequired
* Minecraft: fix tests for required_bosses attribute
* Minecraft: updated logic for various dragon-related advancements
Split the logic into can_respawn and can_kill dragon
Free the End, Monsters Hunted, The End Again still require both respawn and kill, since the player needs to kill and be credited with the kill
You Need a Mint and Is It a Plane now require only respawn, since the dragon need only be alive; if killed out of logic, it's ok
The Next Generation only requires kill, since the egg spawns regardless of whether the player was credited with the kill or not
* Minecraft client: ignore prereleases unless --prerelease flag is on
* explicitly state all defaults
change structure shuffle and structure compass defaults to true
update install tutorial to point to player-settings page, as well as removing instructions for manual install
* Minecraft client: add Minecraft version check
Adds a minecraft_version field in the apmc, and downloads only mods which contain that version in the name of the .jar file.
This ensures that the client remains compatible even if new mods are released for later versions, since they won't download a mod for a later version than the apmc says.
Co-authored-by: Kono Tyran <Kono.Tyran@gmail.com>
											 
										 
										
											2021-11-30 20:37:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    parser . add_argument ( ' --install ' ,  ' -i ' ,  dest = ' install ' ,  default = False ,  action = ' store_true ' ,  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        help = " Download and install Java and the Forge server. Does not launch the client afterwards. " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    parser . add_argument ( ' --prerelease ' ,  default = False ,  action = ' store_true ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        help = " Auto-update prerelease versions. " ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    args  =  parser . parse_args ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-23 12:13:07 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    apmc_file  =  os . path . abspath ( args . apmc_file )  if  args . apmc_file  else  None 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 14:19:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # Change to executable's working directory 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    os . chdir ( os . path . abspath ( os . path . dirname ( sys . argv [ 0 ] ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-15 06:13:58 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    options  =  Utils . get_options ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    forge_dir  =  options [ " minecraft_options " ] [ " forge_directory " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    max_heap  =  options [ " minecraft_options " ] [ " max_heap_size " ] 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 14:19:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												MC: 1.17 support (#120)
* MC: add death_link option
* Minecraft: 1.17 advancements and logic support
* Update Minecraft tracker to 1.17
* Minecraft: add tests for new advancements
* removed jdk/forge download install out of iss and into MinecraftClient.py using flag --install
* Add required_bosses option
choices are none, ender_dragon, wither, both
postgame advancements are set according to the required boss for completion
* fix docstring for PostgameAdvancements
* Minecraft: add starting_items
List of dicts: item, amount, nbt
* Update descriptions for AdvancementGoal and EggShardsRequired
* Minecraft: fix tests for required_bosses attribute
* Minecraft: updated logic for various dragon-related advancements
Split the logic into can_respawn and can_kill dragon
Free the End, Monsters Hunted, The End Again still require both respawn and kill, since the player needs to kill and be credited with the kill
You Need a Mint and Is It a Plane now require only respawn, since the dragon need only be alive; if killed out of logic, it's ok
The Next Generation only requires kill, since the egg spawns regardless of whether the player was credited with the kill or not
* Minecraft client: ignore prereleases unless --prerelease flag is on
* explicitly state all defaults
change structure shuffle and structure compass defaults to true
update install tutorial to point to player-settings page, as well as removing instructions for manual install
* Minecraft client: add Minecraft version check
Adds a minecraft_version field in the apmc, and downloads only mods which contain that version in the name of the .jar file.
This ensures that the client remains compatible even if new mods are released for later versions, since they won't download a mod for a later version than the apmc says.
Co-authored-by: Kono Tyran <Kono.Tyran@gmail.com>
											 
										 
										
											2021-11-30 20:37:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  args . install : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print ( " Installing Java and Minecraft Forge " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        download_java ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        install_forge ( forge_dir ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sys . exit ( 0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  apmc_file  is  not  None  and  not  os . path . isfile ( apmc_file ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  FileNotFoundError ( f " Path  { apmc_file }  does not exist or could not be accessed. " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  not  os . path . isdir ( forge_dir ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  NotADirectoryError ( f " Path  { forge_dir }  does not exist or could not be accessed. " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  not  max_heap_re . match ( max_heap ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  Exception ( f " Max heap size  { max_heap }  in incorrect format. Use a number followed by M or G, e.g. 512M or 2G. " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												MC: 1.17 support (#120)
* MC: add death_link option
* Minecraft: 1.17 advancements and logic support
* Update Minecraft tracker to 1.17
* Minecraft: add tests for new advancements
* removed jdk/forge download install out of iss and into MinecraftClient.py using flag --install
* Add required_bosses option
choices are none, ender_dragon, wither, both
postgame advancements are set according to the required boss for completion
* fix docstring for PostgameAdvancements
* Minecraft: add starting_items
List of dicts: item, amount, nbt
* Update descriptions for AdvancementGoal and EggShardsRequired
* Minecraft: fix tests for required_bosses attribute
* Minecraft: updated logic for various dragon-related advancements
Split the logic into can_respawn and can_kill dragon
Free the End, Monsters Hunted, The End Again still require both respawn and kill, since the player needs to kill and be credited with the kill
You Need a Mint and Is It a Plane now require only respawn, since the dragon need only be alive; if killed out of logic, it's ok
The Next Generation only requires kill, since the egg spawns regardless of whether the player was credited with the kill or not
* Minecraft client: ignore prereleases unless --prerelease flag is on
* explicitly state all defaults
change structure shuffle and structure compass defaults to true
update install tutorial to point to player-settings page, as well as removing instructions for manual install
* Minecraft client: add Minecraft version check
Adds a minecraft_version field in the apmc, and downloads only mods which contain that version in the name of the .jar file.
This ensures that the client remains compatible even if new mods are released for later versions, since they won't download a mod for a later version than the apmc says.
Co-authored-by: Kono Tyran <Kono.Tyran@gmail.com>
											 
										 
										
											2021-11-30 20:37:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    update_mod ( forge_dir ,  apmc_file ,  args . prerelease ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    replace_apmc_files ( forge_dir ,  apmc_file ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 15:36:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    check_eula ( forge_dir ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 13:31:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    server_process  =  run_forge_server ( forge_dir ,  max_heap ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 11:57:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    server_process . wait ( )