From 0e95bbd1656311eafa18f6cb9469f8df2d019ce2 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Tue, 19 Apr 2022 10:58:51 +0800 Subject: [PATCH 1/3] Add mitmproxy script (uncompiled) Signed-off-by: Jaida Wu --- proxy.py | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 proxy.py diff --git a/proxy.py b/proxy.py new file mode 100644 index 000000000..1961c90dc --- /dev/null +++ b/proxy.py @@ -0,0 +1,68 @@ +## +# +# Copyright (C) 2002-2022 MlgmXyysd All Rights Reserved. +# +## + +## +# +# Genshin Impact script for mitmproxy +# +# https://github.com/MlgmXyysd/ +# +# *Original fiddler script from https://github.lunatic.moe/fiddlerscript +# +# Environment requirement: +# - mitmdump from mitmproxy +# +# @author MlgmXyysd +# @version 1.0 +# +## + +from mitmproxy import ctx, http + +class MlgmXyysd_Genshin_Impact_Proxy: + + def request(self, flow: http.HTTPFlow) -> None: + + # This can also be replaced with another IP address. + REMOTE_HOST = "localhost" + + LIST_DOMAINS = [ + "api-os-takumi.mihoyo.com", + "hk4e-api-os-static.mihoyo.com", + "hk4e-sdk-os.mihoyo.com", + "dispatchosglobal.yuanshen.com", + "osusadispatch.yuanshen.com", + "account.mihoyo.com", + "log-upload-os.mihoyo.com", + "dispatchcntest.yuanshen.com", + "devlog-upload.mihoyo.com", + "webstatic.mihoyo.com", + "log-upload.mihoyo.com", + "hk4e-sdk.mihoyo.com", + "api-beta-sdk.mihoyo.com", + "api-beta-sdk-os.mihoyo.com", + "cnbeta01dispatch.yuanshen.com", + "dispatchcnglobal.yuanshen.com", + "cnbeta02dispatch.yuanshen.com", + "sdk-os-static.mihoyo.com", + "webstatic-sea.mihoyo.com", + "webstatic-sea.hoyoverse.com", + "hk4e-sdk-os-static.hoyoverse.com", + "sdk-os-static.hoyoverse.com", + "api-account-os.hoyoverse.com", + "hk4e-sdk-os.hoyoverse.com" + ] + + if flow.request.url.startswith("http://overseauspider.yuanshen.com:8888/log"): + ctx.log.info("Block overseauspider.yuanshen.com") + flow.response = http.HTTPResponse.make(404) + elif flow.request.host in LIST_DOMAINS: + ctx.log.info("Redirect " + flow.request.host) + flow.request.host = REMOTE_HOST + +addons = [ + MlgmXyysd_Genshin_Impact_Proxy() +] \ No newline at end of file From b2da4a134ec99f3c898621b25256a64bb9df53a6 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Tue, 19 Apr 2022 11:14:59 +0800 Subject: [PATCH 2/3] Add click to run cmd Signed-off-by: Jaida Wu --- README.md | 130 ++++++++++++++++++++++++++++-------------------------- run.bat | 7 --- run.cmd | 115 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 183 insertions(+), 69 deletions(-) delete mode 100644 run.bat create mode 100644 run.cmd diff --git a/README.md b/README.md index 390bf679b..2cf96c683 100644 --- a/README.md +++ b/README.md @@ -1,62 +1,68 @@ -# Grasscutter -A WIP server emulator for Genshin Impact 2.3-2.6 - -**Note**: For support please join the [Discord server](https://discord.gg/T5vZU6UyeG). - -# Current features -* Logging in -* Spawning monsters via console -* Combat -* Inventory features (recieving items/characters, upgrading items/characters, etc) -* Co-op does work, but movement is kind of buggy and some player ults do not spawn properly -* Friends list -* Gacha system - -# Running the server and client - -### Prerequisites -* JDK-8u202 ([mirror link since Oracle required an account to download old builds](https://mirrors.huaweicloud.com/java/jdk/8u202-b08/)) -* Mongodb (recommended 4.0+) -* Fiddler Classic - -### Starting up the server (Assuming you are on Windows) -1. Setup compile environment `gradlew.bat` -2. Compile the server with `gradlew jar` -3. Create a folder named `resources` in your server directory, you will need to copy `BinOutput` and `ExcelBinOutput` folders which you can get from a repo like [https://github.com/Dimbreath/GenshinData](https://github.com/Dimbreath/GenshinData) into your resources folder. -4. Run the server with `java -jar grasscutter.jar`. Make sure mongodb is running as well. - -### Connecting with the client -½. Create an account using command below -1. Run Fiddler and turn on `Decrypt https traffic` in setting -2. Set your hosts file to redirect at least api-account-os.hoyoverse.com and dispatchosglobal.yuanshen.com to your dispatch server ip. Or use Fiddler with script from [https://github.lunatic.moe/fiddlerscript](https://github.lunatic.moe/fiddlerscript) (Recommended for beginners) -3. If you're using Fiddler, change the default port there (Tools -> Options -> Connections) to anything other than 8888, otherwise the server won't boot. -4. yoink - -### Server console commands - -`account create [username] {playerid}` - Creates an account with the specified username and the in-game uid for that account. The playerid parameter is optional and will be auto generated if not set. - -### In-Game commands -There is a dummy user named "Server" in every player's friends list that you can message to use commands. Commands also work in other chat rooms, such as private/team chats. - -`!spawn [monster id] [level] [amount]` - -`!give [item id] [amount]` - -`!drop [item id] [amount]` - -`!killall` - -`!godmode` - Prevents you from taking damage - -`!resetconst` - Resets the constellation level on your current active character, will need to relog after using the command to see any changes. - -`!sethp [hp]` - -`!clearartifacts` - Deletes all unequipped and unlocked level 0 artifacts, **including yellow rarity ones** from your inventory - -### Quick Troubleshooting -* If compiling wasnt successful, please check your JDK installation (must be JDK 8 and JDK's bin PATH variable is correct) -* My client doesn't connect, doesn't login, 4206, etc... - Mostly your fiddler is the issue, make sure it running on another port except 8888 -* Startup sequence: Mongodb > The server > Fiddler > Client -* If `4206` error constantly prompt up, try to use [jdk-8u202-b08](https://mirrors.huaweicloud.com/java/jdk/8u202-b08/) instead of other versions of JDK +# Grasscutter +A WIP server emulator for Genshin Impact 2.3-2.6 + +**Note**: For support please join the [Discord server](https://discord.gg/T5vZU6UyeG). + +# Current features +* Logging in +* Spawning monsters via console +* Combat +* Inventory features (recieving items/characters, upgrading items/characters, etc) +* Co-op does work, but movement is kind of buggy and some player ults do not spawn properly +* Friends list +* Gacha system + +# Running the server and client + +### Prerequisites +* JDK-8u202 ([mirror link since Oracle required an account to download old builds](https://mirrors.huaweicloud.com/java/jdk/8u202-b08/)) +* Mongodb (recommended 4.0+) +* Proxy daemon: mitmproxy (mitmdump, recommended), Fiddler Classic, etc. + +### Starting up the server (Assuming you are on Windows) +1. Setup compile environment `gradlew.bat` +2. Compile the server with `gradlew jar` +3. Create a folder named `resources` in your server directory, you will need to copy `BinOutput`, `ExcelBinOutput` folders and `TextMap*.json` which you can get from a repo like [https://github.com/Dimbreath/GenshinData](https://github.com/Dimbreath/GenshinData) into your resources folder. +4. Run the server with `java -jar grasscutter.jar`. Make sure mongodb is running as well. + +### Connecting with the client +½. Create an account using command below +1. Run a proxy daemon: + - mitmdump: `mitmdump -s proxy.py --ssl-insecure` + - Fiddler Classic: Run Fiddler Classic, turn on `Decrypt https traffic` in setting and change the default port there (Tools -> Options -> Connections) to anything other than `8888`, load [this script](https://github.lunatic.moe/fiddlerscript). + - hosts: Redirect at least `api-account-os.hoyoverse.com` and `dispatchosglobal.yuanshen.com` to your dispatch server ip. +2. Trust CA certificate: + - mitmdump: `certutil -addstore root %USERPROFILE%\.mitmproxy\mitmproxy-ca-cert.cer` +2. Set network proxy to `127.0.0.1:8080` or the proxy port you specified. +4. yoink + +* or you can use `run.cmd` to start Server & Proxy daemon with one click + +### Server console commands + +`account create [username] {playerid}` - Creates an account with the specified username and the in-game uid for that account. The playerid parameter is optional and will be auto generated if not set. + +### In-Game commands +There is a dummy user named "Server" in every player's friends list that you can message to use commands. Commands also work in other chat rooms, such as private/team chats. + +`!spawn [monster id] [level] [amount]` + +`!give [item id] [amount]` + +`!drop [item id] [amount]` + +`!killall` + +`!godmode` - Prevents you from taking damage + +`!resetconst` - Resets the constellation level on your current active character, will need to relog after using the command to see any changes. + +`!sethp [hp]` + +`!clearartifacts` - Deletes all unequipped and unlocked level 0 artifacts, **including yellow rarity ones** from your inventory + +### Quick Troubleshooting +* If compiling wasnt successful, please check your JDK installation (must be JDK 8 and JDK's bin PATH variable is correct) +* My client doesn't connect, doesn't login, 4206, etc... - Mostly your fiddler is the issue, make sure it running on another port except 8888 +* Startup sequence: Mongodb > The server > Proxy daemon (mitmdump, fiddler, etc.) > Client +* If `4206` error constantly prompt up, try to use [jdk-8u202-b08](https://mirrors.huaweicloud.com/java/jdk/8u202-b08/) instead of other versions of JDK diff --git a/run.bat b/run.bat deleted file mode 100644 index 3bb823ed7..000000000 --- a/run.bat +++ /dev/null @@ -1,7 +0,0 @@ -@echo off - - - -::This will not work if your java is in a different location, plugin as necessary -::this just saves you from changing your PATH -"C:\Program Files\Java\jdk1.8.0_202\bin\java.exe" -jar ./grasscutter.jar \ No newline at end of file diff --git a/run.cmd b/run.cmd new file mode 100644 index 000000000..36a20d811 --- /dev/null +++ b/run.cmd @@ -0,0 +1,115 @@ +@rem +@rem Copyright (C) 2002-2022 MlgmXyysd All Rights Reserved. +@rem + +@if "%DEBUG%" == "" echo off +pushd %~dp0 +title Grasscutter +call :LOG [INFO] Grasscutter +call :LOG [INFO] Initializing... + +@rem This will not work if your java or mitmproxy is in a different location, plugin as necessary +@rem this just saves you from changing your PATH +set JAVA_PATH=C:\Program Files\Java\jdk1.8.0_202\ +set MITMPROXY_PATH=%~dp0 +set PROXY_SCRIPT=proxy +@rem TODO: MongoDB integration +set SERVER_PATH=%~dp0 + +@rem mitmproxy not found, server only +if not exist "%MITMPROXY_PATH%mitmdump.exe" ( + call :LOG [WARN] mitmproxy not found, server only mode. + goto :SERVER +) +@rem proxy script not found, server only +if not exist "%PROXY_SCRIPT%.py" ( + if not exist "%PROXY_SCRIPT%.pyc" ( + call :LOG [WARN] Missing proxy script or compiled proxy script, server only mode. + goto :SERVER + ) else set PROXY_SCRIPT=%PROXY_SCRIPT%.pyc +) else set PROXY_SCRIPT=%PROXY_SCRIPT%.py + +:PROXY +@rem UAC Administrator privileges +>nul 2>&1 reg query "HKU\S-1-5-19" || ( + call :LOG [WARN] Currently running with non Administrator privileges, raising... + echo set UAC = CreateObject^("Shell.Application"^) > "%temp%\UAC.vbs" + echo UAC.ShellExecute "%~f0", "%1", "", "runas", 1 >> "%temp%\UAC.vbs" + "%temp%\UAC.vbs" + del /f /q "%temp%\UAC.vbs" >nul 2>nul + exit /b +) + +set PROXY=true +@rem Store original proxy settings +for /f "tokens=2*" %%a in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable 2^>nul') do set "ORIG_PROXY_ENABLE=%%b" +for /f "tokens=2*" %%a in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer 2^>nul') do set "ORIG_PROXY_SERVER=%%b" + +call :LOG [INFO] Starting proxy daemon... +@rem TODO: External proxy when ORIG_PROXY_ENABLE == 0x1 +start /min "" "%MITMPROXY_PATH%mitmdump.exe" -s %PROXY_SCRIPT% --ssl-insecure + +@rem CA certificate for possible HTTPS scheme +call :LOG [INFO] Waiting for CA certificate generation... +set CA_CERT_FILE="%USERPROFILE%\.mitmproxy\mitmproxy-ca-cert.cer" + +set /A TIMEOUT_COUNT=0 + +:CERT_CA_CHECK +if not exist %CA_CERT_FILE% ( + timeout /T 1 >nul 2>nul + set /A TIMEOUT_COUNT+=1 + goto CERT_CA_CHECK +) +:EXTRA_TIMEOUT +if %TIMEOUT_COUNT% LEQ 2 ( + timeout /T 1 >nul 2>nul + set /A TIMEOUT_COUNT+=1 + goto EXTRA_TIMEOUT +) +call :LOG [INFO] Adding CA certificate to store... +certutil -addstore root %CA_CERT_FILE% >nul 2>nul + +call :LOG [INFO] Setting up network proxy... +reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f >nul 2>nul +reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /d "127.0.0.1:8080" /f >nul 2>nul + +:SERVER +if not exist "%JAVA_PATH%bin\java.exe" ( + call :LOG [ERROR] Java not found. + goto :EXIT +) +if not exist "%SERVER_PATH%grasscutter.jar" ( + call :LOG [ERROR] Server jar not found. + goto :EXIT +) +call :LOG [INFO] Starting server... +"%JAVA_PATH%bin\java.exe" -jar "%SERVER_PATH%grasscutter.jar" +call :LOG [INFO] Server stopped + +:EXIT +if "%PROXY%" == "" ( + call :LOG [INFO] Proxy not started, no need to clean up. +) else ( + call :LOG [INFO] Restoring network settings... + + reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d "%ORIG_PROXY_ENABLE%" /f >nul 2>nul + reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /d "%ORIG_PROXY_SERVER%" /f >nul 2>nul + + call :LOG [INFO] Shutting down proxy daemon... + taskkill /t /f /im mitmdump.exe >nul 2>nul + + call :LOG [INFO] Removing CA certificate... + + for /F "tokens=2" %%s in ('certutil -dump %CA_CERT_FILE% ^| findstr ^"^sha1^"') do ( + set SERIAL=%%s + ) + + certutil -delstore root %SERIAL% >nul 2>nul +) + +call :LOG [INFO] See you again :) +goto :EOF + +:LOG +echo [%time:~0,8%] %* \ No newline at end of file From 49f640cb3b97d688975323a60c02d13652094f92 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Tue, 19 Apr 2022 11:39:18 +0800 Subject: [PATCH 3/3] Update .gitignore Signed-off-by: Jaida Wu --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 11c43e89a..1cd17e099 100644 --- a/.gitignore +++ b/.gitignore @@ -52,4 +52,7 @@ data/OpenConfig.json proto/auto/ proto/protoc.exe GM Handbook.txt -config.json +config.json +mitmdump.exe +grasscutter.jar +mongod.exe