#!/bin/bash if [ "$#" -ne 3 ]; then echo "Usage: $0 <fabric/forge> <minecraft_version> <loader_version>" echo "Example: $0 fabric 1.20.1 0.15.10" exit 1 fi SHELL=/data/data/com.termux/files/usr/bin/bash echo "This script should only be run in termux" read -n1 -r -p "Press any key to continue..." clear pkg install jq wget curl -y iferror() { if [ "$?" -ne 0 ]; then echo "Something went wrong, log saved to ~/.cache/vs2server.log" exit 1 fi } start_script_fabric() { JAVA_HOME=$HOME/vs2server/runtimes/jdk* echo "JAVA_HOME=$HOME/vs2server/runtimes/jdk* SHELL=/data/data/com.termux/files/usr/bin/bash grun -s $JAVA_HOME/bin/java -Djava.library.path=$JAVA_HOME/lib -Xmx2G -jar $HOME/vs2server/instances/jar" > "$HOME"/vs2server/instances/start.sh } start_script_forge(){ JAVA_HOME=$HOME/vs2server/runtimes/jdk* echo "#!/usr/bin/env sh # Forge requires a configured set of both JVM and program argume#!/usr/bin/env sh # Forge requires a configured set of both JVM and program arguments. # Add custom JVM arguments to the user_jvm_args.txt # Add custom program arguments {such as nogui} to this file in the next line before the "$@" or # pass them to this script directly grun -s JAVA_HOME=$HOME/vs2server/runtimes/jdk* $HOME/vs2server/runtimes/jdk*/bin/java @user_jvm_args.txt @libraries/net/minecraftforge/forge/"$1"-"$2"/unix_args.txt nogui"$@"" > "$HOME"/vs2server/instances/start.sh echo "# Xmx and Xms set the maximum and minimum RAM usage, respectively. # They can take any number, followed by an M or a G. # M means Megabyte, G means Gigabyte. # For example, to set the maximum to 3GB: -Xmx3G # To set the minimum to 2.5GB: -Xms2500M # A good default for a modded server is 4GB. # Uncomment the next line to set it. -Xmx2G -Djava.library.path=$HOME/vs2server/runtimes/jdk*" > "$HOME"/vs2server/instances/user_jvm_args.txt } remove_mods(){ cat << 'EOF' > remove_mods.sh #!/bin/bash name=$1 if [ -n "$name" ]; then cd "$HOME/vs2server/instances/mods" || exit if [ -e "$name" ]; then rm "$name" exit else echo "File '$name' does not exist." exit fi else while true; do clear cd "$HOME/vs2server/instances/mods" || exit ls echo "Enter the name of the file you want to delete (or type 'return' to return): " read -r name if [ "$name" = "return" ]; then echo "Exiting script..." break elif [ -e "$name" ]; then echo "Are you sure that you want to delete '$name'? [Y/n]" read -r dc case "$(echo "$dc" | tr '[:upper:]' '[:lower:]')" in [yY]) rm "$name" echo "File '$name' deleted." ;; *) echo "Cancelled." sleep 1 ;; esac elif [ -n "$(ls | grep "$name")" ]; then # Autocomplete based on partial match autocomplete=$(ls | grep "$name" | head -n 1) echo "Are you sure that you want to delete '$autocomplete'? [Y/n]" read -r dc case "$(echo "$dc" | tr '[:upper:]' '[:lower:]')" in [yY]) rm "$autocomplete" echo "File '$autocomplete' deleted." ;; *) echo "Cancelled." sleep 1 ;; esac else echo "File '$name' does not exist. Please try again." sleep 3 fi done fi EOF } install_temurin_jdk() { version=$1 #package=$2 arch=$(uname -m) os=$(uname | tr '[:upper:]' '[:lower:]') echo "Downloading Temurin $package $version for $os $arch" wget -P "$HOME"/vs2server/runtimes/ https://api.adoptium.net/v3/binary/latest/$version/ga/$os/$arch/jre/hotspot/normal/eclipse iferror echo "Extracting..." tar -xzf $HOME/vs2server/runtimes/eclipse -C "$HOME"/vs2server/runtimes/ rm $HOME/vs2server/runtimes/eclipse } check_dep() { if [ "$#" -ne 3 ]; then echo "invalid arguments" exit 1 fi loader=$1 version=$2 name=$3 url="https://api.modrinth.com/v2/project/"$name"/version?loaders=\[%22"$loader"%22\]&game_versions=\[%22"$version"%22\]" while true; do url="https://api.modrinth.com/v2/project/"$name"/version?loaders=\[%22"$loader"%22\]&game_versions=\[%22"$version"%22\]" command='jq -r ".[0].dependencies[] | select(.dependency_type == \"required\") | .project_id"' dependencies=$(curl -s "$url" | eval "$command") if [ -n "$dependencies" ]; then for dep_id in $dependencies; do install_mod "$loader" "$version" "$dep_id" done else break fi done } install_mod() { if [ "$#" -ne 3 ]; then echo "invalid arguments" exit 1 fi loader=$1 version=$2 name=$3 url="https://api.modrinth.com/v2/project/"$name"/version?loaders=\[%22"$loader"%22\]&game_versions=\[%22"$version"%22\]" dlink=$(curl -s "$url" | jq -r '.[0].files[0].url') fname=$(curl -s "$url" | jq -r '.[0].files[0].filename') if [ ! -d "$HOME/vs2server/instances/mods" ]; then mkdir -p "$HOME/vs2server/instances/mods" fi if [ -f "$HOME/vs2server/instances/mods/$fname" ]; then echo "Mod $fname already downloaded" else wget -P "$HOME/vs2server/instances/mods" "$dlink" fi check_dep "$loader" "$version" "$name" } # ------------------------------------------------------------------------- # echo "Installing needed termux packages" pkg update -y pkg upgrade -y pkg install glibc-repo -y pkg install glibc-runner patchelf-glibc coreutils-glibc tar coreutils patchelf procps -y #Check the code on 6gb phone if [ "$(free --giga | awk '/Mem:/ {print $2}')" -le 4 ]; then echo "Your phone stinks, it might die if you continue with $(free --giga | awk '/Mem:/ {print $2}')GB of useable RAM. Continue? [Y/n]" read -r dc case "$(echo "$dc" | tr '[:upper:]' '[:lower:]')" in [yY]) echo "Okay sure but don't blame me if sonething went wrong" ;; *) echo "Your phone thanks you in your infinite wisdom" exit 1 ;; esac fi # ------------------------------------------------------------------------- # ( echo Installing Minecraft "$2" "$1"-"$3" if [ "$1" = "forge" ]; then if command -v java >/dev/null 2>&1; then echo "java is already installed" else pkg install openjdk-17 fi fi if [ -d "$HOME"/vs2server/runtimes ]; then echo "Another runtime already exists. Do you want to overwrite it with a new one?. [Y/n]" read -r dc case "$(echo "$dc" | tr '[:upper:]' '[:lower:]')" in [yY]) echo "Deleting runtimes folder" rm -rf "$HOME"/vs2server/runtimes/jdk* install_temurin_jdk 21 ;; *) echo "Cancelled." ;; esac elif [ ! -d "$HOME"/vs2server/runtimes ]; then mkdir -p "$HOME"/vs2server/runtimes/ install_temurin_jdk 21 fi cd "$HOME"/vs2server/runtimes/jdk*/lib || exit iferror grun -c -f ../bin/java iferror install=true if [ -d "$HOME"/vs2server/instances ]; then echo "Another instance already exists. Proceeding will overwrite it which will delete all worlds, configs, and mods. Continue? [Y/n] " read -r dc case "$(echo "$dc" | tr '[:upper:]' '[:lower:]')" in [yY]) echo "Deleting vs2server folder" rm -rf "$HOME"/vs2server/instances ;; *) echo "Cancelled." install=false ;; esac fi if [ ! -d "$HOME"/vs2server/instances ]; then mkdir -p "$HOME"/vs2server/instances fi cd "$HOME"/vs2server/instances if [ "$install" = "true" ]; then case $1 in fabric ) wget -P "$HOME"/vs2server/instances https://meta.fabricmc.net/v2/versions/loader/"$2"/"$3"/1.0.0/server/jar iferror jarfile=fabric-server-mc."$2"-loader."$3"-launcher.1.0.0 grun -s JAVA_HOME=$HOME/vs2server/runtimes/jdk* $HOME/vs2server/runtimes/jdk*/bin/java -Djava.library.path=$HOME/vs2server/runtimes/jdk* -jar $HOME/vs2server/instances/jar nogui start_script_fabric echo "eula=true" > $HOME/vs2server/instances/eula.txt ;; forge ) wget -P "$HOME"/vs2server/instances https://maven.minecraftforge.net/net/minecraftforge/forge/"$2"-"$3"/forge-"$2"-"$3"-installer.jar iferror jarfile=forge-"$2"-"$3"-installer java -jar $HOME/vs2server/instances/forge-"$2"-"$3"-installer.jar --installServer rm run.sh start_script_forge $2 $3 echo "eula=true" > $HOME/vs2server/instances/eula.txt ;; * ) echo "Invalid Mod Loader, use fabric or forge" ;; esac fi read -p "Do you want to install Valkyrian Skies, Clockwork and Eureka? [Y/n] " dc case "$(echo "$dc" | tr '[:upper:]' '[:lower:]')" in [yY]) install_mod "$1" "$2" "eureka" install_mod "$1" "$2" "create-clockwork" ;; esac cd "$HOME"/vs2server/instances/ pwd=$(pwd) echo "server files are located in "$pwd"" cd ~/ if [ ! -f "~/start.sh" ]; then read -p "Do you want to make a start script in your home directory? [Y/n] " dc case "$(echo "$dc" | tr '[:upper:]' '[:lower:]')" in [yY]) echo "cd "$HOME"/vs2server/instances/ sh start.sh" > start.sh echo "To run the server, run 'sh start.sh'" ;; *) echo "To run the server, go to "$pwd" and run 'sh start.sh'" esac fi if [ ! -f "~/import_mods.sh" ]; then echo "cp -r ~/storage/shared/vs2termux/import_mods/mods "$HOME"/vs2server/instances/" > import_mods.sh fi if [ ! -f "~/export_mods.sh" ]; then echo "cp -r "$HOME"/vs2server/instances/mods "$HOME"/storage/shared/vs2termux/exported_mods/" > export_mods.sh fi if [ ! -f "~/remove_mods.sh" ]; then remove_mods fi if [ ! -f "~/unistall.sh" ]; then echo "rm -rf ~/storage/shared/vs2termux rm -rf ~/vs2server rm ~/remove_mods.sh rm ~/import_mods.sh rm ~/export_mods.sh rm ~/start.sh rm ~/vs2server.sh rm ~/unistall.sh" > ~/unistall.sh fi if [ ! -d "$HOME"/storage/shared ]; then termux-setup-storage fi if [ ! -d "$HOME"/storage/shared/vs2termux ]; then mkdir -p "$HOME"/storage/shared/vs2termux fi if [ -d "$HOME"/storage/shared/vs2termux/exported_mods ]; then rm -rf "$HOME"/storage/shared/vs2termux/import_mods fi if [ ! -d "$HOME"/storage/shared/vs2termux/import_mods ]; then mkdir -p "$HOME"/storage/shared/vs2termux/import_mods mkdir -p "$HOME"/storage/shared/vs2termux/import_mods/mods fi if [ -d "$HOME"/storage/shared/vs2termux/exported_mods ]; then rm -rf "$HOME"/storage/shared/vs2termux/exported_mods fi if [ ! -d "$HOME"/storage/shared/vs2termux/exported_mods ]; then mkdir -p "$HOME"/storage/shared/vs2termux/exported_mods fi cd ~/storage/shared/vs2termux/ if [ ! -f "~/storage/shared/vs2termux/copy_mod_to_server.txt" ]; then echo "Add mods to the 'import_mods/mods' folder and run 'sh import_mods.sh' in termux to copy it to the server. Run 'sh export_mods.sh mods to copy servers mods to the 'export_mods/mods' folder." > copy_mod_to_or_from_server.txt fi if [ ! -f "~/storage/shared/vs2termux/run_server.txt" ]; then echo "To run the server, run 'sh start.sh' if u made the script in the home folder. Run 'cd ~/vs2server/instances/ && sh start.sh' if u did not made the script in the home folder. To join the server, enter 'localhost' if ur trying to join the server from the same device as ur hosting it. If you want someone else to join from outside of ur local network, u will need to 'port foward' the server. Theres shit ton of guides on how to do that online. " > run_server.txt fi if [ ! -f "~/storage/shared/vs2termux/remove_mods.txt" ]; then echo "Run 'sh remove_mods.sh' to open mod removing Command Line Interface" > remove_mods.txt fi if [ ! -f "~/storage/shared/vs2termux/exported_mods.txt" ]; then echo "'exported_mods' folder contains the mods that the server has downloaded automatically. U need to copy them to ur clients mods folder so u could join the server" > exported_mods.txt fi if [ ! -f "~/storage/shared/vs2termux/exported_mods.txt" ]; then echo "run 'unistall.sh' to remove vs2termux from ur phone" > unistall.txt fi echo "Check 'internal storage/vs2termux/' folder for some information that u might find useful." ) 2>&1 | tee "$HOME"/.cache/vs2server.log