diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 5445f874..3f8b8d6d 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,12 +1,2 @@ -# These are supported funding model platforms - -github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: songoda -open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username custom: [ 'https://songoda.com/songoda+' ] diff --git a/.github/actions/setup_project_workspace/action.yml b/.github/actions/setup_project_workspace/action.yml new file mode 100644 index 00000000..3ac7ab1c --- /dev/null +++ b/.github/actions/setup_project_workspace/action.yml @@ -0,0 +1,23 @@ +name: Prepare Workspace +description: Prepares the workspace for compilation + +inputs: + maven_username: + required: false + description: The username to use for the Maven server + maven_password: + required: false + description: The password to use for the Maven server + +runs: + using: composite + steps: + - uses: songoda/GH-Commons/.github/actions/setup_workspace@master + with: + maven_username: ${{ inputs.maven_username }} + maven_password: ${{ inputs.maven_password }} + + - uses: SpraxDev/Action-SpigotMC@v4 + with: + versions: 1.18.1, 1.18.2, 1.19, 1.19.2, 1.19.3, 1.19.4 + remapped: true diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..e6b3ad7c --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,13 @@ +version: 2 +updates: + - package-ecosystem: maven + directory: / + target-branch: development + schedule: + interval: monthly + + - package-ecosystem: github-actions + directory: / + target-branch: development + schedule: + interval: monthly diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..b7726e54 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,93 @@ +name: Build + +on: + push: + branches: [ master, development, development-v3 ] + tags: + - 'v*' + pull_request: + types: [ opened, synchronize, reopened ] + +permissions: read-all + +env: + DEPLOYMENT_POM_PATH: ./Core/dependency-reduced-pom.xml + DEPLOYMENT_ARTIFACT_DIR: ./Core/target + DEPLOYMENT_ARTIFACT_SELECTOR: SongodaCore-*.jar + +jobs: + Tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Prepare Workspace + uses: ./.github/actions/setup_project_workspace + + - name: Run tests + run: mvn -B clean test + + Build: + name: Build + Deploy + runs-on: ubuntu-latest + needs: [ Tests ] + + steps: + - uses: actions/checkout@v2 + - name: Prepare Workspace + uses: ./.github/actions/setup_project_workspace + with: + maven_username: ${{ secrets.MAVEN_REPO_USERNAME }} + maven_password: ${{ secrets.MAVEN_REPO_PASSWORD }} + + - name: Set project version + uses: songoda/GH-Commons/.github/actions/maven_set_project_version@master + with: + append_snapshot: ${{ github.ref_type == 'tag' && 'false' || 'true' }} + version: ${{ github.ref_type == 'tag' && github.ref_name || '' }} + + - name: Build with Maven + run: mvn -B -Duser.name="GitHub Actions on $GITHUB_REPOSITORY (id=$GITHUB_RUN_ID)" -DskipTests clean package + + - name: Sign jar archives + uses: songoda/GH-Commons/.github/actions/sign_jars@master + with: + jar_file_selector: ${{ env.DEPLOYMENT_ARTIFACT_DIR }}/${{ env.DEPLOYMENT_ARTIFACT_SELECTOR }} + keystore_gpg_encrypted: ${{ secrets.JARSIGNER_KEYSTORE_ENCRYPTED }} + keystore_gpg_password: ${{ secrets.JARSIGNER_KEYSTORE_ENCRYPTED_PASSWORD }} + keystore_password: ${{ secrets.JARSIGNER_KEYSTORE_PASSWORD }} + + - name: 'Upload Build Artifacts' + uses: actions/upload-artifact@v3 + with: + name: ${{ github.event.repository.name }} + path: ${{ env.DEPLOYMENT_ARTIFACT_DIR }}/${{ env.DEPLOYMENT_ARTIFACT_SELECTOR }} + + - name: Deploy to Maven repo + uses: songoda/GH-Commons/.github/actions/maven_deploy@master + with: + repository_url: ${{ secrets.MAVEN_REPO_URL_RELEASES }} + repository_url_snapshots: ${{ secrets.MAVEN_REPO_URL_SNAPSHOTS }} + maven_pom_path: ${{ env.DEPLOYMENT_POM_PATH }} + maven_out_dir: ${{ env.DEPLOYMENT_ARTIFACT_DIR }} + - name: Deploy parent pom.xml to Maven repo + uses: songoda/GH-Commons/.github/actions/maven_deploy@master + with: + repository_url: ${{ secrets.MAVEN_REPO_URL_RELEASES }} + repository_url_snapshots: ${{ secrets.MAVEN_REPO_URL_SNAPSHOTS }} + only_deploy_pom: true + maven_out_dir: ${{ env.DEPLOYMENT_ARTIFACT_DIR }} + + discord_webhook: + name: Send Discord Webhook + runs-on: ubuntu-latest + + needs: [ Tests, Build ] + if: ${{ always() && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/development' || github.ref_type == 'tag') }} + + steps: + - uses: actions/checkout@v2 + - name: Notify Webhook + uses: songoda/GH-Commons/.github/actions/discord_send_job_results@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + webhook_url: ${{ secrets.DISCORD_BUILD_STATUS_WEBHOOK }} diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000..a81cca15 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,36 @@ +name: CodeQL + +on: + push: + branches: [ master, development ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ master, development ] + schedule: + - cron: 30 18 * * 4 + +permissions: + actions: read + contents: read + security-events: write + +jobs: + Analyze: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: java + + - name: Prepare Workspace + uses: ./.github/actions/setup_project_workspace + + - name: Build with Maven + run: mvn -B -DskipTests clean package + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml deleted file mode 100644 index 5fbb013a..00000000 --- a/.github/workflows/maven.yml +++ /dev/null @@ -1,61 +0,0 @@ -# This workflow will build a Java project with Maven -# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven - -name: Build SongodaCore - -on: - push: - branches: [ master, development ] - pull_request: - types: [ opened, synchronize, reopened ] - -jobs: - build: - name: Build - runs-on: ubuntu-latest - steps: - # Checkout project files - - uses: actions/checkout@v2 - - # Setup Java - - uses: actions/setup-java@v2 - with: - java-version: 17 - distribution: adopt - cache: maven - - # Build remapped Spigot versions - - uses: SpraxDev/Action-SpigotMC@v4 - with: - versions: 1.18, 1.18.2, 1.19, 1.19.2, 1.19.3, 1.19.4 - remapped: true - - # Build project - - name: Build with Maven - run: 'mvn -B -Duser.name="GitHub Runner on $GITHUB_REPOSITORY (id=$GITHUB_RUN_ID)" clean package' - - # Upload build artifacts - - name: 'Upload Build Artifact: SongodaCore-*.jar' - uses: actions/upload-artifact@v2 - with: - name: SongodaCore-artifacts - path: ./Core/target/SongodaCore-*.jar - - ## - # Discord Webhook - # TODO: Extract into external Action for better reusability (and readability) - ## - - name: 'Discord Webhook (Success)' - if: ${{ success() && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/development') }} - continue-on-error: true - run: | - curl -X POST --data "{\"content\":null,\"embeds\":[{\"title\":\"Build succeeded!\",\"description\":\"The build with the ID #$GITHUB_RUN_NUMBER has succeeded!\",\"url\":\"$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID\",\"color\":5490477,\"fields\":[{\"name\":\"Branch\",\"value\":\"$GITHUB_REF\",\"inline\":true}],\"author\":{\"name\":\"$GITHUB_REPOSITORY\",\"url\":\"$GITHUB_SERVER_URL/$GITHUB_REPOSITORY\",\"icon_url\":\"$GITHUB_SERVER_URL/songoda.png\"},\"footer\":{\"text\":\"Initiated by $GITHUB_ACTOR\",\"icon_url\":\"$GITHUB_SERVER_URL/$GITHUB_ACTOR.png\"}}],\"username\":\"OctoAgent\",\"avatar_url\":\"https://github.githubassets.com/images/modules/logos_page/Octocat.png\"}" --header 'Content-Type: application/json' $DISCORD_WEBHOOK - env: - DISCORD_WEBHOOK: ${{ secrets.DISCORD_BUILD_STATUS_WEBHOOK }} - - name: 'Discord Webhook (Failure)' - if: ${{ failure() && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/development') }} - continue-on-error: true - run: | - curl -X POST --data "{\"content\":null,\"embeds\":[{\"title\":\"Build failed!\",\"description\":\"The build with the ID #$GITHUB_RUN_NUMBER has failed!\",\"url\":\"$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID\",\"color\":15611419,\"fields\":[{\"name\":\"Branch\",\"value\":\"$GITHUB_REF\",\"inline\":true}],\"author\":{\"name\":\"$GITHUB_REPOSITORY\",\"url\":\"$GITHUB_SERVER_URL/$GITHUB_REPOSITORY\",\"icon_url\":\"$GITHUB_SERVER_URL/songoda.png\"},\"footer\":{\"text\":\"Initiated by $GITHUB_ACTOR\",\"icon_url\":\"$GITHUB_SERVER_URL/$GITHUB_ACTOR.png\"}}],\"username\":\"OctoAgent\",\"avatar_url\":\"https://github.githubassets.com/images/modules/logos_page/Octocat.png\"}" --header "Content-Type:application/json" $DISCORD_WEBHOOK - env: - DISCORD_WEBHOOK: ${{ secrets.DISCORD_BUILD_STATUS_WEBHOOK }} diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml index cb6ede4e..f5e875af 100644 --- a/.github/workflows/sonarcloud.yml +++ b/.github/workflows/sonarcloud.yml @@ -2,47 +2,43 @@ name: SonarCloud on: push: - branches: [ master, development ] + branches: [ master, development, development-v3 ] pull_request: types: [ opened, synchronize, reopened ] +permissions: read-all + +env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SONAR_PROJECT_KEY: songoda_SongodaCore + jobs: - build: - name: Build + Analyze: runs-on: ubuntu-latest - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + steps: - # Checkout project files - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 if: ${{ env.SONAR_TOKEN != null }} with: - fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + fetch-depth: 0 - # Setup Java - - uses: actions/setup-java@v2 + - name: Prepare Workspace if: ${{ env.SONAR_TOKEN != null }} - with: - java-version: 17 - distribution: adopt - cache: maven + uses: ./.github/actions/setup_project_workspace - # Cache - name: 'Cache: SonarCloud' if: ${{ env.SONAR_TOKEN != null }} - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/.sonar/cache key: ${{ runner.os }}-sonar - # Build remapped Spigot versions - - uses: SpraxDev/Action-SpigotMC@v4 - with: - versions: 1.18, 1.18.2, 1.19, 1.19.2, 1.19.3, 1.19.4 - remapped: true - - name: Analyze project if: ${{ env.SONAR_TOKEN != null }} - run: mvn -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=songoda_SongodaCore + run: > + mvn -B \ + verify \ + org.sonarsource.scanner.maven:sonar-maven-plugin:sonar \ + "-Dsonar.projectKey=$SONAR_PROJECT_KEY" env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/Compatibility/pom.xml b/Compatibility/pom.xml index dc0f42e9..fe3bcb60 100644 --- a/Compatibility/pom.xml +++ b/Compatibility/pom.xml @@ -10,15 +10,13 @@ 2.6.21 ../pom.xml - SongodaCore-Compatibility - jar org.spigotmc spigot-api - 1.18-R0.1-SNAPSHOT + 1.19.2-R0.1-SNAPSHOT provided diff --git a/Compatibility/src/main/java/com/songoda/core/compatibility/ClassMapping.java b/Compatibility/src/main/java/com/songoda/core/compatibility/ClassMapping.java index 4087cc18..75624de2 100644 --- a/Compatibility/src/main/java/com/songoda/core/compatibility/ClassMapping.java +++ b/Compatibility/src/main/java/com/songoda/core/compatibility/ClassMapping.java @@ -1,7 +1,7 @@ package com.songoda.core.compatibility; /** - * @deprecated Usage is highly discouraged – use NMSManager instead + * @deprecated Usage is highly discouraged – use com.songoda.core.nms.Nms#getImplementations() instead */ @Deprecated public enum ClassMapping { diff --git a/Compatibility/src/main/java/com/songoda/core/compatibility/CompatibleMaterial.java b/Compatibility/src/main/java/com/songoda/core/compatibility/CompatibleMaterial.java index 0558dce3..5ef2728c 100644 --- a/Compatibility/src/main/java/com/songoda/core/compatibility/CompatibleMaterial.java +++ b/Compatibility/src/main/java/com/songoda/core/compatibility/CompatibleMaterial.java @@ -5,6 +5,7 @@ import org.bukkit.block.Block; import org.bukkit.entity.EntityType; import org.bukkit.entity.FallingBlock; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Contract; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -1548,6 +1549,7 @@ public enum CompatibleMaterial { * * @return LegacyMaterial or null if none found */ + @Contract("_, !null -> !null") public static CompatibleMaterial getMaterial(String name, CompatibleMaterial def) { return name == null ? def : lookupMap.getOrDefault(name.toUpperCase(), def); } diff --git a/Compatibility/src/main/java/com/songoda/core/compatibility/MethodMapping.java b/Compatibility/src/main/java/com/songoda/core/compatibility/MethodMapping.java index 39d6c394..72947bef 100644 --- a/Compatibility/src/main/java/com/songoda/core/compatibility/MethodMapping.java +++ b/Compatibility/src/main/java/com/songoda/core/compatibility/MethodMapping.java @@ -6,7 +6,7 @@ import org.bukkit.inventory.ItemStack; import java.lang.reflect.Method; /** - * @deprecated Usage is highly discouraged – use NMSManager instead + * @deprecated Usage is highly discouraged – use com.songoda.core.nms.Nms#getImplementations() instead */ @Deprecated public enum MethodMapping { diff --git a/Compatibility/src/main/java/com/songoda/core/compatibility/ServerVersion.java b/Compatibility/src/main/java/com/songoda/core/compatibility/ServerVersion.java index 028e8780..763eeef3 100644 --- a/Compatibility/src/main/java/com/songoda/core/compatibility/ServerVersion.java +++ b/Compatibility/src/main/java/com/songoda/core/compatibility/ServerVersion.java @@ -6,26 +6,27 @@ import org.bukkit.Bukkit; public enum ServerVersion { UNKNOWN, V1_7, V1_8, V1_9, V1_10, V1_11, V1_12, V1_13, V1_14, V1_15, V1_16, V1_17, V1_18, V1_19, V1_20, V1_21; - private final static String serverPackagePath; private final static String serverPackageVersion; private final static String serverReleaseVersion; private final static ServerVersion serverVersion; private final static boolean isMocked; static { - String srvPackage = Bukkit.getServer().getClass().getPackage().getName(); - isMocked = srvPackage.equals("be.seeseemelk.mockbukkit"); + if (Bukkit.getServer() != null) { + String srvPackage = Bukkit.getServer().getClass().getPackage().getName(); + isMocked = srvPackage.equals("be.seeseemelk.mockbukkit"); - if (isMocked) { - String packageVersionShard = "v" + Bukkit.getServer().getBukkitVersion().replace('.', '_') + "_R0"; - - serverPackagePath = "org.bukkit.craftbukkit." + packageVersionShard; - serverPackageVersion = packageVersionShard; - serverReleaseVersion = "0"; + if (isMocked) { + serverPackageVersion = "v" + Bukkit.getServer().getBukkitVersion().replace('.', '_') + "_R0"; + serverReleaseVersion = "0"; + } else { + serverPackageVersion = srvPackage.substring(srvPackage.lastIndexOf('.') + 1); + serverReleaseVersion = serverPackageVersion.indexOf('R') != -1 ? serverPackageVersion.substring(serverPackageVersion.indexOf('R') + 1) : ""; + } } else { - serverPackagePath = srvPackage; - serverPackageVersion = serverPackagePath.substring(serverPackagePath.lastIndexOf('.') + 1); - serverReleaseVersion = serverPackageVersion.indexOf('R') != -1 ? serverPackageVersion.substring(serverPackageVersion.indexOf('R') + 1) : ""; + serverPackageVersion = "Bukkit-not-initialized"; + serverReleaseVersion = "Bukkit-not-initialized"; + isMocked = false; } serverVersion = getVersion(); @@ -42,18 +43,34 @@ public enum ServerVersion { } public boolean isLessThan(ServerVersion other) { + if (serverVersion == UNKNOWN) { + return false; + } + return this.ordinal() < other.ordinal(); } public boolean isAtOrBelow(ServerVersion other) { + if (serverVersion == UNKNOWN && other != UNKNOWN) { + return false; + } + return this.ordinal() <= other.ordinal(); } public boolean isGreaterThan(ServerVersion other) { + if (serverVersion == UNKNOWN) { + return false; + } + return this.ordinal() > other.ordinal(); } public boolean isAtLeast(ServerVersion other) { + if (serverVersion == UNKNOWN && other != UNKNOWN) { + return false; + } + return this.ordinal() >= other.ordinal(); } @@ -78,18 +95,34 @@ public enum ServerVersion { } public static boolean isServerVersionAbove(ServerVersion version) { + if (serverVersion == UNKNOWN) { + return false; + } + return serverVersion.ordinal() > version.ordinal(); } public static boolean isServerVersionAtLeast(ServerVersion version) { + if (serverVersion == UNKNOWN && version != UNKNOWN) { + return false; + } + return serverVersion.ordinal() >= version.ordinal(); } public static boolean isServerVersionAtOrBelow(ServerVersion version) { + if (serverVersion == UNKNOWN && version != UNKNOWN) { + return false; + } + return serverVersion.ordinal() <= version.ordinal(); } public static boolean isServerVersionBelow(ServerVersion version) { + if (serverVersion == UNKNOWN) { + return false; + } + return serverVersion.ordinal() < version.ordinal(); } } diff --git a/Compatibility/src/test/java/com/songoda/core/compatibility/bukkit/CompatibleSoundTest.java b/Compatibility/src/test/java/com/songoda/core/compatibility/bukkit/CompatibleSoundTest.java deleted file mode 100644 index 901d1661..00000000 --- a/Compatibility/src/test/java/com/songoda/core/compatibility/bukkit/CompatibleSoundTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.songoda.core.compatibility.bukkit; - -import be.seeseemelk.mockbukkit.MockBukkit; -import com.songoda.core.compatibility.CompatibleSound; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertNotNull; - -class CompatibleSoundTest { - @BeforeEach - void setUp() { - MockBukkit.mock(); - } - - @AfterEach - void tearDown() { - MockBukkit.unmock(); - } - - @Test - @Disabled("CompatibleSound class needs some work beforehand") - void getSound() { - for (CompatibleSound compatibleSound : CompatibleSound.values()) { - assertNotNull(compatibleSound.getSound()); - - // compatibleSound.usesCompatibility() - } - } -} diff --git a/Core/pom.xml b/Core/pom.xml index 3ec36712..bf15739a 100644 --- a/Core/pom.xml +++ b/Core/pom.xml @@ -10,24 +10,34 @@ 2.6.21 ../pom.xml - SongodaCore - jar SongodaCore-${project.version} - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 + de.m3y.maven + inject-maven-plugin + 1.3 + + + + process-classes + + + inject + + + - ${java.version} - ${java.version} - - ${java.release} + + + ${project.version} + com.songoda.core.SongodaCoreConstants.getCoreVersion + + @@ -63,7 +73,19 @@ false - false + true + + + + com.songoda:* + com.zaxxer:HikariCP + de.tr7zw:item-nbt-api + net.kyori:* + org.apache.commons:commons-lang3 + org.apache.commons:commons-text + org.yaml:snakeyaml + + @@ -76,21 +98,30 @@ com.songoda.core.third_party.de.tr7zw.nbtapi + + net.kyori + com.songoda.core.third_party.net.kyori + + org.apache.commons com.songoda.core.third_party.org.apache.commons + + + org.yaml.snakeyaml + com.songoda.core.third_party.org.yaml.snakeyaml + - - - com.songoda:* - com.zaxxer:HikariCP - org.apache.commons:commons-text - org.apache.commons:commons-lang3 - de.tr7zw:item-nbt-api - - + + + *:* + + **/*.class + + + @@ -114,7 +145,7 @@ org.spigotmc spigot - 1.17 + 1.19.2-R0.1-SNAPSHOT provided @@ -125,6 +156,13 @@ compile + + ${project.groupId} + SongodaCore-NMS + ${project.version} + compile + + de.tr7zw item-nbt-api @@ -132,148 +170,33 @@ compile - - - ${project.groupId} - SongodaCore-NMS-API - ${project.version} + net.kyori + adventure-api + 4.11.0 compile - ${project.groupId} - SongodaCore-NMS-v1_8_R1 - ${project.version} + net.kyori + adventure-platform-bukkit + 4.1.1 compile + - ${project.groupId} - SongodaCore-NMS-v1_8_R2 - ${project.version} + com.zaxxer + HikariCP + 3.2.0 compile + - ${project.groupId} - SongodaCore-NMS-v1_8_R3 - ${project.version} + org.yaml + snakeyaml + 1.33 compile - - ${project.groupId} - SongodaCore-NMS-v1_9_R1 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_9_R2 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_10_R1 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_11_R1 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_12_R1 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_13_R1 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_13_R2 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_14_R1 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_15_R1 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_16_R1 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_16_R2 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_16_R3 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_17_R1 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_18_R1 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_18_R2 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_19_R1 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_19_R1v2 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_19_R2 - ${project.version} - compile - - - ${project.groupId} - SongodaCore-NMS-v1_19_R3 - ${project.version} - compile - - @@ -448,47 +371,5 @@ provided - - - com.googlecode.json-simple - json-simple - 1.1 - - - - org.yaml - snakeyaml - 1.26 - - - - org.slf4j - slf4j-api - 1.7.25 - - - - org.slf4j - slf4j-nop - 1.7.25 - - - - com.zaxxer - HikariCP - 3.2.0 - - - - org.mariadb.jdbc - mariadb-java-client - 3.0.8 - - - - org.xerial - sqlite-jdbc - 3.23.1 - diff --git a/Core/src/main/java/com/songoda/core/SongodaCore.java b/Core/src/main/java/com/songoda/core/SongodaCore.java index 0d3e0653..81025e23 100644 --- a/Core/src/main/java/com/songoda/core/SongodaCore.java +++ b/Core/src/main/java/com/songoda/core/SongodaCore.java @@ -44,27 +44,36 @@ import java.util.logging.Level; import java.util.logging.Logger; public class SongodaCore { - private final static Logger logger = Logger.getLogger("SongodaCore"); + private static final Logger logger = Logger.getLogger(SongodaCoreConstants.getProjectName()); /** * Whenever we make a major change to the core GUI, updater, * or other function used by the core, increment this number + * + * @deprecated The Core's version should be used instead as it uses Semantic Versioning */ - private final static int coreRevision = 9; + @Deprecated + private static final int coreRevision = 9; /** * @since coreRevision 6 + * @deprecated Is being replaced by {@link SongodaCoreConstants#getCoreVersion()} which is automatically kept up to date. */ - private final static String coreVersion = "2.6.21"; + @Deprecated + private static final String coreVersion = SongodaCoreConstants.getCoreVersion(); /** * This is specific to the website api + * + * @deprecated Seems useless and will probably be removed in the near future */ - private final static int updaterVersion = 1; + @Deprecated + private static final int updaterVersion = 1; - private final static Set registeredPlugins = new HashSet<>(); + private static final Set registeredPlugins = new HashSet<>(); private static SongodaCore INSTANCE = null; + private JavaPlugin piggybackedPlugin; private CommandManager commandManager; private EventListener loginListener; @@ -76,7 +85,7 @@ public class SongodaCore { } public static void registerPlugin(JavaPlugin plugin, int pluginID, CompatibleMaterial icon) { - registerPlugin(plugin, pluginID, icon == null ? "STONE" : icon.name(), coreVersion); + registerPlugin(plugin, pluginID, icon == null ? "STONE" : icon.name(), SongodaCoreConstants.getCoreVersion()); } public static void registerPlugin(JavaPlugin plugin, int pluginID, String icon) { @@ -91,13 +100,23 @@ public class SongodaCore { try { // test to see if we're up-to-date int otherVersion; + int ownVersion; + try { - otherVersion = (int) clazz.getMethod("getCoreVersion").invoke(null); + otherVersion = (int) clazz.getMethod("getCoreMajorVersion").invoke(null); + ownVersion = getCoreMajorVersion(); } catch (Exception ignore) { - otherVersion = -1; + try { + otherVersion = (int) clazz.getMethod("getCoreVersion").invoke(null); + } catch (Exception ignore2) { + otherVersion = -1; + } + + ownVersion = getCoreVersion(); } - if (otherVersion >= getCoreVersion()) { + + if (otherVersion >= ownVersion) { // use the active service // assuming that the other is greater than R6 if we get here ;) clazz.getMethod("registerPlugin", JavaPlugin.class, int.class, String.class, String.class).invoke(null, plugin, pluginID, icon, coreVersion); @@ -221,6 +240,10 @@ public class SongodaCore { tasks.add(Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, () -> update(info), 60L)); } + /** + * @deprecated Seems useless and will probably be replaced in the near future + */ + @Deprecated private void update(PluginInfo plugin) { try { URL url = new URL("https://update.songoda.com/index.php?plugin=" + plugin.getSongodaId() @@ -266,20 +289,45 @@ public class SongodaCore { return new ArrayList<>(registeredPlugins); } + public static String getVersion() { + return SongodaCoreConstants.getCoreVersion(); + } + + /** + * @deprecated Use {@link #getCoreMajorVersion()} instead, but careful, coreRevision is at 9 while major version is at 2 + */ + @Deprecated public static int getCoreVersion() { return coreRevision; } + /** + * @deprecated Use {@link #getVersion()} instead + */ + @Deprecated public static String getCoreLibraryVersion() { - return coreVersion; + return SongodaCoreConstants.getCoreVersion(); } + public static int getCoreMajorVersion() { + String fullVersion = getVersion(); + if (fullVersion.contains(".")) { + return Integer.parseInt(fullVersion.substring(0, fullVersion.indexOf("."))); + } + + return -1; + } + + /** + * @deprecated Seems useless and will probably be removed in the near future + */ + @Deprecated public static int getUpdaterVersion() { return updaterVersion; } public static String getPrefix() { - return "[SongodaCore] "; + return "[" + SongodaCoreConstants.getProjectName() + "] "; } public static Logger getLogger() { diff --git a/Core/src/main/java/com/songoda/core/SongodaCoreConstants.java b/Core/src/main/java/com/songoda/core/SongodaCoreConstants.java new file mode 100644 index 00000000..bc9e8bc8 --- /dev/null +++ b/Core/src/main/java/com/songoda/core/SongodaCoreConstants.java @@ -0,0 +1,26 @@ +package com.songoda.core; + +/** + * Some return values in this class are automatically replaced by a maven plugin after the project has been compiled. + * This allows for properties to be defined at one place without relying on a text file + * that needs to be inside the final jar (might get lost when this lib is shaded into other projects). + *

