diff --git a/WebHostLib/static/assets/tutorial/minecraft/minecraft_en.md b/WebHostLib/static/assets/tutorial/minecraft/minecraft_en.md index 2ff53fb1..5cb7ef82 100644 --- a/WebHostLib/static/assets/tutorial/minecraft/minecraft_en.md +++ b/WebHostLib/static/assets/tutorial/minecraft/minecraft_en.md @@ -1,54 +1,12 @@ # Minecraft Randomizer Setup Guide +#Automatic Hosting Install +- download and install [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) and choose the `Minecraft Client` module + ## Required Software -### Server Host -- [Minecraft Forge](https://files.minecraftforge.net/net/minecraftforge/forge/index_1.16.5.html) -- [Minecraft Archipelago Randomizer Mod](https://github.com/KonoTyran/Minecraft_AP_Randomizer/releases) - -### Players - [Minecraft Java Edition](https://www.minecraft.net/en-us/store/minecraft-java-edition) -## Installation Procedures - -### Dedicated Server Setup -Only one person has to do this setup and host a dedicated server for everyone else playing to connect to. -1. Download the 1.16.5 **Minecraft Forge** installer from the link above, making sure to download the most recent recommended version. - -2. Run the `forge-1.16.5-xx.x.x-installer.jar` file and choose **install server**. - - On this page you will also choose where to install the server to remember this directory it's important in the next step. - -3. Navigate to where you installed the server and open `forge-1.16.5-xx.x.x.jar` - - Upon first launch of the server it will close and ask you to accept Minecraft's EULA. There will be a new file called `eula.txt` that contains a link to Minecraft's EULA, and a line that you need to change to `eula=true` to accept Minecraft's EULA. - - This will create the appropriate directories for you to place the files in the following step. - -4. Place the `aprandomizer-x.x.x.jar` from the link above file into the `mods` folder of the above installation of your forge server. - - Once again run the server, it will load up and generate the required directory `APData` for when you are ready to play a game! - -### Basic Player Setup -- Purchase and install Minecraft from the above link. - - **You're Done**. - - Players only need to have a Vanilla unmodified version of Minecraft to play! - -### Advanced Player Setup -***This is not required to play a randomized minecraft game.*** -however this recommended as it helps make the experience more enjoyable. - -#### Recomended Mods -- [JourneyMap](https://www.curseforge.com/minecraft/mc-mods/journeymap) (Minimap) - - -1. Install and run Minecraft from the link above at least once. -2. Run the `forge-1.16.5-xx.x.x-installer.jar` file and choose **install client**. - - Start Minecraft forge at least once to create the directories needed for the next steps. -3. Navigate to your minecraft install directory and place desired mods `.jar` file the in the `mods` directory. - - The default install directories are as follows. - - Windows `%APPDATA%\.minecraft\mods` - - macOS `~/Library/Application Support/minecraft/mods` - - Linux `~/.minecraft/mods` - ## Configuring your YAML file ### What is a YAML file and why do I need one? @@ -60,10 +18,10 @@ can all have different options. ### Where do I get a YAML file? A basic minecraft yaml will look like this. ```yaml -description: Template Name +description: Basic Minecraft Yaml # Your name in-game. Spaces will be replaced with underscores and # there is a 16 character limit -name: YourName +name: YourName game: Minecraft # Shared Options supported by all games: @@ -71,44 +29,61 @@ accessibility: locations progression_balancing: on # Minecraft Specific Options -# Number of advancements required (out of 92 total) to spawn the -# Ender Dragon and complete the game. -advancement_goal: - few: 0 #30 - normal: 1 #50 - many: 0 #70 +Minecraft: + # Number of advancements required (87 max) to spawn the Ender Dragon and complete the game. + advancement_goal: 50 -# Modifies the level of items logically required for exploring -# dangerous areas and fighting bosses. -combat_difficulty: - easy: 0 - normal: 1 - hard: 0 + # Number of dragon egg shards to collect (30 max) before the Ender Dragon will spawn. + egg_shards_required: 10 -# Junk-fills certain RNG-reliant or tedious advancements with XP rewards. -include_hard_advancements: - on: 0 - off: 1 + # Number of egg shards available in the pool (30 max). + egg_shards_available: 15 -# Junk-fills extremely difficult advancements; -# this is only How Did We Get Here? and Adventuring Time. -include_insane_advancements: - on: 0 - off: 1 + # Modifies the level of items logically required for + # exploring dangerous areas and fighting bosses. + combat_difficulty: + easy: 0 + normal: 1 + hard: 0 + + # Junk-fills certain RNG-reliant or tedious advancements. + include_hard_advancements: + on: 0 + off: 1 + + # Junk-fills extremely difficult advancements; + # this is only How Did We Get Here? and Adventuring Time. + include_insane_advancements: + on: 0 + off: 1 -# Some advancements require defeating the Ender Dragon; -# this will junk-fill them so you won't have to finish to send some items. -include_postgame_advancements: - on: 0 - off: 1 + # Some advancements require defeating the Ender Dragon; + # this will junk-fill them, so you won't have to finish them to send some items. + include_postgame_advancements: + on: 0 + off: 1 + + # Enables shuffling of villages, outposts, fortresses, bastions, and end cities. + shuffle_structures: + on: 0 + off: 1 -#enables shuffling of villages, outposts, fortresses, bastions, and end cities. -shuffle_structures: - on: 1 - off: 0 + # Adds structure compasses to the item pool, + # which point to the nearest indicated structure. + structure_compasses: + on: 0 + off: 1 + + # Replaces a percentage of junk items with bee traps + # which spawn multiple angered bees around every player when received. + bee_traps: + 0: 1 + 25: 0 + 50: 0 + 75: 0 + 100: 0 ``` - ## Joining a MultiWorld Game ### Obtain your Minecraft data file @@ -118,8 +93,7 @@ When you join a multiworld game, you will be asked to provide your YAML file to is done, the host will provide you with either a link to download your data file, or with a zip file containing everyone's data files. Your data file should have a `.apmc` extension. -Put your data file in your forge servers `APData` folder. Make sure to remove any previous data file that was in there -previously. +double click on your `.apmc` file to have the minecraft client auto-launch the installed forge server. ### Connect to the MultiServer After having placed your data file in the `APData` folder, start the Forge server and make sure you have OP @@ -134,3 +108,23 @@ When the console tells you that you have joined the room, you're ready to begin on successfully joining a multiworld game! At this point any additional minecraft players may connect to your forge server. + +## Manual Installation Procedures +this is only required if you wish to set up a forge install yourself, its recommended to just use the Archipelago Installer. +###Required Software +- [Minecraft Forge](https://files.minecraftforge.net/net/minecraftforge/forge/index_1.16.5.html) +- [Minecraft Archipelago Randomizer Mod](https://github.com/KonoTyran/Minecraft_AP_Randomizer/releases) +**DO NOT INSTALL THIS ON YOUR CLIENT** +### Dedicated Server Setup +Only one person has to do this setup and host a dedicated server for everyone else playing to connect to. +1. Download the 1.16.5 **Minecraft Forge** installer from the link above, making sure to download the most recent recommended version. + +2. Run the `forge-1.16.5-xx.x.x-installer.jar` file and choose **install server**. + - On this page you will also choose where to install the server to remember this directory it's important in the next step. + +3. Navigate to where you installed the server and open `forge-1.16.5-xx.x.x.jar` + - Upon first launch of the server it will close and ask you to accept Minecraft's EULA. There will be a new file called `eula.txt` that contains a link to Minecraft's EULA, and a line that you need to change to `eula=true` to accept Minecraft's EULA. + - This will create the appropriate directories for you to place the files in the following step. + +4. Place the `aprandomizer-x.x.x.jar` from the link above file into the `mods` folder of the above installation of your forge server. + - Once again run the server, it will load up and generate the required directory `APData` for when you are ready to play a game! diff --git a/inno_setup_38.iss b/inno_setup_38.iss index e1512178..6b059033 100644 --- a/inno_setup_38.iss +++ b/inno_setup_38.iss @@ -29,7 +29,7 @@ ArchitecturesAllowed=x64 AllowNoIcons=yes SetupIconFile={#MyAppIcon} UninstallDisplayIcon={app}\{#MyAppExeName} -; you will likely have to remove the following signtool line when testing/debugging localy. Don't include that change in PRs. +; you will likely have to remove the following signtool line when testing/debugging localy. Don't include that change in PRs. SignTool= signtool LicenseFile= LICENSE WizardStyle= modern @@ -54,6 +54,7 @@ Name: "server"; Description: "Server"; Types: full hosting Name: "client"; Description: "Clients"; Types: full playing Name: "client/lttp"; Description: "A Link to the Past"; Types: full playing hosting Name: "client/factorio"; Description: "Factorio"; Types: full playing +Name: "client/minecraft"; Description: "Minecraft"; Types: full playing; ExtraDiskSpaceRequired: 226894278 [Dirs] NAME: "{app}"; Flags: setntfscompression; Permissions: everyone-modify users-modify authusers-modify; @@ -69,13 +70,18 @@ Source: "{#sourcepath}\ArchipelagoServer.exe"; DestDir: "{app}"; Flags: ignoreve Source: "{#sourcepath}\ArchipelagoFactorioClient.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: client/factorio Source: "{#sourcepath}\ArchipelagoLttPClient.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: client/lttp Source: "{#sourcepath}\ArchipelagoLttPAdjuster.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: client/lttp +Source: "{#sourcepath}\ArchipelagoMinecraftClient.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: client/minecraft Source: "vc_redist.x64.exe"; DestDir: {tmp}; Flags: deleteafterinstall +;minecraft temp files +Source: "{tmp}\forge-installer.jar"; DestDir: "{app}"; Flags: skipifsourcedoesntexist external deleteafterinstall; Components: client/minecraft + [Icons] Name: "{group}\{#MyAppName} Folder"; Filename: "{app}"; Name: "{group}\{#MyAppName} Server"; Filename: "{app}\{#MyAppExeName}"; Components: server Name: "{group}\{#MyAppName} LttP Client"; Filename: "{app}\ArchipelagoLttPClient.exe"; Components: client/lttp Name: "{group}\{#MyAppName} Factorio Client"; Filename: "{app}\ArchipelagoFactorioClient.exe"; Components: client/factorio +Name: "{group}\{#MyAppName} Minecraft Client"; Filename: "{app}\ArchipelagoMinecraftClient.exe"; Components: client/minecraft Name: "{commondesktop}\{#MyAppName} Folder"; Filename: "{app}"; Tasks: desktopicon Name: "{commondesktop}\{#MyAppName} Server"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon; Components: server Name: "{commondesktop}\{#MyAppName} LttP Client"; Filename: "{app}\ArchipelagoLttPClient.exe"; Tasks: desktopicon; Components: client/lttp @@ -85,6 +91,7 @@ Name: "{commondesktop}\{#MyAppName} Factorio Client"; Filename: "{app}\Archipela Filename: "{tmp}\vc_redist.x64.exe"; Parameters: "/passive /norestart"; Check: IsVCRedist64BitNeeded; StatusMsg: "Installing VC++ redistributable..." Filename: "{app}\ArchipelagoLttPAdjuster"; Parameters: "--update_sprites"; StatusMsg: "Updating Sprite Library..."; Components: client/lttp or generator +Filename: "{app}\jre8\bin\java.exe"; Parameters: "-jar ""{app}\forge-installer.jar"" --installServer ""{app}\Minecraft Forge server"""; Flags: runhidden; Check: IsForgeNeeded(); StatusMsg: "Installing Forge Server..."; Components: client/minecraft [UninstallDelete] Type: dirifempty; Name: "{app}" @@ -96,6 +103,11 @@ Root: HKCR; Subkey: "{#MyAppName}patch"; ValueData: "Archipe Root: HKCR; Subkey: "{#MyAppName}patch\DefaultIcon"; ValueData: "{app}\ArchipelagoLttPClient.exe,0"; ValueType: string; ValueName: ""; Components: client/lttp Root: HKCR; Subkey: "{#MyAppName}patch\shell\open\command"; ValueData: """{app}\ArchipelagoLttPClient.exe"" ""%1"""; ValueType: string; ValueName: ""; Components: client/lttp +Root: HKCR; Subkey: ".apmc"; ValueData: "{#MyAppName}mcdata"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""; Components: client/minecraft +Root: HKCR; Subkey: "{#MyAppName}mcdata"; ValueData: "Archipelago Minecraft Data"; Flags: uninsdeletekey; ValueType: string; ValueName: ""; Components: client/minecraft +Root: HKCR; Subkey: "{#MyAppName}mcdata\DefaultIcon"; ValueData: "{app}\ArchipelagoMinecraftClient.exe,0"; ValueType: string; ValueName: ""; Components: client/minecraft +Root: HKCR; Subkey: "{#MyAppName}mcdata\shell\open\command"; ValueData: """{app}\ArchipelagoMinecraftClient.exe"" ""%1"""; ValueType: string; ValueName: ""; Components: client/minecraft + Root: HKCR; Subkey: ".archipelago"; ValueData: "{#MyAppName}multidata"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""; Components: server Root: HKCR; Subkey: "{#MyAppName}multidata"; ValueData: "Archipelago Server Data"; Flags: uninsdeletekey; ValueType: string; ValueName: ""; Components: server Root: HKCR; Subkey: "{#MyAppName}multidata\DefaultIcon"; ValueData: "{app}\ArchipelagoServer.exe,0"; ValueType: string; ValueName: ""; Components: server @@ -104,6 +116,11 @@ Root: HKCR; Subkey: "{#MyAppName}multidata\shell\open\command"; ValueData: """{ [Code] +const + SHCONTCH_NOPROGRESSBOX = 4; + SHCONTCH_RESPONDYESTOALL = 16; + FORGE_VERSION = '1.16.5-36.2.0'; + // See: https://stackoverflow.com/a/51614652/2287576 function IsVCRedist64BitNeeded(): boolean; var @@ -124,9 +141,52 @@ begin end; end; +function IsForgeNeeded(): boolean; +begin + Result := True; + if (FileExists(ExpandConstant('{app}')+'\Minecraft Forge Server\forge-'+FORGE_VERSION+'.jar')) then + Result := False; +end; + +function IsJavaNeeded(): boolean; +begin + Result := True; + if (FileExists(ExpandConstant('{app}')+'\jre8\bin\java.exe')) then + Result := False; +end; + +function OnDownloadMinecraftProgress(const Url, FileName: String; const Progress, ProgressMax: Int64): Boolean; +begin + if Progress = ProgressMax then + Log(Format('Successfully downloaded Minecraft additional files to {tmp}: %s', [FileName])); + Result := True; +end; + +procedure UnZip(ZipPath, TargetPath: string); +var + Shell: Variant; + ZipFile: Variant; + TargetFolder: Variant; +begin + Shell := CreateOleObject('Shell.Application'); + + ZipFile := Shell.NameSpace(ZipPath); + if VarIsClear(ZipFile) then + RaiseException( + Format('ZIP file "%s" does not exist or cannot be opened', [ZipPath])); + + TargetFolder := Shell.NameSpace(TargetPath); + if VarIsClear(TargetFolder) then + RaiseException(Format('Target path "%s" does not exist', [TargetPath])); + + TargetFolder.CopyHere( + ZipFile.Items, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL); +end; + var ROMFilePage: TInputFileWizardPage; var R : longint; var rom: string; +var MinecraftDownloadPage: TDownloadWizardPage; procedure AddRomPage(); begin @@ -151,14 +211,50 @@ begin 'Select the file, then click Next.'); ROMFilePage.Add( - 'Location of ROM file:', - 'SNES ROM files|*.sfc|All files|*.*', - '.sfc'); + 'Location of ROM file:', + 'SNES ROM files|*.sfc|All files|*.*', + '.sfc'); +end; + +procedure AddMinecraftDownloads(); +begin + MinecraftDownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), @OnDownloadMinecraftProgress); +end; + +function NextButtonClick(CurPageID: Integer): Boolean; +begin + if (CurPageID = wpReady) and (WizardIsComponentSelected('client/minecraft')) then begin + MinecraftDownloadPage.Clear; + if(IsForgeNeeded()) then + MinecraftDownloadPage.Add('https://maven.minecraftforge.net/net/minecraftforge/forge/'+FORGE_VERSION+'/forge-'+FORGE_VERSION+'-installer.jar','forge-installer.jar',''); + if(IsJavaNeedeD()) then + MinecraftDownloadPage.Add('https://corretto.aws/downloads/latest/amazon-corretto-8-x64-windows-jre.zip','java.zip',''); + MinecraftDownloadPage.Show; + try + try + MinecraftDownloadPage.Download; + Result := True; + except + if MinecraftDownloadPage.AbortedByUser then + Log('Aborted by user.') + else + SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbCriticalError, MB_OK, IDOK); + Result := False; + end; + finally + if( isJavaNeeded() ) then + UnZip(ExpandConstant('{tmp}')+'\java.zip',ExpandConstant('{app}')); + MinecraftDownloadPage.Hide; + end; + Result := True; + end else + Result := True; end; procedure InitializeWizard(); begin - AddRomPage(); + AddRomPage(); + AddMinecraftDownloads(); end; diff --git a/setup.py b/setup.py index 01658a5a..ff67c350 100644 --- a/setup.py +++ b/setup.py @@ -78,6 +78,8 @@ scripts = { "LttPAdjuster.py": ("ArchipelagoLttPAdjuster", True), # Factorio "FactorioClient.py": ("ArchipelagoFactorioClient", True), + # Minecraft + "MinecraftClient.py": ("ArchipelagoMinecraftClient", False), } exes = []