diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml deleted file mode 100644 index aea7251..0000000 --- a/.github/workflows/gradle.yml +++ /dev/null @@ -1,29 +0,0 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. -# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle - -name: Java CI with Gradle - -on: - push: - branches: [ "master" ] - -jobs: - build-gradle-project: - runs-on: ubuntu-latest - steps: - - name: Checkout project sources - uses: actions/checkout@v3 - - name: Setup Gradle - uses: gradle/gradle-build-action@v2 - - name: Make gradlew executable - run: chmod +x ./gradlew - - name: Run build with Gradle Wrapper - run: ./gradlew shadowjar - - uses: actions/upload-artifact@v4 - with: - name: Archipelago.MultiClient.Java-SNAPSHOT - path: build/libs diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 0000000..9558e40 --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,35 @@ +# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Java CI with Maven + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: mvn -B package --file pom.xml + + # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive + - name: Update dependency graph + uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 diff --git a/.gitignore b/.gitignore index dacb092..b425f09 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,35 @@ -# Project exclude paths -/.gradle/ -/build/ -/build/classes/java/main/ -/.idea/ -gradle.properties \ No newline at end of file +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 7f54ef3..0000000 --- a/build.gradle +++ /dev/null @@ -1,35 +0,0 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation - -plugins { - id 'com.github.johnrengelman.shadow' - id 'java-library' -} - -archivesBaseName = "Archipelago.MultiClient.Java" -group = 'gg.archipelago.APClient' -version = '1.12' - -java.toolchain.languageVersion = JavaLanguageVersion.of(8) - -logger.info('Java: {} JVM: {}({}}) Arch: {}',System.getProperty('java.version'),System.getProperty('java.vm.version'),System.getProperty('java.vendor'),System.getProperty('os.arch')) - -repositories { - mavenCentral() -} - - -dependencies { - implementation 'org.java-websocket:Java-WebSocket:1.5.2' - implementation 'com.google.code.gson:gson:2.8.9' - implementation 'org.apache.httpcomponents.client5:httpclient5:5.2.1' - implementation 'org.apache.httpcomponents.core5:httpcore5:5.2' -} - -tasks.register('relocateShadowJar', ConfigureShadowRelocation) { - target = tasks.shadowJar - prefix = "archipelagoClient" // Default value is "shadow" -} -tasks.shadowJar.dependsOn tasks.relocateShadowJar - -shadowJar { -} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 7454180..0000000 Binary files a/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 69a9715..0000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew deleted file mode 100644 index 744e882..0000000 --- a/gradlew +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MSYS* | MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index 107acd3..0000000 --- a/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..1e812fb --- /dev/null +++ b/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + + dev.koifysh + archipelago-client + 0.1.13 + + Archipelago Java Library + Library to connect to an Archipelago Server + https://github.com/KonoTyran/archipelago-client + + + + MIT License + https://github.com/KonoTyran/archipelago-client/blob/main/LICENSE + repo + + + + + scm:git:git://github.com/KonoTyran/archipelago-client + scm:git:https://github.com/KonoTyran/archipelago-client.git + https://github.com/KonoTyran/archipelago-client + + + + + Kono Tyran + Kono.Tyran@gmail.com + + + + + 8 + 8 + UTF-8 + + + + + org.java-websocket + Java-WebSocket + 1.5.2 + + + com.google.code.gson + gson + 2.8.9 + + + org.apache.httpcomponents.client5 + httpclient5 + 5.2.1 + + + org.apache.httpcomponents.core5 + httpcore5 + 5.2 + + + org.slf4j + slf4j-nop + 1.7.30 + + + + + + + org.apache.maven.plugins + maven-release-plugin + 3.0.1 + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + attach-sources + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.6.3 + + + attach-javadocs + + jar + + + + + none + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.5 + + + sign-artifacts + verify + + sign + + + + + + org.sonatype.central + central-publishing-maven-plugin + 0.4.0 + true + + central + true + + + + + + \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..bd40d54 --- /dev/null +++ b/readme.md @@ -0,0 +1,29 @@ +Archipelago Java Client +======================= +![Maven Central Version](https://img.shields.io/maven-central/v/dev.koifysh/archipelago-client) + +A java client Library to connect to an [Archipelago](http://github.com/ArchipelagoMW/Archipelago) Server. + + +## Getting Started +Use the following Code snippits to add this library to your project using the following. + +### Maven +To use maven add this dependency to your `pom.xml`: +```xml + + dev.koifysh + archipelago-client + 0.1.13 + +``` + +### Gradle +To use Gradle add the maven central repository to your repositories list: +```gradle +mavenCentral() +``` +then add this to your `dependancy` section +```gradle +implementation 'dev.koifysh:archipelago-client:0.1.13' +``` \ No newline at end of file diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index d8cc5a1..0000000 --- a/settings.gradle +++ /dev/null @@ -1,5 +0,0 @@ -pluginManagement { - plugins { - id 'com.github.johnrengelman.shadow' version '7.1.2' - } -} \ No newline at end of file diff --git a/src/main/java/gg/archipelago/client/ArchipelagoClient.java b/src/main/java/dev/koifysh/archipelago/Client.java similarity index 53% rename from src/main/java/gg/archipelago/client/ArchipelagoClient.java rename to src/main/java/dev/koifysh/archipelago/Client.java index f29184d..312fe58 100644 --- a/src/main/java/gg/archipelago/client/ArchipelagoClient.java +++ b/src/main/java/dev/koifysh/archipelago/Client.java @@ -1,31 +1,31 @@ -package gg.archipelago.client; - -import gg.archipelago.client.Print.APPrint; -import gg.archipelago.client.helper.DeathLink; -import gg.archipelago.client.network.client.*; -import gg.archipelago.client.network.server.ConnectUpdatePacket; -import gg.archipelago.client.network.server.RoomInfoPacket; -import gg.archipelago.client.parts.DataPackage; -import gg.archipelago.client.parts.NetworkItem; -import gg.archipelago.client.parts.Version; +package dev.koifysh.archipelago; + +import dev.koifysh.archipelago.Print.APPrint; +import dev.koifysh.archipelago.events.RetrievedEvent; +import dev.koifysh.archipelago.network.server.ConnectUpdatePacket; +import dev.koifysh.archipelago.network.server.RoomInfoPacket; +import dev.koifysh.archipelago.parts.DataPackage; +import dev.koifysh.archipelago.parts.NetworkItem; +import dev.koifysh.archipelago.parts.NetworkSlot; +import dev.koifysh.archipelago.parts.Version; +import dev.koifysh.archipelago.network.client.*; import org.apache.hc.core5.net.URIBuilder; import java.io.*; import java.net.URI; import java.net.URISyntaxException; import java.util.*; -import java.util.logging.Level; import java.util.logging.Logger; -public abstract class ArchipelagoClient { +public abstract class Client { - private final static Logger LOGGER = Logger.getLogger(ArchipelagoClient.class.getName()); + private final static Logger LOGGER = Logger.getLogger(Client.class.getName()); private final String dataPackageLocation = "./APData/DataPackage.ser"; private int hintPoints; - private ArchipelagoWebSocket archipelagoWebSocket; + private WebSocket webSocket; private String password; @@ -35,23 +35,24 @@ public abstract class ArchipelagoClient { private DataPackage dataPackage; - public static ArchipelagoClient archipelagoClient; + public static Client client; private final LocationManager locationManager; private final ItemManager itemManager; private final EventManager eventManager; - public static final Version protocolVersion = new Version(0, 3, 7); + public static final Version protocolVersion = new Version(0, 4, 7); private int team; private int slot; + private HashMap slotInfo; private String name = "Name not set"; private String game = "Game not set"; private String alias; private Set tags = new HashSet<>(); private int itemsHandlingFlags = 0b000; - public ArchipelagoClient() { + public Client() { loadDataPackage(); UUID = dataPackage.getUUID(); @@ -59,42 +60,59 @@ public ArchipelagoClient() { eventManager = new EventManager(); locationManager = new LocationManager(this); itemManager = new ItemManager(this); - archipelagoClient = this; + client = this; } + /** + * Sets the name of the game to send to Archipelago's servers + * @param game the name of your game. + */ public void setGame(String game) { this.game = game; } + /** + * overwrite, and set all tags sent to the Archipelago server. + * this will overwrite any previous tags that have been set. + * @param tags a Set of tags to send. + */ public void setTags(Set tags) { if (!this.tags.equals(tags)) { this.tags = tags; if (isConnected()) { ConnectUpdatePacket packet = new ConnectUpdatePacket(); packet.tags = this.tags; - archipelagoWebSocket.sendPacket(packet); + webSocket.sendPacket(packet); } } } + /** + * add a tag to your list, keeping all previous tags intact. + * @param tag String tag to be added. + */ public void addTag(String tag) { if (!this.tags.contains(tag)) { tags.add(tag); if (isConnected()) { ConnectUpdatePacket packet = new ConnectUpdatePacket(); packet.tags = this.tags; - archipelagoWebSocket.sendPacket(packet); + webSocket.sendPacket(packet); } } } + /** + * removes supplied tag, if it exists. + * @param tag String tag to be removed. + */ public void removeTag(String tag) { if (this.tags.contains(tag)) { tags.remove(tag); if (isConnected()) { ConnectUpdatePacket packet = new ConnectUpdatePacket(); packet.tags = this.tags; - archipelagoWebSocket.sendPacket(packet); + webSocket.sendPacket(packet); } } } @@ -138,19 +156,30 @@ void saveDataPackage() { objectOut.close(); } catch (IOException e) { - LOGGER.log(Level.WARNING, "unable to save DataPackage.", e); + LOGGER.warning("unable to save DataPackage."); } } + /** + * Returns true only if connected to an Archipelago server. + * @return true if connected, otherwise false + */ public boolean isConnected() { - return archipelagoWebSocket != null && archipelagoWebSocket.isOpen(); + return webSocket != null && webSocket.isOpen(); } + /** + * closes a connection to the Archipelago server if connected. + */ public void close() { - if (archipelagoWebSocket != null) - archipelagoWebSocket.close(); + if (webSocket != null) + webSocket.close(); } + /** + * sets a password to authenticate with to join a password protected room. + * @param password room password + */ public void setPassword(String password) { this.password = password; } @@ -159,6 +188,10 @@ void setHintPoints(int hintPoints) { this.hintPoints = hintPoints; } + /** + * sets the slot name to connect to an Archcipelago server with. + * @param name + */ public void setName(String name) { this.name = name; } @@ -171,6 +204,10 @@ void setTeam(int team) { this.team = team; } + void setSlotInfo(HashMap slotInfo) { + this.slotInfo = slotInfo; + } + void setRoomInfo(RoomInfoPacket roomInfo) { this.roomInfo = roomInfo; } @@ -179,27 +216,46 @@ void updateDataPackage(DataPackage newData) { dataPackage.update(newData); } + /** + * + * @return team ID + */ public int getTeam() { return team; } + /** + * + * @return Slot ID + */ public int getSlot() { return slot; } + /** + * fetches the + * @return Room info. + */ public RoomInfoPacket getRoomInfo() { return roomInfo; } + public HashMap getSlotInfo() {return slotInfo;} + + /** + * Works exactly like {@link #connect(URI, boolean)} with allowDowngrade set to true; + * @param address + * @throws URISyntaxException on malformed address + */ public void connect(String address) throws URISyntaxException { URIBuilder builder = new URIBuilder((!address.contains("//")) ? "//" + address : address); if (builder.getPort() == -1) { //set default port if not included builder.setPort(38281); } - if (archipelagoWebSocket != null && archipelagoWebSocket.isOpen()) { + if (webSocket != null && webSocket.isOpen()) { LOGGER.fine("previous WebSocket is open, closing."); - archipelagoWebSocket.close(); + webSocket.close(); } if (builder.getScheme() == null) { @@ -211,43 +267,89 @@ public void connect(String address) throws URISyntaxException { connect(builder.build()); } + /** + * Works exactly like {@link #connect(URI, boolean)} but allowDowngrade is False + * @param address Address to connect to + */ public void connect(URI address) { connect(address, false); } + /** + * Connects to an Archipelago server with previously provided info. + *
+ * supply the following info before calling this method + *
+ * game: {@link #setGame(String)}
+ * slot name: {@link #setName(String)}
+ *
+ * if no protocol wss:// or ws:// is given will attempt a ssl connection + * to the supplied address, if that fails it will then try a non-ssl connection, unless allowDowngrade is false.
+ *
+ * Do not prefix address with wss:// or ws://. let the user enter a protocol to use. + * by default ssl will be tried first, if that fails then non-ssl will be used. unless allowDowngrade is set to false. + * @param address address of the archipelago server. + * @param allowDowngrade if set to false will prevent auto downgrade of ssl connection. + */ public void connect(URI address, boolean allowDowngrade) { LOGGER.fine("attempting WebSocket connection to " + address.toString()); - archipelagoWebSocket = new ArchipelagoWebSocket(address, this); - locationManager.setAPWebSocket(archipelagoWebSocket); - itemManager.setAPWebSocket(archipelagoWebSocket); - archipelagoWebSocket.connect(allowDowngrade); + webSocket = new WebSocket(address, this); + locationManager.setAPWebSocket(webSocket); + itemManager.setAPWebSocket(webSocket); + webSocket.connect(allowDowngrade); } + /** + * Sends a Chat message to all other connected Clients. + * @param message Message to send. + */ public void sendChat(String message) { - if (archipelagoWebSocket == null) + if (webSocket == null) return; - if (archipelagoWebSocket.isAuthenticated()) { - archipelagoWebSocket.sendChat(message); + if (webSocket.isAuthenticated()) { + webSocket.sendChat(message); } } + /** + * inform the Archipelago server that a location ID has been checked. + * @param locationID id of a location. + * @return true if packet was successfully sent. False if not connected or otherwise failed to send. + */ public boolean checkLocation(long locationID) { return locationManager.checkLocation(locationID); } + /** + * inform the Archipelago server that a collection of location ID has been checked. + * @param locationIDs a collection of a locations. + * @return true if packet was successfully sent. False if not connected or otherwise failed to send. + */ public boolean checkLocations(Collection locationIDs) { return locationManager.checkLocations(locationIDs); } + /** + * Ask the server for information about what is in locations. you will get a response in the {@link dev.koifysh.archipelago.events.LocationInfoEvent} event. + * @param locationIDs List of location ID's to request info on. + */ public void scoutLocations(ArrayList locationIDs) { - HashMap locations = dataPackage.getLocationsForGame(game); - locationIDs.removeIf( location -> !locations.containsKey(location)); - archipelagoWebSocket.scoutLocation(locationIDs); + locationIDs.removeIf( location -> !dataPackage.getGame(game).locationNameToId.containsValue(location)); + webSocket.scoutLocation(locationIDs); } - public abstract void onPrint(String print); - - public abstract void onPrintJson(APPrint apPrint, String type, int sending, NetworkItem receiving); + /** + * Called when the server wishes to display a message to the user. + *
+ * Deprecated use {@link dev.koifysh.archipelago.events.PrintJSONEvent} instead + * @see dev.koifysh.archipelago.events.PrintJSONEvent + * @param apPrint list of message segments. + * @param type the type of the received message. + * @param player int id of the sending player. + * @param item the network item that is involved with the message. + */ + @Deprecated + public abstract void onPrintJson(APPrint apPrint, String type, int player, NetworkItem item); public abstract void onError(Exception ex); @@ -275,7 +377,7 @@ public String getGame() { public String getConnectedAddress() { if (isConnected()) - return archipelagoWebSocket.getRemoteSocketAddress().getHostName()+":"+archipelagoWebSocket.getRemoteSocketAddress().getPort(); + return webSocket.getRemoteSocketAddress().getHostName()+":"+ webSocket.getRemoteSocketAddress().getPort(); else return ""; } @@ -284,17 +386,29 @@ public String getConnectedAddress() { * this should not need to be called externally but is left public just in case. */ public void reconnect() { - archipelagoWebSocket.reconnect(); + webSocket.reconnect(); } + /** + * Gets the UUID of this client. + * @return UUID of the client, this should theoretically never change. + */ public String getUUID() { return UUID; } + /** + * gets the alias of this slot. + * @return Alias of the slot connected to. + */ public String getAlias() { return alias; } + /** + * sets an Alias for this slot on the Archipelago server. + * @param alias Name to set the alias to. + */ void setAlias(String alias) { this.alias = alias; } @@ -307,40 +421,65 @@ public ItemManager getItemManager() { return itemManager; } + /** + * Update the current game status. + * @see ClientStatus + * + * @param status a {@link ClientStatus} to send to the server. + */ public void setGameState(ClientStatus status) { - if (archipelagoWebSocket == null) + if (webSocket == null) return; - if (archipelagoWebSocket.isAuthenticated()) - archipelagoWebSocket.sendPacket(new StatusUpdatePacket(status)); + if (webSocket.isAuthenticated()) + webSocket.sendPacket(new StatusUpdatePacket(status)); } + /** + * manually trigger a resync to the Archipelago server. this should be done automatically if the library detects a desync. + */ public void sync() { - archipelagoWebSocket.sendPacket(new SyncPacket()); + webSocket.sendPacket(new SyncPacket()); } public void sendBounce(BouncePacket bouncePacket) { - if (archipelagoWebSocket == null) + if (webSocket == null) return; - if (archipelagoWebSocket.isAuthenticated()) - archipelagoWebSocket.sendPacket(bouncePacket); + if (webSocket.isAuthenticated()) + webSocket.sendPacket(bouncePacket); } + /** + * disconnects from a connected Archipelago server. + */ public void disconnect() { - archipelagoWebSocket.close(); + webSocket.close(); } + /** + * @return set of tags currently in use. + */ public Set getTags() { return tags; } + /** + * fetch the itemflags that have been set, bitwise Or against {@link ItemFlags} to read. + * @return items handling int. + */ public int getItemsHandlingFlags() { return itemsHandlingFlags; } + /** + * fetch the itemflags that have been set, bitwise Or against {@link ItemFlags} to read. + */ public void setItemsHandlingFlags(int itemsHandlingFlags) { this.itemsHandlingFlags = itemsHandlingFlags; } + /** + * @return the event manager. + */ public EventManager getEventManager() { return eventManager; } @@ -348,13 +487,12 @@ public EventManager getEventManager() { /** * Uses DataStorage to save a value on the AP server. * - * @param setPacket */ public int dataStorageSet(SetPacket setPacket) { - if (archipelagoWebSocket == null || !archipelagoWebSocket.isAuthenticated()) + if (webSocket == null || !webSocket.isAuthenticated()) return 0; - archipelagoWebSocket.sendPacket(setPacket); + webSocket.sendPacket(setPacket); return setPacket.getRequestID(); } @@ -364,14 +502,14 @@ public int dataStorageSet(SetPacket setPacket) { * @param keys List of Keys to be notified of. */ public void dataStorageSetNotify(Collection keys) { - if (archipelagoWebSocket == null || !archipelagoWebSocket.isAuthenticated()) + if (webSocket == null || !webSocket.isAuthenticated()) return; - archipelagoWebSocket.sendPacket(new SetNotifyPacket(keys)); + webSocket.sendPacket(new SetNotifyPacket(keys)); } /** * Uses DataStorage to reterieve a value from the server will get value back though a - * {@link gg.archipelago.client.events.RetrievedEvent RetrievedEvent}.
+ * {@link RetrievedEvent RetrievedEvent}.
* see following table for list of reserved keys. * * @@ -399,11 +537,12 @@ public void dataStorageSetNotify(Collection keys) { * @param keys a list of keys to retrieve values for */ public int dataStorageGet(Collection keys) { - if (archipelagoWebSocket == null || !archipelagoWebSocket.isAuthenticated()) + if (webSocket == null || !webSocket.isAuthenticated()) return 0; GetPacket getPacket = new GetPacket(keys); - archipelagoWebSocket.sendPacket(getPacket); + webSocket.sendPacket(getPacket); return getPacket.getRequestID(); } + } diff --git a/src/main/java/gg/archipelago/client/ClientStatus.java b/src/main/java/dev/koifysh/archipelago/ClientStatus.java similarity index 50% rename from src/main/java/gg/archipelago/client/ClientStatus.java rename to src/main/java/dev/koifysh/archipelago/ClientStatus.java index fafbfb9..1dcc8d6 100644 --- a/src/main/java/gg/archipelago/client/ClientStatus.java +++ b/src/main/java/dev/koifysh/archipelago/ClientStatus.java @@ -1,7 +1,14 @@ -package gg.archipelago.client; +package dev.koifysh.archipelago; import com.google.gson.annotations.SerializedName; +/** + * A Status to send to the server.
+ * {@link #CLIENT_UNKNOWN} - default, no status.
+ * {@link #CLIENT_READY} - Ready to start.
+ * {@link #CLIENT_PLAYING} - Player has started playing.
+ * {@link #CLIENT_GOAL} - Player has finished their game. This will trigger an auto-release depending on server settings. + */ public enum ClientStatus { @SerializedName("0") @@ -13,7 +20,7 @@ public enum ClientStatus { @SerializedName("30") CLIENT_GOAL(30); - private int value; + private final int value; ClientStatus(int value) { this.value = value; } diff --git a/src/main/java/gg/archipelago/client/EventManager.java b/src/main/java/dev/koifysh/archipelago/EventManager.java similarity index 69% rename from src/main/java/gg/archipelago/client/EventManager.java rename to src/main/java/dev/koifysh/archipelago/EventManager.java index b95d098..3f6d1da 100644 --- a/src/main/java/gg/archipelago/client/EventManager.java +++ b/src/main/java/dev/koifysh/archipelago/EventManager.java @@ -1,17 +1,27 @@ -package gg.archipelago.client; +package dev.koifysh.archipelago; -import gg.archipelago.client.events.Event; -import gg.archipelago.client.events.ArchipelagoEventListener; +import dev.koifysh.archipelago.events.ArchipelagoEventListener; +import dev.koifysh.archipelago.events.Event; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; +/** + * Manages registering and calling events + * @see #registerListener(Object) + */ public class EventManager { private final Map registeredListeners = new HashMap<>(); + /** + * Use to register for Events that come from the Archipelago server. + * supplied Object must have at least 1 method annotated with {@link ArchipelagoEventListener} + * and have 1 parameter that extends {@link Event} + * @param listener the object containing a listener method. + */ public void registerListener(Object listener) { for (Method method : listener.getClass().getMethods()) { if (!method.isAnnotationPresent(ArchipelagoEventListener.class)) diff --git a/src/main/java/dev/koifysh/archipelago/ItemFlags.java b/src/main/java/dev/koifysh/archipelago/ItemFlags.java new file mode 100644 index 0000000..2c8260e --- /dev/null +++ b/src/main/java/dev/koifysh/archipelago/ItemFlags.java @@ -0,0 +1,26 @@ +package dev.koifysh.archipelago; + +/** + * Item Flag variables to read {@link Client#getItemsHandlingFlags()} and set {@link Client#setItemsHandlingFlags(int)} + *
+ * Current item flags: {@link #SEND_ITEMS} {@link #SEND_OWN_ITEMS} {@link #SEND_STARTING_INVENTORY} + */ +public class ItemFlags { + + /** + * Tells the server to send you items from other worlds. + */ + public static final int SEND_ITEMS = 0b001; + + /** + * Tells the server to send your own items to you (remote items game) + */ + public static final int SEND_OWN_ITEMS = 0b010; + + /** + * Tells the server to send you any items that You should start with. + * don't set this if you handle starting items by some kind of data file. + */ + public static final int SEND_STARTING_INVENTORY = 0b100; + +} diff --git a/src/main/java/gg/archipelago/client/ItemManager.java b/src/main/java/dev/koifysh/archipelago/ItemManager.java similarity index 56% rename from src/main/java/gg/archipelago/client/ItemManager.java rename to src/main/java/dev/koifysh/archipelago/ItemManager.java index aa8bbbb..2a7276e 100644 --- a/src/main/java/gg/archipelago/client/ItemManager.java +++ b/src/main/java/dev/koifysh/archipelago/ItemManager.java @@ -1,24 +1,24 @@ -package gg.archipelago.client; +package dev.koifysh.archipelago; -import gg.archipelago.client.events.ReceiveItemEvent; -import gg.archipelago.client.network.client.SyncPacket; -import gg.archipelago.client.parts.DataPackage; -import gg.archipelago.client.parts.NetworkItem; +import dev.koifysh.archipelago.events.ReceiveItemEvent; +import dev.koifysh.archipelago.network.client.SyncPacket; +import dev.koifysh.archipelago.parts.DataPackage; +import dev.koifysh.archipelago.parts.NetworkItem; import java.util.ArrayList; public class ItemManager { - ArchipelagoClient archipelagoClient; - ArchipelagoWebSocket webSocket; + Client client; + WebSocket webSocket; ArrayList receivedItems = new ArrayList<>(); int index; - public ItemManager(ArchipelagoClient archipelagoClient) { - this.archipelagoClient = archipelagoClient; + public ItemManager(Client client) { + this.client = client; } public void receiveItems(ArrayList ids, int index) { @@ -27,14 +27,14 @@ public void receiveItems(ArrayList ids, int index) { } if (receivedItems.size() == index) { receivedItems.addAll(ids); - DataPackage dp = archipelagoClient.getDataPackage(); - int myTeam = archipelagoClient.getTeam(); + DataPackage dp = client.getDataPackage(); + int myTeam = client.getTeam(); for (int i = this.index; i < receivedItems.size(); i++) { NetworkItem item = receivedItems.get(i); - item.itemName = dp.getItem(item.itemID); - item.locationName = dp.getLocation(item.locationID); - item.playerName = archipelagoClient.getRoomInfo().getPlayer(myTeam,item.playerID).alias; - archipelagoClient.getEventManager().callEvent(new ReceiveItemEvent(item, index)); + item.itemName = dp.getItem(item.itemID, client.getGame()); + item.locationName = dp.getLocation(item.locationID, client.getSlotInfo().get(item.playerID).game); + item.playerName = client.getRoomInfo().getPlayer(myTeam,item.playerID).alias; + client.getEventManager().callEvent(new ReceiveItemEvent(item, index)); } this.index = receivedItems.size(); @@ -42,7 +42,7 @@ public void receiveItems(ArrayList ids, int index) { else { if(webSocket != null) { webSocket.sendPacket(new SyncPacket()); - archipelagoClient.getLocationManager().resendAllCheckedLocations(); + client.getLocationManager().resendAllCheckedLocations(); } } } @@ -52,8 +52,8 @@ public void writeFromSave(ArrayList receivedItems, int index) { this.index = index; } - public void setAPWebSocket(ArchipelagoWebSocket archipelagoWebSocket) { - this.webSocket = archipelagoWebSocket; + public void setAPWebSocket(WebSocket webSocket) { + this.webSocket = webSocket; } public int getIndex() { diff --git a/src/main/java/gg/archipelago/client/LocationManager.java b/src/main/java/dev/koifysh/archipelago/LocationManager.java similarity index 81% rename from src/main/java/gg/archipelago/client/LocationManager.java rename to src/main/java/dev/koifysh/archipelago/LocationManager.java index 5080005..10232c7 100644 --- a/src/main/java/gg/archipelago/client/LocationManager.java +++ b/src/main/java/dev/koifysh/archipelago/LocationManager.java @@ -1,20 +1,23 @@ -package gg.archipelago.client; +package dev.koifysh.archipelago; -import gg.archipelago.client.network.client.LocationChecks; +import dev.koifysh.archipelago.network.client.LocationChecks; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; public class LocationManager { - ArchipelagoClient archipelagoClient; - ArchipelagoWebSocket webSocket; + Client client; + WebSocket webSocket; Set checkedLocations = new HashSet<>(); Set missingLocations = new HashSet<>(); - public LocationManager(ArchipelagoClient archipelagoClient) { - this.archipelagoClient = archipelagoClient; + public LocationManager(Client client) { + this.client = client; } public boolean checkLocation(long id) { @@ -57,8 +60,8 @@ public void resendAllCheckedLocations() { webSocket.sendPacket(packet); } - protected void setAPWebSocket(ArchipelagoWebSocket archipelagoWebSocket) { - this.webSocket = archipelagoWebSocket; + protected void setAPWebSocket(WebSocket webSocket) { + this.webSocket = webSocket; } public Set getCheckedLocations() { diff --git a/src/main/java/gg/archipelago/client/Print/APPrint.java b/src/main/java/dev/koifysh/archipelago/Print/APPrint.java similarity index 50% rename from src/main/java/gg/archipelago/client/Print/APPrint.java rename to src/main/java/dev/koifysh/archipelago/Print/APPrint.java index be47489..822a508 100644 --- a/src/main/java/gg/archipelago/client/Print/APPrint.java +++ b/src/main/java/dev/koifysh/archipelago/Print/APPrint.java @@ -1,7 +1,7 @@ -package gg.archipelago.client.Print; +package dev.koifysh.archipelago.Print; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.parts.NetworkItem; +import dev.koifysh.archipelago.parts.NetworkItem; public class APPrint { @@ -20,4 +20,19 @@ public class APPrint { @SerializedName("found") public boolean found; + @SerializedName("team") + public String team; + + @SerializedName("slot") + public int slot; + + @SerializedName("message") + public String message; + + @SerializedName("tags") + public String[] tags; + + @SerializedName("countdown") + public int countdown; + } diff --git a/src/main/java/gg/archipelago/client/Print/APPrintColor.java b/src/main/java/dev/koifysh/archipelago/Print/APPrintColor.java similarity index 94% rename from src/main/java/gg/archipelago/client/Print/APPrintColor.java rename to src/main/java/dev/koifysh/archipelago/Print/APPrintColor.java index a17bfb6..35b0e9b 100644 --- a/src/main/java/gg/archipelago/client/Print/APPrintColor.java +++ b/src/main/java/dev/koifysh/archipelago/Print/APPrintColor.java @@ -1,4 +1,4 @@ -package gg.archipelago.client.Print; +package dev.koifysh.archipelago.Print; import java.awt.*; diff --git a/src/main/java/gg/archipelago/client/Print/APPrintPart.java b/src/main/java/dev/koifysh/archipelago/Print/APPrintPart.java similarity index 62% rename from src/main/java/gg/archipelago/client/Print/APPrintPart.java rename to src/main/java/dev/koifysh/archipelago/Print/APPrintPart.java index ed5d53c..a65dfef 100644 --- a/src/main/java/gg/archipelago/client/Print/APPrintPart.java +++ b/src/main/java/dev/koifysh/archipelago/Print/APPrintPart.java @@ -1,7 +1,10 @@ -package gg.archipelago.client.Print; +package dev.koifysh.archipelago.Print; public class APPrintPart { public APPrintType type = APPrintType.text; public APPrintColor color = APPrintColor.none; public String text = ""; + public int player = 0; + public int flags = 0; + } diff --git a/src/main/java/gg/archipelago/client/Print/APPrintType.java b/src/main/java/dev/koifysh/archipelago/Print/APPrintType.java similarity index 92% rename from src/main/java/gg/archipelago/client/Print/APPrintType.java rename to src/main/java/dev/koifysh/archipelago/Print/APPrintType.java index 93ce2e5..0a1f680 100644 --- a/src/main/java/gg/archipelago/client/Print/APPrintType.java +++ b/src/main/java/dev/koifysh/archipelago/Print/APPrintType.java @@ -1,4 +1,4 @@ -package gg.archipelago.client.Print; +package dev.koifysh.archipelago.Print; import com.google.gson.annotations.SerializedName; diff --git a/src/main/java/gg/archipelago/client/ArchipelagoWebSocket.java b/src/main/java/dev/koifysh/archipelago/WebSocket.java similarity index 53% rename from src/main/java/gg/archipelago/client/ArchipelagoWebSocket.java rename to src/main/java/dev/koifysh/archipelago/WebSocket.java index e558a5a..cdd814b 100644 --- a/src/main/java/gg/archipelago/client/ArchipelagoWebSocket.java +++ b/src/main/java/dev/koifysh/archipelago/WebSocket.java @@ -1,23 +1,24 @@ -package gg.archipelago.client; +package dev.koifysh.archipelago; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonParser; -import gg.archipelago.client.Print.APPrint; -import gg.archipelago.client.Print.APPrintType; -import gg.archipelago.client.events.*; -import gg.archipelago.client.helper.DeathLink; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.ConnectionResult; -import gg.archipelago.client.network.client.ConnectPacket; -import gg.archipelago.client.network.client.GetDataPackagePacket; -import gg.archipelago.client.network.client.LocationScouts; -import gg.archipelago.client.network.client.SayPacket; -import gg.archipelago.client.network.server.*; -import gg.archipelago.client.parts.DataPackage; -import gg.archipelago.client.parts.NetworkItem; -import gg.archipelago.client.parts.NetworkPlayer; +import dev.koifysh.archipelago.Print.APPrint; +import dev.koifysh.archipelago.Print.APPrintType; +import dev.koifysh.archipelago.helper.DeathLink; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.ConnectionResult; +import dev.koifysh.archipelago.network.client.ConnectPacket; +import dev.koifysh.archipelago.network.client.GetDataPackagePacket; +import dev.koifysh.archipelago.network.client.LocationScouts; +import dev.koifysh.archipelago.network.client.SayPacket; +import dev.koifysh.archipelago.parts.DataPackage; +import dev.koifysh.archipelago.parts.NetworkItem; +import dev.koifysh.archipelago.parts.NetworkPlayer; +import dev.koifysh.archipelago.events.*; +import dev.koifysh.archipelago.network.server.*; + import org.apache.hc.core5.net.URIBuilder; import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; @@ -28,11 +29,11 @@ import java.util.*; import java.util.logging.Level; -public class ArchipelagoWebSocket extends WebSocketClient { +class WebSocket extends WebSocketClient { - private final static java.util.logging.Logger LOGGER = java.util.logging.Logger.getLogger(ArchipelagoWebSocket.class.getName()); + private final static java.util.logging.Logger LOGGER = java.util.logging.Logger.getLogger(WebSocket.class.getName()); - private final ArchipelagoClient archipelagoClient; + private final Client client; private final Gson gson = new Gson(); @@ -44,9 +45,9 @@ public class ArchipelagoWebSocket extends WebSocketClient { private static Timer reconnectTimer; private boolean downgrade = false; - public ArchipelagoWebSocket(URI serverUri, ArchipelagoClient archipelagoClient) { + public WebSocket(URI serverUri, Client client) { super(serverUri); - this.archipelagoClient = archipelagoClient; + this.client = client; if (reconnectTimer != null) { reconnectTimer.cancel(); } @@ -77,49 +78,50 @@ public void onMessage(String message) { RoomInfoPacket roomInfo = gson.fromJson(packet, RoomInfoPacket.class); //save room info - archipelagoClient.setRoomInfo(roomInfo); + client.setRoomInfo(roomInfo); - checkDataPackage(roomInfo.datapackageVersions); + checkDataPackage(roomInfo.datapackageChecksums, roomInfo.games); seedName = roomInfo.seedName; ConnectPacket connectPacket = new ConnectPacket(); - connectPacket.version = ArchipelagoClient.protocolVersion; - connectPacket.name = archipelagoClient.getMyName(); - connectPacket.password = (archipelagoClient.getPassword() == null) ? "" : archipelagoClient.getPassword(); - connectPacket.uuid = archipelagoClient.getUUID(); - connectPacket.game = archipelagoClient.getGame(); - connectPacket.tags = archipelagoClient.getTags(); - connectPacket.itemsHandling = archipelagoClient.getItemsHandlingFlags(); + connectPacket.version = Client.protocolVersion; + connectPacket.name = client.getMyName(); + connectPacket.password = (client.getPassword() == null) ? "" : client.getPassword(); + connectPacket.uuid = client.getUUID(); + connectPacket.game = client.getGame(); + connectPacket.tags = client.getTags(); + connectPacket.itemsHandling = client.getItemsHandlingFlags(); //send reply sendPacket(connectPacket); - archipelagoClient.setRoomInfo(roomInfo); + client.setRoomInfo(roomInfo); break; case Connected: ConnectedPacket connectedPacket = gson.fromJson(packet, ConnectedPacket.class); - archipelagoClient.setTeam(connectedPacket.team); - archipelagoClient.setSlot(connectedPacket.slot); + client.setTeam(connectedPacket.team); + client.setSlot(connectedPacket.slot); + client.setSlotInfo(connectedPacket.slotInfo); - archipelagoClient.getRoomInfo().networkPlayers.addAll(connectedPacket.players); - archipelagoClient.getRoomInfo().networkPlayers.add(new NetworkPlayer(connectedPacket.team, 0, "Archipelago")); - archipelagoClient.setAlias(archipelagoClient.getRoomInfo().getPlayer(connectedPacket.team, connectedPacket.slot).alias); + client.getRoomInfo().networkPlayers.addAll(connectedPacket.players); + client.getRoomInfo().networkPlayers.add(new NetworkPlayer(connectedPacket.team, 0, "Archipelago")); + client.setAlias(client.getRoomInfo().getPlayer(connectedPacket.team, connectedPacket.slot).alias); JsonElement slotData = packet.getAsJsonObject().get("slot_data"); ConnectionAttemptEvent attemptConnectionEvent = new ConnectionAttemptEvent(connectedPacket.team, connectedPacket.slot, seedName, slotData); - archipelagoClient.getEventManager().callEvent(attemptConnectionEvent); + client.getEventManager().callEvent(attemptConnectionEvent); if (!attemptConnectionEvent.isCanceled()) { authenticated = true; //only send locations if the connection is not canceled. - archipelagoClient.getLocationManager().addCheckedLocations(connectedPacket.checkedLocations); - archipelagoClient.getLocationManager().setMissingLocations(connectedPacket.missingLocations); - archipelagoClient.getLocationManager().sendIfChecked(connectedPacket.missingLocations); + client.getLocationManager().addCheckedLocations(connectedPacket.checkedLocations); + client.getLocationManager().setMissingLocations(connectedPacket.missingLocations); + client.getLocationManager().sendIfChecked(connectedPacket.missingLocations); ConnectionResultEvent connectionResultEvent = new ConnectionResultEvent(ConnectionResult.Success, connectedPacket.team, connectedPacket.slot, seedName, slotData); - archipelagoClient.getEventManager().callEvent(connectionResultEvent); + client.getEventManager().callEvent(connectionResultEvent); } else { this.close(); //close out of this loop because we are no longer interested in further commands from the server. @@ -128,40 +130,39 @@ public void onMessage(String message) { break; case ConnectionRefused: ConnectionRefusedPacket error = gson.fromJson(cmdList.get(i), ConnectionRefusedPacket.class); - archipelagoClient.getEventManager().callEvent(new ConnectionResultEvent(error.errors[0])); - break; - case Print: - archipelagoClient.onPrint(gson.fromJson(packet, PrintPacket.class).getText()); + client.getEventManager().callEvent(new ConnectionResultEvent(error.errors[0])); break; case DataPackage: JsonElement data = packet.getAsJsonObject().get("data"); DataPackage dataPackage = gson.fromJson(data, DataPackage.class); - dataPackage.uuid = archipelagoClient.getUUID(); - archipelagoClient.updateDataPackage(dataPackage); - if (dataPackage.getVersion() != 0) { - archipelagoClient.saveDataPackage(); - } + dataPackage.uuid = client.getUUID(); + client.updateDataPackage(dataPackage); + client.saveDataPackage(); break; case PrintJSON: LOGGER.finest("PrintJSON packet"); APPrint print = gson.fromJson(packet, APPrint.class); - //filter though all player IDs and replace id with alias. for (int p = 0; print.parts.length > p; ++p) { if (print.parts[p].type == APPrintType.playerID) { int playerID = Integer.parseInt((print.parts[p].text)); - NetworkPlayer player = archipelagoClient.getRoomInfo().getPlayer(archipelagoClient.getTeam(), playerID); + NetworkPlayer player = client.getRoomInfo().getPlayer(client.getTeam(), playerID); print.parts[p].text = player.alias; } else if (print.parts[p].type == APPrintType.itemID) { - int itemID = Integer.parseInt((print.parts[p].text)); - print.parts[p].text = archipelagoClient.getDataPackage().getItem(itemID); + long itemID = Long.parseLong(print.parts[p].text); + print.parts[p].text = client.getDataPackage().getItem(itemID, client.getSlotInfo().get(print.parts[i].player).game); } else if (print.parts[p].type == APPrintType.locationID) { - int locationID = Integer.parseInt((print.parts[p].text)); - print.parts[p].text = archipelagoClient.getDataPackage().getLocation(locationID); + long locationID = Long.parseLong(print.parts[p].text); + print.parts[p].text = client.getDataPackage().getLocation(locationID, client.getSlotInfo().get(print.parts[i].player).game); } } - archipelagoClient.onPrintJson(print, print.type, print.receiving, print.item); + + client.getEventManager().callEvent(new PrintJSONEvent(print, print.type, print.receiving, print.item)); + + //todo: remove next version + client.onPrintJson(print, print.type, print.receiving, print.item); + break; case RoomUpdate: RoomUpdatePacket updatePacket = gson.fromJson(packet, RoomUpdatePacket.class); @@ -169,36 +170,36 @@ public void onMessage(String message) { break; case ReceivedItems: ReceivedItemsPacket items = gson.fromJson(packet, ReceivedItemsPacket.class); - ItemManager itemManager = archipelagoClient.getItemManager(); + ItemManager itemManager = client.getItemManager(); itemManager.receiveItems(items.items, items.index); break; case Bounced: BouncedPacket bounced = gson.fromJson(packet, BouncedPacket.class); - if (DeathLink.isDeathLink(bounced)) + if (bounced.tags.contains("DeathLink")) DeathLink.receiveDeathLink(bounced); else - archipelagoClient.getEventManager().callEvent(new BouncedEvent(bounced.games, bounced.tags, bounced.slots, bounced.data)); + client.getEventManager().callEvent(new BouncedEvent(bounced.games, bounced.tags, bounced.slots, bounced.data)); break; case LocationInfo: LocationInfoPacket locations = gson.fromJson(packet, LocationInfoPacket.class); for (NetworkItem item : locations.locations) { - item.itemName = archipelagoClient.getDataPackage().getItem(item.itemID); - item.locationName = archipelagoClient.getDataPackage().getLocation(item.locationID); - item.playerName = archipelagoClient.getRoomInfo().getPlayer(archipelagoClient.getTeam(), item.playerID).alias; + item.itemName = client.getDataPackage().getItem(item.itemID, client.getSlotInfo().get(item.playerID).game); + item.locationName = client.getDataPackage().getLocation(item.locationID, client.getSlotInfo().get(client.getSlot()).game); + item.playerName = client.getRoomInfo().getPlayer(client.getTeam(), item.playerID).alias; } - archipelagoClient.getEventManager().callEvent(new LocationInfoEvent(locations.locations)); + client.getEventManager().callEvent(new LocationInfoEvent(locations.locations)); break; case Retrieved: RetrievedPacket retrievedPacket = gson.fromJson(packet, RetrievedPacket.class); - archipelagoClient.getEventManager().callEvent(new RetrievedEvent(retrievedPacket.keys, packet.getAsJsonObject().get("keys").getAsJsonObject(), retrievedPacket.requestID)); + client.getEventManager().callEvent(new RetrievedEvent(retrievedPacket.keys, packet.getAsJsonObject().get("keys").getAsJsonObject(), retrievedPacket.requestID)); break; case SetReply: SetReplyPacket setReplyPacket = gson.fromJson(packet, SetReplyPacket.class); - archipelagoClient.getEventManager().callEvent(new SetReplyEvent(setReplyPacket.key, setReplyPacket.value, setReplyPacket.original_Value, packet.getAsJsonObject().get("value"), setReplyPacket.requestID)); + client.getEventManager().callEvent(new SetReplyEvent(setReplyPacket.key, setReplyPacket.value, setReplyPacket.original_Value, packet.getAsJsonObject().get("value"), setReplyPacket.requestID)); break; case InvalidPacket: InvalidPacket invalidPacket = gson.fromJson(packet, InvalidPacket.class); - archipelagoClient.getEventManager().callEvent(new InvalidPacketEvent(invalidPacket.type, invalidPacket.Original_cmd, invalidPacket.text)); + client.getEventManager().callEvent(new InvalidPacketEvent(invalidPacket.type, invalidPacket.Original_cmd, invalidPacket.text)); default: } @@ -210,37 +211,42 @@ public void onMessage(String message) { } private void updateRoom(RoomUpdatePacket updateRoomPacket) { - if (updateRoomPacket.networkPlayers.size() != 0) { - archipelagoClient.getRoomInfo().networkPlayers = updateRoomPacket.networkPlayers; - archipelagoClient.getRoomInfo().networkPlayers.add(new NetworkPlayer(archipelagoClient.getTeam(), 0, "Archipelago")); + if (!updateRoomPacket.networkPlayers.isEmpty()) { + client.getRoomInfo().networkPlayers = updateRoomPacket.networkPlayers; + client.getRoomInfo().networkPlayers.add(new NetworkPlayer(client.getTeam(), 0, "Archipelago")); } - checkDataPackage(updateRoomPacket.datapackageVersions); + client.setHintPoints(updateRoomPacket.hintPoints); + client.setAlias(client.getRoomInfo().getPlayer(client.getTeam(), client.getSlot()).alias); - archipelagoClient.setHintPoints(updateRoomPacket.hintPoints); - archipelagoClient.setAlias(archipelagoClient.getRoomInfo().getPlayer(archipelagoClient.getTeam(), archipelagoClient.getSlot()).alias); - - archipelagoClient.getEventManager().callEvent(new CheckedLocationsEvent(updateRoomPacket.checkedLocations)); + client.getEventManager().callEvent(new CheckedLocationsEvent(updateRoomPacket.checkedLocations)); } - private void checkDataPackage(HashMap versions) { - HashSet exclusions = new HashSet<>(); - for (Map.Entry game : versions.entrySet()) { - //the game does NOT need updating add it to the exclusion list. - int myGameVersion = archipelagoClient.getDataPackage().getVersions().getOrDefault(game.getKey(), 0); - int newGameVersion = game.getValue(); - if (newGameVersion <= myGameVersion && newGameVersion != 0) { - exclusions.add(game.getKey()); + + private void checkDataPackage(HashMap versions, List games) { + Set gamesToUpdate = new HashSet<>(); + Map checksums = client.getDataPackage().getChecksums(); + for (Map.Entry game : versions.entrySet()) { + if (!games.contains(game.getKey())) + continue; + + if (!checksums.containsKey(game.getKey())) { + gamesToUpdate.add(game.getKey()); + continue; } + + if (!checksums.get(game.getKey()).equals(game.getValue())) + gamesToUpdate.add(game.getKey()); } - if (exclusions.size() != versions.size()) { - fetchDataPackageFromAP(exclusions); + + if (!gamesToUpdate.isEmpty()) { + fetchDataPackageFromAP(gamesToUpdate); } } - private void fetchDataPackageFromAP(Set exclusions) { - sendPacket(new GetDataPackagePacket(exclusions)); + private void fetchDataPackageFromAP(Set games) { + sendPacket(new GetDataPackagePacket(games)); } public void sendPacket(APPacket packet) { @@ -265,18 +271,18 @@ public void onClose(int code, String wsReason, boolean remote) { // attempt to reconnect using non-secure web socket if we are failing to connect with a secure socket. if (uri.getScheme().equalsIgnoreCase("wss") && downgrade) { try { - archipelagoClient.connect(new URIBuilder(uri).setScheme("ws").build()); + client.connect(new URIBuilder(uri).setScheme("ws").build()); } catch (URISyntaxException ignored) { - archipelagoClient.onClose(reason, 0); + client.onClose("(AP-275) " + reason, 0); } return; } - archipelagoClient.onClose(reason, 0); + client.onClose("(AP-279) " + reason, 0); return; } if (code == 1000) { reconnectTimer.cancel(); - archipelagoClient.onClose("Disconnected.", 0); + client.onClose("(AP-284) Disconnected.", 0); } if (code == 1006) { @@ -287,26 +293,29 @@ public void onClose(int code, String wsReason, boolean remote) { TimerTask reconnectTask = new TimerTask() { @Override public void run() { - archipelagoClient.reconnect(); + client.reconnect(); } }; reconnectTimer.cancel(); reconnectTimer = new Timer(); reconnectTimer.schedule(reconnectTask, reconnectDelay); - archipelagoClient.onClose(reason, reconnectDelay / 1000); + client.onClose("(AP-302) " + reason, reconnectDelay / 1000); return; } } reconnectTimer.cancel(); - archipelagoClient.onClose(reason, 0); + client.onClose("(AP-308) "+reason, 0); } @Override public void onError(Exception ex) { - if (ex instanceof SSLException) return; - archipelagoClient.onError(ex); + if (ex instanceof SSLException) { + LOGGER.info(String.format("SSL Error: %s", ex.getMessage())); + return; + } + client.onError(ex); LOGGER.log(Level.WARNING, "Error in websocket connection"); ex.printStackTrace(); } diff --git a/src/main/java/gg/archipelago/client/events/ArchipelagoEventListener.java b/src/main/java/dev/koifysh/archipelago/events/ArchipelagoEventListener.java similarity index 55% rename from src/main/java/gg/archipelago/client/events/ArchipelagoEventListener.java rename to src/main/java/dev/koifysh/archipelago/events/ArchipelagoEventListener.java index 3451931..ae75a40 100644 --- a/src/main/java/gg/archipelago/client/events/ArchipelagoEventListener.java +++ b/src/main/java/dev/koifysh/archipelago/events/ArchipelagoEventListener.java @@ -1,8 +1,11 @@ -package gg.archipelago.client.events; +package dev.koifysh.archipelago.events; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +/** + * tag a method with this who's only parameter is a class that extends {@link Event} + */ @Retention(RetentionPolicy.RUNTIME) public @interface ArchipelagoEventListener { } diff --git a/src/main/java/gg/archipelago/client/events/BouncedEvent.java b/src/main/java/dev/koifysh/archipelago/events/BouncedEvent.java similarity index 96% rename from src/main/java/gg/archipelago/client/events/BouncedEvent.java rename to src/main/java/dev/koifysh/archipelago/events/BouncedEvent.java index 235ef71..82754bf 100644 --- a/src/main/java/gg/archipelago/client/events/BouncedEvent.java +++ b/src/main/java/dev/koifysh/archipelago/events/BouncedEvent.java @@ -1,4 +1,4 @@ -package gg.archipelago.client.events; +package dev.koifysh.archipelago.events; import com.google.gson.annotations.SerializedName; diff --git a/src/main/java/gg/archipelago/client/events/CheckedLocationsEvent.java b/src/main/java/dev/koifysh/archipelago/events/CheckedLocationsEvent.java similarity index 86% rename from src/main/java/gg/archipelago/client/events/CheckedLocationsEvent.java rename to src/main/java/dev/koifysh/archipelago/events/CheckedLocationsEvent.java index 57559a2..1a657d3 100644 --- a/src/main/java/gg/archipelago/client/events/CheckedLocationsEvent.java +++ b/src/main/java/dev/koifysh/archipelago/events/CheckedLocationsEvent.java @@ -1,4 +1,4 @@ -package gg.archipelago.client.events; +package dev.koifysh.archipelago.events; import java.util.ArrayList; diff --git a/src/main/java/gg/archipelago/client/events/ConnectionAttemptEvent.java b/src/main/java/dev/koifysh/archipelago/events/ConnectionAttemptEvent.java similarity index 96% rename from src/main/java/gg/archipelago/client/events/ConnectionAttemptEvent.java rename to src/main/java/dev/koifysh/archipelago/events/ConnectionAttemptEvent.java index 0f28139..30d750e 100644 --- a/src/main/java/gg/archipelago/client/events/ConnectionAttemptEvent.java +++ b/src/main/java/dev/koifysh/archipelago/events/ConnectionAttemptEvent.java @@ -1,4 +1,4 @@ -package gg.archipelago.client.events; +package dev.koifysh.archipelago.events; import com.google.gson.Gson; import com.google.gson.JsonElement; diff --git a/src/main/java/gg/archipelago/client/events/ConnectionResultEvent.java b/src/main/java/dev/koifysh/archipelago/events/ConnectionResultEvent.java similarity index 92% rename from src/main/java/gg/archipelago/client/events/ConnectionResultEvent.java rename to src/main/java/dev/koifysh/archipelago/events/ConnectionResultEvent.java index 40a16ff..429b3e4 100644 --- a/src/main/java/gg/archipelago/client/events/ConnectionResultEvent.java +++ b/src/main/java/dev/koifysh/archipelago/events/ConnectionResultEvent.java @@ -1,9 +1,9 @@ -package gg.archipelago.client.events; +package dev.koifysh.archipelago.events; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.internal.Primitives; -import gg.archipelago.client.network.ConnectionResult; +import dev.koifysh.archipelago.network.ConnectionResult; public class ConnectionResultEvent implements Event { diff --git a/src/main/java/gg/archipelago/client/events/DeathLinkEvent.java b/src/main/java/dev/koifysh/archipelago/events/DeathLinkEvent.java similarity index 57% rename from src/main/java/gg/archipelago/client/events/DeathLinkEvent.java rename to src/main/java/dev/koifysh/archipelago/events/DeathLinkEvent.java index 5cd5727..367f736 100644 --- a/src/main/java/gg/archipelago/client/events/DeathLinkEvent.java +++ b/src/main/java/dev/koifysh/archipelago/events/DeathLinkEvent.java @@ -1,5 +1,8 @@ -package gg.archipelago.client.events; +package dev.koifysh.archipelago.events; +/** + * event that is fired whenever you receive a death link from another player. must first enable death links via {@link dev.koifysh.archipelago.helper.DeathLink} + */ public class DeathLinkEvent implements Event { public double time; diff --git a/src/main/java/dev/koifysh/archipelago/events/Event.java b/src/main/java/dev/koifysh/archipelago/events/Event.java new file mode 100644 index 0000000..51ed3a4 --- /dev/null +++ b/src/main/java/dev/koifysh/archipelago/events/Event.java @@ -0,0 +1,4 @@ +package dev.koifysh.archipelago.events; + +public interface Event { +} diff --git a/src/main/java/gg/archipelago/client/events/InvalidPacketEvent.java b/src/main/java/dev/koifysh/archipelago/events/InvalidPacketEvent.java similarity index 94% rename from src/main/java/gg/archipelago/client/events/InvalidPacketEvent.java rename to src/main/java/dev/koifysh/archipelago/events/InvalidPacketEvent.java index 014b653..fd6ba61 100644 --- a/src/main/java/gg/archipelago/client/events/InvalidPacketEvent.java +++ b/src/main/java/dev/koifysh/archipelago/events/InvalidPacketEvent.java @@ -1,4 +1,4 @@ -package gg.archipelago.client.events; +package dev.koifysh.archipelago.events; public class InvalidPacketEvent implements Event { diff --git a/src/main/java/gg/archipelago/client/events/LocationInfoEvent.java b/src/main/java/dev/koifysh/archipelago/events/LocationInfoEvent.java similarity index 72% rename from src/main/java/gg/archipelago/client/events/LocationInfoEvent.java rename to src/main/java/dev/koifysh/archipelago/events/LocationInfoEvent.java index 272a194..95a314d 100644 --- a/src/main/java/gg/archipelago/client/events/LocationInfoEvent.java +++ b/src/main/java/dev/koifysh/archipelago/events/LocationInfoEvent.java @@ -1,6 +1,6 @@ -package gg.archipelago.client.events; +package dev.koifysh.archipelago.events; -import gg.archipelago.client.parts.NetworkItem; +import dev.koifysh.archipelago.parts.NetworkItem; import java.util.ArrayList; diff --git a/src/main/java/dev/koifysh/archipelago/events/PrintJSONEvent.java b/src/main/java/dev/koifysh/archipelago/events/PrintJSONEvent.java new file mode 100644 index 0000000..01f639d --- /dev/null +++ b/src/main/java/dev/koifysh/archipelago/events/PrintJSONEvent.java @@ -0,0 +1,28 @@ +package dev.koifysh.archipelago.events; + +import dev.koifysh.archipelago.Print.APPrint; +import dev.koifysh.archipelago.parts.NetworkItem; + +/** + * event that is fired when the server wishes to send a message to the user. + */ +public class PrintJSONEvent implements Event { + + public APPrint apPrint; + public String type; + public int player; + public NetworkItem item; + + /** + * @param apPrint list of message segments. + * @param type the type of the received message. + * @param player int id of the sending player. + * @param item the network item that is involved with the message. + */ + public PrintJSONEvent(APPrint apPrint, String type, int player, NetworkItem item) { + this.apPrint = apPrint; + this.type = type; + this.player = player; + this.item = item; + } +} diff --git a/src/main/java/gg/archipelago/client/events/ReceiveItemEvent.java b/src/main/java/dev/koifysh/archipelago/events/ReceiveItemEvent.java similarity index 89% rename from src/main/java/gg/archipelago/client/events/ReceiveItemEvent.java rename to src/main/java/dev/koifysh/archipelago/events/ReceiveItemEvent.java index fa72596..a3edf71 100644 --- a/src/main/java/gg/archipelago/client/events/ReceiveItemEvent.java +++ b/src/main/java/dev/koifysh/archipelago/events/ReceiveItemEvent.java @@ -1,6 +1,6 @@ -package gg.archipelago.client.events; +package dev.koifysh.archipelago.events; -import gg.archipelago.client.parts.NetworkItem; +import dev.koifysh.archipelago.parts.NetworkItem; public class ReceiveItemEvent implements Event { diff --git a/src/main/java/gg/archipelago/client/events/RetrievedEvent.java b/src/main/java/dev/koifysh/archipelago/events/RetrievedEvent.java similarity index 97% rename from src/main/java/gg/archipelago/client/events/RetrievedEvent.java rename to src/main/java/dev/koifysh/archipelago/events/RetrievedEvent.java index 24f201c..93b29ad 100644 --- a/src/main/java/gg/archipelago/client/events/RetrievedEvent.java +++ b/src/main/java/dev/koifysh/archipelago/events/RetrievedEvent.java @@ -1,4 +1,4 @@ -package gg.archipelago.client.events; +package dev.koifysh.archipelago.events; import com.google.gson.Gson; import com.google.gson.JsonObject; diff --git a/src/main/java/gg/archipelago/client/events/SetReplyEvent.java b/src/main/java/dev/koifysh/archipelago/events/SetReplyEvent.java similarity index 96% rename from src/main/java/gg/archipelago/client/events/SetReplyEvent.java rename to src/main/java/dev/koifysh/archipelago/events/SetReplyEvent.java index c5fc1b5..ff23305 100644 --- a/src/main/java/gg/archipelago/client/events/SetReplyEvent.java +++ b/src/main/java/dev/koifysh/archipelago/events/SetReplyEvent.java @@ -1,4 +1,4 @@ -package gg.archipelago.client.events; +package dev.koifysh.archipelago.events; import com.google.gson.Gson; import com.google.gson.JsonElement; diff --git a/src/main/java/gg/archipelago/client/helper/DeathLink.java b/src/main/java/dev/koifysh/archipelago/helper/DeathLink.java similarity index 51% rename from src/main/java/gg/archipelago/client/helper/DeathLink.java rename to src/main/java/dev/koifysh/archipelago/helper/DeathLink.java index 9311b8f..4946adc 100644 --- a/src/main/java/gg/archipelago/client/helper/DeathLink.java +++ b/src/main/java/dev/koifysh/archipelago/helper/DeathLink.java @@ -1,34 +1,39 @@ -package gg.archipelago.client.helper; +package dev.koifysh.archipelago.helper; -import gg.archipelago.client.events.DeathLinkEvent; -import gg.archipelago.client.network.client.BouncePacket; -import gg.archipelago.client.network.server.BouncedPacket; +import dev.koifysh.archipelago.network.client.BouncePacket; +import dev.koifysh.archipelago.network.server.BouncedPacket; +import dev.koifysh.archipelago.events.DeathLinkEvent; import java.util.HashMap; -import static gg.archipelago.client.ArchipelagoClient.archipelagoClient; - +import static dev.koifysh.archipelago.Client.client; +/** + * a helper-class for sending and receiving death links. + *
+ * enable death links by calling {@link #setDeathLinkEnabled(boolean)} + */ public class DeathLink { static private double lastDeath = 0; - public static boolean isDeathLink(BouncedPacket bounced) { - return bounced.tags.contains("DeathLink"); - } - public static void receiveDeathLink(BouncedPacket bounced) { try { if ((Double) bounced.data.getOrDefault("time", 0d) == lastDeath) return; DeathLinkEvent dl = new DeathLinkEvent((String)bounced.data.get("source"), (String)bounced.data.get("cause"), (Double)bounced.data.get("time")); - archipelagoClient.getEventManager().callEvent(dl); + client.getEventManager().callEvent(dl); } catch (ClassCastException ex) { System.out.println("Error Receiving DeathLink, possible malformed bounce packet"); } } + /** + * helper for sending a death link bounce packet. you can send these without enabling death link first, but it is frowned upon. + * @param source A String that is the name of the player sending the death link (does not have to be slot name) + * @param cause A String that is the cause of this death. may be empty. + */ public static void SendDeathLink(String source, String cause) { lastDeath = (double)System.currentTimeMillis() / 1000D; @@ -39,13 +44,17 @@ public static void SendDeathLink(String source, String cause) { put("time", lastDeath); put("source",source); }}); - archipelagoClient.sendBounce(deathLinkPacket); + client.sendBounce(deathLinkPacket); } + /** + * Enable or Disable receiving death links. + * @param enabled set to TRUE to enable death links, FALSE to disable. + */ public static void setDeathLinkEnabled(boolean enabled) { if(enabled) - archipelagoClient.addTag("DeathLink"); + client.addTag("DeathLink"); else - archipelagoClient.removeTag("DeathLink"); + client.removeTag("DeathLink"); } } diff --git a/src/main/java/gg/archipelago/client/network/APPacket.java b/src/main/java/dev/koifysh/archipelago/network/APPacket.java similarity index 88% rename from src/main/java/gg/archipelago/client/network/APPacket.java rename to src/main/java/dev/koifysh/archipelago/network/APPacket.java index 641a11b..89d40f6 100644 --- a/src/main/java/gg/archipelago/client/network/APPacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/APPacket.java @@ -1,4 +1,4 @@ -package gg.archipelago.client.network; +package dev.koifysh.archipelago.network; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; diff --git a/src/main/java/gg/archipelago/client/network/APPacketType.java b/src/main/java/dev/koifysh/archipelago/network/APPacketType.java similarity index 96% rename from src/main/java/gg/archipelago/client/network/APPacketType.java rename to src/main/java/dev/koifysh/archipelago/network/APPacketType.java index 3f00654..0d0c14d 100644 --- a/src/main/java/gg/archipelago/client/network/APPacketType.java +++ b/src/main/java/dev/koifysh/archipelago/network/APPacketType.java @@ -1,4 +1,4 @@ -package gg.archipelago.client.network; +package dev.koifysh.archipelago.network; import com.google.gson.annotations.SerializedName; diff --git a/src/main/java/gg/archipelago/client/network/ConnectionResult.java b/src/main/java/dev/koifysh/archipelago/network/ConnectionResult.java similarity index 73% rename from src/main/java/gg/archipelago/client/network/ConnectionResult.java rename to src/main/java/dev/koifysh/archipelago/network/ConnectionResult.java index a681c87..e0f709b 100644 --- a/src/main/java/gg/archipelago/client/network/ConnectionResult.java +++ b/src/main/java/dev/koifysh/archipelago/network/ConnectionResult.java @@ -1,4 +1,4 @@ -package gg.archipelago.client.network; +package dev.koifysh.archipelago.network; public enum ConnectionResult { Success,InvalidSlot, SlotAlreadyTaken, IncompatibleVersion, InvalidPassword diff --git a/src/main/java/dev/koifysh/archipelago/network/DataStorageOperation.java b/src/main/java/dev/koifysh/archipelago/network/DataStorageOperation.java new file mode 100644 index 0000000..2346540 --- /dev/null +++ b/src/main/java/dev/koifysh/archipelago/network/DataStorageOperation.java @@ -0,0 +1,3 @@ +package dev.koifysh.archipelago.network; + + diff --git a/src/main/java/gg/archipelago/client/network/Permission.java b/src/main/java/dev/koifysh/archipelago/network/Permission.java similarity index 84% rename from src/main/java/gg/archipelago/client/network/Permission.java rename to src/main/java/dev/koifysh/archipelago/network/Permission.java index e705083..b8c7c07 100644 --- a/src/main/java/gg/archipelago/client/network/Permission.java +++ b/src/main/java/dev/koifysh/archipelago/network/Permission.java @@ -1,4 +1,4 @@ -package gg.archipelago.client.network; +package dev.koifysh.archipelago.network; public enum Permission { disabled(0b000), diff --git a/src/main/java/gg/archipelago/client/network/RemainingMode.java b/src/main/java/dev/koifysh/archipelago/network/RemainingMode.java similarity index 89% rename from src/main/java/gg/archipelago/client/network/RemainingMode.java rename to src/main/java/dev/koifysh/archipelago/network/RemainingMode.java index ada9cc6..c1fb5df 100644 --- a/src/main/java/gg/archipelago/client/network/RemainingMode.java +++ b/src/main/java/dev/koifysh/archipelago/network/RemainingMode.java @@ -1,4 +1,4 @@ -package gg.archipelago.client.network; +package dev.koifysh.archipelago.network; public enum RemainingMode { enabled, diff --git a/src/main/java/gg/archipelago/client/network/client/BouncePacket.java b/src/main/java/dev/koifysh/archipelago/network/client/BouncePacket.java similarity index 79% rename from src/main/java/gg/archipelago/client/network/client/BouncePacket.java rename to src/main/java/dev/koifysh/archipelago/network/client/BouncePacket.java index 7419fb3..6d822ff 100644 --- a/src/main/java/gg/archipelago/client/network/client/BouncePacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/client/BouncePacket.java @@ -1,10 +1,10 @@ -package gg.archipelago.client.network.client; +package dev.koifysh.archipelago.network.client; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.events.Event; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; +import dev.koifysh.archipelago.events.Event; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; import java.util.HashMap; diff --git a/src/main/java/gg/archipelago/client/network/client/ConnectPacket.java b/src/main/java/dev/koifysh/archipelago/network/client/ConnectPacket.java similarity index 75% rename from src/main/java/gg/archipelago/client/network/client/ConnectPacket.java rename to src/main/java/dev/koifysh/archipelago/network/client/ConnectPacket.java index c312307..99d4b13 100644 --- a/src/main/java/gg/archipelago/client/network/client/ConnectPacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/client/ConnectPacket.java @@ -1,9 +1,9 @@ -package gg.archipelago.client.network.client; +package dev.koifysh.archipelago.network.client; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; -import gg.archipelago.client.parts.Version; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; +import dev.koifysh.archipelago.parts.Version; import java.util.Set; diff --git a/src/main/java/dev/koifysh/archipelago/network/client/GetDataPackagePacket.java b/src/main/java/dev/koifysh/archipelago/network/client/GetDataPackagePacket.java new file mode 100644 index 0000000..267a06d --- /dev/null +++ b/src/main/java/dev/koifysh/archipelago/network/client/GetDataPackagePacket.java @@ -0,0 +1,20 @@ +package dev.koifysh.archipelago.network.client; + +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; + +import java.util.Set; + +public class GetDataPackagePacket extends APPacket { + + Set games; + + public GetDataPackagePacket() { + this(null); + } + + public GetDataPackagePacket(Set games) { + super(APPacketType.GetDataPackage); + this.games = games; + } +} diff --git a/src/main/java/gg/archipelago/client/network/client/GetPacket.java b/src/main/java/dev/koifysh/archipelago/network/client/GetPacket.java similarity index 60% rename from src/main/java/gg/archipelago/client/network/client/GetPacket.java rename to src/main/java/dev/koifysh/archipelago/network/client/GetPacket.java index 3db6fa9..fa10ce1 100644 --- a/src/main/java/gg/archipelago/client/network/client/GetPacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/client/GetPacket.java @@ -1,16 +1,18 @@ -package gg.archipelago.client.network.client; +package dev.koifysh.archipelago.network.client; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; +import dev.koifysh.archipelago.Client; +import dev.koifysh.archipelago.events.RetrievedEvent; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; import java.util.Collection; import java.util.Random; /** * Used to request a single or multiple values from the server's data storage, see the - * {@link gg.archipelago.client.ArchipelagoClient#dataStorageSet(SetPacket) ArchipelagoClient.dataStorageSet()} for how to write values to the data storage. - * A Get package will be answered with a {@link gg.archipelago.client.events.RetrievedEvent RetreivedEvent}. + * {@link Client#dataStorageSet(SetPacket) ArchipelagoClient.dataStorageSet()} for how to write values to the data storage. + * A Get package will be answered with a {@link RetrievedEvent RetreivedEvent}. */ public class GetPacket extends APPacket { diff --git a/src/main/java/gg/archipelago/client/network/client/LocationChecks.java b/src/main/java/dev/koifysh/archipelago/network/client/LocationChecks.java similarity index 67% rename from src/main/java/gg/archipelago/client/network/client/LocationChecks.java rename to src/main/java/dev/koifysh/archipelago/network/client/LocationChecks.java index b4a46db..e6bf674 100644 --- a/src/main/java/gg/archipelago/client/network/client/LocationChecks.java +++ b/src/main/java/dev/koifysh/archipelago/network/client/LocationChecks.java @@ -1,8 +1,8 @@ -package gg.archipelago.client.network.client; +package dev.koifysh.archipelago.network.client; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; import java.util.HashSet; import java.util.Set; diff --git a/src/main/java/gg/archipelago/client/network/client/LocationScouts.java b/src/main/java/dev/koifysh/archipelago/network/client/LocationScouts.java similarity index 65% rename from src/main/java/gg/archipelago/client/network/client/LocationScouts.java rename to src/main/java/dev/koifysh/archipelago/network/client/LocationScouts.java index 37a9f4b..e099785 100644 --- a/src/main/java/gg/archipelago/client/network/client/LocationScouts.java +++ b/src/main/java/dev/koifysh/archipelago/network/client/LocationScouts.java @@ -1,7 +1,7 @@ -package gg.archipelago.client.network.client; +package dev.koifysh.archipelago.network.client; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; import java.util.ArrayList; diff --git a/src/main/java/gg/archipelago/client/network/client/SayPacket.java b/src/main/java/dev/koifysh/archipelago/network/client/SayPacket.java similarity index 62% rename from src/main/java/gg/archipelago/client/network/client/SayPacket.java rename to src/main/java/dev/koifysh/archipelago/network/client/SayPacket.java index 33d5cd4..1d53ec8 100644 --- a/src/main/java/gg/archipelago/client/network/client/SayPacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/client/SayPacket.java @@ -1,8 +1,8 @@ -package gg.archipelago.client.network.client; +package dev.koifysh.archipelago.network.client; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; public class SayPacket extends APPacket { diff --git a/src/main/java/gg/archipelago/client/network/client/SetNotifyPacket.java b/src/main/java/dev/koifysh/archipelago/network/client/SetNotifyPacket.java similarity index 68% rename from src/main/java/gg/archipelago/client/network/client/SetNotifyPacket.java rename to src/main/java/dev/koifysh/archipelago/network/client/SetNotifyPacket.java index 868bf75..aa7ca67 100644 --- a/src/main/java/gg/archipelago/client/network/client/SetNotifyPacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/client/SetNotifyPacket.java @@ -1,7 +1,7 @@ -package gg.archipelago.client.network.client; +package dev.koifysh.archipelago.network.client; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; import java.util.Collection; diff --git a/src/main/java/gg/archipelago/client/network/client/SetPacket.java b/src/main/java/dev/koifysh/archipelago/network/client/SetPacket.java similarity index 92% rename from src/main/java/gg/archipelago/client/network/client/SetPacket.java rename to src/main/java/dev/koifysh/archipelago/network/client/SetPacket.java index 514c46a..d4264c6 100644 --- a/src/main/java/gg/archipelago/client/network/client/SetPacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/client/SetPacket.java @@ -1,9 +1,9 @@ -package gg.archipelago.client.network.client; +package dev.koifysh.archipelago.network.client; -import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; +import dev.koifysh.archipelago.events.SetReplyEvent; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; import java.util.ArrayList; import java.util.Random; @@ -23,7 +23,7 @@ public class SetPacket extends APPacket { public Object defaultValue; /** - * If true, the server will send a {@link gg.archipelago.client.events.SetReplyEvent SetReplyEvent} response back to the client. + * If true, the server will send a {@link SetReplyEvent SetReplyEvent} response back to the client. */ @SerializedName("want_reply") public boolean want_reply = false; @@ -96,7 +96,7 @@ private static class DataStorageOperation { */ public enum Operation { /** - * Sets the current value of the key on the server to the value given in {@link gg.archipelago.client.network.client.SetPacket#addDataStorageOperation addDataStorageOperation(Operation, Value)}. + * Sets the current value of the key on the server to the value given in {@link SetPacket#addDataStorageOperation addDataStorageOperation(Operation, Value)}. */ @SerializedName("replace") REPLACE, diff --git a/src/main/java/gg/archipelago/client/network/client/StatusUpdatePacket.java b/src/main/java/dev/koifysh/archipelago/network/client/StatusUpdatePacket.java similarity index 52% rename from src/main/java/gg/archipelago/client/network/client/StatusUpdatePacket.java rename to src/main/java/dev/koifysh/archipelago/network/client/StatusUpdatePacket.java index 7a99390..32320d8 100644 --- a/src/main/java/gg/archipelago/client/network/client/StatusUpdatePacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/client/StatusUpdatePacket.java @@ -1,8 +1,8 @@ -package gg.archipelago.client.network.client; +package dev.koifysh.archipelago.network.client; -import gg.archipelago.client.ClientStatus; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; +import dev.koifysh.archipelago.ClientStatus; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; public class StatusUpdatePacket extends APPacket { diff --git a/src/main/java/dev/koifysh/archipelago/network/client/SyncPacket.java b/src/main/java/dev/koifysh/archipelago/network/client/SyncPacket.java new file mode 100644 index 0000000..940b259 --- /dev/null +++ b/src/main/java/dev/koifysh/archipelago/network/client/SyncPacket.java @@ -0,0 +1,12 @@ +package dev.koifysh.archipelago.network.client; + +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; + +public class SyncPacket extends APPacket { + + + public SyncPacket() { + super(APPacketType.Sync); + } +} diff --git a/src/main/java/gg/archipelago/client/network/server/BouncedPacket.java b/src/main/java/dev/koifysh/archipelago/network/server/BouncedPacket.java similarity index 79% rename from src/main/java/gg/archipelago/client/network/server/BouncedPacket.java rename to src/main/java/dev/koifysh/archipelago/network/server/BouncedPacket.java index dcaef8f..6c744ba 100644 --- a/src/main/java/gg/archipelago/client/network/server/BouncedPacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/server/BouncedPacket.java @@ -1,8 +1,8 @@ -package gg.archipelago.client.network.server; +package dev.koifysh.archipelago.network.server; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; import java.util.HashMap; import java.util.HashSet; diff --git a/src/main/java/gg/archipelago/client/network/server/ConnectUpdatePacket.java b/src/main/java/dev/koifysh/archipelago/network/server/ConnectUpdatePacket.java similarity index 64% rename from src/main/java/gg/archipelago/client/network/server/ConnectUpdatePacket.java rename to src/main/java/dev/koifysh/archipelago/network/server/ConnectUpdatePacket.java index 7b05468..2871d70 100644 --- a/src/main/java/gg/archipelago/client/network/server/ConnectUpdatePacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/server/ConnectUpdatePacket.java @@ -1,8 +1,8 @@ -package gg.archipelago.client.network.server; +package dev.koifysh.archipelago.network.server; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; import java.util.Set; diff --git a/src/main/java/gg/archipelago/client/network/server/ConnectedPacket.java b/src/main/java/dev/koifysh/archipelago/network/server/ConnectedPacket.java similarity index 63% rename from src/main/java/gg/archipelago/client/network/server/ConnectedPacket.java rename to src/main/java/dev/koifysh/archipelago/network/server/ConnectedPacket.java index 02e7c90..9049c49 100644 --- a/src/main/java/gg/archipelago/client/network/server/ConnectedPacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/server/ConnectedPacket.java @@ -1,11 +1,13 @@ -package gg.archipelago.client.network.server; +package dev.koifysh.archipelago.network.server; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; -import gg.archipelago.client.parts.NetworkPlayer; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; +import dev.koifysh.archipelago.parts.NetworkPlayer; +import dev.koifysh.archipelago.parts.NetworkSlot; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; public class ConnectedPacket extends APPacket { @@ -20,6 +22,8 @@ public class ConnectedPacket extends APPacket { public HashSet missingLocations = new HashSet<>(); @SerializedName("checked_locations") public HashSet checkedLocations = new HashSet<>(); + @SerializedName("slot_info") + public HashMap slotInfo; public ConnectedPacket() { super(APPacketType.Connected); diff --git a/src/main/java/gg/archipelago/client/network/server/ConnectionRefusedPacket.java b/src/main/java/dev/koifysh/archipelago/network/server/ConnectionRefusedPacket.java similarity index 56% rename from src/main/java/gg/archipelago/client/network/server/ConnectionRefusedPacket.java rename to src/main/java/dev/koifysh/archipelago/network/server/ConnectionRefusedPacket.java index ff60fef..0e91e4f 100644 --- a/src/main/java/gg/archipelago/client/network/server/ConnectionRefusedPacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/server/ConnectionRefusedPacket.java @@ -1,9 +1,9 @@ -package gg.archipelago.client.network.server; +package dev.koifysh.archipelago.network.server; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; -import gg.archipelago.client.network.ConnectionResult; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; +import dev.koifysh.archipelago.network.ConnectionResult; public class ConnectionRefusedPacket extends APPacket { diff --git a/src/main/java/gg/archipelago/client/network/server/InvalidPacket.java b/src/main/java/dev/koifysh/archipelago/network/server/InvalidPacket.java similarity index 70% rename from src/main/java/gg/archipelago/client/network/server/InvalidPacket.java rename to src/main/java/dev/koifysh/archipelago/network/server/InvalidPacket.java index 7179ba6..f5a855e 100644 --- a/src/main/java/gg/archipelago/client/network/server/InvalidPacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/server/InvalidPacket.java @@ -1,8 +1,8 @@ -package gg.archipelago.client.network.server; +package dev.koifysh.archipelago.network.server; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; public class InvalidPacket extends APPacket { diff --git a/src/main/java/dev/koifysh/archipelago/network/server/JsonPrintPacket.java b/src/main/java/dev/koifysh/archipelago/network/server/JsonPrintPacket.java new file mode 100644 index 0000000..6c7b874 --- /dev/null +++ b/src/main/java/dev/koifysh/archipelago/network/server/JsonPrintPacket.java @@ -0,0 +1,13 @@ +package dev.koifysh.archipelago.network.server; + +import dev.koifysh.archipelago.Print.APPrintPart; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; + +public class JsonPrintPacket extends APPacket { + APPrintPart[] parts; + + public JsonPrintPacket() { + super(APPacketType.PrintJSON); + } +} diff --git a/src/main/java/gg/archipelago/client/network/server/LocationInfoPacket.java b/src/main/java/dev/koifysh/archipelago/network/server/LocationInfoPacket.java similarity index 59% rename from src/main/java/gg/archipelago/client/network/server/LocationInfoPacket.java rename to src/main/java/dev/koifysh/archipelago/network/server/LocationInfoPacket.java index efbd2e7..309ca7b 100644 --- a/src/main/java/gg/archipelago/client/network/server/LocationInfoPacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/server/LocationInfoPacket.java @@ -1,9 +1,9 @@ -package gg.archipelago.client.network.server; +package dev.koifysh.archipelago.network.server; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; -import gg.archipelago.client.parts.NetworkItem; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; +import dev.koifysh.archipelago.parts.NetworkItem; import java.util.ArrayList; diff --git a/src/main/java/gg/archipelago/client/network/server/PrintPacket.java b/src/main/java/dev/koifysh/archipelago/network/server/PrintPacket.java similarity index 64% rename from src/main/java/gg/archipelago/client/network/server/PrintPacket.java rename to src/main/java/dev/koifysh/archipelago/network/server/PrintPacket.java index 45a5a86..8c7a9ed 100644 --- a/src/main/java/gg/archipelago/client/network/server/PrintPacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/server/PrintPacket.java @@ -1,8 +1,8 @@ -package gg.archipelago.client.network.server; +package dev.koifysh.archipelago.network.server; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; public class PrintPacket extends APPacket { diff --git a/src/main/java/gg/archipelago/client/network/server/ReceivedItemsPacket.java b/src/main/java/dev/koifysh/archipelago/network/server/ReceivedItemsPacket.java similarity index 63% rename from src/main/java/gg/archipelago/client/network/server/ReceivedItemsPacket.java rename to src/main/java/dev/koifysh/archipelago/network/server/ReceivedItemsPacket.java index 08071ca..a8925e3 100644 --- a/src/main/java/gg/archipelago/client/network/server/ReceivedItemsPacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/server/ReceivedItemsPacket.java @@ -1,9 +1,9 @@ -package gg.archipelago.client.network.server; +package dev.koifysh.archipelago.network.server; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; -import gg.archipelago.client.parts.NetworkItem; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; +import dev.koifysh.archipelago.parts.NetworkItem; import java.util.ArrayList; diff --git a/src/main/java/gg/archipelago/client/network/server/RetrievedPacket.java b/src/main/java/dev/koifysh/archipelago/network/server/RetrievedPacket.java similarity index 69% rename from src/main/java/gg/archipelago/client/network/server/RetrievedPacket.java rename to src/main/java/dev/koifysh/archipelago/network/server/RetrievedPacket.java index 34ecbbe..7033406 100644 --- a/src/main/java/gg/archipelago/client/network/server/RetrievedPacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/server/RetrievedPacket.java @@ -1,8 +1,8 @@ -package gg.archipelago.client.network.server; +package dev.koifysh.archipelago.network.server; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; import java.util.HashMap; diff --git a/src/main/java/gg/archipelago/client/network/server/RoomInfoPacket.java b/src/main/java/dev/koifysh/archipelago/network/server/RoomInfoPacket.java similarity index 64% rename from src/main/java/gg/archipelago/client/network/server/RoomInfoPacket.java rename to src/main/java/dev/koifysh/archipelago/network/server/RoomInfoPacket.java index 49020ba..46f2b88 100644 --- a/src/main/java/gg/archipelago/client/network/server/RoomInfoPacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/server/RoomInfoPacket.java @@ -1,11 +1,10 @@ -package gg.archipelago.client.network.server; +package dev.koifysh.archipelago.network.server; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; -import gg.archipelago.client.network.RemainingMode; -import gg.archipelago.client.parts.NetworkPlayer; -import gg.archipelago.client.parts.Version; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; +import dev.koifysh.archipelago.parts.NetworkPlayer; +import dev.koifysh.archipelago.parts.Version; import java.util.ArrayList; import java.util.HashMap; @@ -14,15 +13,14 @@ public class RoomInfoPacket extends APPacket { public Version version; + @SerializedName("generator_version") + public Version generatorVersion; + public String[] tags; public boolean password; - @SerializedName("forfeit_mode") - public RemainingMode.ForfeitMode forfeitMode; - - @SerializedName("remaining_mode") - public RemainingMode remainingMode; + public HashMap permissions; @SerializedName("hint_cost") public int hintCost; @@ -35,8 +33,9 @@ public class RoomInfoPacket extends APPacket { @SerializedName("games") public ArrayList games = new ArrayList<>(); - @SerializedName("datapackage_versions") - public HashMap datapackageVersions = new HashMap<>(); + + @SerializedName("datapackage_checksums") + public HashMap datapackageChecksums = new HashMap<>(); @SerializedName("seed_name") public String seedName; @@ -44,9 +43,6 @@ public class RoomInfoPacket extends APPacket { @SerializedName("time") public double time; - @SerializedName("permissions") - public HashMap permissions; - public RoomInfoPacket() { super(APPacketType.RoomInfo); } diff --git a/src/main/java/gg/archipelago/client/network/server/RoomUpdatePacket.java b/src/main/java/dev/koifysh/archipelago/network/server/RoomUpdatePacket.java similarity index 74% rename from src/main/java/gg/archipelago/client/network/server/RoomUpdatePacket.java rename to src/main/java/dev/koifysh/archipelago/network/server/RoomUpdatePacket.java index 183a76c..10b677f 100644 --- a/src/main/java/gg/archipelago/client/network/server/RoomUpdatePacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/server/RoomUpdatePacket.java @@ -1,11 +1,11 @@ -package gg.archipelago.client.network.server; +package dev.koifysh.archipelago.network.server; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; -import gg.archipelago.client.network.RemainingMode; -import gg.archipelago.client.parts.NetworkPlayer; -import gg.archipelago.client.parts.Version; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; +import dev.koifysh.archipelago.network.RemainingMode; +import dev.koifysh.archipelago.parts.NetworkPlayer; +import dev.koifysh.archipelago.parts.Version; import java.util.ArrayList; import java.util.HashMap; @@ -48,8 +48,8 @@ public class RoomUpdatePacket extends APPacket { @SerializedName("datapackage_version") public int datapackageVersion; - @SerializedName("datapackage_versions") - public HashMap datapackageVersions = new HashMap<>(); + @SerializedName("datapackage_checksums") + public HashMap datapackageChecksums = new HashMap<>(); public RoomUpdatePacket() { super(APPacketType.RoomUpdate); diff --git a/src/main/java/gg/archipelago/client/network/server/SetReplyPacket.java b/src/main/java/dev/koifysh/archipelago/network/server/SetReplyPacket.java similarity index 73% rename from src/main/java/gg/archipelago/client/network/server/SetReplyPacket.java rename to src/main/java/dev/koifysh/archipelago/network/server/SetReplyPacket.java index 3dc9efd..dde6829 100644 --- a/src/main/java/gg/archipelago/client/network/server/SetReplyPacket.java +++ b/src/main/java/dev/koifysh/archipelago/network/server/SetReplyPacket.java @@ -1,8 +1,8 @@ -package gg.archipelago.client.network.server; +package dev.koifysh.archipelago.network.server; import com.google.gson.annotations.SerializedName; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; +import dev.koifysh.archipelago.network.APPacket; +import dev.koifysh.archipelago.network.APPacketType; public class SetReplyPacket extends APPacket { @SerializedName("key") diff --git a/src/main/java/dev/koifysh/archipelago/parts/DataPackage.java b/src/main/java/dev/koifysh/archipelago/parts/DataPackage.java new file mode 100644 index 0000000..85a3573 --- /dev/null +++ b/src/main/java/dev/koifysh/archipelago/parts/DataPackage.java @@ -0,0 +1,61 @@ +package dev.koifysh.archipelago.parts; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class DataPackage implements Serializable { + + @Expose + @SerializedName("games") + HashMap games = new HashMap<>(); + + public String uuid = UUID.randomUUID().toString(); + + public String getItem(long itemID, String game) { + if (!games.containsKey(game)) + return String.format("Unknown Item [%d] for [%s]", itemID, game); + + if(!games.get(game).itemNameToId.containsValue(itemID)) + return String.format("Unknown Item [%d] for [%s]", itemID, game); + + return games.get(game).getItem(itemID); + } + + public String getLocation(long locationID, String game) { + if (!games.containsKey(game)) + return String.format("Unknown Location [%d] for [%s]", locationID, game); + + if (!games.get(game).locationNameToId.containsValue(locationID)) + return String.format("Unknown Location [%d] for [%s]", locationID, game); + + return games.get(game).getLocation(locationID); + } + + public Map getChecksums() { + HashMap checksums = new HashMap<>(); + games.forEach((key, value) -> checksums.put(key, value.checksum)); + return checksums; + } + + public HashMap getGames() { + return games; + } + + public Game getGame(String game) { + return games.get(game); + } + + + public String getUUID() { + return uuid; + } + + public void update(DataPackage newData) { + games.putAll(newData.getGames()); + } +} diff --git a/src/main/java/dev/koifysh/archipelago/parts/Game.java b/src/main/java/dev/koifysh/archipelago/parts/Game.java new file mode 100644 index 0000000..0d52bc4 --- /dev/null +++ b/src/main/java/dev/koifysh/archipelago/parts/Game.java @@ -0,0 +1,48 @@ +package dev.koifysh.archipelago.parts; + +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +public class Game implements Serializable { + + + + @SerializedName("checksum") + public String checksum; + + @SerializedName("item_name_to_id") + public HashMap itemNameToId = new HashMap<>(); + + @SerializedName("location_name_to_id") + public HashMap locationNameToId = new HashMap<>(); + + private final HashMap idToItem = new HashMap<>(); + private final HashMap idToLocation = new HashMap<>(); + + public String getItem(long itemID) { + if(idToItem.isEmpty()) { + for (Map.Entry entry : itemNameToId.entrySet()) { + idToItem.put(entry.getValue(), entry.getKey()); + } + } + if (!idToItem.containsKey(itemID)) + return String.format("Unknown Item [%d]", itemID); + + return idToItem.get(itemID); + } + + public String getLocation(long locationID) { + if(idToLocation.isEmpty()) { + for (Map.Entry entry : locationNameToId.entrySet()) { + idToLocation.put(entry.getValue(), entry.getKey()); + } + } + if (!idToLocation.containsKey(locationID)) + return String.format("Unknown Location [%d]", locationID); + + return idToLocation.get(locationID); + } +} diff --git a/src/main/java/gg/archipelago/client/parts/NetworkItem.java b/src/main/java/dev/koifysh/archipelago/parts/NetworkItem.java similarity index 96% rename from src/main/java/gg/archipelago/client/parts/NetworkItem.java rename to src/main/java/dev/koifysh/archipelago/parts/NetworkItem.java index 36a3876..cdbcffe 100644 --- a/src/main/java/gg/archipelago/client/parts/NetworkItem.java +++ b/src/main/java/dev/koifysh/archipelago/parts/NetworkItem.java @@ -1,4 +1,4 @@ -package gg.archipelago.client.parts; +package dev.koifysh.archipelago.parts; import com.google.gson.annotations.SerializedName; diff --git a/src/main/java/gg/archipelago/client/parts/NetworkPlayer.java b/src/main/java/dev/koifysh/archipelago/parts/NetworkPlayer.java similarity index 88% rename from src/main/java/gg/archipelago/client/parts/NetworkPlayer.java rename to src/main/java/dev/koifysh/archipelago/parts/NetworkPlayer.java index 6af4d80..bd5e511 100644 --- a/src/main/java/gg/archipelago/client/parts/NetworkPlayer.java +++ b/src/main/java/dev/koifysh/archipelago/parts/NetworkPlayer.java @@ -1,4 +1,4 @@ -package gg.archipelago.client.parts; +package dev.koifysh.archipelago.parts; public class NetworkPlayer { public int team; diff --git a/src/main/java/dev/koifysh/archipelago/parts/NetworkSlot.java b/src/main/java/dev/koifysh/archipelago/parts/NetworkSlot.java new file mode 100644 index 0000000..bd494f4 --- /dev/null +++ b/src/main/java/dev/koifysh/archipelago/parts/NetworkSlot.java @@ -0,0 +1,41 @@ +package dev.koifysh.archipelago.parts; + +import com.google.gson.annotations.SerializedName; + +public class NetworkSlot { + + @SerializedName("name") + public String name; + + @SerializedName("game") + public String game; + + @SerializedName("type") + public int type; + + + /** + * Flags that will tell you more about the slot type.
+ * {@link #SPECTATOR}, + * {@link #PLAYER}, + * {@link #GROUP} + */ + public static class flags { + + /** + * If set, indicates the slot is a spectator + */ + public final static int SPECTATOR = 0b001; + + /** + * If set, indicates the slot is a player + */ + public final static int PLAYER = 0b010; + + /** + * If set, indicates the slot is a group. + */ + public final static int GROUP = 0b100; + + } +} diff --git a/src/main/java/gg/archipelago/client/parts/Version.java b/src/main/java/dev/koifysh/archipelago/parts/Version.java similarity index 89% rename from src/main/java/gg/archipelago/client/parts/Version.java rename to src/main/java/dev/koifysh/archipelago/parts/Version.java index 59d27ba..eed4df7 100644 --- a/src/main/java/gg/archipelago/client/parts/Version.java +++ b/src/main/java/dev/koifysh/archipelago/parts/Version.java @@ -1,4 +1,4 @@ -package gg.archipelago.client.parts; +package dev.koifysh.archipelago.parts; import com.google.gson.annotations.SerializedName; diff --git a/src/main/java/gg/archipelago/client/ItemFlags.java b/src/main/java/gg/archipelago/client/ItemFlags.java deleted file mode 100644 index c2d3e02..0000000 --- a/src/main/java/gg/archipelago/client/ItemFlags.java +++ /dev/null @@ -1,14 +0,0 @@ -package gg.archipelago.client; - -public class ItemFlags { - - //Indicates you get items sent from other worlds. - public static final int SEND_ITEMS = 0b001; - - //send your own items to you (remote items game) - public static final int SEND_OWN_ITEMS = 0b010; - - //send starting inventory upon connect - public static final int SEND_STARTING_INVENTORY = 0b100; - -} diff --git a/src/main/java/gg/archipelago/client/events/Event.java b/src/main/java/gg/archipelago/client/events/Event.java deleted file mode 100644 index 0f1c503..0000000 --- a/src/main/java/gg/archipelago/client/events/Event.java +++ /dev/null @@ -1,4 +0,0 @@ -package gg.archipelago.client.events; - -public interface Event { -} diff --git a/src/main/java/gg/archipelago/client/network/DataStorageOperation.java b/src/main/java/gg/archipelago/client/network/DataStorageOperation.java deleted file mode 100644 index d8251b0..0000000 --- a/src/main/java/gg/archipelago/client/network/DataStorageOperation.java +++ /dev/null @@ -1,3 +0,0 @@ -package gg.archipelago.client.network; - - diff --git a/src/main/java/gg/archipelago/client/network/client/GetDataPackagePacket.java b/src/main/java/gg/archipelago/client/network/client/GetDataPackagePacket.java deleted file mode 100644 index 2d6c77f..0000000 --- a/src/main/java/gg/archipelago/client/network/client/GetDataPackagePacket.java +++ /dev/null @@ -1,20 +0,0 @@ -package gg.archipelago.client.network.client; - -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; - -import java.util.Set; - -public class GetDataPackagePacket extends APPacket { - - Set exclusions; - - public GetDataPackagePacket() { - this(null); - } - - public GetDataPackagePacket(Set exclusions) { - super(APPacketType.GetDataPackage); - this.exclusions = exclusions; - } -} diff --git a/src/main/java/gg/archipelago/client/network/client/SyncPacket.java b/src/main/java/gg/archipelago/client/network/client/SyncPacket.java deleted file mode 100644 index 378c985..0000000 --- a/src/main/java/gg/archipelago/client/network/client/SyncPacket.java +++ /dev/null @@ -1,12 +0,0 @@ -package gg.archipelago.client.network.client; - -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; - -public class SyncPacket extends APPacket { - - - public SyncPacket() { - super(APPacketType.Sync); - } -} diff --git a/src/main/java/gg/archipelago/client/network/server/JsonPrintPacket.java b/src/main/java/gg/archipelago/client/network/server/JsonPrintPacket.java deleted file mode 100644 index 123c891..0000000 --- a/src/main/java/gg/archipelago/client/network/server/JsonPrintPacket.java +++ /dev/null @@ -1,13 +0,0 @@ -package gg.archipelago.client.network.server; - -import gg.archipelago.client.Print.APPrintPart; -import gg.archipelago.client.network.APPacket; -import gg.archipelago.client.network.APPacketType; - -public class JsonPrintPacket extends APPacket { - APPrintPart[] parts; - - public JsonPrintPacket() { - super(APPacketType.PrintJSON); - } -} diff --git a/src/main/java/gg/archipelago/client/parts/DataPackage.java b/src/main/java/gg/archipelago/client/parts/DataPackage.java deleted file mode 100644 index 27a6af3..0000000 --- a/src/main/java/gg/archipelago/client/parts/DataPackage.java +++ /dev/null @@ -1,112 +0,0 @@ -package gg.archipelago.client.parts; - -import com.google.gson.annotations.Expose; -import com.google.gson.annotations.SerializedName; - -import java.io.Serializable; -import java.util.*; - -public class DataPackage implements Serializable { - - @Expose - @SerializedName("games") - HashMap games = new HashMap<>(); - - @Expose - @SerializedName("version") - int version = -1; - - HashMap itemIdToName = new HashMap<>(); - - HashMap locationIdToName = new HashMap<>(); - - public String uuid = UUID.randomUUID().toString(); - - public String getItem(long itemID) { - if(!itemIdToName.containsKey(itemID)) { - return String.format("Unknown Item [%d]", itemID); - } - - return itemIdToName.get(itemID); - } - - public String getLocation(long locationID) { - if(!locationIdToName.containsKey(locationID)) - return String.format("Unknown Location [%d]", locationID); - - return locationIdToName.get(locationID); - } - - public Map getVersions() { - HashMap versions = new HashMap<>(); - games.forEach((key, value) -> versions.put(key, value.version)); - return versions; - } - - public HashMap getGames() { - return games; - } - - public HashMap getItems() { - return itemIdToName; - } - - public HashMap getItemsForGame(String game) { - HashMap ret = new HashMap<>(); - for (Map.Entry gameEntry : games.entrySet()) { - if(!gameEntry.getKey().equals(game)) continue; - for (Map.Entry items : gameEntry.getValue().itemNameToId.entrySet()) { - ret.put(items.getValue(), items.getKey()); - } - } - return ret; - } - - public HashMap getLocations() { - return locationIdToName; - } - - public HashMap getLocationsForGame(String game) { - HashMap ret = new HashMap<>(); - for (Map.Entry gameEntry : games.entrySet()) { - if(!gameEntry.getKey().equals(game)) continue; - for (Map.Entry locations : gameEntry.getValue().locationNameToId.entrySet()) { - ret.put(locations.getValue(), locations.getKey()); - } - } - return ret; - } - - public int getVersion() { - return version; - } - - public String getUUID() { - return uuid; - } - - public void update(DataPackage newData) { - games.putAll(newData.getGames()); - buildItemsMap(); - buildLocationsMap(); - version = newData.version; - } - - private void buildItemsMap() { - for (Map.Entry gameEntry : games.entrySet()) { - for (Map.Entry items : gameEntry.getValue().itemNameToId.entrySet()) { - itemIdToName.put(items.getValue(), items.getKey()); - } - } - } - - private void buildLocationsMap() { - locationIdToName.clear(); - - for (Map.Entry gameEntry : games.entrySet()) { - for (Map.Entry locations : gameEntry.getValue().locationNameToId.entrySet()) { - locationIdToName.put(locations.getValue(), locations.getKey()); - } - } - } -} diff --git a/src/main/java/gg/archipelago/client/parts/Game.java b/src/main/java/gg/archipelago/client/parts/Game.java deleted file mode 100644 index 1c4a62c..0000000 --- a/src/main/java/gg/archipelago/client/parts/Game.java +++ /dev/null @@ -1,21 +0,0 @@ -package gg.archipelago.client.parts; - -import com.google.gson.annotations.SerializedName; - -import java.io.Serializable; -import java.util.HashMap; - -public class Game implements Serializable { - - @SerializedName("version") - public int version; - - @SerializedName("hash") - public String hash; - - @SerializedName("item_name_to_id") - public HashMap itemNameToId = new HashMap<>(); - - @SerializedName("location_name_to_id") - public HashMap locationNameToId = new HashMap<>(); -}