+ * !! Manually changing the values in this class has to be considered a breaking change. !! + */ +public class SongodaCoreConstants { + private SongodaCoreConstants() { + throw new IllegalStateException("Utility class"); + } + + public static String getCoreVersion() { + return "UNKNOWN_VESION"; + } + + public static String getProjectName() { + return "SongodaCore"; + } + + public static String getGitHubProjectUrl() { + return "https://github.com/craftaro/SongodaCore"; + } +} diff --git a/Core/src/main/java/com/songoda/core/SongodaPlugin.java b/Core/src/main/java/com/songoda/core/SongodaPlugin.java index 29e5066a..41937b30 100644 --- a/Core/src/main/java/com/songoda/core/SongodaPlugin.java +++ b/Core/src/main/java/com/songoda/core/SongodaPlugin.java @@ -8,7 +8,7 @@ import com.songoda.core.utils.SongodaAuth; import de.tr7zw.changeme.nbtapi.utils.MinecraftVersion; import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.plugin.java.JavaPlugin; @@ -25,7 +25,6 @@ public abstract class SongodaPlugin extends JavaPlugin { protected Config config = new Config(this); protected long dataLoadDelay = 20L; - protected ConsoleCommandSender console = Bukkit.getConsoleSender(); private boolean emergencyStop = false; static { @@ -91,6 +90,8 @@ public abstract class SongodaPlugin extends JavaPlugin { return; } + CommandSender console = Bukkit.getConsoleSender(); + // Check plugin access, don't load plugin if user don't have access if (!SongodaAuth.isAuthorized(true)) { String pluginName = getDescription().getName(); @@ -110,7 +111,7 @@ public abstract class SongodaPlugin extends JavaPlugin { ChatColor.YELLOW + "UUID: " + serverUuid + "\n" + ChatColor.YELLOW + "IP: " + externalIP + "\n" + ChatColor.RED + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; - this.console.sendMessage(message); + console.sendMessage(message); }).start(); emergencyStop(); @@ -125,15 +126,19 @@ public abstract class SongodaPlugin extends JavaPlugin { ChatColor.GREEN, "Enabling", ChatColor.GRAY)); try { - locale = Locale.loadDefaultLocale(this, "en_US"); + this.locale = Locale.loadDefaultLocale(this, "en_US"); // plugin setup onPluginEnable(); - // Load Data. - Bukkit.getScheduler().runTaskLater(this, this::onDataLoad, dataLoadDelay); + if (this.emergencyStop) { + return; + } - if (emergencyStop) { + // Load Data. + Bukkit.getScheduler().runTaskLater(this, this::onDataLoad, this.dataLoadDelay); + + if (this.emergencyStop) { console.sendMessage(ChatColor.RED + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); console.sendMessage(" "); return; @@ -156,10 +161,12 @@ public abstract class SongodaPlugin extends JavaPlugin { @Override public final void onDisable() { - if (emergencyStop) { + if (this.emergencyStop) { return; } + CommandSender console = Bukkit.getConsoleSender(); + console.sendMessage(" "); // blank line to separate chatter console.sendMessage(ChatColor.GREEN + "============================="); console.sendMessage(String.format("%s%s %s by %sCraftaro <3!", ChatColor.GRAY, @@ -173,12 +180,8 @@ public abstract class SongodaPlugin extends JavaPlugin { console.sendMessage(" "); // blank line to separate chatter } - public ConsoleCommandSender getConsole() { - return console; - } - public Locale getLocale() { - return locale; + return this.locale; } /** @@ -191,13 +194,13 @@ public abstract class SongodaPlugin extends JavaPlugin { * @return true if the locale exists and was loaded successfully */ public boolean setLocale(String localeName, boolean reload) { - if (locale != null && locale.getName().equals(localeName)) { - return !reload || locale.reloadMessages(); + if (this.locale != null && this.locale.getName().equals(localeName)) { + return !reload || this.locale.reloadMessages(); } Locale l = Locale.loadLocale(this, localeName); if (l != null) { - locale = l; + this.locale = l; return true; } @@ -242,7 +245,7 @@ public abstract class SongodaPlugin extends JavaPlugin { } protected void emergencyStop() { - emergencyStop = true; + this.emergencyStop = true; Bukkit.getPluginManager().disablePlugin(this); } @@ -255,10 +258,10 @@ public abstract class SongodaPlugin extends JavaPlugin { protected void criticalErrorOnPluginStartup(Throwable th) { Bukkit.getLogger().log(Level.SEVERE, String.format( - "Unexpected error while loading %s v%s c%s: Disabling plugin!", + "Unexpected error while loading %s v%s (core v%s): Disabling plugin!", getDescription().getName(), getDescription().getVersion(), - SongodaCore.getCoreLibraryVersion() + SongodaCore.getVersion() ), th); emergencyStop(); diff --git a/Core/src/main/java/com/songoda/core/chat/ChatMessage.java b/Core/src/main/java/com/songoda/core/chat/ChatMessage.java index 2094d233..3b8516e1 100644 --- a/Core/src/main/java/com/songoda/core/chat/ChatMessage.java +++ b/Core/src/main/java/com/songoda/core/chat/ChatMessage.java @@ -5,7 +5,7 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import com.songoda.core.compatibility.ClassMapping; import com.songoda.core.compatibility.ServerVersion; -import com.songoda.core.nms.NmsManager; +import com.songoda.core.nms.Nms; import com.songoda.core.utils.TextUtils; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; @@ -13,7 +13,6 @@ import org.bukkit.entity.Player; import java.lang.reflect.Constructor; import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; @@ -228,7 +227,7 @@ public class ChatMessage { Object packet; if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_19)) { packet = mc_PacketPlayOutChat_new.newInstance(mc_IChatBaseComponent_ChatSerializer_a.invoke(null, gson.toJson(textList)), mc_PacketPlayOutChat_new_1_19_0 ? 1 : false); - }else if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_16)) { + } else if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_16)) { packet = mc_PacketPlayOutChat_new.newInstance( mc_IChatBaseComponent_ChatSerializer_a.invoke(null, gson.toJson(textList)), mc_chatMessageType_Chat.get(null), @@ -237,8 +236,8 @@ public class ChatMessage { packet = mc_PacketPlayOutChat_new.newInstance(mc_IChatBaseComponent_ChatSerializer_a.invoke(null, gson.toJson(textList))); } - NmsManager.getPlayer().sendPacket((Player) sender, packet); - } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) { + Nms.getImplementations().getPlayer().sendPacket((Player) sender, packet); + } catch (ReflectiveOperationException | IllegalArgumentException ex) { Bukkit.getLogger().log(Level.WARNING, "Problem preparing raw chat packets (disabling further packets)", ex); enabled = false; } diff --git a/Core/src/main/java/com/songoda/core/gui/AnvilGui.java b/Core/src/main/java/com/songoda/core/gui/AnvilGui.java index 640c3377..c5d50ace 100644 --- a/Core/src/main/java/com/songoda/core/gui/AnvilGui.java +++ b/Core/src/main/java/com/songoda/core/gui/AnvilGui.java @@ -2,7 +2,7 @@ package com.songoda.core.gui; import com.songoda.core.compatibility.CompatibleMaterial; import com.songoda.core.gui.methods.Clickable; -import com.songoda.core.nms.NmsManager; +import com.songoda.core.nms.Nms; import com.songoda.core.nms.anvil.AnvilCore; import com.songoda.core.nms.anvil.CustomAnvil; import org.bukkit.entity.Player; @@ -125,7 +125,7 @@ public class AnvilGui extends Gui { @Override protected void createInventory() { - AnvilCore nms = NmsManager.getAnvil(); + AnvilCore nms = Nms.getImplementations().getAnvil(); if (nms != null) { anvil = nms.createAnvil(player, new GuiHolder(guiManager, this)); diff --git a/Core/src/main/java/com/songoda/core/hooks/protection/PlotSquaredProtection.java b/Core/src/main/java/com/songoda/core/hooks/protection/PlotSquaredProtection.java index e5c23d54..44214f7e 100644 --- a/Core/src/main/java/com/songoda/core/hooks/protection/PlotSquaredProtection.java +++ b/Core/src/main/java/com/songoda/core/hooks/protection/PlotSquaredProtection.java @@ -1,19 +1,16 @@ package com.songoda.core.hooks.protection; -import com.plotsquared.core.PlotAPI; import com.plotsquared.core.PlotSquared; +import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; public class PlotSquaredProtection extends Protection { - - PlotSquared plotSquared; - public PlotSquaredProtection(Plugin plugin) { super(plugin); - plotSquared = PlotSquared.get(); } @Override @@ -23,21 +20,51 @@ public class PlotSquaredProtection extends Protection { @Override public boolean isEnabled() { - return plotSquared != null; + return Bukkit.getPluginManager().isPluginEnabled("PlotSquared"); } @Override public boolean canPlace(Player player, Location location) { - return plotSquared.getPlotAreaManager().getApplicablePlotArea(com.plotsquared.core.location.Location.at(location.getWorld().getName(), (int) location.getX(), (int) location.getY(), (int) location.getZ())).getPlots().stream().anyMatch(p -> p.isAdded(player.getUniqueId())); + return isPlayerAddedAtPlotLocation(player, location); } @Override public boolean canBreak(Player player, Location location) { - return plotSquared.getPlotAreaManager().getApplicablePlotArea(com.plotsquared.core.location.Location.at(location.getWorld().getName(), (int) location.getX(), (int) location.getY(), (int) location.getZ())).getPlots().stream().anyMatch(p -> p.isAdded(player.getUniqueId())); + return isPlayerAddedAtPlotLocation(player, location); } @Override public boolean canInteract(Player player, Location location) { - return plotSquared.getPlotAreaManager().getApplicablePlotArea(com.plotsquared.core.location.Location.at(location.getWorld().getName(), (int) location.getX(), (int) location.getY(), (int) location.getZ())).getPlots().stream().anyMatch(p -> p.isAdded(player.getUniqueId())); + return isPlayerAddedAtPlotLocation(player, location); + } + + private boolean isPlayerAddedAtPlotLocation(Player player, Location location) { + PlotArea plotArea = getApplicablePlotArea(location); + if (plotArea == null) { + return true; + } + + for (Plot p : plotArea.getPlots()) { + if (p.isAdded(player.getUniqueId())) { + return true; + } + } + + return false; + } + + private PlotArea getApplicablePlotArea(Location location) { + return PlotSquared.get() + .getPlotAreaManager() + .getApplicablePlotArea(getPlotSquaredLocation(location)); + } + + private com.plotsquared.core.location.Location getPlotSquaredLocation(Location location) { + return com.plotsquared.core.location.Location.at( + location.getWorld().getName(), + (int) location.getX(), + (int) location.getY(), + (int) location.getZ() + ); } } diff --git a/Core/src/main/java/com/songoda/core/http/HttpClient.java b/Core/src/main/java/com/songoda/core/http/HttpClient.java new file mode 100644 index 00000000..95037834 --- /dev/null +++ b/Core/src/main/java/com/songoda/core/http/HttpClient.java @@ -0,0 +1,9 @@ +package com.songoda.core.http; + +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; + +public interface HttpClient { + @NotNull HttpResponse get(String url) throws IOException; +} diff --git a/Core/src/main/java/com/songoda/core/http/HttpResponse.java b/Core/src/main/java/com/songoda/core/http/HttpResponse.java new file mode 100644 index 00000000..a5b519bb --- /dev/null +++ b/Core/src/main/java/com/songoda/core/http/HttpResponse.java @@ -0,0 +1,11 @@ +package com.songoda.core.http; + +import java.io.IOException; + +public interface HttpResponse { + int getResponseCode() throws IOException; + + byte[] getBody() throws IOException; + + String getBodyAsString() throws IOException; +} diff --git a/Core/src/main/java/com/songoda/core/http/HttpResponseImpl.java b/Core/src/main/java/com/songoda/core/http/HttpResponseImpl.java new file mode 100644 index 00000000..f713b98d --- /dev/null +++ b/Core/src/main/java/com/songoda/core/http/HttpResponseImpl.java @@ -0,0 +1,54 @@ +package com.songoda.core.http; + +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.nio.charset.StandardCharsets; + +public class HttpResponseImpl implements HttpResponse, AutoCloseable { + protected final HttpURLConnection connection; + + protected byte[] body; + + HttpResponseImpl(HttpURLConnection connection) throws IOException { + this.connection = connection; + + this.connection.connect(); + } + + public int getResponseCode() throws IOException { + int statusCode = this.connection.getResponseCode(); + + if (statusCode == -1) { + throw new IOException("HTTP Status Code is -1"); + } + + return statusCode; + } + + public byte[] getBody() throws IOException { + if (this.body == null) { + try (InputStream in = this.connection.getInputStream(); + InputStream err = this.connection.getErrorStream()) { + if (err != null) { + this.body = IOUtils.toByteArray(err); + } else { + this.body = IOUtils.toByteArray(in); + } + } + } + + return this.body; + } + + public String getBodyAsString() throws IOException { + return new String(getBody(), StandardCharsets.UTF_8); + } + + @Override + public void close() throws Exception { + this.connection.disconnect(); + } +} diff --git a/Core/src/main/java/com/songoda/core/http/SimpleHttpClient.java b/Core/src/main/java/com/songoda/core/http/SimpleHttpClient.java new file mode 100644 index 00000000..d1ca8819 --- /dev/null +++ b/Core/src/main/java/com/songoda/core/http/SimpleHttpClient.java @@ -0,0 +1,31 @@ +package com.songoda.core.http; + +import com.songoda.core.SongodaCoreConstants; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; + +public class SimpleHttpClient implements HttpClient { + private static final String USER_AGENT = generateUserAgent(); + + public @NotNull HttpResponse get(String url) throws IOException { + HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); + connection.setInstanceFollowRedirects(true); + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + + connection.setRequestProperty("User-Agent", USER_AGENT); + + return new HttpResponseImpl(connection); + } + + private static String generateUserAgent() { + String projectName = SongodaCoreConstants.getProjectName(); + String version = SongodaCoreConstants.getCoreVersion(); + String projectUrl = SongodaCoreConstants.getGitHubProjectUrl(); + + return projectName + "/" + version + " (+" + projectUrl + ")"; + } +} diff --git a/Core/src/main/java/com/songoda/core/http/UnexpectedHttpStatusException.java b/Core/src/main/java/com/songoda/core/http/UnexpectedHttpStatusException.java new file mode 100644 index 00000000..3229448c --- /dev/null +++ b/Core/src/main/java/com/songoda/core/http/UnexpectedHttpStatusException.java @@ -0,0 +1,15 @@ +package com.songoda.core.http; + +import java.io.IOException; + +public class UnexpectedHttpStatusException extends IOException { + public final int responseCode; + public final String url; + + public UnexpectedHttpStatusException(int responseCode, String url) { + super("Got HTTP Status Code " + responseCode + ": " + url); + + this.responseCode = responseCode; + this.url = url; + } +} diff --git a/Core/src/main/java/com/songoda/core/lootables/loot/DropUtils.java b/Core/src/main/java/com/songoda/core/lootables/loot/DropUtils.java index c4abb7e6..4d57b8fe 100644 --- a/Core/src/main/java/com/songoda/core/lootables/loot/DropUtils.java +++ b/Core/src/main/java/com/songoda/core/lootables/loot/DropUtils.java @@ -101,7 +101,10 @@ public class DropUtils { Bukkit.getScheduler().runTask(SongodaCore.getHijackedPlugin(), () -> { for (String command : commands) { if (entity.getKiller() != null) { - command = command.replace("%player%", entity.getKiller().getName().replace("%x%", String.valueOf((int)entity.getLocation().getX())).replace("%y%", String.valueOf((int)entity.getLocation().getY())).replace("%z%", String.valueOf((int)entity.getLocation().getZ()))); + command = command.replace("%player%", entity.getKiller().getName() + .replace("%x%", String.valueOf((int) entity.getLocation().getX())) + .replace("%y%", String.valueOf((int) entity.getLocation().getY())) + .replace("%z%", String.valueOf((int) entity.getLocation().getZ()))); } if (!command.contains("%player%")) { diff --git a/Core/src/main/java/com/songoda/core/lootables/loot/LootManager.java b/Core/src/main/java/com/songoda/core/lootables/loot/LootManager.java index 28abe081..6906fe96 100644 --- a/Core/src/main/java/com/songoda/core/lootables/loot/LootManager.java +++ b/Core/src/main/java/com/songoda/core/lootables/loot/LootManager.java @@ -12,10 +12,10 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; import java.io.IOException; import java.io.Writer; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -166,7 +166,7 @@ public class LootManager { try { Gson gson = new Gson(); - JsonReader reader = new JsonReader(new FileReader(file.getPath())); + JsonReader reader = new JsonReader(Files.newBufferedReader(file.toPath())); Lootable lootable = gson.fromJson(reader, Lootable.class); @@ -195,7 +195,7 @@ public class LootManager { continue; } - try (Writer writer = new FileWriter(file.getPath())) { + try (Writer writer = Files.newBufferedWriter(file.toPath(), StandardCharsets.UTF_8)) { Gson gson = new GsonBuilder().setPrettyPrinting().create(); gson.toJson(lootable, writer); } diff --git a/Core/src/main/java/com/songoda/core/math/MathUtils.java b/Core/src/main/java/com/songoda/core/math/MathUtils.java index c336d24c..b46e6345 100644 --- a/Core/src/main/java/com/songoda/core/math/MathUtils.java +++ b/Core/src/main/java/com/songoda/core/math/MathUtils.java @@ -1,5 +1,7 @@ package com.songoda.core.math; +import com.songoda.core.SongodaCoreConstants; + import java.util.HashMap; import java.util.Map; @@ -7,7 +9,7 @@ public class MathUtils { private static final Map cache = new HashMap<>(); public static double eval(String toParse) { - return eval(toParse, "SongodaCore Eval Engine"); + return eval(toParse, SongodaCoreConstants.getProjectName() + " Eval Engine"); } public static double eval(String toParse, String warningMessage) { diff --git a/Core/src/main/java/com/songoda/core/nms/Nms.java b/Core/src/main/java/com/songoda/core/nms/Nms.java new file mode 100644 index 00000000..7b01821e --- /dev/null +++ b/Core/src/main/java/com/songoda/core/nms/Nms.java @@ -0,0 +1,22 @@ +package com.songoda.core.nms; + +import com.songoda.core.compatibility.ServerVersion; + +public class Nms { + protected static NmsImplementations impl; + + /** + * @return The implementations for the current server version + */ + public static NmsImplementations getImplementations() throws UnsupportedServerVersionException { + if (impl == null) { + try { + impl = (NmsImplementations) Class.forName("com.songoda.core.nms." + ServerVersion.getServerVersionString() + ".NmsImplementationsImpl").getConstructors()[0].newInstance(); + } catch (ReflectiveOperationException ex) { + throw new UnsupportedServerVersionException(ex); + } + } + + return impl; + } +} diff --git a/Core/src/main/java/com/songoda/core/nms/NmsManager.java b/Core/src/main/java/com/songoda/core/nms/NmsManager.java index 6e9faa6f..ea81c461 100644 --- a/Core/src/main/java/com/songoda/core/nms/NmsManager.java +++ b/Core/src/main/java/com/songoda/core/nms/NmsManager.java @@ -3,192 +3,51 @@ package com.songoda.core.nms; import com.songoda.core.nms.anvil.AnvilCore; import com.songoda.core.nms.entity.NMSPlayer; import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.world.NmsWorldBorder; import com.songoda.core.nms.world.WorldCore; -import org.bukkit.Bukkit; - -import java.util.logging.Level; -import java.util.logging.Logger; +/** + * @deprecated Use {@link Nms} instead. + */ +@Deprecated public class NmsManager { - private static final String serverPackagePath = Bukkit.getServer().getClass().getPackage().getName(); - private static final String serverPackageVersion = serverPackagePath.substring(serverPackagePath.lastIndexOf('.') + 1); - private static final String bukkitVersion = Bukkit.getServer().getBukkitVersion().split("-")[0]; - private static final NMSPlayer player; - private static final AnvilCore anvil; - private static final NBTCore nbt; - private static final WorldCore world; - - static { - switch (serverPackageVersion) { - case "v1_8_R1": - player = new com.songoda.core.nms.v1_8_R1.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_8_R1.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_8_R1.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_8_R1.world.WorldCoreImpl(); - break; - case "v1_8_R2": - player = new com.songoda.core.nms.v1_8_R2.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_8_R2.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_8_R2.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_8_R2.world.WorldCoreImpl(); - break; - case "v1_8_R3": - player = new com.songoda.core.nms.v1_8_R3.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_8_R3.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_8_R3.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_8_R3.world.WorldCoreImpl(); - break; - case "v1_9_R1": - player = new com.songoda.core.nms.v1_9_R1.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_9_R1.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_9_R1.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_9_R1.world.WorldCoreImpl(); - break; - case "v1_9_R2": - player = new com.songoda.core.nms.v1_9_R2.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_9_R2.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_9_R2.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_9_R2.world.WorldCoreImpl(); - break; - case "v1_10_R1": - player = new com.songoda.core.nms.v1_10_R1.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_10_R1.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_10_R1.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_10_R1.world.WorldCoreImpl(); - break; - case "v1_11_R1": - player = new com.songoda.core.nms.v1_11_R1.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_11_R1.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_11_R1.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_11_R1.world.WorldCoreImpl(); - break; - case "v1_12_R1": - player = new com.songoda.core.nms.v1_12_R1.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_12_R1.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_12_R1.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_12_R1.world.WorldCoreImpl(); - break; - case "v1_13_R1": - player = new com.songoda.core.nms.v1_13_R1.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_13_R1.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_13_R1.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_13_R1.world.WorldCoreImpl(); - break; - case "v1_13_R2": - player = new com.songoda.core.nms.v1_13_R2.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_13_R2.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_13_R2.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_13_R2.world.WorldCoreImpl(); - break; - case "v1_14_R1": - player = new com.songoda.core.nms.v1_14_R1.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_14_R1.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_14_R1.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_14_R1.world.WorldCoreImpl(); - break; - case "v1_15_R1": - player = new com.songoda.core.nms.v1_15_R1.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_15_R1.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_15_R1.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_15_R1.world.WorldCoreImpl(); - break; - case "v1_16_R1": - player = new com.songoda.core.nms.v1_16_R1.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_16_R1.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_16_R1.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_16_R1.world.WorldCoreImpl(); - break; - case "v1_16_R2": - player = new com.songoda.core.nms.v1_16_R2.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_16_R2.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_16_R2.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_16_R2.world.WorldCoreImpl(); - break; - case "v1_16_R3": - player = new com.songoda.core.nms.v1_16_R3.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_16_R3.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_16_R3.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_16_R3.world.WorldCoreImpl(); - break; - case "v1_17_R1": - player = new com.songoda.core.nms.v1_17_R1.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_17_R1.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_17_R1.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_17_R1.world.WorldCoreImpl(); - break; - case "v1_18_R1": - player = new com.songoda.core.nms.v1_18_R1.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_18_R1.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_18_R1.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_18_R1.world.WorldCoreImpl(); - break; - case "v1_18_R2": - player = new com.songoda.core.nms.v1_18_R2.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_18_R2.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_18_R2.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_18_R2.world.WorldCoreImpl(); - break; - case "v1_19_R1": - if (bukkitVersion.endsWith(".0") || bukkitVersion.equals("1.19")) { - player = new com.songoda.core.nms.v1_19_R1.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_19_R1.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_19_R1.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_19_R1.world.WorldCoreImpl(); - } else { - player = new com.songoda.core.nms.v1_19_R1v2.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_19_R1v2.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_19_R1v2.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_19_R1v2.world.WorldCoreImpl(); - } - break; - case "v1_19_R2": - player = new com.songoda.core.nms.v1_19_R2.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_19_R2.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_19_R2.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_19_R2.world.WorldCoreImpl(); - break; - case "v1_19_R3": - player = new com.songoda.core.nms.v1_19_R3.entity.NMSPlayerImpl(); - anvil = new com.songoda.core.nms.v1_19_R3.anvil.AnvilCore(); - nbt = new com.songoda.core.nms.v1_19_R3.nbt.NBTCoreImpl(); - world = new com.songoda.core.nms.v1_19_R3.world.WorldCoreImpl(); - break; - default: - Logger.getLogger(NmsManager.class.getName()).log(Level.SEVERE, "Failed to load NMS for this server version: version {0} not found", serverPackageVersion); - - player = null; - anvil = null; - nbt = null; - world = null; - break; - } - } - + @Deprecated public static NMSPlayer getPlayer() { - return player; + return Nms.getImplementations().getPlayer(); } + @Deprecated public static AnvilCore getAnvil() { - return anvil; + return Nms.getImplementations().getAnvil(); } + @Deprecated public static boolean hasAnvil() { - return anvil != null; + return getAnvil() != null; } + @Deprecated public static NBTCore getNbt() { - return nbt; + return Nms.getImplementations().getNbt(); } + @Deprecated public static boolean hasNbt() { - return nbt != null; + return getNbt() != null; } + @Deprecated public static WorldCore getWorld() { - return world; + return Nms.getImplementations().getWorld(); } + @Deprecated public static boolean hasWorld() { - return world != null; + return getWorld() != null; + } + + @Deprecated + public static NmsWorldBorder getWorldBorder() { + return Nms.getImplementations().getWorldBorder(); } } diff --git a/Core/src/main/java/com/songoda/core/nms/UnsupportedServerVersionException.java b/Core/src/main/java/com/songoda/core/nms/UnsupportedServerVersionException.java new file mode 100644 index 00000000..44363a59 --- /dev/null +++ b/Core/src/main/java/com/songoda/core/nms/UnsupportedServerVersionException.java @@ -0,0 +1,17 @@ +package com.songoda.core.nms; + +import com.songoda.core.compatibility.ServerVersion; + +public class UnsupportedServerVersionException extends RuntimeException { + public UnsupportedServerVersionException() { + this(null); + } + + public UnsupportedServerVersionException(Throwable cause) { + this("Your sever version (" + ServerVersion.getServerVersionString() + "; " + ServerVersion.getServerVersion().name() + ") is not fully supported", null); + } + + protected UnsupportedServerVersionException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/Core/src/main/java/com/songoda/core/utils/BlockUtils.java b/Core/src/main/java/com/songoda/core/utils/BlockUtils.java index d6d97d77..170a12df 100644 --- a/Core/src/main/java/com/songoda/core/utils/BlockUtils.java +++ b/Core/src/main/java/com/songoda/core/utils/BlockUtils.java @@ -4,7 +4,6 @@ import com.songoda.core.compatibility.ClassMapping; import com.songoda.core.compatibility.CompatibleMaterial; import com.songoda.core.compatibility.MethodMapping; import com.songoda.core.compatibility.ServerVersion; -import com.songoda.core.nms.NmsManager; import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Material; @@ -343,7 +342,8 @@ public class BlockUtils { * * @param loc The Location of the container * - * @deprecated Broken in/since Spigot 1.19.4! Use {@link com.songoda.core.nms.world.WorldCore#updateAdjacentComparators(Block)} on {@link NmsManager#getWorld()} instead + * @deprecated Use {@link com.songoda.core.nms.world.WorldCore#updateAdjacentComparators(Block)} + * via {@link com.songoda.core.nms.Nms#getImplementations()} instead. */ @Deprecated public static void updateAdjacentComparators(Location loc) { @@ -406,7 +406,11 @@ public class BlockUtils { *

* The chunk must be loaded and players must relog if they have the * chunk loaded in order to use this method. + * + * @deprecated Use {@link com.songoda.core.nms.world.SWorld#setBlockFast(int, int, int, Material)} + * via {@link com.songoda.core.nms.Nms#getImplementations()} instead. */ + @Deprecated public static void setBlockFast(World world, int x, int y, int z, Material material, byte data) { try { // Cache reflection @@ -451,6 +455,11 @@ public class BlockUtils { } } + /** + * @deprecated Use {@link com.songoda.core.nms.world.SWorld#setBlockFast(int, int, int, Material)} + * via {@link com.songoda.core.nms.Nms#getImplementations()} instead. + */ + @Deprecated public static void setBlockFast(World world, int x, int y, int z, CompatibleMaterial material, byte data) { setBlockFast(world, x, y, z, material.getBlockMaterial(), data); } @@ -476,8 +485,7 @@ public class BlockUtils { return false; } - return block.getData() >= (mat == CompatibleMaterial.BEETROOTS - || mat == CompatibleMaterial.NETHER_WART ? 3 : 7); + return block.getData() >= (mat == CompatibleMaterial.BEETROOTS || mat == CompatibleMaterial.NETHER_WART ? 3 : 7); } /** @@ -526,8 +534,7 @@ public class BlockUtils { return -1; } - return (mat == CompatibleMaterial.BEETROOTS - || mat == CompatibleMaterial.NETHER_WART ? 3 : 7); + return (mat == CompatibleMaterial.BEETROOTS || mat == CompatibleMaterial.NETHER_WART ? 3 : 7); } /** diff --git a/Core/src/main/java/com/songoda/core/world/SItemStack.java b/Core/src/main/java/com/songoda/core/world/SItemStack.java index d16d8b55..7307cad3 100644 --- a/Core/src/main/java/com/songoda/core/world/SItemStack.java +++ b/Core/src/main/java/com/songoda/core/world/SItemStack.java @@ -3,7 +3,7 @@ package com.songoda.core.world; import com.songoda.core.compatibility.CompatibleHand; import com.songoda.core.compatibility.CompatibleSound; import com.songoda.core.compatibility.ServerVersion; -import com.songoda.core.nms.NmsManager; +import com.songoda.core.nms.Nms; import org.bukkit.Bukkit; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; @@ -18,12 +18,12 @@ public class SItemStack { public SItemStack(ItemStack item) { this.item = item; - this.sItem = NmsManager.getWorld().getItemStack(item); + this.sItem = Nms.getImplementations().getWorld().getItemStack(item); } public SItemStack(CompatibleHand hand, Player player) { this.item = hand.getItem(player); - this.sItem = NmsManager.getWorld().getItemStack(item); + this.sItem = Nms.getImplementations().getWorld().getItemStack(item); } public ItemStack addDamage(Player player, int damage) { @@ -49,7 +49,7 @@ public class SItemStack { int durability; if (ServerVersion.isServerVersionBelow(ServerVersion.V1_11) - ? NmsManager.getNbt().of(item).has("Unbreakable") + ? Nms.getImplementations().getNbt().of(item).has("Unbreakable") : item.getItemMeta().isUnbreakable()) { return item; } else if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13)) { diff --git a/Core/src/main/java/com/songoda/core/world/SSpawner.java b/Core/src/main/java/com/songoda/core/world/SSpawner.java index a5b652a5..bdcbee3a 100644 --- a/Core/src/main/java/com/songoda/core/world/SSpawner.java +++ b/Core/src/main/java/com/songoda/core/world/SSpawner.java @@ -2,7 +2,7 @@ package com.songoda.core.world; import com.songoda.core.compatibility.CompatibleMaterial; import com.songoda.core.hooks.EntityStackerManager; -import com.songoda.core.nms.NmsManager; +import com.songoda.core.nms.Nms; import com.songoda.core.nms.world.SpawnedEntity; import com.songoda.core.utils.EntityUtils; import org.bukkit.Location; @@ -20,7 +20,7 @@ public class SSpawner { public SSpawner(Location location) { this.location = location; - this.sSpawner = NmsManager.getWorld().getSpawner(location); + this.sSpawner = Nms.getImplementations().getWorld().getSpawner(location); } public SSpawner(CreatureSpawner spawner) { diff --git a/Core/src/main/java/com/songoda/core/world/SWorld.java b/Core/src/main/java/com/songoda/core/world/SWorld.java index 61df4a94..ac70ccff 100644 --- a/Core/src/main/java/com/songoda/core/world/SWorld.java +++ b/Core/src/main/java/com/songoda/core/world/SWorld.java @@ -1,7 +1,7 @@ package com.songoda.core.world; import com.songoda.core.compatibility.ServerVersion; -import com.songoda.core.nms.NmsManager; +import com.songoda.core.nms.Nms; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Entity; @@ -15,7 +15,7 @@ public class SWorld { public SWorld(World world) { this.world = world; - this.sWorld = NmsManager.getWorld().getWorld(world); + this.sWorld = Nms.getImplementations().getWorld().getWorld(world); } public Entity[] getEntitiesFromChunk(int x, int z) { diff --git a/Core/src/main/java/com/songoda/core/world/SWorldBorder.java b/Core/src/main/java/com/songoda/core/world/SWorldBorder.java index de9d981b..b1dd3d4f 100644 --- a/Core/src/main/java/com/songoda/core/world/SWorldBorder.java +++ b/Core/src/main/java/com/songoda/core/world/SWorldBorder.java @@ -3,7 +3,7 @@ package com.songoda.core.world; import com.songoda.core.compatibility.ClassMapping; import com.songoda.core.compatibility.MethodMapping; import com.songoda.core.compatibility.ServerVersion; -import com.songoda.core.nms.NmsManager; +import com.songoda.core.nms.Nms; import com.songoda.core.utils.NMSUtils; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -12,6 +12,10 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +/** + * @deprecated Use {@link com.songoda.core.nms.world.NmsWorldBorder} via {@link Nms#getImplementations()} instead. + */ +@Deprecated public class SWorldBorder { private static Class packetPlayOutWorldBorderEnumClass; private static Class worldBorderClass; @@ -81,18 +85,22 @@ public class SWorldBorder { if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_17)) { Object packet = clientboundInitializeBorderPacketConstructor.newInstance(worldBorder); - NmsManager.getPlayer().sendPacket(player, packet); + Nms.getImplementations().getPlayer().sendPacket(player, packet); } else { @SuppressWarnings({"unchecked", "rawtypes"}) Object packet = packetPlayOutWorldBorderConstructor.newInstance(worldBorder, Enum.valueOf((Class) packetPlayOutWorldBorderEnumClass, "INITIALIZE")); - NmsManager.getPlayer().sendPacket(player, packet); + Nms.getImplementations().getPlayer().sendPacket(player, packet); } } catch (InstantiationException | InvocationTargetException | NoSuchMethodException | IllegalAccessException ex) { ex.printStackTrace(); } } + /** + * @deprecated Use {@link com.songoda.core.nms.world.NmsWorldBorder.BorderColor} instead. + */ + @Deprecated public enum Color { Blue, Green, Red } diff --git a/Core/src/test/java/com/songoda/core/SongodaCoreConstantsTest.java b/Core/src/test/java/com/songoda/core/SongodaCoreConstantsTest.java new file mode 100644 index 00000000..9df14c96 --- /dev/null +++ b/Core/src/test/java/com/songoda/core/SongodaCoreConstantsTest.java @@ -0,0 +1,36 @@ +package com.songoda.core; + +import org.junit.jupiter.api.Test; +import org.opentest4j.TestSkippedException; + +import java.util.Objects; +import java.util.regex.Pattern; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class SongodaCoreConstantsTest { + // Pattern is from https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string + private static final Pattern VERSION_PATTERN = Pattern.compile("^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"); + + @Test + void getCoreVersion() { + if (!Objects.equals(System.getenv("TESTS_RUN_WITH_MAVEN"), "true")) { + throw new TestSkippedException("Skipping test because it requires the TESTS_RUN_WITH_MAVEN environment variable to be set to true"); + } + + String coreVersion = SongodaCoreConstants.getCoreVersion(); + + assertTrue(VERSION_PATTERN.matcher(coreVersion).matches(), "Version string is not a valid semver string: " + coreVersion); + } + + @Test + void getProjectName() { + assertFalse(SongodaCoreConstants.getProjectName().isEmpty()); + } + + @Test + void getGitHubProjectUrl() { + assertFalse(SongodaCoreConstants.getGitHubProjectUrl().isEmpty()); + } +} diff --git a/Core/src/test/java/com/songoda/core/compatibility/material/CompatibleMaterialTest.java b/Core/src/test/java/com/songoda/core/compatibility/material/CompatibleMaterialTest.java deleted file mode 100644 index 1434214d..00000000 --- a/Core/src/test/java/com/songoda/core/compatibility/material/CompatibleMaterialTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.songoda.core.compatibility.material; - -import be.seeseemelk.mockbukkit.MockBukkit; -import com.songoda.core.compatibility.CompatibleMaterial; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.Supplier; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; - -class CompatibleMaterialTest { - @BeforeEach - void setUp() { - MockBukkit.mock(); - } - - @AfterEach - void tearDown() { - MockBukkit.unmock(); - } - - @Test - void getMaterialForNull() { - assertNull(CompatibleMaterial.getMaterial((Material) null)); - assertNull(CompatibleMaterial.getMaterial((ItemStack) null)); - } - - @Test - void getMaterialForAllBukkitMaterials() { - Map returnedMaterials = new HashMap<>(Material.values().length); - for (Material bukkitMaterial : Material.values()) { - CompatibleMaterial compatibleMaterial = CompatibleMaterial.getMaterial(bukkitMaterial); - - if (bukkitMaterial.name().startsWith("LEGACY_")) { - assertNull(compatibleMaterial); - continue; - } - assertNotNull(compatibleMaterial, () -> "Could not get an CompatibleMaterial for Material." + bukkitMaterial.name()); - assertEquals(bukkitMaterial, compatibleMaterial.getMaterial()); - assertEquals(compatibleMaterial, CompatibleMaterial.getMaterial(bukkitMaterial.name())); - - assertFalse(returnedMaterials.containsKey(compatibleMaterial), - () -> String.format("Assertion failed when converting Material.%s to CompatibleMaterial.%s: " + - "CompatibleMaterial.%1$s has already been returned for Material.%3$s previously", - bukkitMaterial.name(), - compatibleMaterial.name(), - returnedMaterials.get(compatibleMaterial).name() - )); - - assertEquals(bukkitMaterial.isAir(), compatibleMaterial.isAir(), getMaterialPropertyAssertionError(compatibleMaterial, "Air")); - assertEquals(bukkitMaterial.isBlock(), compatibleMaterial.isBlock(), getMaterialPropertyAssertionError(compatibleMaterial, "Block")); - assertEquals(bukkitMaterial.isBurnable(), compatibleMaterial.isBurnable(), getMaterialPropertyAssertionError(compatibleMaterial, "Burnable")); - assertEquals(bukkitMaterial.isEdible(), compatibleMaterial.isEdible(), getMaterialPropertyAssertionError(compatibleMaterial, "Edible")); - assertEquals(bukkitMaterial.isFlammable(), compatibleMaterial.isFlammable(), getMaterialPropertyAssertionError(compatibleMaterial, "Flammable")); - assertEquals(bukkitMaterial.isFuel(), compatibleMaterial.isFuel(), getMaterialPropertyAssertionError(compatibleMaterial, "Fuel")); - assertEquals(bukkitMaterial.isInteractable(), compatibleMaterial.isInteractable(), getMaterialPropertyAssertionError(compatibleMaterial, "Interactable")); - assertEquals(bukkitMaterial.isItem(), compatibleMaterial.isItem(), getMaterialPropertyAssertionError(compatibleMaterial, "Item")); - assertEquals(bukkitMaterial.isOccluding(), compatibleMaterial.isOccluding(), getMaterialPropertyAssertionError(compatibleMaterial, "Occluding")); - assertEquals(bukkitMaterial.isSolid(), compatibleMaterial.isSolid(), getMaterialPropertyAssertionError(compatibleMaterial, "Solid")); - assertEquals(bukkitMaterial.isTransparent(), compatibleMaterial.isTransparent(), getMaterialPropertyAssertionError(compatibleMaterial, "Transparent")); - - assertFalse(compatibleMaterial.usesCompatibility()); - assertFalse(compatibleMaterial.usesData()); - assertEquals(-1, compatibleMaterial.getData()); - - ItemStack compatibleItem = compatibleMaterial.getItem(); - assertEquals(bukkitMaterial, compatibleItem.getType()); - assertEquals(compatibleMaterial, CompatibleMaterial.getMaterial(compatibleItem)); - - returnedMaterials.put(compatibleMaterial, bukkitMaterial); - } - } - - private Supplier getMaterialPropertyAssertionError(CompatibleMaterial compatibleMaterial, String propertyName) { - return () -> String.format("Expected CompatibleMaterial.%s to be '%s'", compatibleMaterial.name(), propertyName); - } -} diff --git a/Core/src/test/java/com/songoda/core/http/MockHttpClient.java b/Core/src/test/java/com/songoda/core/http/MockHttpClient.java new file mode 100644 index 00000000..ed329953 --- /dev/null +++ b/Core/src/test/java/com/songoda/core/http/MockHttpClient.java @@ -0,0 +1,22 @@ +package com.songoda.core.http; + +import org.jetbrains.annotations.NotNull; + +import java.util.LinkedList; +import java.util.List; + +public class MockHttpClient implements HttpClient { + public HttpResponse returnValue; + public List callsOnGet = new LinkedList<>(); + + public MockHttpClient(HttpResponse returnValue) { + this.returnValue = returnValue; + } + + @Override + public @NotNull HttpResponse get(String url) { + this.callsOnGet.add(url); + + return this.returnValue; + } +} diff --git a/Core/src/test/java/com/songoda/core/http/MockHttpResponse.java b/Core/src/test/java/com/songoda/core/http/MockHttpResponse.java new file mode 100644 index 00000000..3a9a48cf --- /dev/null +++ b/Core/src/test/java/com/songoda/core/http/MockHttpResponse.java @@ -0,0 +1,25 @@ +package com.songoda.core.http; + +import java.nio.charset.StandardCharsets; + +public class MockHttpResponse implements HttpResponse { + public int responseCode; + public byte[] body; + + public MockHttpResponse(int responseCode, byte[] body) { + this.responseCode = responseCode; + this.body = body; + } + + public int getResponseCode() { + return this.responseCode; + } + + public byte[] getBody() { + return this.body; + } + + public String getBodyAsString() { + return new String(getBody(), StandardCharsets.UTF_8); + } +} diff --git a/Core/src/test/java/com/songoda/core/input/ChatPromptTest.java b/Core/src/test/java/com/songoda/core/input/ChatPromptTest.java deleted file mode 100644 index 06d8e22f..00000000 --- a/Core/src/test/java/com/songoda/core/input/ChatPromptTest.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.songoda.core.input; - -import be.seeseemelk.mockbukkit.MockBukkit; -import be.seeseemelk.mockbukkit.MockPlugin; -import be.seeseemelk.mockbukkit.ServerMock; -import be.seeseemelk.mockbukkit.entity.PlayerMock; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -@Disabled("BukkitMock seems to cause some troubles here, skipping for now") -class ChatPromptTest { - private final String inputMsg = "&eInput-Message"; - - private ServerMock server; - private MockPlugin plugin; - private PlayerMock player; - - @BeforeEach - void setUp() { - this.server = MockBukkit.mock(); - this.plugin = MockBukkit.createMockPlugin(); - this.player = this.server.addPlayer(); - } - - @AfterEach - void tearDown() { - MockBukkit.unmock(); - } - - @Test - void showPrompt() throws InterruptedException { - List chatInputs = new ArrayList<>(1); - - ChatPrompt.showPrompt(this.plugin, this.player, event -> { - assertEquals(this.player, event.getPlayer()); - - chatInputs.add(event.getMessage()); - }); - - this.player.chat(this.inputMsg); - Thread.sleep(1000); - // this.server.getScheduler().waitAsyncTasksFinished() // does not wait for async events - - String playerReceivedMsg = this.player.nextMessage(); - - assertNotNull(playerReceivedMsg); - assertTrue(playerReceivedMsg.endsWith(this.inputMsg)); - - assertEquals(1, chatInputs.size()); - assertEquals(this.inputMsg, chatInputs.get(0)); - } - - /* FIXME: Something is still running in the background and prevents the test from finishing */ - @Disabled("Scheduling mock seems bugged, skipping for now") - @Test - void showPromptWithTimeout() { - AtomicBoolean calledOnClose = new AtomicBoolean(false); - - ChatPrompt.showPrompt(this.plugin, this.player, event -> { - }) - .setOnClose(() -> calledOnClose.set(true)) - .setTimeOut(this.player, 40); - - this.server.getScheduler().performTicks(40); - - String playerReceivedMsg = this.player.nextMessage(); - - assertNotNull(playerReceivedMsg); - assertTrue(playerReceivedMsg.contains("timed out")); - - this.server.getScheduler().performOneTick(); - assertTrue(calledOnClose.get()); - } - - @Test - void cancelPrompt() { - AtomicBoolean calledOnCancel = new AtomicBoolean(false); - AtomicBoolean calledHandler = new AtomicBoolean(false); - - ChatPrompt prompt = ChatPrompt.showPrompt(plugin, player, (event) -> calledHandler.set(true)); - prompt.setOnCancel(() -> calledOnCancel.set(true)); - - this.server.dispatchCommand(player, "cancel"); - // this.player.chat("/cancel"); -// Thread.sleep(1000); - // this.server.getScheduler().waitAsyncTasksFinished() // does not wait for async events - - System.out.println(this.player.nextMessage()); - -// assertTrue(player.nextMessage().endsWith("/cancel")); - - assertTrue(calledOnCancel.get()); - assertFalse(calledHandler.get()); - } - - @Test - void isRegistered() { - assertFalse(ChatPrompt.isRegistered(this.player)); - - ChatPrompt.showPrompt(this.plugin, this.player, (event) -> { - }); - - assertTrue(ChatPrompt.isRegistered(this.player)); - } - - @Test - void unregister() { - assertFalse(ChatPrompt.unregister(this.player)); - - ChatPrompt.showPrompt(this.plugin, this.player, (event) -> { - }); - - assertTrue(ChatPrompt.unregister(this.player)); - assertFalse(ChatPrompt.unregister(this.player)); - } -} diff --git a/Core/src/test/java/com/songoda/core/math/MathUtilsTest.java b/Core/src/test/java/com/songoda/core/math/MathUtilsTest.java index 20147be8..d0aba855 100644 --- a/Core/src/test/java/com/songoda/core/math/MathUtilsTest.java +++ b/Core/src/test/java/com/songoda/core/math/MathUtilsTest.java @@ -2,16 +2,19 @@ package com.songoda.core.math; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrowsExactly; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; class MathUtilsTest { private final String warningMessage = "MathTest"; - private final String warningMessageExpectedStart = warningMessage + " "; + private final String warningMessageExpectedStart = this.warningMessage + " "; @Test void eval() { + assertEquals(0, MathUtils.eval("0")); + assertEquals(10, MathUtils.eval("10")); + assertEquals(0.0, MathUtils.eval("0.0")); + assertEquals(10.5, MathUtils.eval("10.5")); + assertEquals(10.5 + 4, MathUtils.eval("10.5 + 4")); assertEquals(10.5 - 5, MathUtils.eval("10.5 - 5")); assertEquals(10 * 4, MathUtils.eval("10 * 4")); @@ -33,28 +36,28 @@ class MathUtilsTest { @Test void evalWithCommaAsDecimalSeparator() { - Exception ex = assertThrowsExactly(RuntimeException.class, () -> MathUtils.eval("1,0", warningMessage)); + Exception ex = assertThrowsExactly(RuntimeException.class, () -> MathUtils.eval("1,0", this.warningMessage)); - assertTrue(ex.getMessage().startsWith(warningMessageExpectedStart), - () -> "'" + ex.getMessage() + "' does not start with '" + warningMessageExpectedStart + "'"); + assertTrue(ex.getMessage().startsWith(this.warningMessageExpectedStart), + () -> "'" + ex.getMessage() + "' does not start with '" + this.warningMessageExpectedStart + "'"); assertTrue(ex.getMessage().contains("Unexpected: ")); } @Test void evalWithUnsupportedSyntax() { - Exception ex = assertThrowsExactly(RuntimeException.class, () -> MathUtils.eval("!2", warningMessage)); + Exception ex = assertThrowsExactly(RuntimeException.class, () -> MathUtils.eval("!2", this.warningMessage)); - assertTrue(ex.getMessage().startsWith(warningMessageExpectedStart), - () -> "'" + ex.getMessage() + "' does not start with '" + warningMessageExpectedStart + "'"); + assertTrue(ex.getMessage().startsWith(this.warningMessageExpectedStart), + () -> "'" + ex.getMessage() + "' does not start with '" + this.warningMessageExpectedStart + "'"); assertTrue(ex.getMessage().contains("Unexpected: ")); } @Test void evalWithUnsupportedFunction() { - Exception ex = assertThrowsExactly(RuntimeException.class, () -> MathUtils.eval("acos(90)", warningMessage)); + Exception ex = assertThrowsExactly(RuntimeException.class, () -> MathUtils.eval("acos(90)", this.warningMessage)); - assertTrue(ex.getMessage().startsWith(warningMessageExpectedStart), - () -> "'" + ex.getMessage() + "' does not start with '" + warningMessageExpectedStart + "'"); + assertTrue(ex.getMessage().startsWith(this.warningMessageExpectedStart), + () -> "'" + ex.getMessage() + "' does not start with '" + this.warningMessageExpectedStart + "'"); assertTrue(ex.getMessage().contains("Unknown function: ")); } } diff --git a/Core/src/test/java/com/songoda/core/utils/LocationUtilsTest.java b/Core/src/test/java/com/songoda/core/utils/LocationUtilsTest.java index 9fc10215..3af6cab8 100644 --- a/Core/src/test/java/com/songoda/core/utils/LocationUtilsTest.java +++ b/Core/src/test/java/com/songoda/core/utils/LocationUtilsTest.java @@ -1,9 +1,10 @@ package com.songoda.core.utils; -import be.seeseemelk.mockbukkit.WorldMock; import org.bukkit.Location; +import org.bukkit.World; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -13,12 +14,20 @@ class LocationUtilsTest { void isLocationMatching() { assertTrue(LocationUtils.isLocationMatching( new Location(null, 10, 20, 30), - new Location(new WorldMock(), 10.25, 20.5, 30.75) + new Location(Mockito.mock(World.class), 10.25, 20.5, 30.75) + )); + assertTrue(LocationUtils.isLocationMatching( + new Location(null, 10, 20, 30), + new Location(null, 10.25, 20.5, 30.75) )); assertFalse(LocationUtils.isLocationMatching( new Location(null, 10, 20, 30), - new Location(new WorldMock(), -10.25, 20.5, 30.75) + new Location(Mockito.mock(World.class), -10.25, 20.5, 30.75) + )); + assertFalse(LocationUtils.isLocationMatching( + new Location(Mockito.mock(World.class), 10, 20, 30), + new Location(null, -10.25, 20.5, 30.75) )); } diff --git a/Core/src/test/java/com/songoda/core/utils/PlayerUtilsTest.java b/Core/src/test/java/com/songoda/core/utils/PlayerUtilsTest.java index d7bcb1c2..99d19cc8 100644 --- a/Core/src/test/java/com/songoda/core/utils/PlayerUtilsTest.java +++ b/Core/src/test/java/com/songoda/core/utils/PlayerUtilsTest.java @@ -1,134 +1,143 @@ package com.songoda.core.utils; -import be.seeseemelk.mockbukkit.MockBukkit; -import be.seeseemelk.mockbukkit.ServerMock; -import be.seeseemelk.mockbukkit.entity.PlayerMock; -import org.bukkit.Material; +import org.bukkit.Bukkit; +import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; +import org.bukkit.inventory.PlayerInventory; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.mockito.InOrder; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; class PlayerUtilsTest { - private ServerMock server; + @Test + void sendMessages_Array() { + Player player = Mockito.mock(Player.class); + PlayerUtils.sendMessages(player, "First message", "Second message"); - @BeforeEach - void setUp() { - this.server = MockBukkit.mock(); - } - - @AfterEach - void tearDown() { - MockBukkit.unmock(); - this.server = null; + InOrder playerInOrder = Mockito.inOrder(player); + playerInOrder.verify(player).sendMessage("First message"); + playerInOrder.verify(player).sendMessage("Second message"); + playerInOrder.verify(player, Mockito.never()).sendMessage(Mockito.anyString()); } @Test - void sendMessages() { - String[] messages = new String[] {"First message", "Second message"}; + void sendMessages_List() { + Player player = Mockito.mock(Player.class); + PlayerUtils.sendMessages(player, Arrays.asList("First message", "Second message")); - PlayerMock player = this.server.addPlayer(); - - PlayerUtils.sendMessages(player, messages); - PlayerUtils.sendMessages(player, Arrays.asList(messages)); - - for (int i = 0; i < 2; ++i) { - assertEquals(messages[0], player.nextMessage()); - assertEquals(messages[1], player.nextMessage()); - } - - assertNull(player.nextMessage()); + InOrder playerInOrder = Mockito.inOrder(player); + playerInOrder.verify(player).sendMessage("First message"); + playerInOrder.verify(player).sendMessage("Second message"); + playerInOrder.verify(player, Mockito.never()).sendMessage(Mockito.anyString()); } - @Disabled("Player#hidePlayer can currently not be mocked") @Test void getVisiblePlayerNames() { - PlayerMock player = this.server.addPlayer("BasePlayer"); - PlayerMock visiblePlayer = this.server.addPlayer("VisiblePlayer"); - PlayerMock hiddenPlayer = this.server.addPlayer("HiddenPlayer"); + Player player = createMockPlayer("BasePlayer"); + Player visiblePlayer = createMockPlayer("VisiblePlayer"); + Player hiddenPlayer = createMockPlayer("HiddenPlayer"); - player.hidePlayer(MockBukkit.createMockPlugin(), hiddenPlayer); + List result; + try (MockedStatic server = Mockito.mockStatic(Bukkit.class)) { + server.when(Bukkit::getOnlinePlayers).thenReturn(Arrays.asList(player, visiblePlayer, hiddenPlayer)); - List result = PlayerUtils.getVisiblePlayerNames(player, null); - assertTrue(result.contains(visiblePlayer.getName())); - assertFalse(result.contains(hiddenPlayer.getName())); - assertFalse(result.contains(player.getName())); + Mockito.when(player.canSee(hiddenPlayer)).thenReturn(false); + Mockito.when(player.canSee(visiblePlayer)).thenReturn(true); - assertEquals(0, PlayerUtils.getVisiblePlayerNames(player, "_").size()); + assertEquals(0, PlayerUtils.getVisiblePlayerNames(player, "_").size()); + + result = PlayerUtils.getVisiblePlayerNames(player, null); + } + + assertTrue(result.contains("VisiblePlayer")); + assertEquals(1, result.size()); } - @Disabled("Player#hidePlayer can currently not be mocked") @Test void getVisiblePlayerDisplayNames() { - PlayerMock player = this.server.addPlayer("BasePlayer"); - PlayerMock visiblePlayer = this.server.addPlayer("VisiblePlayer"); - PlayerMock hiddenPlayer = this.server.addPlayer("HiddenPlayer"); + Player player = createMockPlayer("BasePlayer"); + Player visiblePlayer = createMockPlayer("VisiblePlayer", "VisibleDisplayName"); + Player hiddenPlayer = createMockPlayer("HiddenPlayer"); - player.setDisplayName("Base"); - visiblePlayer.setDisplayName("Visible"); - hiddenPlayer.setDisplayName("Hidden"); + List result; + try (MockedStatic server = Mockito.mockStatic(Bukkit.class)) { + server.when(Bukkit::getOnlinePlayers).thenReturn(Arrays.asList(player, visiblePlayer, hiddenPlayer)); - player.hidePlayer(MockBukkit.createMockPlugin(), hiddenPlayer); + Mockito.when(player.canSee(hiddenPlayer)).thenReturn(false); + Mockito.when(player.canSee(visiblePlayer)).thenReturn(true); - List result = PlayerUtils.getVisiblePlayerDisplayNames(player, null); - assertTrue(result.contains(visiblePlayer.getDisplayName())); - assertFalse(result.contains(hiddenPlayer.getDisplayName())); - assertFalse(result.contains(player.getDisplayName())); + assertEquals(0, PlayerUtils.getVisiblePlayerDisplayNames(player, "A").size()); - assertEquals(0, PlayerUtils.getVisiblePlayerDisplayNames(player, "_").size()); + result = PlayerUtils.getVisiblePlayerDisplayNames(player, null); + } + + assertTrue(result.contains("VisibleDisplayName")); + assertEquals(1, result.size()); } - @Disabled("Player#hidePlayer can currently not be mocked") @Test void getVisiblePlayers() { - PlayerMock player = this.server.addPlayer("BasePlayer"); - PlayerMock visiblePlayer = this.server.addPlayer("VisiblePlayer"); - PlayerMock hiddenPlayer = this.server.addPlayer("HiddenPlayer"); + Player player = createMockPlayer("BasePlayer"); + Player visiblePlayer = createMockPlayer("VisiblePlayer"); + Player hiddenPlayer = createMockPlayer("HiddenPlayer"); - player.hidePlayer(MockBukkit.createMockPlugin(), hiddenPlayer); + Mockito.when(player.canSee(hiddenPlayer)).thenReturn(false); + Mockito.when(player.canSee(visiblePlayer)).thenReturn(true); + + List result; + try (MockedStatic server = Mockito.mockStatic(Bukkit.class)) { + server.when(Bukkit::getOnlinePlayers).thenReturn(Arrays.asList(player, visiblePlayer, hiddenPlayer)); + + assertEquals(0, PlayerUtils.getVisiblePlayers(player, "_").size()); + + result = PlayerUtils.getVisiblePlayers(player, null); + } - List result = PlayerUtils.getVisiblePlayers(player, null); assertTrue(result.contains(visiblePlayer)); - assertFalse(result.contains(hiddenPlayer)); - assertFalse(result.contains(player)); - - assertEquals(0, PlayerUtils.getVisiblePlayers(player, "_").size()); + assertEquals(1, result.size()); } @Test void getAllPlayers() { - PlayerMock basePlayer = this.server.addPlayer("BasePlayer"); - this.server.addPlayer("Player_1"); - this.server.addPlayer("Player_2"); - this.server.addPlayer("Player3"); + Player basePlayer = createMockPlayer("BasePlayer"); + Player player1 = createMockPlayer("Player_1"); + Player player2 = createMockPlayer("Player_2"); + Player player3 = createMockPlayer("Player3"); - List result = PlayerUtils.getAllPlayers(basePlayer, ""); - assertEquals(3, result.size()); - assertFalse(result.contains(basePlayer.getName())); + try (MockedStatic server = Mockito.mockStatic(Bukkit.class)) { + server.when(Bukkit::getOnlinePlayers).thenReturn(Arrays.asList(basePlayer, player1, player2, player3)); - assertTrue(PlayerUtils.getAllPlayers(basePlayer, "_").isEmpty()); - assertEquals(0, PlayerUtils.getAllPlayers(basePlayer, "Player_").size()); + assertEquals(0, PlayerUtils.getVisiblePlayers(basePlayer, "_").size()); + + List result = PlayerUtils.getAllPlayers(basePlayer, ""); + assertFalse(result.contains(basePlayer.getName())); + assertEquals(3, result.size()); + + assertEquals(0, PlayerUtils.getAllPlayers(basePlayer, "_").size()); + assertEquals(0, PlayerUtils.getAllPlayers(basePlayer, "Player_").size()); + } } @Disabled("Disabled for now as the implementations seems to be faulty") @Test void getAllPlayersDisplay() { - PlayerMock basePlayer = this.server.addPlayer("BasePlayer"); - this.server.addPlayer("Player_1"); - this.server.addPlayer("Player_2"); - this.server.addPlayer("Player3"); + Player basePlayer = createMockPlayer("BasePlayer"); + createMockPlayer("Player_1"); + createMockPlayer("Player_2"); + createMockPlayer("Player3"); List result = PlayerUtils.getAllPlayersDisplay(basePlayer, ""); assertEquals(3, result.size()); @@ -141,13 +150,9 @@ class PlayerUtilsTest { @Disabled("Disabled for now as the implementations seems to be faulty") @Test void findPlayer() { - Player p3 = this.server.addPlayer("Player"); - Player p1 = this.server.addPlayer("Player_1"); - Player p2 = this.server.addPlayer("_Player_2"); - - p1.setDisplayName("p1"); - p2.setDisplayName("p2"); - p3.setDisplayName("p3"); + Player p3 = createMockPlayer("Player", "p3"); + Player p1 = createMockPlayer("Player_1", "p1"); + Player p2 = createMockPlayer("_Player_2", "p2"); assertEquals(p1, PlayerUtils.findPlayer("Player_")); assertEquals(p2, PlayerUtils.findPlayer("_Play")); @@ -160,73 +165,185 @@ class PlayerUtilsTest { } @Test - void getRandomPlayer() { - assertNull(PlayerUtils.getRandomPlayer()); - - for (int i = 0; i < 10; ++i) { - this.server.addPlayer(String.valueOf(i)); + void getRandomPlayer_NoneOnline() { + try (MockedStatic server = Mockito.mockStatic(Bukkit.class)) { + server.when(Bukkit::getOnlinePlayers).thenReturn(Collections.emptyList()); + assertNull(PlayerUtils.getRandomPlayer()); } + } - Set returnedPlayers = new HashSet<>(); - for (int i = 0; i < 50; ++i) { - if (returnedPlayers.size() >= 5) { - break; + @Test + void getRandomPlayer() { + try (MockedStatic server = Mockito.mockStatic(Bukkit.class)) { + List players = new ArrayList<>(10); + for (int i = 0; i < 10; ++i) { + Player player = createMockPlayer("Player_" + i); + players.add(player); } - returnedPlayers.add(PlayerUtils.getRandomPlayer()); - } + server.when(Bukkit::getOnlinePlayers).thenReturn(players); - assertTrue(returnedPlayers.size() >= 5); + Set returnedPlayers = new HashSet<>(); + for (int i = 0; i < 50; ++i) { + if (returnedPlayers.size() >= 5) { + break; + } + + returnedPlayers.add(PlayerUtils.getRandomPlayer()); + } + + assertTrue(returnedPlayers.size() >= 5); + } } @Test void giveItem() { - Player player = this.server.addPlayer(); + PlayerInventory inventory = Mockito.mock(PlayerInventory.class); + InOrder inventoryInOrder = Mockito.inOrder(inventory); - PlayerUtils.giveItem(player, new ItemStack(Material.STONE)); - assertTrue(player.getInventory().contains(Material.STONE, 1)); + Player player = createMockPlayer("Player"); + Mockito.when(player.getInventory()).thenReturn(inventory); + Mockito.when(player.isOnline()).thenReturn(true); - PlayerUtils.giveItem(player, new ItemStack(Material.GRASS_BLOCK), new ItemStack(Material.GRASS_BLOCK)); - assertTrue(player.getInventory().contains(Material.GRASS_BLOCK, 2)); + ItemStack itemToAdd = Mockito.mock(ItemStack.class); - PlayerUtils.giveItem(player, Arrays.asList(new ItemStack(Material.WHEAT_SEEDS), new ItemStack(Material.WHEAT_SEEDS))); - assertTrue(player.getInventory().contains(Material.WHEAT_SEEDS, 2)); + PlayerUtils.giveItem(player, itemToAdd); + inventoryInOrder.verify(inventory).addItem(itemToAdd); + inventoryInOrder.verify(inventory, Mockito.never()).addItem(Mockito.any()); } @Test - void giveItemOnFullInventory() { - PlayerMock player = this.server.addPlayer(); + void giveItem_Array() { + PlayerInventory inventory = Mockito.mock(PlayerInventory.class); + InOrder inventoryInOrder = Mockito.inOrder(inventory); - fillInventory(player); + Player player = createMockPlayer("Player"); + Mockito.when(player.getInventory()).thenReturn(inventory); + Mockito.when(player.isOnline()).thenReturn(true); - int entityCount = this.server.getEntities().size(); - PlayerUtils.giveItem(player, new ItemStack(Material.STONE)); - assertEquals(entityCount + 1, this.server.getEntities().size()); + ItemStack[] itemsToAdd = new ItemStack[] {Mockito.mock(ItemStack.class), Mockito.mock(ItemStack.class)}; - entityCount = this.server.getEntities().size(); - PlayerUtils.giveItem(player, new ItemStack(Material.GRASS_BLOCK), new ItemStack(Material.GRASS_BLOCK)); - assertEquals(entityCount + 2, this.server.getEntities().size()); + PlayerUtils.giveItem(player, itemsToAdd); + inventoryInOrder.verify(inventory).addItem(itemsToAdd); + inventoryInOrder.verify(inventory, Mockito.never()).addItem(Mockito.any()); + } - entityCount = this.server.getEntities().size(); - PlayerUtils.giveItem(player, Arrays.asList(new ItemStack(Material.WHEAT_SEEDS), new ItemStack(Material.WHEAT_SEEDS), new ItemStack(Material.WHEAT_SEEDS))); - assertEquals(entityCount + 3, this.server.getEntities().size()); + @Test + void giveItem_List() { + PlayerInventory inventory = Mockito.mock(PlayerInventory.class); + InOrder inventoryInOrder = Mockito.inOrder(inventory); + + Player player = createMockPlayer("Player"); + Mockito.when(player.getInventory()).thenReturn(inventory); + Mockito.when(player.isOnline()).thenReturn(true); + + ItemStack[] itemsToAdd = new ItemStack[] {Mockito.mock(ItemStack.class), Mockito.mock(ItemStack.class)}; + + PlayerUtils.giveItem(player, Arrays.asList(itemsToAdd)); + inventoryInOrder.verify(inventory).addItem(itemsToAdd); + inventoryInOrder.verify(inventory, Mockito.never()).addItem(Mockito.any()); + } + + @Test + void giveItem_FullInventory() { + ItemStack itemToAdd = Mockito.mock(ItemStack.class); + + PlayerInventory inventory = Mockito.mock(PlayerInventory.class); + Mockito.when(inventory.addItem(itemToAdd)).thenReturn(new HashMap() {{ + put(0, itemToAdd); + }}); + InOrder inventoryInOrder = Mockito.inOrder(inventory); + + Player player = createMockPlayer("Player"); + Mockito.when(player.getInventory()).thenReturn(inventory); + Mockito.when(player.isOnline()).thenReturn(true); + + World world = Mockito.mock(World.class); + InOrder worldInOrder = Mockito.inOrder(world); + Mockito.when(player.getWorld()).thenReturn(world); + + PlayerUtils.giveItem(player, itemToAdd); + + inventoryInOrder.verify(inventory).addItem(itemToAdd); + inventoryInOrder.verify(inventory, Mockito.never()).addItem(Mockito.any()); + + worldInOrder.verify(world).dropItemNaturally(Mockito.any(), Mockito.eq(itemToAdd)); + worldInOrder.verify(world, Mockito.never()).dropItemNaturally(Mockito.any(), Mockito.any()); + } + + @Test + void giveItem_FullInventory_Array() { + ItemStack[] itemsToAdd = new ItemStack[] {Mockito.mock(ItemStack.class), Mockito.mock(ItemStack.class)}; + + PlayerInventory inventory = Mockito.mock(PlayerInventory.class); + Mockito.when(inventory.addItem(Mockito.any())).thenReturn(new HashMap() {{ + put(0, itemsToAdd[0]); + put(1, itemsToAdd[1]); + }}); + InOrder inventoryInOrder = Mockito.inOrder(inventory); + + Player player = createMockPlayer("Player"); + Mockito.when(player.getInventory()).thenReturn(inventory); + Mockito.when(player.isOnline()).thenReturn(true); + + World world = Mockito.mock(World.class); + InOrder worldInOrder = Mockito.inOrder(world); + Mockito.when(player.getWorld()).thenReturn(world); + + PlayerUtils.giveItem(player, itemsToAdd); + inventoryInOrder.verify(inventory).addItem(itemsToAdd); + inventoryInOrder.verify(inventory, Mockito.never()).addItem(Mockito.any()); + + worldInOrder.verify(world).dropItemNaturally(Mockito.any(), Mockito.eq(itemsToAdd[0])); + worldInOrder.verify(world).dropItemNaturally(Mockito.any(), Mockito.eq(itemsToAdd[1])); + worldInOrder.verify(world, Mockito.never()).dropItemNaturally(Mockito.any(), Mockito.any()); + } + + @Test + void giveItem_FullInventory_List() { + ItemStack[] itemsToAdd = new ItemStack[] {Mockito.mock(ItemStack.class), Mockito.mock(ItemStack.class)}; + + PlayerInventory inventory = Mockito.mock(PlayerInventory.class); + Mockito.when(inventory.addItem(Mockito.any())).thenReturn(new HashMap() {{ + put(0, itemsToAdd[0]); + put(1, itemsToAdd[1]); + }}); + InOrder inventoryInOrder = Mockito.inOrder(inventory); + + Player player = createMockPlayer("Player"); + Mockito.when(player.getInventory()).thenReturn(inventory); + Mockito.when(player.isOnline()).thenReturn(true); + + World world = Mockito.mock(World.class); + InOrder worldInOrder = Mockito.inOrder(world); + Mockito.when(player.getWorld()).thenReturn(world); + + PlayerUtils.giveItem(player, Arrays.asList(itemsToAdd)); + inventoryInOrder.verify(inventory).addItem(itemsToAdd); + inventoryInOrder.verify(inventory, Mockito.never()).addItem(Mockito.any()); + + worldInOrder.verify(world).dropItemNaturally(Mockito.any(), Mockito.eq(itemsToAdd[0])); + worldInOrder.verify(world).dropItemNaturally(Mockito.any(), Mockito.eq(itemsToAdd[1])); + worldInOrder.verify(world, Mockito.never()).dropItemNaturally(Mockito.any(), Mockito.any()); } @Disabled("Test is incomplete") @Test void getNumberFromPermission() { - Player player = this.server.addPlayer(); + Player player = createMockPlayer("Player"); assertEquals(-1, PlayerUtils.getNumberFromPermission(player, "example.plugin.feature", -1)); } - private void fillInventory(Player player) { - ItemStack[] contents = new ItemStack[player.getInventory().getContents().length]; + private Player createMockPlayer(String name) { + return createMockPlayer(name, name); + } - for (int i = 0; i < contents.length; ++i) { - contents[i] = new ItemStack(Material.BARRIER); - } + private Player createMockPlayer(String name, String displayName) { + Player player = Mockito.mock(Player.class); + Mockito.when(player.getName()).thenReturn(name); + Mockito.when(player.getDisplayName()).thenReturn(displayName); - player.getInventory().setContents(contents); + return player; } } diff --git a/NMS/NMS-API/pom.xml b/NMS/NMS-API/pom.xml index 87a4b50b..9067aaad 100644 --- a/NMS/NMS-API/pom.xml +++ b/NMS/NMS-API/pom.xml @@ -10,15 +10,14 @@ 2.6.21 ../../pom.xml - SongodaCore-NMS-API - jar + org.spigotmc - spigot - 1.17 + spigot-api + 1.8-R0.1-SNAPSHOT provided @@ -26,6 +25,7 @@ ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-API/src/main/java/com/songoda/core/nms/NmsImplementations.java b/NMS/NMS-API/src/main/java/com/songoda/core/nms/NmsImplementations.java new file mode 100644 index 00000000..e2908f5d --- /dev/null +++ b/NMS/NMS-API/src/main/java/com/songoda/core/nms/NmsImplementations.java @@ -0,0 +1,20 @@ +package com.songoda.core.nms; + +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +public interface NmsImplementations { + @NotNull NMSPlayer getPlayer(); + + @NotNull WorldCore getWorld(); + + @NotNull NmsWorldBorder getWorldBorder(); + + @NotNull AnvilCore getAnvil(); + + @NotNull NBTCore getNbt(); +} diff --git a/NMS/NMS-API/src/main/java/com/songoda/core/nms/world/NmsWorldBorder.java b/NMS/NMS-API/src/main/java/com/songoda/core/nms/world/NmsWorldBorder.java new file mode 100644 index 00000000..6168ab47 --- /dev/null +++ b/NMS/NMS-API/src/main/java/com/songoda/core/nms/world/NmsWorldBorder.java @@ -0,0 +1,12 @@ +package com.songoda.core.nms.world; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +public interface NmsWorldBorder { + void send(Player player, BorderColor color, double size, Location center); + + enum BorderColor { + BLUE, GREEN, RED + } +} diff --git a/NMS/NMS-API/src/main/java/com/songoda/core/nms/world/SWorld.java b/NMS/NMS-API/src/main/java/com/songoda/core/nms/world/SWorld.java index cbb03732..6f2dd16b 100644 --- a/NMS/NMS-API/src/main/java/com/songoda/core/nms/world/SWorld.java +++ b/NMS/NMS-API/src/main/java/com/songoda/core/nms/world/SWorld.java @@ -1,9 +1,20 @@ package com.songoda.core.nms.world; +import org.bukkit.Material; import org.bukkit.entity.LivingEntity; import java.util.List; public interface SWorld { List getLivingEntities(); + + /** + * Set a block to a certain type by updating the block directly in the NMS chunk. + *
+ * The chunk must be loaded and players must relog if they have the chunk loaded in order to use this method. + * (F3+A is not enough) + */ + // TODO: Check if FabledSkyBlock *really* needs this method and if it can be removed. + // Would make thinks less complicated and I kinda cannot imagine it being *that* much faster to be worth it? + void setBlockFast(int x, int y, int z, Material material); } diff --git a/NMS/NMS-API/src/main/java/com/songoda/core/nms/world/WorldCore.java b/NMS/NMS-API/src/main/java/com/songoda/core/nms/world/WorldCore.java index 302569c9..f071d9ea 100644 --- a/NMS/NMS-API/src/main/java/com/songoda/core/nms/world/WorldCore.java +++ b/NMS/NMS-API/src/main/java/com/songoda/core/nms/world/WorldCore.java @@ -7,8 +7,13 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public interface WorldCore { + /** + * @deprecated Use {@link #getSpawner(Location)} instead + */ + @Deprecated SSpawner getSpawner(CreatureSpawner spawner); SSpawner getSpawner(Location location); @@ -29,7 +34,7 @@ public interface WorldCore { */ void randomTickChunk(Chunk bukkitChunk, int tickAmount) throws ReflectiveOperationException; - void updateAdjacentComparators(Block bukkitBlock); + void updateAdjacentComparators(@NotNull Block bukkitBlock); /** * Ticks all inactive spawners in a specific chunk ignoring the minimum required players within a specific range.
diff --git a/NMS/NMS-v1_10_R1/pom.xml b/NMS/NMS-v1_10_R1/pom.xml index d92e5390..6c90f81b 100644 --- a/NMS/NMS-v1_10_R1/pom.xml +++ b/NMS/NMS-v1_10_R1/pom.xml @@ -10,9 +10,7 @@ 2.6.21 ../../pom.xml - SongodaCore-NMS-v1_10_R1 - jar @@ -26,12 +24,14 @@ ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_10_R1/src/main/java/com/songoda/core/nms/v1_10_R1/NmsImplementationsImpl.java b/NMS/NMS-v1_10_R1/src/main/java/com/songoda/core/nms/v1_10_R1/NmsImplementationsImpl.java new file mode 100644 index 00000000..aa1332e9 --- /dev/null +++ b/NMS/NMS-v1_10_R1/src/main/java/com/songoda/core/nms/v1_10_R1/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_10_R1; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_10_R1.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_10_R1.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_10_R1.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_10_R1.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_10_R1.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_10_R1/src/main/java/com/songoda/core/nms/v1_10_R1/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_10_R1/src/main/java/com/songoda/core/nms/v1_10_R1/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..5cbaa05e --- /dev/null +++ b/NMS/NMS-v1_10_R1/src/main/java/com/songoda/core/nms/v1_10_R1/world/NmsWorldBorderImpl.java @@ -0,0 +1,35 @@ +package com.songoda.core.nms.v1_10_R1.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.server.v1_10_R1.PacketPlayOutWorldBorder; +import net.minecraft.server.v1_10_R1.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_10_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.world = ((CraftWorld) center.getWorld()).getHandle(); + + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningDistance(0); + + if (color == BorderColor.GREEN) { + worldBorder.transitionSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.transitionSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldBorder, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } +} diff --git a/NMS/NMS-v1_10_R1/src/main/java/com/songoda/core/nms/v1_10_R1/world/SWorldImpl.java b/NMS/NMS-v1_10_R1/src/main/java/com/songoda/core/nms/v1_10_R1/world/SWorldImpl.java index 04f7ea34..1c9667ed 100644 --- a/NMS/NMS-v1_10_R1/src/main/java/com/songoda/core/nms/v1_10_R1/world/SWorldImpl.java +++ b/NMS/NMS-v1_10_R1/src/main/java/com/songoda/core/nms/v1_10_R1/world/SWorldImpl.java @@ -1,17 +1,35 @@ package com.songoda.core.nms.v1_10_R1.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.server.v1_10_R1.Block; +import net.minecraft.server.v1_10_R1.BlockPosition; +import net.minecraft.server.v1_10_R1.Chunk; +import net.minecraft.server.v1_10_R1.WorldServer; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_10_R1.CraftWorld; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; import java.util.List; public class SWorldImpl implements SWorld { - public SWorldImpl() { + private final World world; + + public SWorldImpl(World world) { + this.world = world; } @Override public List getLivingEntities() { - return new ArrayList<>(); + return new ArrayList<>(); // FIXME + } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + WorldServer serverLevel = ((CraftWorld) this.world).getHandle(); + Chunk levelChunk = serverLevel.getChunkIfLoaded(x >> 4, z >> 4); + + levelChunk.a(new BlockPosition(x & 0xF, y, z & 0xF), Block.getByCombinedId(0)); } } diff --git a/NMS/NMS-v1_10_R1/src/main/java/com/songoda/core/nms/v1_10_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_10_R1/src/main/java/com/songoda/core/nms/v1_10_R1/world/WorldCoreImpl.java index 37fc32f0..ad85a0a1 100644 --- a/NMS/NMS-v1_10_R1/src/main/java/com/songoda/core/nms/v1_10_R1/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_10_R1/src/main/java/com/songoda/core/nms/v1_10_R1/world/WorldCoreImpl.java @@ -18,9 +18,11 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_10_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_10_R1.CraftWorld; import org.bukkit.craftbukkit.v1_10_R1.block.CraftBlock; import org.bukkit.craftbukkit.v1_10_R1.util.CraftMagicNumbers; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -40,7 +42,7 @@ public class WorldCoreImpl implements WorldCore { @Override public SWorld getWorld(World world) { - return new SWorldImpl(); + return new SWorldImpl(world); } @Override @@ -89,12 +91,12 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(org.bukkit.block.Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull org.bukkit.block.Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); - net.minecraft.server.v1_10_R1.World nmsWorld = craftChunk.getHandle().getWorld(); + WorldServer serverLevel = ((CraftWorld) craftBlock.getWorld()).getHandle(); - BlockPosition blockPosition = new BlockPosition(craftBlock.getX(), craftBlock.getY(), craftBlock.getZ()); - nmsWorld.updateAdjacentComparators(blockPosition, CraftMagicNumbers.getBlock(craftBlock)); + BlockPosition blockPos = new BlockPosition(craftBlock.getX(), craftBlock.getY(), craftBlock.getZ()); + Block nmsBlock = CraftMagicNumbers.getBlock(bukkitBlock.getType()); + serverLevel.updateAdjacentComparators(blockPos, nmsBlock); } } diff --git a/NMS/NMS-v1_11_R1/pom.xml b/NMS/NMS-v1_11_R1/pom.xml index 553f3ed9..ff6ea291 100644 --- a/NMS/NMS-v1_11_R1/pom.xml +++ b/NMS/NMS-v1_11_R1/pom.xml @@ -10,9 +10,7 @@ 2.6.21 ../../pom.xml - SongodaCore-NMS-v1_11_R1 - jar @@ -26,12 +24,14 @@ ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_11_R1/src/main/java/com/songoda/core/nms/v1_11_R1/NmsImplementationsImpl.java b/NMS/NMS-v1_11_R1/src/main/java/com/songoda/core/nms/v1_11_R1/NmsImplementationsImpl.java new file mode 100644 index 00000000..97d66bcb --- /dev/null +++ b/NMS/NMS-v1_11_R1/src/main/java/com/songoda/core/nms/v1_11_R1/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_11_R1; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_11_R1.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_11_R1.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_11_R1.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_11_R1.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_11_R1.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_11_R1/src/main/java/com/songoda/core/nms/v1_11_R1/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_11_R1/src/main/java/com/songoda/core/nms/v1_11_R1/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..f2e1ceb8 --- /dev/null +++ b/NMS/NMS-v1_11_R1/src/main/java/com/songoda/core/nms/v1_11_R1/world/NmsWorldBorderImpl.java @@ -0,0 +1,35 @@ +package com.songoda.core.nms.v1_11_R1.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.server.v1_11_R1.PacketPlayOutWorldBorder; +import net.minecraft.server.v1_11_R1.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_11_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.world = ((CraftWorld) center.getWorld()).getHandle(); + + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningDistance(0); + + if (color == BorderColor.GREEN) { + worldBorder.transitionSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.transitionSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldBorder, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } +} diff --git a/NMS/NMS-v1_11_R1/src/main/java/com/songoda/core/nms/v1_11_R1/world/SWorldImpl.java b/NMS/NMS-v1_11_R1/src/main/java/com/songoda/core/nms/v1_11_R1/world/SWorldImpl.java index e8d37fd4..2a53dde0 100644 --- a/NMS/NMS-v1_11_R1/src/main/java/com/songoda/core/nms/v1_11_R1/world/SWorldImpl.java +++ b/NMS/NMS-v1_11_R1/src/main/java/com/songoda/core/nms/v1_11_R1/world/SWorldImpl.java @@ -1,17 +1,35 @@ package com.songoda.core.nms.v1_11_R1.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.server.v1_11_R1.Block; +import net.minecraft.server.v1_11_R1.BlockPosition; +import net.minecraft.server.v1_11_R1.Chunk; +import net.minecraft.server.v1_11_R1.WorldServer; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_11_R1.CraftWorld; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; import java.util.List; public class SWorldImpl implements SWorld { - public SWorldImpl() { + private final World world; + + public SWorldImpl(World world) { + this.world = world; } @Override public List getLivingEntities() { - return new ArrayList<>(); + return new ArrayList<>(); // FIXME + } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + WorldServer serverLevel = ((CraftWorld) this.world).getHandle(); + Chunk levelChunk = serverLevel.getChunkIfLoaded(x >> 4, z >> 4); + + levelChunk.a(new BlockPosition(x & 0xF, y, z & 0xF), Block.getByCombinedId(0)); } } diff --git a/NMS/NMS-v1_11_R1/src/main/java/com/songoda/core/nms/v1_11_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_11_R1/src/main/java/com/songoda/core/nms/v1_11_R1/world/WorldCoreImpl.java index 15e5f026..62dedf0c 100644 --- a/NMS/NMS-v1_11_R1/src/main/java/com/songoda/core/nms/v1_11_R1/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_11_R1/src/main/java/com/songoda/core/nms/v1_11_R1/world/WorldCoreImpl.java @@ -18,9 +18,11 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_11_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_11_R1.CraftWorld; import org.bukkit.craftbukkit.v1_11_R1.block.CraftBlock; import org.bukkit.craftbukkit.v1_11_R1.util.CraftMagicNumbers; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -40,7 +42,7 @@ public class WorldCoreImpl implements WorldCore { @Override public SWorld getWorld(World world) { - return new SWorldImpl(); + return new SWorldImpl(world); } @Override @@ -89,12 +91,12 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(org.bukkit.block.Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull org.bukkit.block.Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); - net.minecraft.server.v1_11_R1.World nmsWorld = craftChunk.getHandle().getWorld(); + WorldServer serverLevel = ((CraftWorld) craftBlock.getWorld()).getHandle(); - BlockPosition blockPosition = new BlockPosition(craftBlock.getX(), craftBlock.getY(), craftBlock.getZ()); - nmsWorld.updateAdjacentComparators(blockPosition, CraftMagicNumbers.getBlock(craftBlock)); + BlockPosition blockPos = new BlockPosition(craftBlock.getX(), craftBlock.getY(), craftBlock.getZ()); + Block nmsBlock = CraftMagicNumbers.getBlock(bukkitBlock.getType()); + serverLevel.updateAdjacentComparators(blockPos, nmsBlock); } } diff --git a/NMS/NMS-v1_12_R1/pom.xml b/NMS/NMS-v1_12_R1/pom.xml index 579dd688..9248730c 100644 --- a/NMS/NMS-v1_12_R1/pom.xml +++ b/NMS/NMS-v1_12_R1/pom.xml @@ -10,9 +10,7 @@ 2.6.21 ../../pom.xml - SongodaCore-NMS-v1_12_R1 - jar @@ -26,12 +24,14 @@ ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_12_R1/src/main/java/com/songoda/core/nms/v1_12_R1/NmsImplementationsImpl.java b/NMS/NMS-v1_12_R1/src/main/java/com/songoda/core/nms/v1_12_R1/NmsImplementationsImpl.java new file mode 100644 index 00000000..de9a3570 --- /dev/null +++ b/NMS/NMS-v1_12_R1/src/main/java/com/songoda/core/nms/v1_12_R1/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_12_R1; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_12_R1.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_12_R1.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_12_R1.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_12_R1.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_12_R1.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_12_R1/src/main/java/com/songoda/core/nms/v1_12_R1/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_12_R1/src/main/java/com/songoda/core/nms/v1_12_R1/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..20116244 --- /dev/null +++ b/NMS/NMS-v1_12_R1/src/main/java/com/songoda/core/nms/v1_12_R1/world/NmsWorldBorderImpl.java @@ -0,0 +1,35 @@ +package com.songoda.core.nms.v1_12_R1.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.server.v1_12_R1.PacketPlayOutWorldBorder; +import net.minecraft.server.v1_12_R1.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_12_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.world = ((CraftWorld) center.getWorld()).getHandle(); + + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningDistance(0); + + if (color == BorderColor.GREEN) { + worldBorder.transitionSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.transitionSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldBorder, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } +} diff --git a/NMS/NMS-v1_12_R1/src/main/java/com/songoda/core/nms/v1_12_R1/world/SWorldImpl.java b/NMS/NMS-v1_12_R1/src/main/java/com/songoda/core/nms/v1_12_R1/world/SWorldImpl.java index 6015dc65..7ac285dd 100644 --- a/NMS/NMS-v1_12_R1/src/main/java/com/songoda/core/nms/v1_12_R1/world/SWorldImpl.java +++ b/NMS/NMS-v1_12_R1/src/main/java/com/songoda/core/nms/v1_12_R1/world/SWorldImpl.java @@ -1,17 +1,35 @@ package com.songoda.core.nms.v1_12_R1.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.server.v1_12_R1.Block; +import net.minecraft.server.v1_12_R1.BlockPosition; +import net.minecraft.server.v1_12_R1.Chunk; +import net.minecraft.server.v1_12_R1.WorldServer; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_12_R1.CraftWorld; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; import java.util.List; public class SWorldImpl implements SWorld { - public SWorldImpl() { + private final World world; + + public SWorldImpl(World world) { + this.world = world; } @Override public List getLivingEntities() { - return new ArrayList<>(); + return new ArrayList<>(); // FIXME + } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + WorldServer serverLevel = ((CraftWorld) this.world).getHandle(); + Chunk levelChunk = serverLevel.getChunkIfLoaded(x >> 4, z >> 4); + + levelChunk.a(new BlockPosition(x & 0xF, y, z & 0xF), Block.getByCombinedId(0)); } } diff --git a/NMS/NMS-v1_12_R1/src/main/java/com/songoda/core/nms/v1_12_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_12_R1/src/main/java/com/songoda/core/nms/v1_12_R1/world/WorldCoreImpl.java index eef44159..f1690ee1 100644 --- a/NMS/NMS-v1_12_R1/src/main/java/com/songoda/core/nms/v1_12_R1/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_12_R1/src/main/java/com/songoda/core/nms/v1_12_R1/world/WorldCoreImpl.java @@ -18,9 +18,11 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_12_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_12_R1.CraftWorld; import org.bukkit.craftbukkit.v1_12_R1.block.CraftBlock; import org.bukkit.craftbukkit.v1_12_R1.util.CraftMagicNumbers; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -40,7 +42,7 @@ public class WorldCoreImpl implements WorldCore { @Override public SWorld getWorld(World world) { - return new SWorldImpl(); + return new SWorldImpl(world); } @Override @@ -89,12 +91,12 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(org.bukkit.block.Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull org.bukkit.block.Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); - net.minecraft.server.v1_12_R1.World nmsWorld = craftChunk.getHandle().getWorld(); + WorldServer serverLevel = ((CraftWorld) craftBlock.getWorld()).getHandle(); - BlockPosition blockPosition = new BlockPosition(craftBlock.getX(), craftBlock.getY(), craftBlock.getZ()); - nmsWorld.updateAdjacentComparators(blockPosition, CraftMagicNumbers.getBlock(craftBlock)); + BlockPosition blockPos = new BlockPosition(craftBlock.getX(), craftBlock.getY(), craftBlock.getZ()); + Block nmsBlock = CraftMagicNumbers.getBlock(bukkitBlock.getType()); + serverLevel.updateAdjacentComparators(blockPos, nmsBlock); } } diff --git a/NMS/NMS-v1_13_R1/pom.xml b/NMS/NMS-v1_13_R1/pom.xml index 5fc70233..acc19bf5 100644 --- a/NMS/NMS-v1_13_R1/pom.xml +++ b/NMS/NMS-v1_13_R1/pom.xml @@ -10,9 +10,7 @@ 2.6.21 ../../pom.xml - SongodaCore-NMS-v1_13_R1 - jar @@ -26,12 +24,14 @@ ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_13_R1/src/main/java/com/songoda/core/nms/v1_13_R1/NmsImplementationsImpl.java b/NMS/NMS-v1_13_R1/src/main/java/com/songoda/core/nms/v1_13_R1/NmsImplementationsImpl.java new file mode 100644 index 00000000..2837e434 --- /dev/null +++ b/NMS/NMS-v1_13_R1/src/main/java/com/songoda/core/nms/v1_13_R1/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_13_R1; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_13_R1.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_13_R1.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_13_R1.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_13_R1.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_13_R1.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_13_R1/src/main/java/com/songoda/core/nms/v1_13_R1/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_13_R1/src/main/java/com/songoda/core/nms/v1_13_R1/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..e33f7867 --- /dev/null +++ b/NMS/NMS-v1_13_R1/src/main/java/com/songoda/core/nms/v1_13_R1/world/NmsWorldBorderImpl.java @@ -0,0 +1,35 @@ +package com.songoda.core.nms.v1_13_R1.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.server.v1_13_R1.PacketPlayOutWorldBorder; +import net.minecraft.server.v1_13_R1.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_13_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.world = ((CraftWorld) center.getWorld()).getHandle(); + + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningDistance(0); + + if (color == BorderColor.GREEN) { + worldBorder.transitionSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.transitionSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldBorder, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } +} diff --git a/NMS/NMS-v1_13_R1/src/main/java/com/songoda/core/nms/v1_13_R1/world/SWorldImpl.java b/NMS/NMS-v1_13_R1/src/main/java/com/songoda/core/nms/v1_13_R1/world/SWorldImpl.java index 78312506..45a9920c 100644 --- a/NMS/NMS-v1_13_R1/src/main/java/com/songoda/core/nms/v1_13_R1/world/SWorldImpl.java +++ b/NMS/NMS-v1_13_R1/src/main/java/com/songoda/core/nms/v1_13_R1/world/SWorldImpl.java @@ -1,17 +1,37 @@ package com.songoda.core.nms.v1_13_R1.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.server.v1_13_R1.BlockPosition; +import net.minecraft.server.v1_13_R1.Chunk; +import net.minecraft.server.v1_13_R1.IBlockData; +import net.minecraft.server.v1_13_R1.WorldServer; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_13_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_13_R1.block.data.CraftBlockData; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; import java.util.List; public class SWorldImpl implements SWorld { - public SWorldImpl() { + private final World world; + + public SWorldImpl(World world) { + this.world = world; } @Override public List getLivingEntities() { - return new ArrayList<>(); + return new ArrayList<>(); // FIXME + } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + WorldServer serverLevel = ((CraftWorld) this.world).getHandle(); + Chunk levelChunk = serverLevel.getChunkIfLoaded(x >> 4, z >> 4); + IBlockData blockState = ((CraftBlockData) material.createBlockData()).getState(); + + levelChunk.a(new BlockPosition(x & 0xF, y, z & 0xF), blockState, true); } } diff --git a/NMS/NMS-v1_13_R1/src/main/java/com/songoda/core/nms/v1_13_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_13_R1/src/main/java/com/songoda/core/nms/v1_13_R1/world/WorldCoreImpl.java index a00cf41d..837ba3c4 100644 --- a/NMS/NMS-v1_13_R1/src/main/java/com/songoda/core/nms/v1_13_R1/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_13_R1/src/main/java/com/songoda/core/nms/v1_13_R1/world/WorldCoreImpl.java @@ -21,6 +21,7 @@ import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_13_R1.CraftChunk; import org.bukkit.craftbukkit.v1_13_R1.block.CraftBlock; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -40,7 +41,7 @@ public class WorldCoreImpl implements WorldCore { @Override public SWorld getWorld(World world) { - return new SWorldImpl(); + return new SWorldImpl(world); } @Override @@ -93,11 +94,10 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); + WorldServer serverLevel = craftBlock.getCraftWorld().getHandle(); - net.minecraft.server.v1_13_R1.World nmsWorld = craftChunk.getHandle().getWorld(); - nmsWorld.updateAdjacentComparators(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); + serverLevel.updateAdjacentComparators(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); } } diff --git a/NMS/NMS-v1_13_R2/pom.xml b/NMS/NMS-v1_13_R2/pom.xml index 09bf4cbc..55ecd2d9 100644 --- a/NMS/NMS-v1_13_R2/pom.xml +++ b/NMS/NMS-v1_13_R2/pom.xml @@ -10,9 +10,7 @@ 2.6.21 ../../pom.xml - SongodaCore-NMS-v1_13_R2 - jar @@ -26,12 +24,14 @@ ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_13_R2/src/main/java/com/songoda/core/nms/v1_13_R2/NmsImplementationsImpl.java b/NMS/NMS-v1_13_R2/src/main/java/com/songoda/core/nms/v1_13_R2/NmsImplementationsImpl.java new file mode 100644 index 00000000..1e2e67b1 --- /dev/null +++ b/NMS/NMS-v1_13_R2/src/main/java/com/songoda/core/nms/v1_13_R2/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_13_R2; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_13_R2.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_13_R2.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_13_R2.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_13_R2.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_13_R2.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_13_R2/src/main/java/com/songoda/core/nms/v1_13_R2/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_13_R2/src/main/java/com/songoda/core/nms/v1_13_R2/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..cb7b82b3 --- /dev/null +++ b/NMS/NMS-v1_13_R2/src/main/java/com/songoda/core/nms/v1_13_R2/world/NmsWorldBorderImpl.java @@ -0,0 +1,35 @@ +package com.songoda.core.nms.v1_13_R2.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.server.v1_13_R2.PacketPlayOutWorldBorder; +import net.minecraft.server.v1_13_R2.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_13_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.world = ((CraftWorld) center.getWorld()).getHandle(); + + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningDistance(0); + + if (color == BorderColor.GREEN) { + worldBorder.transitionSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.transitionSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldBorder, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } +} diff --git a/NMS/NMS-v1_13_R2/src/main/java/com/songoda/core/nms/v1_13_R2/world/SWorldImpl.java b/NMS/NMS-v1_13_R2/src/main/java/com/songoda/core/nms/v1_13_R2/world/SWorldImpl.java index 845b135a..61859a31 100644 --- a/NMS/NMS-v1_13_R2/src/main/java/com/songoda/core/nms/v1_13_R2/world/SWorldImpl.java +++ b/NMS/NMS-v1_13_R2/src/main/java/com/songoda/core/nms/v1_13_R2/world/SWorldImpl.java @@ -1,17 +1,37 @@ package com.songoda.core.nms.v1_13_R2.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.server.v1_13_R2.BlockPosition; +import net.minecraft.server.v1_13_R2.Chunk; +import net.minecraft.server.v1_13_R2.IBlockData; +import net.minecraft.server.v1_13_R2.WorldServer; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_13_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_13_R2.block.data.CraftBlockData; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; import java.util.List; public class SWorldImpl implements SWorld { - public SWorldImpl() { + private final World world; + + public SWorldImpl(World world) { + this.world = world; } @Override public List getLivingEntities() { - return new ArrayList<>(); + return new ArrayList<>(); // FIXME + } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + WorldServer serverLevel = ((CraftWorld) this.world).getHandle(); + Chunk levelChunk = serverLevel.getChunkIfLoaded(x >> 4, z >> 4); + IBlockData blockState = ((CraftBlockData) material.createBlockData()).getState(); + + levelChunk.setType(new BlockPosition(x & 0xF, y, z & 0xF), blockState, true); } } diff --git a/NMS/NMS-v1_13_R2/src/main/java/com/songoda/core/nms/v1_13_R2/world/WorldCoreImpl.java b/NMS/NMS-v1_13_R2/src/main/java/com/songoda/core/nms/v1_13_R2/world/WorldCoreImpl.java index 43283261..c7946e90 100644 --- a/NMS/NMS-v1_13_R2/src/main/java/com/songoda/core/nms/v1_13_R2/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_13_R2/src/main/java/com/songoda/core/nms/v1_13_R2/world/WorldCoreImpl.java @@ -21,6 +21,7 @@ import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_13_R2.CraftChunk; import org.bukkit.craftbukkit.v1_13_R2.block.CraftBlock; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -40,7 +41,7 @@ public class WorldCoreImpl implements WorldCore { @Override public SWorld getWorld(World world) { - return new SWorldImpl(); + return new SWorldImpl(world); } @Override @@ -100,11 +101,10 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); + WorldServer serverLevel = craftBlock.getCraftWorld().getHandle(); - net.minecraft.server.v1_13_R2.World nmsWorld = craftChunk.getHandle().getWorld(); - nmsWorld.updateAdjacentComparators(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); + serverLevel.updateAdjacentComparators(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); } } diff --git a/NMS/NMS-v1_14_R1/pom.xml b/NMS/NMS-v1_14_R1/pom.xml index 41bb3d30..68fdc2a3 100644 --- a/NMS/NMS-v1_14_R1/pom.xml +++ b/NMS/NMS-v1_14_R1/pom.xml @@ -10,9 +10,7 @@ 2.6.21 ../../pom.xml - SongodaCore-NMS-v1_14_R1 - jar @@ -26,12 +24,14 @@ ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_14_R1/src/main/java/com/songoda/core/nms/v1_14_R1/NmsImplementationsImpl.java b/NMS/NMS-v1_14_R1/src/main/java/com/songoda/core/nms/v1_14_R1/NmsImplementationsImpl.java new file mode 100644 index 00000000..15c5bec9 --- /dev/null +++ b/NMS/NMS-v1_14_R1/src/main/java/com/songoda/core/nms/v1_14_R1/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_14_R1; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_14_R1.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_14_R1.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_14_R1.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_14_R1.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_14_R1.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_14_R1/src/main/java/com/songoda/core/nms/v1_14_R1/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_14_R1/src/main/java/com/songoda/core/nms/v1_14_R1/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..701e6b66 --- /dev/null +++ b/NMS/NMS-v1_14_R1/src/main/java/com/songoda/core/nms/v1_14_R1/world/NmsWorldBorderImpl.java @@ -0,0 +1,35 @@ +package com.songoda.core.nms.v1_14_R1.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.server.v1_14_R1.PacketPlayOutWorldBorder; +import net.minecraft.server.v1_14_R1.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.world = ((CraftWorld) center.getWorld()).getHandle(); + + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningDistance(0); + + if (color == BorderColor.GREEN) { + worldBorder.transitionSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.transitionSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldBorder, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } +} diff --git a/NMS/NMS-v1_14_R1/src/main/java/com/songoda/core/nms/v1_14_R1/world/SWorldImpl.java b/NMS/NMS-v1_14_R1/src/main/java/com/songoda/core/nms/v1_14_R1/world/SWorldImpl.java index ac14e66a..1ff6c9de 100644 --- a/NMS/NMS-v1_14_R1/src/main/java/com/songoda/core/nms/v1_14_R1/world/SWorldImpl.java +++ b/NMS/NMS-v1_14_R1/src/main/java/com/songoda/core/nms/v1_14_R1/world/SWorldImpl.java @@ -1,17 +1,37 @@ package com.songoda.core.nms.v1_14_R1.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.server.v1_14_R1.BlockPosition; +import net.minecraft.server.v1_14_R1.Chunk; +import net.minecraft.server.v1_14_R1.IBlockData; +import net.minecraft.server.v1_14_R1.WorldServer; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_14_R1.block.data.CraftBlockData; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; import java.util.List; public class SWorldImpl implements SWorld { - public SWorldImpl() { + private final World world; + + public SWorldImpl(World world) { + this.world = world; } @Override public List getLivingEntities() { - return new ArrayList<>(); + return new ArrayList<>(); // FIXME + } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + WorldServer serverLevel = ((CraftWorld) this.world).getHandle(); + Chunk levelChunk = serverLevel.getChunkIfLoaded(x >> 4, z >> 4); + IBlockData blockState = ((CraftBlockData) material.createBlockData()).getState(); + + levelChunk.setType(new BlockPosition(x & 0xF, y, z & 0xF), blockState, true); } } diff --git a/NMS/NMS-v1_14_R1/src/main/java/com/songoda/core/nms/v1_14_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_14_R1/src/main/java/com/songoda/core/nms/v1_14_R1/world/WorldCoreImpl.java index 9a15ed48..1ea611a7 100644 --- a/NMS/NMS-v1_14_R1/src/main/java/com/songoda/core/nms/v1_14_R1/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_14_R1/src/main/java/com/songoda/core/nms/v1_14_R1/world/WorldCoreImpl.java @@ -23,6 +23,7 @@ import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_14_R1.CraftChunk; import org.bukkit.craftbukkit.v1_14_R1.block.CraftBlock; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -42,7 +43,7 @@ public class WorldCoreImpl implements WorldCore { @Override public SWorld getWorld(World world) { - return new SWorldImpl(); + return new SWorldImpl(world); } @Override @@ -97,11 +98,10 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); + WorldServer serverLevel = craftBlock.getCraftWorld().getHandle(); - net.minecraft.server.v1_14_R1.World nmsWorld = craftChunk.getHandle().getWorld(); - nmsWorld.updateAdjacentComparators(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); + serverLevel.updateAdjacentComparators(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); } } diff --git a/NMS/NMS-v1_15_R1/pom.xml b/NMS/NMS-v1_15_R1/pom.xml index ebcde45c..18125645 100644 --- a/NMS/NMS-v1_15_R1/pom.xml +++ b/NMS/NMS-v1_15_R1/pom.xml @@ -10,9 +10,8 @@ 2.6.21 ../../pom.xml - SongodaCore-NMS-v1_15_R1 - jar + @@ -26,12 +25,14 @@ ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_15_R1/src/main/java/com/songoda/core/nms/v1_15_R1/NmsImplementationsImpl.java b/NMS/NMS-v1_15_R1/src/main/java/com/songoda/core/nms/v1_15_R1/NmsImplementationsImpl.java new file mode 100644 index 00000000..86d5d423 --- /dev/null +++ b/NMS/NMS-v1_15_R1/src/main/java/com/songoda/core/nms/v1_15_R1/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_15_R1; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_15_R1.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_15_R1.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_15_R1.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_15_R1.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_15_R1.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_15_R1/src/main/java/com/songoda/core/nms/v1_15_R1/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_15_R1/src/main/java/com/songoda/core/nms/v1_15_R1/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..50913443 --- /dev/null +++ b/NMS/NMS-v1_15_R1/src/main/java/com/songoda/core/nms/v1_15_R1/world/NmsWorldBorderImpl.java @@ -0,0 +1,35 @@ +package com.songoda.core.nms.v1_15_R1.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.server.v1_15_R1.PacketPlayOutWorldBorder; +import net.minecraft.server.v1_15_R1.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.world = ((CraftWorld) center.getWorld()).getHandle(); + + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningDistance(0); + + if (color == BorderColor.GREEN) { + worldBorder.transitionSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.transitionSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldBorder, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } +} diff --git a/NMS/NMS-v1_15_R1/src/main/java/com/songoda/core/nms/v1_15_R1/world/SWorldImpl.java b/NMS/NMS-v1_15_R1/src/main/java/com/songoda/core/nms/v1_15_R1/world/SWorldImpl.java index 5b569025..c2c4c8b5 100644 --- a/NMS/NMS-v1_15_R1/src/main/java/com/songoda/core/nms/v1_15_R1/world/SWorldImpl.java +++ b/NMS/NMS-v1_15_R1/src/main/java/com/songoda/core/nms/v1_15_R1/world/SWorldImpl.java @@ -1,17 +1,37 @@ package com.songoda.core.nms.v1_15_R1.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.server.v1_15_R1.BlockPosition; +import net.minecraft.server.v1_15_R1.Chunk; +import net.minecraft.server.v1_15_R1.IBlockData; +import net.minecraft.server.v1_15_R1.WorldServer; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_15_R1.block.data.CraftBlockData; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; import java.util.List; public class SWorldImpl implements SWorld { - public SWorldImpl() { + private final World world; + + public SWorldImpl(World world) { + this.world = world; } @Override public List getLivingEntities() { - return new ArrayList<>(); + return new ArrayList<>(); // FIXME + } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + WorldServer serverLevel = ((CraftWorld) this.world).getHandle(); + Chunk levelChunk = serverLevel.getChunkIfLoaded(x >> 4, z >> 4); + IBlockData blockState = ((CraftBlockData) material.createBlockData()).getState(); + + levelChunk.setType(new BlockPosition(x & 0xF, y, z & 0xF), blockState, true); } } diff --git a/NMS/NMS-v1_15_R1/src/main/java/com/songoda/core/nms/v1_15_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_15_R1/src/main/java/com/songoda/core/nms/v1_15_R1/world/WorldCoreImpl.java index 8810cf6a..96c746da 100644 --- a/NMS/NMS-v1_15_R1/src/main/java/com/songoda/core/nms/v1_15_R1/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_15_R1/src/main/java/com/songoda/core/nms/v1_15_R1/world/WorldCoreImpl.java @@ -23,6 +23,7 @@ import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_15_R1.CraftChunk; import org.bukkit.craftbukkit.v1_15_R1.block.CraftBlock; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -42,7 +43,7 @@ public class WorldCoreImpl implements WorldCore { @Override public SWorld getWorld(World world) { - return new SWorldImpl(); + return new SWorldImpl(world); } @Override @@ -100,11 +101,10 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); + WorldServer serverLevel = craftBlock.getCraftWorld().getHandle(); - net.minecraft.server.v1_15_R1.World nmsWorld = craftChunk.getHandle().getWorld(); - nmsWorld.updateAdjacentComparators(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); + serverLevel.updateAdjacentComparators(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); } } diff --git a/NMS/NMS-v1_16_R1/pom.xml b/NMS/NMS-v1_16_R1/pom.xml index 800e99f6..7358e2ea 100644 --- a/NMS/NMS-v1_16_R1/pom.xml +++ b/NMS/NMS-v1_16_R1/pom.xml @@ -10,9 +10,7 @@ 2.6.21 ../../pom.xml - SongodaCore-NMS-v1_16_R1 - jar @@ -26,12 +24,14 @@ ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_16_R1/src/main/java/com/songoda/core/nms/v1_16_R1/NmsImplementationsImpl.java b/NMS/NMS-v1_16_R1/src/main/java/com/songoda/core/nms/v1_16_R1/NmsImplementationsImpl.java new file mode 100644 index 00000000..6af68429 --- /dev/null +++ b/NMS/NMS-v1_16_R1/src/main/java/com/songoda/core/nms/v1_16_R1/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_16_R1; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_16_R1.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_16_R1.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_16_R1.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_16_R1.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_16_R1.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_16_R1/src/main/java/com/songoda/core/nms/v1_16_R1/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_16_R1/src/main/java/com/songoda/core/nms/v1_16_R1/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..24060878 --- /dev/null +++ b/NMS/NMS-v1_16_R1/src/main/java/com/songoda/core/nms/v1_16_R1/world/NmsWorldBorderImpl.java @@ -0,0 +1,35 @@ +package com.songoda.core.nms.v1_16_R1.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.server.v1_16_R1.PacketPlayOutWorldBorder; +import net.minecraft.server.v1_16_R1.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_16_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_16_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.world = ((CraftWorld) center.getWorld()).getHandle(); + + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningDistance(0); + + if (color == BorderColor.GREEN) { + worldBorder.transitionSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.transitionSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldBorder, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } +} diff --git a/NMS/NMS-v1_16_R1/src/main/java/com/songoda/core/nms/v1_16_R1/world/SWorldImpl.java b/NMS/NMS-v1_16_R1/src/main/java/com/songoda/core/nms/v1_16_R1/world/SWorldImpl.java index 1ad6bf55..e28e2e17 100644 --- a/NMS/NMS-v1_16_R1/src/main/java/com/songoda/core/nms/v1_16_R1/world/SWorldImpl.java +++ b/NMS/NMS-v1_16_R1/src/main/java/com/songoda/core/nms/v1_16_R1/world/SWorldImpl.java @@ -1,17 +1,37 @@ package com.songoda.core.nms.v1_16_R1.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.server.v1_16_R1.BlockPosition; +import net.minecraft.server.v1_16_R1.Chunk; +import net.minecraft.server.v1_16_R1.IBlockData; +import net.minecraft.server.v1_16_R1.WorldServer; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_16_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_16_R1.block.data.CraftBlockData; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; import java.util.List; public class SWorldImpl implements SWorld { - public SWorldImpl() { + private final World world; + + public SWorldImpl(World world) { + this.world = world; } @Override public List getLivingEntities() { - return new ArrayList<>(); + return new ArrayList<>(); // FIXME + } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + WorldServer serverLevel = ((CraftWorld) this.world).getHandle(); + Chunk levelChunk = serverLevel.getChunkIfLoaded(x >> 4, z >> 4); + IBlockData blockState = ((CraftBlockData) material.createBlockData()).getState(); + + levelChunk.setType(new BlockPosition(x & 0xF, y, z & 0xF), blockState, true); } } diff --git a/NMS/NMS-v1_16_R1/src/main/java/com/songoda/core/nms/v1_16_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_16_R1/src/main/java/com/songoda/core/nms/v1_16_R1/world/WorldCoreImpl.java index cbe8ef07..4a749de6 100644 --- a/NMS/NMS-v1_16_R1/src/main/java/com/songoda/core/nms/v1_16_R1/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_16_R1/src/main/java/com/songoda/core/nms/v1_16_R1/world/WorldCoreImpl.java @@ -23,6 +23,7 @@ import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_16_R1.CraftChunk; import org.bukkit.craftbukkit.v1_16_R1.block.CraftBlock; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -42,7 +43,7 @@ public class WorldCoreImpl implements WorldCore { @Override public SWorld getWorld(World world) { - return new SWorldImpl(); + return new SWorldImpl(world); } @Override @@ -101,11 +102,10 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); + WorldServer serverLevel = craftBlock.getCraftWorld().getHandle(); - net.minecraft.server.v1_16_R1.World nmsWorld = craftChunk.getHandle().getWorld(); - nmsWorld.updateAdjacentComparators(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); + serverLevel.updateAdjacentComparators(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); } } diff --git a/NMS/NMS-v1_16_R2/pom.xml b/NMS/NMS-v1_16_R2/pom.xml index d3eeb8d2..57d77c4f 100644 --- a/NMS/NMS-v1_16_R2/pom.xml +++ b/NMS/NMS-v1_16_R2/pom.xml @@ -10,9 +10,7 @@ 2.6.21 ../../pom.xml - SongodaCore-NMS-v1_16_R2 - jar @@ -26,12 +24,14 @@ ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_16_R2/src/main/java/com/songoda/core/nms/v1_16_R2/NmsImplementationsImpl.java b/NMS/NMS-v1_16_R2/src/main/java/com/songoda/core/nms/v1_16_R2/NmsImplementationsImpl.java new file mode 100644 index 00000000..32692703 --- /dev/null +++ b/NMS/NMS-v1_16_R2/src/main/java/com/songoda/core/nms/v1_16_R2/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_16_R2; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_16_R2.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_16_R2.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_16_R2.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_16_R2.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_16_R2.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_16_R2/src/main/java/com/songoda/core/nms/v1_16_R2/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_16_R2/src/main/java/com/songoda/core/nms/v1_16_R2/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..de74865d --- /dev/null +++ b/NMS/NMS-v1_16_R2/src/main/java/com/songoda/core/nms/v1_16_R2/world/NmsWorldBorderImpl.java @@ -0,0 +1,35 @@ +package com.songoda.core.nms.v1_16_R2.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.server.v1_16_R2.PacketPlayOutWorldBorder; +import net.minecraft.server.v1_16_R2.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_16_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.world = ((CraftWorld) center.getWorld()).getHandle(); + + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningDistance(0); + + if (color == BorderColor.GREEN) { + worldBorder.transitionSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.transitionSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldBorder, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } +} diff --git a/NMS/NMS-v1_16_R2/src/main/java/com/songoda/core/nms/v1_16_R2/world/SWorldImpl.java b/NMS/NMS-v1_16_R2/src/main/java/com/songoda/core/nms/v1_16_R2/world/SWorldImpl.java index b827e04f..9e5f668c 100644 --- a/NMS/NMS-v1_16_R2/src/main/java/com/songoda/core/nms/v1_16_R2/world/SWorldImpl.java +++ b/NMS/NMS-v1_16_R2/src/main/java/com/songoda/core/nms/v1_16_R2/world/SWorldImpl.java @@ -1,17 +1,37 @@ package com.songoda.core.nms.v1_16_R2.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.server.v1_16_R2.BlockPosition; +import net.minecraft.server.v1_16_R2.Chunk; +import net.minecraft.server.v1_16_R2.IBlockData; +import net.minecraft.server.v1_16_R2.WorldServer; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_16_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_16_R2.block.data.CraftBlockData; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; import java.util.List; public class SWorldImpl implements SWorld { - public SWorldImpl() { + private final World world; + + public SWorldImpl(World world) { + this.world = world; } @Override public List getLivingEntities() { - return new ArrayList<>(); + return new ArrayList<>(); // FIXME + } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + WorldServer serverLevel = ((CraftWorld) this.world).getHandle(); + Chunk levelChunk = serverLevel.getChunkIfLoaded(x >> 4, z >> 4); + IBlockData blockState = ((CraftBlockData) material.createBlockData()).getState(); + + levelChunk.setType(new BlockPosition(x & 0xF, y, z & 0xF), blockState, true); } } diff --git a/NMS/NMS-v1_16_R2/src/main/java/com/songoda/core/nms/v1_16_R2/world/WorldCoreImpl.java b/NMS/NMS-v1_16_R2/src/main/java/com/songoda/core/nms/v1_16_R2/world/WorldCoreImpl.java index 842cf36e..153b8251 100644 --- a/NMS/NMS-v1_16_R2/src/main/java/com/songoda/core/nms/v1_16_R2/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_16_R2/src/main/java/com/songoda/core/nms/v1_16_R2/world/WorldCoreImpl.java @@ -23,6 +23,7 @@ import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_16_R2.CraftChunk; import org.bukkit.craftbukkit.v1_16_R2.block.CraftBlock; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -42,7 +43,7 @@ public class WorldCoreImpl implements WorldCore { @Override public SWorld getWorld(World world) { - return new SWorldImpl(); + return new SWorldImpl(world); } @Override @@ -101,11 +102,10 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); + WorldServer serverLevel = craftBlock.getCraftWorld().getHandle(); - net.minecraft.server.v1_16_R2.World nmsWorld = craftChunk.getHandle().getWorld(); - nmsWorld.updateAdjacentComparators(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); + serverLevel.updateAdjacentComparators(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); } } diff --git a/NMS/NMS-v1_16_R3/pom.xml b/NMS/NMS-v1_16_R3/pom.xml index 203a99f3..769ab4d7 100644 --- a/NMS/NMS-v1_16_R3/pom.xml +++ b/NMS/NMS-v1_16_R3/pom.xml @@ -10,9 +10,7 @@ 2.6.21 ../../pom.xml - SongodaCore-NMS-v1_16_R3 - jar @@ -26,12 +24,14 @@ ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_16_R3/src/main/java/com/songoda/core/nms/v1_16_R3/NmsImplementationsImpl.java b/NMS/NMS-v1_16_R3/src/main/java/com/songoda/core/nms/v1_16_R3/NmsImplementationsImpl.java new file mode 100644 index 00000000..9d49860a --- /dev/null +++ b/NMS/NMS-v1_16_R3/src/main/java/com/songoda/core/nms/v1_16_R3/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_16_R3; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_16_R3.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_16_R3.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_16_R3.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_16_R3.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_16_R3.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_16_R3/src/main/java/com/songoda/core/nms/v1_16_R3/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_16_R3/src/main/java/com/songoda/core/nms/v1_16_R3/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..99819630 --- /dev/null +++ b/NMS/NMS-v1_16_R3/src/main/java/com/songoda/core/nms/v1_16_R3/world/NmsWorldBorderImpl.java @@ -0,0 +1,35 @@ +package com.songoda.core.nms.v1_16_R3.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.server.v1_16_R3.PacketPlayOutWorldBorder; +import net.minecraft.server.v1_16_R3.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_16_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.world = ((CraftWorld) center.getWorld()).getHandle(); + + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningDistance(0); + + if (color == BorderColor.GREEN) { + worldBorder.transitionSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.transitionSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldBorder, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } +} diff --git a/NMS/NMS-v1_16_R3/src/main/java/com/songoda/core/nms/v1_16_R3/world/SWorldImpl.java b/NMS/NMS-v1_16_R3/src/main/java/com/songoda/core/nms/v1_16_R3/world/SWorldImpl.java index 0b12fabd..e1a6e589 100644 --- a/NMS/NMS-v1_16_R3/src/main/java/com/songoda/core/nms/v1_16_R3/world/SWorldImpl.java +++ b/NMS/NMS-v1_16_R3/src/main/java/com/songoda/core/nms/v1_16_R3/world/SWorldImpl.java @@ -1,17 +1,37 @@ package com.songoda.core.nms.v1_16_R3.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.server.v1_16_R3.BlockPosition; +import net.minecraft.server.v1_16_R3.Chunk; +import net.minecraft.server.v1_16_R3.IBlockData; +import net.minecraft.server.v1_16_R3.WorldServer; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_16_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_16_R3.block.data.CraftBlockData; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; import java.util.List; public class SWorldImpl implements SWorld { - public SWorldImpl() { + private final World world; + + public SWorldImpl(World world) { + this.world = world; } @Override public List getLivingEntities() { - return new ArrayList<>(); + return new ArrayList<>(); // FIXME + } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + WorldServer serverLevel = ((CraftWorld) this.world).getHandle(); + Chunk levelChunk = serverLevel.getChunkIfLoaded(x >> 4, z >> 4); + IBlockData blockState = ((CraftBlockData) material.createBlockData()).getState(); + + levelChunk.setType(new BlockPosition(x & 0xF, y, z & 0xF), blockState, true); } } diff --git a/NMS/NMS-v1_16_R3/src/main/java/com/songoda/core/nms/v1_16_R3/world/WorldCoreImpl.java b/NMS/NMS-v1_16_R3/src/main/java/com/songoda/core/nms/v1_16_R3/world/WorldCoreImpl.java index b1ad6147..1f3364ac 100644 --- a/NMS/NMS-v1_16_R3/src/main/java/com/songoda/core/nms/v1_16_R3/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_16_R3/src/main/java/com/songoda/core/nms/v1_16_R3/world/WorldCoreImpl.java @@ -23,6 +23,7 @@ import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_16_R3.CraftChunk; import org.bukkit.craftbukkit.v1_16_R3.block.CraftBlock; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -42,7 +43,7 @@ public class WorldCoreImpl implements WorldCore { @Override public SWorld getWorld(World world) { - return new SWorldImpl(); + return new SWorldImpl(world); } @Override @@ -102,11 +103,10 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); + WorldServer serverLevel = craftBlock.getCraftWorld().getHandle(); - net.minecraft.server.v1_16_R3.World nmsWorld = craftChunk.getHandle().getWorld(); - nmsWorld.updateAdjacentComparators(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); + serverLevel.updateAdjacentComparators(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); } } diff --git a/NMS/NMS-v1_17_R1/pom.xml b/NMS/NMS-v1_17_R1/pom.xml index 101edd00..d25e77b9 100644 --- a/NMS/NMS-v1_17_R1/pom.xml +++ b/NMS/NMS-v1_17_R1/pom.xml @@ -10,15 +10,13 @@ 2.6.21 ../../pom.xml + SongodaCore-NMS-v1_17_R1 16 16 - SongodaCore-NMS-v1_17_R1 - jar - org.spigotmc @@ -31,12 +29,14 @@ ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_17_R1/src/main/java/com/songoda/core/nms/v1_17_R1/NmsImplementationsImpl.java b/NMS/NMS-v1_17_R1/src/main/java/com/songoda/core/nms/v1_17_R1/NmsImplementationsImpl.java new file mode 100644 index 00000000..0d2e0179 --- /dev/null +++ b/NMS/NMS-v1_17_R1/src/main/java/com/songoda/core/nms/v1_17_R1/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_17_R1; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_17_R1.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_17_R1.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_17_R1.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_17_R1.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_17_R1.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_17_R1/src/main/java/com/songoda/core/nms/v1_17_R1/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_17_R1/src/main/java/com/songoda/core/nms/v1_17_R1/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..c4ce65f8 --- /dev/null +++ b/NMS/NMS-v1_17_R1/src/main/java/com/songoda/core/nms/v1_17_R1/world/NmsWorldBorderImpl.java @@ -0,0 +1,36 @@ +package com.songoda.core.nms.v1_17_R1.world; + +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.network.protocol.game.ClientboundInitializeBorderPacket; +import net.minecraft.world.level.border.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_17_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.world = ((CraftWorld) center.getWorld()).getHandle(); + + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningDistance(0); + + if (color == BorderColor.GREEN) { + worldBorder.transitionSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.transitionSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().b.sendPacket(new ClientboundInitializeBorderPacket(worldBorder)); + } +} diff --git a/NMS/NMS-v1_17_R1/src/main/java/com/songoda/core/nms/v1_17_R1/world/SWorldImpl.java b/NMS/NMS-v1_17_R1/src/main/java/com/songoda/core/nms/v1_17_R1/world/SWorldImpl.java index b7c5bd51..162e9f0e 100644 --- a/NMS/NMS-v1_17_R1/src/main/java/com/songoda/core/nms/v1_17_R1/world/SWorldImpl.java +++ b/NMS/NMS-v1_17_R1/src/main/java/com/songoda/core/nms/v1_17_R1/world/SWorldImpl.java @@ -1,12 +1,17 @@ package com.songoda.core.nms.v1_17_R1.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.core.BlockPosition; import net.minecraft.server.level.WorldServer; import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.block.state.IBlockData; +import net.minecraft.world.level.chunk.Chunk; import net.minecraft.world.level.entity.LevelEntityGetter; import net.minecraft.world.level.entity.PersistentEntitySectionManager; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.craftbukkit.v1_17_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_17_R1.block.data.CraftBlockData; import org.bukkit.entity.LivingEntity; import java.lang.reflect.Field; @@ -37,9 +42,8 @@ public class SWorldImpl implements SWorld { List list = new ArrayList<>(); try { - WorldServer worldServer = ((CraftWorld) world).getHandle(); - LevelEntityGetter entities = - ((PersistentEntitySectionManager) fieldG.get(worldServer)).d(); + WorldServer worldServer = ((CraftWorld) this.world).getHandle(); + LevelEntityGetter entities = ((PersistentEntitySectionManager) fieldG.get(worldServer)).d(); entities.a().forEach((mcEnt) -> { org.bukkit.entity.Entity bukkitEntity = mcEnt.getBukkitEntity(); @@ -53,4 +57,13 @@ public class SWorldImpl implements SWorld { return list; } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + WorldServer serverLevel = ((CraftWorld) this.world).getHandle(); + Chunk levelChunk = serverLevel.getChunkIfLoaded(x >> 4, z >> 4); + IBlockData blockState = ((CraftBlockData) material.createBlockData()).getState(); + + levelChunk.setType(new BlockPosition(x & 0xF, y, z & 0xF), blockState, true); + } } diff --git a/NMS/NMS-v1_17_R1/src/main/java/com/songoda/core/nms/v1_17_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_17_R1/src/main/java/com/songoda/core/nms/v1_17_R1/world/WorldCoreImpl.java index c1ba86ab..9f0dfc3e 100644 --- a/NMS/NMS-v1_17_R1/src/main/java/com/songoda/core/nms/v1_17_R1/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_17_R1/src/main/java/com/songoda/core/nms/v1_17_R1/world/WorldCoreImpl.java @@ -23,6 +23,7 @@ import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_17_R1.CraftChunk; import org.bukkit.craftbukkit.v1_17_R1.block.CraftBlock; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -100,11 +101,10 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); + WorldServer serverLevel = craftBlock.getCraftWorld().getHandle(); - net.minecraft.world.level.World nmsWorld = craftChunk.getHandle().getWorld(); - nmsWorld.updateAdjacentComparators(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); + serverLevel.updateAdjacentComparators(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); } } diff --git a/NMS/NMS-v1_18_R1/pom.xml b/NMS/NMS-v1_18_R1/pom.xml index ad448eed..94b79933 100644 --- a/NMS/NMS-v1_18_R1/pom.xml +++ b/NMS/NMS-v1_18_R1/pom.xml @@ -3,18 +3,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - - - - org.apache.maven.plugins - maven-compiler-plugin - - 17 - 17 - - - - com.songoda @@ -22,18 +10,59 @@ 2.6.21 ../../pom.xml + SongodaCore-NMS-v1_18_R1 17 17 - 1.18-R0.1-SNAPSHOT + 1.18.1-R0.1-SNAPSHOT - SongodaCore-NMS-v1_18_R1 - jar + + + + net.md-5 + specialsource-maven-plugin + 1.2.4 + + + + remap-obf + package + + remap + + + + org.spigotmc:minecraft-server:${nms.ver}:txt:maps-mojang + true + org.spigotmc:spigot:${nms.ver}:jar:remapped-mojang + true + remapped-obf + + + + + remap-spigot + package + + remap + + + + ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar + org.spigotmc:minecraft-server:${nms.ver}:csrg:maps-spigot + org.spigotmc:spigot:${nms.ver}:jar:remapped-obf + + + + + + + org.spigotmc spigot-api @@ -43,7 +72,8 @@ org.spigotmc spigot - 1.18-R0.1-SNAPSHOT + ${nms.ver} + remapped-mojang provided @@ -51,12 +81,14 @@ ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/NmsImplementationsImpl.java b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/NmsImplementationsImpl.java new file mode 100644 index 00000000..48523749 --- /dev/null +++ b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_18_R1; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_18_R1.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_18_R1.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_18_R1.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_18_R1.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_18_R1.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/anvil/AnvilCore.java b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/anvil/AnvilCore.java index 2977fb8b..460e6710 100644 --- a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/anvil/AnvilCore.java +++ b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/anvil/AnvilCore.java @@ -1,7 +1,7 @@ package com.songoda.core.nms.v1_18_R1.anvil; import com.songoda.core.nms.anvil.CustomAnvil; -import net.minecraft.server.level.EntityPlayer; +import net.minecraft.server.level.ServerPlayer; import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder; @@ -9,13 +9,13 @@ import org.bukkit.inventory.InventoryHolder; public class AnvilCore implements com.songoda.core.nms.anvil.AnvilCore { @Override public CustomAnvil createAnvil(Player player) { - EntityPlayer p = ((CraftPlayer) player).getHandle(); - return new AnvilView(p.nextContainerCounter(), p, null); + return createAnvil(player, null); } @Override public CustomAnvil createAnvil(Player player, InventoryHolder holder) { - EntityPlayer p = ((CraftPlayer) player).getHandle(); - return new AnvilView(p.nextContainerCounter(), p, holder); + ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); + + return new AnvilView(serverPlayer.nextContainerCounter(), serverPlayer, holder); } } diff --git a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/anvil/AnvilInventoryCustom.java b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/anvil/AnvilInventoryCustom.java index a6a1f079..8a9334bd 100644 --- a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/anvil/AnvilInventoryCustom.java +++ b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/anvil/AnvilInventoryCustom.java @@ -1,7 +1,7 @@ package com.songoda.core.nms.v1_18_R1.anvil; -import net.minecraft.world.IInventory; -import net.minecraft.world.inventory.ContainerAnvil; +import net.minecraft.world.Container; +import net.minecraft.world.inventory.AnvilMenu; import org.bukkit.Location; import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventoryAnvil; import org.bukkit.inventory.InventoryHolder; @@ -9,7 +9,7 @@ import org.bukkit.inventory.InventoryHolder; public class AnvilInventoryCustom extends CraftInventoryAnvil { final InventoryHolder holder; - public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory, ContainerAnvil container) { + public AnvilInventoryCustom(InventoryHolder holder, Location location, Container inventory, Container resultInventory, AnvilMenu container) { super(location, inventory, resultInventory, container); this.holder = holder; diff --git a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/anvil/AnvilView.java b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/anvil/AnvilView.java index 30fb8661..acb81136 100644 --- a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/anvil/AnvilView.java +++ b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/anvil/AnvilView.java @@ -2,17 +2,17 @@ package com.songoda.core.nms.v1_18_R1.anvil; import com.songoda.core.nms.anvil.CustomAnvil; import com.songoda.core.nms.anvil.methods.AnvilTextChange; -import net.minecraft.core.BlockPosition; -import net.minecraft.network.chat.ChatMessage; -import net.minecraft.network.protocol.game.PacketPlayOutOpenWindow; -import net.minecraft.server.level.EntityPlayer; -import net.minecraft.world.IInventory; -import net.minecraft.world.entity.player.EntityHuman; -import net.minecraft.world.inventory.Container; -import net.minecraft.world.inventory.ContainerAccess; -import net.minecraft.world.inventory.ContainerAnvil; -import net.minecraft.world.inventory.ContainerAnvilAbstract; -import net.minecraft.world.inventory.Containers; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.AnvilMenu; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.ItemCombinerMenu; +import net.minecraft.world.inventory.MenuType; import org.bukkit.Location; import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventoryView; import org.bukkit.inventory.Inventory; @@ -23,8 +23,8 @@ import java.lang.reflect.Field; import java.util.logging.Level; import java.util.logging.Logger; -public class AnvilView extends ContainerAnvil implements CustomAnvil { - private final EntityPlayer entity; +public class AnvilView extends AnvilMenu implements CustomAnvil { + private final ServerPlayer entity; private final Inventory inventory; private String customTitle = "Repairing"; private int cost = -1; @@ -38,13 +38,13 @@ public class AnvilView extends ContainerAnvil implements CustomAnvil { static { try { - mc_ContainerAnvil_repairInventory = ContainerAnvilAbstract.class.getDeclaredField("p"); + mc_ContainerAnvil_repairInventory = ItemCombinerMenu.class.getDeclaredField("p"); mc_ContainerAnvil_repairInventory.setAccessible(true); - mc_ContainerAnvil_resultInventory = ContainerAnvilAbstract.class.getDeclaredField("o"); + mc_ContainerAnvil_resultInventory = ItemCombinerMenu.class.getDeclaredField("o"); mc_ContainerAnvil_resultInventory.setAccessible(true); - mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity"); + mc_ContainerAnvil_bukkitEntity = AnvilMenu.class.getDeclaredField("bukkitEntity"); mc_ContainerAnvil_bukkitEntity.setAccessible(true); } catch (Exception ex) { Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); @@ -56,17 +56,17 @@ public class AnvilView extends ContainerAnvil implements CustomAnvil { static { try { - mc_Container_title = Container.class.getDeclaredField("title"); + mc_Container_title = AbstractContainerMenu.class.getDeclaredField("title"); mc_Container_title.setAccessible(true); } catch (Exception ex) { Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); } } - public AnvilView(int id, EntityPlayer entity, InventoryHolder holder) { - super(entity.nextContainerCounter(), entity.fq(), ContainerAccess.a(entity.t, new BlockPosition(0, 0, 0))); + public AnvilView(int id, ServerPlayer entity, InventoryHolder holder) { + super(entity.nextContainerCounter(), entity.getInventory(), ContainerLevelAccess.create(entity.level, new BlockPos(0, 0, 0))); - this.setTitle(new ChatMessage(customTitle != null ? customTitle : "")); + this.setTitle(new TranslatableComponent(customTitle != null ? customTitle : "")); this.checkReachable = false; this.entity = entity; @@ -77,12 +77,12 @@ public class AnvilView extends ContainerAnvil implements CustomAnvil { } } - public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) { + public CraftInventoryView getBukkitView(Player player, InventoryHolder holder) { try { AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder, - new Location(entity.t.getWorld(), 0, 0, 0), - (IInventory) mc_ContainerAnvil_repairInventory.get(this), - (IInventory) mc_ContainerAnvil_resultInventory.get(this), this); + new Location(entity.level.getWorld(), 0, 0, 0), + (Container) mc_ContainerAnvil_repairInventory.get(this), + (Container) mc_ContainerAnvil_resultInventory.get(this), this); CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this); mc_ContainerAnvil_bukkitEntity.set(this, view); @@ -95,13 +95,13 @@ public class AnvilView extends ContainerAnvil implements CustomAnvil { } @Override - public boolean a(EntityHuman entityhuman) { + public boolean stillValid(Player entityHuman) { return canUse; } @Override - public void e() { - super.e(); + public void broadcastFullState() { + super.broadcastFullState(); if (cost >= 0) { this.setLevelCost(cost); @@ -112,17 +112,17 @@ public class AnvilView extends ContainerAnvil implements CustomAnvil { @Override public void update() { - e(); + broadcastFullState(); } @Override public String getRenameText() { - return this.v; + return this.itemName; } @Override public void setRenameText(String text) { - this.a(text); + this.setItemName(text); } @Override @@ -140,7 +140,7 @@ public class AnvilView extends ContainerAnvil implements CustomAnvil { this.customTitle = title; try { - mc_Container_title.set(this, new ChatMessage(customTitle != null ? customTitle : "")); + mc_Container_title.set(this, new TranslatableComponent(customTitle != null ? customTitle : "")); } catch (Exception ex) { Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex); } @@ -203,12 +203,12 @@ public class AnvilView extends ContainerAnvil implements CustomAnvil { @Override public void open() { // Send the packet - entity.b.a(new PacketPlayOutOpenWindow(j, Containers.h, new ChatMessage(customTitle != null ? customTitle : ""))); + entity.connection.send(new ClientboundOpenScreenPacket(super.containerId, MenuType.ANVIL, new TranslatableComponent(customTitle != null ? customTitle : ""))); // Set their active container to this anvil - entity.bW = this; + entity.containerMenu = this; // Add the slot listener - entity.a(entity.bW); + entity.initMenu(entity.containerMenu); } } diff --git a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/entity/NMSPlayerImpl.java b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/entity/NMSPlayerImpl.java index ac3699e6..85c1ba9b 100644 --- a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/entity/NMSPlayerImpl.java +++ b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/entity/NMSPlayerImpl.java @@ -8,6 +8,6 @@ import org.bukkit.entity.Player; public class NMSPlayerImpl implements NMSPlayer { @Override public void sendPacket(Player p, Object packet) { - ((CraftPlayer) p).getHandle().b.a((Packet) packet); + ((CraftPlayer) p).getHandle().connection.send((Packet) packet); } } diff --git a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTCompoundImpl.java b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTCompoundImpl.java index f552cd0f..487691ca 100644 --- a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTCompoundImpl.java +++ b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTCompoundImpl.java @@ -2,98 +2,96 @@ package com.songoda.core.nms.v1_18_R1.nbt; import com.songoda.core.nms.nbt.NBTCompound; import com.songoda.core.nms.nbt.NBTObject; -import net.minecraft.nbt.NBTCompressedStreamTools; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; -import java.io.OutputStream; import java.util.Set; import java.util.UUID; public class NBTCompoundImpl implements NBTCompound { - protected NBTTagCompound compound; + protected CompoundTag compound; - protected NBTCompoundImpl(NBTTagCompound compound) { + protected NBTCompoundImpl(CompoundTag compound) { this.compound = compound; } public NBTCompoundImpl() { - this.compound = new NBTTagCompound(); + this.compound = new CompoundTag(); } @Override public NBTCompound set(String tag, String s) { - compound.a(tag, s); + compound.putString(tag, s); return this; } @Override public NBTCompound set(String tag, boolean b) { - compound.a(tag, b); + compound.putBoolean(tag, b); return this; } @Override public NBTCompound set(String tag, int i) { - compound.a(tag, i); + compound.putInt(tag, i); return this; } @Override public NBTCompound set(String tag, double i) { - compound.a(tag, i); + compound.putDouble(tag, i); return this; } @Override public NBTCompound set(String tag, long l) { - compound.a(tag, l); + compound.putLong(tag, l); return this; } @Override public NBTCompound set(String tag, short s) { - compound.a(tag, s); + compound.putShort(tag, s); return this; } @Override public NBTCompound set(String tag, byte b) { - compound.a(tag, b); + compound.putByte(tag, b); return this; } @Override public NBTCompound set(String tag, int[] i) { - compound.a(tag, i); + compound.putIntArray(tag, i); return this; } @Override public NBTCompound set(String tag, byte[] b) { - compound.a(tag, b); + compound.putByteArray(tag, b); return this; } @Override public NBTCompound set(String tag, UUID u) { - compound.a(tag, u); + compound.putUUID(tag, u); return this; } @Override public NBTCompound remove(String tag) { - compound.r(tag); + compound.remove(tag); return this; } @Override public boolean has(String tag) { - return compound.e(tag); + return compound.contains(tag); } @Override @@ -152,19 +150,19 @@ public class NBTCompoundImpl implements NBTCompound { return getNBTObject(tag).asCompound(); } - NBTTagCompound newCompound = new NBTTagCompound(); - compound.a(tag, newCompound); + CompoundTag newCompound = new CompoundTag(); + compound.put(tag, newCompound); return new NBTCompoundImpl(newCompound); } @Override public Set getKeys() { - return compound.d(); + return compound.getAllKeys(); } @Override public Set getKeys(String tag) { - return compound.p(tag).d(); + return compound.getCompound(tag).getAllKeys(); } @Override @@ -172,13 +170,13 @@ public class NBTCompoundImpl implements NBTCompound { try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ObjectOutputStream dataOutput = new ObjectOutputStream(outputStream)) { addExtras(); - NBTTagCompound compound = this.compound.g(); + CompoundTag compound = this.compound.copy(); for (String exclusion : exclusions) { - compound.r(exclusion); + compound.remove(exclusion); } - NBTCompressedStreamTools.a(compound, (OutputStream) dataOutput); + NbtIo.writeCompressed(compound, dataOutput); return outputStream.toByteArray(); } catch (Exception ex) { @@ -192,7 +190,7 @@ public class NBTCompoundImpl implements NBTCompound { public void deSerialize(byte[] serialized) { try (ByteArrayInputStream inputStream = new ByteArrayInputStream(serialized); ObjectInputStream dataInput = new ObjectInputStream(inputStream)) { - compound = NBTCompressedStreamTools.a((InputStream) dataInput); + compound = NbtIo.readCompressed(dataInput); } catch (Exception ex) { ex.printStackTrace(); } diff --git a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTCoreImpl.java b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTCoreImpl.java index a1cf48fe..e90e944d 100644 --- a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTCoreImpl.java +++ b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTCoreImpl.java @@ -3,7 +3,7 @@ package com.songoda.core.nms.v1_18_R1.nbt; import com.songoda.core.nms.nbt.NBTCore; import com.songoda.core.nms.nbt.NBTEntity; import com.songoda.core.nms.nbt.NBTItem; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundTag; import org.bukkit.craftbukkit.v1_18_R1.entity.CraftEntity; import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; import org.bukkit.entity.Entity; @@ -25,14 +25,14 @@ public class NBTCoreImpl implements NBTCore { @Override public NBTEntity of(Entity entity) { net.minecraft.world.entity.Entity nmsEntity = ((CraftEntity) entity).getHandle(); - NBTTagCompound nbt = new NBTTagCompound(); - nmsEntity.f(nbt); + CompoundTag nbt = new CompoundTag(); + nmsEntity.saveWithoutId(nbt); return new NBTEntityImpl(nbt, nmsEntity); } @Override public NBTEntity newEntity() { - return new NBTEntityImpl(new NBTTagCompound(), null); + return new NBTEntityImpl(new CompoundTag(), null); } } diff --git a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTEntityImpl.java b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTEntityImpl.java index 7666db2d..76e037ca 100644 --- a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTEntityImpl.java +++ b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTEntityImpl.java @@ -1,12 +1,12 @@ package com.songoda.core.nms.v1_18_R1.nbt; import com.songoda.core.nms.nbt.NBTEntity; -import net.minecraft.core.BlockPosition; -import net.minecraft.core.IRegistry; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityTypes; -import net.minecraft.world.entity.EnumMobSpawn; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; import org.bukkit.Location; import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; @@ -15,7 +15,7 @@ import java.util.Optional; public class NBTEntityImpl extends NBTCompoundImpl implements NBTEntity { private Entity nmsEntity; - public NBTEntityImpl(NBTTagCompound entityNBT, Entity nmsEntity) { + public NBTEntityImpl(CompoundTag entityNBT, Entity nmsEntity) { super(entityNBT); this.nmsEntity = nmsEntity; @@ -26,23 +26,23 @@ public class NBTEntityImpl extends NBTCompoundImpl implements NBTEntity { String entityType = getNBTObject("entity_type").asString(); getKeys().remove("UUID"); - Optional> optionalEntity = EntityTypes.a(entityType); + Optional> optionalEntity = EntityType.byString(entityType); if (optionalEntity.isPresent()) { assert location.getWorld() != null; - Entity spawned = optionalEntity.get().a( + Entity spawned = optionalEntity.get().spawn( ((CraftWorld) location.getWorld()).getHandle(), compound, null, null, - new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()), - EnumMobSpawn.n, + new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()), + MobSpawnType.COMMAND, true, false ); if (spawned != null) { - spawned.g(compound); + spawned.load(compound); org.bukkit.entity.Entity entity = spawned.getBukkitEntity(); entity.teleport(location); nmsEntity = spawned; @@ -56,12 +56,12 @@ public class NBTEntityImpl extends NBTCompoundImpl implements NBTEntity { @Override public org.bukkit.entity.Entity reSpawn(Location location) { - nmsEntity.ah(); + nmsEntity.discard(); return spawn(location); } @Override public void addExtras() { - compound.a("entity_type", IRegistry.Z.b(nmsEntity.ad()).toString()); + compound.putString("entity_type", Registry.ENTITY_TYPE.getKey(nmsEntity.getType()).toString()); } } diff --git a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTItemImpl.java b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTItemImpl.java index e375b6bb..237f074b 100644 --- a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTItemImpl.java +++ b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTItemImpl.java @@ -1,22 +1,22 @@ package com.songoda.core.nms.v1_18_R1.nbt; import com.songoda.core.nms.nbt.NBTItem; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; -import org.bukkit.inventory.ItemStack; public class NBTItemImpl extends NBTCompoundImpl implements NBTItem { - private final net.minecraft.world.item.ItemStack nmsItem; + private final ItemStack nmsItem; - public NBTItemImpl(net.minecraft.world.item.ItemStack nmsItem) { - super(nmsItem != null && nmsItem.r() ? nmsItem.s() : new NBTTagCompound()); + public NBTItemImpl(ItemStack nmsItem) { + super(nmsItem != null && nmsItem.hasTag() ? nmsItem.getTag() : new CompoundTag()); this.nmsItem = nmsItem; } - public ItemStack finish() { + public org.bukkit.inventory.ItemStack finish() { if (nmsItem == null) { - return CraftItemStack.asBukkitCopy(net.minecraft.world.item.ItemStack.a(compound)); + return CraftItemStack.asBukkitCopy(ItemStack.of(compound)); } return CraftItemStack.asBukkitCopy(nmsItem); diff --git a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTObjectImpl.java b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTObjectImpl.java index f1038700..69897c8a 100644 --- a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTObjectImpl.java +++ b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/nbt/NBTObjectImpl.java @@ -2,71 +2,71 @@ package com.songoda.core.nms.v1_18_R1.nbt; import com.songoda.core.nms.nbt.NBTCompound; import com.songoda.core.nms.nbt.NBTObject; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundTag; import java.util.Set; public class NBTObjectImpl implements NBTObject { - private final NBTTagCompound compound; + private final CompoundTag compound; private final String tag; - public NBTObjectImpl(NBTTagCompound compound, String tag) { + public NBTObjectImpl(CompoundTag compound, String tag) { this.compound = compound; this.tag = tag; } @Override public String asString() { - return compound.l(tag); + return compound.getString(tag); } @Override public boolean asBoolean() { - return compound.q(tag); + return compound.getBoolean(tag); } @Override public int asInt() { - return compound.h(tag); + return compound.getInt(tag); } @Override public double asDouble() { - return compound.k(tag); + return compound.getDouble(tag); } @Override public long asLong() { - return compound.i(tag); + return compound.getLong(tag); } @Override public short asShort() { - return compound.g(tag); + return compound.getShort(tag); } @Override public byte asByte() { - return compound.f(tag); + return compound.getByte(tag); } @Override public int[] asIntArray() { - return compound.n(tag); + return compound.getIntArray(tag); } @Override public byte[] asByteArray() { - return compound.m(tag); + return compound.getByteArray(tag); } @Override public NBTCompound asCompound() { - return new NBTCompoundImpl(compound.p(tag)); + return new NBTCompoundImpl(compound.getCompound(tag)); } @Override public Set getKeys() { - return compound.d(); + return compound.getAllKeys(); } } diff --git a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..c090fccf --- /dev/null +++ b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/NmsWorldBorderImpl.java @@ -0,0 +1,35 @@ +package com.songoda.core.nms.v1_18_R1.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.network.protocol.game.ClientboundInitializeBorderPacket; +import net.minecraft.world.level.border.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.world = ((CraftWorld) center.getWorld()).getHandle(); + + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningBlocks(0); + + if (color == BorderColor.GREEN) { + worldBorder.lerpSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.lerpSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().connection.send(new ClientboundInitializeBorderPacket(worldBorder)); + } +} diff --git a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/SItemStackImpl.java b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/SItemStackImpl.java index 120a1239..c835137a 100644 --- a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/SItemStackImpl.java +++ b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/SItemStackImpl.java @@ -1,10 +1,10 @@ package com.songoda.core.nms.v1_18_R1.world; import com.songoda.core.nms.world.SItemStack; -import net.minecraft.core.particles.ParticleParamItem; -import net.minecraft.core.particles.Particles; -import net.minecraft.server.level.EntityPlayer; -import net.minecraft.world.phys.Vec3D; +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.phys.Vec3; import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; import org.bukkit.entity.Player; @@ -19,21 +19,21 @@ public class SItemStackImpl implements SItemStack { @Override public void breakItem(Player player, int amount) { - EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle(); + ServerPlayer entityPlayer = ((CraftPlayer) player).getHandle(); for (int i = 0; i < amount; ++i) { - Vec3D vec3d = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D); - vec3d = vec3d.a(-entityPlayer.dn() * 0.017453292F); - vec3d = vec3d.b(-entityPlayer.dm() * 0.017453292F); + Vec3 vec3d = new Vec3(((double) random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D); + vec3d = vec3d.xRot(-entityPlayer.getXRot() * 0.017453292F); + vec3d = vec3d.yRot(-entityPlayer.getYRot() * 0.017453292F); double d0 = (double) (-random.nextFloat()) * 0.6D - 0.3D; - Vec3D vec3d1 = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D); - vec3d1 = vec3d1.a(-entityPlayer.dn() * 0.017453292F); - vec3d1 = vec3d1.b(-entityPlayer.dm() * 0.017453292F); - vec3d1 = vec3d1.b(entityPlayer.dc(), entityPlayer.dg(), entityPlayer.di()); + Vec3 vec3d1 = new Vec3(((double) random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D); + vec3d1 = vec3d1.xRot(-entityPlayer.getXRot() * 0.017453292F); + vec3d1 = vec3d1.yRot(-entityPlayer.getYRot() * 0.017453292F); + vec3d1 = vec3d1.add(entityPlayer.getX(), entityPlayer.getEyeY(), entityPlayer.getZ()); - entityPlayer.t.a(new ParticleParamItem(Particles.J, CraftItemStack.asNMSCopy(item)), vec3d1.b, vec3d1.c, vec3d1.d, vec3d.b, vec3d.c + 0.05D, vec3d.d); + entityPlayer.level.addParticle(new ItemParticleOption(ParticleTypes.ITEM, CraftItemStack.asNMSCopy(item)), vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y + 0.05D, vec3d.z); } } } diff --git a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/SSpawnerImpl.java b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/SSpawnerImpl.java index 74751f56..68199a52 100644 --- a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/SSpawnerImpl.java +++ b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/SSpawnerImpl.java @@ -4,15 +4,14 @@ import com.songoda.core.compatibility.CompatibleMaterial; import com.songoda.core.compatibility.CompatibleParticleHandler; import com.songoda.core.nms.world.SSpawner; import com.songoda.core.nms.world.SpawnedEntity; -import net.minecraft.core.BlockPosition; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.server.level.WorldServer; -import net.minecraft.world.DifficultyDamageScaler; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.DifficultyInstance; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityInsentient; -import net.minecraft.world.entity.EntityTypes; -import net.minecraft.world.entity.EnumMobSpawn; -import net.minecraft.world.level.MobSpawnerData; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.level.SpawnData; import org.bukkit.Location; import org.bukkit.block.BlockFace; import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; @@ -37,35 +36,35 @@ public class SSpawnerImpl implements SSpawner { } @Override - public LivingEntity spawnEntity(EntityType type, String particleType, SpawnedEntity spawned, - Set canSpawnOn) { - MobSpawnerData data = new MobSpawnerData(); - NBTTagCompound compound = data.a(); + public LivingEntity spawnEntity(EntityType type, String particleType, SpawnedEntity spawned, Set canSpawnOn) { + SpawnData data = new SpawnData(); + CompoundTag compound = data.getEntityToSpawn(); - String name = type.name().toLowerCase().replace("snowman", "snow_golem") + String name = type.name().toLowerCase() + .replace("snowman", "snow_golem") .replace("mushroom_cow", "mooshroom"); - compound.a("id", "minecraft:" + name); + compound.putString("id", "minecraft:" + name); short spawnRange = 4; for (int i = 0; i < 50; i++) { assert spawnerLocation.getWorld() != null; - WorldServer world = ((CraftWorld) spawnerLocation.getWorld()).getHandle(); + ServerLevel world = ((CraftWorld) spawnerLocation.getWorld()).getHandle(); - Random random = world.r_(); + Random random = world.getRandom(); double x = spawnerLocation.getX() + (random.nextDouble() - random.nextDouble()) * (double) spawnRange + 0.5D; double y = spawnerLocation.getY() + random.nextInt(3) - 1; double z = spawnerLocation.getZ() + (random.nextDouble() - random.nextDouble()) * (double) spawnRange + 0.5D; - Optional optionalEntity = EntityTypes.a(compound, world); + Optional optionalEntity = net.minecraft.world.entity.EntityType.create(compound, world); if (optionalEntity.isEmpty()) continue; Entity entity = optionalEntity.get(); - entity.e(x, y, z); + entity.setPos(x, y, z); - BlockPosition position = entity.cW(); - DifficultyDamageScaler damageScaler = world.d_(position); + BlockPos position = entity.blockPosition(); + DifficultyInstance damageScaler = world.getCurrentDifficultyAt(position); - if (!(entity instanceof EntityInsentient entityInsentient)) { + if (!(entity instanceof Mob entityInsentient)) { continue; } @@ -75,7 +74,7 @@ public class SSpawnerImpl implements SSpawner { continue; } - entityInsentient.a(world, damageScaler, EnumMobSpawn.c, null, null); + entityInsentient.finalizeSpawn(world, damageScaler, MobSpawnType.SPAWNER, null, null); LivingEntity craftEntity = (LivingEntity) entity.getBukkitEntity(); @@ -103,9 +102,8 @@ public class SSpawnerImpl implements SSpawner { return null; } - private boolean canSpawn(WorldServer world, EntityInsentient entityInsentient, Location location, - Set canSpawnOn) { - if (!world.a(entityInsentient, entityInsentient.cw())) { + private boolean canSpawn(ServerLevel world, Mob entityInsentient, Location location, Set canSpawnOn) { + if (!world.noCollision(entityInsentient, entityInsentient.getBoundingBox())) { return false; } diff --git a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/SWorldImpl.java b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/SWorldImpl.java index 5551f813..c23b094b 100644 --- a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/SWorldImpl.java +++ b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/SWorldImpl.java @@ -1,10 +1,15 @@ package com.songoda.core.nms.v1_18_R1.world; import com.songoda.core.nms.world.SWorld; -import net.minecraft.server.level.WorldServer; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.entity.LevelEntityGetter; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_18_R1.block.data.CraftBlockData; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; @@ -21,10 +26,10 @@ public class SWorldImpl implements SWorld { public List getLivingEntities() { List result = new ArrayList<>(); - WorldServer worldServer = ((CraftWorld) world).getHandle(); - LevelEntityGetter entities = worldServer.P.d(); + ServerLevel worldServer = ((CraftWorld) this.world).getHandle(); + LevelEntityGetter entities = worldServer.entityManager.getEntityGetter(); - entities.a().forEach((mcEnt) -> { + entities.getAll().forEach((mcEnt) -> { org.bukkit.entity.Entity bukkitEntity = mcEnt.getBukkitEntity(); if (bukkitEntity instanceof LivingEntity && bukkitEntity.isValid()) { @@ -34,4 +39,13 @@ public class SWorldImpl implements SWorld { return result; } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + ServerLevel serverLevel = ((CraftWorld) this.world).getHandle(); + LevelChunk levelChunk = serverLevel.getChunkIfLoaded(x >> 4, z >> 4); + BlockState blockState = ((CraftBlockData) material.createBlockData()).getState(); + + levelChunk.setBlockState(new BlockPos(x & 0xF, y, z & 0xF), blockState, true); + } } diff --git a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/WorldCoreImpl.java index cefdd224..8ab61f78 100644 --- a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/WorldCoreImpl.java @@ -7,15 +7,15 @@ import com.songoda.core.nms.world.SItemStack; import com.songoda.core.nms.world.SSpawner; import com.songoda.core.nms.world.SWorld; import com.songoda.core.nms.world.WorldCore; -import net.minecraft.core.BlockPosition; -import net.minecraft.server.level.WorldServer; -import net.minecraft.util.profiling.GameProfilerFiller; -import net.minecraft.world.level.ChunkCoordIntPair; -import net.minecraft.world.level.MobSpawnerAbstract; -import net.minecraft.world.level.block.state.IBlockData; -import net.minecraft.world.level.chunk.Chunk; -import net.minecraft.world.level.chunk.ChunkSection; -import net.minecraft.world.level.material.Fluid; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.profiling.ProfilerFiller; +import net.minecraft.world.level.BaseSpawner; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.material.FluidState; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Block; @@ -23,6 +23,7 @@ import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_18_R1.CraftChunk; import org.bukkit.craftbukkit.v1_18_R1.block.CraftBlock; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -49,59 +50,58 @@ public class WorldCoreImpl implements WorldCore { public BBaseSpawner getBaseSpawner(CreatureSpawner spawner) throws NoSuchFieldException, IllegalAccessException { Object cTileEntity = ReflectionUtils.getFieldValue(spawner, "tileEntity"); - return new BBaseSpawnerImpl(spawner, (MobSpawnerAbstract) ReflectionUtils.getFieldValue(cTileEntity, "a")); + return new BBaseSpawnerImpl(spawner, (BaseSpawner) ReflectionUtils.getFieldValue(cTileEntity, "a")); } /** - * Method is based on {@link WorldServer#a(Chunk, int)}. + * Method is based on {@link ServerLevel#tickChunk(LevelChunk, int)}. */ @Override public void randomTickChunk(org.bukkit.Chunk bukkitChunk, int tickAmount) { - Chunk chunk = ((CraftChunk) bukkitChunk).getHandle(); - WorldServer world = chunk.q; + LevelChunk chunk = ((CraftChunk) bukkitChunk).getHandle(); + ServerLevel world = chunk.q; - ChunkCoordIntPair chunkcoordintpair = chunk.f(); - int j = chunkcoordintpair.d(); - int k = chunkcoordintpair.e(); + ChunkPos chunkcoordintpair = chunk.getPos(); + int j = chunkcoordintpair.getMinBlockX(); + int k = chunkcoordintpair.getMinBlockZ(); - GameProfilerFiller gameprofilerfiller = world.ab(); - gameprofilerfiller.b("tickBlocks"); + ProfilerFiller gameprofilerfiller = world.getProfiler(); + gameprofilerfiller.popPush("tickBlocks"); if (tickAmount > 0) { - ChunkSection[] achunksection = chunk.d(); + LevelChunkSection[] achunksection = chunk.getSections(); int l = achunksection.length; - for (ChunkSection chunksection : achunksection) { - if (chunksection.d()) { - int j1 = chunksection.g(); + for (LevelChunkSection chunksection : achunksection) { + if (chunksection.isRandomlyTicking()) { + int j1 = chunksection.bottomBlockY(); for (int k1 = 0; k1 < tickAmount; ++k1) { - BlockPosition blockposition2 = world.a(j, j1, k, 15); - gameprofilerfiller.a("randomTick"); - IBlockData iblockdata1 = chunksection.a(blockposition2.u() - j, blockposition2.v() - j1, blockposition2.w() - k); - if (iblockdata1.o()) { - iblockdata1.b(world, blockposition2, world.w); + BlockPos blockposition2 = world.getBlockRandomPos(j, j1, k, 15); + gameprofilerfiller.push("randomTick"); + BlockState iblockdata1 = chunksection.getBlockState(blockposition2.getX() - j, blockposition2.getY() - j1, blockposition2.getZ() - k); + if (iblockdata1.isRandomlyTicking()) { + iblockdata1.randomTick(world, blockposition2, world.random); } - Fluid fluid = iblockdata1.n(); - if (fluid.f()) { - fluid.b(world, blockposition2, world.w); + FluidState fluid = iblockdata1.getFluidState(); + if (fluid.isRandomlyTicking()) { + fluid.randomTick(world, blockposition2, world.random); } - gameprofilerfiller.c(); + gameprofilerfiller.pop(); } } } } - gameprofilerfiller.c(); + gameprofilerfiller.pop(); } @Override - public void updateAdjacentComparators(Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); + ServerLevel serverLevel = craftBlock.getCraftWorld().getHandle(); - WorldServer nmsWorld = craftChunk.getHandle().q; - nmsWorld.c(craftBlock.getPosition(), craftBlock.getNMS().b()); + serverLevel.updateNeighbourForOutputSignal(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); } } diff --git a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/spawner/BBaseSpawnerImpl.java b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/spawner/BBaseSpawnerImpl.java index b4128844..626e5368 100644 --- a/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/spawner/BBaseSpawnerImpl.java +++ b/NMS/NMS-v1_18_R1/src/main/java/com/songoda/core/nms/v1_18_R1/world/spawner/BBaseSpawnerImpl.java @@ -1,21 +1,21 @@ package com.songoda.core.nms.v1_18_R1.world.spawner; import com.songoda.core.nms.world.BBaseSpawner; -import net.minecraft.core.BlockPosition; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.server.level.WorldServer; -import net.minecraft.world.EnumDifficulty; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.Difficulty; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityInsentient; -import net.minecraft.world.entity.EntityPositionTypes; -import net.minecraft.world.entity.EntityTypes; -import net.minecraft.world.entity.EnumMobSpawn; -import net.minecraft.world.level.EnumSkyBlock; -import net.minecraft.world.level.MobSpawnerAbstract; -import net.minecraft.world.level.MobSpawnerData; -import net.minecraft.world.level.World; -import net.minecraft.world.phys.AxisAlignedBB; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.SpawnPlacements; +import net.minecraft.world.level.BaseSpawner; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.SpawnData; +import net.minecraft.world.phys.AABB; import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; import org.bukkit.craftbukkit.v1_18_R1.block.CraftCreatureSpawner; @@ -27,40 +27,45 @@ import java.util.Random; public class BBaseSpawnerImpl implements BBaseSpawner { private final CreatureSpawner bukkitSpawner; - private final MobSpawnerAbstract spawner; + private final BaseSpawner spawner; - private static final Random spawnerFieldO = new Random(); // Field o in MobSpawnerAbstract is private - We use one random for *all* our spawners (should be fine, right?) + private static final Random spawnerFieldO = new Random(); // Field random in BaseSpawner is private - We use one random for *all* our spawners (should be fine, right?) - public BBaseSpawnerImpl(CreatureSpawner bukkitSpawner, MobSpawnerAbstract spawner) { + public BBaseSpawnerImpl(CreatureSpawner bukkitSpawner, BaseSpawner spawner) { this.bukkitSpawner = bukkitSpawner; this.spawner = spawner; } /** - * This method is based on {@link MobSpawnerAbstract#b(World, BlockPosition)}. + * This method is based on {@link BaseSpawner#isNearPlayer(Level, BlockPos)}. */ @SuppressWarnings("JavadocReference") @Override public boolean isNearPlayer() { - BlockPosition bPos = getBlockPosition(); + BlockPos bPos = getBlockPosition(); - return getWorld().a((double) bPos.u() + 0.5D, (double) bPos.v() + 0.5D, (double) bPos.w() + 0.5D, this.spawner.m); + return getWorld().hasNearbyAlivePlayer( + (double) bPos.getX() + 0.5D, + (double) bPos.getY() + 0.5D, + (double) bPos.getZ() + 0.5D, + this.spawner.requiredPlayerRange + ); } /** - * This method is based on {@link MobSpawnerAbstract#a(WorldServer, BlockPosition)}. + * This method is based on {@link BaseSpawner#serverTick(ServerLevel, BlockPos)}. */ @Override public void tick() { - WorldServer world = getWorld(); - BlockPosition bPos = getBlockPosition(); + ServerLevel world = getWorld(); + BlockPos bPos = getBlockPosition(); - if (this.spawner.c == -1) { + if (this.spawner.spawnDelay == -1) { this.delay(world, bPos); } - if (this.spawner.c > 0) { - --this.spawner.c; + if (this.spawner.spawnDelay > 0) { + --this.spawner.spawnDelay; return; } @@ -68,44 +73,45 @@ public class BBaseSpawnerImpl implements BBaseSpawner { int i = 0; while (true) { - if (i >= this.spawner.j) { + if (i >= this.spawner.spawnCount) { if (flag) { this.delay(world, bPos); } break; } - NBTTagCompound nbttagcompound = this.spawner.e.a(); - Optional> optional = EntityTypes.a(nbttagcompound); + CompoundTag nbttagcompound = this.spawner.nextSpawnData.getEntityToSpawn(); + Optional> optional = EntityType.by(nbttagcompound); if (optional.isEmpty()) { this.delay(world, bPos); return; } - NBTTagList nbttaglist = nbttagcompound.c("Pos", 6); + ListTag nbttaglist = nbttagcompound.getList("Pos", 6); int j = nbttaglist.size(); - double d0 = j >= 1 ? nbttaglist.h(0) : (double) bPos.u() + (world.w.nextDouble() - world.w.nextDouble()) * (double) this.spawner.n + 0.5D; - double d1 = j >= 2 ? nbttaglist.h(1) : (double) (bPos.v() + world.w.nextInt(3) - 1); - double d2 = j >= 3 ? nbttaglist.h(2) : (double) bPos.w() + (world.w.nextDouble() - world.w.nextDouble()) * (double) this.spawner.n + 0.5D; - if (world.b(optional.get().a(d0, d1, d2))) { + double d0 = j >= 1 ? nbttaglist.getDouble(0) : (double) bPos.getX() + (world.random.nextDouble() - world.random.nextDouble()) * (double) this.spawner.spawnRange + 0.5D; + double d1 = j >= 2 ? nbttaglist.getDouble(1) : (double) (bPos.getY() + world.random.nextInt(3) - 1); + double d2 = j >= 3 ? nbttaglist.getDouble(2) : (double) bPos.getZ() + (world.random.nextDouble() - world.random.nextDouble()) * (double) this.spawner.spawnRange + 0.5D; + if (world.noCollision(optional.get().getAABB(d0, d1, d2))) { label128: { - BlockPosition blockposition1 = new BlockPosition(d0, d1, d2); - if (this.spawner.e.b().isPresent()) { - if (!optional.get().f().d() && world.af() == EnumDifficulty.a) { + BlockPos blockposition1 = new BlockPos(d0, d1, d2); + if (this.spawner.nextSpawnData.getCustomSpawnRules().isPresent()) { + if (!optional.get().getCategory().isFriendly() && world.getDifficulty() == Difficulty.PEACEFUL) { break label128; } - MobSpawnerData.a mobspawnerdata_a = this.spawner.e.b().get(); - if (!mobspawnerdata_a.a().a(world.a(EnumSkyBlock.b, blockposition1)) || !mobspawnerdata_a.b().a(world.a(EnumSkyBlock.a, blockposition1))) { + SpawnData.CustomSpawnRules mobspawnerdata_a = this.spawner.nextSpawnData.getCustomSpawnRules().get(); + if (!mobspawnerdata_a.blockLightLimit().isValueInRange(world.getBrightness(LightLayer.BLOCK, blockposition1)) || + !mobspawnerdata_a.skyLightLimit().isValueInRange(world.getBrightness(LightLayer.SKY, blockposition1))) { break label128; } - } else if (!EntityPositionTypes.a((EntityTypes) optional.get(), world, EnumMobSpawn.c, blockposition1, world.r_())) { + } else if (!SpawnPlacements.checkSpawnRules(optional.get(), world, MobSpawnType.SPAWNER, blockposition1, world.getRandom())) { break label128; } - Entity entity = EntityTypes.a(nbttagcompound, world, (entity1) -> { - entity1.b(d0, d1, d2, entity1.dm(), entity1.dn()); + Entity entity = EntityType.loadEntityRecursive(nbttagcompound, world, (entity1) -> { + entity1.moveTo(d0, d1, d2, entity1.getYRot(), entity1.getXRot()); return entity1; }); if (entity == null) { @@ -113,35 +119,35 @@ public class BBaseSpawnerImpl implements BBaseSpawner { return; } - int k = world.a(entity.getClass(), (new AxisAlignedBB(bPos.u(), bPos.v(), bPos.w(), bPos.u() + 1, bPos.v() + 1, bPos.w() + 1)).g(this.spawner.n)).size(); - if (k >= this.spawner.l) { + int k = world.getEntitiesOfClass(entity.getClass(), (new AABB(bPos.getX(), bPos.getY(), bPos.getZ(), bPos.getX() + 1, bPos.getY() + 1, bPos.getZ() + 1)).inflate(this.spawner.spawnRange)).size(); + if (k >= this.spawner.maxNearbyEntities) { this.delay(world, bPos); return; } - entity.b(entity.dc(), entity.de(), entity.di(), world.w.nextFloat() * 360.0F, 0.0F); - if (entity instanceof EntityInsentient entityinsentient) { - if (this.spawner.e.b().isEmpty() && !entityinsentient.a(world, EnumMobSpawn.c) || !entityinsentient.a(world)) { + entity.moveTo(entity.getX(), entity.getY(), entity.getZ(), world.random.nextFloat() * 360.0F, 0.0F); + if (entity instanceof Mob entityInsentient) { + if (this.spawner.nextSpawnData.getCustomSpawnRules().isEmpty() && !entityInsentient.checkSpawnRules(world, MobSpawnType.SPAWNER) || !entityInsentient.checkSpawnObstruction(world)) { break label128; } - if (this.spawner.e.a().e() == 1 && this.spawner.e.a().b("id", 8)) { - ((EntityInsentient) entity).a(world, world.d_(entity.cW()), EnumMobSpawn.c, null, null); + if (this.spawner.nextSpawnData.getEntityToSpawn().size() == 1 && this.spawner.nextSpawnData.getEntityToSpawn().contains("id", 8)) { + ((Mob) entity).finalizeSpawn(world, world.getCurrentDifficultyAt(entity.blockPosition()), MobSpawnType.SPAWNER, null, null); } - if (entityinsentient.t.spigotConfig.nerfSpawnerMobs) { - entityinsentient.aware = false; + if (entityInsentient.level.spigotConfig.nerfSpawnerMobs) { + entityInsentient.aware = false; } } if (CraftEventFactory.callSpawnerSpawnEvent(entity, bPos).isCancelled()) { - Entity vehicle = entity.cN(); + Entity vehicle = entity.getVehicle(); if (vehicle != null) { - vehicle.ah(); + vehicle.discard(); } - for (Entity passenger : entity.cJ()) { - passenger.ah(); + for (Entity passenger : entity.getIndirectPassengers()) { + passenger.discard(); } } else { if (!world.tryAddFreshEntityWithPassengers(entity, CreatureSpawnEvent.SpawnReason.SPAWNER)) { @@ -149,9 +155,9 @@ public class BBaseSpawnerImpl implements BBaseSpawner { return; } - world.c(2004, bPos, 0); - if (entity instanceof EntityInsentient) { - ((EntityInsentient) entity).L(); + world.levelEvent(2004, bPos, 0); + if (entity instanceof Mob) { + ((Mob) entity).spawnAnim(); } flag = true; @@ -164,27 +170,25 @@ public class BBaseSpawnerImpl implements BBaseSpawner { } /** - * This method is based on {@link MobSpawnerAbstract#c(World, BlockPosition)}. + * This method is based on {@link BaseSpawner#delay(Level, BlockPos)}. */ @SuppressWarnings("JavadocReference") - private void delay(WorldServer world, BlockPosition bPos) { - if (this.spawner.i <= this.spawner.h) { - this.spawner.c = this.spawner.h; + private void delay(ServerLevel world, BlockPos bPos) { + if (this.spawner.maxSpawnDelay <= this.spawner.minSpawnDelay) { + this.spawner.spawnDelay = this.spawner.minSpawnDelay; } else { - this.spawner.c = this.spawner.h + spawnerFieldO.nextInt(this.spawner.i - this.spawner.h); + this.spawner.spawnDelay = this.spawner.minSpawnDelay + spawnerFieldO.nextInt(this.spawner.maxSpawnDelay - this.spawner.minSpawnDelay); } - this.spawner.d.b(spawnerFieldO).ifPresent((weightedentry_b) -> { - this.spawner.a(world, bPos, weightedentry_b.b()); - }); - this.spawner.a(world, bPos, 1); + this.spawner.spawnPotentials.getRandom(spawnerFieldO).ifPresent((weightedentry_b) -> this.spawner.setNextSpawnData(world, bPos, weightedentry_b.getData())); + this.spawner.broadcastEvent(world, bPos, 1); } - private WorldServer getWorld() { + private ServerLevel getWorld() { return ((CraftWorld) this.bukkitSpawner.getWorld()).getHandle(); } - private BlockPosition getBlockPosition() { + private BlockPos getBlockPosition() { return ((CraftCreatureSpawner) this.bukkitSpawner).getPosition(); } } diff --git a/NMS/NMS-v1_18_R2/pom.xml b/NMS/NMS-v1_18_R2/pom.xml index fec27385..20d4d5fa 100644 --- a/NMS/NMS-v1_18_R2/pom.xml +++ b/NMS/NMS-v1_18_R2/pom.xml @@ -4,19 +4,23 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + + com.songoda + SongodaCore-Modules + 2.6.21 + ../../pom.xml + + SongodaCore-NMS-v1_18_R2 + + + 17 + 17 + + 1.18.2-R0.1-SNAPSHOT + + - - org.apache.maven.plugins - maven-compiler-plugin - - ${java.version} - ${java.version} - - ${java.release} - - - net.md-5 specialsource-maven-plugin @@ -57,49 +61,28 @@ - - com.songoda - SongodaCore-Modules - 2.6.21 - ../../pom.xml - - - - 17 - 17 - - 1.18.2-R0.1-SNAPSHOT - - - SongodaCore-NMS-v1_18_R2 - jar - - - org.spigotmc - spigot-api - ${nms.ver} - provided - - + org.spigotmc spigot ${nms.ver} - provided remapped-mojang + provided ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/NmsImplementationsImpl.java b/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/NmsImplementationsImpl.java new file mode 100644 index 00000000..7c8748ff --- /dev/null +++ b/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_18_R2; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_18_R2.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_18_R2.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_18_R2.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_18_R2.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_18_R2.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..8f3c81fb --- /dev/null +++ b/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/world/NmsWorldBorderImpl.java @@ -0,0 +1,35 @@ +package com.songoda.core.nms.v1_18_R2.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.network.protocol.game.ClientboundInitializeBorderPacket; +import net.minecraft.world.level.border.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.world = ((CraftWorld) center.getWorld()).getHandle(); + + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningBlocks(0); + + if (color == BorderColor.GREEN) { + worldBorder.lerpSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.lerpSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().connection.send(new ClientboundInitializeBorderPacket(worldBorder)); + } +} diff --git a/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/world/SSpawnerImpl.java b/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/world/SSpawnerImpl.java index 5af38e9c..495dbfa6 100644 --- a/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/world/SSpawnerImpl.java +++ b/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/world/SSpawnerImpl.java @@ -40,7 +40,8 @@ public class SSpawnerImpl implements SSpawner { SpawnData data = new SpawnData(); CompoundTag compound = data.getEntityToSpawn(); - String name = type.name().toLowerCase().replace("snowman", "snow_golem") + String name = type.name().toLowerCase() + .replace("snowman", "snow_golem") .replace("mushroom_cow", "mooshroom"); compound.putString("id", "minecraft:" + name); diff --git a/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/world/SWorldImpl.java b/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/world/SWorldImpl.java index a3ac885c..5cf6f6f9 100644 --- a/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/world/SWorldImpl.java +++ b/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/world/SWorldImpl.java @@ -1,11 +1,16 @@ package com.songoda.core.nms.v1_18_R2.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.entity.LevelEntityGetter; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; @@ -22,8 +27,8 @@ public class SWorldImpl implements SWorld { public List getLivingEntities() { List result = new ArrayList<>(); - ServerLevel worldServer = ((CraftWorld) world).getHandle(); - LevelEntityGetter entities = worldServer.entityManager.getEntityGetter(); + ServerLevel serverLevel = ((CraftWorld) this.world).getHandle(); + LevelEntityGetter entities = serverLevel.entityManager.getEntityGetter(); entities.getAll().forEach((mcEnt) -> { org.bukkit.entity.Entity bukkitEntity = mcEnt.getBukkitEntity(); @@ -35,4 +40,13 @@ public class SWorldImpl implements SWorld { return result; } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + ServerLevel serverLevel = ((CraftWorld) this.world).getHandle(); + LevelChunk levelChunk = serverLevel.getChunk(x >> 4, z >> 4); + BlockState blockState = ((CraftBlockData) material.createBlockData()).getState(); + + levelChunk.setBlockState(new BlockPos(x & 0xF, y, z & 0xF), blockState, true); + } } diff --git a/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/world/WorldCoreImpl.java b/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/world/WorldCoreImpl.java index bbfc8474..882f7e4f 100644 --- a/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_18_R2/src/main/java/com/songoda/core/nms/v1_18_R2/world/WorldCoreImpl.java @@ -23,6 +23,7 @@ import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_18_R2.CraftChunk; import org.bukkit.craftbukkit.v1_18_R2.block.CraftBlock; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -96,11 +97,10 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); + ServerLevel serverLevel = craftBlock.getCraftWorld().getHandle(); - ServerLevel nmsWorld = craftChunk.getHandle().q; - nmsWorld.updateNeighbourForOutputSignal(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); + serverLevel.updateNeighbourForOutputSignal(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); } } diff --git a/NMS/NMS-v1_19_R1v2/pom.xml b/NMS/NMS-v1_19_0/pom.xml similarity index 81% rename from NMS/NMS-v1_19_R1v2/pom.xml rename to NMS/NMS-v1_19_0/pom.xml index 8dd02dd0..d53e05be 100644 --- a/NMS/NMS-v1_19_R1v2/pom.xml +++ b/NMS/NMS-v1_19_0/pom.xml @@ -4,19 +4,23 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + + com.songoda + SongodaCore-Modules + 2.6.21 + ../../pom.xml + + SongodaCore-NMS-v1_19_0 + + + 17 + 17 + + 1.19-R0.1-SNAPSHOT + + - - org.apache.maven.plugins - maven-compiler-plugin - - ${java.version} - ${java.version} - - ${java.release} - - - net.md-5 specialsource-maven-plugin @@ -57,49 +61,28 @@ - - com.songoda - SongodaCore-Modules - 2.6.21 - ../../pom.xml - - - - 17 - 17 - - 1.19.2-R0.1-SNAPSHOT - - - SongodaCore-NMS-v1_19_R1v2 - jar - - - org.spigotmc - spigot-api - ${nms.ver} - provided - - + org.spigotmc spigot ${nms.ver} - provided remapped-mojang + provided ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/NmsImplementationsImpl.java b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/NmsImplementationsImpl.java new file mode 100644 index 00000000..5d097960 --- /dev/null +++ b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_19_0; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_19_0.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_19_0.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_19_0.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_19_0.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_19_0.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/anvil/AnvilCore.java b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/anvil/AnvilCore.java similarity index 93% rename from NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/anvil/AnvilCore.java rename to NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/anvil/AnvilCore.java index 12c2d06e..abc9a290 100644 --- a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/anvil/AnvilCore.java +++ b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/anvil/AnvilCore.java @@ -1,4 +1,4 @@ -package com.songoda.core.nms.v1_19_R1v2.anvil; +package com.songoda.core.nms.v1_19_0.anvil; import com.songoda.core.nms.anvil.CustomAnvil; import net.minecraft.server.level.ServerPlayer; diff --git a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/anvil/AnvilInventoryCustom.java b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/anvil/AnvilInventoryCustom.java similarity index 93% rename from NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/anvil/AnvilInventoryCustom.java rename to NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/anvil/AnvilInventoryCustom.java index 0a207509..066ea009 100644 --- a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/anvil/AnvilInventoryCustom.java +++ b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/anvil/AnvilInventoryCustom.java @@ -1,4 +1,4 @@ -package com.songoda.core.nms.v1_19_R1v2.anvil; +package com.songoda.core.nms.v1_19_0.anvil; import net.minecraft.world.Container; import net.minecraft.world.inventory.AnvilMenu; diff --git a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/anvil/AnvilView.java b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/anvil/AnvilView.java similarity index 99% rename from NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/anvil/AnvilView.java rename to NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/anvil/AnvilView.java index d11c8a94..3226d9ed 100644 --- a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/anvil/AnvilView.java +++ b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/anvil/AnvilView.java @@ -1,4 +1,4 @@ -package com.songoda.core.nms.v1_19_R1v2.anvil; +package com.songoda.core.nms.v1_19_0.anvil; import com.songoda.core.nms.anvil.CustomAnvil; import com.songoda.core.nms.anvil.methods.AnvilTextChange; diff --git a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/entity/NMSPlayerImpl.java b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/entity/NMSPlayerImpl.java similarity index 88% rename from NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/entity/NMSPlayerImpl.java rename to NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/entity/NMSPlayerImpl.java index ce1d0de9..60d8e99a 100644 --- a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/entity/NMSPlayerImpl.java +++ b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/entity/NMSPlayerImpl.java @@ -1,4 +1,4 @@ -package com.songoda.core.nms.v1_19_R1v2.entity; +package com.songoda.core.nms.v1_19_0.entity; import com.songoda.core.nms.entity.NMSPlayer; import net.minecraft.network.protocol.Packet; diff --git a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/nbt/NBTCompoundImpl.java b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/nbt/NBTCompoundImpl.java similarity index 99% rename from NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/nbt/NBTCompoundImpl.java rename to NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/nbt/NBTCompoundImpl.java index 28255a67..d4078a34 100644 --- a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/nbt/NBTCompoundImpl.java +++ b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/nbt/NBTCompoundImpl.java @@ -1,4 +1,4 @@ -package com.songoda.core.nms.v1_19_R1v2.nbt; +package com.songoda.core.nms.v1_19_0.nbt; import com.songoda.core.nms.nbt.NBTCompound; import com.songoda.core.nms.nbt.NBTObject; diff --git a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/nbt/NBTCoreImpl.java b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/nbt/NBTCoreImpl.java similarity index 95% rename from NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/nbt/NBTCoreImpl.java rename to NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/nbt/NBTCoreImpl.java index e2edefe2..8e49fd68 100644 --- a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/nbt/NBTCoreImpl.java +++ b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/nbt/NBTCoreImpl.java @@ -1,4 +1,4 @@ -package com.songoda.core.nms.v1_19_R1v2.nbt; +package com.songoda.core.nms.v1_19_0.nbt; import com.songoda.core.nms.nbt.NBTCore; import com.songoda.core.nms.nbt.NBTEntity; diff --git a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/nbt/NBTEntityImpl.java b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/nbt/NBTEntityImpl.java similarity index 97% rename from NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/nbt/NBTEntityImpl.java rename to NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/nbt/NBTEntityImpl.java index cb9a39e4..bb926e4e 100644 --- a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/nbt/NBTEntityImpl.java +++ b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/nbt/NBTEntityImpl.java @@ -1,4 +1,4 @@ -package com.songoda.core.nms.v1_19_R1v2.nbt; +package com.songoda.core.nms.v1_19_0.nbt; import com.songoda.core.nms.nbt.NBTEntity; import net.minecraft.core.BlockPos; diff --git a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/nbt/NBTItemImpl.java b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/nbt/NBTItemImpl.java similarity index 93% rename from NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/nbt/NBTItemImpl.java rename to NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/nbt/NBTItemImpl.java index 053dafe9..acaf84ec 100644 --- a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/nbt/NBTItemImpl.java +++ b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/nbt/NBTItemImpl.java @@ -1,4 +1,4 @@ -package com.songoda.core.nms.v1_19_R1v2.nbt; +package com.songoda.core.nms.v1_19_0.nbt; import com.songoda.core.nms.nbt.NBTItem; import net.minecraft.nbt.CompoundTag; diff --git a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/nbt/NBTObjectImpl.java b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/nbt/NBTObjectImpl.java similarity index 96% rename from NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/nbt/NBTObjectImpl.java rename to NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/nbt/NBTObjectImpl.java index b2a3856a..84b131b2 100644 --- a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/nbt/NBTObjectImpl.java +++ b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/nbt/NBTObjectImpl.java @@ -1,4 +1,4 @@ -package com.songoda.core.nms.v1_19_R1v2.nbt; +package com.songoda.core.nms.v1_19_0.nbt; import com.songoda.core.nms.nbt.NBTCompound; import com.songoda.core.nms.nbt.NBTObject; diff --git a/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..efbdb0c1 --- /dev/null +++ b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/NmsWorldBorderImpl.java @@ -0,0 +1,35 @@ +package com.songoda.core.nms.v1_19_0.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.network.protocol.game.ClientboundInitializeBorderPacket; +import net.minecraft.world.level.border.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.world = ((CraftWorld) center.getWorld()).getHandle(); + + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningBlocks(0); + + if (color == BorderColor.GREEN) { + worldBorder.lerpSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.lerpSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().connection.send(new ClientboundInitializeBorderPacket(worldBorder)); + } +} diff --git a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/world/SItemStackImpl.java b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/SItemStackImpl.java similarity index 97% rename from NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/world/SItemStackImpl.java rename to NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/SItemStackImpl.java index 18422c81..443a4f54 100644 --- a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/world/SItemStackImpl.java +++ b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/SItemStackImpl.java @@ -1,4 +1,4 @@ -package com.songoda.core.nms.v1_19_R1v2.world; +package com.songoda.core.nms.v1_19_0.world; import com.songoda.core.nms.world.SItemStack; import net.minecraft.core.particles.ItemParticleOption; diff --git a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/world/SSpawnerImpl.java b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/SSpawnerImpl.java similarity index 99% rename from NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/world/SSpawnerImpl.java rename to NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/SSpawnerImpl.java index ac0c837b..420bad03 100644 --- a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/world/SSpawnerImpl.java +++ b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/SSpawnerImpl.java @@ -1,4 +1,4 @@ -package com.songoda.core.nms.v1_19_R1v2.world; +package com.songoda.core.nms.v1_19_0.world; import com.songoda.core.compatibility.CompatibleMaterial; import com.songoda.core.compatibility.CompatibleParticleHandler; diff --git a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/world/SWorldImpl.java b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/SWorldImpl.java similarity index 52% rename from NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/world/SWorldImpl.java rename to NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/SWorldImpl.java index 7ca2e85c..a9308877 100644 --- a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/world/SWorldImpl.java +++ b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/SWorldImpl.java @@ -1,11 +1,16 @@ -package com.songoda.core.nms.v1_19_R1v2.world; +package com.songoda.core.nms.v1_19_0.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.entity.LevelEntityGetter; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_19_R1.block.data.CraftBlockData; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; @@ -22,8 +27,8 @@ public class SWorldImpl implements SWorld { public List getLivingEntities() { List result = new ArrayList<>(); - ServerLevel worldServer = ((CraftWorld) world).getHandle(); - LevelEntityGetter entities = worldServer.getEntities(); + ServerLevel worldServer = ((CraftWorld) this.world).getHandle(); + LevelEntityGetter entities = worldServer.entityManager.getEntityGetter(); entities.getAll().forEach((mcEnt) -> { org.bukkit.entity.Entity bukkitEntity = mcEnt.getBukkitEntity(); @@ -35,4 +40,13 @@ public class SWorldImpl implements SWorld { return result; } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + ServerLevel serverLevel = ((CraftWorld) this.world).getHandle(); + LevelChunk levelChunk = serverLevel.getChunk(x >> 4, z >> 4); + BlockState blockState = ((CraftBlockData) material.createBlockData()).getState(); + + levelChunk.setBlockState(new BlockPos(x & 0xF, y, z & 0xF), blockState, true); + } } diff --git a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/world/WorldCoreImpl.java b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/WorldCoreImpl.java similarity index 88% rename from NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/world/WorldCoreImpl.java rename to NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/WorldCoreImpl.java index b0015e23..5198c3e5 100644 --- a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/WorldCoreImpl.java @@ -1,7 +1,7 @@ -package com.songoda.core.nms.v1_19_R1v2.world; +package com.songoda.core.nms.v1_19_0.world; import com.songoda.core.nms.ReflectionUtils; -import com.songoda.core.nms.v1_19_R1v2.world.spawner.BBaseSpawnerImpl; +import com.songoda.core.nms.v1_19_0.world.spawner.BBaseSpawnerImpl; import com.songoda.core.nms.world.BBaseSpawner; import com.songoda.core.nms.world.SItemStack; import com.songoda.core.nms.world.SSpawner; @@ -21,8 +21,12 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_19_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; import org.bukkit.craftbukkit.v1_19_R1.block.CraftBlock; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; public class WorldCoreImpl implements WorldCore { @Override @@ -94,11 +98,10 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); + ServerLevel serverLevel = craftBlock.getCraftWorld().getHandle(); - ServerLevel nmsWorld = craftChunk.getHandle().q; - nmsWorld.updateNeighbourForOutputSignal(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); + serverLevel.updateNeighbourForOutputSignal(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); } } diff --git a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/world/spawner/BBaseSpawnerImpl.java b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/spawner/BBaseSpawnerImpl.java similarity index 99% rename from NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/world/spawner/BBaseSpawnerImpl.java rename to NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/spawner/BBaseSpawnerImpl.java index 1bd895bf..c8284616 100644 --- a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/world/spawner/BBaseSpawnerImpl.java +++ b/NMS/NMS-v1_19_0/src/main/java/com/songoda/core/nms/v1_19_0/world/spawner/BBaseSpawnerImpl.java @@ -1,4 +1,4 @@ -package com.songoda.core.nms.v1_19_R1v2.world.spawner; +package com.songoda.core.nms.v1_19_0.world.spawner; import com.songoda.core.nms.world.BBaseSpawner; import net.minecraft.core.BlockPos; diff --git a/NMS/NMS-v1_19_R1/pom.xml b/NMS/NMS-v1_19_R1/pom.xml index 703f3c39..d7cd7ede 100644 --- a/NMS/NMS-v1_19_R1/pom.xml +++ b/NMS/NMS-v1_19_R1/pom.xml @@ -4,19 +4,23 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + + com.songoda + SongodaCore-Modules + 2.6.21 + ../../pom.xml + + SongodaCore-NMS-v1_19_R1 + + + 17 + 17 + + 1.19.2-R0.1-SNAPSHOT + + - - org.apache.maven.plugins - maven-compiler-plugin - - ${java.version} - ${java.version} - - ${java.release} - - - net.md-5 specialsource-maven-plugin @@ -57,49 +61,36 @@ - - com.songoda - SongodaCore-Modules - 2.6.21 - ../../pom.xml - - - - 17 - 17 - - 1.19-R0.1-SNAPSHOT - - - SongodaCore-NMS-v1_19_R1 - jar - + - org.spigotmc - spigot-api - ${nms.ver} - provided + ${project.version} + SongodaCore-NMS-v1_19_0 + ${project.groupId} + compile + org.spigotmc spigot ${nms.ver} - provided remapped-mojang + provided ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/NmsImplementationsImpl.java b/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/NmsImplementationsImpl.java new file mode 100644 index 00000000..48e2fc28 --- /dev/null +++ b/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/NmsImplementationsImpl.java @@ -0,0 +1,68 @@ +package com.songoda.core.nms.v1_19_R1; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_19_R1.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_19_R1.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_19_R1.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_19_R1.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.bukkit.craftbukkit.v1_19_R1.util.CraftMagicNumbers; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + if (((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion().equals("7b9de0da1357e5b251eddde9aa762916")) { + var nmsMc1_19_0 = new com.songoda.core.nms.v1_19_0.NmsImplementationsImpl(); + + this.player = nmsMc1_19_0.getPlayer(); + this.world = nmsMc1_19_0.getWorld(); + this.worldBorder = nmsMc1_19_0.getWorldBorder(); + this.anvil = nmsMc1_19_0.getAnvil(); + this.nbt = nmsMc1_19_0.getNbt(); + + return; + } + + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_19_R1.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/anvil/AnvilView.java b/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/anvil/AnvilView.java index 5145fc4b..d5235be8 100644 --- a/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/anvil/AnvilView.java +++ b/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/anvil/AnvilView.java @@ -2,7 +2,6 @@ package com.songoda.core.nms.v1_19_R1.anvil; import com.songoda.core.nms.anvil.CustomAnvil; import com.songoda.core.nms.anvil.methods.AnvilTextChange; -import net.md_5.bungee.api.chat.TranslatableComponent; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.contents.TranslatableContents; diff --git a/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..67f630a7 --- /dev/null +++ b/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/world/NmsWorldBorderImpl.java @@ -0,0 +1,35 @@ +package com.songoda.core.nms.v1_19_R1.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.network.protocol.game.ClientboundInitializeBorderPacket; +import net.minecraft.world.level.border.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.world = ((CraftWorld) center.getWorld()).getHandle(); + + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningBlocks(0); + + if (color == BorderColor.GREEN) { + worldBorder.lerpSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.lerpSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().connection.send(new ClientboundInitializeBorderPacket(worldBorder)); + } +} diff --git a/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/world/SWorldImpl.java b/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/world/SWorldImpl.java index d04a5e36..90a65137 100644 --- a/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/world/SWorldImpl.java +++ b/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/world/SWorldImpl.java @@ -1,11 +1,16 @@ package com.songoda.core.nms.v1_19_R1.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.entity.LevelEntityGetter; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_19_R1.block.data.CraftBlockData; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; @@ -22,7 +27,7 @@ public class SWorldImpl implements SWorld { public List getLivingEntities() { List result = new ArrayList<>(); - ServerLevel worldServer = ((CraftWorld) world).getHandle(); + ServerLevel worldServer = ((CraftWorld) this.world).getHandle(); LevelEntityGetter entities = worldServer.getEntities(); entities.getAll().forEach((mcEnt) -> { @@ -35,4 +40,13 @@ public class SWorldImpl implements SWorld { return result; } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + ServerLevel serverLevel = ((CraftWorld) this.world).getHandle(); + LevelChunk levelChunk = serverLevel.getChunk(x >> 4, z >> 4); + BlockState blockState = ((CraftBlockData) material.createBlockData()).getState(); + + levelChunk.setBlockState(new BlockPos(x & 0xF, y, z & 0xF), blockState, true); + } } diff --git a/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/world/WorldCoreImpl.java index ef9b1958..eefc3a64 100644 --- a/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_19_R1/src/main/java/com/songoda/core/nms/v1_19_R1/world/WorldCoreImpl.java @@ -23,6 +23,7 @@ import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_19_R1.CraftChunk; import org.bukkit.craftbukkit.v1_19_R1.block.CraftBlock; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -94,11 +95,10 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); + ServerLevel serverLevel = craftBlock.getCraftWorld().getHandle(); - ServerLevel nmsWorld = craftChunk.getHandle().q; - nmsWorld.updateNeighbourForOutputSignal(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); + serverLevel.updateNeighbourForOutputSignal(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); } } diff --git a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/anvil/entity/NMSPlayerImpl.java b/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/anvil/entity/NMSPlayerImpl.java deleted file mode 100644 index c3ff06f0..00000000 --- a/NMS/NMS-v1_19_R1v2/src/main/java/com/songoda/core/nms/v1_19_R1v2/anvil/entity/NMSPlayerImpl.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.songoda.core.nms.v1_19_R1v2.anvil.entity; - -import com.songoda.core.nms.entity.NMSPlayer; -import net.minecraft.network.protocol.Packet; -import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; -import org.bukkit.entity.Player; - -public class NMSPlayerImpl implements NMSPlayer { - @Override - public void sendPacket(Player p, Object packet) { - ((CraftPlayer) p).getHandle().connection.send((Packet) packet); - } -} diff --git a/NMS/NMS-v1_19_R2/pom.xml b/NMS/NMS-v1_19_R2/pom.xml index 66321cb1..79c3f141 100644 --- a/NMS/NMS-v1_19_R2/pom.xml +++ b/NMS/NMS-v1_19_R2/pom.xml @@ -4,19 +4,23 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + + com.songoda + SongodaCore-Modules + 2.6.21 + ../../pom.xml + + SongodaCore-NMS-v1_19_R2 + + + 17 + 17 + + 1.19.3-R0.1-SNAPSHOT + + - - org.apache.maven.plugins - maven-compiler-plugin - - ${java.version} - ${java.version} - - ${java.release} - - - net.md-5 specialsource-maven-plugin @@ -57,49 +61,28 @@ - - com.songoda - SongodaCore-Modules - 2.6.21 - ../../pom.xml - - - - 17 - 17 - - 1.19.3-R0.1-SNAPSHOT - - - SongodaCore-NMS-v1_19_R2 - jar - - - org.spigotmc - spigot-api - ${nms.ver} - provided - - + org.spigotmc spigot ${nms.ver} - provided remapped-mojang + provided ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_19_R2/src/main/java/com/songoda/core/nms/v1_19_R2/anvil/AnvilView.java b/NMS/NMS-v1_19_R2/src/main/java/com/songoda/core/nms/v1_19_R2/anvil/AnvilView.java index 4ec10d7c..63516300 100644 --- a/NMS/NMS-v1_19_R2/src/main/java/com/songoda/core/nms/v1_19_R2/anvil/AnvilView.java +++ b/NMS/NMS-v1_19_R2/src/main/java/com/songoda/core/nms/v1_19_R2/anvil/AnvilView.java @@ -2,7 +2,6 @@ package com.songoda.core.nms.v1_19_R2.anvil; import com.songoda.core.nms.anvil.CustomAnvil; import com.songoda.core.nms.anvil.methods.AnvilTextChange; -import net.md_5.bungee.api.chat.TranslatableComponent; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.contents.TranslatableContents; diff --git a/NMS/NMS-v1_19_R2/src/main/java/com/songoda/core/nms/v1_19_R2/nbt/NBTEntityImpl.java b/NMS/NMS-v1_19_R2/src/main/java/com/songoda/core/nms/v1_19_R2/nbt/NBTEntityImpl.java index d5db1d35..e177eb80 100644 --- a/NMS/NMS-v1_19_R2/src/main/java/com/songoda/core/nms/v1_19_R2/nbt/NBTEntityImpl.java +++ b/NMS/NMS-v1_19_R2/src/main/java/com/songoda/core/nms/v1_19_R2/nbt/NBTEntityImpl.java @@ -2,7 +2,6 @@ package com.songoda.core.nms.v1_19_R2.nbt; import com.songoda.core.nms.nbt.NBTEntity; import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.Entity; diff --git a/NMS/NMS-v1_19_R2/src/main/java/com/songoda/core/nms/v1_19_R2/world/SWorldImpl.java b/NMS/NMS-v1_19_R2/src/main/java/com/songoda/core/nms/v1_19_R2/world/SWorldImpl.java index 9aff266a..84a83b1f 100644 --- a/NMS/NMS-v1_19_R2/src/main/java/com/songoda/core/nms/v1_19_R2/world/SWorldImpl.java +++ b/NMS/NMS-v1_19_R2/src/main/java/com/songoda/core/nms/v1_19_R2/world/SWorldImpl.java @@ -1,11 +1,16 @@ package com.songoda.core.nms.v1_19_R2.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.entity.LevelEntityGetter; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.craftbukkit.v1_19_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_19_R2.block.data.CraftBlockData; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; @@ -22,7 +27,7 @@ public class SWorldImpl implements SWorld { public List getLivingEntities() { List result = new ArrayList<>(); - ServerLevel worldServer = ((CraftWorld) world).getHandle(); + ServerLevel worldServer = ((CraftWorld) this.world).getHandle(); LevelEntityGetter entities = worldServer.getEntities(); entities.getAll().forEach((mcEnt) -> { @@ -35,4 +40,13 @@ public class SWorldImpl implements SWorld { return result; } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + ServerLevel serverLevel = ((CraftWorld) this.world).getHandle(); + LevelChunk levelChunk = serverLevel.getChunk(x >> 4, z >> 4); + BlockState blockState = ((CraftBlockData) material.createBlockData()).getState(); + + levelChunk.setBlockState(new BlockPos(x & 0xF, y, z & 0xF), blockState, true); + } } diff --git a/NMS/NMS-v1_19_R2/src/main/java/com/songoda/core/nms/v1_19_R2/world/WorldCoreImpl.java b/NMS/NMS-v1_19_R2/src/main/java/com/songoda/core/nms/v1_19_R2/world/WorldCoreImpl.java index cd919101..faf20e96 100644 --- a/NMS/NMS-v1_19_R2/src/main/java/com/songoda/core/nms/v1_19_R2/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_19_R2/src/main/java/com/songoda/core/nms/v1_19_R2/world/WorldCoreImpl.java @@ -23,6 +23,7 @@ import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_19_R2.CraftChunk; import org.bukkit.craftbukkit.v1_19_R2.block.CraftBlock; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -94,11 +95,10 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); + ServerLevel serverLevel = craftBlock.getCraftWorld().getHandle(); - ServerLevel nmsWorld = craftChunk.getHandle().q; - nmsWorld.updateNeighbourForOutputSignal(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); + serverLevel.updateNeighbourForOutputSignal(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); } } diff --git a/NMS/NMS-v1_19_R3/pom.xml b/NMS/NMS-v1_19_R3/pom.xml index b067de76..d8124729 100644 --- a/NMS/NMS-v1_19_R3/pom.xml +++ b/NMS/NMS-v1_19_R3/pom.xml @@ -4,19 +4,23 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + + com.songoda + SongodaCore-Modules + 2.6.21 + ../../pom.xml + + SongodaCore-NMS-v1_19_R3 + + + 17 + 17 + + 1.19.4-R0.1-SNAPSHOT + + - - org.apache.maven.plugins - maven-compiler-plugin - - ${java.version} - ${java.version} - - ${java.release} - - - net.md-5 specialsource-maven-plugin @@ -57,49 +61,28 @@ - - com.songoda - SongodaCore-Modules - 2.6.21 - ../../pom.xml - - - - 17 - 17 - - 1.19.4-R0.1-SNAPSHOT - - - SongodaCore-NMS-v1_19_R3 - jar - - - org.spigotmc - spigot-api - ${nms.ver} - provided - - + org.spigotmc spigot ${nms.ver} - provided remapped-mojang + provided ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/anvil/AnvilInventoryCustom.java b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/anvil/AnvilInventoryCustom.java index a24d9583..d3dfeaf4 100644 --- a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/anvil/AnvilInventoryCustom.java +++ b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/anvil/AnvilInventoryCustom.java @@ -17,6 +17,6 @@ public class AnvilInventoryCustom extends CraftInventoryAnvil { @Override public InventoryHolder getHolder() { - return holder; + return this.holder; } } diff --git a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/nbt/NBTCompoundImpl.java b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/nbt/NBTCompoundImpl.java index f0c3b52e..ac9e5a86 100644 --- a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/nbt/NBTCompoundImpl.java +++ b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/nbt/NBTCompoundImpl.java @@ -25,78 +25,78 @@ public class NBTCompoundImpl implements NBTCompound { @Override public NBTCompound set(String tag, String s) { - compound.putString(tag, s); + this.compound.putString(tag, s); return this; } @Override public NBTCompound set(String tag, boolean b) { - compound.putBoolean(tag, b); + this.compound.putBoolean(tag, b); return this; } @Override public NBTCompound set(String tag, int i) { - compound.putInt(tag, i); + this.compound.putInt(tag, i); return this; } @Override public NBTCompound set(String tag, double i) { - compound.putDouble(tag, i); + this.compound.putDouble(tag, i); return this; } @Override public NBTCompound set(String tag, long l) { - compound.putLong(tag, l); + this.compound.putLong(tag, l); return this; } @Override public NBTCompound set(String tag, short s) { - compound.putShort(tag, s); + this.compound.putShort(tag, s); return this; } @Override public NBTCompound set(String tag, byte b) { - compound.putByte(tag, b); + this.compound.putByte(tag, b); return this; } @Override public NBTCompound set(String tag, int[] i) { - compound.putIntArray(tag, i); + this.compound.putIntArray(tag, i); return this; } @Override public NBTCompound set(String tag, byte[] b) { - compound.putByteArray(tag, b); + this.compound.putByteArray(tag, b); return this; } @Override public NBTCompound set(String tag, UUID u) { - compound.putUUID(tag, u); + this.compound.putUUID(tag, u); return this; } @Override public NBTCompound remove(String tag) { - compound.remove(tag); + this.compound.remove(tag); return this; } @Override public boolean has(String tag) { - return compound.contains(tag); + return this.compound.contains(tag); } @Override public NBTObject getNBTObject(String tag) { - return new NBTObjectImpl(compound, tag); + return new NBTObjectImpl(this.compound, tag); } @Override @@ -151,18 +151,18 @@ public class NBTCompoundImpl implements NBTCompound { } CompoundTag newCompound = new CompoundTag(); - compound.put(tag, newCompound); + this.compound.put(tag, newCompound); return new NBTCompoundImpl(newCompound); } @Override public Set getKeys() { - return compound.getAllKeys(); + return this.compound.getAllKeys(); } @Override public Set getKeys(String tag) { - return compound.getCompound(tag).getAllKeys(); + return this.compound.getCompound(tag).getAllKeys(); } @Override @@ -190,7 +190,7 @@ public class NBTCompoundImpl implements NBTCompound { public void deSerialize(byte[] serialized) { try (ByteArrayInputStream inputStream = new ByteArrayInputStream(serialized); ObjectInputStream dataInput = new ObjectInputStream(inputStream)) { - compound = NbtIo.readCompressed(dataInput); + this.compound = NbtIo.readCompressed(dataInput); } catch (Exception ex) { ex.printStackTrace(); } @@ -203,6 +203,6 @@ public class NBTCompoundImpl implements NBTCompound { @Override public String toString() { - return compound.toString(); + return this.compound.toString(); } } diff --git a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/nbt/NBTEntityImpl.java b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/nbt/NBTEntityImpl.java index 8b38113a..cd1b539b 100644 --- a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/nbt/NBTEntityImpl.java +++ b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/nbt/NBTEntityImpl.java @@ -2,7 +2,6 @@ package com.songoda.core.nms.v1_19_R3.nbt; import com.songoda.core.nms.nbt.NBTEntity; import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.Entity; @@ -33,7 +32,7 @@ public class NBTEntityImpl extends NBTCompoundImpl implements NBTEntity { Entity spawned = optionalEntity.get().spawn( ((CraftWorld) location.getWorld()).getHandle(), - compound, + this.compound, null, new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()), MobSpawnType.COMMAND, @@ -42,10 +41,10 @@ public class NBTEntityImpl extends NBTCompoundImpl implements NBTEntity { ); if (spawned != null) { - spawned.load(compound); + spawned.load(this.compound); org.bukkit.entity.Entity entity = spawned.getBukkitEntity(); entity.teleport(location); - nmsEntity = spawned; + this.nmsEntity = spawned; return entity; } @@ -56,12 +55,12 @@ public class NBTEntityImpl extends NBTCompoundImpl implements NBTEntity { @Override public org.bukkit.entity.Entity reSpawn(Location location) { - nmsEntity.discard(); + this.nmsEntity.discard(); return spawn(location); } @Override public void addExtras() { - compound.putString("entity_type", BuiltInRegistries.ENTITY_TYPE.getKey(nmsEntity.getType()).toString()); + this.compound.putString("entity_type", BuiltInRegistries.ENTITY_TYPE.getKey(this.nmsEntity.getType()).toString()); } } diff --git a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/nbt/NBTItemImpl.java b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/nbt/NBTItemImpl.java index bdffd1fd..a394c39c 100644 --- a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/nbt/NBTItemImpl.java +++ b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/nbt/NBTItemImpl.java @@ -15,10 +15,10 @@ public class NBTItemImpl extends NBTCompoundImpl implements NBTItem { } public org.bukkit.inventory.ItemStack finish() { - if (nmsItem == null) { - return CraftItemStack.asBukkitCopy(ItemStack.of(compound)); + if (this.nmsItem == null) { + return CraftItemStack.asBukkitCopy(ItemStack.of(this.compound)); } - return CraftItemStack.asBukkitCopy(nmsItem); + return CraftItemStack.asBukkitCopy(this.nmsItem); } } diff --git a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/nbt/NBTObjectImpl.java b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/nbt/NBTObjectImpl.java index 1f3cb708..d08f0d0f 100644 --- a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/nbt/NBTObjectImpl.java +++ b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/nbt/NBTObjectImpl.java @@ -17,56 +17,56 @@ public class NBTObjectImpl implements NBTObject { @Override public String asString() { - return compound.getString(tag); + return this.compound.getString(this.tag); } @Override public boolean asBoolean() { - return compound.getBoolean(tag); + return this.compound.getBoolean(this.tag); } @Override public int asInt() { - return compound.getInt(tag); + return this.compound.getInt(this.tag); } @Override public double asDouble() { - return compound.getDouble(tag); + return this.compound.getDouble(this.tag); } @Override public long asLong() { - return compound.getLong(tag); + return this.compound.getLong(this.tag); } @Override public short asShort() { - return compound.getShort(tag); + return this.compound.getShort(this.tag); } @Override public byte asByte() { - return compound.getByte(tag); + return this.compound.getByte(this.tag); } @Override public int[] asIntArray() { - return compound.getIntArray(tag); + return this.compound.getIntArray(this.tag); } @Override public byte[] asByteArray() { - return compound.getByteArray(tag); + return this.compound.getByteArray(this.tag); } @Override public NBTCompound asCompound() { - return new NBTCompoundImpl(compound.getCompound(tag)); + return new NBTCompoundImpl(this.compound.getCompound(this.tag)); } @Override public Set getKeys() { - return compound.getAllKeys(); + return this.compound.getAllKeys(); } } diff --git a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/SItemStackImpl.java b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/SItemStackImpl.java index 5aafa871..c6b56dc7 100644 --- a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/SItemStackImpl.java +++ b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/SItemStackImpl.java @@ -33,7 +33,7 @@ public class SItemStackImpl implements SItemStack { vec3d1 = vec3d1.yRot(-entityPlayer.getYRot() * 0.017453292F); vec3d1 = vec3d1.add(entityPlayer.getX(), entityPlayer.getEyeY(), entityPlayer.getZ()); - entityPlayer.level.addParticle(new ItemParticleOption(ParticleTypes.ITEM, CraftItemStack.asNMSCopy(item)), vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y + 0.05D, vec3d.z); + entityPlayer.level.addParticle(new ItemParticleOption(ParticleTypes.ITEM, CraftItemStack.asNMSCopy(this.item)), vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y + 0.05D, vec3d.z); } } } diff --git a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/SSpawnerImpl.java b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/SSpawnerImpl.java index 7dd731fa..b4722d8e 100644 --- a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/SSpawnerImpl.java +++ b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/SSpawnerImpl.java @@ -46,13 +46,13 @@ public class SSpawnerImpl implements SSpawner { short spawnRange = 4; for (int i = 0; i < 50; i++) { - assert spawnerLocation.getWorld() != null; - ServerLevel world = ((CraftWorld) spawnerLocation.getWorld()).getHandle(); + assert this.spawnerLocation.getWorld() != null; + ServerLevel world = ((CraftWorld) this.spawnerLocation.getWorld()).getHandle(); RandomSource random = world.getRandom(); - double x = spawnerLocation.getX() + (random.nextDouble() - random.nextDouble()) * (double) spawnRange + 0.5D; - double y = spawnerLocation.getY() + random.nextInt(3) - 1; - double z = spawnerLocation.getZ() + (random.nextDouble() - random.nextDouble()) * (double) spawnRange + 0.5D; + double x = this.spawnerLocation.getX() + (random.nextDouble() - random.nextDouble()) * (double) spawnRange + 0.5D; + double y = this.spawnerLocation.getY() + random.nextInt(3) - 1; + double z = this.spawnerLocation.getZ() + (random.nextDouble() - random.nextDouble()) * (double) spawnRange + 0.5D; Optional optionalEntity = net.minecraft.world.entity.EntityType.create(compound, world); if (optionalEntity.isEmpty()) continue; @@ -67,7 +67,7 @@ public class SSpawnerImpl implements SSpawner { continue; } - Location spot = new Location(spawnerLocation.getWorld(), x, y, z); + Location spot = new Location(this.spawnerLocation.getWorld(), x, y, z); if (!canSpawn(world, entityInsentient, spot, canSpawnOn)) { continue; @@ -122,7 +122,7 @@ public class SSpawnerImpl implements SSpawner { for (CompatibleMaterial material : canSpawnOn) { if (material == null) continue; - if (spawnedOn.equals(material) || material.isAir()) { + if (spawnedOn == material || material.isAir()) { return true; } } diff --git a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/SWorldImpl.java b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/SWorldImpl.java index 4b1a54f8..fa941282 100644 --- a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/SWorldImpl.java +++ b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/SWorldImpl.java @@ -1,11 +1,16 @@ package com.songoda.core.nms.v1_19_R3.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.entity.LevelEntityGetter; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.craftbukkit.v1_19_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; @@ -22,7 +27,7 @@ public class SWorldImpl implements SWorld { public List getLivingEntities() { List result = new ArrayList<>(); - ServerLevel worldServer = ((CraftWorld) world).getHandle(); + ServerLevel worldServer = ((CraftWorld) this.world).getHandle(); LevelEntityGetter entities = worldServer.getEntities(); entities.getAll().forEach((mcEnt) -> { @@ -35,4 +40,13 @@ public class SWorldImpl implements SWorld { return result; } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + ServerLevel serverLevel = ((CraftWorld) this.world).getHandle(); + LevelChunk levelChunk = serverLevel.getChunk(x >> 4, z >> 4); + BlockState blockState = ((CraftBlockData) material.createBlockData()).getState(); + + levelChunk.setBlockState(new BlockPos(x & 0xF, y, z & 0xF), blockState, true); + } } diff --git a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/WorldCoreImpl.java b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/WorldCoreImpl.java index 1a3b56ca..5faf0d79 100644 --- a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/WorldCoreImpl.java @@ -24,6 +24,7 @@ import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_19_R3.CraftChunk; import org.bukkit.craftbukkit.v1_19_R3.block.CraftBlock; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -60,46 +61,45 @@ public class WorldCoreImpl implements WorldCore { public void randomTickChunk(org.bukkit.Chunk bukkitChunk, int tickAmount) { LevelChunk chunk = (LevelChunk) ((CraftChunk) bukkitChunk).getHandle(ChunkStatus.FULL); ServerLevel world = chunk.q; - ProfilerFiller gameProfilerFiller = world.getProfiler(); + ProfilerFiller gameprofilerfiller = world.getProfiler(); ChunkPos chunkCoordIntPair = chunk.getPos(); int j = chunkCoordIntPair.getMinBlockX(); int k = chunkCoordIntPair.getMinBlockZ(); - gameProfilerFiller.popPush("tickBlocks"); + gameprofilerfiller.push("tickBlocks"); if (tickAmount > 0) { LevelChunkSection[] aChunkSection = chunk.getSections(); - for (LevelChunkSection chunkSection : aChunkSection) { if (chunkSection.isRandomlyTicking()) { - int j1 = chunkSection.bottomBlockY(); + int l1 = chunkSection.bottomBlockY(); - for (int k1 = 0; k1 < tickAmount; ++k1) { - BlockPos blockposition2 = world.getBlockRandomPos(j, j1, k, 15); - gameProfilerFiller.push("randomTick"); - BlockState iBlockData1 = chunkSection.getBlockState(blockposition2.getX() - j, blockposition2.getY() - j1, blockposition2.getZ() - k); - if (iBlockData1.isRandomlyTicking()) { - iBlockData1.randomTick(world, blockposition2, world.random); + for (int l = 0; l < tickAmount; ++l) { + BlockPos blockposition2 = world.getBlockRandomPos(j, l1, k, 15); + gameprofilerfiller.push("randomTick"); + BlockState iBlockData3 = chunkSection.getBlockState(blockposition2.getX() - j, blockposition2.getY() - l1, blockposition2.getZ() - k); + if (iBlockData3.isRandomlyTicking()) { + iBlockData3.randomTick(world, blockposition2, world.random); } - FluidState fluid = iBlockData1.getFluidState(); + FluidState fluid = iBlockData3.getFluidState(); if (fluid.isRandomlyTicking()) { fluid.randomTick(world, blockposition2, world.random); } - gameProfilerFiller.pop(); + gameprofilerfiller.pop(); } } } } + gameprofilerfiller.pop(); } @Override - public void updateAdjacentComparators(Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); - LevelChunk nmsChunk = (LevelChunk) craftChunk.getHandle(ChunkStatus.FULL); + ServerLevel serverLevel = craftBlock.getCraftWorld().getHandle(); - nmsChunk.q.updateNeighbourForOutputSignal(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); + serverLevel.updateNeighbourForOutputSignal(craftBlock.getPosition(), craftBlock.getNMS().getBlock()); } } diff --git a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/spawner/BBaseSpawnerImpl.java b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/spawner/BBaseSpawnerImpl.java index 570b2c4a..d2cccf60 100644 --- a/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/spawner/BBaseSpawnerImpl.java +++ b/NMS/NMS-v1_19_R3/src/main/java/com/songoda/core/nms/v1_19_R3/world/spawner/BBaseSpawnerImpl.java @@ -70,85 +70,85 @@ public class BBaseSpawnerImpl implements BBaseSpawner { */ @Override public void tick() throws InvocationTargetException, IllegalAccessException { - ServerLevel worldserver = getWorld(); + ServerLevel worldServer = getWorld(); BlockPos blockposition = getBlockPosition(); if (this.spawner.spawnDelay == -1) { - this.delay(worldserver, blockposition); + this.delay(worldServer, blockposition); } if (this.spawner.spawnDelay > 0) { --this.spawner.spawnDelay; } else { boolean flag = false; - RandomSource randomsource = worldserver.getRandom(); - SpawnData mobspawnerdata = (SpawnData) this.getOrCreateNextSpawnDataMethod.invoke(this.spawner, worldserver, randomsource, blockposition); + RandomSource randomsource = worldServer.getRandom(); + SpawnData mobSpawnerData = (SpawnData) this.getOrCreateNextSpawnDataMethod.invoke(this.spawner, worldServer, randomsource, blockposition); int i = 0; while (true) { if (i >= this.spawner.spawnCount) { if (flag) { - this.delay(worldserver, blockposition); + this.delay(worldServer, blockposition); } break; } - CompoundTag nbttagcompound = mobspawnerdata.getEntityToSpawn(); - Optional> optional = EntityType.by(nbttagcompound); + CompoundTag nbtTagCompound = mobSpawnerData.getEntityToSpawn(); + Optional> optional = EntityType.by(nbtTagCompound); if (optional.isEmpty()) { - this.delay(worldserver, blockposition); + this.delay(worldServer, blockposition); return; } - ListTag nbttaglist = nbttagcompound.getList("Pos", 6); - int j = nbttaglist.size(); - double d0 = j >= 1 ? nbttaglist.getDouble(0) : (double) blockposition.getX() + (randomsource.nextDouble() - randomsource.nextDouble()) * (double) this.spawner.spawnRange + 0.5; - double d1 = j >= 2 ? nbttaglist.getDouble(1) : (double) (blockposition.getY() + randomsource.nextInt(3) - 1); - double d2 = j >= 3 ? nbttaglist.getDouble(2) : (double) blockposition.getZ() + (randomsource.nextDouble() - randomsource.nextDouble()) * (double) this.spawner.spawnRange + 0.5; - if (worldserver.noCollision(optional.get().getAABB(d0, d1, d2))) { + ListTag nbtTagList = nbtTagCompound.getList("Pos", 6); + int j = nbtTagList.size(); + double d0 = j >= 1 ? nbtTagList.getDouble(0) : (double) blockposition.getX() + (randomsource.nextDouble() - randomsource.nextDouble()) * (double) this.spawner.spawnRange + 0.5; + double d1 = j >= 2 ? nbtTagList.getDouble(1) : (double) (blockposition.getY() + randomsource.nextInt(3) - 1); + double d2 = j >= 3 ? nbtTagList.getDouble(2) : (double) blockposition.getZ() + (randomsource.nextDouble() - randomsource.nextDouble()) * (double) this.spawner.spawnRange + 0.5; + if (worldServer.noCollision(optional.get().getAABB(d0, d1, d2))) { label128: { BlockPos blockposition1 = BlockPos.containing(d0, d1, d2); - if (mobspawnerdata.getCustomSpawnRules().isPresent()) { - if (!optional.get().getCategory().isFriendly() && worldserver.getDifficulty() == Difficulty.PEACEFUL) { + if (mobSpawnerData.getCustomSpawnRules().isPresent()) { + if (!optional.get().getCategory().isFriendly() && worldServer.getDifficulty() == Difficulty.PEACEFUL) { break label128; } - SpawnData.CustomSpawnRules mobspawnerdata_a = mobspawnerdata.getCustomSpawnRules().get(); - if (!mobspawnerdata_a.blockLightLimit().isValueInRange(worldserver.getBrightness(LightLayer.BLOCK, blockposition1)) || !mobspawnerdata_a.skyLightLimit().isValueInRange(worldserver.getBrightness(LightLayer.SKY, blockposition1))) { + SpawnData.CustomSpawnRules mobSpawnerData_a = mobSpawnerData.getCustomSpawnRules().get(); + if (!mobSpawnerData_a.blockLightLimit().isValueInRange(worldServer.getBrightness(LightLayer.BLOCK, blockposition1)) || !mobSpawnerData_a.skyLightLimit().isValueInRange(worldServer.getBrightness(LightLayer.SKY, blockposition1))) { break label128; } - } else if (!SpawnPlacements.checkSpawnRules((EntityType) optional.get(), worldserver, MobSpawnType.SPAWNER, blockposition1, worldserver.getRandom())) { + } else if (!SpawnPlacements.checkSpawnRules((EntityType) optional.get(), worldServer, MobSpawnType.SPAWNER, blockposition1, worldServer.getRandom())) { break label128; } - Entity entity = EntityType.loadEntityRecursive(nbttagcompound, worldserver, (entity1) -> { + Entity entity = EntityType.loadEntityRecursive(nbtTagCompound, worldServer, (entity1) -> { entity1.moveTo(d0, d1, d2, entity1.getYRot(), entity1.getXRot()); return entity1; }); if (entity == null) { - this.delay(worldserver, blockposition); + this.delay(worldServer, blockposition); return; } - int k = worldserver.getEntitiesOfClass(entity.getClass(), (new AABB(blockposition.getX(), blockposition.getY(), blockposition.getZ(), blockposition.getX() + 1, blockposition.getY() + 1, blockposition.getZ() + 1)).inflate(this.spawner.spawnRange)).size(); + int k = worldServer.getEntitiesOfClass(entity.getClass(), (new AABB(blockposition.getX(), blockposition.getY(), blockposition.getZ(), blockposition.getX() + 1, blockposition.getY() + 1, blockposition.getZ() + 1)).inflate(this.spawner.spawnRange)).size(); if (k >= this.spawner.maxNearbyEntities) { - this.delay(worldserver, blockposition); + this.delay(worldServer, blockposition); return; } entity.moveTo(entity.getX(), entity.getY(), entity.getZ(), randomsource.nextFloat() * 360.0F, 0.0F); - if (entity instanceof Mob entityinsentient) { - if (mobspawnerdata.getCustomSpawnRules().isEmpty() && !entityinsentient.checkSpawnRules(worldserver, MobSpawnType.SPAWNER) || !entityinsentient.checkSpawnObstruction(worldserver)) { + if (entity instanceof Mob entityInsentient) { + if (mobSpawnerData.getCustomSpawnRules().isEmpty() && !entityInsentient.checkSpawnRules(worldServer, MobSpawnType.SPAWNER) || !entityInsentient.checkSpawnObstruction(worldServer)) { break label128; } - if (mobspawnerdata.getEntityToSpawn().size() == 1 && mobspawnerdata.getEntityToSpawn().contains("id", 8)) { - ((Mob) entity).finalizeSpawn(worldserver, worldserver.getCurrentDifficultyAt(entity.blockPosition()), MobSpawnType.SPAWNER, null, null); + if (mobSpawnerData.getEntityToSpawn().size() == 1 && mobSpawnerData.getEntityToSpawn().contains("id", 8)) { + ((Mob) entity).finalizeSpawn(worldServer, worldServer.getCurrentDifficultyAt(entity.blockPosition()), MobSpawnType.SPAWNER, null, null); } - if (entityinsentient.level.spigotConfig.nerfSpawnerMobs) { - entityinsentient.aware = false; + if (entityInsentient.level.spigotConfig.nerfSpawnerMobs) { + entityInsentient.aware = false; } } @@ -162,13 +162,13 @@ public class BBaseSpawnerImpl implements BBaseSpawner { passenger.discard(); } } else { - if (!worldserver.tryAddFreshEntityWithPassengers(entity, CreatureSpawnEvent.SpawnReason.SPAWNER)) { - this.delay(worldserver, blockposition); + if (!worldServer.tryAddFreshEntityWithPassengers(entity, CreatureSpawnEvent.SpawnReason.SPAWNER)) { + this.delay(worldServer, blockposition); return; } - worldserver.levelEvent(2004, blockposition, 0); - worldserver.gameEvent(entity, GameEvent.ENTITY_PLACE, blockposition1); + worldServer.levelEvent(2004, blockposition, 0); + worldServer.gameEvent(entity, GameEvent.ENTITY_PLACE, blockposition1); if (entity instanceof Mob) { ((Mob) entity).spawnAnim(); } diff --git a/NMS/NMS-v1_8_R1/pom.xml b/NMS/NMS-v1_8_R1/pom.xml index d175279d..de4fe019 100644 --- a/NMS/NMS-v1_8_R1/pom.xml +++ b/NMS/NMS-v1_8_R1/pom.xml @@ -10,9 +10,7 @@ 2.6.21 ../../pom.xml - SongodaCore-NMS-v1_8_R1 - jar @@ -26,12 +24,14 @@ ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_8_R1/src/main/java/com/songoda/core/nms/v1_8_R1/NmsImplementationsImpl.java b/NMS/NMS-v1_8_R1/src/main/java/com/songoda/core/nms/v1_8_R1/NmsImplementationsImpl.java new file mode 100644 index 00000000..a3c4f19b --- /dev/null +++ b/NMS/NMS-v1_8_R1/src/main/java/com/songoda/core/nms/v1_8_R1/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_8_R1; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_8_R1.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_8_R1.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_8_R1.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_8_R1.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_8_R1.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_8_R1/src/main/java/com/songoda/core/nms/v1_8_R1/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_8_R1/src/main/java/com/songoda/core/nms/v1_8_R1/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..4fd2b90a --- /dev/null +++ b/NMS/NMS-v1_8_R1/src/main/java/com/songoda/core/nms/v1_8_R1/world/NmsWorldBorderImpl.java @@ -0,0 +1,33 @@ +package com.songoda.core.nms.v1_8_R1.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.server.v1_8_R1.EnumWorldBorderAction; +import net.minecraft.server.v1_8_R1.PacketPlayOutWorldBorder; +import net.minecraft.server.v1_8_R1.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.c(center.getX(), center.getZ()); + worldBorder.a(size); + worldBorder.b(0); // WarningTime + worldBorder.c(0); // WarningBlocks + + if (color == BorderColor.GREEN) { + worldBorder.a(size - 0.1D, size, Long.MAX_VALUE); // transitionSizeBetween + } else if (color == BorderColor.RED) { + worldBorder.a(size, size - 1.0D, Long.MAX_VALUE); // transitionSizeBetween + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldBorder, EnumWorldBorderAction.INITIALIZE)); + } +} diff --git a/NMS/NMS-v1_8_R1/src/main/java/com/songoda/core/nms/v1_8_R1/world/SWorldImpl.java b/NMS/NMS-v1_8_R1/src/main/java/com/songoda/core/nms/v1_8_R1/world/SWorldImpl.java index 2518d072..99cf9790 100644 --- a/NMS/NMS-v1_8_R1/src/main/java/com/songoda/core/nms/v1_8_R1/world/SWorldImpl.java +++ b/NMS/NMS-v1_8_R1/src/main/java/com/songoda/core/nms/v1_8_R1/world/SWorldImpl.java @@ -1,17 +1,35 @@ package com.songoda.core.nms.v1_8_R1.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.server.v1_8_R1.Block; +import net.minecraft.server.v1_8_R1.BlockPosition; +import net.minecraft.server.v1_8_R1.Chunk; +import net.minecraft.server.v1_8_R1.WorldServer; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_8_R1.CraftWorld; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; import java.util.List; public class SWorldImpl implements SWorld { - public SWorldImpl() { + private final World world; + + public SWorldImpl(World world) { + this.world = world; } @Override public List getLivingEntities() { - return new ArrayList<>(); + return new ArrayList<>(); // FIXME + } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + WorldServer serverLevel = ((CraftWorld) this.world).getHandle(); + Chunk levelChunk = serverLevel.getChunkIfLoaded(x >> 4, z >> 4); + + levelChunk.a(new BlockPosition(x & 0xF, y, z & 0xF), Block.getByCombinedId(0)); } } diff --git a/NMS/NMS-v1_8_R1/src/main/java/com/songoda/core/nms/v1_8_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_8_R1/src/main/java/com/songoda/core/nms/v1_8_R1/world/WorldCoreImpl.java index abd021ad..596e787b 100644 --- a/NMS/NMS-v1_8_R1/src/main/java/com/songoda/core/nms/v1_8_R1/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_8_R1/src/main/java/com/songoda/core/nms/v1_8_R1/world/WorldCoreImpl.java @@ -18,9 +18,11 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_8_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_8_R1.CraftWorld; import org.bukkit.craftbukkit.v1_8_R1.block.CraftBlock; import org.bukkit.craftbukkit.v1_8_R1.util.CraftMagicNumbers; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -40,7 +42,7 @@ public class WorldCoreImpl implements WorldCore { @Override public SWorld getWorld(World world) { - return new SWorldImpl(); + return new SWorldImpl(world); } @Override @@ -91,12 +93,12 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(org.bukkit.block.Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull org.bukkit.block.Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); - net.minecraft.server.v1_8_R1.World nmsWorld = craftChunk.getHandle().getWorld(); + WorldServer serverLevel = ((CraftWorld) craftBlock.getWorld()).getHandle(); - BlockPosition blockPosition = new BlockPosition(craftBlock.getX(), craftBlock.getY(), craftBlock.getZ()); - nmsWorld.updateAdjacentComparators(blockPosition, CraftMagicNumbers.getBlock(craftBlock)); + BlockPosition blockPos = new BlockPosition(craftBlock.getX(), craftBlock.getY(), craftBlock.getZ()); + Block nmsBlock = CraftMagicNumbers.getBlock(bukkitBlock.getType()); + serverLevel.updateAdjacentComparators(blockPos, nmsBlock); } } diff --git a/NMS/NMS-v1_8_R2/pom.xml b/NMS/NMS-v1_8_R2/pom.xml index 7705dfe3..7446e1bd 100644 --- a/NMS/NMS-v1_8_R2/pom.xml +++ b/NMS/NMS-v1_8_R2/pom.xml @@ -10,9 +10,7 @@ 2.6.21 ../../pom.xml - SongodaCore-NMS-v1_8_R2 - jar @@ -26,12 +24,14 @@ ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_8_R2/src/main/java/com/songoda/core/nms/v1_8_R2/NmsImplementationsImpl.java b/NMS/NMS-v1_8_R2/src/main/java/com/songoda/core/nms/v1_8_R2/NmsImplementationsImpl.java new file mode 100644 index 00000000..061f20ab --- /dev/null +++ b/NMS/NMS-v1_8_R2/src/main/java/com/songoda/core/nms/v1_8_R2/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_8_R2; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_8_R2.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_8_R2.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_8_R2.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_8_R2.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_8_R2.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_8_R2/src/main/java/com/songoda/core/nms/v1_8_R2/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_8_R2/src/main/java/com/songoda/core/nms/v1_8_R2/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..dc2b0275 --- /dev/null +++ b/NMS/NMS-v1_8_R2/src/main/java/com/songoda/core/nms/v1_8_R2/world/NmsWorldBorderImpl.java @@ -0,0 +1,32 @@ +package com.songoda.core.nms.v1_8_R2.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.server.v1_8_R2.PacketPlayOutWorldBorder; +import net.minecraft.server.v1_8_R2.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningDistance(0); + + if (color == BorderColor.GREEN) { + worldBorder.transitionSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.transitionSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldBorder, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } +} diff --git a/NMS/NMS-v1_8_R2/src/main/java/com/songoda/core/nms/v1_8_R2/world/SWorldImpl.java b/NMS/NMS-v1_8_R2/src/main/java/com/songoda/core/nms/v1_8_R2/world/SWorldImpl.java index fa2fc439..f516bfef 100644 --- a/NMS/NMS-v1_8_R2/src/main/java/com/songoda/core/nms/v1_8_R2/world/SWorldImpl.java +++ b/NMS/NMS-v1_8_R2/src/main/java/com/songoda/core/nms/v1_8_R2/world/SWorldImpl.java @@ -1,17 +1,35 @@ package com.songoda.core.nms.v1_8_R2.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.server.v1_8_R2.Block; +import net.minecraft.server.v1_8_R2.BlockPosition; +import net.minecraft.server.v1_8_R2.Chunk; +import net.minecraft.server.v1_8_R2.WorldServer; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_8_R2.CraftWorld; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; import java.util.List; public class SWorldImpl implements SWorld { - public SWorldImpl() { + private final World world; + + public SWorldImpl(World world) { + this.world = world; } @Override public List getLivingEntities() { - return new ArrayList<>(); + return new ArrayList<>(); // FIXME + } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + WorldServer serverLevel = ((CraftWorld) this.world).getHandle(); + Chunk levelChunk = serverLevel.getChunkIfLoaded(x >> 4, z >> 4); + + levelChunk.a(new BlockPosition(x & 0xF, y, z & 0xF), Block.getByCombinedId(0)); } } diff --git a/NMS/NMS-v1_8_R2/src/main/java/com/songoda/core/nms/v1_8_R2/world/WorldCoreImpl.java b/NMS/NMS-v1_8_R2/src/main/java/com/songoda/core/nms/v1_8_R2/world/WorldCoreImpl.java index 158e7a2a..910e1c86 100644 --- a/NMS/NMS-v1_8_R2/src/main/java/com/songoda/core/nms/v1_8_R2/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_8_R2/src/main/java/com/songoda/core/nms/v1_8_R2/world/WorldCoreImpl.java @@ -18,9 +18,11 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_8_R2.CraftChunk; +import org.bukkit.craftbukkit.v1_8_R2.CraftWorld; import org.bukkit.craftbukkit.v1_8_R2.block.CraftBlock; import org.bukkit.craftbukkit.v1_8_R2.util.CraftMagicNumbers; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -40,7 +42,7 @@ public class WorldCoreImpl implements WorldCore { @Override public SWorld getWorld(World world) { - return new SWorldImpl(); + return new SWorldImpl(world); } @Override @@ -91,12 +93,12 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(org.bukkit.block.Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull org.bukkit.block.Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); - net.minecraft.server.v1_8_R2.World nmsWorld = craftChunk.getHandle().getWorld(); + WorldServer serverLevel = ((CraftWorld) craftBlock.getWorld()).getHandle(); - BlockPosition blockPosition = new BlockPosition(craftBlock.getX(), craftBlock.getY(), craftBlock.getZ()); - nmsWorld.updateAdjacentComparators(blockPosition, CraftMagicNumbers.getBlock(craftBlock)); + BlockPosition blockPos = new BlockPosition(craftBlock.getX(), craftBlock.getY(), craftBlock.getZ()); + Block nmsBlock = CraftMagicNumbers.getBlock(bukkitBlock.getType()); + serverLevel.updateAdjacentComparators(blockPos, nmsBlock); } } diff --git a/NMS/NMS-v1_8_R3/pom.xml b/NMS/NMS-v1_8_R3/pom.xml index 5e034f78..8dedbf83 100644 --- a/NMS/NMS-v1_8_R3/pom.xml +++ b/NMS/NMS-v1_8_R3/pom.xml @@ -10,9 +10,7 @@ 2.6.21 ../../pom.xml - SongodaCore-NMS-v1_8_R3 - jar @@ -26,12 +24,14 @@ ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_8_R3/src/main/java/com/songoda/core/nms/v1_8_R3/NmsImplementationsImpl.java b/NMS/NMS-v1_8_R3/src/main/java/com/songoda/core/nms/v1_8_R3/NmsImplementationsImpl.java new file mode 100644 index 00000000..853430e0 --- /dev/null +++ b/NMS/NMS-v1_8_R3/src/main/java/com/songoda/core/nms/v1_8_R3/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_8_R3; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_8_R3.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_8_R3.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_8_R3.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_8_R3.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_8_R3.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_8_R3/src/main/java/com/songoda/core/nms/v1_8_R3/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_8_R3/src/main/java/com/songoda/core/nms/v1_8_R3/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..5d1e90b2 --- /dev/null +++ b/NMS/NMS-v1_8_R3/src/main/java/com/songoda/core/nms/v1_8_R3/world/NmsWorldBorderImpl.java @@ -0,0 +1,32 @@ +package com.songoda.core.nms.v1_8_R3.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.server.v1_8_R3.PacketPlayOutWorldBorder; +import net.minecraft.server.v1_8_R3.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningDistance(0); + + if (color == BorderColor.GREEN) { + worldBorder.transitionSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.transitionSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldBorder, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } +} diff --git a/NMS/NMS-v1_8_R3/src/main/java/com/songoda/core/nms/v1_8_R3/world/SWorldImpl.java b/NMS/NMS-v1_8_R3/src/main/java/com/songoda/core/nms/v1_8_R3/world/SWorldImpl.java index f8430d5c..189fb6b5 100644 --- a/NMS/NMS-v1_8_R3/src/main/java/com/songoda/core/nms/v1_8_R3/world/SWorldImpl.java +++ b/NMS/NMS-v1_8_R3/src/main/java/com/songoda/core/nms/v1_8_R3/world/SWorldImpl.java @@ -1,17 +1,35 @@ package com.songoda.core.nms.v1_8_R3.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.server.v1_8_R3.Block; +import net.minecraft.server.v1_8_R3.BlockPosition; +import net.minecraft.server.v1_8_R3.Chunk; +import net.minecraft.server.v1_8_R3.WorldServer; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; import java.util.List; public class SWorldImpl implements SWorld { - public SWorldImpl() { + private final World world; + + public SWorldImpl(World world) { + this.world = world; } @Override public List getLivingEntities() { - return new ArrayList<>(); + return new ArrayList<>(); // FIXME + } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + WorldServer serverLevel = ((CraftWorld) this.world).getHandle(); + Chunk levelChunk = serverLevel.getChunkIfLoaded(x >> 4, z >> 4); + + levelChunk.a(new BlockPosition(x & 0xF, y, z & 0xF), Block.getByCombinedId(0)); } } diff --git a/NMS/NMS-v1_8_R3/src/main/java/com/songoda/core/nms/v1_8_R3/world/WorldCoreImpl.java b/NMS/NMS-v1_8_R3/src/main/java/com/songoda/core/nms/v1_8_R3/world/WorldCoreImpl.java index bba6b4f7..5b5fb3f9 100644 --- a/NMS/NMS-v1_8_R3/src/main/java/com/songoda/core/nms/v1_8_R3/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_8_R3/src/main/java/com/songoda/core/nms/v1_8_R3/world/WorldCoreImpl.java @@ -18,9 +18,11 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_8_R3.CraftChunk; +import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; import org.bukkit.craftbukkit.v1_8_R3.block.CraftBlock; import org.bukkit.craftbukkit.v1_8_R3.util.CraftMagicNumbers; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -40,7 +42,7 @@ public class WorldCoreImpl implements WorldCore { @Override public SWorld getWorld(World world) { - return new SWorldImpl(); + return new SWorldImpl(world); } @Override @@ -90,12 +92,12 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(org.bukkit.block.Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull org.bukkit.block.Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); - net.minecraft.server.v1_8_R3.World nmsWorld = craftChunk.getHandle().getWorld(); + WorldServer serverLevel = ((CraftWorld) craftBlock.getWorld()).getHandle(); - BlockPosition blockPosition = new BlockPosition(craftBlock.getX(), craftBlock.getY(), craftBlock.getZ()); - nmsWorld.updateAdjacentComparators(blockPosition, CraftMagicNumbers.getBlock(craftBlock)); + BlockPosition blockPos = new BlockPosition(craftBlock.getX(), craftBlock.getY(), craftBlock.getZ()); + Block nmsBlock = CraftMagicNumbers.getBlock(bukkitBlock.getType()); + serverLevel.updateAdjacentComparators(blockPos, nmsBlock); } } diff --git a/NMS/NMS-v1_9_R1/pom.xml b/NMS/NMS-v1_9_R1/pom.xml index fe3acd62..c30cda24 100644 --- a/NMS/NMS-v1_9_R1/pom.xml +++ b/NMS/NMS-v1_9_R1/pom.xml @@ -10,9 +10,7 @@ 2.6.21 ../../pom.xml - SongodaCore-NMS-v1_9_R1 - jar @@ -26,12 +24,14 @@ ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_9_R1/src/main/java/com/songoda/core/nms/v1_9_R1/NmsImplementationsImpl.java b/NMS/NMS-v1_9_R1/src/main/java/com/songoda/core/nms/v1_9_R1/NmsImplementationsImpl.java new file mode 100644 index 00000000..4b66b424 --- /dev/null +++ b/NMS/NMS-v1_9_R1/src/main/java/com/songoda/core/nms/v1_9_R1/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_9_R1; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_9_R1.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_9_R1.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_9_R1.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_9_R1.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_9_R1.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_9_R1/src/main/java/com/songoda/core/nms/v1_9_R1/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_9_R1/src/main/java/com/songoda/core/nms/v1_9_R1/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..32a18101 --- /dev/null +++ b/NMS/NMS-v1_9_R1/src/main/java/com/songoda/core/nms/v1_9_R1/world/NmsWorldBorderImpl.java @@ -0,0 +1,35 @@ +package com.songoda.core.nms.v1_9_R1.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.server.v1_9_R1.PacketPlayOutWorldBorder; +import net.minecraft.server.v1_9_R1.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_9_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.world = ((CraftWorld) center.getWorld()).getHandle(); + + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningDistance(0); + + if (color == BorderColor.GREEN) { + worldBorder.transitionSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.transitionSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldBorder, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } +} diff --git a/NMS/NMS-v1_9_R1/src/main/java/com/songoda/core/nms/v1_9_R1/world/SWorldImpl.java b/NMS/NMS-v1_9_R1/src/main/java/com/songoda/core/nms/v1_9_R1/world/SWorldImpl.java index fdfe63fa..49d6b8b0 100644 --- a/NMS/NMS-v1_9_R1/src/main/java/com/songoda/core/nms/v1_9_R1/world/SWorldImpl.java +++ b/NMS/NMS-v1_9_R1/src/main/java/com/songoda/core/nms/v1_9_R1/world/SWorldImpl.java @@ -1,17 +1,35 @@ package com.songoda.core.nms.v1_9_R1.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.server.v1_9_R1.Block; +import net.minecraft.server.v1_9_R1.BlockPosition; +import net.minecraft.server.v1_9_R1.Chunk; +import net.minecraft.server.v1_9_R1.WorldServer; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_9_R1.CraftWorld; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; import java.util.List; public class SWorldImpl implements SWorld { - public SWorldImpl() { + private final World world; + + public SWorldImpl(World world) { + this.world = world; } @Override public List getLivingEntities() { - return new ArrayList<>(); + return new ArrayList<>(); // FIXME + } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + WorldServer serverLevel = ((CraftWorld) this.world).getHandle(); + Chunk levelChunk = serverLevel.getChunkIfLoaded(x >> 4, z >> 4); + + levelChunk.a(new BlockPosition(x & 0xF, y, z & 0xF), Block.getByCombinedId(0)); } } diff --git a/NMS/NMS-v1_9_R1/src/main/java/com/songoda/core/nms/v1_9_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_9_R1/src/main/java/com/songoda/core/nms/v1_9_R1/world/WorldCoreImpl.java index 1cf86d79..829c8604 100644 --- a/NMS/NMS-v1_9_R1/src/main/java/com/songoda/core/nms/v1_9_R1/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_9_R1/src/main/java/com/songoda/core/nms/v1_9_R1/world/WorldCoreImpl.java @@ -18,9 +18,11 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_9_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_9_R1.CraftWorld; import org.bukkit.craftbukkit.v1_9_R1.block.CraftBlock; import org.bukkit.craftbukkit.v1_9_R1.util.CraftMagicNumbers; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -40,7 +42,7 @@ public class WorldCoreImpl implements WorldCore { @Override public SWorld getWorld(World world) { - return new SWorldImpl(); + return new SWorldImpl(world); } @Override @@ -90,12 +92,12 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(org.bukkit.block.Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull org.bukkit.block.Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); - net.minecraft.server.v1_9_R1.World nmsWorld = craftChunk.getHandle().getWorld(); + WorldServer serverLevel = ((CraftWorld) craftBlock.getWorld()).getHandle(); - BlockPosition blockPosition = new BlockPosition(craftBlock.getX(), craftBlock.getY(), craftBlock.getZ()); - nmsWorld.updateAdjacentComparators(blockPosition, CraftMagicNumbers.getBlock(craftBlock)); + BlockPosition blockPos = new BlockPosition(craftBlock.getX(), craftBlock.getY(), craftBlock.getZ()); + Block nmsBlock = CraftMagicNumbers.getBlock(bukkitBlock.getType()); + serverLevel.updateAdjacentComparators(blockPos, nmsBlock); } } diff --git a/NMS/NMS-v1_9_R2/pom.xml b/NMS/NMS-v1_9_R2/pom.xml index 25899bc2..ff9c1f72 100644 --- a/NMS/NMS-v1_9_R2/pom.xml +++ b/NMS/NMS-v1_9_R2/pom.xml @@ -10,9 +10,7 @@ 2.6.21 ../../pom.xml - SongodaCore-NMS-v1_9_R2 - jar @@ -26,12 +24,14 @@ ${project.groupId} SongodaCore-NMS-API ${project.version} + provided ${project.groupId} SongodaCore-Compatibility ${project.version} + provided diff --git a/NMS/NMS-v1_9_R2/src/main/java/com/songoda/core/nms/v1_9_R2/NmsImplementationsImpl.java b/NMS/NMS-v1_9_R2/src/main/java/com/songoda/core/nms/v1_9_R2/NmsImplementationsImpl.java new file mode 100644 index 00000000..ee0b1bc0 --- /dev/null +++ b/NMS/NMS-v1_9_R2/src/main/java/com/songoda/core/nms/v1_9_R2/NmsImplementationsImpl.java @@ -0,0 +1,55 @@ +package com.songoda.core.nms.v1_9_R2; + +import com.songoda.core.nms.NmsImplementations; +import com.songoda.core.nms.anvil.AnvilCore; +import com.songoda.core.nms.entity.NMSPlayer; +import com.songoda.core.nms.nbt.NBTCore; +import com.songoda.core.nms.v1_9_R2.entity.NMSPlayerImpl; +import com.songoda.core.nms.v1_9_R2.nbt.NBTCoreImpl; +import com.songoda.core.nms.v1_9_R2.world.NmsWorldBorderImpl; +import com.songoda.core.nms.v1_9_R2.world.WorldCoreImpl; +import com.songoda.core.nms.world.NmsWorldBorder; +import com.songoda.core.nms.world.WorldCore; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class NmsImplementationsImpl implements NmsImplementations { + private final NMSPlayer player; + private final WorldCore world; + private final NmsWorldBorder worldBorder; + private final AnvilCore anvil; + private final NBTCore nbt; + + public NmsImplementationsImpl() { + this.player = new NMSPlayerImpl(); + this.world = new WorldCoreImpl(); + this.worldBorder = new NmsWorldBorderImpl(); + this.anvil = new com.songoda.core.nms.v1_9_R2.anvil.AnvilCore(); + this.nbt = new NBTCoreImpl(); + } + + @Override + public @NotNull NMSPlayer getPlayer() { + return this.player; + } + + @Override + public @NotNull WorldCore getWorld() { + return this.world; + } + + @Override + public @NotNull NmsWorldBorder getWorldBorder() { + return this.worldBorder; + } + + @Override + public @NotNull AnvilCore getAnvil() { + return this.anvil; + } + + @Override + public @NotNull NBTCore getNbt() { + return this.nbt; + } +} diff --git a/NMS/NMS-v1_9_R2/src/main/java/com/songoda/core/nms/v1_9_R2/world/NmsWorldBorderImpl.java b/NMS/NMS-v1_9_R2/src/main/java/com/songoda/core/nms/v1_9_R2/world/NmsWorldBorderImpl.java new file mode 100644 index 00000000..0f4881db --- /dev/null +++ b/NMS/NMS-v1_9_R2/src/main/java/com/songoda/core/nms/v1_9_R2/world/NmsWorldBorderImpl.java @@ -0,0 +1,35 @@ +package com.songoda.core.nms.v1_9_R2.world; + +import com.songoda.core.nms.world.NmsWorldBorder; +import net.minecraft.server.v1_9_R2.PacketPlayOutWorldBorder; +import net.minecraft.server.v1_9_R2.WorldBorder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_9_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class NmsWorldBorderImpl implements NmsWorldBorder { + @Override + public void send(Player player, BorderColor color, double size, @NotNull Location center) { + Objects.requireNonNull(center.getWorld()); + + WorldBorder worldBorder = new WorldBorder(); + worldBorder.world = ((CraftWorld) center.getWorld()).getHandle(); + + worldBorder.setCenter(center.getX(), center.getZ()); + worldBorder.setSize(size); + worldBorder.setWarningTime(0); + worldBorder.setWarningDistance(0); + + if (color == BorderColor.GREEN) { + worldBorder.transitionSizeBetween(size - 0.1D, size, Long.MAX_VALUE); + } else if (color == BorderColor.RED) { + worldBorder.transitionSizeBetween(size, size - 1.0D, Long.MAX_VALUE); + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldBorder, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); + } +} diff --git a/NMS/NMS-v1_9_R2/src/main/java/com/songoda/core/nms/v1_9_R2/world/SWorldImpl.java b/NMS/NMS-v1_9_R2/src/main/java/com/songoda/core/nms/v1_9_R2/world/SWorldImpl.java index 4e118871..deebc639 100644 --- a/NMS/NMS-v1_9_R2/src/main/java/com/songoda/core/nms/v1_9_R2/world/SWorldImpl.java +++ b/NMS/NMS-v1_9_R2/src/main/java/com/songoda/core/nms/v1_9_R2/world/SWorldImpl.java @@ -1,17 +1,35 @@ package com.songoda.core.nms.v1_9_R2.world; import com.songoda.core.nms.world.SWorld; +import net.minecraft.server.v1_9_R2.Block; +import net.minecraft.server.v1_9_R2.BlockPosition; +import net.minecraft.server.v1_9_R2.Chunk; +import net.minecraft.server.v1_9_R2.WorldServer; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_9_R2.CraftWorld; import org.bukkit.entity.LivingEntity; import java.util.ArrayList; import java.util.List; public class SWorldImpl implements SWorld { - public SWorldImpl() { + private final World world; + + public SWorldImpl(World world) { + this.world = world; } @Override public List getLivingEntities() { - return new ArrayList<>(); + return new ArrayList<>(); // FIXME + } + + @Override + public void setBlockFast(int x, int y, int z, Material material) { + WorldServer serverLevel = ((CraftWorld) this.world).getHandle(); + Chunk levelChunk = serverLevel.getChunkIfLoaded(x >> 4, z >> 4); + + levelChunk.a(new BlockPosition(x & 0xF, y, z & 0xF), Block.getByCombinedId(0)); } } diff --git a/NMS/NMS-v1_9_R2/src/main/java/com/songoda/core/nms/v1_9_R2/world/WorldCoreImpl.java b/NMS/NMS-v1_9_R2/src/main/java/com/songoda/core/nms/v1_9_R2/world/WorldCoreImpl.java index 41091719..6225f231 100644 --- a/NMS/NMS-v1_9_R2/src/main/java/com/songoda/core/nms/v1_9_R2/world/WorldCoreImpl.java +++ b/NMS/NMS-v1_9_R2/src/main/java/com/songoda/core/nms/v1_9_R2/world/WorldCoreImpl.java @@ -18,9 +18,11 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.CreatureSpawner; import org.bukkit.craftbukkit.v1_9_R2.CraftChunk; +import org.bukkit.craftbukkit.v1_9_R2.CraftWorld; import org.bukkit.craftbukkit.v1_9_R2.block.CraftBlock; import org.bukkit.craftbukkit.v1_9_R2.util.CraftMagicNumbers; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class WorldCoreImpl implements WorldCore { @Override @@ -40,7 +42,7 @@ public class WorldCoreImpl implements WorldCore { @Override public SWorld getWorld(World world) { - return new SWorldImpl(); + return new SWorldImpl(world); } @Override @@ -89,12 +91,12 @@ public class WorldCoreImpl implements WorldCore { } @Override - public void updateAdjacentComparators(org.bukkit.block.Block bukkitBlock) { + public void updateAdjacentComparators(@NotNull org.bukkit.block.Block bukkitBlock) { CraftBlock craftBlock = (CraftBlock) bukkitBlock; - CraftChunk craftChunk = (CraftChunk) bukkitBlock.getChunk(); - net.minecraft.server.v1_9_R2.World nmsWorld = craftChunk.getHandle().getWorld(); + WorldServer serverLevel = ((CraftWorld) craftBlock.getWorld()).getHandle(); - BlockPosition blockPosition = new BlockPosition(craftBlock.getX(), craftBlock.getY(), craftBlock.getZ()); - nmsWorld.updateAdjacentComparators(blockPosition, CraftMagicNumbers.getBlock(craftBlock)); + BlockPosition blockPos = new BlockPosition(craftBlock.getX(), craftBlock.getY(), craftBlock.getZ()); + Block nmsBlock = CraftMagicNumbers.getBlock(bukkitBlock.getType()); + serverLevel.updateAdjacentComparators(blockPos, nmsBlock); } } diff --git a/NMS/NMS/pom.xml b/NMS/NMS/pom.xml new file mode 100644 index 00000000..4c79f6ed --- /dev/null +++ b/NMS/NMS/pom.xml @@ -0,0 +1,145 @@ + + + 4.0.0 + + + com.songoda + SongodaCore-Modules + 2.6.21 + ../../pom.xml + + SongodaCore-NMS + + + + ${project.groupId} + SongodaCore-NMS-API + ${project.version} + compile + + + + + ${project.groupId} + SongodaCore-NMS-v1_8_R1 + ${project.version} + compile + + + ${project.groupId} + SongodaCore-NMS-v1_8_R2 + ${project.version} + compile + + + ${project.groupId} + SongodaCore-NMS-v1_8_R3 + ${project.version} + compile + + + ${project.groupId} + SongodaCore-NMS-v1_9_R1 + ${project.version} + compile + + + ${project.groupId} + SongodaCore-NMS-v1_9_R2 + ${project.version} + compile + + + ${project.groupId} + SongodaCore-NMS-v1_10_R1 + ${project.version} + compile + + + ${project.groupId} + SongodaCore-NMS-v1_11_R1 + ${project.version} + compile + + + ${project.groupId} + SongodaCore-NMS-v1_12_R1 + ${project.version} + compile + + + ${project.groupId} + SongodaCore-NMS-v1_13_R1 + ${project.version} + compile + + + ${project.groupId} + SongodaCore-NMS-v1_13_R2 + ${project.version} + compile + + + ${project.groupId} + SongodaCore-NMS-v1_14_R1 + ${project.version} + compile + + + ${project.groupId} + SongodaCore-NMS-v1_15_R1 + ${project.version} + compile + + + ${project.groupId} + SongodaCore-NMS-v1_16_R1 + ${project.version} + compile + + + ${project.groupId} + SongodaCore-NMS-v1_16_R2 + ${project.version} + compile + + + ${project.groupId} + SongodaCore-NMS-v1_16_R3 + ${project.version} + compile + + + ${project.groupId} + SongodaCore-NMS-v1_17_R1 + ${project.version} + compile + + + ${project.groupId} + SongodaCore-NMS-v1_18_R1 + ${project.version} + compile + + + ${project.groupId} + SongodaCore-NMS-v1_18_R2 + ${project.version} + compile + + + ${project.version} + SongodaCore-NMS-v1_19_R1 + ${project.groupId} + compile + + + ${project.version} + SongodaCore-NMS-v1_19_R2 + ${project.groupId} + compile + + + diff --git a/pom.xml b/pom.xml index fda2bfe2..4e99c685 100644 --- a/pom.xml +++ b/pom.xml @@ -10,14 +10,12 @@ pom - + UTF-8 1.8 8 - UTF-8 - songoda https://sonarcloud.io target/surefire-reports/*.xml @@ -27,6 +25,8 @@ Core Compatibility + + NMS/NMS NMS/NMS-API NMS/NMS-v1_8_R1 NMS/NMS-v1_8_R2 @@ -46,8 +46,8 @@ NMS/NMS-v1_17_R1 NMS/NMS-v1_18_R1 NMS/NMS-v1_18_R2 + NMS/NMS-v1_19_0 NMS/NMS-v1_19_R1 - NMS/NMS-v1_19_R1v2 NMS/NMS-v1_19_R2 NMS/NMS-v1_19_R3 @@ -69,7 +69,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.1 + 3.10.1 ${java.version} @@ -81,13 +81,21 @@ + org.apache.maven.plugins maven-surefire-plugin - 2.22.2 + 3.0.0-M6 + + + + true + + + org.apache.maven.plugins maven-failsafe-plugin - 3.0.0-M5 + 3.0.0-M6 @@ -111,17 +119,41 @@ + + + org.pitest + pitest-maven + 1.10.3 + + + + com.songoda.core.* + + + + com.songoda.core.SongodaCoreConstantsTest + + + + + + org.pitest + pitest-junit5-plugin + 1.1.0 + + + - songoda-public - https://repo.songoda.com/repository/public/ + songoda + https://repo.songoda.com/repository/minecraft-plugins/ - spigotmc-repo + SpigotMC https://hub.spigotmc.org/nexus/content/repositories/snapshots/ @@ -131,7 +163,7 @@ - bg-repo + bg-software https://repo.bg-software.com/repository/api/ @@ -140,6 +172,11 @@ https://repo.viaversion.com/ + + PaperMC + https://papermc.io/repo/repository/maven-public/ + + jitpack.io https://jitpack.io/ @@ -160,7 +197,7 @@ org.jetbrains annotations - 23.0.0 + 23.1.0 provided @@ -179,21 +216,14 @@ org.junit.jupiter junit-jupiter - 5.8.1 + 5.9.1 test - - - - - - - - com.github.seeseemelk - MockBukkit-v1.17 - 1.10.3 + org.mockito + mockito-inline + 4.11.0 test