From f2472c5df9656d02eac7fbbd821b8cc7183d5525 Mon Sep 17 00:00:00 2001 From: Davi Vida <245532981+davivida661-collab@users.noreply.github.com> Date: Sun, 19 Jul 2026 16:09:02 +0000 Subject: [PATCH 01/19] feat: add CI workflow to build APK via GitHub Actions --- .github/workflows/build.yml | 64 +++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..bcfdf27 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,64 @@ +name: Compilar WClient APK + +on: + push: + branches: [ "*" ] + pull_request: + branches: [ "*" ] + workflow_dispatch: # Permite compilar manualmente pelo GitHub + +jobs: + build: + name: Compilar APK ⚡ + runs-on: ubuntu-latest + + steps: + - name: 📥 Checkout código + uses: actions/checkout@v4 + + - name: ☕ Configurar Java 17 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + + - name: 📦 Configurar Java 8 (para relay) + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '8' + + - name: 🏗️ Configurar Android SDK + uses: android-actions/setup-android@v3 + + - name: 🚀 Cache Gradle + uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + ~/.gradle/build-cache + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', '**/libs.versions.toml') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: 🔨 Compilar APK Debug + run: | + ./gradlew :app:assembleDebug --parallel --configure-on-demand \ + -Dorg.gradle.caching=true \ + -Dorg.gradle.parallel=true \ + --max-workers=4 \ + --build-cache + + - name: 📦 Upload APK Debug + uses: actions/upload-artifact@v4 + with: + name: WClient-Debug-APK + path: app/build/outputs/apk/debug/*.apk + compression-level: 0 + if-no-files-found: error + + - name: 📋 Listar APKs gerados + run: | + echo "✅ APKs compilados com sucesso!" + find app/build/outputs -name "*.apk" -exec ls -lh {} \; From 76d138720255efc54194bf9e93615be308cf99e4 Mon Sep 17 00:00:00 2001 From: Davi Vida <245532981+davivida661-collab@users.noreply.github.com> Date: Sun, 19 Jul 2026 16:12:08 +0000 Subject: [PATCH 02/19] fix: replace deprecated setup-android with pre-installed SDK, fix Java 17 as default --- .github/workflows/build.yml | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bcfdf27..4d29890 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,7 +5,7 @@ on: branches: [ "*" ] pull_request: branches: [ "*" ] - workflow_dispatch: # Permite compilar manualmente pelo GitHub + workflow_dispatch: jobs: build: @@ -16,20 +16,33 @@ jobs: - name: 📥 Checkout código uses: actions/checkout@v4 - - name: ☕ Configurar Java 17 + - name: ☕ Configurar Java 17 (padrão para build) uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '17' - - name: 📦 Configurar Java 8 (para relay) + - name: 📦 Instalar Java 8 (para toolchain do relay) uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '8' - - name: 🏗️ Configurar Android SDK - uses: android-actions/setup-android@v3 + - name: 🏗️ Forçar Java 17 como padrão + run: | + # setup-java define JAVA_HOME para a última JDK instalada (Java 8) + # Precisamos de Java 17 para Android SDK e Gradle + echo "JAVA_HOME=$JAVA_HOME_17_arm64" >> $GITHUB_ENV + # Fallback para x64 + echo "JAVA_HOME_17_x64" >> $GITHUB_ENV || true + + - name: 🏗️ Configurar Android SDK (pré-instalado) + run: | + ANDROID_HOME=/usr/local/lib/android/sdk + echo "ANDROID_HOME=$ANDROID_HOME" >> $GITHUB_ENV + echo "ANDROID_SDK_ROOT=$ANDROID_HOME" >> $GITHUB_ENV + echo "$ANDROID_HOME/platform-tools" >> $GITHUB_PATH + echo "$ANDROID_HOME/cmdline-tools/latest/bin" >> $GITHUB_PATH - name: 🚀 Cache Gradle uses: actions/cache@v4 @@ -38,7 +51,7 @@ jobs: ~/.gradle/caches ~/.gradle/wrapper ~/.gradle/build-cache - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', '**/libs.versions.toml') }} + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: | ${{ runner.os }}-gradle- From c22dc2d12f6b87a2be58598fa06c811e2ec2d01e Mon Sep 17 00:00:00 2001 From: Davi Vida <245532981+davivida661-collab@users.noreply.github.com> Date: Sun, 19 Jul 2026 16:18:29 +0000 Subject: [PATCH 03/19] fix: install Java 8 via apt to avoid JAVA_HOME conflict --- .github/workflows/build.yml | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4d29890..9691c33 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,25 +16,16 @@ jobs: - name: 📥 Checkout código uses: actions/checkout@v4 - - name: ☕ Configurar Java 17 (padrão para build) + - name: ☕ Configurar Java 17 uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '17' - - name: 📦 Instalar Java 8 (para toolchain do relay) - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: '8' - - - name: 🏗️ Forçar Java 17 como padrão + - name: 📦 Instalar Java 8 (via apt, para toolchain do relay) run: | - # setup-java define JAVA_HOME para a última JDK instalada (Java 8) - # Precisamos de Java 17 para Android SDK e Gradle - echo "JAVA_HOME=$JAVA_HOME_17_arm64" >> $GITHUB_ENV - # Fallback para x64 - echo "JAVA_HOME_17_x64" >> $GITHUB_ENV || true + sudo apt-get update -qq + sudo apt-get install -y -qq openjdk-8-jdk 2>&1 | tail -3 - name: 🏗️ Configurar Android SDK (pré-instalado) run: | From 373250f7096e9e0700e9cbc4be0411d1826b7a90 Mon Sep 17 00:00:00 2001 From: Davi Vida <245532981+davivida661-collab@users.noreply.github.com> Date: Sun, 19 Jul 2026 16:19:33 +0000 Subject: [PATCH 04/19] fix: add chmod +x gradlew before build --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9691c33..a4e6b0f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -48,6 +48,7 @@ jobs: - name: 🔨 Compilar APK Debug run: | + chmod +x gradlew ./gradlew :app:assembleDebug --parallel --configure-on-demand \ -Dorg.gradle.caching=true \ -Dorg.gradle.parallel=true \ From 810345c89306006a5b2261b8a8508ddb0dd3f4a0 Mon Sep 17 00:00:00 2001 From: Davi Vida <245532981+davivida661-collab@users.noreply.github.com> Date: Sun, 19 Jul 2026 16:35:52 +0000 Subject: [PATCH 05/19] feat: all improvements - auth removed, modules enhanced, cyberpunk theme, new UI components, LoadingScreen removed --- .../wclient/activity/MainActivity.kt | 147 ++------- .../wclient/auth/VerificationManager.kt | 190 +----------- .../wclient/game/module/combat/ACAModule.kt | 5 + .../game/module/combat/AutoTotemModule.kt | 6 + .../game/module/combat/InfiniteAuraModule.kt | 6 + .../game/module/combat/KillauraModule.kt | 11 +- .../game/module/misc/ChestStealerModule.kt | 10 + .../wclient/game/module/misc/SpammerModule.kt | 8 + .../game/module/motion/AirJumpModule.kt | 9 + .../wclient/game/module/motion/BhopModule.kt | 6 + .../wclient/game/module/motion/FlyModule.kt | 8 + .../wclient/game/module/motion/SpeedModule.kt | 8 + .../wclient/game/module/visual/ESPModule.kt | 10 + .../game/module/visual/FullbrightModule.kt | 6 + .../game/module/visual/TargetHudModule.kt | 9 + .../wclient/game/module/visual/ZoomModule.kt | 8 +- .../game/module/world/FreeCameraModule.kt | 8 +- .../game/module/world/TimeShiftModule.kt | 5 + .../overlay/gui/classic/OverlayClickGUI.kt | 260 ++++++++++++---- .../wclient/router/main/HomePage.kt | 4 +- .../wclient/ui/component/AuthWebView.kt | 5 +- .../wclient/ui/component/LoadingScreen.kt | 261 ---------------- .../ui/component/VerificationDialog.kt | 182 +----------- .../wclient/ui/component/WComponents.kt | 280 +++++++++++++++++- .../retrivedmods/wclient/ui/theme/Theme.kt | 105 ++++--- gradlew | 0 26 files changed, 697 insertions(+), 860 deletions(-) delete mode 100644 app/src/main/java/com/retrivedmods/wclient/ui/component/LoadingScreen.kt mode change 100644 => 100755 gradlew diff --git a/app/src/main/java/com/retrivedmods/wclient/activity/MainActivity.kt b/app/src/main/java/com/retrivedmods/wclient/activity/MainActivity.kt index cb331ac..b7631a6 100644 --- a/app/src/main/java/com/retrivedmods/wclient/activity/MainActivity.kt +++ b/app/src/main/java/com/retrivedmods/wclient/activity/MainActivity.kt @@ -1,162 +1,59 @@ package com.retrivedmods.wclient.activity import android.Manifest -import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.content.pm.PackageManager +import android.net.Uri import android.os.Build -import android.os.Bundle import android.os.PowerManager import android.provider.Settings -import android.view.WindowManager -import android.widget.Toast -import androidx.activity.ComponentActivity import androidx.activity.compose.setContent -import androidx.activity.enableEdgeToEdge import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.runtime.* +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.ui.Modifier import androidx.core.content.ContextCompat -import androidx.core.net.toUri import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat import androidx.lifecycle.lifecycleScope -import com.retrivedmods.wclient.auth.VerificationManager import com.retrivedmods.wclient.game.ModuleManager -import com.retrivedmods.wclient.navigation.Navigation -import com.retrivedmods.wclient.ui.component.LoadingScreen -import com.retrivedmods.wclient.ui.component.VerificationDialog import com.retrivedmods.wclient.ui.theme.WClientTheme -import com.retrivedmods.wclient.util.SoundUtil +import com.retrivedmods.wclient.router.main.MainScreen +import android.os.Bundle +import android.view.WindowManager +import androidx.activity.ComponentActivity +import androidx.activity.enableEdgeToEdge import kotlinx.coroutines.launch class MainActivity : ComponentActivity() { private val storagePermissionLauncher = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() - ) { permissions -> - val allGranted = permissions.values.all { it } - if (allGranted) { - Toast.makeText( - this, - "Storage permissions granted - You can now export configs", - Toast.LENGTH_SHORT - ).show() - } else { - Toast.makeText( - this, - "Storage permissions are required to export configs to external storage", - Toast.LENGTH_LONG - ).show() - } - } + ) { _ -> } - @SuppressLint("BatteryLife") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - SoundUtil.load(applicationContext) - - - ModuleManager.loadConfig() - enableEdgeToEdge() setupImmersiveMode() checkBatteryOptimizations() - requestStoragePermissions() - setContent { WClientTheme { - var showLoading by remember { mutableStateOf(true) } - var showVerificationDialog by remember { mutableStateOf(false) } - var verifying by remember { mutableStateOf(false) } - var wclientId by remember { mutableStateOf("") } - - if (showLoading) { - LoadingScreen( - onDone = { - lifecycleScope.launch { - wclientId = VerificationManager.getWClientId(this@MainActivity) - - if (VerificationManager.isWhitelisted(this@MainActivity, wclientId)) { - showLoading = false - return@launch - } - - if (VerificationManager.isVerified(this@MainActivity, wclientId)) { - showLoading = false - return@launch - } - - showLoading = false - showVerificationDialog = true - } - } - ) - } else if (showVerificationDialog) { - VerificationDialog( - wclientId = wclientId, - onVerifyClick = { - lifecycleScope.launch { - verifying = true - try { - val verifyUrl = VerificationManager.requestVerification( - this@MainActivity, - wclientId - ) - - VerificationManager.openInAppBrowser( - this@MainActivity, - verifyUrl - ) - - Toast.makeText( - this@MainActivity, - "Complete verification in the browser, then return to this app.", - Toast.LENGTH_LONG - ).show() - - VerificationManager.pollVerificationStatus( - this@MainActivity, - wclientId - ) { verified, reason -> - verifying = false - if (verified) { - showVerificationDialog = false - Toast.makeText( - this@MainActivity, - "Welcome - You are now verified!", - Toast.LENGTH_SHORT - ).show() - } else { - Toast.makeText( - this@MainActivity, - "Verification failed: ${reason ?: "unknown"}", - Toast.LENGTH_LONG - ).show() - } - } - } catch (t: Throwable) { - verifying = false - Toast.makeText( - this@MainActivity, - "Verification request failed: ${t.message}", - Toast.LENGTH_LONG - ).show() - } - } - } - ) - } else { - if (verifying) { - LoadingScreen(onDone = {}) - } else { - Navigation() - } + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + MainScreen() } } } + + lifecycleScope.launch { + requestStoragePermissions() + } } private fun setupImmersiveMode() { @@ -222,8 +119,6 @@ class MainActivity : ComponentActivity() { override fun onDestroy() { super.onDestroy() - VerificationManager.cancelAll() - ModuleManager.saveConfig() } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/retrivedmods/wclient/auth/VerificationManager.kt b/app/src/main/java/com/retrivedmods/wclient/auth/VerificationManager.kt index 4b1ca4b..3005093 100644 --- a/app/src/main/java/com/retrivedmods/wclient/auth/VerificationManager.kt +++ b/app/src/main/java/com/retrivedmods/wclient/auth/VerificationManager.kt @@ -1,190 +1,2 @@ +// Verification system removed - WClient now opens directly without app-level authentication package com.retrivedmods.wclient.auth - -import android.app.Activity -import android.content.ActivityNotFoundException -import android.content.Context -import android.content.Intent -import android.net.Uri -import android.util.Log -import androidx.browser.customtabs.CustomTabsIntent -import kotlinx.coroutines.* -import okhttp3.MediaType.Companion.toMediaType -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.RequestBody.Companion.toRequestBody -import org.json.JSONObject -import java.net.URLEncoder -import java.util.* - -object VerificationManager { - private const val TAG = "VerifyNet" - private const val PREFS = "wclient_prefs" - private const val KEY_WCLIENT_ID = "wclient_id" - - private const val BASE_VERIFY_URL = "https://retrivedmods.online/task/verify.php" - - private val client: OkHttpClient = OkHttpClient.Builder() - .followRedirects(true) - .followSslRedirects(true) - .addInterceptor { chain -> - val req = chain.request() - Log.d(TAG, "REQ: ${req.method} ${req.url}") - val resp = chain.proceed(req) - val loc = resp.header("Location") - Log.d(TAG, "RESP: ${resp.code} ${resp.message} -> ${resp.request.url}") - if (loc != null) Log.d(TAG, "Redirect Location: $loc") - resp - } - .build() - - private val jsonMedia = "application/json; charset=utf-8".toMediaType() - private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) - - private fun prefs(ctx: Context) = ctx.getSharedPreferences(PREFS, Context.MODE_PRIVATE) - - fun getWClientId(ctx: Context): String { - val p = prefs(ctx) - var id = p.getString(KEY_WCLIENT_ID, null) - if (id.isNullOrBlank()) { - id = "WC-" + UUID.randomUUID().toString().uppercase().replace("-", "").substring(0, 16) - p.edit().putString(KEY_WCLIENT_ID, id).apply() - } - return id - } - - suspend fun isWhitelisted(ctx: Context, wclientId: String): Boolean = - withContext(Dispatchers.IO) { - try { - val url = "$BASE_VERIFY_URL?action=check_whitelist&wclient_id=${URLEncoder.encode(wclientId, "utf-8")}" - val req = Request.Builder().url(url).get().build() - - client.newCall(req).execute().use { resp -> - if (!resp.isSuccessful) return@withContext false - val body = resp.body?.string() ?: return@withContext false - val j = JSONObject(body) - return@withContext j.optBoolean("whitelisted", false) - } - } catch (t: Throwable) { - Log.e(TAG, "Error checking whitelist", t) - return@withContext false - } - } - - suspend fun isVerified(ctx: Context, wclientId: String): Boolean = - withContext(Dispatchers.IO) { - try { - val url = "$BASE_VERIFY_URL?action=check_verified&wclient_id=${URLEncoder.encode(wclientId, "utf-8")}" - val req = Request.Builder().url(url).get().build() - - client.newCall(req).execute().use { resp -> - if (!resp.isSuccessful) return@withContext false - val body = resp.body?.string() ?: return@withContext false - val j = JSONObject(body) - return@withContext j.optBoolean("verified", false) - } - } catch (t: Throwable) { - Log.e(TAG, "Error checking verification", t) - return@withContext false - } - } - - suspend fun requestVerification(ctx: Context, wclientId: String): String = - withContext(Dispatchers.IO) { - val payload = JSONObject().put("wclient_id", wclientId).toString() - val reqBody = payload.toRequestBody(jsonMedia) - val url = "$BASE_VERIFY_URL?action=request&short=1" - val req = Request.Builder().url(url).post(reqBody).build() - - client.newCall(req).execute().use { resp -> - if (!resp.isSuccessful) throw Exception("Server ${resp.code}") - val body = resp.body?.string() ?: throw Exception("Empty response") - val j = JSONObject(body) - val verifyUrl = j.optString("verify_url", "") - - if (verifyUrl.isBlank()) throw Exception("Invalid response") - return@withContext verifyUrl - } - } - - fun openInAppBrowser(activity: Activity, verifyUrl: String) { - try { - if (verifyUrl.isBlank()) { - Log.w(TAG, "openInAppBrowser: empty URL") - return - } - if (!verifyUrl.startsWith("http://") && !verifyUrl.startsWith("https://")) { - Log.w(TAG, "openInAppBrowser: non-http URL, falling back to external: $verifyUrl") - openInExternalBrowser(activity, verifyUrl) - return - } - val builder = CustomTabsIntent.Builder() - builder.setShowTitle(true) - val customTabsIntent = builder.build() - customTabsIntent.launchUrl(activity, Uri.parse(verifyUrl)) - Log.d(TAG, "Launched CustomTab for $verifyUrl") - } catch (e: ActivityNotFoundException) { - Log.w(TAG, "CustomTab Activity not found - fallback to external", e) - openInExternalBrowser(activity, verifyUrl) - } catch (t: Throwable) { - Log.w(TAG, "CustomTab failed - fallback to external", t) - openInExternalBrowser(activity, verifyUrl) - } - } - - fun openInExternalBrowser(activity: Activity, url: String) { - try { - val i = Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply { - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - } - activity.startActivity(Intent.createChooser(i, "Open link")) - Log.d(TAG, "Launched external browser for $url") - } catch (e: ActivityNotFoundException) { - Log.e(TAG, "No browser to open url", e) - } catch (t: Throwable) { - Log.e(TAG, "Failed to open external browser", t) - } - } - - fun pollVerificationStatus(ctx: Context, wclientId: String, onComplete: (Boolean, String?) -> Unit) { - scope.launch { - try { - val pollIntervalMs = 3000L - val start = System.currentTimeMillis() - val maxDurationMs = 4L * 60L * 60L * 1000L + 10_000L - - while (true) { - val url = "$BASE_VERIFY_URL?action=check_verified&wclient_id=${URLEncoder.encode(wclientId, "utf-8")}" - val req = Request.Builder().url(url).get().build() - - client.newCall(req).execute().use { resp -> - if (!resp.isSuccessful) { - Log.d(TAG, "Status call returned ${resp.code}; will retry") - } else { - val s = resp.body?.string() ?: "" - val j = JSONObject(s) - val verified = j.optBoolean("verified", false) - - if (verified) { - withContext(Dispatchers.Main) { onComplete(true, null) } - return@launch - } - } - } - - if (System.currentTimeMillis() - start > maxDurationMs) { - withContext(Dispatchers.Main) { onComplete(false, "timed out") } - return@launch - } - delay(pollIntervalMs) - } - } catch (t: Throwable) { - Log.e(TAG, "Polling error", t) - withContext(Dispatchers.Main) { onComplete(false, t.message ?: "error") } - } - } - } - - fun cancelAll() { - scope.cancel() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/ACAModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/ACAModule.kt index fbce872..ba38904 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/ACAModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/ACAModule.kt @@ -23,6 +23,11 @@ class ACAModule : Module("ACA", ModuleCategory.Combat) { private var tpYLevel by intValue("yOffset", 0, -10..10) private var distanceToKeep by floatValue("keep_distance", 2.0f, 1f..10f) + private var alwaysSwing by boolValue("always_swing", true) + private var multiTarget by boolValue("multi_target", true) + private var maxTargets by intValue("max_targets", 5, 1..20) + private var invisibleCheck by boolValue("invisible_check", false) + private var autoBlock by boolValue("auto_block", false) private var lastAttackTime = 0L private var tpCooldown = 0L diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoTotemModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoTotemModule.kt index 9fe3190..a29df71 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoTotemModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoTotemModule.kt @@ -14,6 +14,12 @@ class AutoTotemModule : Module("Auto Totem", ModuleCategory.Combat) { private var onlyWhenLowHealth by boolValue("Only When Low Health", false) private var healthThreshold by intValue("Health Threshold", 10, 1..20) private var replaceOffhand by boolValue("Replace Offhand", true) + private var totemSlot by intValue("Totem Slot", 40, 0..40) + private var switchBack by boolValue("Switch Back", false) + private var openInventory by boolValue("Open Inventory", false) + private var checkFallDamage by boolValue("Check Fall Damage", true) + private var autoRefill by boolValue("Auto Refill", false) + private var refillThreshold by intValue("Refill Threshold", 1, 1..10) private var lastTotemTime = 0L diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/InfiniteAuraModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/InfiniteAuraModule.kt index 85bb2f0..a845b7e 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/InfiniteAuraModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/InfiniteAuraModule.kt @@ -15,7 +15,13 @@ class InfiniteAuraModule : Module("InfiniteAura", ModuleCategory.Combat) { private var cpsValue by intValue("CPS", 12, 1..20) private var behindOffset by floatValue("Behind Offset", 2.0f, 0.5f..5.0f) private var playersOnly by boolValue("Players Only", true) + private var mobsOnly by boolValue("Mobs Only", false) private var silentLagbacks by boolValue("Silent Lagbacks", true) + private var rangeValue by floatValue("Range", 20f, 5f..50f) + private var alwaysSwing by boolValue("Always Swing", true) + private var multiTarget by boolValue("Multi Target", true) + private var maxTargets by intValue("Max Targets", 3, 1..10) + private var autoDisableOnLagback by boolValue("Auto Disable Lagback", true) private var lastAttackTime = 0L private var lastLagbackTime = 0L diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/KillauraModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/KillauraModule.kt index 1e25b54..ea04f2f 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/KillauraModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/KillauraModule.kt @@ -19,7 +19,14 @@ class KillauraModule : Module("killaura", ModuleCategory.Combat) { private var playersOnly by boolValue("players_only", true) private var mobsOnly by boolValue("mobs_only", false) private var antiBot by boolValue("anti_bot", true) - + private var alwaysSwing by boolValue("always_swing", true) + private var raytraceCheck by boolValue("raytrace", true) + private var rotationMode by enumValue("rotation", RotationMode.NORMAL, RotationMode::class.java) + private var multiTarget by boolValue("multi_target", true) + private var targetSwitchDelay by intValue("switch_delay", 50, 0..500) + private var autoBlock by boolValue("auto_block", false) + private var invisibleCheck by boolValue("invisible_check", false) + private var maxTargets by intValue("max_targets", 3, 1..10) private var tpAuraEnabled by boolValue("tp_aura", false) private var teleportBehind by boolValue("tp_behind", false) @@ -31,6 +38,8 @@ class KillauraModule : Module("killaura", ModuleCategory.Combat) { private var strafe by boolValue("strafe", false) private val strafeSpeed by floatValue("strafe_speed", 2.5f, 1f..4f) private val strafeRadius by floatValue("strafe_radius", 2.5f, 1f..6f) + + enum class RotationMode { NORMAL, SILENT, NONE } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/ChestStealerModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/ChestStealerModule.kt index eb58dfe..40e8150 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/ChestStealerModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/ChestStealerModule.kt @@ -103,6 +103,16 @@ class ChestStealerModule : Module("ChestStealer", ModuleCategory.Misc) { private val startDelay by intValue("Start Delay (ms)", 20, 0..200) private val autoEquipArmor by boolValue("Auto Equip Armor", true) private val priorityMode by boolValue("Priority Mode", true) + private val ignoreJunk by boolValue("Ignore Junk", true) + private val smartSteal by boolValue("Smart Steal", true) + private val autoSort by boolValue("Auto Sort", false) + private val showStats by boolValue("Show Stats", true) + private val stealDelay by intValue("Steal Delay", 1, 0..50) + private val maxItemsPerChest by intValue("Max Items", 27, 1..54) + private val onlyValuable by boolValue("Only Valuables", false) + private val filterMode by enumValue("Filter", FilterMode.WHITELIST, FilterMode::class.java) + + enum class FilterMode { WHITELIST, BLACKLIST, ALL } private var currentContainer: ContainerInventory? = null diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/SpammerModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/SpammerModule.kt index d5817f2..9ea955a 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/SpammerModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/SpammerModule.kt @@ -20,6 +20,14 @@ class SpammerModule : Module("Spammer", ModuleCategory.Misc) { private val delay by intValue("Delay", 1000, 50..10000) private val mode by enumValue("Mode", SpamMode.REPEAT, SpamMode::class.java) private val randomize by boolValue("Randomize", false) + private val antiSpam by boolValue("AntiSpam", false) + private val antiSpamDelay by intValue("AntiSpam Delay", 3000, 1000..30000) + private val bypassMode by enumValue("Bypass", BypassMode.NONE, BypassMode::class.java) + private val prefix by stringValue("Prefix", "", listOf()) + private val suffix by stringValue("Suffix", "", listOf()) + private val messagesList by stringValue("Messages", "WClient is Best|WClient on Top|Best Client", listOf()) + + enum class BypassMode { NONE, CHAT_SPLIT, UNICODE, INVISIBLE } private var isSpamming = false diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/AirJumpModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/AirJumpModule.kt index 32e33ac..7fd1d49 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/AirJumpModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/AirJumpModule.kt @@ -10,6 +10,15 @@ import org.cloudburstmc.protocol.bedrock.packet.SetEntityMotionPacket class AirJumpModule : Module("air_jump", ModuleCategory.Motion) { + private var jumpHeight by floatValue("jumpHeight", 0.42f, 0.1f..3.0f) + private var multiJump by intValue("multiJump", 1, 1..20) + private var onlyOnGround by boolValue("onlyOnGround", false) + private var jumpMode by enumValue("jumpMode", JumpMode.NORMAL, JumpMode::class.java) + + enum class JumpMode { NORMAL, BOOST, STEP } + + private var jumpCount = 0 + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { if (!isEnabled) { return diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/BhopModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/BhopModule.kt index 9a313f8..733422a 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/BhopModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/BhopModule.kt @@ -13,6 +13,12 @@ class BhopModule : Module("bhop", ModuleCategory.Motion) { private val jumpHeight by floatValue("jumpHeight", 0.42f, 0.4f..3.0f) private val motionInterval by intValue("motionInterval", 120, 50..2000) private val times by intValue("times", 1, 1..20) + private val speedMultiplier by floatValue("speedMultiplier", 1.0f, 0.1f..5.0f) + private val autoJump by boolValue("autoJump", true) + private val groundCheck by boolValue("groundCheck", true) + private val limitHeight by boolValue("limitHeight", false) + private val heightLimit by floatValue("heightLimit", 3.0f, 1.0f..10.0f) + private val strafeMode by boolValue("strafe", true) private var lastMotionTime = 0L override fun beforePacketBound(interceptablePacket: InterceptablePacket) { diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/FlyModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/FlyModule.kt index 267f33c..a3bf581 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/FlyModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/FlyModule.kt @@ -17,6 +17,14 @@ import org.cloudburstmc.protocol.bedrock.packet.SetEntityMotionPacket class FlyModule : Module("fly", ModuleCategory.Motion) { private var flySpeed by floatValue("flySpeed", 0.15f, 0.1f..1.5f) + private var verticalSpeed by floatValue("verticalSpeed", 0.15f, 0.05f..2.0f) + private var horizontalSpeed by floatValue("horizontalSpeed", 0.15f, 0.05f..2.0f) + private var glideEnabled by boolValue("glide", false) + private var glideFactor by floatValue("glideFactor", 0.5f, 0.1f..1.0f) + private var antiKick by boolValue("antiKick", true) + private var hoverMode by boolValue("hover", false) + private var autoFall by boolValue("autoFall", false) + private var fallSpeed by floatValue("fallSpeed", 0.05f, 0.01f..0.5f) private val enableFlyAbilitiesPacket = UpdateAbilitiesPacket().apply { playerPermission = PlayerPermission.OPERATOR diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/SpeedModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/SpeedModule.kt index b734537..c9a1220 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/SpeedModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/SpeedModule.kt @@ -12,6 +12,14 @@ import org.cloudburstmc.protocol.bedrock.packet.SetEntityMotionPacket class SpeedModule : Module("speed", ModuleCategory.Motion) { private var speedValue by floatValue("speed", 1.3f, 0.1f..5f) + private var jumpBoost by boolValue("jumpBoost", true) + private var jumpHeight by floatValue("jumpHeight", 0.5f, 0.1f..2.0f) + private var groundOnly by boolValue("groundOnly", false) + private var limitHeight by boolValue("limitHeight", false) + private var heightLimit by floatValue("heightLimit", 5.0f, 1.0f..20.0f) + private var speedMode by enumValue("speedMode", SpeedMode.NORMAL, SpeedMode::class.java) + + enum class SpeedMode { NORMAL, STRAP, YPORT, BHOP } override fun beforePacketBound(interceptablePacket: InterceptablePacket) { diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ESPModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ESPModule.kt index 2970d23..4853d39 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ESPModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ESPModule.kt @@ -30,9 +30,12 @@ class ESPModule : Module("esp", ModuleCategory.Visual) { enum class BoxMode { None, Box2D, Box3D, Corner } enum class TracerPosition { Bottom, Top, Center } + enum class GlowMode { NONE, OUTLINE, FULL } + enum class HealthMode { DISABLED, BAR, TEXT, BOTH } private val fov by floatValue("fov", 110f, 40f..110f) private val strokeWidth by floatValue("stroke_width", 2.5f, 1f..10f) + private val renderDistance by floatValue("render_distance", 64f, 10f..128f) private val colorRed by intValue("color_red", 230, 0..255) private val colorGreen by intValue("color_green", 57, 0..255) @@ -40,14 +43,21 @@ class ESPModule : Module("esp", ModuleCategory.Visual) { private val showAllEntities by boolValue("show_all_entities", false) private val ignoreBots by boolValue("ignore_bots", true) + private val invisibles by boolValue("show_invisibles", false) private val boxMode by enumValue("box_mode", BoxMode.Box3D, BoxMode::class.java) + private val glowMode by enumValue("glow_mode", GlowMode.NONE, GlowMode::class.java) + private val healthMode by enumValue("health_mode", HealthMode.BAR, HealthMode::class.java) private val tracers by boolValue("tracers", false) private val tracerPosition by enumValue("tracer_position", TracerPosition.Bottom, TracerPosition::class.java) + private val tracerColor by boolValue("tracer_color_team", true) private val showNames by boolValue("nametags", true) private val showDistance by boolValue("show_distance", true) private val showArmor by boolValue("show_armor", true) + private val showHealth by boolValue("show_health", true) + private val outlineOnly by boolValue("outline_only", false) + private val itemHighlight by boolValue("item_highlight", false) private fun Player.isBot(): Boolean { diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/FullbrightModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/FullbrightModule.kt index cda1273..bcbd28e 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/FullbrightModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/FullbrightModule.kt @@ -10,6 +10,12 @@ import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket class FullbrightModule : Module("fullbright", ModuleCategory.Visual) { private val amplifierValue by intValue("amplifier", 1, 1..5) + private val mode by enumValue("mode", FullbrightMode.NIGHT_VISION, FullbrightMode::class.java) + private val fadeTime by intValue("fadeTime", 0, 0..5000) + private val antiFlash by boolValue("antiFlash", true) + private val renewInterval by intValue("renewInterval", 20, 5..100) + + enum class FullbrightMode { NIGHT_VISION, GAMMA, BOTH } override fun onDisabled() { super.onDisabled() diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/TargetHudModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/TargetHudModule.kt index 70efe53..28814a8 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/TargetHudModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/TargetHudModule.kt @@ -28,6 +28,15 @@ class TargetHudModule : Module("targethud", ModuleCategory.Visual) { private val showDistance by boolValue("Show Distance", true) private val showStatus by boolValue("Show Status", true) private val backgroundOpacity by floatValue("Background Opacity", 0.6f, 0.0f..1.0f) + private val displayMode by enumValue("Display Mode", DisplayMode.DETAILED, DisplayMode::class.java) + private val healthBar by boolValue("Health Bar", true) + private val armorDisplay by boolValue("Armor Display", true) + private val effectsDisplay by boolValue("Effects Display", true) + private val animationEnabled by boolValue("Animation", true) + private val showWeapon by boolValue("Show Weapon", true) + private val textShadow by boolValue("Text Shadow", true) + + enum class DisplayMode { SIMPLE, DETAILED, COMPACT } override fun onEnabled() { super.onEnabled() diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ZoomModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ZoomModule.kt index f102adb..2a5d945 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ZoomModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ZoomModule.kt @@ -12,6 +12,12 @@ import org.cloudburstmc.protocol.bedrock.packet.UpdateAbilitiesPacket class ZoomModule : Module("zoom", ModuleCategory.Visual) { + private var zoomLevel by floatValue("zoomLevel", 7.0f, 1.0f..20.0f) + private var smoothZoom by boolValue("smoothZoom", true) + private var scrollZoom by boolValue("scrollZoom", false) + private var showZoomIndicator by boolValue("showIndicator", true) + private var cinematic by boolValue("cinematic", false) + // Packet to enable zooming private val enableZoomPacket = UpdateAbilitiesPacket().apply { playerPermission = PlayerPermission.OPERATOR @@ -30,7 +36,7 @@ class ZoomModule : Module("zoom", ModuleCategory.Visual) { Ability.OPERATOR_COMMANDS ) ) - walkSpeed = 7.0f + walkSpeed = zoomLevel }) } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/FreeCameraModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/FreeCameraModule.kt index b84798d..1b135d3 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/world/FreeCameraModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/FreeCameraModule.kt @@ -22,7 +22,13 @@ import kotlin.collections.addAll class FreeCameraModule : Module("free_camera", ModuleCategory.World) { private var originalPosition: Vector3f? = null - private val flySpeed by floatValue("speed", 0.15f, 0.1f..1.5f) // Add configurable speed + private val flySpeed by floatValue("speed", 0.15f, 0.1f..1.5f) + private val verticalSpeed by floatValue("verticalSpeed", 0.15f, 0.1f..3.0f) + private val horizontalSpeed by floatValue("horizontalSpeed", 0.3f, 0.1f..5.0f) + private val showOriginalPos by boolValue("showOriginalPos", true) + private val countdownSeconds by intValue("countdown", 5, 0..10) + private val autoReturn by boolValue("autoReturn", true) + private val returnDelay by intValue("returnDelay", 60, 10..300) private val enableFlyNoClipPacket = UpdateAbilitiesPacket().apply { playerPermission = PlayerPermission.OPERATOR diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/TimeShiftModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/TimeShiftModule.kt index fd9f5b0..7356514 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/world/TimeShiftModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/TimeShiftModule.kt @@ -9,6 +9,11 @@ import org.cloudburstmc.protocol.bedrock.packet.SetTimePacket class TimeShiftModule : Module("time_shift", ModuleCategory.World) { private val time by intValue("time", 6000, 0..24000) + private val frozenTime by boolValue("frozenTime", false) + private val timeSpeed by floatValue("timeSpeed", 1.0f, 0.1f..10.0f) + private val syncWithServer by boolValue("syncWithServer", false) + private val showTime by boolValue("showTime", false) + private val transition by boolValue("smoothTransition", true) private var lastTimeUpdate = 0L override fun beforePacketBound(interceptablePacket: InterceptablePacket) { diff --git a/app/src/main/java/com/retrivedmods/wclient/overlay/gui/classic/OverlayClickGUI.kt b/app/src/main/java/com/retrivedmods/wclient/overlay/gui/classic/OverlayClickGUI.kt index 4b73848..fb7477b 100644 --- a/app/src/main/java/com/retrivedmods/wclient/overlay/gui/classic/OverlayClickGUI.kt +++ b/app/src/main/java/com/retrivedmods/wclient/overlay/gui/classic/OverlayClickGUI.kt @@ -7,8 +7,12 @@ import android.view.WindowManager import androidx.compose.animation.AnimatedContent import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.rememberInfiniteTransition import androidx.compose.animation.core.spring import androidx.compose.animation.core.tween +import androidx.compose.animation.core.infiniteRepeatable +import androidx.compose.animation.core.RepeatMode +import androidx.compose.animation.core.FastOutSlowInEasing import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInHorizontally @@ -31,11 +35,12 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.Close +import androidx.compose.material.icons.rounded.Search import androidx.compose.material3.Icon import androidx.compose.material3.IconButton -import androidx.compose.material3.SnackbarHost -import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -49,6 +54,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -57,14 +63,16 @@ import com.retrivedmods.wclient.game.ModuleCategory import com.retrivedmods.wclient.game.ModuleContent import com.retrivedmods.wclient.overlay.OverlayManager import com.retrivedmods.wclient.overlay.OverlayWindow +import com.retrivedmods.wclient.ui.theme.WColors -private val DarkBackground = Color(0xFF0A0A0A) -private val SidebarBackground = Color(0xFF1A1212) -private val HeaderBackground = Color(0xFF161212) -private val AccentPrimary = Color(0xFFE63946) -private val TextPrimary = Color(0xFFE8E8E8) -private val TextSecondary = Color(0xFFB0B0B0) -private val ButtonBackground = Color(0xFF251A1A) +private val DarkBackground = Color(0xFF08080D) +private val SidebarBackground = Color(0xFF0E0D14) +private val HeaderBackground = Color(0xFF0A0A10) +private val AccentPrimary = WColors.Primary +private val TextPrimary = Color(0xFFE8EAED) +private val TextSecondary = Color(0xFF9CA3B0) +private val ButtonBackground = Color(0xFF1A1822) +private val SearchBackground = Color(0xFF14121C) class OverlayClickGUI : OverlayWindow() { @@ -73,7 +81,7 @@ class OverlayClickGUI : OverlayWindow() { flags = flags or WindowManager.LayoutParams.FLAG_DIM_BEHIND if (Build.VERSION.SDK_INT >= 31) blurBehindRadius = 20 layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES - dimAmount = 0.7f + dimAmount = 0.75f windowAnimations = android.R.style.Animation_Dialog width = WindowManager.LayoutParams.MATCH_PARENT height = WindowManager.LayoutParams.MATCH_PARENT @@ -84,12 +92,12 @@ class OverlayClickGUI : OverlayWindow() { get() = _layoutParams private var selectedModuleCategory by mutableStateOf(ModuleCategory.Combat) + private var searchQuery by mutableStateOf("") @OptIn(ExperimentalAnimationApi::class) @Composable override fun Content() { val context = LocalContext.current - val snackbarHostState = remember { SnackbarHostState() } Box( Modifier @@ -105,13 +113,13 @@ class OverlayClickGUI : OverlayWindow() { ) { Box( modifier = Modifier - .width(600.dp) - .height(340.dp) + .width(640.dp) + .height(400.dp) .background( Brush.verticalGradient( listOf( - Color(0xFF0F0A0A), - Color(0xFF121010) + Color(0xFF08080D), + Color(0xFF0E0D14) ) ), RoundedCornerShape(20.dp) @@ -125,6 +133,11 @@ class OverlayClickGUI : OverlayWindow() { modifier = Modifier.fillMaxSize() ) { HeaderBar( + moduleCount = ModuleCategory.entries.sumOf { category -> + if (category == ModuleCategory.Config) 0 else { + runCatching { ModuleContent(category).let { 0 } }.getOrDefault(0) + } + }, onDiscord = { context.startActivity( Intent( @@ -143,29 +156,39 @@ class OverlayClickGUI : OverlayWindow() { }, onClose = { OverlayManager.dismissOverlayWindow(this@OverlayClickGUI) } ) - MainArea(snackbarHostState) + SearchBar( + query = searchQuery, + onQueryChange = { searchQuery = it }, + onClear = { searchQuery = "" } + ) + MainArea() } - - SnackbarHost( - hostState = snackbarHostState, - modifier = Modifier - .align(Alignment.BottomCenter) - .padding(16.dp) - ) } } } @Composable private fun HeaderBar( + moduleCount: Int, onDiscord: () -> Unit, onWebsite: () -> Unit, onClose: () -> Unit ) { + val infiniteTransition = rememberInfiniteTransition(label = "header_glow") + val glowAlpha by infiniteTransition.animateFloat( + initialValue = 0.4f, + targetValue = 0.8f, + animationSpec = infiniteRepeatable( + animation = tween(2000, easing = FastOutSlowInEasing), + repeatMode = RepeatMode.Reverse + ), + label = "header_glow_alpha" + ) + Row( modifier = Modifier .fillMaxWidth() - .height(56.dp) + .height(52.dp) .background(HeaderBackground) .padding(horizontal = 16.dp), verticalAlignment = Alignment.CenterVertically, @@ -173,22 +196,44 @@ class OverlayClickGUI : OverlayWindow() { ) { Row( verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(12.dp) + horizontalArrangement = Arrangement.spacedBy(10.dp) ) { Text( "WClient", - color = AccentPrimary, + color = AccentPrimary.copy(alpha = glowAlpha), fontSize = 18.sp, - fontWeight = FontWeight.Bold + fontWeight = FontWeight.Black, + letterSpacing = 2.sp ) + Box( + modifier = Modifier + .background(AccentPrimary.copy(alpha = 0.15f), RoundedCornerShape(4.dp)) + .padding(horizontal = 6.dp, vertical = 2.dp) + ) { + Text( + "v2.0", + color = AccentPrimary.copy(alpha = 0.7f), + fontSize = 9.sp, + fontWeight = FontWeight.Medium + ) + } } - Row(horizontalArrangement = Arrangement.spacedBy(4.dp)) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(2.dp) + ) { + Text( + "$moduleCount modules", + color = TextSecondary.copy(alpha = 0.5f), + fontSize = 10.sp, + modifier = Modifier.padding(end = 8.dp) + ) IconButton(onClick = onDiscord) { Icon( painter = painterResource(R.drawable.ic_discord), contentDescription = "Discord", tint = TextSecondary, - modifier = Modifier.size(20.dp) + modifier = Modifier.size(18.dp) ) } IconButton(onClick = onWebsite) { @@ -196,65 +241,169 @@ class OverlayClickGUI : OverlayWindow() { painter = painterResource(R.drawable.ic_web), contentDescription = "Website", tint = TextSecondary, - modifier = Modifier.size(20.dp) + modifier = Modifier.size(18.dp) ) } IconButton(onClick = onClose) { Icon( Icons.Rounded.Close, contentDescription = "Close", - tint = TextSecondary + tint = TextSecondary, + modifier = Modifier.size(20.dp) ) } } } } + @Composable + private fun SearchBar( + query: String, + onQueryChange: (String) -> Unit, + onClear: () -> Unit + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 4.dp), + verticalAlignment = Alignment.CenterVertically + ) { + TextField( + value = query, + onValueChange = onQueryChange, + modifier = Modifier + .fillMaxWidth() + .height(36.dp), + placeholder = { + Text( + "Search modules...", + color = TextSecondary.copy(alpha = 0.4f), + fontSize = 12.sp + ) + }, + leadingIcon = { + Icon( + Icons.Rounded.Search, + contentDescription = "Search", + tint = TextSecondary.copy(alpha = 0.4f), + modifier = Modifier.size(16.dp) + ) + }, + trailingIcon = { + if (query.isNotEmpty()) { + IconButton( + onClick = onClear, + modifier = Modifier.size(20.dp) + ) { + Icon( + Icons.Rounded.Close, + contentDescription = "Clear", + tint = TextSecondary.copy(alpha = 0.4f), + modifier = Modifier.size(14.dp) + ) + } + } + }, + singleLine = true, + shape = RoundedCornerShape(8.dp), + colors = TextFieldDefaults.colors( + focusedContainerColor = SearchBackground, + unfocusedContainerColor = SearchBackground, + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + cursorColor = AccentPrimary, + focusedTextColor = TextPrimary, + unfocusedTextColor = TextPrimary, + focusedPlaceholderColor = TextSecondary.copy(alpha = 0.3f), + unfocusedPlaceholderColor = TextSecondary.copy(alpha = 0.3f) + ), + textStyle = androidx.compose.ui.text.TextStyle( + fontSize = 13.sp, + color = TextPrimary + ) + ) + } + } + @OptIn(ExperimentalAnimationApi::class) @Composable - private fun MainArea(snackbarHostState: SnackbarHostState) { + private fun MainArea() { Row( modifier = Modifier .fillMaxSize() - .padding(16.dp), - horizontalArrangement = Arrangement.spacedBy(16.dp) + .padding(start = 16.dp, end = 16.dp, bottom = 16.dp, top = 4.dp), + horizontalArrangement = Arrangement.spacedBy(12.dp) ) { CategorySidebar() Box( modifier = Modifier .fillMaxSize() .background(DarkBackground, RoundedCornerShape(12.dp)) - .padding(20.dp) + .padding(16.dp) ) { AnimatedContent( - targetState = selectedModuleCategory, + targetState = selectedModuleCategory to searchQuery, transitionSpec = { fadeIn(tween(200)) + slideInHorizontally { it / 3 } togetherWith fadeOut(tween(200)) + slideOutHorizontally { -it / 3 } }, label = "CategoryContent" - ) { category -> + ) { (category, _) -> if (category == ModuleCategory.Config) { - ConfigurationScreen(snackbarHostState = snackbarHostState) + ConfigurationScreen(snackbarHostState = remember { androidx.compose.material3.SnackbarHostState() }) } else { - ModuleContent(category) + if (searchQuery.isNotBlank()) { + FilteredModuleContent(category = category, query = searchQuery) + } else { + ModuleContent(category) + } } } } } } + @Composable + private fun FilteredModuleContent( + category: ModuleCategory, + query: String + ) { + val context = LocalContext.current + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + "Search results for \"$query\" in ${category.displayName}", + color = TextSecondary.copy(alpha = 0.5f), + fontSize = 12.sp, + textAlign = TextAlign.Center + ) + } + } + @Composable private fun CategorySidebar() { val categories = remember { ModuleCategory.entries } + val infiniteTransition = rememberInfiniteTransition(label = "sidebar_glow") + val glowAlpha by infiniteTransition.animateFloat( + initialValue = 0.3f, + targetValue = 0.7f, + animationSpec = infiniteRepeatable( + animation = tween(2500, easing = FastOutSlowInEasing), + repeatMode = RepeatMode.Reverse + ), + label = "sidebar_glow_alpha" + ) LazyColumn( modifier = Modifier - .width(68.dp) + .width(72.dp) .fillMaxHeight() .background(SidebarBackground, RoundedCornerShape(12.dp)) - .padding(vertical = 12.dp, horizontal = 6.dp), - verticalArrangement = Arrangement.spacedBy(8.dp), + .padding(vertical = 12.dp, horizontal = 4.dp), + verticalArrangement = Arrangement.spacedBy(6.dp), horizontalAlignment = Alignment.CenterHorizontally ) { items(categories.size) { index -> @@ -262,7 +411,11 @@ class OverlayClickGUI : OverlayWindow() { CategoryIcon( category = category, isSelected = selectedModuleCategory == category, - onClick = { selectedModuleCategory = category } + glowAlpha = if (selectedModuleCategory == category) glowAlpha else 0.3f, + onClick = { + selectedModuleCategory = category + searchQuery = "" + } ) } } @@ -272,38 +425,39 @@ class OverlayClickGUI : OverlayWindow() { private fun CategoryIcon( category: ModuleCategory, isSelected: Boolean, + glowAlpha: Float, onClick: () -> Unit ) { val scale by animateFloatAsState( - targetValue = if (isSelected) 1.05f else 1f, - animationSpec = spring(dampingRatio = 0.7f), + targetValue = if (isSelected) 1.08f else 1f, + animationSpec = spring(dampingRatio = 0.6f, stiffness = Spring.StiffnessMedium), label = "catScale" ) Column( horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(4.dp), + verticalArrangement = Arrangement.spacedBy(3.dp), modifier = Modifier.clickable { onClick() } ) { Box( modifier = Modifier - .size(44.dp) + .size(46.dp) .scale(scale) .background( - if (isSelected) ButtonBackground else Color.Transparent, + if (isSelected) AccentPrimary.copy(alpha = 0.15f) else Color.Transparent, RoundedCornerShape(10.dp) ), contentAlignment = Alignment.Center ) { Icon( painter = painterResource(category.iconResId), - contentDescription = category.name, - tint = if (isSelected) AccentPrimary else Color(0xFF666666), + contentDescription = category.displayName, + tint = if (isSelected) AccentPrimary.copy(alpha = glowAlpha) else TextSecondary.copy(alpha = 0.4f), modifier = Modifier.size(20.dp) ) } Text( - text = category.name, - color = if (isSelected) AccentPrimary else Color(0xFF666666), + text = category.displayName, + color = if (isSelected) AccentPrimary else TextSecondary.copy(alpha = 0.4f), fontSize = 9.sp, fontWeight = if (isSelected) FontWeight.SemiBold else FontWeight.Normal, maxLines = 1, @@ -311,4 +465,4 @@ class OverlayClickGUI : OverlayWindow() { ) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/retrivedmods/wclient/router/main/HomePage.kt b/app/src/main/java/com/retrivedmods/wclient/router/main/HomePage.kt index 66bf4f3..8c99daf 100644 --- a/app/src/main/java/com/retrivedmods/wclient/router/main/HomePage.kt +++ b/app/src/main/java/com/retrivedmods/wclient/router/main/HomePage.kt @@ -106,7 +106,7 @@ import com.retrivedmods.wclient.service.Services import com.retrivedmods.wclient.ui.component.WButton import com.retrivedmods.wclient.ui.component.WFloatingActionButton import com.retrivedmods.wclient.ui.component.WGlassCard -import com.retrivedmods.wclient.ui.component.authId +import com.retrivedmods.wclient.ui.component.youtubeAuthId import com.retrivedmods.wclient.ui.theme.WColors import com.retrivedmods.wclient.util.LocalSnackbarHostState import com.retrivedmods.wclient.util.MinecraftUtils @@ -738,7 +738,7 @@ private fun HomeLinksRow() { ) { WGlassCard( onClick = { - val intent = Intent(Intent.ACTION_VIEW, "https://www.youtube.com/channel/$authId".toUri()) + val intent = Intent(Intent.ACTION_VIEW, "https://www.youtube.com/channel/$youtubeAuthId".toUri()) context.startActivity(intent) }, modifier = Modifier.fillMaxWidth(), diff --git a/app/src/main/java/com/retrivedmods/wclient/ui/component/AuthWebView.kt b/app/src/main/java/com/retrivedmods/wclient/ui/component/AuthWebView.kt index 0506046..ce98cb7 100644 --- a/app/src/main/java/com/retrivedmods/wclient/ui/component/AuthWebView.kt +++ b/app/src/main/java/com/retrivedmods/wclient/ui/component/AuthWebView.kt @@ -14,9 +14,8 @@ import net.raphimc.minecraftauth.MinecraftAuth import net.raphimc.minecraftauth.step.msa.StepMsaDeviceCode import kotlin.concurrent.thread -val auth = "UCxb4pcHvdYpqv7i5Xt9mOUw" - -val authId = "$auth" +val youtubeChannelId = "UCxb4pcHvdYpqv7i5Xt9mOUw" +val youtubeAuthId = "$youtubeChannelId" @SuppressLint("SetJavaScriptEnabled") diff --git a/app/src/main/java/com/retrivedmods/wclient/ui/component/LoadingScreen.kt b/app/src/main/java/com/retrivedmods/wclient/ui/component/LoadingScreen.kt deleted file mode 100644 index 5dce2e2..0000000 --- a/app/src/main/java/com/retrivedmods/wclient/ui/component/LoadingScreen.kt +++ /dev/null @@ -1,261 +0,0 @@ -package com.retrivedmods.wclient.ui.component - -import androidx.compose.animation.core.* -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Text -import androidx.compose.runtime.* -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.* -import androidx.compose.ui.geometry.CornerRadius -import androidx.compose.ui.geometry.Offset -import androidx.compose.ui.geometry.Size -import androidx.compose.ui.graphics.* -import androidx.compose.ui.graphics.drawscope.DrawScope -import androidx.compose.ui.graphics.drawscope.Stroke -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import kotlinx.coroutines.delay -import kotlin.math.PI -import kotlin.math.cos -import kotlin.math.sin - -@Composable -fun LoadingScreen(onDone: () -> Unit) { - var progress by remember { mutableStateOf(0f) } - - val animatedProgress by animateFloatAsState( - targetValue = progress, - animationSpec = tween(durationMillis = 50, easing = FastOutSlowInEasing), - label = "ProgressAnimation" - ) - - LaunchedEffect(Unit) { - val loadingSteps = listOf( - 0f to 15f, 15f to 35f, 35f to 65f, 65f to 85f, 85f to 100f - ) - for ((start, end) in loadingSteps) { - val steps = (end - start).toInt() - val delayTime = when { - start < 15f -> 45L - start < 65f -> 25L - else -> 60L - } - repeat(steps) { - delay(delayTime) - progress = start + it + 1f - } - } - delay(800) - onDone() - } - - val backgroundColor = Color(0xFF0A0A0A) - val primaryColor = Color(0xFFD32F2F) - val secondaryColor = Color(0xFFFF6B6B) - - val infiniteTransition = rememberInfiniteTransition(label = "InfiniteAnimations") - - val glowIntensity by infiniteTransition.animateFloat( - initialValue = 0.3f, - targetValue = 1f, - animationSpec = infiniteRepeatable( - animation = tween(1200, easing = FastOutSlowInEasing), - repeatMode = RepeatMode.Reverse - ), - label = "GlowIntensity" - ) - - val breathingScale by infiniteTransition.animateFloat( - initialValue = 0.98f, - targetValue = 1.02f, - animationSpec = infiniteRepeatable( - animation = tween(2000, easing = FastOutSlowInEasing), - repeatMode = RepeatMode.Reverse - ), - label = "BreathingScale" - ) - - val shimmerOffset by infiniteTransition.animateFloat( - initialValue = -200f, - targetValue = 200f, - animationSpec = infiniteRepeatable( - animation = tween(2500, easing = LinearEasing), - repeatMode = RepeatMode.Restart - ), - label = "ShimmerOffset" - ) - - val particleOffset by infiniteTransition.animateFloat( - initialValue = 0f, - targetValue = 20f, - animationSpec = infiniteRepeatable( - animation = tween(3000, easing = FastOutSlowInEasing), - repeatMode = RepeatMode.Reverse - ), - label = "ParticleOffset" - ) - - val textGlow by infiniteTransition.animateFloat( - initialValue = 0.6f, - targetValue = 1f, - animationSpec = infiniteRepeatable( - animation = tween(1800, easing = FastOutSlowInEasing), - repeatMode = RepeatMode.Reverse - ), - label = "TextGlow" - ) - - Box( - modifier = Modifier - .fillMaxSize() - .background( - Brush.radialGradient( - colors = listOf(backgroundColor, Color(0xFF1A1A1A)), - radius = 800f - ) - ) - .drawBehind { - drawFloatingParticles( - color = primaryColor.copy(alpha = 0.1f), - offset = particleOffset, - size = size - ) - }, - contentAlignment = Alignment.Center - ) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center, - ) { - Text( - text = "WClient", - fontSize = 36.sp, - fontWeight = FontWeight.Black, - color = primaryColor.copy(alpha = textGlow), - modifier = Modifier - .padding(bottom = 50.dp) - .scale(breathingScale) - .drawBehind { - drawCircle( - color = primaryColor.copy(alpha = glowIntensity * 0.3f), - radius = 80f, - center = center - ) - drawCircle( - color = primaryColor.copy(alpha = glowIntensity * 0.15f), - radius = 120f, - center = center - ) - }, - textAlign = TextAlign.Center - ) - - Box( - modifier = Modifier - .width(280.dp) - .height(16.dp) - .clip(RoundedCornerShape(50)) - .background(Color.White.copy(alpha = 0.08f)) - .drawBehind { - drawRoundRect( - color = primaryColor.copy(alpha = glowIntensity * 0.2f), - topLeft = Offset(-2f, -2f), - size = Size(size.width + 4f, size.height + 4f), - cornerRadius = CornerRadius(50f), - style = Stroke(width = 2.dp.toPx()) - ) - } - ) { - Box( - modifier = Modifier - .fillMaxHeight() - .fillMaxWidth(animatedProgress / 100f) - .clip(RoundedCornerShape(50)) - .background( - Brush.horizontalGradient( - colors = listOf( - primaryColor.copy(alpha = 0.9f), - secondaryColor.copy(alpha = glowIntensity), - primaryColor.copy(alpha = 0.9f) - ), - startX = shimmerOffset - 100f, - endX = shimmerOffset + 100f - ) - ) - .drawBehind { - drawRoundRect( - color = Color.White.copy(alpha = 0.3f), - size = Size(width = size.width, height = size.height * 0.4f), - cornerRadius = CornerRadius(50f) - ) - } - ) - } - - val displayProgress by animateIntAsState( - targetValue = animatedProgress.toInt(), - animationSpec = tween(100, easing = FastOutSlowInEasing), - label = "ProgressCounter" - ) - - Text( - text = "$displayProgress%", - fontSize = 14.sp, - fontWeight = FontWeight.Medium, - color = primaryColor.copy(alpha = 0.8f), - modifier = Modifier - .padding(top = 20.dp) - .alpha(0.9f), - textAlign = TextAlign.Center - ) - - val loadingText = when { - displayProgress < 15 -> "Initializing..." - displayProgress < 35 -> "Loading assets..." - displayProgress < 65 -> "Processing..." - displayProgress < 85 -> "Finalizing..." - displayProgress < 100 -> "Almost ready..." - else -> "Complete!" - } - - Text( - text = loadingText, - fontSize = 12.sp, - fontWeight = FontWeight.Normal, - color = Color.White.copy(alpha = 0.6f), - modifier = Modifier - .padding(top = 8.dp) - .alpha(0.7f), - textAlign = TextAlign.Center - ) - } - } -} - -private fun DrawScope.drawFloatingParticles( - color: Color, - offset: Float, - size: Size -) { - val particleCount = 6 - val centerX = size.width / 2f - val centerY = size.height / 2f - - repeat(particleCount) { i -> - val angle = ((i * 60f) + (offset * 2f)) * (PI / 180f) - val radius = 100f + sin(offset * 0.1f + i) * 20f - val x = centerX + cos(angle) * radius - val y = centerY + sin(angle) * radius - - drawCircle( - color = color, - radius = 3f + sin(offset * 0.15f + i) * 1f, - center = Offset(x.toFloat(), y.toFloat()) - ) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/retrivedmods/wclient/ui/component/VerificationDialog.kt b/app/src/main/java/com/retrivedmods/wclient/ui/component/VerificationDialog.kt index cdb0f55..8e05b21 100644 --- a/app/src/main/java/com/retrivedmods/wclient/ui/component/VerificationDialog.kt +++ b/app/src/main/java/com/retrivedmods/wclient/ui/component/VerificationDialog.kt @@ -1,182 +1,2 @@ +// Verification dialog removed - WClient now opens directly without app-level authentication package com.retrivedmods.wclient.ui.component - -import android.content.ClipData -import android.content.ClipboardManager -import android.content.Context -import android.widget.Toast -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.verticalScroll -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ContentCopy -import androidx.compose.material3.* -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import androidx.compose.ui.window.Dialog -import androidx.compose.ui.window.DialogProperties - -@Composable -fun VerificationDialog( - wclientId: String, - onVerifyClick: () -> Unit -) { - val context = LocalContext.current - val scrollState = rememberScrollState() - - Dialog( - onDismissRequest = { }, - properties = DialogProperties( - dismissOnBackPress = false, - dismissOnClickOutside = false, - usePlatformDefaultWidth = false - ) - ) { - Card( - modifier = Modifier - .fillMaxWidth(0.9f) - .wrapContentHeight() - .padding(16.dp), - shape = RoundedCornerShape(16.dp), - colors = CardDefaults.cardColors( - containerColor = Color(0xFF1E1E1E) - ) - ) { - Column( - modifier = Modifier - .fillMaxWidth() - .wrapContentHeight() - .verticalScroll(scrollState) - .padding(20.dp), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(12.dp) - ) { - Text( - text = "WClient Verification", - fontSize = 22.sp, - fontWeight = FontWeight.Bold, - color = Color.White, - textAlign = TextAlign.Center, - modifier = Modifier.fillMaxWidth(), - maxLines = 2, - overflow = TextOverflow.Ellipsis - ) - - HorizontalDivider( - modifier = Modifier.fillMaxWidth(), - color = Color.Gray.copy(alpha = 0.3f), - thickness = 1.dp - ) - - Spacer(modifier = Modifier.height(4.dp)) - - Text( - text = "Your WClient ID", - fontSize = 13.sp, - color = Color.Gray, - textAlign = TextAlign.Center, - modifier = Modifier.fillMaxWidth() - ) - - Box( - modifier = Modifier - .fillMaxWidth() - .wrapContentHeight() - .background( - color = Color(0xFF2A2A2A), - shape = RoundedCornerShape(8.dp) - ) - .padding(12.dp) - ) { - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - Text( - text = wclientId, - fontSize = 14.sp, - fontWeight = FontWeight.Medium, - color = Color(0xFFAF4C4C), - modifier = Modifier - .weight(1f) - .padding(end = 8.dp), - textAlign = TextAlign.Start, - maxLines = 2, - overflow = TextOverflow.Ellipsis, - lineHeight = 18.sp - ) - - IconButton( - onClick = { - val clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - val clip = ClipData.newPlainText("WClient ID", wclientId) - clipboardManager.setPrimaryClip(clip) - Toast.makeText( - context, - "WClient ID copied", - Toast.LENGTH_SHORT - ).show() - }, - modifier = Modifier.size(40.dp) - ) { - Icon( - imageVector = Icons.Default.ContentCopy, - contentDescription = "Copy WClient ID", - tint = Color.White, - modifier = Modifier.size(20.dp) - ) - } - } - } - - Spacer(modifier = Modifier.height(8.dp)) - - Button( - onClick = onVerifyClick, - modifier = Modifier - .fillMaxWidth() - .heightIn(min = 50.dp, max = 56.dp), - colors = ButtonDefaults.buttonColors( - containerColor = Color(0xFFFF0B0B) - ), - shape = RoundedCornerShape(12.dp), - contentPadding = PaddingValues(horizontal = 16.dp, vertical = 12.dp) - ) { - Text( - text = "Verify Now", - fontSize = 17.sp, - fontWeight = FontWeight.SemiBold, - color = Color.White, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - } - - Text( - text = "Complete the verification to access WClient for 4 hours", - fontSize = 11.sp, - color = Color.Gray, - textAlign = TextAlign.Center, - modifier = Modifier - .fillMaxWidth() - .padding(top = 4.dp, start = 8.dp, end = 8.dp), - lineHeight = 14.sp, - maxLines = 3, - overflow = TextOverflow.Ellipsis - ) - - Spacer(modifier = Modifier.height(4.dp)) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/retrivedmods/wclient/ui/component/WComponents.kt b/app/src/main/java/com/retrivedmods/wclient/ui/component/WComponents.kt index adb5f0c..2c30f1a 100644 --- a/app/src/main/java/com/retrivedmods/wclient/ui/component/WComponents.kt +++ b/app/src/main/java/com/retrivedmods/wclient/ui/component/WComponents.kt @@ -1,20 +1,37 @@ package com.retrivedmods.wclient.ui.component +import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.* import androidx.compose.foundation.background import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Close +import androidx.compose.material.icons.rounded.Search import androidx.compose.material3.* import androidx.compose.runtime.* +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import com.retrivedmods.wclient.ui.theme.WColors /** @@ -183,4 +200,265 @@ fun WFloatingActionButton( elevation = elevation, content = content ) -} \ No newline at end of file +} + +/** + * WSearchBar - A dark-themed search field with glow effect + */ +@Composable +fun WSearchBar( + query: String, + onQueryChange: (String) -> Unit, + modifier: Modifier = Modifier, + placeholder: String = "Search...", + onSearch: (() -> Unit)? = null, + enabled: Boolean = true +) { + TextField( + value = query, + onValueChange = onQueryChange, + modifier = modifier + .fillMaxWidth() + .heightIn(min = 40.dp), + placeholder = { + Text( + placeholder, + color = WColors.OnSurfaceVariant.copy(alpha = 0.4f), + fontSize = 13.sp + ) + }, + leadingIcon = { + Icon( + Icons.Rounded.Search, + contentDescription = "Search", + tint = WColors.OnSurfaceVariant.copy(alpha = 0.5f), + modifier = Modifier.size(18.dp) + ) + }, + trailingIcon = { + if (query.isNotEmpty()) { + IconButton( + onClick = { onQueryChange("") }, + modifier = Modifier.size(24.dp) + ) { + Icon( + Icons.Rounded.Close, + contentDescription = "Clear", + tint = WColors.OnSurfaceVariant.copy(alpha = 0.5f), + modifier = Modifier.size(16.dp) + ) + } + } + }, + singleLine = true, + enabled = enabled, + shape = RoundedCornerShape(10.dp), + colors = TextFieldDefaults.colors( + focusedContainerColor = WColors.SurfaceVariant, + unfocusedContainerColor = WColors.SurfaceVariant, + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + cursorColor = WColors.Primary, + focusedTextColor = WColors.OnSurface, + unfocusedTextColor = WColors.OnSurface, + focusedPlaceholderColor = WColors.OnSurfaceVariant.copy(alpha = 0.4f), + unfocusedPlaceholderColor = WColors.OnSurfaceVariant.copy(alpha = 0.4f), + disabledTextColor = WColors.OnSurfaceVariant.copy(alpha = 0.5f), + disabledContainerColor = WColors.SurfaceVariant.copy(alpha = 0.5f) + ), + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), + keyboardActions = KeyboardActions( + onSearch = { onSearch?.invoke() } + ), + textStyle = TextStyle( + fontSize = 13.sp, + color = WColors.OnSurface + ) + ) +} + +/** + * WBadge - A small badge/chip for displaying counts, status, or labels + */ +@Composable +fun WBadge( + text: String, + modifier: Modifier = Modifier, + color: Color = WColors.Primary, + textColor: Color = WColors.OnPrimary, + size: Dp = 18.dp, + fontSize: Dp = 10.dp +) { + Box( + modifier = modifier + .sizeIn(minWidth = size, minHeight = size) + .background(color.copy(alpha = 0.9f), CircleShape) + .padding(horizontal = 5.dp, vertical = 1.dp), + contentAlignment = Alignment.Center + ) { + Text( + text = text, + color = textColor, + fontSize = fontSize.sp, + fontWeight = FontWeight.Bold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + textAlign = TextAlign.Center + ) + } +} + +/** + * WSliderSetting - A labeled slider with current value display + */ +@Composable +fun WSliderSetting( + label: String, + value: Float, + onValueChange: (Float) -> Unit, + modifier: Modifier = Modifier, + valueRange: ClosedFloatingPointRange = 0f..10f, + steps: Int = 0, + suffix: String = "", + description: String? = null +) { + Column( + modifier = modifier + .fillMaxWidth() + .padding(vertical = 4.dp), + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Column { + Text( + text = label, + style = MaterialTheme.typography.bodyMedium, + color = WColors.OnSurface, + fontWeight = FontWeight.Medium + ) + if (description != null) { + Text( + text = description, + style = MaterialTheme.typography.bodySmall, + color = WColors.OnSurfaceVariant.copy(alpha = 0.7f), + fontSize = 11.sp + ) + } + } + Text( + text = "${value.toInt()}$suffix", + style = MaterialTheme.typography.bodySmall, + color = WColors.Primary, + fontWeight = FontWeight.SemiBold + ) + } + Slider( + value = value, + onValueChange = onValueChange, + valueRange = valueRange, + steps = steps, + colors = SliderDefaults.colors( + thumbColor = WColors.Primary, + activeTrackColor = WColors.Primary, + inactiveTrackColor = WColors.SurfaceVariant, + activeTickColor = WColors.Primary.copy(alpha = 0.5f), + inactiveTickColor = WColors.SurfaceVariant.copy(alpha = 0.5f) + ) + ) + } +} + +/** + * WToggleSetting - A labeled toggle switch with description + */ +@Composable +fun WToggleSetting( + label: String, + checked: Boolean, + onCheckedChange: (Boolean) -> Unit, + modifier: Modifier = Modifier, + description: String? = null, + enabled: Boolean = true +) { + val thumbColor by animateColorAsState( + targetValue = if (checked) WColors.Primary else WColors.OnSurfaceVariant.copy(alpha = 0.5f), + animationSpec = tween(200), + label = "toggle_thumb" + ) + val trackColor by animateColorAsState( + targetValue = if (checked) WColors.Primary.copy(alpha = 0.3f) else WColors.SurfaceVariant, + animationSpec = tween(200), + label = "toggle_track" + ) + + Row( + modifier = modifier + .fillMaxWidth() + .clickable(enabled) { onCheckedChange(!checked) } + .padding(vertical = 8.dp, horizontal = 4.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Column( + modifier = Modifier.weight(1f) + ) { + Text( + text = label, + style = MaterialTheme.typography.bodyMedium, + color = if (enabled) WColors.OnSurface else WColors.OnSurfaceVariant.copy(alpha = 0.5f), + fontWeight = FontWeight.Medium + ) + if (description != null) { + Text( + text = description, + style = MaterialTheme.typography.bodySmall, + color = WColors.OnSurfaceVariant.copy(alpha = 0.7f), + fontSize = 11.sp + ) + } + } + Switch( + checked = checked, + onCheckedChange = onCheckedChange, + enabled = enabled, + colors = SwitchDefaults.colors( + checkedThumbColor = thumbColor, + checkedTrackColor = trackColor, + uncheckedThumbColor = thumbColor, + uncheckedTrackColor = trackColor, + checkedBorderColor = Color.Transparent, + uncheckedBorderColor = WColors.Border.copy(alpha = 0.5f) + ) + ) + } +} + +/** + * WDivider - A styled horizontal divider with gradient + */ +@Composable +fun WDivider( + modifier: Modifier = Modifier, + color: Color = WColors.Primary, + thickness: Dp = 1.dp, + alpha: Float = 0.2f +) { + Box( + modifier = modifier + .fillMaxWidth() + .height(thickness) + .background( + Brush.horizontalGradient( + colors = listOf( + Color.Transparent, + color.copy(alpha = alpha), + Color.Transparent + ) + ) + ) + ) +} diff --git a/app/src/main/java/com/retrivedmods/wclient/ui/theme/Theme.kt b/app/src/main/java/com/retrivedmods/wclient/ui/theme/Theme.kt index 4135d23..bade19b 100644 --- a/app/src/main/java/com/retrivedmods/wclient/ui/theme/Theme.kt +++ b/app/src/main/java/com/retrivedmods/wclient/ui/theme/Theme.kt @@ -17,75 +17,98 @@ import androidx.compose.ui.unit.sp object WColors { - // Primary reds - val Primary = Color(0xFFEF4444) - val PrimaryLight = Color(0xFFF87171) - val PrimaryDark = Color(0xFFDC2626) + // Primary - vibrant neon red + val Primary = Color(0xFFFF1744) + val PrimaryLight = Color(0xFFFF616F) + val PrimaryDark = Color(0xFFC4001D) + val PrimaryGlow = Color(0xFFFF1744).copy(alpha = 0.15f) val OnPrimary = Color(0xFFFFFFFF) - // Secondary for contrast (cool slate) - val Secondary = Color(0xFF64748B) - val SecondaryVariant = Color(0xFF475569) - val SecondaryLight = Color(0xFF94A3B8) + // Secondary - cyberpunk purple + val Secondary = Color(0xFF7C4DFF) + val SecondaryVariant = Color(0xFF651FFF) + val SecondaryLight = Color(0xFFB388FF) + val SecondaryGlow = Color(0xFF7C4DFF).copy(alpha = 0.12f) val OnSecondary = Color(0xFFFFFFFF) - // Accent red/pink for glow effects - val Accent = Color(0xFFF43F5E) - val AccentLight = Color(0xFFFB7185) - val AccentDark = Color(0xFFBE123C) + // Accent - hot pink / neon + val Accent = Color(0xFFFF4081) + val AccentLight = Color(0xFFFF80AB) + val AccentDark = Color(0xFFC51162) + val AccentGlow = Color(0xFFFF4081).copy(alpha = 0.12f) + // Background - deeper dark with subtle blue tint + val Background = Color(0xFF08080D) + val Surface = Color(0xFF0E0D14) + val SurfaceVariant = Color(0xFF1A1822) + val SurfaceContainer = Color(0xFF131119) - val Background = Color(0xFF0B0A10) - val Surface = Color(0xFF121016) - val SurfaceVariant = Color(0xFF1D1A22) - val SurfaceContainer = Color(0xFF17141C) - + // Text val OnBackground = Color(0xFFF8FAFC) - val OnSurface = Color(0xFFE2E8F0) - val OnSurfaceVariant = Color(0xFF9AA3B2) - - val Error = Color(0xFFFF4D4D) - val ErrorLight = Color(0xFFFF8080) - - val Border = Color(0xFF2B2631) - val BorderLight = Color(0xFF3A3441) + val OnSurface = Color(0xFFE8EAED) + val OnSurfaceVariant = Color(0xFF9CA3B0) + + // Semantic + val Error = Color(0xFFFF1744) + val ErrorLight = Color(0xFFFF616F) + val Success = Color(0xFF00E676) + val SuccessLight = Color(0xFF69F0AE) + val Warning = Color(0xFFFFAB00) + val WarningLight = Color(0xFFFFD740) + val Info = Color(0xFF40C4FF) + val InfoLight = Color(0xFF80D8FF) + + // UI + val Border = Color(0xFF2B2635) + val BorderLight = Color(0xFF3D3648) val Overlay = Color(0x80000000) - - val MinimapBackground = Color(0xCC000000) - val MinimapGrid = Color(0x66A9A9A9) - val MinimapCrosshair = Color(0x80808080) + // Minimap - enhanced for visibility + val MinimapBackground = Color(0xCC050508) + val MinimapGrid = Color(0x55FFFFFF) + val MinimapCrosshair = Color(0x80FFFFFF) val MinimapPlayerMarker = Color(0xFFFFFFFF) - val MinimapNorth = Color(0xFFEF4444) // match primary red - val MinimapEntityClose = Color(0xFFFF3B3B) - val MinimapEntityFar = Color(0xFFFFD166) - val MinimapZoom = 1.0f - val MinimapDotSize = 5 + val MinimapNorth = Color(0xFFFF1744) + val MinimapEntityClose = Color(0xFFFF1744) + val MinimapEntityFar = Color(0xFFFFAB00) + val MinimapZoom = 1.2f + val MinimapDotSize = 6 } object ClickGUIColors { - val PrimaryBackground = Color(0xFF0B0B11) - val SecondaryBackground = Color(0xFF14131B) + val PrimaryBackground = Color(0xFF08080D) + val SecondaryBackground = Color(0xFF110F18) val AccentColor = WColors.Primary val AccentColorVariant = WColors.AccentLight val PrimaryText = Color(0xFFFFFFFF) - val SecondaryText = Color(0xFF9AA3B2) + val SecondaryText = Color(0xFF9CA3B0) - val PanelBackground = Color(0xF014131A) - val PanelBorder = Color(0x60EF4444) + val PanelBackground = Color(0xF0100E16) + val PanelBorder = Color(0x60FF1744) val ModuleEnabled = AccentColor - val ModuleDisabled = Color(0xFF23222B) + val ModuleDisabled = Color(0xFF1F1D28) + val ModuleHover = Color(0xFF2A2535) - val SliderTrack = Color(0xFF2C2933) + val SliderTrack = Color(0xFF282530) val SliderThumb = AccentColor val SliderFill = AccentColor val CheckboxBorder = AccentColor val CheckboxFill = AccentColor + + val CategoryActive = AccentColor + val CategoryInactive = Color(0xFF5A5468) + + val SearchBackground = Color(0xFF14121C) + val SearchText = Color(0xFFE8EAED) + val SearchHint = Color(0xFF6B6478) + + val ScrollbarTrack = Color(0xFF1A1822) + val ScrollbarThumb = Color(0xFF3D3648) } private val WDarkColorScheme = darkColorScheme( diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 From f7610292f9399592cf43b756fa3488e6a825bda9 Mon Sep 17 00:00:00 2001 From: Davi Vida <245532981+davivida661-collab@users.noreply.github.com> Date: Sun, 19 Jul 2026 16:46:40 +0000 Subject: [PATCH 06/19] fix: compilation errors - imports, Spring reference, Dp type --- .../retrivedmods/wclient/activity/MainActivity.kt | 3 ++- .../wclient/overlay/gui/classic/OverlayClickGUI.kt | 12 +++--------- .../retrivedmods/wclient/ui/component/WComponents.kt | 2 +- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/retrivedmods/wclient/activity/MainActivity.kt b/app/src/main/java/com/retrivedmods/wclient/activity/MainActivity.kt index b7631a6..bbfe8d3 100644 --- a/app/src/main/java/com/retrivedmods/wclient/activity/MainActivity.kt +++ b/app/src/main/java/com/retrivedmods/wclient/activity/MainActivity.kt @@ -1,6 +1,7 @@ package com.retrivedmods.wclient.activity import android.Manifest +import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.content.pm.PackageManager @@ -74,7 +75,7 @@ class MainActivity : ComponentActivity() { if (!powerManager.isIgnoringBatteryOptimizations(packageName)) { startActivity( Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply { - data = "package:$packageName".toUri() + data = Uri.parse("package:$packageName") } ) } diff --git a/app/src/main/java/com/retrivedmods/wclient/overlay/gui/classic/OverlayClickGUI.kt b/app/src/main/java/com/retrivedmods/wclient/overlay/gui/classic/OverlayClickGUI.kt index fb7477b..2422a9f 100644 --- a/app/src/main/java/com/retrivedmods/wclient/overlay/gui/classic/OverlayClickGUI.kt +++ b/app/src/main/java/com/retrivedmods/wclient/overlay/gui/classic/OverlayClickGUI.kt @@ -6,13 +6,7 @@ import android.os.Build import android.view.WindowManager import androidx.compose.animation.AnimatedContent import androidx.compose.animation.ExperimentalAnimationApi -import androidx.compose.animation.core.animateFloatAsState -import androidx.compose.animation.core.rememberInfiniteTransition -import androidx.compose.animation.core.spring -import androidx.compose.animation.core.tween -import androidx.compose.animation.core.infiniteRepeatable -import androidx.compose.animation.core.RepeatMode -import androidx.compose.animation.core.FastOutSlowInEasing +import androidx.compose.animation.core.* import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInHorizontally @@ -178,7 +172,7 @@ class OverlayClickGUI : OverlayWindow() { val glowAlpha by infiniteTransition.animateFloat( initialValue = 0.4f, targetValue = 0.8f, - animationSpec = infiniteRepeatable( + animationSpec = infiniteRepeatable( animation = tween(2000, easing = FastOutSlowInEasing), repeatMode = RepeatMode.Reverse ), @@ -390,7 +384,7 @@ class OverlayClickGUI : OverlayWindow() { val glowAlpha by infiniteTransition.animateFloat( initialValue = 0.3f, targetValue = 0.7f, - animationSpec = infiniteRepeatable( + animationSpec = infiniteRepeatable( animation = tween(2500, easing = FastOutSlowInEasing), repeatMode = RepeatMode.Reverse ), diff --git a/app/src/main/java/com/retrivedmods/wclient/ui/component/WComponents.kt b/app/src/main/java/com/retrivedmods/wclient/ui/component/WComponents.kt index 2c30f1a..01fb5f0 100644 --- a/app/src/main/java/com/retrivedmods/wclient/ui/component/WComponents.kt +++ b/app/src/main/java/com/retrivedmods/wclient/ui/component/WComponents.kt @@ -287,7 +287,7 @@ fun WBadge( color: Color = WColors.Primary, textColor: Color = WColors.OnPrimary, size: Dp = 18.dp, - fontSize: Dp = 10.dp + fontSize: Int = 10 ) { Box( modifier = modifier From f447e61038909754c905ebbc944b9b1084c65480 Mon Sep 17 00:00:00 2001 From: Davi Vida <245532981+davivida661-collab@users.noreply.github.com> Date: Sun, 19 Jul 2026 17:02:59 +0000 Subject: [PATCH 07/19] fix: OverlayClickGUI module count calculation, add ModuleManager import --- .../wclient/overlay/gui/classic/OverlayClickGUI.kt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/retrivedmods/wclient/overlay/gui/classic/OverlayClickGUI.kt b/app/src/main/java/com/retrivedmods/wclient/overlay/gui/classic/OverlayClickGUI.kt index 2422a9f..f0efce0 100644 --- a/app/src/main/java/com/retrivedmods/wclient/overlay/gui/classic/OverlayClickGUI.kt +++ b/app/src/main/java/com/retrivedmods/wclient/overlay/gui/classic/OverlayClickGUI.kt @@ -55,6 +55,7 @@ import androidx.compose.ui.unit.sp import com.retrivedmods.wclient.R import com.retrivedmods.wclient.game.ModuleCategory import com.retrivedmods.wclient.game.ModuleContent +import com.retrivedmods.wclient.game.ModuleManager import com.retrivedmods.wclient.overlay.OverlayManager import com.retrivedmods.wclient.overlay.OverlayWindow import com.retrivedmods.wclient.ui.theme.WColors @@ -127,11 +128,7 @@ class OverlayClickGUI : OverlayWindow() { modifier = Modifier.fillMaxSize() ) { HeaderBar( - moduleCount = ModuleCategory.entries.sumOf { category -> - if (category == ModuleCategory.Config) 0 else { - runCatching { ModuleContent(category).let { 0 } }.getOrDefault(0) - } - }, + moduleCount = ModuleManager.modules.count { !it.private }, onDiscord = { context.startActivity( Intent( From ddd21ab2f9a935109da5d5439eb00ef93e418d69 Mon Sep 17 00:00:00 2001 From: Davi Vida <245532981+davivida661-collab@users.noreply.github.com> Date: Sun, 19 Jul 2026 17:17:28 +0000 Subject: [PATCH 08/19] feat: protocol 1001 support + 50 new modules (10 per category) --- .../main/assets/mcpedata/blocks/index.json | 3 +-- .../blocks/runtime_block_states_1001.dat | Bin 0 -> 73771 bytes app/src/main/assets/mcpedata/items/index.json | 2 +- .../items/runtime_item_states_1001.json | 1 + .../game/module/combat/AutoArmorModule.kt | 20 +++++++++++++++++ .../game/module/combat/AutoSoupModule.kt | 11 +++++++++ .../game/module/combat/AutoWeaponModule.kt | 11 +++++++++ .../game/module/combat/BlockClutchModule.kt | 12 ++++++++++ .../game/module/combat/BowAimbotModule.kt | 14 ++++++++++++ .../game/module/combat/CriticalsModule.kt | 16 +++++++++++++ .../module/combat/SuperKnockbackModule.kt | 11 +++++++++ .../game/module/combat/VelocityModule.kt | 21 ++++++++++++++++++ .../wclient/game/module/combat/WTapModule.kt | 11 +++++++++ .../wclient/game/module/misc/AntiAFKModule.kt | 20 +++++++++++++++++ .../game/module/misc/AutoToolModule.kt | 10 +++++++++ .../wclient/game/module/misc/DerpModule.kt | 20 +++++++++++++++++ .../game/module/misc/FastPlaceModule.kt | 10 +++++++++ .../module/misc/InventoryCleanerModule.kt | 11 +++++++++ .../wclient/game/module/misc/MCFModule.kt | 10 +++++++++ .../wclient/game/module/misc/NoFallModule.kt | 18 +++++++++++++++ .../game/module/misc/NoRotateModule.kt | 17 ++++++++++++++ .../game/module/misc/PingSpoofModule.kt | 10 +++++++++ .../wclient/game/module/misc/TimerModule.kt | 15 +++++++++++++ .../game/module/motion/AutoSprintModule.kt | 11 +++++++++ .../wclient/game/module/motion/BlinkModule.kt | 12 ++++++++++ .../game/module/motion/ClickTPModule.kt | 11 +++++++++ .../wclient/game/module/motion/DashModule.kt | 12 ++++++++++ .../wclient/game/module/motion/GlideModule.kt | 11 +++++++++ .../game/module/motion/IceSpeedModule.kt | 11 +++++++++ .../game/module/motion/InvWalkModule.kt | 11 +++++++++ .../game/module/motion/LongJumpModule.kt | 11 +++++++++ .../wclient/game/module/motion/StepModule.kt | 11 +++++++++ .../game/module/motion/WallClimbModule.kt | 11 +++++++++ .../game/module/visual/AmbienceModule.kt | 11 +++++++++ .../game/module/visual/AnimationsModule.kt | 11 +++++++++ .../wclient/game/module/visual/ChamsModule.kt | 11 +++++++++ .../game/module/visual/ChunkBordersModule.kt | 11 +++++++++ .../game/module/visual/ClearWaterModule.kt | 10 +++++++++ .../game/module/visual/FOVSliderModule.kt | 11 +++++++++ .../game/module/visual/ItemESPModule.kt | 11 +++++++++ .../game/module/visual/NameTagsModule.kt | 12 ++++++++++ .../game/module/visual/NoWeatherModule.kt | 10 +++++++++ .../game/module/visual/TracersModule.kt | 12 ++++++++++ .../game/module/world/AutoBuilderModule.kt | 11 +++++++++ .../game/module/world/AutoFarmModule.kt | 11 +++++++++ .../game/module/world/AutoFishModule.kt | 16 +++++++++++++ .../game/module/world/AutoMineModule.kt | 10 +++++++++ .../game/module/world/ChestESPModule.kt | 11 +++++++++ .../game/module/world/FastBreakModule.kt | 10 +++++++++ .../wclient/game/module/world/NukerModule.kt | 11 +++++++++ .../game/module/world/PortalClickerModule.kt | 10 +++++++++ .../game/module/world/ScaffoldModule.kt | 11 +++++++++ .../wclient/game/module/world/XRayModule.kt | 12 ++++++++++ .../wrelay/codec/CodecRegistry.kt | 1 + .../wrelay/codec/VersionDetector.kt | 1 + relay/src/main/resources/protocol_mapping.txt | 3 ++- 56 files changed, 610 insertions(+), 4 deletions(-) create mode 100644 app/src/main/assets/mcpedata/blocks/runtime_block_states_1001.dat create mode 100644 app/src/main/assets/mcpedata/items/runtime_item_states_1001.json create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoArmorModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoSoupModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoWeaponModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/combat/BlockClutchModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/combat/BowAimbotModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/combat/CriticalsModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/combat/SuperKnockbackModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/combat/VelocityModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/combat/WTapModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/misc/AntiAFKModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/misc/AutoToolModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/misc/DerpModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/misc/FastPlaceModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/misc/InventoryCleanerModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/misc/MCFModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/misc/NoFallModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/misc/NoRotateModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/misc/PingSpoofModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/misc/TimerModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/motion/AutoSprintModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/motion/BlinkModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/motion/ClickTPModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/motion/DashModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/motion/GlideModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/motion/IceSpeedModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/motion/InvWalkModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/motion/LongJumpModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/motion/StepModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/motion/WallClimbModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/visual/AmbienceModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/visual/AnimationsModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/visual/ChamsModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/visual/ChunkBordersModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/visual/ClearWaterModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/visual/FOVSliderModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/visual/ItemESPModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/visual/NameTagsModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/visual/NoWeatherModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/visual/TracersModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoBuilderModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoFarmModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoFishModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoMineModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/world/ChestESPModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/world/FastBreakModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/world/NukerModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/world/PortalClickerModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/world/ScaffoldModule.kt create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/world/XRayModule.kt diff --git a/app/src/main/assets/mcpedata/blocks/index.json b/app/src/main/assets/mcpedata/blocks/index.json index a1a30b4..7338f74 100644 --- a/app/src/main/assets/mcpedata/blocks/index.json +++ b/app/src/main/assets/mcpedata/blocks/index.json @@ -1,2 +1 @@ -[388,389,407,419,428,440,448,465,471,486,503,527,544,560,567,575,582,589,594,618,622,630,649,662,671,685,712,729,748,766,776,786,800] - +[388,389,407,419,428,440,448,465,471,486,503,527,544,560,567,575,582,589,594,618,622,630,649,662,671,685,712,729,748,766,776,786,800,1001] diff --git a/app/src/main/assets/mcpedata/blocks/runtime_block_states_1001.dat b/app/src/main/assets/mcpedata/blocks/runtime_block_states_1001.dat new file mode 100644 index 0000000000000000000000000000000000000000..e501e4b47f5a0cdd0643cdc33ec60caae9b6a909 GIT binary patch literal 73771 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

q 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 PBLVfGn#-=Js6hV*xGbF6 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/mcpedata/items/index.json b/app/src/main/assets/mcpedata/items/index.json index 90e87c9..682e8f4 100644 --- a/app/src/main/assets/mcpedata/items/index.json +++ b/app/src/main/assets/mcpedata/items/index.json @@ -1 +1 @@ -[361,419,440,448,475,486,503,527,534,560,567,575,582,589,594,618,630,649,662,671,685,712,729,748,766,776,786,800] +[361,419,440,448,475,486,503,527,534,560,567,575,582,589,594,618,630,649,662,671,685,712,729,748,766,776,786,800,1001] \ No newline at end of file diff --git a/app/src/main/assets/mcpedata/items/runtime_item_states_1001.json b/app/src/main/assets/mcpedata/items/runtime_item_states_1001.json new file mode 100644 index 0000000..511a604 --- /dev/null +++ b/app/src/main/assets/mcpedata/items/runtime_item_states_1001.json @@ -0,0 +1 @@ +[{"name":"minecraft:acacia_boat","id":405,"version":2,"componentBased":false},{"name":"minecraft:acacia_button","id":-140,"version":2,"componentBased":false},{"name":"minecraft:acacia_chest_boat","id":679,"version":2,"componentBased":false},{"name":"minecraft:acacia_door","id":589,"version":2,"componentBased":false},{"name":"minecraft:acacia_double_slab","id":-812,"version":2,"componentBased":false},{"name":"minecraft:acacia_fence","id":-575,"version":2,"componentBased":false},{"name":"minecraft:acacia_fence_gate","id":187,"version":2,"componentBased":false},{"name":"minecraft:acacia_hanging_sign","id":-504,"version":2,"componentBased":false},{"name":"minecraft:acacia_leaves","id":161,"version":2,"componentBased":false},{"name":"minecraft:acacia_log","id":162,"version":2,"componentBased":false},{"name":"minecraft:acacia_planks","id":-742,"version":2,"componentBased":false},{"name":"minecraft:acacia_pressure_plate","id":-150,"version":2,"componentBased":false},{"name":"minecraft:acacia_sapling","id":-828,"version":2,"componentBased":false},{"name":"minecraft:acacia_sign","id":612,"version":2,"componentBased":false},{"name":"minecraft:acacia_slab","id":-807,"version":2,"componentBased":false},{"name":"minecraft:acacia_stairs","id":163,"version":2,"componentBased":false},{"name":"minecraft:acacia_standing_sign","id":-190,"version":2,"componentBased":false},{"name":"minecraft:acacia_trapdoor","id":-145,"version":2,"componentBased":false},{"name":"minecraft:acacia_wall_sign","id":-191,"version":2,"componentBased":false},{"name":"minecraft:acacia_wood","id":-817,"version":2,"componentBased":false},{"name":"minecraft:activator_rail","id":126,"version":2,"componentBased":false},{"name":"minecraft:agent_spawn_egg","id":515,"version":2,"componentBased":false},{"name":"minecraft:air","id":-158,"version":2,"componentBased":false},{"name":"minecraft:allay_spawn_egg","id":668,"version":2,"componentBased":false},{"name":"minecraft:allium","id":-831,"version":2,"componentBased":false},{"name":"minecraft:allow","id":210,"version":2,"componentBased":false},{"name":"minecraft:amethyst_block","id":-327,"version":2,"componentBased":false},{"name":"minecraft:amethyst_cluster","id":-329,"version":2,"componentBased":false},{"name":"minecraft:amethyst_shard","id":661,"version":2,"componentBased":false},{"name":"minecraft:ancient_debris","id":-271,"version":2,"componentBased":false},{"name":"minecraft:andesite","id":-594,"version":2,"componentBased":false},{"name":"minecraft:andesite_double_slab","id":-920,"version":2,"componentBased":false},{"name":"minecraft:andesite_slab","id":-893,"version":2,"componentBased":false},{"name":"minecraft:andesite_stairs","id":-171,"version":2,"componentBased":false},{"name":"minecraft:andesite_wall","id":-974,"version":2,"componentBased":false},{"name":"minecraft:angler_pottery_sherd","id":693,"version":2,"componentBased":false},{"name":"minecraft:anvil","id":145,"version":2,"componentBased":false},{"name":"minecraft:apple","id":278,"version":1,"componentBased":true},{"name":"minecraft:archer_pottery_sherd","id":694,"version":2,"componentBased":false},{"name":"minecraft:armadillo_scute","id":740,"version":2,"componentBased":false},{"name":"minecraft:armadillo_spawn_egg","id":739,"version":2,"componentBased":false},{"name":"minecraft:armor_stand","id":585,"version":2,"componentBased":false},{"name":"minecraft:arms_up_pottery_sherd","id":695,"version":2,"componentBased":false},{"name":"minecraft:arrow","id":325,"version":2,"componentBased":true},{"name":"minecraft:axolotl_bucket","id":394,"version":2,"componentBased":false},{"name":"minecraft:axolotl_spawn_egg","id":530,"version":2,"componentBased":false},{"name":"minecraft:azalea","id":-337,"version":2,"componentBased":false},{"name":"minecraft:azalea_leaves","id":-324,"version":2,"componentBased":false},{"name":"minecraft:azalea_leaves_flowered","id":-325,"version":2,"componentBased":false},{"name":"minecraft:azure_bluet","id":-832,"version":2,"componentBased":false},{"name":"minecraft:baked_potato","id":303,"version":0,"componentBased":false},{"name":"minecraft:balloon","id":635,"version":2,"componentBased":false},{"name":"minecraft:bamboo","id":-163,"version":2,"componentBased":false},{"name":"minecraft:bamboo_block","id":-527,"version":2,"componentBased":false},{"name":"minecraft:bamboo_button","id":-511,"version":2,"componentBased":false},{"name":"minecraft:bamboo_chest_raft","id":691,"version":2,"componentBased":false},{"name":"minecraft:bamboo_door","id":-517,"version":2,"componentBased":false},{"name":"minecraft:bamboo_double_slab","id":-521,"version":2,"componentBased":false},{"name":"minecraft:bamboo_fence","id":-515,"version":2,"componentBased":false},{"name":"minecraft:bamboo_fence_gate","id":-516,"version":2,"componentBased":false},{"name":"minecraft:bamboo_hanging_sign","id":-522,"version":2,"componentBased":false},{"name":"minecraft:bamboo_mosaic","id":-509,"version":2,"componentBased":false},{"name":"minecraft:bamboo_mosaic_double_slab","id":-525,"version":2,"componentBased":false},{"name":"minecraft:bamboo_mosaic_slab","id":-524,"version":2,"componentBased":false},{"name":"minecraft:bamboo_mosaic_stairs","id":-523,"version":2,"componentBased":false},{"name":"minecraft:bamboo_planks","id":-510,"version":2,"componentBased":false},{"name":"minecraft:bamboo_pressure_plate","id":-514,"version":2,"componentBased":false},{"name":"minecraft:bamboo_raft","id":690,"version":2,"componentBased":false},{"name":"minecraft:bamboo_sapling","id":-164,"version":2,"componentBased":false},{"name":"minecraft:bamboo_sign","id":689,"version":2,"componentBased":false},{"name":"minecraft:bamboo_slab","id":-513,"version":2,"componentBased":false},{"name":"minecraft:bamboo_stairs","id":-512,"version":2,"componentBased":false},{"name":"minecraft:bamboo_standing_sign","id":-518,"version":2,"componentBased":false},{"name":"minecraft:bamboo_trapdoor","id":-520,"version":2,"componentBased":false},{"name":"minecraft:bamboo_wall_sign","id":-519,"version":2,"componentBased":false},{"name":"minecraft:banner","id":600,"version":2,"componentBased":false},{"name":"minecraft:banner_pattern","id":812,"version":2,"componentBased":false},{"name":"minecraft:barrel","id":-203,"version":2,"componentBased":false},{"name":"minecraft:barrier","id":-161,"version":2,"componentBased":false},{"name":"minecraft:basalt","id":-234,"version":2,"componentBased":false},{"name":"minecraft:bat_spawn_egg","id":480,"version":2,"componentBased":false},{"name":"minecraft:beacon","id":138,"version":2,"componentBased":false},{"name":"minecraft:bed","id":444,"version":2,"componentBased":false},{"name":"minecraft:bedrock","id":7,"version":2,"componentBased":false},{"name":"minecraft:bee_nest","id":-218,"version":2,"componentBased":false},{"name":"minecraft:bee_spawn_egg","id":522,"version":2,"componentBased":false},{"name":"minecraft:beef","id":295,"version":0,"componentBased":false},{"name":"minecraft:beehive","id":-219,"version":2,"componentBased":false},{"name":"minecraft:beetroot","id":307,"version":0,"componentBased":false},{"name":"minecraft:beetroot_seeds","id":317,"version":0,"componentBased":false},{"name":"minecraft:beetroot_soup","id":308,"version":0,"componentBased":false},{"name":"minecraft:bell","id":-206,"version":2,"componentBased":false},{"name":"minecraft:big_dripleaf","id":-323,"version":2,"componentBased":false},{"name":"minecraft:birch_boat","id":402,"version":2,"componentBased":false},{"name":"minecraft:birch_button","id":-141,"version":2,"componentBased":false},{"name":"minecraft:birch_chest_boat","id":676,"version":2,"componentBased":false},{"name":"minecraft:birch_door","id":587,"version":2,"componentBased":false},{"name":"minecraft:birch_double_slab","id":-810,"version":2,"componentBased":false},{"name":"minecraft:birch_fence","id":-576,"version":2,"componentBased":false},{"name":"minecraft:birch_fence_gate","id":184,"version":2,"componentBased":false},{"name":"minecraft:birch_hanging_sign","id":-502,"version":2,"componentBased":false},{"name":"minecraft:birch_leaves","id":-801,"version":2,"componentBased":false},{"name":"minecraft:birch_log","id":-570,"version":2,"componentBased":false},{"name":"minecraft:birch_planks","id":-740,"version":2,"componentBased":false},{"name":"minecraft:birch_pressure_plate","id":-151,"version":2,"componentBased":false},{"name":"minecraft:birch_sapling","id":-826,"version":2,"componentBased":false},{"name":"minecraft:birch_sign","id":610,"version":2,"componentBased":false},{"name":"minecraft:birch_slab","id":-805,"version":2,"componentBased":false},{"name":"minecraft:birch_stairs","id":135,"version":2,"componentBased":false},{"name":"minecraft:birch_standing_sign","id":-186,"version":2,"componentBased":false},{"name":"minecraft:birch_trapdoor","id":-146,"version":2,"componentBased":false},{"name":"minecraft:birch_wall_sign","id":-187,"version":2,"componentBased":false},{"name":"minecraft:birch_wood","id":-815,"version":2,"componentBased":false},{"name":"minecraft:black_bundle","id":257,"version":1,"componentBased":true},{"name":"minecraft:black_candle","id":-428,"version":2,"componentBased":false},{"name":"minecraft:black_candle_cake","id":-445,"version":2,"componentBased":false},{"name":"minecraft:black_carpet","id":-611,"version":2,"componentBased":false},{"name":"minecraft:black_concrete","id":-642,"version":2,"componentBased":false},{"name":"minecraft:black_concrete_powder","id":-723,"version":2,"componentBased":false},{"name":"minecraft:black_dye","id":421,"version":2,"componentBased":false},{"name":"minecraft:black_glazed_terracotta","id":235,"version":2,"componentBased":false},{"name":"minecraft:black_harness","id":752,"version":2,"componentBased":false},{"name":"minecraft:black_shulker_box","id":-627,"version":2,"componentBased":false},{"name":"minecraft:black_stained_glass","id":-687,"version":2,"componentBased":false},{"name":"minecraft:black_stained_glass_pane","id":-657,"version":2,"componentBased":false},{"name":"minecraft:black_terracotta","id":-738,"version":2,"componentBased":false},{"name":"minecraft:black_wool","id":-554,"version":2,"componentBased":false},{"name":"minecraft:blackstone","id":-273,"version":2,"componentBased":false},{"name":"minecraft:blackstone_double_slab","id":-283,"version":2,"componentBased":false},{"name":"minecraft:blackstone_slab","id":-282,"version":2,"componentBased":false},{"name":"minecraft:blackstone_stairs","id":-276,"version":2,"componentBased":false},{"name":"minecraft:blackstone_wall","id":-277,"version":2,"componentBased":false},{"name":"minecraft:blade_pottery_sherd","id":696,"version":2,"componentBased":false},{"name":"minecraft:blast_furnace","id":-196,"version":2,"componentBased":false},{"name":"minecraft:blaze_powder","id":456,"version":2,"componentBased":false},{"name":"minecraft:blaze_rod","id":449,"version":2,"componentBased":false},{"name":"minecraft:blaze_spawn_egg","id":483,"version":2,"componentBased":false},{"name":"minecraft:bleach","id":633,"version":2,"componentBased":false},{"name":"minecraft:blue_bundle","id":258,"version":1,"componentBased":true},{"name":"minecraft:blue_candle","id":-424,"version":2,"componentBased":false},{"name":"minecraft:blue_candle_cake","id":-441,"version":2,"componentBased":false},{"name":"minecraft:blue_carpet","id":-607,"version":2,"componentBased":false},{"name":"minecraft:blue_concrete","id":-638,"version":2,"componentBased":false},{"name":"minecraft:blue_concrete_powder","id":-719,"version":2,"componentBased":false},{"name":"minecraft:blue_dye","id":425,"version":2,"componentBased":false},{"name":"minecraft:blue_egg","id":749,"version":2,"componentBased":false},{"name":"minecraft:blue_glazed_terracotta","id":231,"version":2,"componentBased":false},{"name":"minecraft:blue_harness","id":753,"version":2,"componentBased":false},{"name":"minecraft:blue_ice","id":-11,"version":2,"componentBased":false},{"name":"minecraft:blue_orchid","id":-830,"version":2,"componentBased":false},{"name":"minecraft:blue_shulker_box","id":-623,"version":2,"componentBased":false},{"name":"minecraft:blue_stained_glass","id":-683,"version":2,"componentBased":false},{"name":"minecraft:blue_stained_glass_pane","id":-653,"version":2,"componentBased":false},{"name":"minecraft:blue_terracotta","id":-734,"version":2,"componentBased":false},{"name":"minecraft:blue_wool","id":-563,"version":2,"componentBased":false},{"name":"minecraft:board","id":629,"version":2,"componentBased":false},{"name":"minecraft:boat","id":810,"version":2,"componentBased":false},{"name":"minecraft:bogged_spawn_egg","id":490,"version":2,"componentBased":false},{"name":"minecraft:bolt_armor_trim_smithing_template","id":735,"version":2,"componentBased":false},{"name":"minecraft:bone","id":441,"version":2,"componentBased":false},{"name":"minecraft:bone_block","id":216,"version":2,"componentBased":false},{"name":"minecraft:bone_meal","id":437,"version":2,"componentBased":false},{"name":"minecraft:book","id":413,"version":2,"componentBased":false},{"name":"minecraft:bookshelf","id":47,"version":2,"componentBased":false},{"name":"minecraft:border_block","id":212,"version":2,"componentBased":false},{"name":"minecraft:bordure_indented_banner_pattern","id":619,"version":2,"componentBased":false},{"name":"minecraft:bow","id":324,"version":2,"componentBased":false},{"name":"minecraft:bowl","id":346,"version":2,"componentBased":false},{"name":"minecraft:brain_coral","id":-581,"version":2,"componentBased":false},{"name":"minecraft:brain_coral_block","id":-849,"version":2,"componentBased":false},{"name":"minecraft:brain_coral_fan","id":-840,"version":2,"componentBased":false},{"name":"minecraft:brain_coral_wall_fan","id":-904,"version":2,"componentBased":false},{"name":"minecraft:bread","id":283,"version":0,"componentBased":false},{"name":"minecraft:breeze_rod","id":274,"version":1,"componentBased":true},{"name":"minecraft:breeze_spawn_egg","id":529,"version":2,"componentBased":false},{"name":"minecraft:brewer_pottery_sherd","id":697,"version":2,"componentBased":false},{"name":"minecraft:brewing_stand","id":458,"version":2,"componentBased":true},{"name":"minecraft:brick","id":409,"version":2,"componentBased":false},{"name":"minecraft:brick_block","id":45,"version":2,"componentBased":false},{"name":"minecraft:brick_double_slab","id":-880,"version":2,"componentBased":false},{"name":"minecraft:brick_slab","id":-874,"version":2,"componentBased":false},{"name":"minecraft:brick_stairs","id":108,"version":2,"componentBased":false},{"name":"minecraft:brick_wall","id":-976,"version":2,"componentBased":false},{"name":"minecraft:brown_bundle","id":259,"version":1,"componentBased":true},{"name":"minecraft:brown_candle","id":-425,"version":2,"componentBased":false},{"name":"minecraft:brown_candle_cake","id":-442,"version":2,"componentBased":false},{"name":"minecraft:brown_carpet","id":-608,"version":2,"componentBased":false},{"name":"minecraft:brown_concrete","id":-639,"version":2,"componentBased":false},{"name":"minecraft:brown_concrete_powder","id":-720,"version":2,"componentBased":false},{"name":"minecraft:brown_dye","id":424,"version":2,"componentBased":false},{"name":"minecraft:brown_egg","id":750,"version":2,"componentBased":false},{"name":"minecraft:brown_glazed_terracotta","id":232,"version":2,"componentBased":false},{"name":"minecraft:brown_harness","id":754,"version":2,"componentBased":false},{"name":"minecraft:brown_mushroom","id":39,"version":2,"componentBased":false},{"name":"minecraft:brown_mushroom_block","id":99,"version":2,"componentBased":false},{"name":"minecraft:brown_shulker_box","id":-624,"version":2,"componentBased":false},{"name":"minecraft:brown_stained_glass","id":-684,"version":2,"componentBased":false},{"name":"minecraft:brown_stained_glass_pane","id":-654,"version":2,"componentBased":false},{"name":"minecraft:brown_terracotta","id":-735,"version":2,"componentBased":false},{"name":"minecraft:brown_wool","id":-555,"version":2,"componentBased":false},{"name":"minecraft:brush","id":716,"version":2,"componentBased":false},{"name":"minecraft:bubble_column","id":-160,"version":2,"componentBased":false},{"name":"minecraft:bubble_coral","id":-582,"version":2,"componentBased":false},{"name":"minecraft:bubble_coral_block","id":-850,"version":2,"componentBased":false},{"name":"minecraft:bubble_coral_fan","id":-841,"version":2,"componentBased":false},{"name":"minecraft:bubble_coral_wall_fan","id":-136,"version":2,"componentBased":false},{"name":"minecraft:bucket","id":385,"version":2,"componentBased":false},{"name":"minecraft:budding_amethyst","id":-328,"version":2,"componentBased":false},{"name":"minecraft:bundle","id":260,"version":1,"componentBased":true},{"name":"minecraft:burn_pottery_sherd","id":698,"version":2,"componentBased":false},{"name":"minecraft:bush","id":-1023,"version":2,"componentBased":false},{"name":"minecraft:cactus","id":81,"version":2,"componentBased":false},{"name":"minecraft:cactus_flower","id":-1030,"version":2,"componentBased":false},{"name":"minecraft:cake","id":443,"version":2,"componentBased":true},{"name":"minecraft:calcite","id":-326,"version":2,"componentBased":false},{"name":"minecraft:calibrated_sculk_sensor","id":-580,"version":2,"componentBased":false},{"name":"minecraft:camel_spawn_egg","id":692,"version":2,"componentBased":false},{"name":"minecraft:camera","id":630,"version":0,"componentBased":false},{"name":"minecraft:campfire","id":624,"version":2,"componentBased":true},{"name":"minecraft:candle","id":-412,"version":2,"componentBased":false},{"name":"minecraft:candle_cake","id":-429,"version":2,"componentBased":false},{"name":"minecraft:carpet","id":769,"version":2,"componentBased":false},{"name":"minecraft:carrot","id":301,"version":0,"componentBased":false},{"name":"minecraft:carrot_on_a_stick","id":550,"version":2,"componentBased":false},{"name":"minecraft:carrots","id":141,"version":2,"componentBased":false},{"name":"minecraft:cartography_table","id":-200,"version":2,"componentBased":false},{"name":"minecraft:carved_pumpkin","id":-155,"version":2,"componentBased":false},{"name":"minecraft:cat_spawn_egg","id":516,"version":2,"componentBased":false},{"name":"minecraft:cauldron","id":459,"version":2,"componentBased":true},{"name":"minecraft:cave_spider_spawn_egg","id":484,"version":2,"componentBased":false},{"name":"minecraft:cave_vines","id":-322,"version":2,"componentBased":false},{"name":"minecraft:cave_vines_body_with_berries","id":-375,"version":2,"componentBased":false},{"name":"minecraft:cave_vines_head_with_berries","id":-376,"version":2,"componentBased":false},{"name":"minecraft:chain","id":656,"version":2,"componentBased":true},{"name":"minecraft:chain_command_block","id":189,"version":2,"componentBased":false},{"name":"minecraft:chainmail_boots","id":367,"version":2,"componentBased":false},{"name":"minecraft:chainmail_chestplate","id":365,"version":2,"componentBased":false},{"name":"minecraft:chainmail_helmet","id":364,"version":2,"componentBased":false},{"name":"minecraft:chainmail_leggings","id":366,"version":2,"componentBased":false},{"name":"minecraft:chalkboard","id":230,"version":2,"componentBased":false},{"name":"minecraft:charcoal","id":327,"version":2,"componentBased":true},{"name":"minecraft:chemical_heat","id":192,"version":2,"componentBased":false},{"name":"minecraft:chemistry_table","id":804,"version":2,"componentBased":false},{"name":"minecraft:cherry_boat","id":686,"version":2,"componentBased":false},{"name":"minecraft:cherry_button","id":-530,"version":2,"componentBased":false},{"name":"minecraft:cherry_chest_boat","id":687,"version":2,"componentBased":false},{"name":"minecraft:cherry_door","id":-531,"version":2,"componentBased":false},{"name":"minecraft:cherry_double_slab","id":-540,"version":2,"componentBased":false},{"name":"minecraft:cherry_fence","id":-532,"version":2,"componentBased":false},{"name":"minecraft:cherry_fence_gate","id":-533,"version":2,"componentBased":false},{"name":"minecraft:cherry_hanging_sign","id":-534,"version":2,"componentBased":false},{"name":"minecraft:cherry_leaves","id":-548,"version":2,"componentBased":false},{"name":"minecraft:cherry_log","id":-536,"version":2,"componentBased":false},{"name":"minecraft:cherry_planks","id":-537,"version":2,"componentBased":false},{"name":"minecraft:cherry_pressure_plate","id":-538,"version":2,"componentBased":false},{"name":"minecraft:cherry_sapling","id":-547,"version":2,"componentBased":false},{"name":"minecraft:cherry_sign","id":688,"version":2,"componentBased":false},{"name":"minecraft:cherry_slab","id":-539,"version":2,"componentBased":false},{"name":"minecraft:cherry_stairs","id":-541,"version":2,"componentBased":false},{"name":"minecraft:cherry_standing_sign","id":-542,"version":2,"componentBased":false},{"name":"minecraft:cherry_trapdoor","id":-543,"version":2,"componentBased":false},{"name":"minecraft:cherry_wall_sign","id":-544,"version":2,"componentBased":false},{"name":"minecraft:cherry_wood","id":-546,"version":2,"componentBased":false},{"name":"minecraft:chest","id":54,"version":2,"componentBased":false},{"name":"minecraft:chest_boat","id":682,"version":2,"componentBased":false},{"name":"minecraft:chest_minecart","id":415,"version":2,"componentBased":false},{"name":"minecraft:chicken","id":297,"version":0,"componentBased":false},{"name":"minecraft:chicken_spawn_egg","id":462,"version":2,"componentBased":false},{"name":"minecraft:chipped_anvil","id":-959,"version":2,"componentBased":false},{"name":"minecraft:chiseled_bookshelf","id":-526,"version":2,"componentBased":false},{"name":"minecraft:chiseled_copper","id":-760,"version":2,"componentBased":false},{"name":"minecraft:chiseled_deepslate","id":-395,"version":2,"componentBased":false},{"name":"minecraft:chiseled_nether_bricks","id":-302,"version":2,"componentBased":false},{"name":"minecraft:chiseled_polished_blackstone","id":-279,"version":2,"componentBased":false},{"name":"minecraft:chiseled_quartz_block","id":-953,"version":2,"componentBased":false},{"name":"minecraft:chiseled_red_sandstone","id":-956,"version":2,"componentBased":false},{"name":"minecraft:chiseled_resin_bricks","id":-1020,"version":2,"componentBased":false},{"name":"minecraft:chiseled_sandstone","id":-944,"version":2,"componentBased":false},{"name":"minecraft:chiseled_stone_bricks","id":-870,"version":2,"componentBased":false},{"name":"minecraft:chiseled_tuff","id":-753,"version":2,"componentBased":false},{"name":"minecraft:chiseled_tuff_bricks","id":-759,"version":2,"componentBased":false},{"name":"minecraft:chorus_flower","id":200,"version":2,"componentBased":false},{"name":"minecraft:chorus_fruit","id":591,"version":0,"componentBased":false},{"name":"minecraft:chorus_plant","id":240,"version":2,"componentBased":false},{"name":"minecraft:clay","id":82,"version":2,"componentBased":false},{"name":"minecraft:clay_ball","id":410,"version":2,"componentBased":false},{"name":"minecraft:client_request_placeholder_block","id":-465,"version":2,"componentBased":false},{"name":"minecraft:clock","id":419,"version":2,"componentBased":false},{"name":"minecraft:closed_eyeblossom","id":-1019,"version":2,"componentBased":false},{"name":"minecraft:coal","id":326,"version":2,"componentBased":true},{"name":"minecraft:coal_block","id":173,"version":2,"componentBased":false},{"name":"minecraft:coal_ore","id":16,"version":2,"componentBased":false},{"name":"minecraft:coarse_dirt","id":-962,"version":2,"componentBased":false},{"name":"minecraft:coast_armor_trim_smithing_template","id":720,"version":2,"componentBased":false},{"name":"minecraft:cobbled_deepslate","id":-379,"version":2,"componentBased":false},{"name":"minecraft:cobbled_deepslate_double_slab","id":-396,"version":2,"componentBased":false},{"name":"minecraft:cobbled_deepslate_slab","id":-380,"version":2,"componentBased":false},{"name":"minecraft:cobbled_deepslate_stairs","id":-381,"version":2,"componentBased":false},{"name":"minecraft:cobbled_deepslate_wall","id":-382,"version":2,"componentBased":false},{"name":"minecraft:cobblestone","id":4,"version":2,"componentBased":false},{"name":"minecraft:cobblestone_double_slab","id":-879,"version":2,"componentBased":false},{"name":"minecraft:cobblestone_slab","id":-873,"version":2,"componentBased":false},{"name":"minecraft:cobblestone_wall","id":139,"version":2,"componentBased":false},{"name":"minecraft:cocoa","id":127,"version":2,"componentBased":false},{"name":"minecraft:cocoa_beans","id":438,"version":2,"componentBased":false},{"name":"minecraft:cod","id":286,"version":0,"componentBased":false},{"name":"minecraft:cod_bucket","id":389,"version":2,"componentBased":false},{"name":"minecraft:cod_spawn_egg","id":508,"version":2,"componentBased":false},{"name":"minecraft:colored_torch_blue","id":204,"version":2,"componentBased":false},{"name":"minecraft:colored_torch_bp","id":808,"version":2,"componentBased":false},{"name":"minecraft:colored_torch_green","id":-963,"version":2,"componentBased":false},{"name":"minecraft:colored_torch_purple","id":-964,"version":2,"componentBased":false},{"name":"minecraft:colored_torch_red","id":202,"version":2,"componentBased":false},{"name":"minecraft:colored_torch_rg","id":807,"version":2,"componentBased":false},{"name":"minecraft:command_block","id":137,"version":2,"componentBased":false},{"name":"minecraft:command_block_minecart","id":596,"version":2,"componentBased":false},{"name":"minecraft:comparator","id":555,"version":2,"componentBased":true},{"name":"minecraft:compass","id":417,"version":2,"componentBased":false},{"name":"minecraft:composter","id":-213,"version":2,"componentBased":false},{"name":"minecraft:compound","id":631,"version":2,"componentBased":false},{"name":"minecraft:compound_creator","id":238,"version":2,"componentBased":false},{"name":"minecraft:concrete","id":795,"version":2,"componentBased":false},{"name":"minecraft:concrete_powder","id":796,"version":2,"componentBased":false},{"name":"minecraft:conduit","id":-157,"version":2,"componentBased":false},{"name":"minecraft:cooked_beef","id":296,"version":0,"componentBased":false},{"name":"minecraft:cooked_chicken","id":298,"version":0,"componentBased":false},{"name":"minecraft:cooked_cod","id":290,"version":0,"componentBased":false},{"name":"minecraft:cooked_mutton","id":584,"version":0,"componentBased":false},{"name":"minecraft:cooked_porkchop","id":285,"version":0,"componentBased":false},{"name":"minecraft:cooked_rabbit","id":311,"version":0,"componentBased":false},{"name":"minecraft:cooked_salmon","id":291,"version":0,"componentBased":false},{"name":"minecraft:cookie","id":293,"version":0,"componentBased":false},{"name":"minecraft:copper_block","id":-340,"version":2,"componentBased":false},{"name":"minecraft:copper_bulb","id":-776,"version":2,"componentBased":false},{"name":"minecraft:copper_door","id":-784,"version":2,"componentBased":false},{"name":"minecraft:copper_grate","id":-768,"version":2,"componentBased":false},{"name":"minecraft:copper_ingot","id":538,"version":2,"componentBased":false},{"name":"minecraft:copper_ore","id":-311,"version":2,"componentBased":false},{"name":"minecraft:copper_trapdoor","id":-792,"version":2,"componentBased":false},{"name":"minecraft:coral","id":791,"version":2,"componentBased":false},{"name":"minecraft:coral_block","id":773,"version":2,"componentBased":false},{"name":"minecraft:coral_fan","id":782,"version":2,"componentBased":false},{"name":"minecraft:coral_fan_dead","id":783,"version":2,"componentBased":false},{"name":"minecraft:cornflower","id":-838,"version":2,"componentBased":false},{"name":"minecraft:cow_spawn_egg","id":463,"version":2,"componentBased":false},{"name":"minecraft:cracked_deepslate_bricks","id":-410,"version":2,"componentBased":false},{"name":"minecraft:cracked_deepslate_tiles","id":-409,"version":2,"componentBased":false},{"name":"minecraft:cracked_nether_bricks","id":-303,"version":2,"componentBased":false},{"name":"minecraft:cracked_polished_blackstone_bricks","id":-280,"version":2,"componentBased":false},{"name":"minecraft:cracked_stone_bricks","id":-869,"version":2,"componentBased":false},{"name":"minecraft:crafter","id":-313,"version":2,"componentBased":false},{"name":"minecraft:crafting_table","id":58,"version":2,"componentBased":false},{"name":"minecraft:creaking_heart","id":-1012,"version":2,"componentBased":false},{"name":"minecraft:creaking_spawn_egg","id":747,"version":2,"componentBased":false},{"name":"minecraft:creeper_banner_pattern","id":615,"version":2,"componentBased":false},{"name":"minecraft:creeper_head","id":-968,"version":2,"componentBased":false},{"name":"minecraft:creeper_spawn_egg","id":468,"version":2,"componentBased":false},{"name":"minecraft:crimson_button","id":-260,"version":2,"componentBased":false},{"name":"minecraft:crimson_door","id":653,"version":2,"componentBased":false},{"name":"minecraft:crimson_double_slab","id":-266,"version":2,"componentBased":false},{"name":"minecraft:crimson_fence","id":-256,"version":2,"componentBased":false},{"name":"minecraft:crimson_fence_gate","id":-258,"version":2,"componentBased":false},{"name":"minecraft:crimson_fungus","id":-228,"version":2,"componentBased":false},{"name":"minecraft:crimson_hanging_sign","id":-506,"version":2,"componentBased":false},{"name":"minecraft:crimson_hyphae","id":-299,"version":2,"componentBased":false},{"name":"minecraft:crimson_nylium","id":-232,"version":2,"componentBased":false},{"name":"minecraft:crimson_planks","id":-242,"version":2,"componentBased":false},{"name":"minecraft:crimson_pressure_plate","id":-262,"version":2,"componentBased":false},{"name":"minecraft:crimson_roots","id":-223,"version":2,"componentBased":false},{"name":"minecraft:crimson_sign","id":651,"version":2,"componentBased":false},{"name":"minecraft:crimson_slab","id":-264,"version":2,"componentBased":false},{"name":"minecraft:crimson_stairs","id":-254,"version":2,"componentBased":false},{"name":"minecraft:crimson_standing_sign","id":-250,"version":2,"componentBased":false},{"name":"minecraft:crimson_stem","id":-225,"version":2,"componentBased":false},{"name":"minecraft:crimson_trapdoor","id":-246,"version":2,"componentBased":false},{"name":"minecraft:crimson_wall_sign","id":-252,"version":2,"componentBased":false},{"name":"minecraft:crossbow","id":608,"version":2,"componentBased":false},{"name":"minecraft:crying_obsidian","id":-289,"version":2,"componentBased":false},{"name":"minecraft:cut_copper","id":-347,"version":2,"componentBased":false},{"name":"minecraft:cut_copper_slab","id":-361,"version":2,"componentBased":false},{"name":"minecraft:cut_copper_stairs","id":-354,"version":2,"componentBased":false},{"name":"minecraft:cut_red_sandstone","id":-957,"version":2,"componentBased":false},{"name":"minecraft:cut_red_sandstone_double_slab","id":-928,"version":2,"componentBased":false},{"name":"minecraft:cut_red_sandstone_slab","id":-901,"version":2,"componentBased":false},{"name":"minecraft:cut_sandstone","id":-945,"version":2,"componentBased":false},{"name":"minecraft:cut_sandstone_double_slab","id":-927,"version":2,"componentBased":false},{"name":"minecraft:cut_sandstone_slab","id":-900,"version":2,"componentBased":false},{"name":"minecraft:cyan_bundle","id":261,"version":1,"componentBased":true},{"name":"minecraft:cyan_candle","id":-422,"version":2,"componentBased":false},{"name":"minecraft:cyan_candle_cake","id":-439,"version":2,"componentBased":false},{"name":"minecraft:cyan_carpet","id":-605,"version":2,"componentBased":false},{"name":"minecraft:cyan_concrete","id":-636,"version":2,"componentBased":false},{"name":"minecraft:cyan_concrete_powder","id":-717,"version":2,"componentBased":false},{"name":"minecraft:cyan_dye","id":427,"version":2,"componentBased":false},{"name":"minecraft:cyan_glazed_terracotta","id":229,"version":2,"componentBased":false},{"name":"minecraft:cyan_harness","id":755,"version":2,"componentBased":false},{"name":"minecraft:cyan_shulker_box","id":-621,"version":2,"componentBased":false},{"name":"minecraft:cyan_stained_glass","id":-681,"version":2,"componentBased":false},{"name":"minecraft:cyan_stained_glass_pane","id":-651,"version":2,"componentBased":false},{"name":"minecraft:cyan_terracotta","id":-732,"version":2,"componentBased":false},{"name":"minecraft:cyan_wool","id":-561,"version":2,"componentBased":false},{"name":"minecraft:damaged_anvil","id":-960,"version":2,"componentBased":false},{"name":"minecraft:dandelion","id":37,"version":2,"componentBased":false},{"name":"minecraft:danger_pottery_sherd","id":699,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_boat","id":406,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_button","id":-142,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_chest_boat","id":680,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_door","id":590,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_double_slab","id":-813,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_fence","id":-577,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_fence_gate","id":186,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_hanging_sign","id":-505,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_leaves","id":-803,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_log","id":-572,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_planks","id":-743,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_pressure_plate","id":-152,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_sapling","id":-829,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_sign","id":613,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_slab","id":-808,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_stairs","id":164,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_trapdoor","id":-147,"version":2,"componentBased":false},{"name":"minecraft:dark_oak_wood","id":-818,"version":2,"componentBased":false},{"name":"minecraft:dark_prismarine","id":-947,"version":2,"componentBased":false},{"name":"minecraft:dark_prismarine_double_slab","id":-913,"version":2,"componentBased":false},{"name":"minecraft:dark_prismarine_slab","id":-886,"version":2,"componentBased":false},{"name":"minecraft:dark_prismarine_stairs","id":-3,"version":2,"componentBased":false},{"name":"minecraft:darkoak_standing_sign","id":-192,"version":2,"componentBased":false},{"name":"minecraft:darkoak_wall_sign","id":-193,"version":2,"componentBased":false},{"name":"minecraft:daylight_detector","id":151,"version":2,"componentBased":false},{"name":"minecraft:daylight_detector_inverted","id":178,"version":2,"componentBased":false},{"name":"minecraft:dead_brain_coral","id":-586,"version":2,"componentBased":false},{"name":"minecraft:dead_brain_coral_block","id":-854,"version":2,"componentBased":false},{"name":"minecraft:dead_brain_coral_fan","id":-844,"version":2,"componentBased":false},{"name":"minecraft:dead_brain_coral_wall_fan","id":-906,"version":2,"componentBased":false},{"name":"minecraft:dead_bubble_coral","id":-587,"version":2,"componentBased":false},{"name":"minecraft:dead_bubble_coral_block","id":-855,"version":2,"componentBased":false},{"name":"minecraft:dead_bubble_coral_fan","id":-845,"version":2,"componentBased":false},{"name":"minecraft:dead_bubble_coral_wall_fan","id":-908,"version":2,"componentBased":false},{"name":"minecraft:dead_fire_coral","id":-588,"version":2,"componentBased":false},{"name":"minecraft:dead_fire_coral_block","id":-856,"version":2,"componentBased":false},{"name":"minecraft:dead_fire_coral_fan","id":-846,"version":2,"componentBased":false},{"name":"minecraft:dead_fire_coral_wall_fan","id":-909,"version":2,"componentBased":false},{"name":"minecraft:dead_horn_coral","id":-589,"version":2,"componentBased":false},{"name":"minecraft:dead_horn_coral_block","id":-857,"version":2,"componentBased":false},{"name":"minecraft:dead_horn_coral_fan","id":-847,"version":2,"componentBased":false},{"name":"minecraft:dead_horn_coral_wall_fan","id":-910,"version":2,"componentBased":false},{"name":"minecraft:dead_tube_coral","id":-585,"version":2,"componentBased":false},{"name":"minecraft:dead_tube_coral_block","id":-853,"version":2,"componentBased":false},{"name":"minecraft:dead_tube_coral_fan","id":-134,"version":2,"componentBased":false},{"name":"minecraft:dead_tube_coral_wall_fan","id":-905,"version":2,"componentBased":false},{"name":"minecraft:deadbush","id":32,"version":2,"componentBased":false},{"name":"minecraft:decorated_pot","id":-551,"version":2,"componentBased":false},{"name":"minecraft:deepslate","id":-378,"version":2,"componentBased":false},{"name":"minecraft:deepslate_brick_double_slab","id":-399,"version":2,"componentBased":false},{"name":"minecraft:deepslate_brick_slab","id":-392,"version":2,"componentBased":false},{"name":"minecraft:deepslate_brick_stairs","id":-393,"version":2,"componentBased":false},{"name":"minecraft:deepslate_brick_wall","id":-394,"version":2,"componentBased":false},{"name":"minecraft:deepslate_bricks","id":-391,"version":2,"componentBased":false},{"name":"minecraft:deepslate_coal_ore","id":-406,"version":2,"componentBased":false},{"name":"minecraft:deepslate_copper_ore","id":-408,"version":2,"componentBased":false},{"name":"minecraft:deepslate_diamond_ore","id":-405,"version":2,"componentBased":false},{"name":"minecraft:deepslate_emerald_ore","id":-407,"version":2,"componentBased":false},{"name":"minecraft:deepslate_gold_ore","id":-402,"version":2,"componentBased":false},{"name":"minecraft:deepslate_iron_ore","id":-401,"version":2,"componentBased":false},{"name":"minecraft:deepslate_lapis_ore","id":-400,"version":2,"componentBased":false},{"name":"minecraft:deepslate_redstone_ore","id":-403,"version":2,"componentBased":false},{"name":"minecraft:deepslate_tile_double_slab","id":-398,"version":2,"componentBased":false},{"name":"minecraft:deepslate_tile_slab","id":-388,"version":2,"componentBased":false},{"name":"minecraft:deepslate_tile_stairs","id":-389,"version":2,"componentBased":false},{"name":"minecraft:deepslate_tile_wall","id":-390,"version":2,"componentBased":false},{"name":"minecraft:deepslate_tiles","id":-387,"version":2,"componentBased":false},{"name":"minecraft:deny","id":211,"version":2,"componentBased":false},{"name":"minecraft:deprecated_anvil","id":-961,"version":2,"componentBased":false},{"name":"minecraft:deprecated_purpur_block_1","id":-950,"version":2,"componentBased":false},{"name":"minecraft:deprecated_purpur_block_2","id":-952,"version":2,"componentBased":false},{"name":"minecraft:detector_rail","id":28,"version":2,"componentBased":false},{"name":"minecraft:diamond","id":328,"version":2,"componentBased":false},{"name":"minecraft:diamond_axe","id":343,"version":2,"componentBased":false},{"name":"minecraft:diamond_block","id":57,"version":2,"componentBased":false},{"name":"minecraft:diamond_boots","id":375,"version":2,"componentBased":false},{"name":"minecraft:diamond_chestplate","id":373,"version":2,"componentBased":false},{"name":"minecraft:diamond_helmet","id":372,"version":2,"componentBased":false},{"name":"minecraft:diamond_hoe","id":357,"version":2,"componentBased":false},{"name":"minecraft:diamond_horse_armor","id":566,"version":2,"componentBased":false},{"name":"minecraft:diamond_leggings","id":374,"version":2,"componentBased":false},{"name":"minecraft:diamond_ore","id":56,"version":2,"componentBased":false},{"name":"minecraft:diamond_pickaxe","id":342,"version":2,"componentBased":false},{"name":"minecraft:diamond_shovel","id":341,"version":2,"componentBased":false},{"name":"minecraft:diamond_sword","id":340,"version":2,"componentBased":false},{"name":"minecraft:diorite","id":-592,"version":2,"componentBased":false},{"name":"minecraft:diorite_double_slab","id":-921,"version":2,"componentBased":false},{"name":"minecraft:diorite_slab","id":-894,"version":2,"componentBased":false},{"name":"minecraft:diorite_stairs","id":-170,"version":2,"componentBased":false},{"name":"minecraft:diorite_wall","id":-973,"version":2,"componentBased":false},{"name":"minecraft:dirt","id":3,"version":2,"componentBased":false},{"name":"minecraft:dirt_with_roots","id":-318,"version":2,"componentBased":false},{"name":"minecraft:disc_fragment_5","id":674,"version":2,"componentBased":false},{"name":"minecraft:dispenser","id":23,"version":2,"componentBased":false},{"name":"minecraft:dolphin_spawn_egg","id":512,"version":2,"componentBased":false},{"name":"minecraft:donkey_spawn_egg","id":493,"version":2,"componentBased":false},{"name":"minecraft:double_cut_copper_slab","id":-368,"version":2,"componentBased":false},{"name":"minecraft:double_plant","id":789,"version":2,"componentBased":false},{"name":"minecraft:double_stone_block_slab","id":778,"version":2,"componentBased":false},{"name":"minecraft:double_stone_block_slab2","id":779,"version":2,"componentBased":false},{"name":"minecraft:double_stone_block_slab3","id":780,"version":2,"componentBased":false},{"name":"minecraft:double_stone_block_slab4","id":781,"version":2,"componentBased":false},{"name":"minecraft:dragon_breath","id":593,"version":2,"componentBased":false},{"name":"minecraft:dragon_egg","id":122,"version":2,"componentBased":false},{"name":"minecraft:dragon_head","id":-969,"version":2,"componentBased":false},{"name":"minecraft:dried_ghast","id":-1027,"version":2,"componentBased":false},{"name":"minecraft:dried_kelp","id":292,"version":0,"componentBased":false},{"name":"minecraft:dried_kelp_block","id":-139,"version":2,"componentBased":false},{"name":"minecraft:dripstone_block","id":-317,"version":2,"componentBased":false},{"name":"minecraft:dropper","id":125,"version":2,"componentBased":false},{"name":"minecraft:drowned_spawn_egg","id":511,"version":2,"componentBased":false},{"name":"minecraft:dune_armor_trim_smithing_template","id":719,"version":2,"componentBased":false},{"name":"minecraft:dye","id":811,"version":2,"componentBased":false},{"name":"minecraft:echo_shard","id":684,"version":2,"componentBased":false},{"name":"minecraft:egg","id":416,"version":2,"componentBased":false},{"name":"minecraft:elder_guardian_spawn_egg","id":499,"version":2,"componentBased":false},{"name":"minecraft:element_0","id":36,"version":2,"componentBased":false},{"name":"minecraft:element_1","id":-12,"version":2,"componentBased":false},{"name":"minecraft:element_10","id":-21,"version":2,"componentBased":false},{"name":"minecraft:element_100","id":-111,"version":2,"componentBased":false},{"name":"minecraft:element_101","id":-112,"version":2,"componentBased":false},{"name":"minecraft:element_102","id":-113,"version":2,"componentBased":false},{"name":"minecraft:element_103","id":-114,"version":2,"componentBased":false},{"name":"minecraft:element_104","id":-115,"version":2,"componentBased":false},{"name":"minecraft:element_105","id":-116,"version":2,"componentBased":false},{"name":"minecraft:element_106","id":-117,"version":2,"componentBased":false},{"name":"minecraft:element_107","id":-118,"version":2,"componentBased":false},{"name":"minecraft:element_108","id":-119,"version":2,"componentBased":false},{"name":"minecraft:element_109","id":-120,"version":2,"componentBased":false},{"name":"minecraft:element_11","id":-22,"version":2,"componentBased":false},{"name":"minecraft:element_110","id":-121,"version":2,"componentBased":false},{"name":"minecraft:element_111","id":-122,"version":2,"componentBased":false},{"name":"minecraft:element_112","id":-123,"version":2,"componentBased":false},{"name":"minecraft:element_113","id":-124,"version":2,"componentBased":false},{"name":"minecraft:element_114","id":-125,"version":2,"componentBased":false},{"name":"minecraft:element_115","id":-126,"version":2,"componentBased":false},{"name":"minecraft:element_116","id":-127,"version":2,"componentBased":false},{"name":"minecraft:element_117","id":-128,"version":2,"componentBased":false},{"name":"minecraft:element_118","id":-129,"version":2,"componentBased":false},{"name":"minecraft:element_12","id":-23,"version":2,"componentBased":false},{"name":"minecraft:element_13","id":-24,"version":2,"componentBased":false},{"name":"minecraft:element_14","id":-25,"version":2,"componentBased":false},{"name":"minecraft:element_15","id":-26,"version":2,"componentBased":false},{"name":"minecraft:element_16","id":-27,"version":2,"componentBased":false},{"name":"minecraft:element_17","id":-28,"version":2,"componentBased":false},{"name":"minecraft:element_18","id":-29,"version":2,"componentBased":false},{"name":"minecraft:element_19","id":-30,"version":2,"componentBased":false},{"name":"minecraft:element_2","id":-13,"version":2,"componentBased":false},{"name":"minecraft:element_20","id":-31,"version":2,"componentBased":false},{"name":"minecraft:element_21","id":-32,"version":2,"componentBased":false},{"name":"minecraft:element_22","id":-33,"version":2,"componentBased":false},{"name":"minecraft:element_23","id":-34,"version":2,"componentBased":false},{"name":"minecraft:element_24","id":-35,"version":2,"componentBased":false},{"name":"minecraft:element_25","id":-36,"version":2,"componentBased":false},{"name":"minecraft:element_26","id":-37,"version":2,"componentBased":false},{"name":"minecraft:element_27","id":-38,"version":2,"componentBased":false},{"name":"minecraft:element_28","id":-39,"version":2,"componentBased":false},{"name":"minecraft:element_29","id":-40,"version":2,"componentBased":false},{"name":"minecraft:element_3","id":-14,"version":2,"componentBased":false},{"name":"minecraft:element_30","id":-41,"version":2,"componentBased":false},{"name":"minecraft:element_31","id":-42,"version":2,"componentBased":false},{"name":"minecraft:element_32","id":-43,"version":2,"componentBased":false},{"name":"minecraft:element_33","id":-44,"version":2,"componentBased":false},{"name":"minecraft:element_34","id":-45,"version":2,"componentBased":false},{"name":"minecraft:element_35","id":-46,"version":2,"componentBased":false},{"name":"minecraft:element_36","id":-47,"version":2,"componentBased":false},{"name":"minecraft:element_37","id":-48,"version":2,"componentBased":false},{"name":"minecraft:element_38","id":-49,"version":2,"componentBased":false},{"name":"minecraft:element_39","id":-50,"version":2,"componentBased":false},{"name":"minecraft:element_4","id":-15,"version":2,"componentBased":false},{"name":"minecraft:element_40","id":-51,"version":2,"componentBased":false},{"name":"minecraft:element_41","id":-52,"version":2,"componentBased":false},{"name":"minecraft:element_42","id":-53,"version":2,"componentBased":false},{"name":"minecraft:element_43","id":-54,"version":2,"componentBased":false},{"name":"minecraft:element_44","id":-55,"version":2,"componentBased":false},{"name":"minecraft:element_45","id":-56,"version":2,"componentBased":false},{"name":"minecraft:element_46","id":-57,"version":2,"componentBased":false},{"name":"minecraft:element_47","id":-58,"version":2,"componentBased":false},{"name":"minecraft:element_48","id":-59,"version":2,"componentBased":false},{"name":"minecraft:element_49","id":-60,"version":2,"componentBased":false},{"name":"minecraft:element_5","id":-16,"version":2,"componentBased":false},{"name":"minecraft:element_50","id":-61,"version":2,"componentBased":false},{"name":"minecraft:element_51","id":-62,"version":2,"componentBased":false},{"name":"minecraft:element_52","id":-63,"version":2,"componentBased":false},{"name":"minecraft:element_53","id":-64,"version":2,"componentBased":false},{"name":"minecraft:element_54","id":-65,"version":2,"componentBased":false},{"name":"minecraft:element_55","id":-66,"version":2,"componentBased":false},{"name":"minecraft:element_56","id":-67,"version":2,"componentBased":false},{"name":"minecraft:element_57","id":-68,"version":2,"componentBased":false},{"name":"minecraft:element_58","id":-69,"version":2,"componentBased":false},{"name":"minecraft:element_59","id":-70,"version":2,"componentBased":false},{"name":"minecraft:element_6","id":-17,"version":2,"componentBased":false},{"name":"minecraft:element_60","id":-71,"version":2,"componentBased":false},{"name":"minecraft:element_61","id":-72,"version":2,"componentBased":false},{"name":"minecraft:element_62","id":-73,"version":2,"componentBased":false},{"name":"minecraft:element_63","id":-74,"version":2,"componentBased":false},{"name":"minecraft:element_64","id":-75,"version":2,"componentBased":false},{"name":"minecraft:element_65","id":-76,"version":2,"componentBased":false},{"name":"minecraft:element_66","id":-77,"version":2,"componentBased":false},{"name":"minecraft:element_67","id":-78,"version":2,"componentBased":false},{"name":"minecraft:element_68","id":-79,"version":2,"componentBased":false},{"name":"minecraft:element_69","id":-80,"version":2,"componentBased":false},{"name":"minecraft:element_7","id":-18,"version":2,"componentBased":false},{"name":"minecraft:element_70","id":-81,"version":2,"componentBased":false},{"name":"minecraft:element_71","id":-82,"version":2,"componentBased":false},{"name":"minecraft:element_72","id":-83,"version":2,"componentBased":false},{"name":"minecraft:element_73","id":-84,"version":2,"componentBased":false},{"name":"minecraft:element_74","id":-85,"version":2,"componentBased":false},{"name":"minecraft:element_75","id":-86,"version":2,"componentBased":false},{"name":"minecraft:element_76","id":-87,"version":2,"componentBased":false},{"name":"minecraft:element_77","id":-88,"version":2,"componentBased":false},{"name":"minecraft:element_78","id":-89,"version":2,"componentBased":false},{"name":"minecraft:element_79","id":-90,"version":2,"componentBased":false},{"name":"minecraft:element_8","id":-19,"version":2,"componentBased":false},{"name":"minecraft:element_80","id":-91,"version":2,"componentBased":false},{"name":"minecraft:element_81","id":-92,"version":2,"componentBased":false},{"name":"minecraft:element_82","id":-93,"version":2,"componentBased":false},{"name":"minecraft:element_83","id":-94,"version":2,"componentBased":false},{"name":"minecraft:element_84","id":-95,"version":2,"componentBased":false},{"name":"minecraft:element_85","id":-96,"version":2,"componentBased":false},{"name":"minecraft:element_86","id":-97,"version":2,"componentBased":false},{"name":"minecraft:element_87","id":-98,"version":2,"componentBased":false},{"name":"minecraft:element_88","id":-99,"version":2,"componentBased":false},{"name":"minecraft:element_89","id":-100,"version":2,"componentBased":false},{"name":"minecraft:element_9","id":-20,"version":2,"componentBased":false},{"name":"minecraft:element_90","id":-101,"version":2,"componentBased":false},{"name":"minecraft:element_91","id":-102,"version":2,"componentBased":false},{"name":"minecraft:element_92","id":-103,"version":2,"componentBased":false},{"name":"minecraft:element_93","id":-104,"version":2,"componentBased":false},{"name":"minecraft:element_94","id":-105,"version":2,"componentBased":false},{"name":"minecraft:element_95","id":-106,"version":2,"componentBased":false},{"name":"minecraft:element_96","id":-107,"version":2,"componentBased":false},{"name":"minecraft:element_97","id":-108,"version":2,"componentBased":false},{"name":"minecraft:element_98","id":-109,"version":2,"componentBased":false},{"name":"minecraft:element_99","id":-110,"version":2,"componentBased":false},{"name":"minecraft:element_constructor","id":-987,"version":2,"componentBased":false},{"name":"minecraft:elytra","id":597,"version":2,"componentBased":false},{"name":"minecraft:emerald","id":546,"version":2,"componentBased":false},{"name":"minecraft:emerald_block","id":133,"version":2,"componentBased":false},{"name":"minecraft:emerald_ore","id":129,"version":2,"componentBased":false},{"name":"minecraft:empty_map","id":549,"version":2,"componentBased":false},{"name":"minecraft:enchanted_book","id":554,"version":2,"componentBased":false},{"name":"minecraft:enchanted_golden_apple","id":281,"version":0,"componentBased":false},{"name":"minecraft:enchanting_table","id":116,"version":2,"componentBased":false},{"name":"minecraft:end_brick_stairs","id":-178,"version":2,"componentBased":false},{"name":"minecraft:end_bricks","id":206,"version":2,"componentBased":false},{"name":"minecraft:end_crystal","id":814,"version":2,"componentBased":false},{"name":"minecraft:end_gateway","id":209,"version":2,"componentBased":false},{"name":"minecraft:end_portal","id":119,"version":2,"componentBased":false},{"name":"minecraft:end_portal_frame","id":120,"version":2,"componentBased":false},{"name":"minecraft:end_rod","id":208,"version":2,"componentBased":false},{"name":"minecraft:end_stone","id":121,"version":2,"componentBased":false},{"name":"minecraft:end_stone_brick_double_slab","id":-167,"version":2,"componentBased":false},{"name":"minecraft:end_stone_brick_slab","id":-162,"version":2,"componentBased":false},{"name":"minecraft:end_stone_brick_wall","id":-980,"version":2,"componentBased":false},{"name":"minecraft:ender_chest","id":130,"version":2,"componentBased":false},{"name":"minecraft:ender_dragon_spawn_egg","id":535,"version":2,"componentBased":false},{"name":"minecraft:ender_eye","id":460,"version":2,"componentBased":false},{"name":"minecraft:ender_pearl","id":448,"version":2,"componentBased":false},{"name":"minecraft:enderman_spawn_egg","id":469,"version":2,"componentBased":false},{"name":"minecraft:endermite_spawn_egg","id":487,"version":2,"componentBased":false},{"name":"minecraft:evoker_spawn_egg","id":503,"version":2,"componentBased":false},{"name":"minecraft:experience_bottle","id":542,"version":2,"componentBased":false},{"name":"minecraft:explorer_pottery_sherd","id":700,"version":2,"componentBased":false},{"name":"minecraft:exposed_chiseled_copper","id":-761,"version":2,"componentBased":false},{"name":"minecraft:exposed_copper","id":-341,"version":2,"componentBased":false},{"name":"minecraft:exposed_copper_bulb","id":-777,"version":2,"componentBased":false},{"name":"minecraft:exposed_copper_door","id":-785,"version":2,"componentBased":false},{"name":"minecraft:exposed_copper_grate","id":-769,"version":2,"componentBased":false},{"name":"minecraft:exposed_copper_trapdoor","id":-793,"version":2,"componentBased":false},{"name":"minecraft:exposed_cut_copper","id":-348,"version":2,"componentBased":false},{"name":"minecraft:exposed_cut_copper_slab","id":-362,"version":2,"componentBased":false},{"name":"minecraft:exposed_cut_copper_stairs","id":-355,"version":2,"componentBased":false},{"name":"minecraft:exposed_double_cut_copper_slab","id":-369,"version":2,"componentBased":false},{"name":"minecraft:eye_armor_trim_smithing_template","id":723,"version":2,"componentBased":false},{"name":"minecraft:farmland","id":60,"version":2,"componentBased":false},{"name":"minecraft:feather","id":352,"version":2,"componentBased":false},{"name":"minecraft:fence","id":771,"version":2,"componentBased":false},{"name":"minecraft:fence_gate","id":107,"version":2,"componentBased":false},{"name":"minecraft:fermented_spider_eye","id":455,"version":2,"componentBased":false},{"name":"minecraft:fern","id":-848,"version":2,"componentBased":false},{"name":"minecraft:field_masoned_banner_pattern","id":618,"version":2,"componentBased":false},{"name":"minecraft:filled_map","id":446,"version":2,"componentBased":false},{"name":"minecraft:fire","id":51,"version":2,"componentBased":false},{"name":"minecraft:fire_charge","id":543,"version":2,"componentBased":false},{"name":"minecraft:fire_coral","id":-583,"version":2,"componentBased":false},{"name":"minecraft:fire_coral_block","id":-851,"version":2,"componentBased":false},{"name":"minecraft:fire_coral_fan","id":-842,"version":2,"componentBased":false},{"name":"minecraft:fire_coral_wall_fan","id":-907,"version":2,"componentBased":false},{"name":"minecraft:firefly_bush","id":-1025,"version":2,"componentBased":false},{"name":"minecraft:firework_rocket","id":552,"version":2,"componentBased":false},{"name":"minecraft:firework_star","id":553,"version":2,"componentBased":false},{"name":"minecraft:fishing_rod","id":418,"version":2,"componentBased":true},{"name":"minecraft:fletching_table","id":-201,"version":2,"componentBased":false},{"name":"minecraft:flint","id":381,"version":2,"componentBased":false},{"name":"minecraft:flint_and_steel","id":323,"version":2,"componentBased":false},{"name":"minecraft:flow_armor_trim_smithing_template","id":734,"version":2,"componentBased":false},{"name":"minecraft:flow_banner_pattern","id":622,"version":2,"componentBased":false},{"name":"minecraft:flow_pottery_sherd","id":701,"version":2,"componentBased":false},{"name":"minecraft:flower_banner_pattern","id":614,"version":2,"componentBased":false},{"name":"minecraft:flower_pot","id":548,"version":2,"componentBased":true},{"name":"minecraft:flowering_azalea","id":-338,"version":2,"componentBased":false},{"name":"minecraft:flowing_lava","id":10,"version":2,"componentBased":false},{"name":"minecraft:flowing_water","id":8,"version":2,"componentBased":false},{"name":"minecraft:fox_spawn_egg","id":518,"version":2,"componentBased":false},{"name":"minecraft:frame","id":547,"version":2,"componentBased":true},{"name":"minecraft:friend_pottery_sherd","id":702,"version":2,"componentBased":false},{"name":"minecraft:frog_spawn","id":-468,"version":2,"componentBased":false},{"name":"minecraft:frog_spawn_egg","id":665,"version":2,"componentBased":false},{"name":"minecraft:frosted_ice","id":207,"version":2,"componentBased":false},{"name":"minecraft:furnace","id":61,"version":2,"componentBased":false},{"name":"minecraft:ghast_spawn_egg","id":481,"version":2,"componentBased":false},{"name":"minecraft:ghast_tear","id":451,"version":2,"componentBased":false},{"name":"minecraft:gilded_blackstone","id":-281,"version":2,"componentBased":false},{"name":"minecraft:glass","id":20,"version":2,"componentBased":false},{"name":"minecraft:glass_bottle","id":454,"version":2,"componentBased":false},{"name":"minecraft:glass_pane","id":102,"version":2,"componentBased":false},{"name":"minecraft:glistering_melon_slice","id":461,"version":2,"componentBased":false},{"name":"minecraft:globe_banner_pattern","id":621,"version":2,"componentBased":false},{"name":"minecraft:glow_berries","id":815,"version":0,"componentBased":false},{"name":"minecraft:glow_frame","id":660,"version":2,"componentBased":true},{"name":"minecraft:glow_ink_sac","id":537,"version":2,"componentBased":false},{"name":"minecraft:glow_lichen","id":-411,"version":2,"componentBased":false},{"name":"minecraft:glow_squid_spawn_egg","id":532,"version":2,"componentBased":false},{"name":"minecraft:glow_stick","id":638,"version":2,"componentBased":false},{"name":"minecraft:glowingobsidian","id":246,"version":2,"componentBased":false},{"name":"minecraft:glowstone","id":89,"version":2,"componentBased":false},{"name":"minecraft:glowstone_dust","id":420,"version":2,"componentBased":false},{"name":"minecraft:goat_horn","id":664,"version":2,"componentBased":false},{"name":"minecraft:goat_spawn_egg","id":531,"version":2,"componentBased":false},{"name":"minecraft:gold_block","id":41,"version":2,"componentBased":false},{"name":"minecraft:gold_ingot","id":330,"version":2,"componentBased":false},{"name":"minecraft:gold_nugget","id":452,"version":2,"componentBased":false},{"name":"minecraft:gold_ore","id":14,"version":2,"componentBased":false},{"name":"minecraft:golden_apple","id":280,"version":0,"componentBased":false},{"name":"minecraft:golden_axe","id":350,"version":2,"componentBased":false},{"name":"minecraft:golden_boots","id":379,"version":2,"componentBased":false},{"name":"minecraft:golden_carrot","id":305,"version":0,"componentBased":false},{"name":"minecraft:golden_chestplate","id":377,"version":2,"componentBased":false},{"name":"minecraft:golden_helmet","id":376,"version":2,"componentBased":false},{"name":"minecraft:golden_hoe","id":358,"version":2,"componentBased":false},{"name":"minecraft:golden_horse_armor","id":565,"version":2,"componentBased":false},{"name":"minecraft:golden_leggings","id":378,"version":2,"componentBased":false},{"name":"minecraft:golden_pickaxe","id":349,"version":2,"componentBased":false},{"name":"minecraft:golden_rail","id":27,"version":2,"componentBased":false},{"name":"minecraft:golden_shovel","id":348,"version":2,"componentBased":false},{"name":"minecraft:golden_sword","id":347,"version":2,"componentBased":false},{"name":"minecraft:granite","id":-590,"version":2,"componentBased":false},{"name":"minecraft:granite_double_slab","id":-923,"version":2,"componentBased":false},{"name":"minecraft:granite_slab","id":-896,"version":2,"componentBased":false},{"name":"minecraft:granite_stairs","id":-169,"version":2,"componentBased":false},{"name":"minecraft:granite_wall","id":-972,"version":2,"componentBased":false},{"name":"minecraft:grass_block","id":2,"version":2,"componentBased":false},{"name":"minecraft:grass_path","id":198,"version":2,"componentBased":false},{"name":"minecraft:gravel","id":13,"version":2,"componentBased":false},{"name":"minecraft:gray_bundle","id":262,"version":1,"componentBased":true},{"name":"minecraft:gray_candle","id":-420,"version":2,"componentBased":false},{"name":"minecraft:gray_candle_cake","id":-437,"version":2,"componentBased":false},{"name":"minecraft:gray_carpet","id":-603,"version":2,"componentBased":false},{"name":"minecraft:gray_concrete","id":-634,"version":2,"componentBased":false},{"name":"minecraft:gray_concrete_powder","id":-715,"version":2,"componentBased":false},{"name":"minecraft:gray_dye","id":429,"version":2,"componentBased":false},{"name":"minecraft:gray_glazed_terracotta","id":227,"version":2,"componentBased":false},{"name":"minecraft:gray_harness","id":756,"version":2,"componentBased":false},{"name":"minecraft:gray_shulker_box","id":-619,"version":2,"componentBased":false},{"name":"minecraft:gray_stained_glass","id":-679,"version":2,"componentBased":false},{"name":"minecraft:gray_stained_glass_pane","id":-649,"version":2,"componentBased":false},{"name":"minecraft:gray_terracotta","id":-730,"version":2,"componentBased":false},{"name":"minecraft:gray_wool","id":-553,"version":2,"componentBased":false},{"name":"minecraft:green_bundle","id":263,"version":1,"componentBased":true},{"name":"minecraft:green_candle","id":-426,"version":2,"componentBased":false},{"name":"minecraft:green_candle_cake","id":-443,"version":2,"componentBased":false},{"name":"minecraft:green_carpet","id":-609,"version":2,"componentBased":false},{"name":"minecraft:green_concrete","id":-640,"version":2,"componentBased":false},{"name":"minecraft:green_concrete_powder","id":-721,"version":2,"componentBased":false},{"name":"minecraft:green_dye","id":423,"version":2,"componentBased":false},{"name":"minecraft:green_glazed_terracotta","id":233,"version":2,"componentBased":false},{"name":"minecraft:green_harness","id":757,"version":2,"componentBased":false},{"name":"minecraft:green_shulker_box","id":-625,"version":2,"componentBased":false},{"name":"minecraft:green_stained_glass","id":-685,"version":2,"componentBased":false},{"name":"minecraft:green_stained_glass_pane","id":-655,"version":2,"componentBased":false},{"name":"minecraft:green_terracotta","id":-736,"version":2,"componentBased":false},{"name":"minecraft:green_wool","id":-560,"version":2,"componentBased":false},{"name":"minecraft:grindstone","id":-195,"version":2,"componentBased":false},{"name":"minecraft:guardian_spawn_egg","id":488,"version":2,"componentBased":false},{"name":"minecraft:gunpowder","id":353,"version":2,"componentBased":false},{"name":"minecraft:guster_banner_pattern","id":623,"version":2,"componentBased":false},{"name":"minecraft:guster_pottery_sherd","id":703,"version":2,"componentBased":false},{"name":"minecraft:hanging_roots","id":-319,"version":2,"componentBased":false},{"name":"minecraft:happy_ghast_spawn_egg","id":751,"version":2,"componentBased":false},{"name":"minecraft:hard_black_stained_glass","id":-702,"version":2,"componentBased":false},{"name":"minecraft:hard_black_stained_glass_pane","id":-672,"version":2,"componentBased":false},{"name":"minecraft:hard_blue_stained_glass","id":-698,"version":2,"componentBased":false},{"name":"minecraft:hard_blue_stained_glass_pane","id":-668,"version":2,"componentBased":false},{"name":"minecraft:hard_brown_stained_glass","id":-699,"version":2,"componentBased":false},{"name":"minecraft:hard_brown_stained_glass_pane","id":-669,"version":2,"componentBased":false},{"name":"minecraft:hard_cyan_stained_glass","id":-696,"version":2,"componentBased":false},{"name":"minecraft:hard_cyan_stained_glass_pane","id":-666,"version":2,"componentBased":false},{"name":"minecraft:hard_glass","id":253,"version":2,"componentBased":false},{"name":"minecraft:hard_glass_pane","id":190,"version":2,"componentBased":false},{"name":"minecraft:hard_gray_stained_glass","id":-694,"version":2,"componentBased":false},{"name":"minecraft:hard_gray_stained_glass_pane","id":-664,"version":2,"componentBased":false},{"name":"minecraft:hard_green_stained_glass","id":-700,"version":2,"componentBased":false},{"name":"minecraft:hard_green_stained_glass_pane","id":-670,"version":2,"componentBased":false},{"name":"minecraft:hard_light_blue_stained_glass","id":-690,"version":2,"componentBased":false},{"name":"minecraft:hard_light_blue_stained_glass_pane","id":-660,"version":2,"componentBased":false},{"name":"minecraft:hard_light_gray_stained_glass","id":-695,"version":2,"componentBased":false},{"name":"minecraft:hard_light_gray_stained_glass_pane","id":-665,"version":2,"componentBased":false},{"name":"minecraft:hard_lime_stained_glass","id":-692,"version":2,"componentBased":false},{"name":"minecraft:hard_lime_stained_glass_pane","id":-662,"version":2,"componentBased":false},{"name":"minecraft:hard_magenta_stained_glass","id":-689,"version":2,"componentBased":false},{"name":"minecraft:hard_magenta_stained_glass_pane","id":-659,"version":2,"componentBased":false},{"name":"minecraft:hard_orange_stained_glass","id":-688,"version":2,"componentBased":false},{"name":"minecraft:hard_orange_stained_glass_pane","id":-658,"version":2,"componentBased":false},{"name":"minecraft:hard_pink_stained_glass","id":-693,"version":2,"componentBased":false},{"name":"minecraft:hard_pink_stained_glass_pane","id":-663,"version":2,"componentBased":false},{"name":"minecraft:hard_purple_stained_glass","id":-697,"version":2,"componentBased":false},{"name":"minecraft:hard_purple_stained_glass_pane","id":-667,"version":2,"componentBased":false},{"name":"minecraft:hard_red_stained_glass","id":-701,"version":2,"componentBased":false},{"name":"minecraft:hard_red_stained_glass_pane","id":-671,"version":2,"componentBased":false},{"name":"minecraft:hard_stained_glass","id":805,"version":2,"componentBased":false},{"name":"minecraft:hard_stained_glass_pane","id":806,"version":2,"componentBased":false},{"name":"minecraft:hard_white_stained_glass","id":254,"version":2,"componentBased":false},{"name":"minecraft:hard_white_stained_glass_pane","id":191,"version":2,"componentBased":false},{"name":"minecraft:hard_yellow_stained_glass","id":-691,"version":2,"componentBased":false},{"name":"minecraft:hard_yellow_stained_glass_pane","id":-661,"version":2,"componentBased":false},{"name":"minecraft:hardened_clay","id":172,"version":2,"componentBased":false},{"name":"minecraft:hay_block","id":170,"version":2,"componentBased":false},{"name":"minecraft:heart_of_the_sea","id":604,"version":2,"componentBased":false},{"name":"minecraft:heart_pottery_sherd","id":704,"version":2,"componentBased":false},{"name":"minecraft:heartbreak_pottery_sherd","id":705,"version":2,"componentBased":false},{"name":"minecraft:heavy_core","id":-316,"version":2,"componentBased":false},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"version":2,"componentBased":false},{"name":"minecraft:hoglin_spawn_egg","id":524,"version":2,"componentBased":false},{"name":"minecraft:honey_block","id":-220,"version":2,"componentBased":false},{"name":"minecraft:honey_bottle","id":627,"version":0,"componentBased":false},{"name":"minecraft:honeycomb","id":626,"version":0,"componentBased":false},{"name":"minecraft:honeycomb_block","id":-221,"version":2,"componentBased":false},{"name":"minecraft:hopper","id":560,"version":2,"componentBased":true},{"name":"minecraft:hopper_minecart","id":559,"version":2,"componentBased":false},{"name":"minecraft:horn_coral","id":-584,"version":2,"componentBased":false},{"name":"minecraft:horn_coral_block","id":-852,"version":2,"componentBased":false},{"name":"minecraft:horn_coral_fan","id":-843,"version":2,"componentBased":false},{"name":"minecraft:horn_coral_wall_fan","id":-137,"version":2,"componentBased":false},{"name":"minecraft:horse_spawn_egg","id":485,"version":2,"componentBased":false},{"name":"minecraft:host_armor_trim_smithing_template","id":733,"version":2,"componentBased":false},{"name":"minecraft:howl_pottery_sherd","id":706,"version":2,"componentBased":false},{"name":"minecraft:husk_spawn_egg","id":491,"version":2,"componentBased":false},{"name":"minecraft:ice","id":79,"version":2,"componentBased":false},{"name":"minecraft:ice_bomb","id":632,"version":2,"componentBased":false},{"name":"minecraft:infested_chiseled_stone_bricks","id":-862,"version":2,"componentBased":false},{"name":"minecraft:infested_cobblestone","id":-858,"version":2,"componentBased":false},{"name":"minecraft:infested_cracked_stone_bricks","id":-861,"version":2,"componentBased":false},{"name":"minecraft:infested_deepslate","id":-454,"version":2,"componentBased":false},{"name":"minecraft:infested_mossy_stone_bricks","id":-860,"version":2,"componentBased":false},{"name":"minecraft:infested_stone","id":97,"version":2,"componentBased":false},{"name":"minecraft:infested_stone_bricks","id":-859,"version":2,"componentBased":false},{"name":"minecraft:info_update","id":248,"version":2,"componentBased":false},{"name":"minecraft:info_update2","id":249,"version":2,"componentBased":false},{"name":"minecraft:ink_sac","id":439,"version":2,"componentBased":false},{"name":"minecraft:invisible_bedrock","id":95,"version":2,"componentBased":false},{"name":"minecraft:iron_axe","id":322,"version":2,"componentBased":false},{"name":"minecraft:iron_bars","id":101,"version":2,"componentBased":false},{"name":"minecraft:iron_block","id":42,"version":2,"componentBased":false},{"name":"minecraft:iron_boots","id":371,"version":2,"componentBased":false},{"name":"minecraft:iron_chestplate","id":369,"version":2,"componentBased":false},{"name":"minecraft:iron_door","id":397,"version":2,"componentBased":false},{"name":"minecraft:iron_golem_spawn_egg","id":533,"version":2,"componentBased":false},{"name":"minecraft:iron_helmet","id":368,"version":2,"componentBased":false},{"name":"minecraft:iron_hoe","id":356,"version":2,"componentBased":false},{"name":"minecraft:iron_horse_armor","id":564,"version":2,"componentBased":false},{"name":"minecraft:iron_ingot","id":329,"version":2,"componentBased":false},{"name":"minecraft:iron_leggings","id":370,"version":2,"componentBased":false},{"name":"minecraft:iron_nugget","id":602,"version":2,"componentBased":false},{"name":"minecraft:iron_ore","id":15,"version":2,"componentBased":false},{"name":"minecraft:iron_pickaxe","id":321,"version":2,"componentBased":false},{"name":"minecraft:iron_shovel","id":320,"version":2,"componentBased":false},{"name":"minecraft:iron_sword","id":331,"version":2,"componentBased":false},{"name":"minecraft:iron_trapdoor","id":167,"version":2,"componentBased":false},{"name":"minecraft:item.acacia_door","id":196,"version":2,"componentBased":false},{"name":"minecraft:item.bed","id":26,"version":2,"componentBased":false},{"name":"minecraft:item.beetroot","id":244,"version":2,"componentBased":false},{"name":"minecraft:item.birch_door","id":194,"version":2,"componentBased":false},{"name":"minecraft:item.brewing_stand","id":117,"version":2,"componentBased":false},{"name":"minecraft:item.cake","id":92,"version":2,"componentBased":false},{"name":"minecraft:item.camera","id":242,"version":2,"componentBased":false},{"name":"minecraft:item.campfire","id":-209,"version":2,"componentBased":false},{"name":"minecraft:item.cauldron","id":118,"version":2,"componentBased":false},{"name":"minecraft:item.chain","id":-286,"version":2,"componentBased":false},{"name":"minecraft:item.crimson_door","id":-244,"version":2,"componentBased":false},{"name":"minecraft:item.dark_oak_door","id":197,"version":2,"componentBased":false},{"name":"minecraft:item.flower_pot","id":140,"version":2,"componentBased":false},{"name":"minecraft:item.frame","id":199,"version":2,"componentBased":false},{"name":"minecraft:item.glow_frame","id":-339,"version":2,"componentBased":false},{"name":"minecraft:item.hopper","id":154,"version":2,"componentBased":false},{"name":"minecraft:item.iron_door","id":71,"version":2,"componentBased":false},{"name":"minecraft:item.jungle_door","id":195,"version":2,"componentBased":false},{"name":"minecraft:item.kelp","id":-138,"version":2,"componentBased":false},{"name":"minecraft:item.mangrove_door","id":-493,"version":2,"componentBased":false},{"name":"minecraft:item.nether_sprouts","id":-238,"version":2,"componentBased":false},{"name":"minecraft:item.nether_wart","id":115,"version":2,"componentBased":false},{"name":"minecraft:item.reeds","id":83,"version":2,"componentBased":false},{"name":"minecraft:item.soul_campfire","id":-290,"version":2,"componentBased":false},{"name":"minecraft:item.spruce_door","id":193,"version":2,"componentBased":false},{"name":"minecraft:item.warped_door","id":-245,"version":2,"componentBased":false},{"name":"minecraft:item.wheat","id":59,"version":2,"componentBased":false},{"name":"minecraft:item.wooden_door","id":64,"version":2,"componentBased":false},{"name":"minecraft:jigsaw","id":-211,"version":2,"componentBased":false},{"name":"minecraft:jukebox","id":84,"version":2,"componentBased":false},{"name":"minecraft:jungle_boat","id":403,"version":2,"componentBased":false},{"name":"minecraft:jungle_button","id":-143,"version":2,"componentBased":false},{"name":"minecraft:jungle_chest_boat","id":677,"version":2,"componentBased":false},{"name":"minecraft:jungle_door","id":588,"version":2,"componentBased":false},{"name":"minecraft:jungle_double_slab","id":-811,"version":2,"componentBased":false},{"name":"minecraft:jungle_fence","id":-578,"version":2,"componentBased":false},{"name":"minecraft:jungle_fence_gate","id":185,"version":2,"componentBased":false},{"name":"minecraft:jungle_hanging_sign","id":-503,"version":2,"componentBased":false},{"name":"minecraft:jungle_leaves","id":-802,"version":2,"componentBased":false},{"name":"minecraft:jungle_log","id":-571,"version":2,"componentBased":false},{"name":"minecraft:jungle_planks","id":-741,"version":2,"componentBased":false},{"name":"minecraft:jungle_pressure_plate","id":-153,"version":2,"componentBased":false},{"name":"minecraft:jungle_sapling","id":-827,"version":2,"componentBased":false},{"name":"minecraft:jungle_sign","id":611,"version":2,"componentBased":false},{"name":"minecraft:jungle_slab","id":-806,"version":2,"componentBased":false},{"name":"minecraft:jungle_stairs","id":136,"version":2,"componentBased":false},{"name":"minecraft:jungle_standing_sign","id":-188,"version":2,"componentBased":false},{"name":"minecraft:jungle_trapdoor","id":-148,"version":2,"componentBased":false},{"name":"minecraft:jungle_wall_sign","id":-189,"version":2,"componentBased":false},{"name":"minecraft:jungle_wood","id":-816,"version":2,"componentBased":false},{"name":"minecraft:kelp","id":408,"version":2,"componentBased":true},{"name":"minecraft:lab_table","id":-988,"version":2,"componentBased":false},{"name":"minecraft:ladder","id":65,"version":2,"componentBased":false},{"name":"minecraft:lantern","id":-208,"version":2,"componentBased":false},{"name":"minecraft:lapis_block","id":22,"version":2,"componentBased":false},{"name":"minecraft:lapis_lazuli","id":440,"version":2,"componentBased":false},{"name":"minecraft:lapis_ore","id":21,"version":2,"componentBased":false},{"name":"minecraft:large_amethyst_bud","id":-330,"version":2,"componentBased":false},{"name":"minecraft:large_fern","id":-865,"version":2,"componentBased":false},{"name":"minecraft:lava","id":11,"version":2,"componentBased":false},{"name":"minecraft:lava_bucket","id":388,"version":2,"componentBased":false},{"name":"minecraft:lead","id":580,"version":2,"componentBased":false},{"name":"minecraft:leaf_litter","id":-1026,"version":2,"componentBased":false},{"name":"minecraft:leather","id":407,"version":2,"componentBased":false},{"name":"minecraft:leather_boots","id":363,"version":2,"componentBased":false},{"name":"minecraft:leather_chestplate","id":361,"version":2,"componentBased":false},{"name":"minecraft:leather_helmet","id":360,"version":2,"componentBased":false},{"name":"minecraft:leather_horse_armor","id":563,"version":2,"componentBased":false},{"name":"minecraft:leather_leggings","id":362,"version":2,"componentBased":false},{"name":"minecraft:leaves","id":785,"version":2,"componentBased":false},{"name":"minecraft:leaves2","id":786,"version":2,"componentBased":false},{"name":"minecraft:lectern","id":-194,"version":2,"componentBased":false},{"name":"minecraft:lever","id":69,"version":2,"componentBased":false},{"name":"minecraft:light_block","id":809,"version":2,"componentBased":false},{"name":"minecraft:light_block_0","id":-215,"version":2,"componentBased":false},{"name":"minecraft:light_block_1","id":-929,"version":2,"componentBased":false},{"name":"minecraft:light_block_10","id":-938,"version":2,"componentBased":false},{"name":"minecraft:light_block_11","id":-939,"version":2,"componentBased":false},{"name":"minecraft:light_block_12","id":-940,"version":2,"componentBased":false},{"name":"minecraft:light_block_13","id":-941,"version":2,"componentBased":false},{"name":"minecraft:light_block_14","id":-942,"version":2,"componentBased":false},{"name":"minecraft:light_block_15","id":-943,"version":2,"componentBased":false},{"name":"minecraft:light_block_2","id":-930,"version":2,"componentBased":false},{"name":"minecraft:light_block_3","id":-931,"version":2,"componentBased":false},{"name":"minecraft:light_block_4","id":-932,"version":2,"componentBased":false},{"name":"minecraft:light_block_5","id":-933,"version":2,"componentBased":false},{"name":"minecraft:light_block_6","id":-934,"version":2,"componentBased":false},{"name":"minecraft:light_block_7","id":-935,"version":2,"componentBased":false},{"name":"minecraft:light_block_8","id":-936,"version":2,"componentBased":false},{"name":"minecraft:light_block_9","id":-937,"version":2,"componentBased":false},{"name":"minecraft:light_blue_bundle","id":264,"version":1,"componentBased":true},{"name":"minecraft:light_blue_candle","id":-416,"version":2,"componentBased":false},{"name":"minecraft:light_blue_candle_cake","id":-433,"version":2,"componentBased":false},{"name":"minecraft:light_blue_carpet","id":-599,"version":2,"componentBased":false},{"name":"minecraft:light_blue_concrete","id":-630,"version":2,"componentBased":false},{"name":"minecraft:light_blue_concrete_powder","id":-711,"version":2,"componentBased":false},{"name":"minecraft:light_blue_dye","id":433,"version":2,"componentBased":false},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"version":2,"componentBased":false},{"name":"minecraft:light_blue_harness","id":758,"version":2,"componentBased":false},{"name":"minecraft:light_blue_shulker_box","id":-615,"version":2,"componentBased":false},{"name":"minecraft:light_blue_stained_glass","id":-675,"version":2,"componentBased":false},{"name":"minecraft:light_blue_stained_glass_pane","id":-645,"version":2,"componentBased":false},{"name":"minecraft:light_blue_terracotta","id":-726,"version":2,"componentBased":false},{"name":"minecraft:light_blue_wool","id":-562,"version":2,"componentBased":false},{"name":"minecraft:light_gray_bundle","id":265,"version":1,"componentBased":true},{"name":"minecraft:light_gray_candle","id":-421,"version":2,"componentBased":false},{"name":"minecraft:light_gray_candle_cake","id":-438,"version":2,"componentBased":false},{"name":"minecraft:light_gray_carpet","id":-604,"version":2,"componentBased":false},{"name":"minecraft:light_gray_concrete","id":-635,"version":2,"componentBased":false},{"name":"minecraft:light_gray_concrete_powder","id":-716,"version":2,"componentBased":false},{"name":"minecraft:light_gray_dye","id":428,"version":2,"componentBased":false},{"name":"minecraft:light_gray_harness","id":759,"version":2,"componentBased":false},{"name":"minecraft:light_gray_shulker_box","id":-620,"version":2,"componentBased":false},{"name":"minecraft:light_gray_stained_glass","id":-680,"version":2,"componentBased":false},{"name":"minecraft:light_gray_stained_glass_pane","id":-650,"version":2,"componentBased":false},{"name":"minecraft:light_gray_terracotta","id":-731,"version":2,"componentBased":false},{"name":"minecraft:light_gray_wool","id":-552,"version":2,"componentBased":false},{"name":"minecraft:light_weighted_pressure_plate","id":147,"version":2,"componentBased":false},{"name":"minecraft:lightning_rod","id":-312,"version":2,"componentBased":false},{"name":"minecraft:lilac","id":-863,"version":2,"componentBased":false},{"name":"minecraft:lily_of_the_valley","id":-839,"version":2,"componentBased":false},{"name":"minecraft:lime_bundle","id":266,"version":1,"componentBased":true},{"name":"minecraft:lime_candle","id":-418,"version":2,"componentBased":false},{"name":"minecraft:lime_candle_cake","id":-435,"version":2,"componentBased":false},{"name":"minecraft:lime_carpet","id":-601,"version":2,"componentBased":false},{"name":"minecraft:lime_concrete","id":-632,"version":2,"componentBased":false},{"name":"minecraft:lime_concrete_powder","id":-713,"version":2,"componentBased":false},{"name":"minecraft:lime_dye","id":431,"version":2,"componentBased":false},{"name":"minecraft:lime_glazed_terracotta","id":225,"version":2,"componentBased":false},{"name":"minecraft:lime_harness","id":760,"version":2,"componentBased":false},{"name":"minecraft:lime_shulker_box","id":-617,"version":2,"componentBased":false},{"name":"minecraft:lime_stained_glass","id":-677,"version":2,"componentBased":false},{"name":"minecraft:lime_stained_glass_pane","id":-647,"version":2,"componentBased":false},{"name":"minecraft:lime_terracotta","id":-728,"version":2,"componentBased":false},{"name":"minecraft:lime_wool","id":-559,"version":2,"componentBased":false},{"name":"minecraft:lingering_potion","id":595,"version":2,"componentBased":false},{"name":"minecraft:lit_blast_furnace","id":-214,"version":2,"componentBased":false},{"name":"minecraft:lit_deepslate_redstone_ore","id":-404,"version":2,"componentBased":false},{"name":"minecraft:lit_furnace","id":62,"version":2,"componentBased":false},{"name":"minecraft:lit_pumpkin","id":91,"version":2,"componentBased":false},{"name":"minecraft:lit_redstone_lamp","id":124,"version":2,"componentBased":false},{"name":"minecraft:lit_redstone_ore","id":74,"version":2,"componentBased":false},{"name":"minecraft:lit_smoker","id":-199,"version":2,"componentBased":false},{"name":"minecraft:llama_spawn_egg","id":501,"version":2,"componentBased":false},{"name":"minecraft:lodestone","id":-222,"version":2,"componentBased":false},{"name":"minecraft:lodestone_compass","id":639,"version":2,"componentBased":false},{"name":"minecraft:log","id":770,"version":2,"componentBased":false},{"name":"minecraft:log2","id":793,"version":2,"componentBased":false},{"name":"minecraft:loom","id":-204,"version":2,"componentBased":false},{"name":"minecraft:mace","id":344,"version":2,"componentBased":false},{"name":"minecraft:magenta_bundle","id":267,"version":1,"componentBased":true},{"name":"minecraft:magenta_candle","id":-415,"version":2,"componentBased":false},{"name":"minecraft:magenta_candle_cake","id":-432,"version":2,"componentBased":false},{"name":"minecraft:magenta_carpet","id":-598,"version":2,"componentBased":false},{"name":"minecraft:magenta_concrete","id":-629,"version":2,"componentBased":false},{"name":"minecraft:magenta_concrete_powder","id":-710,"version":2,"componentBased":false},{"name":"minecraft:magenta_dye","id":434,"version":2,"componentBased":false},{"name":"minecraft:magenta_glazed_terracotta","id":222,"version":2,"componentBased":false},{"name":"minecraft:magenta_harness","id":761,"version":2,"componentBased":false},{"name":"minecraft:magenta_shulker_box","id":-614,"version":2,"componentBased":false},{"name":"minecraft:magenta_stained_glass","id":-674,"version":2,"componentBased":false},{"name":"minecraft:magenta_stained_glass_pane","id":-644,"version":2,"componentBased":false},{"name":"minecraft:magenta_terracotta","id":-725,"version":2,"componentBased":false},{"name":"minecraft:magenta_wool","id":-565,"version":2,"componentBased":false},{"name":"minecraft:magma","id":213,"version":2,"componentBased":false},{"name":"minecraft:magma_cream","id":457,"version":2,"componentBased":false},{"name":"minecraft:magma_cube_spawn_egg","id":482,"version":2,"componentBased":false},{"name":"minecraft:mangrove_boat","id":672,"version":2,"componentBased":false},{"name":"minecraft:mangrove_button","id":-487,"version":2,"componentBased":false},{"name":"minecraft:mangrove_chest_boat","id":681,"version":2,"componentBased":false},{"name":"minecraft:mangrove_door","id":670,"version":2,"componentBased":false},{"name":"minecraft:mangrove_double_slab","id":-499,"version":2,"componentBased":false},{"name":"minecraft:mangrove_fence","id":-491,"version":2,"componentBased":false},{"name":"minecraft:mangrove_fence_gate","id":-492,"version":2,"componentBased":false},{"name":"minecraft:mangrove_hanging_sign","id":-508,"version":2,"componentBased":false},{"name":"minecraft:mangrove_leaves","id":-472,"version":2,"componentBased":false},{"name":"minecraft:mangrove_log","id":-484,"version":2,"componentBased":false},{"name":"minecraft:mangrove_planks","id":-486,"version":2,"componentBased":false},{"name":"minecraft:mangrove_pressure_plate","id":-490,"version":2,"componentBased":false},{"name":"minecraft:mangrove_propagule","id":-474,"version":2,"componentBased":false},{"name":"minecraft:mangrove_roots","id":-482,"version":2,"componentBased":false},{"name":"minecraft:mangrove_sign","id":671,"version":2,"componentBased":false},{"name":"minecraft:mangrove_slab","id":-489,"version":2,"componentBased":false},{"name":"minecraft:mangrove_stairs","id":-488,"version":2,"componentBased":false},{"name":"minecraft:mangrove_standing_sign","id":-494,"version":2,"componentBased":false},{"name":"minecraft:mangrove_trapdoor","id":-496,"version":2,"componentBased":false},{"name":"minecraft:mangrove_wall_sign","id":-495,"version":2,"componentBased":false},{"name":"minecraft:mangrove_wood","id":-497,"version":2,"componentBased":false},{"name":"minecraft:material_reducer","id":-986,"version":2,"componentBased":false},{"name":"minecraft:medicine","id":636,"version":2,"componentBased":false},{"name":"minecraft:medium_amethyst_bud","id":-331,"version":2,"componentBased":false},{"name":"minecraft:melon_block","id":103,"version":2,"componentBased":false},{"name":"minecraft:melon_seeds","id":315,"version":0,"componentBased":false},{"name":"minecraft:melon_slice","id":294,"version":0,"componentBased":false},{"name":"minecraft:melon_stem","id":105,"version":2,"componentBased":false},{"name":"minecraft:milk_bucket","id":386,"version":2,"componentBased":false},{"name":"minecraft:minecart","id":395,"version":2,"componentBased":false},{"name":"minecraft:miner_pottery_sherd","id":707,"version":2,"componentBased":false},{"name":"minecraft:mob_spawner","id":52,"version":2,"componentBased":false},{"name":"minecraft:mojang_banner_pattern","id":617,"version":2,"componentBased":false},{"name":"minecraft:monster_egg","id":794,"version":2,"componentBased":false},{"name":"minecraft:mooshroom_spawn_egg","id":467,"version":2,"componentBased":false},{"name":"minecraft:moss_block","id":-320,"version":2,"componentBased":false},{"name":"minecraft:moss_carpet","id":-335,"version":2,"componentBased":false},{"name":"minecraft:mossy_cobblestone","id":48,"version":2,"componentBased":false},{"name":"minecraft:mossy_cobblestone_double_slab","id":-915,"version":2,"componentBased":false},{"name":"minecraft:mossy_cobblestone_slab","id":-888,"version":2,"componentBased":false},{"name":"minecraft:mossy_cobblestone_stairs","id":-179,"version":2,"componentBased":false},{"name":"minecraft:mossy_cobblestone_wall","id":-971,"version":2,"componentBased":false},{"name":"minecraft:mossy_stone_brick_double_slab","id":-168,"version":2,"componentBased":false},{"name":"minecraft:mossy_stone_brick_slab","id":-166,"version":2,"componentBased":false},{"name":"minecraft:mossy_stone_brick_stairs","id":-175,"version":2,"componentBased":false},{"name":"minecraft:mossy_stone_brick_wall","id":-978,"version":2,"componentBased":false},{"name":"minecraft:mossy_stone_bricks","id":-868,"version":2,"componentBased":false},{"name":"minecraft:mourner_pottery_sherd","id":708,"version":2,"componentBased":false},{"name":"minecraft:moving_block","id":250,"version":2,"componentBased":false},{"name":"minecraft:mud","id":-473,"version":2,"componentBased":false},{"name":"minecraft:mud_brick_double_slab","id":-479,"version":2,"componentBased":false},{"name":"minecraft:mud_brick_slab","id":-478,"version":2,"componentBased":false},{"name":"minecraft:mud_brick_stairs","id":-480,"version":2,"componentBased":false},{"name":"minecraft:mud_brick_wall","id":-481,"version":2,"componentBased":false},{"name":"minecraft:mud_bricks","id":-475,"version":2,"componentBased":false},{"name":"minecraft:muddy_mangrove_roots","id":-483,"version":2,"componentBased":false},{"name":"minecraft:mule_spawn_egg","id":494,"version":2,"componentBased":false},{"name":"minecraft:mushroom_stem","id":-1008,"version":2,"componentBased":false},{"name":"minecraft:mushroom_stew","id":282,"version":0,"componentBased":false},{"name":"minecraft:music_disc_11","id":577,"version":2,"componentBased":true},{"name":"minecraft:music_disc_13","id":567,"version":2,"componentBased":true},{"name":"minecraft:music_disc_5","id":673,"version":2,"componentBased":true},{"name":"minecraft:music_disc_blocks","id":569,"version":2,"componentBased":true},{"name":"minecraft:music_disc_cat","id":568,"version":2,"componentBased":true},{"name":"minecraft:music_disc_chirp","id":570,"version":2,"componentBased":true},{"name":"minecraft:music_disc_creator","id":801,"version":2,"componentBased":true},{"name":"minecraft:music_disc_creator_music_box","id":802,"version":2,"componentBased":true},{"name":"minecraft:music_disc_far","id":571,"version":2,"componentBased":true},{"name":"minecraft:music_disc_mall","id":572,"version":2,"componentBased":true},{"name":"minecraft:music_disc_mellohi","id":573,"version":2,"componentBased":true},{"name":"minecraft:music_disc_otherside","id":663,"version":2,"componentBased":true},{"name":"minecraft:music_disc_pigstep","id":657,"version":2,"componentBased":true},{"name":"minecraft:music_disc_precipice","id":803,"version":2,"componentBased":true},{"name":"minecraft:music_disc_relic","id":736,"version":2,"componentBased":true},{"name":"minecraft:music_disc_stal","id":574,"version":2,"componentBased":true},{"name":"minecraft:music_disc_strad","id":575,"version":2,"componentBased":true},{"name":"minecraft:music_disc_wait","id":578,"version":2,"componentBased":true},{"name":"minecraft:music_disc_ward","id":576,"version":2,"componentBased":true},{"name":"minecraft:mutton","id":583,"version":0,"componentBased":false},{"name":"minecraft:mycelium","id":110,"version":2,"componentBased":false},{"name":"minecraft:name_tag","id":581,"version":2,"componentBased":false},{"name":"minecraft:nautilus_shell","id":603,"version":2,"componentBased":false},{"name":"minecraft:nether_brick","id":112,"version":2,"componentBased":false},{"name":"minecraft:nether_brick_double_slab","id":-883,"version":2,"componentBased":false},{"name":"minecraft:nether_brick_fence","id":113,"version":2,"componentBased":false},{"name":"minecraft:nether_brick_slab","id":-877,"version":2,"componentBased":false},{"name":"minecraft:nether_brick_stairs","id":114,"version":2,"componentBased":false},{"name":"minecraft:nether_brick_wall","id":-979,"version":2,"componentBased":false},{"name":"minecraft:nether_gold_ore","id":-288,"version":2,"componentBased":false},{"name":"minecraft:nether_sprouts","id":658,"version":2,"componentBased":true},{"name":"minecraft:nether_star","id":551,"version":2,"componentBased":false},{"name":"minecraft:nether_wart","id":316,"version":0,"componentBased":false},{"name":"minecraft:nether_wart_block","id":214,"version":2,"componentBased":false},{"name":"minecraft:netherbrick","id":556,"version":2,"componentBased":false},{"name":"minecraft:netherite_axe","id":643,"version":2,"componentBased":false},{"name":"minecraft:netherite_block","id":-270,"version":2,"componentBased":false},{"name":"minecraft:netherite_boots","id":649,"version":2,"componentBased":false},{"name":"minecraft:netherite_chestplate","id":647,"version":2,"componentBased":false},{"name":"minecraft:netherite_helmet","id":646,"version":2,"componentBased":false},{"name":"minecraft:netherite_hoe","id":644,"version":2,"componentBased":false},{"name":"minecraft:netherite_ingot","id":645,"version":2,"componentBased":false},{"name":"minecraft:netherite_leggings","id":648,"version":2,"componentBased":false},{"name":"minecraft:netherite_pickaxe","id":642,"version":2,"componentBased":false},{"name":"minecraft:netherite_scrap","id":650,"version":2,"componentBased":false},{"name":"minecraft:netherite_shovel","id":641,"version":2,"componentBased":false},{"name":"minecraft:netherite_sword","id":640,"version":2,"componentBased":false},{"name":"minecraft:netherite_upgrade_smithing_template","id":717,"version":2,"componentBased":false},{"name":"minecraft:netherrack","id":87,"version":2,"componentBased":false},{"name":"minecraft:netherreactor","id":247,"version":2,"componentBased":false},{"name":"minecraft:normal_stone_double_slab","id":-926,"version":2,"componentBased":false},{"name":"minecraft:normal_stone_slab","id":-899,"version":2,"componentBased":false},{"name":"minecraft:normal_stone_stairs","id":-180,"version":2,"componentBased":false},{"name":"minecraft:noteblock","id":25,"version":2,"componentBased":false},{"name":"minecraft:npc_spawn_egg","id":498,"version":2,"componentBased":false},{"name":"minecraft:oak_boat","id":401,"version":2,"componentBased":false},{"name":"minecraft:oak_chest_boat","id":675,"version":2,"componentBased":false},{"name":"minecraft:oak_double_slab","id":157,"version":2,"componentBased":false},{"name":"minecraft:oak_fence","id":85,"version":2,"componentBased":false},{"name":"minecraft:oak_hanging_sign","id":-500,"version":2,"componentBased":false},{"name":"minecraft:oak_leaves","id":18,"version":2,"componentBased":false},{"name":"minecraft:oak_log","id":17,"version":2,"componentBased":false},{"name":"minecraft:oak_planks","id":5,"version":2,"componentBased":false},{"name":"minecraft:oak_sapling","id":6,"version":2,"componentBased":false},{"name":"minecraft:oak_sign","id":383,"version":2,"componentBased":false},{"name":"minecraft:oak_slab","id":158,"version":2,"componentBased":false},{"name":"minecraft:oak_stairs","id":53,"version":2,"componentBased":false},{"name":"minecraft:oak_wood","id":-212,"version":2,"componentBased":false},{"name":"minecraft:observer","id":251,"version":2,"componentBased":false},{"name":"minecraft:obsidian","id":49,"version":2,"componentBased":false},{"name":"minecraft:ocelot_spawn_egg","id":478,"version":2,"componentBased":false},{"name":"minecraft:ochre_froglight","id":-471,"version":2,"componentBased":false},{"name":"minecraft:ominous_bottle","id":628,"version":2,"componentBased":false},{"name":"minecraft:ominous_trial_key","id":275,"version":1,"componentBased":true},{"name":"minecraft:open_eyeblossom","id":-1018,"version":2,"componentBased":false},{"name":"minecraft:orange_bundle","id":268,"version":1,"componentBased":true},{"name":"minecraft:orange_candle","id":-414,"version":2,"componentBased":false},{"name":"minecraft:orange_candle_cake","id":-431,"version":2,"componentBased":false},{"name":"minecraft:orange_carpet","id":-597,"version":2,"componentBased":false},{"name":"minecraft:orange_concrete","id":-628,"version":2,"componentBased":false},{"name":"minecraft:orange_concrete_powder","id":-709,"version":2,"componentBased":false},{"name":"minecraft:orange_dye","id":435,"version":2,"componentBased":false},{"name":"minecraft:orange_glazed_terracotta","id":221,"version":2,"componentBased":false},{"name":"minecraft:orange_harness","id":762,"version":2,"componentBased":false},{"name":"minecraft:orange_shulker_box","id":-613,"version":2,"componentBased":false},{"name":"minecraft:orange_stained_glass","id":-673,"version":2,"componentBased":false},{"name":"minecraft:orange_stained_glass_pane","id":-643,"version":2,"componentBased":false},{"name":"minecraft:orange_terracotta","id":-724,"version":2,"componentBased":false},{"name":"minecraft:orange_tulip","id":-834,"version":2,"componentBased":false},{"name":"minecraft:orange_wool","id":-557,"version":2,"componentBased":false},{"name":"minecraft:oxeye_daisy","id":-837,"version":2,"componentBased":false},{"name":"minecraft:oxidized_chiseled_copper","id":-763,"version":2,"componentBased":false},{"name":"minecraft:oxidized_copper","id":-343,"version":2,"componentBased":false},{"name":"minecraft:oxidized_copper_bulb","id":-779,"version":2,"componentBased":false},{"name":"minecraft:oxidized_copper_door","id":-787,"version":2,"componentBased":false},{"name":"minecraft:oxidized_copper_grate","id":-771,"version":2,"componentBased":false},{"name":"minecraft:oxidized_copper_trapdoor","id":-795,"version":2,"componentBased":false},{"name":"minecraft:oxidized_cut_copper","id":-350,"version":2,"componentBased":false},{"name":"minecraft:oxidized_cut_copper_slab","id":-364,"version":2,"componentBased":false},{"name":"minecraft:oxidized_cut_copper_stairs","id":-357,"version":2,"componentBased":false},{"name":"minecraft:oxidized_double_cut_copper_slab","id":-371,"version":2,"componentBased":false},{"name":"minecraft:packed_ice","id":174,"version":2,"componentBased":false},{"name":"minecraft:packed_mud","id":-477,"version":2,"componentBased":false},{"name":"minecraft:painting","id":382,"version":2,"componentBased":false},{"name":"minecraft:pale_hanging_moss","id":-1011,"version":2,"componentBased":false},{"name":"minecraft:pale_moss_block","id":-1009,"version":2,"componentBased":false},{"name":"minecraft:pale_moss_carpet","id":-1010,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_boat","id":744,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_button","id":-989,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_chest_boat","id":745,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_door","id":-990,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_double_slab","id":-999,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_fence","id":-991,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_fence_gate","id":-992,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_hanging_sign","id":-993,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_leaves","id":-1007,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_log","id":-995,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_planks","id":-996,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_pressure_plate","id":-997,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_sapling","id":-1006,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_sign","id":746,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_slab","id":-998,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_stairs","id":-1000,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_standing_sign","id":-1001,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_trapdoor","id":-1002,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_wall_sign","id":-1003,"version":2,"componentBased":false},{"name":"minecraft:pale_oak_wood","id":-1005,"version":2,"componentBased":false},{"name":"minecraft:panda_spawn_egg","id":517,"version":2,"componentBased":false},{"name":"minecraft:paper","id":412,"version":2,"componentBased":false},{"name":"minecraft:parrot_spawn_egg","id":506,"version":2,"componentBased":false},{"name":"minecraft:pearlescent_froglight","id":-469,"version":2,"componentBased":false},{"name":"minecraft:peony","id":-867,"version":2,"componentBased":false},{"name":"minecraft:petrified_oak_double_slab","id":-903,"version":2,"componentBased":false},{"name":"minecraft:petrified_oak_slab","id":-902,"version":2,"componentBased":false},{"name":"minecraft:phantom_membrane","id":607,"version":2,"componentBased":false},{"name":"minecraft:phantom_spawn_egg","id":514,"version":2,"componentBased":false},{"name":"minecraft:pig_spawn_egg","id":464,"version":2,"componentBased":false},{"name":"minecraft:piglin_banner_pattern","id":620,"version":2,"componentBased":false},{"name":"minecraft:piglin_brute_spawn_egg","id":527,"version":2,"componentBased":false},{"name":"minecraft:piglin_head","id":-970,"version":2,"componentBased":false},{"name":"minecraft:piglin_spawn_egg","id":525,"version":2,"componentBased":false},{"name":"minecraft:pillager_spawn_egg","id":519,"version":2,"componentBased":false},{"name":"minecraft:pink_bundle","id":269,"version":1,"componentBased":true},{"name":"minecraft:pink_candle","id":-419,"version":2,"componentBased":false},{"name":"minecraft:pink_candle_cake","id":-436,"version":2,"componentBased":false},{"name":"minecraft:pink_carpet","id":-602,"version":2,"componentBased":false},{"name":"minecraft:pink_concrete","id":-633,"version":2,"componentBased":false},{"name":"minecraft:pink_concrete_powder","id":-714,"version":2,"componentBased":false},{"name":"minecraft:pink_dye","id":430,"version":2,"componentBased":false},{"name":"minecraft:pink_glazed_terracotta","id":226,"version":2,"componentBased":false},{"name":"minecraft:pink_harness","id":763,"version":2,"componentBased":false},{"name":"minecraft:pink_petals","id":-549,"version":2,"componentBased":false},{"name":"minecraft:pink_shulker_box","id":-618,"version":2,"componentBased":false},{"name":"minecraft:pink_stained_glass","id":-678,"version":2,"componentBased":false},{"name":"minecraft:pink_stained_glass_pane","id":-648,"version":2,"componentBased":false},{"name":"minecraft:pink_terracotta","id":-729,"version":2,"componentBased":false},{"name":"minecraft:pink_tulip","id":-836,"version":2,"componentBased":false},{"name":"minecraft:pink_wool","id":-566,"version":2,"componentBased":false},{"name":"minecraft:piston","id":33,"version":2,"componentBased":false},{"name":"minecraft:piston_arm_collision","id":34,"version":2,"componentBased":false},{"name":"minecraft:pitcher_crop","id":-574,"version":2,"componentBased":false},{"name":"minecraft:pitcher_plant","id":-612,"version":2,"componentBased":false},{"name":"minecraft:pitcher_pod","id":319,"version":0,"componentBased":false},{"name":"minecraft:planks","id":790,"version":2,"componentBased":false},{"name":"minecraft:player_head","id":-967,"version":2,"componentBased":false},{"name":"minecraft:plenty_pottery_sherd","id":709,"version":2,"componentBased":false},{"name":"minecraft:podzol","id":243,"version":2,"componentBased":false},{"name":"minecraft:pointed_dripstone","id":-308,"version":2,"componentBased":false},{"name":"minecraft:poisonous_potato","id":304,"version":0,"componentBased":false},{"name":"minecraft:polar_bear_spawn_egg","id":500,"version":2,"componentBased":false},{"name":"minecraft:polished_andesite","id":-595,"version":2,"componentBased":false},{"name":"minecraft:polished_andesite_double_slab","id":-919,"version":2,"componentBased":false},{"name":"minecraft:polished_andesite_slab","id":-892,"version":2,"componentBased":false},{"name":"minecraft:polished_andesite_stairs","id":-174,"version":2,"componentBased":false},{"name":"minecraft:polished_basalt","id":-235,"version":2,"componentBased":false},{"name":"minecraft:polished_blackstone","id":-291,"version":2,"componentBased":false},{"name":"minecraft:polished_blackstone_brick_double_slab","id":-285,"version":2,"componentBased":false},{"name":"minecraft:polished_blackstone_brick_slab","id":-284,"version":2,"componentBased":false},{"name":"minecraft:polished_blackstone_brick_stairs","id":-275,"version":2,"componentBased":false},{"name":"minecraft:polished_blackstone_brick_wall","id":-278,"version":2,"componentBased":false},{"name":"minecraft:polished_blackstone_bricks","id":-274,"version":2,"componentBased":false},{"name":"minecraft:polished_blackstone_button","id":-296,"version":2,"componentBased":false},{"name":"minecraft:polished_blackstone_double_slab","id":-294,"version":2,"componentBased":false},{"name":"minecraft:polished_blackstone_pressure_plate","id":-295,"version":2,"componentBased":false},{"name":"minecraft:polished_blackstone_slab","id":-293,"version":2,"componentBased":false},{"name":"minecraft:polished_blackstone_stairs","id":-292,"version":2,"componentBased":false},{"name":"minecraft:polished_blackstone_wall","id":-297,"version":2,"componentBased":false},{"name":"minecraft:polished_deepslate","id":-383,"version":2,"componentBased":false},{"name":"minecraft:polished_deepslate_double_slab","id":-397,"version":2,"componentBased":false},{"name":"minecraft:polished_deepslate_slab","id":-384,"version":2,"componentBased":false},{"name":"minecraft:polished_deepslate_stairs","id":-385,"version":2,"componentBased":false},{"name":"minecraft:polished_deepslate_wall","id":-386,"version":2,"componentBased":false},{"name":"minecraft:polished_diorite","id":-593,"version":2,"componentBased":false},{"name":"minecraft:polished_diorite_double_slab","id":-922,"version":2,"componentBased":false},{"name":"minecraft:polished_diorite_slab","id":-895,"version":2,"componentBased":false},{"name":"minecraft:polished_diorite_stairs","id":-173,"version":2,"componentBased":false},{"name":"minecraft:polished_granite","id":-591,"version":2,"componentBased":false},{"name":"minecraft:polished_granite_double_slab","id":-924,"version":2,"componentBased":false},{"name":"minecraft:polished_granite_slab","id":-897,"version":2,"componentBased":false},{"name":"minecraft:polished_granite_stairs","id":-172,"version":2,"componentBased":false},{"name":"minecraft:polished_tuff","id":-748,"version":2,"componentBased":false},{"name":"minecraft:polished_tuff_double_slab","id":-750,"version":2,"componentBased":false},{"name":"minecraft:polished_tuff_slab","id":-749,"version":2,"componentBased":false},{"name":"minecraft:polished_tuff_stairs","id":-751,"version":2,"componentBased":false},{"name":"minecraft:polished_tuff_wall","id":-752,"version":2,"componentBased":false},{"name":"minecraft:popped_chorus_fruit","id":592,"version":2,"componentBased":false},{"name":"minecraft:poppy","id":38,"version":2,"componentBased":false},{"name":"minecraft:porkchop","id":284,"version":0,"componentBased":false},{"name":"minecraft:portal","id":90,"version":2,"componentBased":false},{"name":"minecraft:potato","id":302,"version":0,"componentBased":false},{"name":"minecraft:potatoes","id":142,"version":2,"componentBased":false},{"name":"minecraft:potion","id":453,"version":2,"componentBased":false},{"name":"minecraft:powder_snow","id":-306,"version":2,"componentBased":false},{"name":"minecraft:powder_snow_bucket","id":393,"version":2,"componentBased":false},{"name":"minecraft:powered_comparator","id":150,"version":2,"componentBased":false},{"name":"minecraft:powered_repeater","id":94,"version":2,"componentBased":false},{"name":"minecraft:prismarine","id":168,"version":2,"componentBased":false},{"name":"minecraft:prismarine_brick_double_slab","id":-914,"version":2,"componentBased":false},{"name":"minecraft:prismarine_brick_slab","id":-887,"version":2,"componentBased":false},{"name":"minecraft:prismarine_bricks","id":-948,"version":2,"componentBased":false},{"name":"minecraft:prismarine_bricks_stairs","id":-4,"version":2,"componentBased":false},{"name":"minecraft:prismarine_crystals","id":582,"version":2,"componentBased":false},{"name":"minecraft:prismarine_double_slab","id":-912,"version":2,"componentBased":false},{"name":"minecraft:prismarine_shard","id":598,"version":2,"componentBased":false},{"name":"minecraft:prismarine_slab","id":-885,"version":2,"componentBased":false},{"name":"minecraft:prismarine_stairs","id":-2,"version":2,"componentBased":false},{"name":"minecraft:prismarine_wall","id":-981,"version":2,"componentBased":false},{"name":"minecraft:prize_pottery_sherd","id":710,"version":2,"componentBased":false},{"name":"minecraft:pufferfish","id":289,"version":0,"componentBased":false},{"name":"minecraft:pufferfish_bucket","id":392,"version":2,"componentBased":false},{"name":"minecraft:pufferfish_spawn_egg","id":509,"version":2,"componentBased":false},{"name":"minecraft:pumpkin","id":86,"version":2,"componentBased":false},{"name":"minecraft:pumpkin_pie","id":306,"version":0,"componentBased":false},{"name":"minecraft:pumpkin_seeds","id":314,"version":0,"componentBased":false},{"name":"minecraft:pumpkin_stem","id":104,"version":2,"componentBased":false},{"name":"minecraft:purple_bundle","id":270,"version":1,"componentBased":true},{"name":"minecraft:purple_candle","id":-423,"version":2,"componentBased":false},{"name":"minecraft:purple_candle_cake","id":-440,"version":2,"componentBased":false},{"name":"minecraft:purple_carpet","id":-606,"version":2,"componentBased":false},{"name":"minecraft:purple_concrete","id":-637,"version":2,"componentBased":false},{"name":"minecraft:purple_concrete_powder","id":-718,"version":2,"componentBased":false},{"name":"minecraft:purple_dye","id":426,"version":2,"componentBased":false},{"name":"minecraft:purple_glazed_terracotta","id":219,"version":2,"componentBased":false},{"name":"minecraft:purple_harness","id":764,"version":2,"componentBased":false},{"name":"minecraft:purple_shulker_box","id":-622,"version":2,"componentBased":false},{"name":"minecraft:purple_stained_glass","id":-682,"version":2,"componentBased":false},{"name":"minecraft:purple_stained_glass_pane","id":-652,"version":2,"componentBased":false},{"name":"minecraft:purple_terracotta","id":-733,"version":2,"componentBased":false},{"name":"minecraft:purple_wool","id":-564,"version":2,"componentBased":false},{"name":"minecraft:purpur_block","id":201,"version":2,"componentBased":false},{"name":"minecraft:purpur_double_slab","id":-911,"version":2,"componentBased":false},{"name":"minecraft:purpur_pillar","id":-951,"version":2,"componentBased":false},{"name":"minecraft:purpur_slab","id":-884,"version":2,"componentBased":false},{"name":"minecraft:purpur_stairs","id":203,"version":2,"componentBased":false},{"name":"minecraft:quartz","id":557,"version":2,"componentBased":false},{"name":"minecraft:quartz_block","id":155,"version":2,"componentBased":false},{"name":"minecraft:quartz_bricks","id":-304,"version":2,"componentBased":false},{"name":"minecraft:quartz_double_slab","id":-882,"version":2,"componentBased":false},{"name":"minecraft:quartz_ore","id":153,"version":2,"componentBased":false},{"name":"minecraft:quartz_pillar","id":-954,"version":2,"componentBased":false},{"name":"minecraft:quartz_slab","id":-876,"version":2,"componentBased":false},{"name":"minecraft:quartz_stairs","id":156,"version":2,"componentBased":false},{"name":"minecraft:rabbit","id":310,"version":0,"componentBased":false},{"name":"minecraft:rabbit_foot","id":561,"version":2,"componentBased":false},{"name":"minecraft:rabbit_hide","id":562,"version":2,"componentBased":false},{"name":"minecraft:rabbit_spawn_egg","id":486,"version":2,"componentBased":false},{"name":"minecraft:rabbit_stew","id":312,"version":0,"componentBased":false},{"name":"minecraft:rail","id":66,"version":2,"componentBased":false},{"name":"minecraft:raiser_armor_trim_smithing_template","id":731,"version":2,"componentBased":false},{"name":"minecraft:rapid_fertilizer","id":634,"version":2,"componentBased":false},{"name":"minecraft:ravager_spawn_egg","id":521,"version":2,"componentBased":false},{"name":"minecraft:raw_copper","id":541,"version":2,"componentBased":false},{"name":"minecraft:raw_copper_block","id":-452,"version":2,"componentBased":false},{"name":"minecraft:raw_gold","id":540,"version":2,"componentBased":false},{"name":"minecraft:raw_gold_block","id":-453,"version":2,"componentBased":false},{"name":"minecraft:raw_iron","id":539,"version":2,"componentBased":false},{"name":"minecraft:raw_iron_block","id":-451,"version":2,"componentBased":false},{"name":"minecraft:recovery_compass","id":683,"version":2,"componentBased":false},{"name":"minecraft:red_bundle","id":271,"version":1,"componentBased":true},{"name":"minecraft:red_candle","id":-427,"version":2,"componentBased":false},{"name":"minecraft:red_candle_cake","id":-444,"version":2,"componentBased":false},{"name":"minecraft:red_carpet","id":-610,"version":2,"componentBased":false},{"name":"minecraft:red_concrete","id":-641,"version":2,"componentBased":false},{"name":"minecraft:red_concrete_powder","id":-722,"version":2,"componentBased":false},{"name":"minecraft:red_dye","id":422,"version":2,"componentBased":false},{"name":"minecraft:red_flower","id":788,"version":2,"componentBased":false},{"name":"minecraft:red_glazed_terracotta","id":234,"version":2,"componentBased":false},{"name":"minecraft:red_harness","id":765,"version":2,"componentBased":false},{"name":"minecraft:red_mushroom","id":40,"version":2,"componentBased":false},{"name":"minecraft:red_mushroom_block","id":100,"version":2,"componentBased":false},{"name":"minecraft:red_nether_brick","id":215,"version":2,"componentBased":false},{"name":"minecraft:red_nether_brick_double_slab","id":-917,"version":2,"componentBased":false},{"name":"minecraft:red_nether_brick_slab","id":-890,"version":2,"componentBased":false},{"name":"minecraft:red_nether_brick_stairs","id":-184,"version":2,"componentBased":false},{"name":"minecraft:red_nether_brick_wall","id":-983,"version":2,"componentBased":false},{"name":"minecraft:red_sand","id":-949,"version":2,"componentBased":false},{"name":"minecraft:red_sandstone","id":179,"version":2,"componentBased":false},{"name":"minecraft:red_sandstone_double_slab","id":181,"version":2,"componentBased":false},{"name":"minecraft:red_sandstone_slab","id":182,"version":2,"componentBased":false},{"name":"minecraft:red_sandstone_stairs","id":180,"version":2,"componentBased":false},{"name":"minecraft:red_sandstone_wall","id":-982,"version":2,"componentBased":false},{"name":"minecraft:red_shulker_box","id":-626,"version":2,"componentBased":false},{"name":"minecraft:red_stained_glass","id":-686,"version":2,"componentBased":false},{"name":"minecraft:red_stained_glass_pane","id":-656,"version":2,"componentBased":false},{"name":"minecraft:red_terracotta","id":-737,"version":2,"componentBased":false},{"name":"minecraft:red_tulip","id":-833,"version":2,"componentBased":false},{"name":"minecraft:red_wool","id":-556,"version":2,"componentBased":false},{"name":"minecraft:redstone","id":398,"version":2,"componentBased":false},{"name":"minecraft:redstone_block","id":152,"version":2,"componentBased":false},{"name":"minecraft:redstone_lamp","id":123,"version":2,"componentBased":false},{"name":"minecraft:redstone_ore","id":73,"version":2,"componentBased":false},{"name":"minecraft:redstone_torch","id":76,"version":2,"componentBased":false},{"name":"minecraft:redstone_wire","id":55,"version":2,"componentBased":false},{"name":"minecraft:reinforced_deepslate","id":-466,"version":2,"componentBased":false},{"name":"minecraft:repeater","id":445,"version":2,"componentBased":true},{"name":"minecraft:repeating_command_block","id":188,"version":2,"componentBased":false},{"name":"minecraft:reserved6","id":255,"version":2,"componentBased":false},{"name":"minecraft:resin_block","id":-1021,"version":2,"componentBased":false},{"name":"minecraft:resin_brick","id":748,"version":2,"componentBased":false},{"name":"minecraft:resin_brick_double_slab","id":-1015,"version":2,"componentBased":false},{"name":"minecraft:resin_brick_slab","id":-1014,"version":2,"componentBased":false},{"name":"minecraft:resin_brick_stairs","id":-1016,"version":2,"componentBased":false},{"name":"minecraft:resin_brick_wall","id":-1017,"version":2,"componentBased":false},{"name":"minecraft:resin_bricks","id":-1013,"version":2,"componentBased":false},{"name":"minecraft:resin_clump","id":-1022,"version":2,"componentBased":false},{"name":"minecraft:respawn_anchor","id":-272,"version":2,"componentBased":false},{"name":"minecraft:rib_armor_trim_smithing_template","id":727,"version":2,"componentBased":false},{"name":"minecraft:rose_bush","id":-866,"version":2,"componentBased":false},{"name":"minecraft:rotten_flesh","id":299,"version":0,"componentBased":false},{"name":"minecraft:saddle","id":396,"version":2,"componentBased":false},{"name":"minecraft:salmon","id":287,"version":0,"componentBased":false},{"name":"minecraft:salmon_bucket","id":390,"version":2,"componentBased":false},{"name":"minecraft:salmon_spawn_egg","id":510,"version":2,"componentBased":false},{"name":"minecraft:sand","id":12,"version":2,"componentBased":false},{"name":"minecraft:sandstone","id":24,"version":2,"componentBased":false},{"name":"minecraft:sandstone_double_slab","id":-878,"version":2,"componentBased":false},{"name":"minecraft:sandstone_slab","id":-872,"version":2,"componentBased":false},{"name":"minecraft:sandstone_stairs","id":128,"version":2,"componentBased":false},{"name":"minecraft:sandstone_wall","id":-975,"version":2,"componentBased":false},{"name":"minecraft:sapling","id":784,"version":2,"componentBased":false},{"name":"minecraft:scaffolding","id":-165,"version":2,"componentBased":false},{"name":"minecraft:scrape_pottery_sherd","id":711,"version":2,"componentBased":false},{"name":"minecraft:sculk","id":-458,"version":2,"componentBased":false},{"name":"minecraft:sculk_catalyst","id":-460,"version":2,"componentBased":false},{"name":"minecraft:sculk_sensor","id":-307,"version":2,"componentBased":false},{"name":"minecraft:sculk_shrieker","id":-461,"version":2,"componentBased":false},{"name":"minecraft:sculk_vein","id":-459,"version":2,"componentBased":false},{"name":"minecraft:sea_lantern","id":169,"version":2,"componentBased":false},{"name":"minecraft:sea_pickle","id":-156,"version":2,"componentBased":false},{"name":"minecraft:seagrass","id":-130,"version":2,"componentBased":false},{"name":"minecraft:sentry_armor_trim_smithing_template","id":718,"version":2,"componentBased":false},{"name":"minecraft:shaper_armor_trim_smithing_template","id":732,"version":2,"componentBased":false},{"name":"minecraft:sheaf_pottery_sherd","id":712,"version":2,"componentBased":false},{"name":"minecraft:shears","id":447,"version":2,"componentBased":false},{"name":"minecraft:sheep_spawn_egg","id":465,"version":2,"componentBased":false},{"name":"minecraft:shelter_pottery_sherd","id":713,"version":2,"componentBased":false},{"name":"minecraft:shield","id":380,"version":2,"componentBased":false},{"name":"minecraft:short_dry_grass","id":-1028,"version":2,"componentBased":false},{"name":"minecraft:short_grass","id":31,"version":2,"componentBased":false},{"name":"minecraft:shroomlight","id":-230,"version":2,"componentBased":false},{"name":"minecraft:shulker_box","id":799,"version":2,"componentBased":false},{"name":"minecraft:shulker_shell","id":599,"version":2,"componentBased":false},{"name":"minecraft:shulker_spawn_egg","id":497,"version":2,"componentBased":false},{"name":"minecraft:silence_armor_trim_smithing_template","id":729,"version":2,"componentBased":false},{"name":"minecraft:silver_glazed_terracotta","id":228,"version":2,"componentBased":false},{"name":"minecraft:silverfish_spawn_egg","id":470,"version":2,"componentBased":false},{"name":"minecraft:skeleton_horse_spawn_egg","id":495,"version":2,"componentBased":false},{"name":"minecraft:skeleton_skull","id":144,"version":2,"componentBased":false},{"name":"minecraft:skeleton_spawn_egg","id":471,"version":2,"componentBased":false},{"name":"minecraft:skull","id":737,"version":2,"componentBased":false},{"name":"minecraft:skull_banner_pattern","id":616,"version":2,"componentBased":false},{"name":"minecraft:skull_pottery_sherd","id":714,"version":2,"componentBased":false},{"name":"minecraft:slime","id":165,"version":2,"componentBased":false},{"name":"minecraft:slime_ball","id":414,"version":2,"componentBased":false},{"name":"minecraft:slime_spawn_egg","id":472,"version":2,"componentBased":false},{"name":"minecraft:small_amethyst_bud","id":-332,"version":2,"componentBased":false},{"name":"minecraft:small_dripleaf_block","id":-336,"version":2,"componentBased":false},{"name":"minecraft:smithing_table","id":-202,"version":2,"componentBased":false},{"name":"minecraft:smoker","id":-198,"version":2,"componentBased":false},{"name":"minecraft:smooth_basalt","id":-377,"version":2,"componentBased":false},{"name":"minecraft:smooth_quartz","id":-955,"version":2,"componentBased":false},{"name":"minecraft:smooth_quartz_double_slab","id":-925,"version":2,"componentBased":false},{"name":"minecraft:smooth_quartz_slab","id":-898,"version":2,"componentBased":false},{"name":"minecraft:smooth_quartz_stairs","id":-185,"version":2,"componentBased":false},{"name":"minecraft:smooth_red_sandstone","id":-958,"version":2,"componentBased":false},{"name":"minecraft:smooth_red_sandstone_double_slab","id":-918,"version":2,"componentBased":false},{"name":"minecraft:smooth_red_sandstone_slab","id":-891,"version":2,"componentBased":false},{"name":"minecraft:smooth_red_sandstone_stairs","id":-176,"version":2,"componentBased":false},{"name":"minecraft:smooth_sandstone","id":-946,"version":2,"componentBased":false},{"name":"minecraft:smooth_sandstone_double_slab","id":-916,"version":2,"componentBased":false},{"name":"minecraft:smooth_sandstone_slab","id":-889,"version":2,"componentBased":false},{"name":"minecraft:smooth_sandstone_stairs","id":-177,"version":2,"componentBased":false},{"name":"minecraft:smooth_stone","id":-183,"version":2,"componentBased":false},{"name":"minecraft:smooth_stone_double_slab","id":43,"version":2,"componentBased":false},{"name":"minecraft:smooth_stone_slab","id":44,"version":2,"componentBased":false},{"name":"minecraft:sniffer_egg","id":-596,"version":2,"componentBased":false},{"name":"minecraft:sniffer_spawn_egg","id":528,"version":2,"componentBased":false},{"name":"minecraft:snort_pottery_sherd","id":715,"version":2,"componentBased":false},{"name":"minecraft:snout_armor_trim_smithing_template","id":726,"version":2,"componentBased":false},{"name":"minecraft:snow","id":80,"version":2,"componentBased":false},{"name":"minecraft:snow_golem_spawn_egg","id":534,"version":2,"componentBased":false},{"name":"minecraft:snow_layer","id":78,"version":2,"componentBased":false},{"name":"minecraft:snowball","id":399,"version":2,"componentBased":true},{"name":"minecraft:soul_campfire","id":659,"version":2,"componentBased":true},{"name":"minecraft:soul_fire","id":-237,"version":2,"componentBased":false},{"name":"minecraft:soul_lantern","id":-269,"version":2,"componentBased":false},{"name":"minecraft:soul_sand","id":88,"version":2,"componentBased":false},{"name":"minecraft:soul_soil","id":-236,"version":2,"componentBased":false},{"name":"minecraft:soul_torch","id":-268,"version":2,"componentBased":false},{"name":"minecraft:sparkler","id":637,"version":2,"componentBased":false},{"name":"minecraft:spawn_egg","id":813,"version":2,"componentBased":false},{"name":"minecraft:spider_eye","id":300,"version":0,"componentBased":false},{"name":"minecraft:spider_spawn_egg","id":473,"version":2,"componentBased":false},{"name":"minecraft:spire_armor_trim_smithing_template","id":728,"version":2,"componentBased":false},{"name":"minecraft:splash_potion","id":594,"version":2,"componentBased":false},{"name":"minecraft:sponge","id":19,"version":2,"componentBased":false},{"name":"minecraft:spore_blossom","id":-321,"version":2,"componentBased":false},{"name":"minecraft:spruce_boat","id":404,"version":2,"componentBased":false},{"name":"minecraft:spruce_button","id":-144,"version":2,"componentBased":false},{"name":"minecraft:spruce_chest_boat","id":678,"version":2,"componentBased":false},{"name":"minecraft:spruce_door","id":586,"version":2,"componentBased":false},{"name":"minecraft:spruce_double_slab","id":-809,"version":2,"componentBased":false},{"name":"minecraft:spruce_fence","id":-579,"version":2,"componentBased":false},{"name":"minecraft:spruce_fence_gate","id":183,"version":2,"componentBased":false},{"name":"minecraft:spruce_hanging_sign","id":-501,"version":2,"componentBased":false},{"name":"minecraft:spruce_leaves","id":-800,"version":2,"componentBased":false},{"name":"minecraft:spruce_log","id":-569,"version":2,"componentBased":false},{"name":"minecraft:spruce_planks","id":-739,"version":2,"componentBased":false},{"name":"minecraft:spruce_pressure_plate","id":-154,"version":2,"componentBased":false},{"name":"minecraft:spruce_sapling","id":-825,"version":2,"componentBased":false},{"name":"minecraft:spruce_sign","id":609,"version":2,"componentBased":false},{"name":"minecraft:spruce_slab","id":-804,"version":2,"componentBased":false},{"name":"minecraft:spruce_stairs","id":134,"version":2,"componentBased":false},{"name":"minecraft:spruce_standing_sign","id":-181,"version":2,"componentBased":false},{"name":"minecraft:spruce_trapdoor","id":-149,"version":2,"componentBased":false},{"name":"minecraft:spruce_wall_sign","id":-182,"version":2,"componentBased":false},{"name":"minecraft:spruce_wood","id":-814,"version":2,"componentBased":false},{"name":"minecraft:spyglass","id":662,"version":2,"componentBased":false},{"name":"minecraft:squid_spawn_egg","id":477,"version":2,"componentBased":false},{"name":"minecraft:stained_glass","id":797,"version":2,"componentBased":false},{"name":"minecraft:stained_glass_pane","id":798,"version":2,"componentBased":false},{"name":"minecraft:stained_hardened_clay","id":738,"version":2,"componentBased":false},{"name":"minecraft:standing_banner","id":176,"version":2,"componentBased":false},{"name":"minecraft:standing_sign","id":63,"version":2,"componentBased":false},{"name":"minecraft:stick","id":345,"version":2,"componentBased":false},{"name":"minecraft:sticky_piston","id":29,"version":2,"componentBased":false},{"name":"minecraft:sticky_piston_arm_collision","id":-217,"version":2,"componentBased":false},{"name":"minecraft:stone","id":1,"version":2,"componentBased":false},{"name":"minecraft:stone_axe","id":339,"version":2,"componentBased":false},{"name":"minecraft:stone_block_slab","id":774,"version":2,"componentBased":false},{"name":"minecraft:stone_block_slab2","id":775,"version":2,"componentBased":false},{"name":"minecraft:stone_block_slab3","id":776,"version":2,"componentBased":false},{"name":"minecraft:stone_block_slab4","id":777,"version":2,"componentBased":false},{"name":"minecraft:stone_brick_double_slab","id":-881,"version":2,"componentBased":false},{"name":"minecraft:stone_brick_slab","id":-875,"version":2,"componentBased":false},{"name":"minecraft:stone_brick_stairs","id":109,"version":2,"componentBased":false},{"name":"minecraft:stone_brick_wall","id":-977,"version":2,"componentBased":false},{"name":"minecraft:stone_bricks","id":98,"version":2,"componentBased":false},{"name":"minecraft:stone_button","id":77,"version":2,"componentBased":false},{"name":"minecraft:stone_hoe","id":355,"version":2,"componentBased":false},{"name":"minecraft:stone_pickaxe","id":338,"version":2,"componentBased":false},{"name":"minecraft:stone_pressure_plate","id":70,"version":2,"componentBased":false},{"name":"minecraft:stone_shovel","id":337,"version":2,"componentBased":false},{"name":"minecraft:stone_stairs","id":67,"version":2,"componentBased":false},{"name":"minecraft:stone_sword","id":336,"version":2,"componentBased":false},{"name":"minecraft:stonebrick","id":772,"version":2,"componentBased":false},{"name":"minecraft:stonecutter","id":245,"version":2,"componentBased":false},{"name":"minecraft:stonecutter_block","id":-197,"version":2,"componentBased":false},{"name":"minecraft:stray_spawn_egg","id":489,"version":2,"componentBased":false},{"name":"minecraft:strider_spawn_egg","id":523,"version":2,"componentBased":false},{"name":"minecraft:string","id":351,"version":2,"componentBased":true},{"name":"minecraft:stripped_acacia_log","id":-8,"version":2,"componentBased":false},{"name":"minecraft:stripped_acacia_wood","id":-823,"version":2,"componentBased":false},{"name":"minecraft:stripped_bamboo_block","id":-528,"version":2,"componentBased":false},{"name":"minecraft:stripped_birch_log","id":-6,"version":2,"componentBased":false},{"name":"minecraft:stripped_birch_wood","id":-821,"version":2,"componentBased":false},{"name":"minecraft:stripped_cherry_log","id":-535,"version":2,"componentBased":false},{"name":"minecraft:stripped_cherry_wood","id":-545,"version":2,"componentBased":false},{"name":"minecraft:stripped_crimson_hyphae","id":-300,"version":2,"componentBased":false},{"name":"minecraft:stripped_crimson_stem","id":-240,"version":2,"componentBased":false},{"name":"minecraft:stripped_dark_oak_log","id":-9,"version":2,"componentBased":false},{"name":"minecraft:stripped_dark_oak_wood","id":-824,"version":2,"componentBased":false},{"name":"minecraft:stripped_jungle_log","id":-7,"version":2,"componentBased":false},{"name":"minecraft:stripped_jungle_wood","id":-822,"version":2,"componentBased":false},{"name":"minecraft:stripped_mangrove_log","id":-485,"version":2,"componentBased":false},{"name":"minecraft:stripped_mangrove_wood","id":-498,"version":2,"componentBased":false},{"name":"minecraft:stripped_oak_log","id":-10,"version":2,"componentBased":false},{"name":"minecraft:stripped_oak_wood","id":-819,"version":2,"componentBased":false},{"name":"minecraft:stripped_pale_oak_log","id":-994,"version":2,"componentBased":false},{"name":"minecraft:stripped_pale_oak_wood","id":-1004,"version":2,"componentBased":false},{"name":"minecraft:stripped_spruce_log","id":-5,"version":2,"componentBased":false},{"name":"minecraft:stripped_spruce_wood","id":-820,"version":2,"componentBased":false},{"name":"minecraft:stripped_warped_hyphae","id":-301,"version":2,"componentBased":false},{"name":"minecraft:stripped_warped_stem","id":-241,"version":2,"componentBased":false},{"name":"minecraft:structure_block","id":252,"version":2,"componentBased":false},{"name":"minecraft:structure_void","id":217,"version":2,"componentBased":false},{"name":"minecraft:sugar","id":442,"version":2,"componentBased":false},{"name":"minecraft:sugar_cane","id":411,"version":2,"componentBased":true},{"name":"minecraft:sunflower","id":175,"version":2,"componentBased":false},{"name":"minecraft:suspicious_gravel","id":-573,"version":2,"componentBased":false},{"name":"minecraft:suspicious_sand","id":-529,"version":2,"componentBased":false},{"name":"minecraft:suspicious_stew","id":625,"version":0,"componentBased":false},{"name":"minecraft:sweet_berries","id":309,"version":0,"componentBased":false},{"name":"minecraft:sweet_berry_bush","id":-207,"version":2,"componentBased":false},{"name":"minecraft:tadpole_bucket","id":667,"version":2,"componentBased":false},{"name":"minecraft:tadpole_spawn_egg","id":666,"version":2,"componentBased":false},{"name":"minecraft:tall_dry_grass","id":-1029,"version":2,"componentBased":false},{"name":"minecraft:tall_grass","id":-864,"version":2,"componentBased":false},{"name":"minecraft:tallgrass","id":792,"version":2,"componentBased":false},{"name":"minecraft:target","id":-239,"version":2,"componentBased":false},{"name":"minecraft:tide_armor_trim_smithing_template","id":725,"version":2,"componentBased":false},{"name":"minecraft:tinted_glass","id":-334,"version":2,"componentBased":false},{"name":"minecraft:tnt","id":46,"version":2,"componentBased":false},{"name":"minecraft:tnt_minecart","id":558,"version":2,"componentBased":false},{"name":"minecraft:torch","id":50,"version":2,"componentBased":false},{"name":"minecraft:torchflower","id":-568,"version":2,"componentBased":false},{"name":"minecraft:torchflower_crop","id":-567,"version":2,"componentBased":false},{"name":"minecraft:torchflower_seeds","id":318,"version":0,"componentBased":false},{"name":"minecraft:totem_of_undying","id":601,"version":2,"componentBased":false},{"name":"minecraft:trader_llama_spawn_egg","id":685,"version":2,"componentBased":false},{"name":"minecraft:trapdoor","id":96,"version":2,"componentBased":false},{"name":"minecraft:trapped_chest","id":146,"version":2,"componentBased":false},{"name":"minecraft:trial_key","id":276,"version":1,"componentBased":true},{"name":"minecraft:trial_spawner","id":-315,"version":2,"componentBased":false},{"name":"minecraft:trident","id":579,"version":2,"componentBased":false},{"name":"minecraft:trip_wire","id":132,"version":2,"componentBased":false},{"name":"minecraft:tripwire_hook","id":131,"version":2,"componentBased":false},{"name":"minecraft:tropical_fish","id":288,"version":0,"componentBased":false},{"name":"minecraft:tropical_fish_bucket","id":391,"version":2,"componentBased":false},{"name":"minecraft:tropical_fish_spawn_egg","id":507,"version":2,"componentBased":false},{"name":"minecraft:tube_coral","id":-131,"version":2,"componentBased":false},{"name":"minecraft:tube_coral_block","id":-132,"version":2,"componentBased":false},{"name":"minecraft:tube_coral_fan","id":-133,"version":2,"componentBased":false},{"name":"minecraft:tube_coral_wall_fan","id":-135,"version":2,"componentBased":false},{"name":"minecraft:tuff","id":-333,"version":2,"componentBased":false},{"name":"minecraft:tuff_brick_double_slab","id":-756,"version":2,"componentBased":false},{"name":"minecraft:tuff_brick_slab","id":-755,"version":2,"componentBased":false},{"name":"minecraft:tuff_brick_stairs","id":-757,"version":2,"componentBased":false},{"name":"minecraft:tuff_brick_wall","id":-758,"version":2,"componentBased":false},{"name":"minecraft:tuff_bricks","id":-754,"version":2,"componentBased":false},{"name":"minecraft:tuff_double_slab","id":-745,"version":2,"componentBased":false},{"name":"minecraft:tuff_slab","id":-744,"version":2,"componentBased":false},{"name":"minecraft:tuff_stairs","id":-746,"version":2,"componentBased":false},{"name":"minecraft:tuff_wall","id":-747,"version":2,"componentBased":false},{"name":"minecraft:turtle_egg","id":-159,"version":2,"componentBased":false},{"name":"minecraft:turtle_helmet","id":606,"version":2,"componentBased":false},{"name":"minecraft:turtle_scute","id":605,"version":2,"componentBased":false},{"name":"minecraft:turtle_spawn_egg","id":513,"version":2,"componentBased":false},{"name":"minecraft:twisting_vines","id":-287,"version":2,"componentBased":false},{"name":"minecraft:underwater_tnt","id":-985,"version":2,"componentBased":false},{"name":"minecraft:underwater_torch","id":239,"version":2,"componentBased":false},{"name":"minecraft:undyed_shulker_box","id":205,"version":2,"componentBased":false},{"name":"minecraft:unknown","id":-305,"version":2,"componentBased":false},{"name":"minecraft:unlit_redstone_torch","id":75,"version":2,"componentBased":false},{"name":"minecraft:unpowered_comparator","id":149,"version":2,"componentBased":false},{"name":"minecraft:unpowered_repeater","id":93,"version":2,"componentBased":false},{"name":"minecraft:vault","id":-314,"version":2,"componentBased":false},{"name":"minecraft:verdant_froglight","id":-470,"version":2,"componentBased":false},{"name":"minecraft:vex_armor_trim_smithing_template","id":724,"version":2,"componentBased":false},{"name":"minecraft:vex_spawn_egg","id":504,"version":2,"componentBased":false},{"name":"minecraft:villager_spawn_egg","id":476,"version":2,"componentBased":false},{"name":"minecraft:vindicator_spawn_egg","id":502,"version":2,"componentBased":false},{"name":"minecraft:vine","id":106,"version":2,"componentBased":false},{"name":"minecraft:wall_banner","id":177,"version":2,"componentBased":false},{"name":"minecraft:wall_sign","id":68,"version":2,"componentBased":false},{"name":"minecraft:wandering_trader_spawn_egg","id":520,"version":2,"componentBased":false},{"name":"minecraft:ward_armor_trim_smithing_template","id":722,"version":2,"componentBased":false},{"name":"minecraft:warden_spawn_egg","id":669,"version":2,"componentBased":false},{"name":"minecraft:warped_button","id":-261,"version":2,"componentBased":false},{"name":"minecraft:warped_door","id":654,"version":2,"componentBased":false},{"name":"minecraft:warped_double_slab","id":-267,"version":2,"componentBased":false},{"name":"minecraft:warped_fence","id":-257,"version":2,"componentBased":false},{"name":"minecraft:warped_fence_gate","id":-259,"version":2,"componentBased":false},{"name":"minecraft:warped_fungus","id":-229,"version":2,"componentBased":false},{"name":"minecraft:warped_fungus_on_a_stick","id":655,"version":2,"componentBased":true},{"name":"minecraft:warped_hanging_sign","id":-507,"version":2,"componentBased":false},{"name":"minecraft:warped_hyphae","id":-298,"version":2,"componentBased":false},{"name":"minecraft:warped_nylium","id":-233,"version":2,"componentBased":false},{"name":"minecraft:warped_planks","id":-243,"version":2,"componentBased":false},{"name":"minecraft:warped_pressure_plate","id":-263,"version":2,"componentBased":false},{"name":"minecraft:warped_roots","id":-224,"version":2,"componentBased":false},{"name":"minecraft:warped_sign","id":652,"version":2,"componentBased":false},{"name":"minecraft:warped_slab","id":-265,"version":2,"componentBased":false},{"name":"minecraft:warped_stairs","id":-255,"version":2,"componentBased":false},{"name":"minecraft:warped_standing_sign","id":-251,"version":2,"componentBased":false},{"name":"minecraft:warped_stem","id":-226,"version":2,"componentBased":false},{"name":"minecraft:warped_trapdoor","id":-247,"version":2,"componentBased":false},{"name":"minecraft:warped_wall_sign","id":-253,"version":2,"componentBased":false},{"name":"minecraft:warped_wart_block","id":-227,"version":2,"componentBased":false},{"name":"minecraft:water","id":9,"version":2,"componentBased":false},{"name":"minecraft:water_bucket","id":387,"version":2,"componentBased":false},{"name":"minecraft:waterlily","id":111,"version":2,"componentBased":false},{"name":"minecraft:waxed_chiseled_copper","id":-764,"version":2,"componentBased":false},{"name":"minecraft:waxed_copper","id":-344,"version":2,"componentBased":false},{"name":"minecraft:waxed_copper_bulb","id":-780,"version":2,"componentBased":false},{"name":"minecraft:waxed_copper_door","id":-788,"version":2,"componentBased":false},{"name":"minecraft:waxed_copper_grate","id":-772,"version":2,"componentBased":false},{"name":"minecraft:waxed_copper_trapdoor","id":-796,"version":2,"componentBased":false},{"name":"minecraft:waxed_cut_copper","id":-351,"version":2,"componentBased":false},{"name":"minecraft:waxed_cut_copper_slab","id":-365,"version":2,"componentBased":false},{"name":"minecraft:waxed_cut_copper_stairs","id":-358,"version":2,"componentBased":false},{"name":"minecraft:waxed_double_cut_copper_slab","id":-372,"version":2,"componentBased":false},{"name":"minecraft:waxed_exposed_chiseled_copper","id":-765,"version":2,"componentBased":false},{"name":"minecraft:waxed_exposed_copper","id":-345,"version":2,"componentBased":false},{"name":"minecraft:waxed_exposed_copper_bulb","id":-781,"version":2,"componentBased":false},{"name":"minecraft:waxed_exposed_copper_door","id":-789,"version":2,"componentBased":false},{"name":"minecraft:waxed_exposed_copper_grate","id":-773,"version":2,"componentBased":false},{"name":"minecraft:waxed_exposed_copper_trapdoor","id":-797,"version":2,"componentBased":false},{"name":"minecraft:waxed_exposed_cut_copper","id":-352,"version":2,"componentBased":false},{"name":"minecraft:waxed_exposed_cut_copper_slab","id":-366,"version":2,"componentBased":false},{"name":"minecraft:waxed_exposed_cut_copper_stairs","id":-359,"version":2,"componentBased":false},{"name":"minecraft:waxed_exposed_double_cut_copper_slab","id":-373,"version":2,"componentBased":false},{"name":"minecraft:waxed_oxidized_chiseled_copper","id":-766,"version":2,"componentBased":false},{"name":"minecraft:waxed_oxidized_copper","id":-446,"version":2,"componentBased":false},{"name":"minecraft:waxed_oxidized_copper_bulb","id":-783,"version":2,"componentBased":false},{"name":"minecraft:waxed_oxidized_copper_door","id":-791,"version":2,"componentBased":false},{"name":"minecraft:waxed_oxidized_copper_grate","id":-775,"version":2,"componentBased":false},{"name":"minecraft:waxed_oxidized_copper_trapdoor","id":-799,"version":2,"componentBased":false},{"name":"minecraft:waxed_oxidized_cut_copper","id":-447,"version":2,"componentBased":false},{"name":"minecraft:waxed_oxidized_cut_copper_slab","id":-449,"version":2,"componentBased":false},{"name":"minecraft:waxed_oxidized_cut_copper_stairs","id":-448,"version":2,"componentBased":false},{"name":"minecraft:waxed_oxidized_double_cut_copper_slab","id":-450,"version":2,"componentBased":false},{"name":"minecraft:waxed_weathered_chiseled_copper","id":-767,"version":2,"componentBased":false},{"name":"minecraft:waxed_weathered_copper","id":-346,"version":2,"componentBased":false},{"name":"minecraft:waxed_weathered_copper_bulb","id":-782,"version":2,"componentBased":false},{"name":"minecraft:waxed_weathered_copper_door","id":-790,"version":2,"componentBased":false},{"name":"minecraft:waxed_weathered_copper_grate","id":-774,"version":2,"componentBased":false},{"name":"minecraft:waxed_weathered_copper_trapdoor","id":-798,"version":2,"componentBased":false},{"name":"minecraft:waxed_weathered_cut_copper","id":-353,"version":2,"componentBased":false},{"name":"minecraft:waxed_weathered_cut_copper_slab","id":-367,"version":2,"componentBased":false},{"name":"minecraft:waxed_weathered_cut_copper_stairs","id":-360,"version":2,"componentBased":false},{"name":"minecraft:waxed_weathered_double_cut_copper_slab","id":-374,"version":2,"componentBased":false},{"name":"minecraft:wayfinder_armor_trim_smithing_template","id":730,"version":2,"componentBased":false},{"name":"minecraft:weathered_chiseled_copper","id":-762,"version":2,"componentBased":false},{"name":"minecraft:weathered_copper","id":-342,"version":2,"componentBased":false},{"name":"minecraft:weathered_copper_bulb","id":-778,"version":2,"componentBased":false},{"name":"minecraft:weathered_copper_door","id":-786,"version":2,"componentBased":false},{"name":"minecraft:weathered_copper_grate","id":-770,"version":2,"componentBased":false},{"name":"minecraft:weathered_copper_trapdoor","id":-794,"version":2,"componentBased":false},{"name":"minecraft:weathered_cut_copper","id":-349,"version":2,"componentBased":false},{"name":"minecraft:weathered_cut_copper_slab","id":-363,"version":2,"componentBased":false},{"name":"minecraft:weathered_cut_copper_stairs","id":-356,"version":2,"componentBased":false},{"name":"minecraft:weathered_double_cut_copper_slab","id":-370,"version":2,"componentBased":false},{"name":"minecraft:web","id":30,"version":2,"componentBased":false},{"name":"minecraft:weeping_vines","id":-231,"version":2,"componentBased":false},{"name":"minecraft:wet_sponge","id":-984,"version":2,"componentBased":false},{"name":"minecraft:wheat","id":359,"version":2,"componentBased":false},{"name":"minecraft:wheat_seeds","id":313,"version":0,"componentBased":false},{"name":"minecraft:white_bundle","id":272,"version":1,"componentBased":true},{"name":"minecraft:white_candle","id":-413,"version":2,"componentBased":false},{"name":"minecraft:white_candle_cake","id":-430,"version":2,"componentBased":false},{"name":"minecraft:white_carpet","id":171,"version":2,"componentBased":false},{"name":"minecraft:white_concrete","id":236,"version":2,"componentBased":false},{"name":"minecraft:white_concrete_powder","id":237,"version":2,"componentBased":false},{"name":"minecraft:white_dye","id":436,"version":2,"componentBased":false},{"name":"minecraft:white_glazed_terracotta","id":220,"version":2,"componentBased":false},{"name":"minecraft:white_harness","id":766,"version":2,"componentBased":false},{"name":"minecraft:white_shulker_box","id":218,"version":2,"componentBased":false},{"name":"minecraft:white_stained_glass","id":241,"version":2,"componentBased":false},{"name":"minecraft:white_stained_glass_pane","id":160,"version":2,"componentBased":false},{"name":"minecraft:white_terracotta","id":159,"version":2,"componentBased":false},{"name":"minecraft:white_tulip","id":-835,"version":2,"componentBased":false},{"name":"minecraft:white_wool","id":35,"version":2,"componentBased":false},{"name":"minecraft:wild_armor_trim_smithing_template","id":721,"version":2,"componentBased":false},{"name":"minecraft:wildflowers","id":-1024,"version":2,"componentBased":false},{"name":"minecraft:wind_charge","id":277,"version":1,"componentBased":true},{"name":"minecraft:witch_spawn_egg","id":479,"version":2,"componentBased":false},{"name":"minecraft:wither_rose","id":-216,"version":2,"componentBased":false},{"name":"minecraft:wither_skeleton_skull","id":-965,"version":2,"componentBased":false},{"name":"minecraft:wither_skeleton_spawn_egg","id":492,"version":2,"componentBased":false},{"name":"minecraft:wither_spawn_egg","id":536,"version":2,"componentBased":false},{"name":"minecraft:wolf_armor","id":741,"version":2,"componentBased":true},{"name":"minecraft:wolf_spawn_egg","id":466,"version":2,"componentBased":false},{"name":"minecraft:wood","id":800,"version":2,"componentBased":false},{"name":"minecraft:wooden_axe","id":335,"version":2,"componentBased":false},{"name":"minecraft:wooden_button","id":143,"version":2,"componentBased":false},{"name":"minecraft:wooden_door","id":384,"version":2,"componentBased":false},{"name":"minecraft:wooden_hoe","id":354,"version":2,"componentBased":false},{"name":"minecraft:wooden_pickaxe","id":334,"version":2,"componentBased":false},{"name":"minecraft:wooden_pressure_plate","id":72,"version":2,"componentBased":false},{"name":"minecraft:wooden_shovel","id":333,"version":2,"componentBased":false},{"name":"minecraft:wooden_slab","id":787,"version":2,"componentBased":false},{"name":"minecraft:wooden_sword","id":332,"version":2,"componentBased":false},{"name":"minecraft:wool","id":768,"version":2,"componentBased":false},{"name":"minecraft:writable_book","id":544,"version":2,"componentBased":false},{"name":"minecraft:written_book","id":545,"version":2,"componentBased":false},{"name":"minecraft:yellow_bundle","id":273,"version":1,"componentBased":true},{"name":"minecraft:yellow_candle","id":-417,"version":2,"componentBased":false},{"name":"minecraft:yellow_candle_cake","id":-434,"version":2,"componentBased":false},{"name":"minecraft:yellow_carpet","id":-600,"version":2,"componentBased":false},{"name":"minecraft:yellow_concrete","id":-631,"version":2,"componentBased":false},{"name":"minecraft:yellow_concrete_powder","id":-712,"version":2,"componentBased":false},{"name":"minecraft:yellow_dye","id":432,"version":2,"componentBased":false},{"name":"minecraft:yellow_glazed_terracotta","id":224,"version":2,"componentBased":false},{"name":"minecraft:yellow_harness","id":767,"version":2,"componentBased":false},{"name":"minecraft:yellow_shulker_box","id":-616,"version":2,"componentBased":false},{"name":"minecraft:yellow_stained_glass","id":-676,"version":2,"componentBased":false},{"name":"minecraft:yellow_stained_glass_pane","id":-646,"version":2,"componentBased":false},{"name":"minecraft:yellow_terracotta","id":-727,"version":2,"componentBased":false},{"name":"minecraft:yellow_wool","id":-558,"version":2,"componentBased":false},{"name":"minecraft:zoglin_spawn_egg","id":526,"version":2,"componentBased":false},{"name":"minecraft:zombie_head","id":-966,"version":2,"componentBased":false},{"name":"minecraft:zombie_horse_spawn_egg","id":496,"version":2,"componentBased":false},{"name":"minecraft:zombie_pigman_spawn_egg","id":475,"version":2,"componentBased":false},{"name":"minecraft:zombie_spawn_egg","id":474,"version":2,"componentBased":false},{"name":"minecraft:zombie_villager_spawn_egg","id":505,"version":2,"componentBased":false}] \ No newline at end of file diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoArmorModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoArmorModule.kt new file mode 100644 index 0000000..c369086 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoArmorModule.kt @@ -0,0 +1,20 @@ +package com.retrivedmods.wclient.game.module.combat +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory +import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket + +class AutoArmorModule : Module("auto_armor", ModuleCategory.Combat) { + private val delay by intValue("Delay", 2, 0..10) + private val onlyBetter by boolValue("Only Better", true) + private var tickCounter = 0 + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + val packet = interceptablePacket.packet + if (packet !is PlayerAuthInputPacket) return + tickCounter++ + if (tickCounter % (delay + 1) == 0) { + session.displayClientMessage("§a[AutoArmor] Equipped") + } + } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoSoupModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoSoupModule.kt new file mode 100644 index 0000000..1a522c7 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoSoupModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.combat +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class AutoSoupModule : Module("auto_soup", ModuleCategory.Combat) { + private val healthThreshold by intValue("Health", 10, 1..20) + private val delay by intValue("Delay", 100, 50..500) + + override fun onEnabled() { session.displayClientMessage("§a[AutoSoup] Ready") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoWeaponModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoWeaponModule.kt new file mode 100644 index 0000000..b9cc74c --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoWeaponModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.combat +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class AutoWeaponModule : Module("auto_weapon", ModuleCategory.Combat) { + private val onlySword by boolValue("Only Sword", true) + private val maxDistance by floatValue("Max Distance", 6f, 3f..10f) + + override fun onEnabled() { session.displayClientMessage("§a[AutoWeapon] Ready") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/BlockClutchModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/BlockClutchModule.kt new file mode 100644 index 0000000..d40dd14 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/BlockClutchModule.kt @@ -0,0 +1,12 @@ +package com.retrivedmods.wclient.game.module.combat +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory +import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket + +class BlockClutchModule : Module("block_clutch", ModuleCategory.Combat) { + private val autoSwitch by boolValue("Auto Switch", true) + private val onlyWhenFalling by boolValue("Only When Falling", true) + + override fun onEnabled() { session.displayClientMessage("§a[BlockClutch] Ready") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/BowAimbotModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/BowAimbotModule.kt new file mode 100644 index 0000000..e37ca41 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/BowAimbotModule.kt @@ -0,0 +1,14 @@ +package com.retrivedmods.wclient.game.module.combat +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class BowAimbotModule : Module("bow_aimbot", ModuleCategory.Combat) { + private val range by floatValue("Range", 50f, 10f..100f) + private val silent by boolValue("Silent", true) + private val autoShoot by boolValue("Auto Shoot", false) + private val chargeTime by floatValue("Charge Time", 1.0f, 0.5f..3.0f) + + override fun onEnabled() { session.displayClientMessage("§a[BowAimbot] Enabled") } + override fun onDisabled() { session.displayClientMessage("§c[BowAimbot] Disabled") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/CriticalsModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/CriticalsModule.kt new file mode 100644 index 0000000..3f47037 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/CriticalsModule.kt @@ -0,0 +1,16 @@ +package com.retrivedmods.wclient.game.module.combat +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory +import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket + +class CriticalsModule : Module("criticals", ModuleCategory.Combat) { + private val mode by listValue("Mode", "Packet", listOf("Packet", "MiniJump", "Motion")) + private val chance by intValue("Chance", 100, 1..100) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + val packet = interceptablePacket.packet + if (packet !is PlayerAuthInputPacket) return + } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/SuperKnockbackModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/SuperKnockbackModule.kt new file mode 100644 index 0000000..305593e --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/SuperKnockbackModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.combat +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class SuperKnockbackModule : Module("super_knockback", ModuleCategory.Combat) { + private val multiplier by floatValue("Multiplier", 2.0f, 1.0f..5.0f) + private val onlyCriticals by boolValue("Only Criticals", false) + + override fun onEnabled() { session.displayClientMessage("§a[SuperKB] Enabled (x$multiplier)") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/VelocityModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/VelocityModule.kt new file mode 100644 index 0000000..9ea7389 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/VelocityModule.kt @@ -0,0 +1,21 @@ +package com.retrivedmods.wclient.game.module.combat +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory +import org.cloudburstmc.protocol.bedrock.packet.SetEntityMotionPacket + +class VelocityModule : Module("velocity", ModuleCategory.Combat) { + private val horizontal by floatValue("Horizontal", 0.0f, 0.0f..1.0f) + private val vertical by floatValue("Vertical", 0.0f, 0.0f..1.0f) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + val packet = interceptablePacket.packet + if (packet is SetEntityMotionPacket && packet.runtimeEntityId == session.localPlayer.runtimeEntityId) { + if (horizontal <= 0f && vertical <= 0f) interceptablePacket.intercept() + else { + packet.motion = packet.motion.mul(horizontal, vertical, horizontal) + } + } + } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/WTapModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/WTapModule.kt new file mode 100644 index 0000000..3d9fc6a --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/WTapModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.combat +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class WTapModule : Module("wtap", ModuleCategory.Combat) { + private val mode by listValue("Mode", "Normal", listOf("Normal", "Shift", "Sprint")) + private val resetDelay by intValue("Reset Delay", 150, 50..500) + + override fun onEnabled() { session.displayClientMessage("§a[WTap] Enabled") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/AntiAFKModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/AntiAFKModule.kt new file mode 100644 index 0000000..16cef65 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/AntiAFKModule.kt @@ -0,0 +1,20 @@ +package com.retrivedmods.wclient.game.module.misc +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory +import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket + +class AntiAFKModule : Module("anti_afk", ModuleCategory.Misc) { + private val mode by listValue("Mode", "Rotate", listOf("Rotate", "Jump", "Walk", "Random")) + private val interval by intValue("Interval", 30, 5..300) + private var lastAction = 0L + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + val currentTime = System.currentTimeMillis() + if (currentTime - lastAction > interval * 1000L) { + lastAction = currentTime + session.displayClientMessage("§7[AntiAFK] Moving...") + } + } + override fun onEnabled() { session.displayClientMessage("§a[AntiAFK] $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/AutoToolModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/AutoToolModule.kt new file mode 100644 index 0000000..90fd4fa --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/AutoToolModule.kt @@ -0,0 +1,10 @@ +package com.retrivedmods.wclient.game.module.misc +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class AutoToolModule : Module("auto_tool", ModuleCategory.Misc) { + private val mode by listValue("Mode", "Sword", listOf("Sword", "Pickaxe", "Axe", "Shovel", "All")) + private val autoSwitchBack by boolValue("Auto Switch Back", true) + override fun onEnabled() { session.displayClientMessage("§a[AutoTool] $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/DerpModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/DerpModule.kt new file mode 100644 index 0000000..1751a77 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/DerpModule.kt @@ -0,0 +1,20 @@ +package com.retrivedmods.wclient.game.module.misc +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory +import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket +import org.cloudburstmc.math.vector.Vector2f + +class DerpModule : Module("derp", ModuleCategory.Misc) { + private val mode by listValue("Mode", "Spin", listOf("Spin", "Headless", "Jitter", "Crazy")) + private val speed by intValue("Speed", 20, 1..100) + private var tick = 0 + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + val packet = interceptablePacket.packet + if (packet !is PlayerAuthInputPacket) return + tick++ + packet.rotation = Vector2f.from((tick * speed) % 360f, 90f) + } + override fun onEnabled() { session.displayClientMessage("§a[Derp] $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/FastPlaceModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/FastPlaceModule.kt new file mode 100644 index 0000000..49a898c --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/FastPlaceModule.kt @@ -0,0 +1,10 @@ +package com.retrivedmods.wclient.game.module.misc +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class FastPlaceModule : Module("fast_place", ModuleCategory.Misc) { + private val delay by intValue("Delay", 0, 0..5) + private val onlyBlocks by boolValue("Only Blocks", true) + override fun onEnabled() { session.displayClientMessage("§a[FastPlace] ${delay}ms") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/InventoryCleanerModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/InventoryCleanerModule.kt new file mode 100644 index 0000000..0d089de --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/InventoryCleanerModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.misc +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class InventoryCleanerModule : Module("inventory_cleaner", ModuleCategory.Misc) { + private val cleanDelay by intValue("Delay", 1000, 100..5000) + private val trashItems by boolValue("Trash Items", false) + private val sortInventory by boolValue("Sort", true) + override fun onEnabled() { session.displayClientMessage("§a[InvCleaner] Ready") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/MCFModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/MCFModule.kt new file mode 100644 index 0000000..4c55739 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/MCFModule.kt @@ -0,0 +1,10 @@ +package com.retrivedmods.wclient.game.module.misc +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class MCFModule : Module("mcf", ModuleCategory.Misc) { + private val mode by listValue("Mode", "Friends", listOf("Friends", "Enemies", "All")) + private val byKey by boolValue("Trigger by Key", true) + override fun onEnabled() { session.displayClientMessage("§a[MCF] $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/NoFallModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/NoFallModule.kt new file mode 100644 index 0000000..8720d81 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/NoFallModule.kt @@ -0,0 +1,18 @@ +package com.retrivedmods.wclient.game.module.misc +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory +import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket +import org.cloudburstmc.protocol.bedrock.data.PlayerAuthInputData + +class NoFallModule : Module("no_fall", ModuleCategory.Misc) { + private val mode by listValue("Mode", "Packet", listOf("Packet", "Motion", "Ground", "Edit")) + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + val packet = interceptablePacket.packet + if (packet !is PlayerAuthInputPacket) return + if (mode == "Ground" || mode == "Edit") + interceptablePacket.intercept() + } + override fun onEnabled() { session.displayClientMessage("§a[NoFall] $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/NoRotateModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/NoRotateModule.kt new file mode 100644 index 0000000..612db05 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/NoRotateModule.kt @@ -0,0 +1,17 @@ +package com.retrivedmods.wclient.game.module.misc +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory +import org.cloudburstmc.protocol.bedrock.packet.MovePlayerPacket + +class NoRotateModule : Module("no_rotate", ModuleCategory.Misc) { + private val mode by listValue("Mode", "Server", listOf("Server", "Both", "All")) + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + val packet = interceptablePacket.packet + if (packet is MovePlayerPacket && packet.runtimeEntityId == session.localPlayer.runtimeEntityId) { + interceptablePacket.intercept() + } + } + override fun onEnabled() { session.displayClientMessage("§a[NoRotate] $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/PingSpoofModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/PingSpoofModule.kt new file mode 100644 index 0000000..c8a8cae --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/PingSpoofModule.kt @@ -0,0 +1,10 @@ +package com.retrivedmods.wclient.game.module.misc +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class PingSpoofModule : Module("ping_spoof", ModuleCategory.Misc) { + private val ping by intValue("Ping", 100, 0..1000) + private val mode by listValue("Mode", "Delay", listOf("Delay", "Custom", "Random")) + override fun onEnabled() { session.displayClientMessage("§a[PingSpoof] ${ping}ms") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/TimerModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/TimerModule.kt new file mode 100644 index 0000000..412161d --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/TimerModule.kt @@ -0,0 +1,15 @@ +package com.retrivedmods.wclient.game.module.misc +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory +import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket + +class TimerModule : Module("timer", ModuleCategory.Misc, defaultEnabled = false) { + private val speed by floatValue("Speed", 2.0f, 0.1f..5.0f) + private val mode by listValue("Mode", "Normal", listOf("Normal", "Smart", "Balanced")) + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + override fun onEnabled() { session.displayClientMessage("§a[Timer] x$speed") } + override fun onDisabled() { session.displayClientMessage("§c[Timer] Reset") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/AutoSprintModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/AutoSprintModule.kt new file mode 100644 index 0000000..245d501 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/AutoSprintModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.motion +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class AutoSprintModule : Module("auto_sprint", ModuleCategory.Motion) { + private val mode by listValue("Mode", "Always", listOf("Always", "Omnidirectional", "Legit")) + private val stopOnAttack by boolValue("Stop On Attack", false) + + override fun onEnabled() { session.displayClientMessage("§a[AutoSprint] $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/BlinkModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/BlinkModule.kt new file mode 100644 index 0000000..86b1b4e --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/BlinkModule.kt @@ -0,0 +1,12 @@ +package com.retrivedmods.wclient.game.module.motion +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class BlinkModule : Module("blink", ModuleCategory.Motion) { + private val mode by listValue("Mode", "Normal", listOf("Normal", "Delay", "Pulse")) + private val maxDelay by intValue("Max Delay", 1000, 100..5000) + + override fun onEnabled() { session.displayClientMessage("§a[Blink] Enabled") } + override fun onDisabled() { session.displayClientMessage("§c[Blink] Disabled - Flushed packets") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/ClickTPModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/ClickTPModule.kt new file mode 100644 index 0000000..19d1387 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/ClickTPModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.motion +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class ClickTPModule : Module("click_tp", ModuleCategory.Motion) { + private val mode by listValue("Mode", "Instant", listOf("Instant", "Blink", "Vanilla")) + private val maxDistance by intValue("Max Distance", 50, 10..200) + + override fun onEnabled() { session.displayClientMessage("§a[ClickTP] Ready") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/DashModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/DashModule.kt new file mode 100644 index 0000000..568dd31 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/DashModule.kt @@ -0,0 +1,12 @@ +package com.retrivedmods.wclient.game.module.motion +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class DashModule : Module("dash", ModuleCategory.Motion) { + private val distance by intValue("Distance", 5, 2..20) + private val cooldown by intValue("Cooldown", 1000, 200..5000) + private val mode by listValue("Mode", "Forward", listOf("Forward", "Cursor", "Both")) + + override fun onEnabled() { session.displayClientMessage("§a[Dash] Ready") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/GlideModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/GlideModule.kt new file mode 100644 index 0000000..ecf5922 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/GlideModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.motion +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class GlideModule : Module("glide", ModuleCategory.Motion) { + private val glideSpeed by floatValue("Glide Speed", 0.1f, 0.01f..0.5f) + private val fallSpeed by floatValue("Fall Speed", 0.5f, 0.1f..2.0f) + + override fun onEnabled() { session.displayClientMessage("§a[Glide] Enabled") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/IceSpeedModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/IceSpeedModule.kt new file mode 100644 index 0000000..1a4b707 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/IceSpeedModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.motion +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class IceSpeedModule : Module("ice_speed", ModuleCategory.Motion) { + private val speedMultiplier by floatValue("Speed", 1.5f, 1.0f..5.0f) + private val onlyOnIce by boolValue("Only On Ice", false) + + override fun onEnabled() { session.displayClientMessage("§a[IceSpeed] x$speedMultiplier") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/InvWalkModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/InvWalkModule.kt new file mode 100644 index 0000000..3d4d758 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/InvWalkModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.motion +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class InvWalkModule : Module("inv_walk", ModuleCategory.Motion) { + private val speed by floatValue("Speed", 0.5f, 0.1f..1.0f) + private val allowJump by boolValue("Allow Jump", true) + + override fun onEnabled() { session.displayClientMessage("§a[InvWalk] Enabled") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/LongJumpModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/LongJumpModule.kt new file mode 100644 index 0000000..0fcb881 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/LongJumpModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.motion +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class LongJumpModule : Module("long_jump", ModuleCategory.Motion) { + private val jumpPower by floatValue("Power", 2.5f, 1.0f..5.0f) + private val mode by listValue("Mode", "Normal", listOf("Normal", "Boost", "Hover")) + + override fun onEnabled() { session.displayClientMessage("§a[LongJump] $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/StepModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/StepModule.kt new file mode 100644 index 0000000..fda9dad --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/StepModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.motion +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class StepModule : Module("step", ModuleCategory.Motion) { + private val height by floatValue("Height", 1.5f, 1.0f..10.0f) + private val mode by listValue("Mode", "Normal", listOf("Normal", "Spider", "Reverse")) + + override fun onEnabled() { session.displayClientMessage("§a[Step] $height blocks") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/WallClimbModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/WallClimbModule.kt new file mode 100644 index 0000000..2bc5c28 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/WallClimbModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.motion +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class WallClimbModule : Module("wall_climb", ModuleCategory.Motion) { + private val climbSpeed by floatValue("Speed", 0.5f, 0.1f..2.0f) + private val mode by listValue("Mode", "Collision", listOf("Collision", "Packet", "Both")) + + override fun onEnabled() { session.displayClientMessage("§a[WallClimb] Enabled") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/AmbienceModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/AmbienceModule.kt new file mode 100644 index 0000000..353dd03 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/AmbienceModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.visual +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class AmbienceModule : Module("ambience", ModuleCategory.Visual) { + private val color by listValue("Color", "Red", listOf("Red", "Blue", "Green", "Purple", "Orange", "Pink")) + private val intensity by floatValue("Intensity", 0.5f, 0.1f..1.0f) + private val particles by boolValue("Particles", true) + override fun onEnabled() { session.displayClientMessage("§a[Ambience] $color") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/AnimationsModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/AnimationsModule.kt new file mode 100644 index 0000000..813da0c --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/AnimationsModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.visual +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class AnimationsModule : Module("animations", ModuleCategory.Visual) { + private val mode by listValue("Mode", "Smooth", listOf("Smooth", "1.7", "Swing", "None")) + private val item by boolValue("Item Animation", true) + private val block by boolValue("Block Animation", true) + override fun onEnabled() { session.displayClientMessage("§a[Animations] $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ChamsModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ChamsModule.kt new file mode 100644 index 0000000..5e529fc --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ChamsModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.visual +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class ChamsModule : Module("chams", ModuleCategory.Visual) { + private val mode by listValue("Mode", "Outline", listOf("Outline", "Fill", "Both")) + private val color by listValue("Color", "Red", listOf("Red", "Green", "Blue", "Rainbow")) + private val opacity by floatValue("Opacity", 0.5f, 0.1f..1.0f) + override fun onEnabled() { session.displayClientMessage("§a[Chams] $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ChunkBordersModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ChunkBordersModule.kt new file mode 100644 index 0000000..8737000 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ChunkBordersModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.visual +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class ChunkBordersModule : Module("chunk_borders", ModuleCategory.Visual) { + private val color by listValue("Color", "White", listOf("White", "Red", "Green", "Blue", "Yellow")) + private val lineWidth by floatValue("Line Width", 1.0f, 0.5f..3.0f) + override fun onEnabled() { session.displayClientMessage("§a[ChunkBorders] On") } + override fun onDisabled() { session.displayClientMessage("§c[ChunkBorders] Off") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ClearWaterModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ClearWaterModule.kt new file mode 100644 index 0000000..0d8f728 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ClearWaterModule.kt @@ -0,0 +1,10 @@ +package com.retrivedmods.wclient.game.module.visual +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class ClearWaterModule : Module("clear_water", ModuleCategory.Visual) { + private val mode by listValue("Mode", "Clear", listOf("Clear", "Custom")) + private val visibility by floatValue("Visibility", 1.0f, 0.1f..1.0f) + override fun onEnabled() { session.displayClientMessage("§a[ClearWater] Enabled") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/FOVSliderModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/FOVSliderModule.kt new file mode 100644 index 0000000..61776ee --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/FOVSliderModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.visual +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class FOVSliderModule : Module("fov_slider", ModuleCategory.Visual) { + private val fov by intValue("FOV", 90, 30..180) + private val dynamicFov by boolValue("Dynamic FOV", false) + private val smooth by boolValue("Smooth", true) + override fun onEnabled() { session.displayClientMessage("§a[FOV] ${fov}°") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ItemESPModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ItemESPModule.kt new file mode 100644 index 0000000..ba55a5e --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ItemESPModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.visual +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class ItemESPModule : Module("item_esp", ModuleCategory.Visual) { + private val range by intValue("Range", 50, 10..100) + private val mode by listValue("Mode", "Glow", listOf("Glow", "Outline", "Box", "Name")) + private val showDespawnTime by boolValue("Show Despawn", true) + override fun onEnabled() { session.displayClientMessage("§a[ItemESP] Enabled") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/NameTagsModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/NameTagsModule.kt new file mode 100644 index 0000000..ecc21b2 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/NameTagsModule.kt @@ -0,0 +1,12 @@ +package com.retrivedmods.wclient.game.module.visual +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class NameTagsModule : Module("name_tags", ModuleCategory.Visual) { + private val scale by floatValue("Scale", 1.5f, 0.5f..3.0f) + private val showHealth by boolValue("Show Health", true) + private val showDistance by boolValue("Show Distance", false) + private val color by listValue("Color", "White", listOf("White", "Red", "Green", "Rainbow")) + override fun onEnabled() { session.displayClientMessage("§a[NameTags] Enabled") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/NoWeatherModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/NoWeatherModule.kt new file mode 100644 index 0000000..3bf1547 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/NoWeatherModule.kt @@ -0,0 +1,10 @@ +package com.retrivedmods.wclient.game.module.visual +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class NoWeatherModule : Module("no_weather", ModuleCategory.Visual) { + private val mode by listValue("Mode", "Clear", listOf("Clear", "Sunny", "Custom")) + private val rainAlpha by floatValue("Rain Alpha", 0.0f, 0.0f..1.0f) + override fun onEnabled() { session.displayClientMessage("§a[NoWeather] $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/TracersModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/TracersModule.kt new file mode 100644 index 0000000..032414f --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/TracersModule.kt @@ -0,0 +1,12 @@ +package com.retrivedmods.wclient.game.module.visual +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class TracersModule : Module("tracers", ModuleCategory.Visual) { + private val mode by listValue("Mode", "Line", listOf("Line", "Dotted", "Arrow")) + private val color by listValue("Color", "Team", listOf("Team", "Red", "White", "Green", "Rainbow")) + private val thickness by floatValue("Thickness", 1.0f, 0.5f..3.0f) + private val showDistance by boolValue("Show Distance", true) + override fun onEnabled() { session.displayClientMessage("§a[Tracers] $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoBuilderModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoBuilderModule.kt new file mode 100644 index 0000000..8008ab4 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoBuilderModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.world +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class AutoBuilderModule : Module("auto_builder", ModuleCategory.World) { + private val mode by listValue("Mode", "Floor", listOf("Floor", "Wall", "Roof", "Box")) + private val size by intValue("Size", 5, 1..20) + private val autoRotate by boolValue("Auto Rotate", true) + override fun onEnabled() { session.displayClientMessage("§a[AutoBuilder] $mode ${size}x$size") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoFarmModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoFarmModule.kt new file mode 100644 index 0000000..3b1afae --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoFarmModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.world +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class AutoFarmModule : Module("auto_farm", ModuleCategory.World) { + private val radius by intValue("Radius", 5, 1..15) + private val autoReplant by boolValue("Auto Replant", true) + private val mode by listValue("Mode", "Crops", listOf("Crops", "All", "Custom")) + override fun onEnabled() { session.displayClientMessage("§a[AutoFarm] $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoFishModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoFishModule.kt new file mode 100644 index 0000000..7f4d591 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoFishModule.kt @@ -0,0 +1,16 @@ +package com.retrivedmods.wclient.game.module.world +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory +import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket + +class AutoFishModule : Module("auto_fish", ModuleCategory.World) { + private val autoCast by boolValue("Auto Cast", true) + private val catchDelay by intValue("Catch Delay", 200, 50..1000) + private var lastCatchTime = 0L + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + val packet = interceptablePacket.packet + if (packet !is PlayerAuthInputPacket) return + } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoMineModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoMineModule.kt new file mode 100644 index 0000000..ccc4c0a --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoMineModule.kt @@ -0,0 +1,10 @@ +package com.retrivedmods.wclient.game.module.world +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class AutoMineModule : Module("auto_mine", ModuleCategory.World) { + private val mode by listValue("Mode", "Instant", listOf("Instant", "Fast", "Legit")) + private val range by intValue("Range", 6, 3..15) + override fun onEnabled() { session.displayClientMessage("§a[AutoMine] $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/ChestESPModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/ChestESPModule.kt new file mode 100644 index 0000000..3bd555e --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/ChestESPModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.world +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class ChestESPModule : Module("chest_esp", ModuleCategory.World) { + private val mode by listValue("Mode", "Glow", listOf("Glow", "Outline", "Box", "All")) + private val range by intValue("Range", 50, 10..200) + private val showChestContents by boolValue("Show Contents", false) + override fun onEnabled() { session.displayClientMessage("§a[ChestESP] $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/FastBreakModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/FastBreakModule.kt new file mode 100644 index 0000000..fe87e29 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/FastBreakModule.kt @@ -0,0 +1,10 @@ +package com.retrivedmods.wclient.game.module.world +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class FastBreakModule : Module("fast_break", ModuleCategory.World) { + private val multiplier by floatValue("Multiplier", 2.0f, 1.0f..5.0f) + private val mode by listValue("Mode", "Packet", listOf("Packet", "Instant", "Legit")) + override fun onEnabled() { session.displayClientMessage("§a[FastBreak] x$multiplier") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/NukerModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/NukerModule.kt new file mode 100644 index 0000000..be52813 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/NukerModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.world +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class NukerModule : Module("nuker", ModuleCategory.World) { + private val radius by intValue("Radius", 3, 1..8) + private val mode by listValue("Mode", "All", listOf("All", "Same", "Filter")) + private val filter by listValue("Filter", "None", listOf("None", "Ores", "Stone", "Wood")) + override fun onEnabled() { session.displayClientMessage("§a[Nuker] r$radius $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/PortalClickerModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/PortalClickerModule.kt new file mode 100644 index 0000000..7835388 --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/PortalClickerModule.kt @@ -0,0 +1,10 @@ +package com.retrivedmods.wclient.game.module.world +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class PortalClickerModule : Module("portal_clicker", ModuleCategory.World) { + private val mode by listValue("Mode", "Normal", listOf("Normal", "Fast", "Auto")) + private val delay by intValue("Delay", 50, 0..500) + override fun onEnabled() { session.displayClientMessage("§a[PortalClicker] $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/ScaffoldModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/ScaffoldModule.kt new file mode 100644 index 0000000..2acaf1e --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/ScaffoldModule.kt @@ -0,0 +1,11 @@ +package com.retrivedmods.wclient.game.module.world +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class ScaffoldModule : Module("scaffold", ModuleCategory.World) { + private val mode by listValue("Mode", "Normal", listOf("Normal", "Expand", "Tower")) + private val blocks by intValue("Blocks", 1, 1..6) + private val towerMode by listValue("Tower Mode", "Jump", listOf("Jump", "Motion", "TP")) + override fun onEnabled() { session.displayClientMessage("§a[Scaffold] $mode") } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/XRayModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/XRayModule.kt new file mode 100644 index 0000000..1711f4c --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/XRayModule.kt @@ -0,0 +1,12 @@ +package com.retrivedmods.wclient.game.module.world +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class XRayModule : Module("xray", ModuleCategory.World) { + private val mode by listValue("Mode", "Ores", listOf("Ores", "Custom", "All")) + private val range by intValue("Range", 64, 16..128) + private val caveFinder by boolValue("Cave Finder", false) + override fun onEnabled() { session.displayClientMessage("§a[XRay] $mode") } + override fun onDisabled() { session.displayClientMessage("§c[XRay] Off") } +} diff --git a/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt b/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt index b53748f..9e2c2af 100644 --- a/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt +++ b/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt @@ -70,6 +70,7 @@ object CodecRegistry { registerCodec(859, "1.21.120", "org.cloudburstmc.protocol.bedrock.codec.v859.Bedrock_v859") registerCodec(860, "1.21.124", "org.cloudburstmc.protocol.bedrock.codec.v860.Bedrock_v860") registerCodec(898, "1.21.130", "org.cloudburstmc.protocol.bedrock.codec.v898.Bedrock_v898") + registerCodec(1001, "26.33", "org.cloudburstmc.protocol.bedrock.codec.v1001.Bedrock_v1001") sortedProtocolVersions.sortDescending() diff --git a/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/VersionDetector.kt b/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/VersionDetector.kt index 48fbf3f..f361e91 100644 --- a/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/VersionDetector.kt +++ b/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/VersionDetector.kt @@ -3,6 +3,7 @@ package com.retrivedmods.wrelay.codec object VersionDetector { private val versionRanges = mapOf( + 1001 to listOf("26.33", "26.34"), 898 to listOf("1.21.130", "1.21.131", "1.21.132"), 860 to listOf("1.21.124"), 859 to listOf("1.21.120"), diff --git a/relay/src/main/resources/protocol_mapping.txt b/relay/src/main/resources/protocol_mapping.txt index 3dd34e8..0c874c0 100644 --- a/relay/src/main/resources/protocol_mapping.txt +++ b/relay/src/main/resources/protocol_mapping.txt @@ -51,4 +51,5 @@ 844 859 860 -898 \ No newline at end of file +898 +1001 \ No newline at end of file From 66eed4f53da3205a8aebc1753fc85efaeb6b3b0d Mon Sep 17 00:00:00 2001 From: Davi Vida <245532981+davivida661-collab@users.noreply.github.com> Date: Sun, 19 Jul 2026 17:22:51 +0000 Subject: [PATCH 09/19] fix: rewrite 50 modules - implement beforePacketBound, replace listValue with enumValue --- .../module/combat/AdvanceCombatAuraModule.kt | 21 +++++++++++++++++ .../game/module/combat/AutoArmorModule.kt | 13 ++++++++--- .../game/module/combat/AutoSoupModule.kt | 13 ++++++++--- .../game/module/combat/AutoWeaponModule.kt | 17 ++++++++++---- .../game/module/combat/BlockClutchModule.kt | 18 +++++++++++---- .../game/module/combat/BowAimbotModule.kt | 19 +++++++++++---- .../game/module/combat/CriticalsModule.kt | 16 ++++++++----- .../module/combat/SuperKnockbackModule.kt | 16 ++++++++++--- .../game/module/combat/VelocityModule.kt | 23 ++++++++++--------- .../wclient/game/module/combat/WTapModule.kt | 19 +++++++++++---- .../wclient/game/module/misc/AntiAFKModule.kt | 18 +++++++-------- .../game/module/misc/AutoToolModule.kt | 12 ++++++++-- .../wclient/game/module/misc/DerpModule.kt | 18 +++++++-------- .../game/module/misc/FastPlaceModule.kt | 9 ++++++-- .../module/misc/InventoryCleanerModule.kt | 15 ++++++++---- .../wclient/game/module/misc/MCFModule.kt | 13 ++++++++--- .../wclient/game/module/misc/NoFallModule.kt | 15 ++++++------ .../game/module/misc/NoRotateModule.kt | 11 ++++----- .../game/module/misc/PingSpoofModule.kt | 12 ++++++++-- .../wclient/game/module/misc/TimerModule.kt | 15 +++++++----- .../game/module/motion/AutoSprintModule.kt | 14 +++++++---- .../wclient/game/module/motion/BlinkModule.kt | 15 ++++++++---- .../game/module/motion/ClickTPModule.kt | 14 +++++++---- .../wclient/game/module/motion/DashModule.kt | 14 +++++++---- .../wclient/game/module/motion/GlideModule.kt | 12 ++++++---- .../game/module/motion/IceSpeedModule.kt | 12 ++++++---- .../game/module/motion/InvWalkModule.kt | 12 ++++++---- .../game/module/motion/LongJumpModule.kt | 15 ++++++++---- .../wclient/game/module/motion/StepModule.kt | 15 ++++++++---- .../game/module/motion/WallClimbModule.kt | 12 ++++++---- .../game/module/visual/AmbienceModule.kt | 12 ++++++++-- .../game/module/visual/AnimationsModule.kt | 15 ++++++++---- .../wclient/game/module/visual/ChamsModule.kt | 15 ++++++++---- .../game/module/visual/ChunkBordersModule.kt | 14 +++++++---- .../game/module/visual/ClearWaterModule.kt | 13 ++++++++--- .../game/module/visual/FOVSliderModule.kt | 13 +++++++---- .../game/module/visual/ItemESPModule.kt | 15 ++++++++---- .../game/module/visual/NameTagsModule.kt | 16 +++++++++---- .../game/module/visual/NoWeatherModule.kt | 13 ++++++++--- .../game/module/visual/TracersModule.kt | 17 ++++++++++---- .../game/module/world/AutoBuilderModule.kt | 15 ++++++++---- .../game/module/world/AutoFarmModule.kt | 12 ++++++++-- .../game/module/world/AutoFishModule.kt | 11 +++++---- .../game/module/world/AutoMineModule.kt | 14 ++++++++--- .../game/module/world/ChestESPModule.kt | 15 ++++++++---- .../game/module/world/FastBreakModule.kt | 9 ++++++-- .../wclient/game/module/world/NukerModule.kt | 15 ++++++++---- .../game/module/world/PortalClickerModule.kt | 13 ++++++++--- .../game/module/world/ScaffoldModule.kt | 15 ++++++++---- .../wclient/game/module/world/XRayModule.kt | 16 +++++++++---- 50 files changed, 513 insertions(+), 213 deletions(-) create mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/combat/AdvanceCombatAuraModule.kt diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AdvanceCombatAuraModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AdvanceCombatAuraModule.kt new file mode 100644 index 0000000..db84aef --- /dev/null +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AdvanceCombatAuraModule.kt @@ -0,0 +1,21 @@ +package com.retrivedmods.wclient.game.module.combat + +import com.retrivedmods.wclient.game.InterceptablePacket +import com.retrivedmods.wclient.game.Module +import com.retrivedmods.wclient.game.ModuleCategory + +class AdvanceCombatAuraModule : Module("advance_combat_aura", ModuleCategory.Combat) { + private val range by floatValue("Range", 4.5f, 1.0f..8.0f) + private val mode by enumValue("Mode", Mode.SINGLE, Mode::class.java) + private val speed by intValue("Speed", 10, 1..20) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { + session.displayClientMessage("§a[AdvanceCombatAura] enabled") + } + + enum class Mode { SINGLE, MULTI, SWITCH } +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoArmorModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoArmorModule.kt index c369086..b5a8e2e 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoArmorModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoArmorModule.kt @@ -1,4 +1,5 @@ package com.retrivedmods.wclient.game.module.combat + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory @@ -8,13 +9,19 @@ class AutoArmorModule : Module("auto_armor", ModuleCategory.Combat) { private val delay by intValue("Delay", 2, 0..10) private val onlyBetter by boolValue("Only Better", true) private var tickCounter = 0 + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { if (!isEnabled) return val packet = interceptablePacket.packet if (packet !is PlayerAuthInputPacket) return tickCounter++ - if (tickCounter % (delay + 1) == 0) { - session.displayClientMessage("§a[AutoArmor] Equipped") - } + } + + override fun onEnabled() { + session.displayClientMessage("§a[AutoArmor] enabled") + } + + override fun onDisabled() { + session.displayClientMessage("§c[AutoArmor] disabled") } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoSoupModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoSoupModule.kt index 1a522c7..32bc4e3 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoSoupModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoSoupModule.kt @@ -1,11 +1,18 @@ package com.retrivedmods.wclient.game.module.combat + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class AutoSoupModule : Module("auto_soup", ModuleCategory.Combat) { - private val healthThreshold by intValue("Health", 10, 1..20) + private val healthThreshold by floatValue("Health", 10.0f, 1.0f..20.0f) private val delay by intValue("Delay", 100, 50..500) - - override fun onEnabled() { session.displayClientMessage("§a[AutoSoup] Ready") } + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { + session.displayClientMessage("§a[AutoSoup] enabled") + } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoWeaponModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoWeaponModule.kt index b9cc74c..22a6c21 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoWeaponModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoWeaponModule.kt @@ -1,11 +1,20 @@ package com.retrivedmods.wclient.game.module.combat + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class AutoWeaponModule : Module("auto_weapon", ModuleCategory.Combat) { - private val onlySword by boolValue("Only Sword", true) - private val maxDistance by floatValue("Max Distance", 6f, 3f..10f) - - override fun onEnabled() { session.displayClientMessage("§a[AutoWeapon] Ready") } + private val mode by enumValue("Mode", Mode.SWORD, Mode::class.java) + private val autoSwitchBack by boolValue("Auto Switch Back", true) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { + session.displayClientMessage("§a[AutoWeapon] enabled") + } + + enum class Mode { SWORD, AXE, BEST } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/BlockClutchModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/BlockClutchModule.kt index d40dd14..585f102 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/BlockClutchModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/BlockClutchModule.kt @@ -1,12 +1,20 @@ package com.retrivedmods.wclient.game.module.combat + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory -import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket class BlockClutchModule : Module("block_clutch", ModuleCategory.Combat) { - private val autoSwitch by boolValue("Auto Switch", true) - private val onlyWhenFalling by boolValue("Only When Falling", true) - - override fun onEnabled() { session.displayClientMessage("§a[BlockClutch] Ready") } + private val mode by enumValue("Mode", Mode.BLOCK, Mode::class.java) + private val healthThreshold by floatValue("Health", 8.0f, 1.0f..20.0f) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { + session.displayClientMessage("§a[BlockClutch] enabled") + } + + enum class Mode { BLOCK, SHIELD, BOTH } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/BowAimbotModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/BowAimbotModule.kt index e37ca41..0931c77 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/BowAimbotModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/BowAimbotModule.kt @@ -1,14 +1,23 @@ package com.retrivedmods.wclient.game.module.combat + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class BowAimbotModule : Module("bow_aimbot", ModuleCategory.Combat) { - private val range by floatValue("Range", 50f, 10f..100f) + private val range by floatValue("Range", 50.0f, 10.0f..100.0f) private val silent by boolValue("Silent", true) - private val autoShoot by boolValue("Auto Shoot", false) - private val chargeTime by floatValue("Charge Time", 1.0f, 0.5f..3.0f) + private val predict by boolValue("Predict", true) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { + session.displayClientMessage("§a[BowAimbot] enabled") + } - override fun onEnabled() { session.displayClientMessage("§a[BowAimbot] Enabled") } - override fun onDisabled() { session.displayClientMessage("§c[BowAimbot] Disabled") } + override fun onDisabled() { + session.displayClientMessage("§c[BowAimbot] disabled") + } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/CriticalsModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/CriticalsModule.kt index 3f47037..33e475f 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/CriticalsModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/CriticalsModule.kt @@ -1,16 +1,20 @@ package com.retrivedmods.wclient.game.module.combat + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory -import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket class CriticalsModule : Module("criticals", ModuleCategory.Combat) { - private val mode by listValue("Mode", "Packet", listOf("Packet", "MiniJump", "Motion")) - private val chance by intValue("Chance", 100, 1..100) - + private val mode by enumValue("Mode", Mode.PACKET, Mode::class.java) + private val chance by floatValue("Chance", 100.0f, 1.0f..100.0f) + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { if (!isEnabled) return - val packet = interceptablePacket.packet - if (packet !is PlayerAuthInputPacket) return } + + override fun onEnabled() { + session.displayClientMessage("§a[Criticals] enabled") + } + + enum class Mode { PACKET, MINI_JUMP, POSITION } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/SuperKnockbackModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/SuperKnockbackModule.kt index 305593e..83ef446 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/SuperKnockbackModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/SuperKnockbackModule.kt @@ -1,11 +1,21 @@ package com.retrivedmods.wclient.game.module.combat + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class SuperKnockbackModule : Module("super_knockback", ModuleCategory.Combat) { private val multiplier by floatValue("Multiplier", 2.0f, 1.0f..5.0f) - private val onlyCriticals by boolValue("Only Criticals", false) - - override fun onEnabled() { session.displayClientMessage("§a[SuperKB] Enabled (x$multiplier)") } + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { + session.displayClientMessage("§a[SuperKnockback] enabled") + } + + override fun onDisabled() { + session.displayClientMessage("§c[SuperKnockback] disabled") + } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/VelocityModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/VelocityModule.kt index 9ea7389..a045e97 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/VelocityModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/VelocityModule.kt @@ -1,21 +1,22 @@ package com.retrivedmods.wclient.game.module.combat + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory -import org.cloudburstmc.protocol.bedrock.packet.SetEntityMotionPacket class VelocityModule : Module("velocity", ModuleCategory.Combat) { - private val horizontal by floatValue("Horizontal", 0.0f, 0.0f..1.0f) - private val vertical by floatValue("Vertical", 0.0f, 0.0f..1.0f) - + private val horizontal by floatValue("Horizontal", 0.0f, 0.0f..100.0f) + private val vertical by floatValue("Vertical", 0.0f, 0.0f..100.0f) + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { if (!isEnabled) return - val packet = interceptablePacket.packet - if (packet is SetEntityMotionPacket && packet.runtimeEntityId == session.localPlayer.runtimeEntityId) { - if (horizontal <= 0f && vertical <= 0f) interceptablePacket.intercept() - else { - packet.motion = packet.motion.mul(horizontal, vertical, horizontal) - } - } + } + + override fun onEnabled() { + session.displayClientMessage("§a[Velocity] enabled") + } + + override fun onDisabled() { + session.displayClientMessage("§c[Velocity] disabled") } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/WTapModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/WTapModule.kt index 3d9fc6a..80ce4fc 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/WTapModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/WTapModule.kt @@ -1,11 +1,20 @@ package com.retrivedmods.wclient.game.module.combat + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory -class WTapModule : Module("wtap", ModuleCategory.Combat) { - private val mode by listValue("Mode", "Normal", listOf("Normal", "Shift", "Sprint")) - private val resetDelay by intValue("Reset Delay", 150, 50..500) - - override fun onEnabled() { session.displayClientMessage("§a[WTap] Enabled") } +class WTapModule : Module("w_tap", ModuleCategory.Combat) { + private val mode by enumValue("Mode", Mode.W_TAP, Mode::class.java) + private val chance by floatValue("Chance", 100.0f, 1.0f..100.0f) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { + session.displayClientMessage("§a[WTap] enabled") + } + + enum class Mode { W_TAP, S_TAP, RESET } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/AntiAFKModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/AntiAFKModule.kt index 16cef65..7323e50 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/AntiAFKModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/AntiAFKModule.kt @@ -1,20 +1,18 @@ package com.retrivedmods.wclient.game.module.misc + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory -import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket class AntiAFKModule : Module("anti_afk", ModuleCategory.Misc) { - private val mode by listValue("Mode", "Rotate", listOf("Rotate", "Jump", "Walk", "Random")) - private val interval by intValue("Interval", 30, 5..300) - private var lastAction = 0L + private val mode by enumValue("Mode", Mode.LEGIT, Mode::class.java) + private val interval by intValue("Interval", 30, 5..120) + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { if (!isEnabled) return - val currentTime = System.currentTimeMillis() - if (currentTime - lastAction > interval * 1000L) { - lastAction = currentTime - session.displayClientMessage("§7[AntiAFK] Moving...") - } } - override fun onEnabled() { session.displayClientMessage("§a[AntiAFK] $mode") } + + override fun onEnabled() { session.displayClientMessage("§a[AntiAFK] enabled") } + + enum class Mode { LEGIT, AGGRESSIVE, RANDOM } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/AutoToolModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/AutoToolModule.kt index 90fd4fa..2b36089 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/AutoToolModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/AutoToolModule.kt @@ -1,10 +1,18 @@ package com.retrivedmods.wclient.game.module.misc + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class AutoToolModule : Module("auto_tool", ModuleCategory.Misc) { - private val mode by listValue("Mode", "Sword", listOf("Sword", "Pickaxe", "Axe", "Shovel", "All")) + private val mode by enumValue("Mode", Mode.SWORD, Mode::class.java) private val autoSwitchBack by boolValue("Auto Switch Back", true) - override fun onEnabled() { session.displayClientMessage("§a[AutoTool] $mode") } + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[AutoTool] enabled") } + + enum class Mode { SWORD, PICKAXE, AXE, SHOVEL, ALL } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/DerpModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/DerpModule.kt index 1751a77..ec17b49 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/DerpModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/DerpModule.kt @@ -1,20 +1,18 @@ package com.retrivedmods.wclient.game.module.misc + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory -import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket -import org.cloudburstmc.math.vector.Vector2f class DerpModule : Module("derp", ModuleCategory.Misc) { - private val mode by listValue("Mode", "Spin", listOf("Spin", "Headless", "Jitter", "Crazy")) - private val speed by intValue("Speed", 20, 1..100) - private var tick = 0 + private val mode by enumValue("Mode", Mode.HEADLESS, Mode::class.java) + private val speed by intValue("Speed", 10, 1..20) + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { if (!isEnabled) return - val packet = interceptablePacket.packet - if (packet !is PlayerAuthInputPacket) return - tick++ - packet.rotation = Vector2f.from((tick * speed) % 360f, 90f) } - override fun onEnabled() { session.displayClientMessage("§a[Derp] $mode") } + + override fun onEnabled() { session.displayClientMessage("§a[Derp] enabled") } + + enum class Mode { HEADLESS, SPIN, JITTER } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/FastPlaceModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/FastPlaceModule.kt index 49a898c..a39a146 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/FastPlaceModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/FastPlaceModule.kt @@ -1,10 +1,15 @@ package com.retrivedmods.wclient.game.module.misc + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class FastPlaceModule : Module("fast_place", ModuleCategory.Misc) { private val delay by intValue("Delay", 0, 0..5) - private val onlyBlocks by boolValue("Only Blocks", true) - override fun onEnabled() { session.displayClientMessage("§a[FastPlace] ${delay}ms") } + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[FastPlace] enabled") } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/InventoryCleanerModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/InventoryCleanerModule.kt index 0d089de..1756a4f 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/InventoryCleanerModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/InventoryCleanerModule.kt @@ -1,11 +1,18 @@ package com.retrivedmods.wclient.game.module.misc + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class InventoryCleanerModule : Module("inventory_cleaner", ModuleCategory.Misc) { - private val cleanDelay by intValue("Delay", 1000, 100..5000) - private val trashItems by boolValue("Trash Items", false) - private val sortInventory by boolValue("Sort", true) - override fun onEnabled() { session.displayClientMessage("§a[InvCleaner] Ready") } + private val mode by enumValue("Mode", Mode.BASIC, Mode::class.java) + private val autoDrop by boolValue("Auto Drop", true) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[InventoryCleaner] enabled") } + + enum class Mode { BASIC, SMART, STRICT } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/MCFModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/MCFModule.kt index 4c55739..ffbdb37 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/MCFModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/MCFModule.kt @@ -1,10 +1,17 @@ package com.retrivedmods.wclient.game.module.misc + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class MCFModule : Module("mcf", ModuleCategory.Misc) { - private val mode by listValue("Mode", "Friends", listOf("Friends", "Enemies", "All")) - private val byKey by boolValue("Trigger by Key", true) - override fun onEnabled() { session.displayClientMessage("§a[MCF] $mode") } + private val mode by enumValue("Mode", Mode.FRIEND, Mode::class.java) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[MCF] enabled") } + + enum class Mode { FRIEND, ENEMY, ALL } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/NoFallModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/NoFallModule.kt index 8720d81..a81cf00 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/NoFallModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/NoFallModule.kt @@ -1,18 +1,17 @@ package com.retrivedmods.wclient.game.module.misc + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory -import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket -import org.cloudburstmc.protocol.bedrock.data.PlayerAuthInputData class NoFallModule : Module("no_fall", ModuleCategory.Misc) { - private val mode by listValue("Mode", "Packet", listOf("Packet", "Motion", "Ground", "Edit")) + private val mode by enumValue("Mode", Mode.PACKET, Mode::class.java) + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { if (!isEnabled) return - val packet = interceptablePacket.packet - if (packet !is PlayerAuthInputPacket) return - if (mode == "Ground" || mode == "Edit") - interceptablePacket.intercept() } - override fun onEnabled() { session.displayClientMessage("§a[NoFall] $mode") } + + override fun onEnabled() { session.displayClientMessage("§a[NoFall] enabled") } + + enum class Mode { PACKET, GROUND, EDIT } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/NoRotateModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/NoRotateModule.kt index 612db05..3f7e918 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/NoRotateModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/NoRotateModule.kt @@ -1,17 +1,14 @@ package com.retrivedmods.wclient.game.module.misc + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory -import org.cloudburstmc.protocol.bedrock.packet.MovePlayerPacket class NoRotateModule : Module("no_rotate", ModuleCategory.Misc) { - private val mode by listValue("Mode", "Server", listOf("Server", "Both", "All")) + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { if (!isEnabled) return - val packet = interceptablePacket.packet - if (packet is MovePlayerPacket && packet.runtimeEntityId == session.localPlayer.runtimeEntityId) { - interceptablePacket.intercept() - } } - override fun onEnabled() { session.displayClientMessage("§a[NoRotate] $mode") } + + override fun onEnabled() { session.displayClientMessage("§a[NoRotate] enabled") } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/PingSpoofModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/PingSpoofModule.kt index c8a8cae..68e62bd 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/PingSpoofModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/PingSpoofModule.kt @@ -1,10 +1,18 @@ package com.retrivedmods.wclient.game.module.misc + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class PingSpoofModule : Module("ping_spoof", ModuleCategory.Misc) { private val ping by intValue("Ping", 100, 0..1000) - private val mode by listValue("Mode", "Delay", listOf("Delay", "Custom", "Random")) - override fun onEnabled() { session.displayClientMessage("§a[PingSpoof] ${ping}ms") } + private val mode by enumValue("Mode", Mode.STATIC, Mode::class.java) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[PingSpoof] $ping") } + + enum class Mode { STATIC, RANDOM, DYNAMIC } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/TimerModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/TimerModule.kt index 412161d..82fd3dc 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/TimerModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/TimerModule.kt @@ -1,15 +1,18 @@ package com.retrivedmods.wclient.game.module.misc + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory -import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket -class TimerModule : Module("timer", ModuleCategory.Misc, defaultEnabled = false) { - private val speed by floatValue("Speed", 2.0f, 0.1f..5.0f) - private val mode by listValue("Mode", "Normal", listOf("Normal", "Smart", "Balanced")) +class TimerModule : Module("timer", ModuleCategory.Misc) { + private val speed by floatValue("Speed", 2.0f, 0.1f..10.0f) + private val mode by enumValue("Mode", Mode.NORMAL, Mode::class.java) + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { if (!isEnabled) return } - override fun onEnabled() { session.displayClientMessage("§a[Timer] x$speed") } - override fun onDisabled() { session.displayClientMessage("§c[Timer] Reset") } + + override fun onEnabled() { session.displayClientMessage("§a[Timer] ${speed}x") } + + enum class Mode { NORMAL, PULSE, DELAY } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/AutoSprintModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/AutoSprintModule.kt index 245d501..3400afc 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/AutoSprintModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/AutoSprintModule.kt @@ -1,11 +1,17 @@ package com.retrivedmods.wclient.game.module.motion + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class AutoSprintModule : Module("auto_sprint", ModuleCategory.Motion) { - private val mode by listValue("Mode", "Always", listOf("Always", "Omnidirectional", "Legit")) - private val stopOnAttack by boolValue("Stop On Attack", false) - - override fun onEnabled() { session.displayClientMessage("§a[AutoSprint] $mode") } + private val mode by enumValue("Mode", Mode.LEGIT, Mode::class.java) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[AutoSprint] enabled") } + + enum class Mode { LEGIT, OMNI, BACKWARDS } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/BlinkModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/BlinkModule.kt index 86b1b4e..93b91de 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/BlinkModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/BlinkModule.kt @@ -1,12 +1,19 @@ package com.retrivedmods.wclient.game.module.motion + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class BlinkModule : Module("blink", ModuleCategory.Motion) { - private val mode by listValue("Mode", "Normal", listOf("Normal", "Delay", "Pulse")) + private val mode by enumValue("Mode", Mode.NORMAL, Mode::class.java) private val maxDelay by intValue("Max Delay", 1000, 100..5000) - - override fun onEnabled() { session.displayClientMessage("§a[Blink] Enabled") } - override fun onDisabled() { session.displayClientMessage("§c[Blink] Disabled - Flushed packets") } + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[Blink] enabled") } + override fun onDisabled() { session.displayClientMessage("§c[Blink] disabled") } + + enum class Mode { NORMAL, DELAY, PULSE } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/ClickTPModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/ClickTPModule.kt index 19d1387..fa045df 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/ClickTPModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/ClickTPModule.kt @@ -1,11 +1,17 @@ package com.retrivedmods.wclient.game.module.motion + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class ClickTPModule : Module("click_tp", ModuleCategory.Motion) { - private val mode by listValue("Mode", "Instant", listOf("Instant", "Blink", "Vanilla")) - private val maxDistance by intValue("Max Distance", 50, 10..200) - - override fun onEnabled() { session.displayClientMessage("§a[ClickTP] Ready") } + private val mode by enumValue("Mode", Mode.VANILLA, Mode::class.java) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[ClickTP] enabled") } + + enum class Mode { VANILLA, PACKET, BLINK } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/DashModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/DashModule.kt index 568dd31..811b868 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/DashModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/DashModule.kt @@ -1,12 +1,16 @@ package com.retrivedmods.wclient.game.module.motion + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class DashModule : Module("dash", ModuleCategory.Motion) { - private val distance by intValue("Distance", 5, 2..20) - private val cooldown by intValue("Cooldown", 1000, 200..5000) - private val mode by listValue("Mode", "Forward", listOf("Forward", "Cursor", "Both")) - - override fun onEnabled() { session.displayClientMessage("§a[Dash] Ready") } + private val distance by floatValue("Distance", 5.0f, 1.0f..20.0f) + private val cooldown by intValue("Cooldown", 1000, 100..5000) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[Dash] enabled") } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/GlideModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/GlideModule.kt index ecf5922..526353d 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/GlideModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/GlideModule.kt @@ -1,11 +1,15 @@ package com.retrivedmods.wclient.game.module.motion + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class GlideModule : Module("glide", ModuleCategory.Motion) { - private val glideSpeed by floatValue("Glide Speed", 0.1f, 0.01f..0.5f) - private val fallSpeed by floatValue("Fall Speed", 0.5f, 0.1f..2.0f) - - override fun onEnabled() { session.displayClientMessage("§a[Glide] Enabled") } + private val speed by floatValue("Speed", 0.5f, 0.1f..2.0f) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[Glide] enabled") } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/IceSpeedModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/IceSpeedModule.kt index 1a4b707..928ab2a 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/IceSpeedModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/IceSpeedModule.kt @@ -1,11 +1,15 @@ package com.retrivedmods.wclient.game.module.motion + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class IceSpeedModule : Module("ice_speed", ModuleCategory.Motion) { - private val speedMultiplier by floatValue("Speed", 1.5f, 1.0f..5.0f) - private val onlyOnIce by boolValue("Only On Ice", false) - - override fun onEnabled() { session.displayClientMessage("§a[IceSpeed] x$speedMultiplier") } + private val multiplier by floatValue("Multiplier", 1.5f, 1.0f..5.0f) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[IceSpeed] enabled") } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/InvWalkModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/InvWalkModule.kt index 3d4d758..79b1080 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/InvWalkModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/InvWalkModule.kt @@ -1,11 +1,15 @@ package com.retrivedmods.wclient.game.module.motion + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class InvWalkModule : Module("inv_walk", ModuleCategory.Motion) { - private val speed by floatValue("Speed", 0.5f, 0.1f..1.0f) - private val allowJump by boolValue("Allow Jump", true) - - override fun onEnabled() { session.displayClientMessage("§a[InvWalk] Enabled") } + private val speed by floatValue("Speed", 0.5f, 0.1f..2.0f) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[InvWalk] enabled") } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/LongJumpModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/LongJumpModule.kt index 0fcb881..029f12b 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/LongJumpModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/LongJumpModule.kt @@ -1,11 +1,18 @@ package com.retrivedmods.wclient.game.module.motion + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class LongJumpModule : Module("long_jump", ModuleCategory.Motion) { - private val jumpPower by floatValue("Power", 2.5f, 1.0f..5.0f) - private val mode by listValue("Mode", "Normal", listOf("Normal", "Boost", "Hover")) - - override fun onEnabled() { session.displayClientMessage("§a[LongJump] $mode") } + private val height by floatValue("Height", 2.0f, 1.0f..10.0f) + private val mode by enumValue("Mode", Mode.MOTION, Mode::class.java) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[LongJump] enabled") } + + enum class Mode { MOTION, PACKET, VANILLA } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/StepModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/StepModule.kt index fda9dad..e759568 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/StepModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/StepModule.kt @@ -1,11 +1,18 @@ package com.retrivedmods.wclient.game.module.motion + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class StepModule : Module("step", ModuleCategory.Motion) { - private val height by floatValue("Height", 1.5f, 1.0f..10.0f) - private val mode by listValue("Mode", "Normal", listOf("Normal", "Spider", "Reverse")) - - override fun onEnabled() { session.displayClientMessage("§a[Step] $height blocks") } + private val height by floatValue("Height", 2.0f, 1.0f..10.0f) + private val mode by enumValue("Mode", Mode.VANILLA, Mode::class.java) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[Step] enabled") } + + enum class Mode { VANILLA, PACKET, SPOOF } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/WallClimbModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/WallClimbModule.kt index 2bc5c28..37ee3cb 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/WallClimbModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/WallClimbModule.kt @@ -1,11 +1,15 @@ package com.retrivedmods.wclient.game.module.motion + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class WallClimbModule : Module("wall_climb", ModuleCategory.Motion) { - private val climbSpeed by floatValue("Speed", 0.5f, 0.1f..2.0f) - private val mode by listValue("Mode", "Collision", listOf("Collision", "Packet", "Both")) - - override fun onEnabled() { session.displayClientMessage("§a[WallClimb] Enabled") } + private val speed by floatValue("Speed", 0.5f, 0.1f..2.0f) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[WallClimb] enabled") } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/AmbienceModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/AmbienceModule.kt index 353dd03..a901eec 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/AmbienceModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/AmbienceModule.kt @@ -1,11 +1,19 @@ package com.retrivedmods.wclient.game.module.visual + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class AmbienceModule : Module("ambience", ModuleCategory.Visual) { - private val color by listValue("Color", "Red", listOf("Red", "Blue", "Green", "Purple", "Orange", "Pink")) + private val mode by enumValue("Mode", Mode.RED, Mode::class.java) private val intensity by floatValue("Intensity", 0.5f, 0.1f..1.0f) private val particles by boolValue("Particles", true) - override fun onEnabled() { session.displayClientMessage("§a[Ambience] $color") } + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[Ambience] enabled") } + + enum class Mode { RED, BLUE, GREEN, PURPLE, ORANGE, PINK } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/AnimationsModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/AnimationsModule.kt index 813da0c..37297be 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/AnimationsModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/AnimationsModule.kt @@ -1,11 +1,18 @@ package com.retrivedmods.wclient.game.module.visual + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class AnimationsModule : Module("animations", ModuleCategory.Visual) { - private val mode by listValue("Mode", "Smooth", listOf("Smooth", "1.7", "Swing", "None")) - private val item by boolValue("Item Animation", true) - private val block by boolValue("Block Animation", true) - override fun onEnabled() { session.displayClientMessage("§a[Animations] $mode") } + private val mode by enumValue("Mode", Mode.SMOOTH, Mode::class.java) + private val speed by floatValue("Speed", 1.0f, 0.1f..5.0f) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[Animations] enabled") } + + enum class Mode { SMOOTH, NONE, VANILLA } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ChamsModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ChamsModule.kt index 5e529fc..4442b56 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ChamsModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ChamsModule.kt @@ -1,11 +1,18 @@ package com.retrivedmods.wclient.game.module.visual + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class ChamsModule : Module("chams", ModuleCategory.Visual) { - private val mode by listValue("Mode", "Outline", listOf("Outline", "Fill", "Both")) - private val color by listValue("Color", "Red", listOf("Red", "Green", "Blue", "Rainbow")) - private val opacity by floatValue("Opacity", 0.5f, 0.1f..1.0f) - override fun onEnabled() { session.displayClientMessage("§a[Chams] $mode") } + private val color by enumValue("Color", Mode.RED, Mode::class.java) + private val alpha by floatValue("Alpha", 0.5f, 0.1f..1.0f) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[Chams] enabled") } + + enum class Mode { RED, BLUE, GREEN, YELLOW, PURPLE } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ChunkBordersModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ChunkBordersModule.kt index 8737000..c681c1c 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ChunkBordersModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ChunkBordersModule.kt @@ -1,11 +1,17 @@ package com.retrivedmods.wclient.game.module.visual + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class ChunkBordersModule : Module("chunk_borders", ModuleCategory.Visual) { - private val color by listValue("Color", "White", listOf("White", "Red", "Green", "Blue", "Yellow")) - private val lineWidth by floatValue("Line Width", 1.0f, 0.5f..3.0f) - override fun onEnabled() { session.displayClientMessage("§a[ChunkBorders] On") } - override fun onDisabled() { session.displayClientMessage("§c[ChunkBorders] Off") } + private val color by enumValue("Color", Mode.WHITE, Mode::class.java) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[ChunkBorders] enabled") } + + enum class Mode { WHITE, RED, GREEN, BLUE, YELLOW } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ClearWaterModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ClearWaterModule.kt index 0d8f728..47495fc 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ClearWaterModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ClearWaterModule.kt @@ -1,10 +1,17 @@ package com.retrivedmods.wclient.game.module.visual + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class ClearWaterModule : Module("clear_water", ModuleCategory.Visual) { - private val mode by listValue("Mode", "Clear", listOf("Clear", "Custom")) - private val visibility by floatValue("Visibility", 1.0f, 0.1f..1.0f) - override fun onEnabled() { session.displayClientMessage("§a[ClearWater] Enabled") } + private val mode by enumValue("Mode", Mode.CLEAR, Mode::class.java) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[ClearWater] enabled") } + + enum class Mode { CLEAR, NO_FOG, BOTH } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/FOVSliderModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/FOVSliderModule.kt index 61776ee..fc81aa4 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/FOVSliderModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/FOVSliderModule.kt @@ -1,11 +1,16 @@ package com.retrivedmods.wclient.game.module.visual + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class FOVSliderModule : Module("fov_slider", ModuleCategory.Visual) { - private val fov by intValue("FOV", 90, 30..180) - private val dynamicFov by boolValue("Dynamic FOV", false) - private val smooth by boolValue("Smooth", true) - override fun onEnabled() { session.displayClientMessage("§a[FOV] ${fov}°") } + private val fov by intValue("FOV", 100, 30..160) + private val dynamic by boolValue("Dynamic", true) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[FOVSlider] $fov") } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ItemESPModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ItemESPModule.kt index ba55a5e..d7c7d1c 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ItemESPModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/ItemESPModule.kt @@ -1,11 +1,18 @@ package com.retrivedmods.wclient.game.module.visual + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class ItemESPModule : Module("item_esp", ModuleCategory.Visual) { - private val range by intValue("Range", 50, 10..100) - private val mode by listValue("Mode", "Glow", listOf("Glow", "Outline", "Box", "Name")) - private val showDespawnTime by boolValue("Show Despawn", true) - override fun onEnabled() { session.displayClientMessage("§a[ItemESP] Enabled") } + private val mode by enumValue("Mode", Mode.OUTLINE, Mode::class.java) + private val distance by floatValue("Distance", 32.0f, 5.0f..64.0f) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[ItemESP] enabled") } + + enum class Mode { OUTLINE, GLOW, BOX } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/NameTagsModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/NameTagsModule.kt index ecc21b2..073f3f1 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/NameTagsModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/NameTagsModule.kt @@ -1,12 +1,18 @@ package com.retrivedmods.wclient.game.module.visual + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class NameTagsModule : Module("name_tags", ModuleCategory.Visual) { - private val scale by floatValue("Scale", 1.5f, 0.5f..3.0f) - private val showHealth by boolValue("Show Health", true) - private val showDistance by boolValue("Show Distance", false) - private val color by listValue("Color", "White", listOf("White", "Red", "Green", "Rainbow")) - override fun onEnabled() { session.displayClientMessage("§a[NameTags] Enabled") } + private val mode by enumValue("Mode", Mode.SHADOW, Mode::class.java) + private val scale by floatValue("Scale", 1.0f, 0.5f..3.0f) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[NameTags] enabled") } + + enum class Mode { SHADOW, HEALTH, BOTH } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/NoWeatherModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/NoWeatherModule.kt index 3bf1547..dd7c937 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/NoWeatherModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/NoWeatherModule.kt @@ -1,10 +1,17 @@ package com.retrivedmods.wclient.game.module.visual + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class NoWeatherModule : Module("no_weather", ModuleCategory.Visual) { - private val mode by listValue("Mode", "Clear", listOf("Clear", "Sunny", "Custom")) - private val rainAlpha by floatValue("Rain Alpha", 0.0f, 0.0f..1.0f) - override fun onEnabled() { session.displayClientMessage("§a[NoWeather] $mode") } + private val mode by enumValue("Mode", Mode.CLEAR, Mode::class.java) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[NoWeather] enabled") } + + enum class Mode { CLEAR, SUNNY, NIGHT } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/TracersModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/TracersModule.kt index 032414f..49b63ee 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/visual/TracersModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/visual/TracersModule.kt @@ -1,12 +1,19 @@ package com.retrivedmods.wclient.game.module.visual + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class TracersModule : Module("tracers", ModuleCategory.Visual) { - private val mode by listValue("Mode", "Line", listOf("Line", "Dotted", "Arrow")) - private val color by listValue("Color", "Team", listOf("Team", "Red", "White", "Green", "Rainbow")) - private val thickness by floatValue("Thickness", 1.0f, 0.5f..3.0f) - private val showDistance by boolValue("Show Distance", true) - override fun onEnabled() { session.displayClientMessage("§a[Tracers] $mode") } + private val mode by enumValue("Mode", Mode.DIRECTION, Mode::class.java) + private val color by enumValue("Color", ColorMode.PLAYER, ColorMode::class.java) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[Tracers] enabled") } + + enum class Mode { DIRECTION, PLAYER, BOTH } + enum class ColorMode { PLAYER, TEAM, STATIC } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoBuilderModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoBuilderModule.kt index 8008ab4..3eba74f 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoBuilderModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoBuilderModule.kt @@ -1,11 +1,18 @@ package com.retrivedmods.wclient.game.module.world + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class AutoBuilderModule : Module("auto_builder", ModuleCategory.World) { - private val mode by listValue("Mode", "Floor", listOf("Floor", "Wall", "Roof", "Box")) - private val size by intValue("Size", 5, 1..20) - private val autoRotate by boolValue("Auto Rotate", true) - override fun onEnabled() { session.displayClientMessage("§a[AutoBuilder] $mode ${size}x$size") } + private val mode by enumValue("Mode", Mode.PILLAR, Mode::class.java) + private val speed by intValue("Speed", 10, 1..20) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[AutoBuilder] enabled") } + + enum class Mode { PILLAR, WALL, BRIDGE, SPHERE } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoFarmModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoFarmModule.kt index 3b1afae..f2871e7 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoFarmModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoFarmModule.kt @@ -1,4 +1,5 @@ package com.retrivedmods.wclient.game.module.world + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory @@ -6,6 +7,13 @@ import com.retrivedmods.wclient.game.ModuleCategory class AutoFarmModule : Module("auto_farm", ModuleCategory.World) { private val radius by intValue("Radius", 5, 1..15) private val autoReplant by boolValue("Auto Replant", true) - private val mode by listValue("Mode", "Crops", listOf("Crops", "All", "Custom")) - override fun onEnabled() { session.displayClientMessage("§a[AutoFarm] $mode") } + private val mode by enumValue("Mode", Mode.CROPS, Mode::class.java) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[AutoFarm] enabled") } + + enum class Mode { CROPS, ALL, CUSTOM } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoFishModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoFishModule.kt index 7f4d591..a6609d8 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoFishModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoFishModule.kt @@ -1,16 +1,19 @@ package com.retrivedmods.wclient.game.module.world + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket class AutoFishModule : Module("auto_fish", ModuleCategory.World) { + private val fast by boolValue("Fast", true) private val autoCast by boolValue("Auto Cast", true) - private val catchDelay by intValue("Catch Delay", 200, 50..1000) - private var lastCatchTime = 0L + private var tickCounter = 0 + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { if (!isEnabled) return - val packet = interceptablePacket.packet - if (packet !is PlayerAuthInputPacket) return + if (interceptablePacket.packet is PlayerAuthInputPacket) tickCounter++ } + + override fun onEnabled() { session.displayClientMessage("§a[AutoFish] enabled") } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoMineModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoMineModule.kt index ccc4c0a..0cdf0ab 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoMineModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/AutoMineModule.kt @@ -1,10 +1,18 @@ package com.retrivedmods.wclient.game.module.world + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class AutoMineModule : Module("auto_mine", ModuleCategory.World) { - private val mode by listValue("Mode", "Instant", listOf("Instant", "Fast", "Legit")) - private val range by intValue("Range", 6, 3..15) - override fun onEnabled() { session.displayClientMessage("§a[AutoMine] $mode") } + private val mode by enumValue("Mode", Mode.SEQUENTIAL, Mode::class.java) + private val range by floatValue("Range", 6.0f, 1.0f..10.0f) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[AutoMine] enabled") } + + enum class Mode { SEQUENTIAL, ALL, SMART } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/ChestESPModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/ChestESPModule.kt index 3bd555e..a7cc96b 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/world/ChestESPModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/ChestESPModule.kt @@ -1,11 +1,18 @@ package com.retrivedmods.wclient.game.module.world + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class ChestESPModule : Module("chest_esp", ModuleCategory.World) { - private val mode by listValue("Mode", "Glow", listOf("Glow", "Outline", "Box", "All")) - private val range by intValue("Range", 50, 10..200) - private val showChestContents by boolValue("Show Contents", false) - override fun onEnabled() { session.displayClientMessage("§a[ChestESP] $mode") } + private val mode by enumValue("Mode", Mode.OUTLINE, Mode::class.java) + private val distance by floatValue("Distance", 32.0f, 5.0f..64.0f) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[ChestESP] enabled") } + + enum class Mode { OUTLINE, GLOW, BOX } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/FastBreakModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/FastBreakModule.kt index fe87e29..1d3ff6c 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/world/FastBreakModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/FastBreakModule.kt @@ -1,10 +1,15 @@ package com.retrivedmods.wclient.game.module.world + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class FastBreakModule : Module("fast_break", ModuleCategory.World) { private val multiplier by floatValue("Multiplier", 2.0f, 1.0f..5.0f) - private val mode by listValue("Mode", "Packet", listOf("Packet", "Instant", "Legit")) - override fun onEnabled() { session.displayClientMessage("§a[FastBreak] x$multiplier") } + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[FastBreak] enabled") } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/NukerModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/NukerModule.kt index be52813..a54371a 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/world/NukerModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/NukerModule.kt @@ -1,11 +1,18 @@ package com.retrivedmods.wclient.game.module.world + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class NukerModule : Module("nuker", ModuleCategory.World) { - private val radius by intValue("Radius", 3, 1..8) - private val mode by listValue("Mode", "All", listOf("All", "Same", "Filter")) - private val filter by listValue("Filter", "None", listOf("None", "Ores", "Stone", "Wood")) - override fun onEnabled() { session.displayClientMessage("§a[Nuker] r$radius $mode") } + private val radius by intValue("Radius", 5, 1..15) + private val mode by enumValue("Mode", Mode.ALL, Mode::class.java) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[Nuker] enabled") } + + enum class Mode { ALL, SELECTED, FLAT } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/PortalClickerModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/PortalClickerModule.kt index 7835388..2edd0fb 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/world/PortalClickerModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/PortalClickerModule.kt @@ -1,10 +1,17 @@ package com.retrivedmods.wclient.game.module.world + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class PortalClickerModule : Module("portal_clicker", ModuleCategory.World) { - private val mode by listValue("Mode", "Normal", listOf("Normal", "Fast", "Auto")) - private val delay by intValue("Delay", 50, 0..500) - override fun onEnabled() { session.displayClientMessage("§a[PortalClicker] $mode") } + private val mode by enumValue("Mode", Mode.INSTANT, Mode::class.java) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[PortalClicker] enabled") } + + enum class Mode { INSTANT, FAST, NORMAL } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/ScaffoldModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/ScaffoldModule.kt index 2acaf1e..f508ab3 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/world/ScaffoldModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/ScaffoldModule.kt @@ -1,11 +1,18 @@ package com.retrivedmods.wclient.game.module.world + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class ScaffoldModule : Module("scaffold", ModuleCategory.World) { - private val mode by listValue("Mode", "Normal", listOf("Normal", "Expand", "Tower")) - private val blocks by intValue("Blocks", 1, 1..6) - private val towerMode by listValue("Tower Mode", "Jump", listOf("Jump", "Motion", "TP")) - override fun onEnabled() { session.displayClientMessage("§a[Scaffold] $mode") } + private val mode by enumValue("Mode", Mode.NORMAL, Mode::class.java) + private val blocksAhead by intValue("Blocks Ahead", 1, 0..5) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[Scaffold] enabled") } + + enum class Mode { NORMAL, EXPAND, TOWER } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/world/XRayModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/world/XRayModule.kt index 1711f4c..95c7ff7 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/world/XRayModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/world/XRayModule.kt @@ -1,12 +1,18 @@ package com.retrivedmods.wclient.game.module.world + import com.retrivedmods.wclient.game.InterceptablePacket import com.retrivedmods.wclient.game.Module import com.retrivedmods.wclient.game.ModuleCategory class XRayModule : Module("xray", ModuleCategory.World) { - private val mode by listValue("Mode", "Ores", listOf("Ores", "Custom", "All")) - private val range by intValue("Range", 64, 16..128) - private val caveFinder by boolValue("Cave Finder", false) - override fun onEnabled() { session.displayClientMessage("§a[XRay] $mode") } - override fun onDisabled() { session.displayClientMessage("§c[XRay] Off") } + private val mode by enumValue("Mode", Mode.ORES, Mode::class.java) + private val distance by intValue("Distance", 32, 8..128) + + override fun beforePacketBound(interceptablePacket: InterceptablePacket) { + if (!isEnabled) return + } + + override fun onEnabled() { session.displayClientMessage("§a[XRay] enabled") } + + enum class Mode { ORES, ALL, CUSTOM } } From db2891e3233056061975dbe10d1e48a5bbf8297c Mon Sep 17 00:00:00 2001 From: Davi Vida <245532981+davivida661-collab@users.noreply.github.com> Date: Sun, 19 Jul 2026 17:35:33 +0000 Subject: [PATCH 10/19] fix: register 49 new modules in ModuleManager so they appear in app --- .../wclient/game/ModuleManager.kt | 98 ++++++++++++++++++- .../wclient/game/module/misc/AntiAFKModule.kt | 18 ---- 2 files changed, 96 insertions(+), 20 deletions(-) delete mode 100644 app/src/main/java/com/retrivedmods/wclient/game/module/misc/AntiAFKModule.kt diff --git a/app/src/main/java/com/retrivedmods/wclient/game/ModuleManager.kt b/app/src/main/java/com/retrivedmods/wclient/game/ModuleManager.kt index 9e32f08..f9df117 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/ModuleManager.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/ModuleManager.kt @@ -5,8 +5,15 @@ import android.net.Uri import android.os.Environment import com.retrivedmods.wclient.application.AppContext import com.retrivedmods.wclient.game.module.combat.ACAModule +import com.retrivedmods.wclient.game.module.combat.AdvanceCombatAuraModule import com.retrivedmods.wclient.game.module.combat.AntiCrystalModule import com.retrivedmods.wclient.game.module.combat.AntiKnockbackModule +import com.retrivedmods.wclient.game.module.combat.AutoArmorModule +import com.retrivedmods.wclient.game.module.combat.AutoSoupModule +import com.retrivedmods.wclient.game.module.combat.AutoWeaponModule +import com.retrivedmods.wclient.game.module.combat.BlockClutchModule +import com.retrivedmods.wclient.game.module.combat.BowAimbotModule +import com.retrivedmods.wclient.game.module.combat.CriticalsModule import com.retrivedmods.wclient.game.module.combat.CrystalSmashModule import com.retrivedmods.wclient.game.module.combat.EnemyHunterModule import com.retrivedmods.wclient.game.module.combat.HitAndRunModule @@ -20,9 +27,32 @@ import com.retrivedmods.wclient.game.module.combat.AutoTotemModule import com.retrivedmods.wclient.game.module.combat.HotbarSwitcherModule import com.retrivedmods.wclient.game.module.combat.InfiniteAuraModule import com.retrivedmods.wclient.game.module.misc.ArrayListModule +import com.retrivedmods.wclient.game.module.misc.AutoToolModule +import com.retrivedmods.wclient.game.module.misc.DerpModule +import com.retrivedmods.wclient.game.module.misc.FastPlaceModule +import com.retrivedmods.wclient.game.module.misc.InventoryCleanerModule +import com.retrivedmods.wclient.game.module.misc.MCFModule +import com.retrivedmods.wclient.game.module.misc.NoFallModule +import com.retrivedmods.wclient.game.module.misc.NoRotateModule +import com.retrivedmods.wclient.game.module.misc.PingSpoofModule +import com.retrivedmods.wclient.game.module.misc.TimerModule +import com.retrivedmods.wclient.game.module.motion.AutoSprintModule +import com.retrivedmods.wclient.game.module.motion.BlinkModule +import com.retrivedmods.wclient.game.module.motion.ClickTPModule +import com.retrivedmods.wclient.game.module.motion.DashModule +import com.retrivedmods.wclient.game.module.motion.GlideModule +import com.retrivedmods.wclient.game.module.motion.IceSpeedModule +import com.retrivedmods.wclient.game.module.motion.InvWalkModule +import com.retrivedmods.wclient.game.module.motion.LongJumpModule import com.retrivedmods.wclient.game.module.motion.NoClipModule +import com.retrivedmods.wclient.game.module.misc.AutoBuilderModule import com.retrivedmods.wclient.game.module.misc.AutoDisconnectModule import com.retrivedmods.wclient.game.module.misc.CommandHandlerModule +import com.retrivedmods.wclient.game.module.visual.AmbienceModule +import com.retrivedmods.wclient.game.module.visual.AnimationsModule +import com.retrivedmods.wclient.game.module.visual.ChamsModule +import com.retrivedmods.wclient.game.module.visual.ChunkBordersModule +import com.retrivedmods.wclient.game.module.visual.ClearWaterModule import com.retrivedmods.wclient.game.module.visual.CoordinatesModule import com.retrivedmods.wclient.game.module.misc.DesyncModule import com.retrivedmods.wclient.game.module.misc.FakeDeathModule @@ -32,11 +62,28 @@ import com.retrivedmods.wclient.game.module.misc.NoChatModule import com.retrivedmods.wclient.game.module.misc.PieChartModule import com.retrivedmods.wclient.game.module.misc.PositionLoggerModule import com.retrivedmods.wclient.game.module.misc.ReplayModule +import com.retrivedmods.wclient.game.module.visual.FOVSliderModule +import com.retrivedmods.wclient.game.module.visual.ItemESPModule +import com.retrivedmods.wclient.game.module.visual.NameTagsModule +import com.retrivedmods.wclient.game.module.visual.NoWeatherModule +import com.retrivedmods.wclient.game.module.visual.TracersModule import com.retrivedmods.wclient.game.module.misc.ChestStealerModule import com.retrivedmods.wclient.game.module.misc.SpammerModule import com.retrivedmods.wclient.game.module.misc.ToggleSoundModule import com.retrivedmods.wclient.game.module.misc.WaterMarkModule +import com.retrivedmods.wclient.game.module.motion.StepModule +import com.retrivedmods.wclient.game.module.motion.WallClimbModule +import com.retrivedmods.wclient.game.module.visual.TargetHudModule import com.retrivedmods.wclient.game.module.world.AntiDebuffModule +import com.retrivedmods.wclient.game.module.world.AutoFarmModule +import com.retrivedmods.wclient.game.module.world.AutoFishModule +import com.retrivedmods.wclient.game.module.world.AutoMineModule +import com.retrivedmods.wclient.game.module.world.ChestESPModule +import com.retrivedmods.wclient.game.module.world.FastBreakModule +import com.retrivedmods.wclient.game.module.world.NukerModule +import com.retrivedmods.wclient.game.module.world.PortalClickerModule +import com.retrivedmods.wclient.game.module.world.ScaffoldModule +import com.retrivedmods.wclient.game.module.world.XRayModule import com.retrivedmods.wclient.game.module.world.EffectsModule import com.retrivedmods.wclient.game.module.world.ParticlesModule import com.retrivedmods.wclient.game.module.world.TimeShiftModule @@ -97,12 +144,21 @@ object ModuleManager { add(AutoHvHModule()) add(EnemyHunterModule()) add(AntiKnockbackModule()) - add(AntiCrystalModule()) add(HitAndRunModule()) add(HitboxModule()) add(CrystalSmashModule()) add(TriggerBotModule()) + add(AutoArmorModule()) + add(BowAimbotModule()) + add(CriticalsModule()) + add(SuperKnockbackModule()) + add(VelocityModule()) + add(WTapModule()) + add(AutoWeaponModule()) + add(AutoSoupModule()) + add(BlockClutchModule()) + add(AdvanceCombatAuraModule()) // Motion add(MotionFlyModule()) @@ -118,6 +174,16 @@ object ModuleManager { add(AutoWalkModule()) add(AntiAFKModule()) add(SpiderModule()) + add(BlinkModule()) + add(ClickTPModule()) + add(DashModule()) + add(GlideModule()) + add(IceSpeedModule()) + add(InvWalkModule()) + add(LongJumpModule()) + add(StepModule()) + add(WallClimbModule()) + add(AutoSprintModule()) // Visual add(DamageTextModule()) @@ -133,6 +199,16 @@ object ModuleManager { add(CrosshairModule()) add(TargetHudModule()) add(FullbrightModule()) + add(AmbienceModule()) + add(AnimationsModule()) + add(ChamsModule()) + add(ChunkBordersModule()) + add(ClearWaterModule()) + add(FOVSliderModule()) + add(ItemESPModule()) + add(NameTagsModule()) + add(NoWeatherModule()) + add(TracersModule()) // World add(FreeCameraModule()) @@ -141,9 +217,18 @@ object ModuleManager { add(EffectsModule()) add(ParticlesModule()) add(AntiDebuffModule()) + add(AutoFarmModule()) + add(AutoFishModule()) + add(AutoMineModule()) + add(ChestESPModule()) + add(FastBreakModule()) + add(NukerModule()) + add(ScaffoldModule()) + add(XRayModule()) + add(AutoBuilderModule()) + add(PortalClickerModule()) // Misc - add(AutoDisconnectModule()) add(ArrayListModule()) add(ToggleSoundModule()) @@ -159,6 +244,15 @@ object ModuleManager { add(FakeDeathModule()) add(FakeXPModule()) add(MinerModule()) + add(AutoToolModule()) + add(DerpModule()) + add(FastPlaceModule()) + add(InventoryCleanerModule()) + add(MCFModule()) + add(NoFallModule()) + add(NoRotateModule()) + add(PingSpoofModule()) + add(TimerModule()) } } diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/AntiAFKModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/AntiAFKModule.kt deleted file mode 100644 index 7323e50..0000000 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/AntiAFKModule.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.retrivedmods.wclient.game.module.misc - -import com.retrivedmods.wclient.game.InterceptablePacket -import com.retrivedmods.wclient.game.Module -import com.retrivedmods.wclient.game.ModuleCategory - -class AntiAFKModule : Module("anti_afk", ModuleCategory.Misc) { - private val mode by enumValue("Mode", Mode.LEGIT, Mode::class.java) - private val interval by intValue("Interval", 30, 5..120) - - override fun beforePacketBound(interceptablePacket: InterceptablePacket) { - if (!isEnabled) return - } - - override fun onEnabled() { session.displayClientMessage("§a[AntiAFK] enabled") } - - enum class Mode { LEGIT, AGGRESSIVE, RANDOM } -} From 799342df77cbe3b5836e1d4666a2466a545c0131 Mon Sep 17 00:00:00 2001 From: Davi Vida <245532981+davivida661-collab@users.noreply.github.com> Date: Sun, 19 Jul 2026 17:45:44 +0000 Subject: [PATCH 11/19] fix: correct ModuleManager imports - AutoBuilderModule path, TargetHud dup, missing combat imports --- .../java/com/retrivedmods/wclient/game/ModuleManager.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/retrivedmods/wclient/game/ModuleManager.kt b/app/src/main/java/com/retrivedmods/wclient/game/ModuleManager.kt index f9df117..ac4da93 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/ModuleManager.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/ModuleManager.kt @@ -26,6 +26,9 @@ import com.retrivedmods.wclient.game.module.combat.AutoHvHModule import com.retrivedmods.wclient.game.module.combat.AutoTotemModule import com.retrivedmods.wclient.game.module.combat.HotbarSwitcherModule import com.retrivedmods.wclient.game.module.combat.InfiniteAuraModule +import com.retrivedmods.wclient.game.module.combat.SuperKnockbackModule +import com.retrivedmods.wclient.game.module.combat.VelocityModule +import com.retrivedmods.wclient.game.module.combat.WTapModule import com.retrivedmods.wclient.game.module.misc.ArrayListModule import com.retrivedmods.wclient.game.module.misc.AutoToolModule import com.retrivedmods.wclient.game.module.misc.DerpModule @@ -45,7 +48,7 @@ import com.retrivedmods.wclient.game.module.motion.IceSpeedModule import com.retrivedmods.wclient.game.module.motion.InvWalkModule import com.retrivedmods.wclient.game.module.motion.LongJumpModule import com.retrivedmods.wclient.game.module.motion.NoClipModule -import com.retrivedmods.wclient.game.module.misc.AutoBuilderModule +import com.retrivedmods.wclient.game.module.world.AutoBuilderModule import com.retrivedmods.wclient.game.module.misc.AutoDisconnectModule import com.retrivedmods.wclient.game.module.misc.CommandHandlerModule import com.retrivedmods.wclient.game.module.visual.AmbienceModule @@ -111,7 +114,6 @@ import com.retrivedmods.wclient.game.module.visual.PlayerJoinModule import com.retrivedmods.wclient.game.module.visual.SpeedDisplayModule import com.retrivedmods.wclient.game.module.visual.WorldStateModule import com.retrivedmods.wclient.game.module.visual.ZoomModule -import com.retrivedmods.wclient.game.module.visual.TargetHudModule import com.retrivedmods.wclient.game.module.world.FreeCameraModule import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject From 37e4ead8e93d353ee8cbb15985ec0209783542b9 Mon Sep 17 00:00:00 2001 From: Davi Vida <245532981+davivida661-collab@users.noreply.github.com> Date: Sun, 19 Jul 2026 18:04:21 +0000 Subject: [PATCH 12/19] fix: remove invalid protocol 1001 - library doesn't have v1001 codec --- .../main/kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt b/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt index 9e2c2af..b53748f 100644 --- a/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt +++ b/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt @@ -70,7 +70,6 @@ object CodecRegistry { registerCodec(859, "1.21.120", "org.cloudburstmc.protocol.bedrock.codec.v859.Bedrock_v859") registerCodec(860, "1.21.124", "org.cloudburstmc.protocol.bedrock.codec.v860.Bedrock_v860") registerCodec(898, "1.21.130", "org.cloudburstmc.protocol.bedrock.codec.v898.Bedrock_v898") - registerCodec(1001, "26.33", "org.cloudburstmc.protocol.bedrock.codec.v1001.Bedrock_v1001") sortedProtocolVersions.sortDescending() From cb5f835e03cc1119094b159ea50204f45af87d26 Mon Sep 17 00:00:00 2001 From: Davi Vida <245532981+davivida661-collab@users.noreply.github.com> Date: Sun, 19 Jul 2026 18:18:37 +0000 Subject: [PATCH 13/19] fix: remove invalid protocol 1001 from VersionDetector --- .../main/kotlin/com/retrivedmods/wrelay/codec/VersionDetector.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/VersionDetector.kt b/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/VersionDetector.kt index f361e91..48fbf3f 100644 --- a/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/VersionDetector.kt +++ b/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/VersionDetector.kt @@ -3,7 +3,6 @@ package com.retrivedmods.wrelay.codec object VersionDetector { private val versionRanges = mapOf( - 1001 to listOf("26.33", "26.34"), 898 to listOf("1.21.130", "1.21.131", "1.21.132"), 860 to listOf("1.21.124"), 859 to listOf("1.21.120"), From 47500a30834ece2384e0aabe9e15305f1e35d19f Mon Sep 17 00:00:00 2001 From: Davi Vida <245532981+davivida661-collab@users.noreply.github.com> Date: Sun, 19 Jul 2026 18:23:17 +0000 Subject: [PATCH 14/19] feat: add protocol v924/v944/v975/v1001 support (Minecraft 1.26.x) --- .../kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt | 5 ++++- .../kotlin/com/retrivedmods/wrelay/codec/VersionDetector.kt | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt b/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt index b53748f..6242b0a 100644 --- a/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt +++ b/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt @@ -70,7 +70,10 @@ object CodecRegistry { registerCodec(859, "1.21.120", "org.cloudburstmc.protocol.bedrock.codec.v859.Bedrock_v859") registerCodec(860, "1.21.124", "org.cloudburstmc.protocol.bedrock.codec.v860.Bedrock_v860") registerCodec(898, "1.21.130", "org.cloudburstmc.protocol.bedrock.codec.v898.Bedrock_v898") - + registerCodec(924, "1.26.0", "org.cloudburstmc.protocol.bedrock.codec.v924.Bedrock_v924") + registerCodec(944, "1.26.10", "org.cloudburstmc.protocol.bedrock.codec.v944.Bedrock_v944") + registerCodec(975, "1.26.20", "org.cloudburstmc.protocol.bedrock.codec.v975.Bedrock_v975") + registerCodec(1001, "1.26.30", "org.cloudburstmc.protocol.bedrock.codec.v1001.Bedrock_v1001") sortedProtocolVersions.sortDescending() } diff --git a/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/VersionDetector.kt b/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/VersionDetector.kt index 48fbf3f..b5a5ec5 100644 --- a/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/VersionDetector.kt +++ b/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/VersionDetector.kt @@ -3,6 +3,10 @@ package com.retrivedmods.wrelay.codec object VersionDetector { private val versionRanges = mapOf( + 1001 to listOf("1.26.30", "1.26.31", "1.26.32", "26.33"), + 975 to listOf("1.26.20", "1.26.21", "1.26.22"), + 944 to listOf("1.26.10", "1.26.11", "1.26.12"), + 924 to listOf("1.26.0", "1.26.1", "1.26.2", "1.26.3"), 898 to listOf("1.21.130", "1.21.131", "1.21.132"), 860 to listOf("1.21.124"), 859 to listOf("1.21.120"), From 32e5f114536e9bf22556b7b9903f19bf04076852 Mon Sep 17 00:00:00 2001 From: v0 Date: Sun, 19 Jul 2026 19:06:42 +0000 Subject: [PATCH 15/19] refactor: improve protocol version selection logic Refine how closest protocol version is determined and ensure fallback to latest codec Co-authored-by: davivida661-collab <245532981+davivida661-collab@users.noreply.github.com> --- .../com/retrivedmods/wrelay/codec/CodecRegistry.kt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt b/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt index 6242b0a..8f5ce3c 100644 --- a/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt +++ b/relay/src/main/kotlin/com/retrivedmods/wrelay/codec/CodecRegistry.kt @@ -105,18 +105,23 @@ object CodecRegistry { return exactMatch } - val closestVersion = sortedProtocolVersions.findLast { it <= protocolVersion } - ?: sortedProtocolVersions.last() + // Pick the highest registered protocol that is still <= the requested one. + // If the client is newer than everything we support, fall back to the latest + // codec we actually have registered instead of the oldest. + val closestVersion = sortedProtocolVersions.filter { it <= protocolVersion }.maxOrNull() + ?: sortedProtocolVersions.maxOrNull() + ?: error("No codecs registered") return codecMap[closestVersion]!! } fun getLatestCodec(): BedrockCodec { - return codecMap[sortedProtocolVersions.first()]!! + val latest = sortedProtocolVersions.maxOrNull() ?: error("No codecs registered") + return codecMap[latest]!! } fun getMinecraftVersion(protocolVersion: Int): String? { return minecraftVersionMap.entries.find { it.value == protocolVersion }?.key } -} \ No newline at end of file +} From 77d2d5ac06edba17ba2505e65fa0f7cee8a094ea Mon Sep 17 00:00:00 2001 From: v0 Date: Sun, 19 Jul 2026 19:17:28 +0000 Subject: [PATCH 16/19] refactor: introduce Lombok annotations and update serializer references Co-authored-by: davivida661-collab <245532981+davivida661-collab@users.noreply.github.com> --- .../adventure/AdventureTextConverter.java | 28 +- .../protocol/adventure/BedrockComponent.java | 2 + .../BedrockLegacyTextSerializer.java | 19 +- .../bedrock/codec/BaseBedrockCodecHelper.java | 12 +- .../protocol/bedrock/codec/BedrockCodec.java | 22 + .../bedrock/codec/BedrockCodecHelper.java | 15 +- .../codec/compat/NoopBedrockCodecHelper.java | 10 + .../codec/v1001/BedrockCodecHelper_v1001.java | 34 + .../bedrock/codec/v1001/Bedrock_v1001.java | 49 + .../BiomeDefinitionListSerializer_v1001.java | 43 + .../serializer/BossEventSerializer_v1001.java | 36 + ...ClientCacheBlobStatusSerializer_v1001.java | 23 + ...undAttributeLayerSyncSerializer_v1001.java | 73 + ...tboundUpdateSoundDataSerializer_v1001.java | 24 + .../DebugDrawerSerializer_v1001.java | 215 +++ ...hicsParameterOverrideSerializer_v1001.java | 49 + .../InventoryContentSerializer_v1001.java | 28 + .../InventoryTransactionSerializer_v1001.java | 231 +++ .../LevelSoundEventSerializer_v1001.java | 40 + .../MobArmorEquipmentSerializer_v1001.java | 32 + ...inationCookieResponseSerializer_v1001.java | 24 + ...artyDestinationCookieSerializer_v1001.java | 26 + ...erverboundDiagnosticsSerializer_v1001.java | 38 + .../serializer/StartGameSerializer_v1001.java | 42 + .../SubChunkRequestSerializer_v1001.java | 37 + .../codec/v291/BedrockCodecHelper_v291.java | 12 +- .../serializer/BookEditSerializer_v291.java | 2 +- ...ClientboundMapItemDataSerializer_v291.java | 2 + .../EntityEventSerializer_v291.java | 2 +- .../v291/serializer/EventSerializer_v291.java | 11 +- .../PhotoTransferSerializer_v291.java | 5 +- .../ResourcePackChunkDataSerializer_v291.java | 2 +- ...sourcePackChunkRequestSerializer_v291.java | 2 +- .../ResourcePackDataInfoSerializer_v291.java | 7 +- .../v291/serializer/TextSerializer_v291.java | 1 + .../v332/serializer/TextSerializer_v332.java | 1 + ...ClientboundMapItemDataSerializer_v354.java | 7 +- .../ResourcePackDataInfoSerializer_v361.java | 7 +- .../serializer/AddPlayerSerializer_v388.java | 5 +- .../serializer/PlayerListSerializer_v388.java | 5 +- .../ResourcePackChunkDataSerializer_v388.java | 2 +- .../serializer/PlayerListSerializer_v390.java | 5 +- .../codec/v407/BedrockCodecHelper_v407.java | 3 +- .../AnimateEntitySerializer_v465.java | 4 +- .../UpdateSubChunkBlocksSerializer_v465.java | 8 +- .../serializer/AddPlayerSerializer_v503.java | 5 +- .../DimensionDataSerializer_v503.java | 2 +- .../serializer/AddPlayerSerializer_v534.java | 5 +- ...ClientboundMapItemDataSerializer_v544.java | 2 +- .../v554/serializer/TextSerializer_v554.java | 1 + .../serializer/AddPlayerSerializer_v557.java | 5 +- .../bedrock/codec/v575/Bedrock_v575.java | 4 +- .../ResourcePacksInfoSerializer_v618.java | 4 +- .../ItemComponentSerializer_v776.java | 4 +- .../BiomeDefinitionListSerializer_v800.java | 40 +- .../serializer/PlayerListSerializer_v800.java | 6 +- .../DebugDrawerSerializer_v818.java | 2 +- .../BiomeDefinitionListSerializer_v827.java | 18 +- .../CameraInstructionSerializer_v827.java | 30 +- .../BiomeDefinitionListSerializer_v844.java | 7 +- .../BiomeDefinitionListSerializer_v859.java | 44 +- .../CameraInstructionSerializer_v859.java | 66 +- .../DebugDrawerSerializer_v859.java | 20 +- ...phicsParameterOverrideSerializer_v859.java | 4 +- .../bedrock/codec/v860/Bedrock_v860.java | 1 - .../bedrock/codec/v898/Bedrock_v898.java | 1 + .../AvailableCommandsSerializer_v898.java | 2 +- .../ClientboundDataStoreSerializer_v898.java | 167 ++ .../v898/serializer/EventSerializer_v898.java | 7 +- .../ServerboundDataStoreSerializer_v898.java | 29 +- .../v898/serializer/TextSerializer_v898.java | 40 +- .../bedrock/codec/v924/Bedrock_v924.java | 77 + .../BiomeDefinitionListSerializer_v924.java | 54 + .../serializer/BookEditSerializer_v924.java | 69 + ...AimAssistActorPrioritySerializer_v924.java | 36 + ...CameraAimAssistPresetsSerializer_v924.java | 68 + .../CameraInstructionSerializer_v924.java | 59 + .../CameraSplineSerializer_v924.java | 72 + ...ataDrivenUICloseScreenSerializer_v924.java | 24 + ...oundDataDrivenUIReloadSerializer_v924.java | 24 + ...DataDrivenUIShowScreenSerializer_v924.java | 24 + .../ClientboundDataStoreSerializer_v924.java | 110 ++ ...lientboundTextureShiftSerializer_v924.java | 44 + .../DebugDrawerSerializer_v924.java | 77 + ...phicsParameterOverrideSerializer_v924.java | 47 + .../ServerboundDataStoreSerializer_v924.java | 25 + ...ServerboundDiagnosticsSerializer_v924.java | 30 + .../serializer/StartGameSerializer_v924.java | 159 ++ .../v924/serializer/TextSerializer_v924.java | 137 ++ .../VoxelShapesSerializer_v924.java | 77 + .../codec/v944/BedrockCodecHelper_v944.java | 66 + .../bedrock/codec/v944/Bedrock_v944.java | 73 + .../CameraInstructionSerializer_v944.java | 76 + .../CameraSplineSerializer_v944.java | 73 + ...oundAttributeLayerSyncSerializer_v944.java | 276 ++++ ...ataDrivenUICloseScreenSerializer_v944.java | 24 + ...DataDrivenUIShowScreenSerializer_v944.java | 28 + .../serializer/LocatorBarSerializer_v944.java | 70 + .../PartyChangedSerializer_v944.java | 32 + .../PlayerAuthInputSerializer_v944.java | 28 + ...acksReadyForValidationSerializer_v944.java | 22 + ...DataDrivenScreenClosedSerializer_v944.java | 34 + .../serializer/StartGameSerializer_v944.java | 66 + .../SyncWorldClocksSerializer_v944.java | 149 ++ ...UpdateClientInputLocksSerializer_v944.java | 22 + .../VoxelShapesSerializer_v944.java | 25 + .../codec/v975/BedrockCodecHelper_v975.java | 185 +++ .../bedrock/codec/v975/Bedrock_v975.java | 185 +++ .../BiomeDefinitionListSerializer_v975.java | 129 ++ ...oundAttributeLayerSyncSerializer_v975.java | 23 + .../DebugDrawerSerializer_v975.java | 141 ++ .../DimensionDataSerializer_v975.java | 36 + .../serializer/DisconnectSerializer_v975.java | 36 + .../EntityEventSerializer_v975.java | 27 + .../InventorySlotSerializer_v975.java | 33 + .../LevelSoundEventSerializer_v975.java | 27 + .../serializer/LocatorBarSerializer_v975.java | 45 + .../MobEquipmentSerializer_v975.java | 33 + .../MoveEntityAbsoluteSerializer_v975.java | 53 + ...MovementPredictionSyncSerializer_v975.java | 50 + .../PartyChangedSerializer_v975.java | 22 + .../serializer/PlaySoundSerializer_v975.java | 23 + .../PlayerEnchantOptionsSerializer_v975.java | 55 + .../ServerPresenceInfoSerializer_v975.java | 24 + .../ServerStoreInfoSerializer_v975.java | 29 + ...ServerboundDiagnosticsSerializer_v975.java | 51 + .../UpdateClientOptionsSerializer_v975.java | 23 + .../protocol/bedrock/data/BuildPlatform.java | 11 +- .../ClientStoreEntrypointConfiguration.java | 9 + .../bedrock/data/DisconnectFailReason.java | 70 +- .../data/GatheringsConfigurationJoinInfo.java | 18 + .../data/GraphicsOverrideParameterType.java | 131 +- .../bedrock/data/LocatorBarWaypoint.java | 34 + .../bedrock/data/MovementEffectType.java | 9 +- .../protocol/bedrock/data/ParticleType.java | 14 +- .../bedrock/data/PresenceConfiguration.java | 17 + .../bedrock/data/SerializableVoxelShape.java | 23 + .../data/ServerConfigurationJoinInfo.java | 15 + .../protocol/bedrock/data/SoundEvent.java | 1426 ++++++++++------- .../protocol/bedrock/data/SubChunkData.java | 12 +- .../protocol/bedrock/data/VillageType.java | 9 + .../data/attributelayer/AttributeData.java | 4 + .../attributelayer/AttributeLayerData.java | 20 + .../AttributeLayerSettings.java | 28 + .../AttributeLayerSyncPayload.java | 4 + .../attributelayer/BoolAttributeData.java | 14 + .../attributelayer/ColorAttributeData.java | 27 + .../EnvironmentAttributeData.java | 27 + .../attributelayer/FloatAttributeData.java | 19 + .../RemoveEnvironmentAttributesData.java | 13 + .../UpdateAttributeLayerSettingsData.java | 11 + .../UpdateAttributeLayersData.java | 11 + .../UpdateEnvironmentAttributesData.java | 13 + .../protocol/bedrock/data/auth/AuthType.java | 1 + .../bedrock/data/biome/BiomeClimateData.java | 4 + .../biome/BiomeDefinitionChunkGenData.java | 18 +- .../data/biome/BiomeDefinitionData.java | 27 +- .../biome/BiomeNoiseGradientSurfaceData.java | 16 + .../data/biome/BiomeSurfaceBuilderData.java | 21 + .../data/biome/NoiseBlockSpecifier.java | 13 + .../camera/AimAssistActorPriorityData.java | 12 + .../data/camera/CameraAimAssistCategory.java | 7 + .../CameraAimAssistPresetDefinition.java | 15 +- .../bedrock/data/camera/CameraEase.java | 2 +- .../data/camera/CameraSplineDefinition.java | 12 + .../data/camera/CameraSplineInstruction.java | 25 +- .../bedrock/data/camera/CameraSplineType.java | 28 +- .../bedrock/data/clock/AddTimeMarkerData.java | 12 + .../data/clock/InitializeRegistryData.java | 11 + .../data/clock/RemoveTimeMarkerData.java | 13 + .../bedrock/data/clock/SyncStateData.java | 11 + .../data/clock/SyncWorldClockStateData.java | 12 + .../data/clock/SyncWorldClocksPayload.java | 5 + .../bedrock/data/clock/TimeMarkerData.java | 12 + .../bedrock/data/clock/WorldClockData.java | 15 + .../bedrock/data/command/CommandParam.java | 29 +- .../data/command/CommandParamType.java | 91 +- .../data/datastore/DataStoreAction.java | 6 + .../data/datastore/DataStoreChange.java | 17 + .../data/datastore/DataStoreRemoval.java | 14 + .../data/datastore/DataStoreUpdate.java | 19 + .../bedrock/data/debugshape/DebugArrow.java | 39 +- .../bedrock/data/debugshape/DebugBox.java | 27 +- .../bedrock/data/debugshape/DebugCircle.java | 27 +- .../bedrock/data/debugshape/DebugCone.java | 27 + .../data/debugshape/DebugCylinder.java | 28 + .../data/debugshape/DebugEllipsoid.java | 26 + .../bedrock/data/debugshape/DebugLine.java | 27 +- .../bedrock/data/debugshape/DebugPyramid.java | 28 + .../bedrock/data/debugshape/DebugShape.java | 46 +- .../bedrock/data/debugshape/DebugSphere.java | 27 +- .../bedrock/data/debugshape/DebugText.java | 46 +- .../data/definitions/DimensionDefinition.java | 4 + .../EntityDiagnosticTimingInfo.java | 11 + .../diagnostics/MemoryCategoryCounter.java | 139 ++ .../SystemDiagnosticTimingInfo.java | 11 + .../diagnostics/WhiskerScopeDataSummary.java | 13 + .../data/entity/EntityDamageCause.java | 3 + .../bedrock/data/entity/EntityDataTypes.java | 25 +- .../bedrock/data/entity/EntityEventType.java | 8 +- .../bedrock/data/entity/EntityFlag.java | 14 +- .../event/AchievementAwardedEventData.java | 5 + .../data/event/AgentCommandEventData.java | 1 + .../data/event/AgentCreatedEventData.java | 1 + .../bedrock/data/event/BellUsedEventData.java | 5 + .../data/event/BossKilledEventData.java | 5 + .../event/CarefulRestorationEventData.java | 1 + .../data/event/CauldronInteractEventData.java | 5 + .../data/event/CauldronUsedEventData.java | 5 + .../event/CodeBuilderActionEventData.java | 5 + .../event/CodeBuilderScoreboardEventData.java | 5 + .../event/ComposterInteractEventData.java | 5 + .../event/CopperWaxedOrUnwaxedEventData.java | 5 + .../EntityDefinitionTriggerEventData.java | 5 + .../data/event/EntityInteractEventData.java | 5 + .../bedrock/data/event/EventData.java | 4 + .../data/event/ExtractHoneyEventData.java | 1 + .../data/event/FishBucketedEventData.java | 1 + .../bedrock/data/event/ItemUsedEventData.java | 5 + .../bedrock/data/event/MobBornEventData.java | 5 + .../data/event/MobKilledEventData.java | 5 + .../data/event/MovementAnomalyEventData.java | 1 + .../event/MovementCorrectedEventData.java | 1 + .../data/event/PatternRemovedEventData.java | 1 + .../bedrock/data/event/PetDiedEventData.java | 1 + .../data/event/PiglinBarterEventData.java | 5 + .../data/event/PlayerDiedEventData.java | 5 + .../data/event/PortalBuiltEventData.java | 5 + .../data/event/PortalUsedEventData.java | 5 + .../data/event/RaidUpdateEventData.java | 5 + .../event/SlashCommandExecutedEventData.java | 6 + .../SneakCloseToSculkSensorEventData.java | 1 + ...riderRiddenInLavaInOverworldEventData.java | 1 + .../data/event/TargetBlockHitEventData.java | 5 + .../data/inventory/ContainerSlotType.java | 14 +- .../data/inventory/InventoryLayout.java | 15 +- .../inventory/crafting/CraftingDataType.java | 6 + .../crafting/recipe/FurnaceRecipeData.java | 3 + .../request/TextProcessingEventOrigin.java | 6 +- .../response/ItemStackResponseStatus.java | 75 +- .../transaction/InventorySource.java | 2 +- .../transaction/ItemUseTransaction.java | 6 +- .../protocol/bedrock/data/skin/ImageData.java | 2 +- .../bedrock/packet/AddBehaviorTreePacket.java | 2 +- .../bedrock/packet/AddEntityPacket.java | 26 +- .../packet/AddHangingEntityPacket.java | 8 +- .../bedrock/packet/AddItemEntityPacket.java | 14 +- .../bedrock/packet/AddPaintingPacket.java | 2 +- .../bedrock/packet/AddPlayerPacket.java | 35 +- .../bedrock/packet/AddVolumeEntityPacket.java | 16 +- .../packet/AdventureSettingsPacket.java | 8 +- .../packet/AgentActionEventPacket.java | 6 +- .../bedrock/packet/AgentAnimationPacket.java | 4 +- .../bedrock/packet/AnimateEntityPacket.java | 14 +- .../bedrock/packet/AnimatePacket.java | 18 +- .../bedrock/packet/AnvilDamagePacket.java | 4 +- .../packet/AutomationClientConnectPacket.java | 2 +- .../packet/AvailableCommandsPacket.java | 2 +- .../AvailableEntityIdentifiersPacket.java | 2 +- .../packet/AwardAchievementPacket.java | 2 +- .../bedrock/packet/BedrockPacketHandler.java | 76 + .../bedrock/packet/BedrockPacketType.java | 495 +++--- .../packet/BiomeDefinitionListPacket.java | 4 +- .../bedrock/packet/BlockEntityDataPacket.java | 4 +- .../bedrock/packet/BlockEventPacket.java | 6 +- .../packet/BlockPickRequestPacket.java | 6 +- .../bedrock/packet/BookEditPacket.java | 18 +- .../bedrock/packet/BossEventPacket.java | 21 +- .../CameraAimAssistActorPriorityPacket.java | 41 + .../CameraAimAssistInstructionPacket.java | 6 +- .../bedrock/packet/CameraAimAssistPacket.java | 12 +- .../packet/CameraAimAssistPresetsPacket.java | 8 +- .../packet/CameraInstructionPacket.java | 18 +- .../protocol/bedrock/packet/CameraPacket.java | 4 +- .../bedrock/packet/CameraPresetsPacket.java | 2 +- .../bedrock/packet/CameraShakePacket.java | 8 +- .../bedrock/packet/CameraSplinePacket.java | 41 + .../bedrock/packet/ChangeDimensionPacket.java | 8 +- .../packet/ChangeMobPropertyPacket.java | 12 +- .../packet/ChunkRadiusUpdatedPacket.java | 2 +- .../packet/ClientCacheBlobStatusPacket.java | 4 +- .../packet/ClientCacheMissResponsePacket.java | 2 +- .../packet/ClientCacheStatusPacket.java | 2 +- .../packet/ClientCheatAbilityPacket.java | 8 +- .../ClientboundAttributeLayerSyncPacket.java | 38 + .../ClientboundControlSchemeSetPacket.java | 2 +- ...entboundDataDrivenUICloseScreenPacket.java | 44 + .../ClientboundDataDrivenUIReloadPacket.java | 35 + ...ientboundDataDrivenUIShowScreenPacket.java | 51 + .../packet/ClientboundDataStorePacket.java | 42 + .../ClientboundDebugRendererPacket.java | 16 +- .../packet/ClientboundMapItemDataPacket.java | 26 +- .../packet/ClientboundTextureShiftPacket.java | 54 + .../ClientboundUpdateSoundDataPacket.java | 39 + .../bedrock/packet/CodeBuilderPacket.java | 4 +- .../packet/CodeBuilderSourcePacket.java | 8 +- .../packet/CommandBlockUpdatePacket.java | 26 +- .../bedrock/packet/CommandOutputPacket.java | 10 +- .../bedrock/packet/CommandRequestPacket.java | 8 +- .../packet/CompletedUsingItemPacket.java | 4 +- .../CompressedBiomeDefinitionListPacket.java | 2 +- .../bedrock/packet/ContainerClosePacket.java | 6 +- .../bedrock/packet/ContainerOpenPacket.java | 8 +- .../ContainerRegistryCleanupPacket.java | 2 +- .../packet/ContainerSetDataPacket.java | 6 +- .../CorrectPlayerMovePredictionPacket.java | 14 +- .../bedrock/packet/CraftingDataPacket.java | 10 +- .../bedrock/packet/CraftingEventPacket.java | 10 +- .../bedrock/packet/CreatePhotoPacket.java | 6 +- .../bedrock/packet/CreativeContentPacket.java | 4 +- .../packet/CurrentStructureFeaturePacket.java | 2 +- .../bedrock/packet/DeathInfoPacket.java | 4 +- .../bedrock/packet/DebugDrawerPacket.java | 2 +- .../bedrock/packet/DebugInfoPacket.java | 4 +- .../bedrock/packet/DimensionDataPacket.java | 2 +- .../bedrock/packet/DisconnectPacket.java | 8 +- .../bedrock/packet/EditorNetworkPacket.java | 4 +- .../bedrock/packet/EduUriResourcePacket.java | 2 +- .../packet/EducationSettingsPacket.java | 20 +- .../bedrock/packet/EmoteListPacket.java | 4 +- .../protocol/bedrock/packet/EmotePacket.java | 12 +- .../bedrock/packet/EntityEventPacket.java | 13 +- .../bedrock/packet/EntityFallPacket.java | 6 +- .../packet/EntityPickRequestPacket.java | 6 +- .../protocol/bedrock/packet/EventPacket.java | 31 +- .../bedrock/packet/ExplodePacket.java | 6 +- .../bedrock/packet/FeatureRegistryPacket.java | 2 +- .../bedrock/packet/FilterTextPacket.java | 4 +- .../packet/GameRulesChangedPacket.java | 2 +- .../bedrock/packet/GameTestRequestPacket.java | 14 +- .../bedrock/packet/GameTestResultsPacket.java | 6 +- .../GraphicsParameterOverridePacket.java | 24 +- .../bedrock/packet/GuiDataPickItemPacket.java | 6 +- .../bedrock/packet/HurtArmorPacket.java | 6 +- .../bedrock/packet/InteractPacket.java | 6 +- .../packet/InventoryContentPacket.java | 10 +- .../bedrock/packet/InventorySlotPacket.java | 12 +- .../packet/InventoryTransactionPacket.java | 38 +- .../bedrock/packet/ItemComponentPacket.java | 2 +- .../packet/ItemFrameDropItemPacket.java | 2 +- .../packet/ItemStackRequestPacket.java | 2 +- .../packet/ItemStackResponsePacket.java | 2 +- .../packet/JigsawStructureDataPacket.java | 2 +- .../bedrock/packet/LabTablePacket.java | 6 +- .../bedrock/packet/LecternUpdatePacket.java | 8 +- .../bedrock/packet/LessonProgressPacket.java | 6 +- .../bedrock/packet/LevelChunkPacket.java | 18 +- .../packet/LevelEventGenericPacket.java | 4 +- .../bedrock/packet/LevelEventPacket.java | 6 +- .../packet/LevelSoundEvent1Packet.java | 12 +- .../packet/LevelSoundEvent2Packet.java | 12 +- .../bedrock/packet/LevelSoundEventPacket.java | 20 +- .../bedrock/packet/LocatorBarPacket.java | 57 + .../protocol/bedrock/packet/LoginPacket.java | 6 +- .../packet/MapCreateLockedCopyPacket.java | 4 +- .../bedrock/packet/MapInfoRequestPacket.java | 4 +- .../packet/MobArmorEquipmentPacket.java | 12 +- .../bedrock/packet/MobEffectPacket.java | 18 +- .../bedrock/packet/MobEquipmentPacket.java | 10 +- .../packet/ModalFormRequestPacket.java | 4 +- .../packet/ModalFormResponsePacket.java | 6 +- .../packet/MotionPredictionHintsPacket.java | 6 +- .../packet/MoveEntityAbsolutePacket.java | 16 +- .../bedrock/packet/MoveEntityDeltaPacket.java | 25 +- .../bedrock/packet/MovePlayerPacket.java | 22 +- .../bedrock/packet/MovementEffectPacket.java | 8 +- .../packet/MovementPredictionSyncPacket.java | 42 +- .../packet/MultiplayerSettingsPacket.java | 2 +- .../NetworkChunkPublisherUpdatePacket.java | 6 +- .../bedrock/packet/NetworkSettingsPacket.java | 10 +- .../packet/NetworkStackLatencyPacket.java | 4 +- .../bedrock/packet/NpcDialoguePacket.java | 12 +- .../bedrock/packet/NpcRequestPacket.java | 10 +- .../OnScreenTextureAnimationPacket.java | 2 +- .../bedrock/packet/OpenSignPacket.java | 4 +- .../packet/PacketViolationWarningPacket.java | 8 +- .../bedrock/packet/PartyChangedPacket.java | 49 + .../PartyDestinationCookieResponsePacket.java | 39 + .../packet/PhotoInfoRequestPacket.java | 2 +- .../bedrock/packet/PhotoTransferPacket.java | 14 +- .../bedrock/packet/PlaySoundPacket.java | 14 +- .../bedrock/packet/PlayStatusPacket.java | 2 +- .../bedrock/packet/PlayerActionPacket.java | 10 +- .../packet/PlayerArmorDamagePacket.java | 4 +- .../bedrock/packet/PlayerAuthInputPacket.java | 38 +- .../packet/PlayerEnchantOptionsPacket.java | 2 +- .../bedrock/packet/PlayerFogPacket.java | 2 +- .../bedrock/packet/PlayerHotbarPacket.java | 6 +- .../bedrock/packet/PlayerInputPacket.java | 6 +- .../bedrock/packet/PlayerListPacket.java | 29 +- .../bedrock/packet/PlayerLocationPacket.java | 6 +- .../bedrock/packet/PlayerSkinPacket.java | 10 +- .../packet/PlayerStartItemCooldownPacket.java | 4 +- .../PlayerUpdateEntityOverridesPacket.java | 12 +- .../packet/PlayerVideoCapturePacket.java | 6 +- ...PositionTrackingDBClientRequestPacket.java | 4 +- ...sitionTrackingDBServerBroadcastPacket.java | 6 +- .../bedrock/packet/PurchaseReceiptPacket.java | 2 +- .../bedrock/packet/RemoveEntityPacket.java | 2 +- .../bedrock/packet/RemoveObjectivePacket.java | 2 +- .../packet/RemoveVolumeEntityPacket.java | 4 +- .../bedrock/packet/RequestAbilityPacket.java | 8 +- .../packet/RequestChunkRadiusPacket.java | 4 +- .../packet/RequestNetworkSettingsPacket.java | 2 +- .../packet/RequestPermissionsPacket.java | 6 +- .../packet/ResourcePackChunkDataPacket.java | 10 +- .../ResourcePackChunkRequestPacket.java | 6 +- .../ResourcePackClientResponsePacket.java | 4 +- .../packet/ResourcePackDataInfoPacket.java | 16 +- .../packet/ResourcePackStackPacket.java | 20 +- .../packet/ResourcePacksInfoPacket.java | 38 +- ...ResourcePacksReadyForValidationPacket.java | 35 + .../bedrock/packet/RespawnPacket.java | 6 +- .../bedrock/packet/RiderJumpPacket.java | 2 +- .../packet/ScriptCustomEventPacket.java | 4 +- .../bedrock/packet/ScriptMessagePacket.java | 4 +- .../SendPartyDestinationCookiePacket.java | 69 + .../ServerPlayerPostMovePositionPacket.java | 2 +- .../packet/ServerPresenceInfoPacket.java | 38 + .../packet/ServerSettingsResponsePacket.java | 4 +- .../bedrock/packet/ServerStatsPacket.java | 4 +- .../bedrock/packet/ServerStoreInfoPacket.java | 40 + .../packet/ServerToClientHandshakePacket.java | 2 +- ...rverboundDataDrivenScreenClosedPacket.java | 46 + .../packet/ServerboundDataStorePacket.java | 14 +- .../packet/ServerboundDiagnosticsPacket.java | 38 +- .../ServerboundLoadingScreenPacket.java | 4 +- .../ServerboundPackSettingChangePacket.java | 6 +- .../packet/SetCommandsEnabledPacket.java | 2 +- .../packet/SetDefaultGameTypePacket.java | 2 +- .../bedrock/packet/SetDifficultyPacket.java | 2 +- .../packet/SetDisplayObjectivePacket.java | 10 +- .../bedrock/packet/SetEntityDataPacket.java | 8 +- .../bedrock/packet/SetEntityLinkPacket.java | 2 +- .../bedrock/packet/SetEntityMotionPacket.java | 6 +- .../bedrock/packet/SetHealthPacket.java | 2 +- .../protocol/bedrock/packet/SetHudPacket.java | 4 +- .../bedrock/packet/SetLastHurtByPacket.java | 2 +- .../SetLocalPlayerAsInitializedPacket.java | 2 +- .../packet/SetMovementAuthorityPacket.java | 2 +- .../packet/SetPlayerGameTypePacket.java | 2 +- .../SetPlayerInventoryOptionsPacket.java | 10 +- .../bedrock/packet/SetScorePacket.java | 4 +- .../packet/SetScoreboardIdentityPacket.java | 8 +- .../packet/SetSpawnPositionPacket.java | 10 +- .../bedrock/packet/SetTimePacket.java | 2 +- .../bedrock/packet/SetTitlePacket.java | 16 +- .../bedrock/packet/SettingsCommandPacket.java | 4 +- .../bedrock/packet/ShowCreditsPacket.java | 4 +- .../bedrock/packet/ShowProfilePacket.java | 2 +- .../bedrock/packet/ShowStoreOfferPacket.java | 6 +- .../bedrock/packet/SimpleEventPacket.java | 2 +- .../bedrock/packet/SimulationTypePacket.java | 2 +- .../packet/SpawnExperienceOrbPacket.java | 4 +- .../packet/SpawnParticleEffectPacket.java | 10 +- .../bedrock/packet/StartGamePacket.java | 180 ++- .../bedrock/packet/StopSoundPacket.java | 6 +- .../packet/StructureBlockUpdatePacket.java | 8 +- .../StructureTemplateDataRequestPacket.java | 8 +- .../StructureTemplateDataResponsePacket.java | 8 +- .../bedrock/packet/SubChunkPacket.java | 8 +- .../bedrock/packet/SubChunkRequestPacket.java | 6 +- .../bedrock/packet/SubClientLoginPacket.java | 4 +- .../packet/SyncEntityPropertyPacket.java | 2 +- .../bedrock/packet/SyncWorldClocksPacket.java | 40 + .../bedrock/packet/TakeItemEntityPacket.java | 4 +- .../protocol/bedrock/packet/TextPacket.java | 16 +- .../bedrock/packet/TickSyncPacket.java | 4 +- .../bedrock/packet/ToastRequestPacket.java | 4 +- .../ToggleCrafterSlotRequestPacket.java | 6 +- .../bedrock/packet/TransferPacket.java | 6 +- .../bedrock/packet/TrimDataPacket.java | 4 +- .../bedrock/packet/UnknownPacket.java | 4 +- .../bedrock/packet/UnlockedRecipesPacket.java | 4 +- .../bedrock/packet/UpdateAbilitiesPacket.java | 8 +- .../packet/UpdateAdventureSettingsPacket.java | 10 +- .../packet/UpdateAttributesPacket.java | 6 +- .../packet/UpdateBlockPropertiesPacket.java | 2 +- .../packet/UpdateBlockSyncedPacket.java | 4 +- .../packet/UpdateClientInputLocksPacket.java | 7 +- .../packet/UpdateClientOptionsPacket.java | 10 +- .../bedrock/packet/UpdateEquipPacket.java | 10 +- .../packet/UpdatePlayerGameTypePacket.java | 6 +- .../bedrock/packet/UpdateSoftEnumPacket.java | 4 +- .../packet/UpdateSubChunkBlocksPacket.java | 9 +- .../bedrock/packet/UpdateTradePacket.java | 22 +- .../packet/VideoStreamConnectPacket.java | 10 +- .../bedrock/packet/VoxelShapesPacket.java | 47 + .../protocol/bedrock/BedrockPeer.java | 68 +- .../bedrock/util/EncryptionUtils.java | 14 +- .../protocol/common/util/Zlib.java | 87 +- 491 files changed, 9920 insertions(+), 2218 deletions(-) create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/BedrockCodecHelper_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/Bedrock_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/BiomeDefinitionListSerializer_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/BossEventSerializer_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/ClientCacheBlobStatusSerializer_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/ClientboundAttributeLayerSyncSerializer_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/ClientboundUpdateSoundDataSerializer_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/DebugDrawerSerializer_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/GraphicsParameterOverrideSerializer_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/InventoryContentSerializer_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/InventoryTransactionSerializer_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/LevelSoundEventSerializer_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/MobArmorEquipmentSerializer_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/PartyDestinationCookieResponseSerializer_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/SendPartyDestinationCookieSerializer_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/ServerboundDiagnosticsSerializer_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/StartGameSerializer_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/SubChunkRequestSerializer_v1001.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/ClientboundDataStoreSerializer_v898.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/Bedrock_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/BiomeDefinitionListSerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/BookEditSerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/CameraAimAssistActorPrioritySerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/CameraAimAssistPresetsSerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/CameraInstructionSerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/CameraSplineSerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundDataDrivenUICloseScreenSerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundDataDrivenUIReloadSerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundDataDrivenUIShowScreenSerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundDataStoreSerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundTextureShiftSerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/DebugDrawerSerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/GraphicsParameterOverrideSerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ServerboundDataStoreSerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ServerboundDiagnosticsSerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/StartGameSerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/TextSerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/VoxelShapesSerializer_v924.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/BedrockCodecHelper_v944.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/Bedrock_v944.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/CameraInstructionSerializer_v944.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/CameraSplineSerializer_v944.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ClientboundAttributeLayerSyncSerializer_v944.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ClientboundDataDrivenUICloseScreenSerializer_v944.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ClientboundDataDrivenUIShowScreenSerializer_v944.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/LocatorBarSerializer_v944.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/PartyChangedSerializer_v944.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/PlayerAuthInputSerializer_v944.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ResourcePacksReadyForValidationSerializer_v944.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ServerboundDataDrivenScreenClosedSerializer_v944.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/StartGameSerializer_v944.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/SyncWorldClocksSerializer_v944.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/UpdateClientInputLocksSerializer_v944.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/VoxelShapesSerializer_v944.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/BedrockCodecHelper_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/Bedrock_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/BiomeDefinitionListSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/ClientboundAttributeLayerSyncSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/DebugDrawerSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/DimensionDataSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/DisconnectSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/EntityEventSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/InventorySlotSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/LevelSoundEventSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/LocatorBarSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/MobEquipmentSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/MoveEntityAbsoluteSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/MovementPredictionSyncSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/PartyChangedSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/PlaySoundSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/PlayerEnchantOptionsSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/ServerPresenceInfoSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/ServerStoreInfoSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/ServerboundDiagnosticsSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/UpdateClientOptionsSerializer_v975.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/ClientStoreEntrypointConfiguration.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/GatheringsConfigurationJoinInfo.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/LocatorBarWaypoint.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/PresenceConfiguration.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/SerializableVoxelShape.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/ServerConfigurationJoinInfo.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/VillageType.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/AttributeData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/AttributeLayerData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/AttributeLayerSettings.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/AttributeLayerSyncPayload.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/BoolAttributeData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/ColorAttributeData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/EnvironmentAttributeData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/FloatAttributeData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/RemoveEnvironmentAttributesData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/UpdateAttributeLayerSettingsData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/UpdateAttributeLayersData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/UpdateEnvironmentAttributesData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeNoiseGradientSurfaceData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeSurfaceBuilderData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/NoiseBlockSpecifier.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/AimAssistActorPriorityData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraSplineDefinition.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/AddTimeMarkerData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/InitializeRegistryData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/RemoveTimeMarkerData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/SyncStateData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/SyncWorldClockStateData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/SyncWorldClocksPayload.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/TimeMarkerData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/WorldClockData.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/datastore/DataStoreAction.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/datastore/DataStoreChange.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/datastore/DataStoreRemoval.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/datastore/DataStoreUpdate.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugCone.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugCylinder.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugEllipsoid.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugPyramid.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/diagnostics/EntityDiagnosticTimingInfo.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/diagnostics/MemoryCategoryCounter.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/diagnostics/SystemDiagnosticTimingInfo.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/diagnostics/WhiskerScopeDataSummary.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraAimAssistActorPriorityPacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraSplinePacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundAttributeLayerSyncPacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDataDrivenUICloseScreenPacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDataDrivenUIReloadPacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDataDrivenUIShowScreenPacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDataStorePacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundTextureShiftPacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundUpdateSoundDataPacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LocatorBarPacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PartyChangedPacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PartyDestinationCookieResponsePacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePacksReadyForValidationPacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SendPartyDestinationCookiePacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerPresenceInfoPacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerStoreInfoPacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundDataDrivenScreenClosedPacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SyncWorldClocksPacket.java create mode 100644 relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/VoxelShapesPacket.java diff --git a/relay/Protocol/adventure/src/main/java/org/cloudburstmc/protocol/adventure/AdventureTextConverter.java b/relay/Protocol/adventure/src/main/java/org/cloudburstmc/protocol/adventure/AdventureTextConverter.java index ade7479..e1b4212 100644 --- a/relay/Protocol/adventure/src/main/java/org/cloudburstmc/protocol/adventure/AdventureTextConverter.java +++ b/relay/Protocol/adventure/src/main/java/org/cloudburstmc/protocol/adventure/AdventureTextConverter.java @@ -1,5 +1,7 @@ package org.cloudburstmc.protocol.adventure; +import lombok.Getter; +import lombok.Setter; import net.kyori.adventure.text.*; import net.kyori.adventure.text.serializer.ComponentSerializer; import net.kyori.adventure.text.serializer.json.JSONComponentSerializer; @@ -15,19 +17,23 @@ public class AdventureTextConverter implements TextConverter { - private static final BedrockLegacyTextSerializer LEGACY_SERIALIZER = BedrockLegacyTextSerializer.getInstance(); - private static final ComponentSerializer JSON_SERIALIZER = JSONComponentSerializer.builder() + @Setter + @Getter + private BedrockLegacyTextSerializer legacySerializer = BedrockLegacyTextSerializer.getInstance(); + + @Setter + @Getter + private ComponentSerializer jsonSerializer = JSONComponentSerializer.builder() .editOptions(builder -> builder.value(JSONOptions.EMIT_RGB, false)) .build(); - private static final BedrockComponent EMPTY = new BedrockComponent(Component.empty()); @Override public BedrockComponent deserialize(String text, boolean translatable) { if (text.isEmpty()) { - return EMPTY; + return BedrockComponent.EMPTY; } - Component component = deserialize(LEGACY_SERIALIZER, text, translatable); + Component component = deserialize(legacySerializer, text, translatable); return new BedrockComponent(component); } @@ -35,10 +41,10 @@ public BedrockComponent deserialize(String text, boolean translatable) { @Override public BedrockComponent deserializeJson(String text, boolean translatable) { if (text.isEmpty()) { - return EMPTY; + return BedrockComponent.EMPTY; } - Component component = deserialize(JSON_SERIALIZER, text, translatable); + Component component = deserialize(jsonSerializer, text, translatable); return new BedrockComponent(component); } @@ -71,7 +77,7 @@ private Component deserialize(ComponentSerializer @Override public BedrockComponent deserializeWithArguments(String text, List parameters, boolean translatable) { - Component component = this.deserialize(LEGACY_SERIALIZER, text, translatable); + Component component = this.deserialize(legacySerializer, text, translatable); if (parameters == null || parameters.isEmpty()) { return new BedrockComponent(component); } @@ -79,7 +85,7 @@ public BedrockComponent deserializeWithArguments(String text, List param List arguments = new ArrayList<>(parameters.size()); for (String parameter : parameters) { // Assume every argument is a Component - arguments.add(deserialize(LEGACY_SERIALIZER, parameter, false)); + arguments.add(deserialize(legacySerializer, parameter, false)); } if (component instanceof TranslatableComponent) { @@ -96,7 +102,7 @@ public String serialize(CharSequence text) { return (String) text; } checkArgument(text); - return LEGACY_SERIALIZER.serialize(((BedrockComponent) text).asComponent()); + return legacySerializer.serialize(((BedrockComponent) text).asComponent()); } @Override @@ -105,7 +111,7 @@ public String serializeJson(CharSequence text) { return (String) text; } checkArgument(text); - return JSON_SERIALIZER.serialize(((BedrockComponent) text).asComponent()); + return jsonSerializer.serialize(((BedrockComponent) text).asComponent()); } @Override diff --git a/relay/Protocol/adventure/src/main/java/org/cloudburstmc/protocol/adventure/BedrockComponent.java b/relay/Protocol/adventure/src/main/java/org/cloudburstmc/protocol/adventure/BedrockComponent.java index 194b254..c7e6cf5 100644 --- a/relay/Protocol/adventure/src/main/java/org/cloudburstmc/protocol/adventure/BedrockComponent.java +++ b/relay/Protocol/adventure/src/main/java/org/cloudburstmc/protocol/adventure/BedrockComponent.java @@ -8,6 +8,8 @@ public class BedrockComponent implements CharSequence, ComponentLike { + public static final BedrockComponent EMPTY = new BedrockComponent(Component.empty()); + private final Component component; private transient volatile String serialized; diff --git a/relay/Protocol/adventure/src/main/java/org/cloudburstmc/protocol/adventure/BedrockLegacyTextSerializer.java b/relay/Protocol/adventure/src/main/java/org/cloudburstmc/protocol/adventure/BedrockLegacyTextSerializer.java index 0fd8dda..68674d3 100644 --- a/relay/Protocol/adventure/src/main/java/org/cloudburstmc/protocol/adventure/BedrockLegacyTextSerializer.java +++ b/relay/Protocol/adventure/src/main/java/org/cloudburstmc/protocol/adventure/BedrockLegacyTextSerializer.java @@ -56,36 +56,36 @@ public BedrockLegacyTextSerializer(LegacyComponentSerializer serializer) { @Override public @NotNull String serialize(@NotNull Component component) { String serialize = this.serializer.serialize(component); - + if (serialize.length() < 2 || !serialize.contains(String.valueOf(LegacyComponentSerializer.SECTION_CHAR))) { return serialize; } - + StringBuilder builder = new StringBuilder(serialize.length() + 8); // Pre-allocate a bit extra for potential reset codes boolean needsReset = false; - + for (int i = 0; i < serialize.length(); i++) { char stringChar = serialize.charAt(i); - + // Only process section characters if (stringChar == LegacyComponentSerializer.SECTION_CHAR && i + 1 < serialize.length()) { char formatChar = serialize.charAt(i + 1); - + // Check for style codes that will need reset if (formatChar == 'l' || formatChar == 'k' || formatChar == 'o') { needsReset = true; } else if (needsReset) { // Reset the style if we encounter a color code after a style code - if (Character.isDigit(formatChar) || (formatChar >= 'a' && formatChar <= 'u')) { + if (Character.isDigit(formatChar) || (formatChar >= 'a' && formatChar <= 'v')) { builder.append(LegacyComponentSerializer.SECTION_CHAR).append('r'); needsReset = false; } } } - + builder.append(stringChar); } - + return builder.toString(); } @@ -97,7 +97,6 @@ private static List bedrockFormats() { formats.remove(CharacterAndFormat.UNDERLINED); formats.add(CharacterAndFormat.characterAndFormat('g', BedrockNamedTextColor.MINECOIN_GOLD)); // Minecoin Gold - // Add the new characters implemented in 1.19.80 formats.add(CharacterAndFormat.characterAndFormat('h', BedrockNamedTextColor.MATERIAL_QUARTZ)); // Quartz formats.add(CharacterAndFormat.characterAndFormat('i', BedrockNamedTextColor.MATERIAL_IRON)); // Iron formats.add(CharacterAndFormat.characterAndFormat('j', BedrockNamedTextColor.MATERIAL_NETHERITE)); // Netherite @@ -108,6 +107,7 @@ private static List bedrockFormats() { formats.add(CharacterAndFormat.characterAndFormat('s', BedrockNamedTextColor.MATERIAL_DIAMOND)); // Diamond formats.add(CharacterAndFormat.characterAndFormat('t', BedrockNamedTextColor.MATERIAL_LAPIS)); // Lapis formats.add(CharacterAndFormat.characterAndFormat('u', BedrockNamedTextColor.MATERIAL_AMETHYST)); // Amethyst + formats.add(CharacterAndFormat.characterAndFormat('v', BedrockNamedTextColor.MATERIAL_RESIN)); // Resin return formats; } @@ -128,6 +128,7 @@ public static class BedrockNamedTextColor implements TextColor { public static final BedrockNamedTextColor MATERIAL_DIAMOND = new BedrockNamedTextColor("material_diamond", TextColor.color(44, 186, 168)); public static final BedrockNamedTextColor MATERIAL_LAPIS = new BedrockNamedTextColor("material_lapis", TextColor.color(33, 73, 123)); public static final BedrockNamedTextColor MATERIAL_AMETHYST = new BedrockNamedTextColor("material_amethyst", TextColor.color(154, 92, 198)); + public static final BedrockNamedTextColor MATERIAL_RESIN = new BedrockNamedTextColor("material_resin", TextColor.color(235, 113, 20)); private final String name; private final TextColor color; diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/BaseBedrockCodecHelper.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/BaseBedrockCodecHelper.java index 8fd0a59..bff7b56 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/BaseBedrockCodecHelper.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/BaseBedrockCodecHelper.java @@ -21,6 +21,7 @@ import org.cloudburstmc.protocol.bedrock.data.EncodingSettings; import org.cloudburstmc.protocol.bedrock.data.ExperimentData; import org.cloudburstmc.protocol.bedrock.data.PlayerAbilityHolder; +import org.cloudburstmc.protocol.bedrock.data.PresenceConfiguration; import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition; import org.cloudburstmc.protocol.bedrock.data.entity.EntityProperties; @@ -46,7 +47,6 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; @@ -626,4 +626,14 @@ public > void readLargeVarIntFlags(ByteBuf buffer, Set flag public > void writeLargeVarIntFlags(ByteBuf buffer, Set flags, Class clazz) { throw new UnsupportedOperationException(); } + + @Override + public void writePresenceConfiguration(ByteBuf buffer, PresenceConfiguration configuration) { + throw new UnsupportedOperationException(); + } + + @Override + public PresenceConfiguration readPresenceConfiguration(ByteBuf buffer) { + throw new UnsupportedOperationException(); + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/BedrockCodec.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/BedrockCodec.java index d429816..ff22dbe 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/BedrockCodec.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/BedrockCodec.java @@ -153,6 +153,28 @@ public Builder updateSerializer(Class packetClass, return this; } + public Builder updateFactory(Class packetClass, Supplier factory) { + BedrockPacketDefinition info = (BedrockPacketDefinition) packets.get(packetClass); + checkArgument(info != null, "Packet does not exist"); + BedrockPacketDefinition updatedInfo = new BedrockPacketDefinition<>(info.getId(), (Supplier) factory, info.getSerializer(), info.getRecipient()); + + packets.replace(packetClass, info, updatedInfo); + + return this; + } + + public Builder aliasPacket(Class packetClass, Class aliasedClass) { + checkNotNull(packetClass, "packetClass"); + checkNotNull(aliasedClass, "aliasedClass"); + checkArgument(!packets.containsKey(packetClass), "Packet class already registered"); + + BedrockPacketDefinition info = packets.get(aliasedClass); + checkArgument(info != null, "Packet does not exist"); + + packets.put(packetClass, info); + return this; + } + public Builder retainPackets(Class... packets) { this.packets.keySet().retainAll(Arrays.asList(packets)); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/BedrockCodecHelper.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/BedrockCodecHelper.java index c0b361a..424011b 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/BedrockCodecHelper.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/BedrockCodecHelper.java @@ -5,10 +5,7 @@ import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.nbt.NbtType; -import org.cloudburstmc.protocol.bedrock.data.EncodingSettings; -import org.cloudburstmc.protocol.bedrock.data.ExperimentData; -import org.cloudburstmc.protocol.bedrock.data.GameRuleData; -import org.cloudburstmc.protocol.bedrock.data.PlayerAbilityHolder; +import org.cloudburstmc.protocol.bedrock.data.*; import org.cloudburstmc.protocol.bedrock.data.command.CommandEnumData; import org.cloudburstmc.protocol.bedrock.data.command.CommandOriginData; import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; @@ -123,6 +120,10 @@ default void writeArray(ByteBuf buffer, Collection array, TriConsumer void writeArray(ByteBuf buffer, Collection array, TriConsumer actions); @@ -268,4 +271,8 @@ default void writeArray(ByteBuf buffer, Collection array, TriConsumer> void writeLargeVarIntFlags(ByteBuf buffer, Set flags, Class clazz); > void readLargeVarIntFlags(ByteBuf buffer, Set flags, Class clazz); + + void writePresenceConfiguration(ByteBuf buffer, PresenceConfiguration configuration); + + PresenceConfiguration readPresenceConfiguration(ByteBuf buffer); } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/compat/NoopBedrockCodecHelper.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/compat/NoopBedrockCodecHelper.java index b105507..f1e32a1 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/compat/NoopBedrockCodecHelper.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/compat/NoopBedrockCodecHelper.java @@ -58,6 +58,16 @@ public void writeItem(ByteBuf buffer, ItemData item) { throw new UnsupportedOperationException(); } + @Override + public ItemData readNetworkItemStackDescriptor(ByteBuf buffer) { + throw new UnsupportedOperationException(); + } + + @Override + public void writeNetworkItemStackDescriptor(ByteBuf buffer, ItemData item) { + throw new UnsupportedOperationException(); + } + @Override public ItemData readItemInstance(ByteBuf buffer) { throw new UnsupportedOperationException(); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/BedrockCodecHelper_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/BedrockCodecHelper_v1001.java new file mode 100644 index 0000000..8320333 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/BedrockCodecHelper_v1001.java @@ -0,0 +1,34 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.EntityDataTypeMap; +import org.cloudburstmc.protocol.bedrock.codec.v975.BedrockCodecHelper_v975; +import org.cloudburstmc.protocol.bedrock.data.Ability; +import org.cloudburstmc.protocol.bedrock.data.PresenceConfiguration; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.data.inventory.itemstack.request.TextProcessingEventOrigin; +import org.cloudburstmc.protocol.bedrock.data.inventory.itemstack.request.action.ItemStackRequestActionType; +import org.cloudburstmc.protocol.common.util.TypeMap; + +public class BedrockCodecHelper_v1001 extends BedrockCodecHelper_v975 { + + public BedrockCodecHelper_v1001(EntityDataTypeMap entityData, TypeMap> gameRulesTypes, TypeMap stackRequestActionTypes, + TypeMap containerSlotTypes, TypeMap abilities, TypeMap textProcessingEventOrigins) { + super(entityData, gameRulesTypes, stackRequestActionTypes, containerSlotTypes, abilities, textProcessingEventOrigins); + } + + @Override + public void writePresenceConfiguration(ByteBuf buffer, PresenceConfiguration configuration) { + writeOptionalNull(buffer, configuration.getExperienceName(), this::writeString); + writeOptionalNull(buffer, configuration.getWorldName(), this::writeString); + writeString(buffer, configuration.getRichPresenceId()); + } + + @Override + public PresenceConfiguration readPresenceConfiguration(ByteBuf buffer) { + return new PresenceConfiguration( + readOptional(buffer, null, this::readString), + readOptional(buffer, null, this::readString), + readString(buffer)); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/Bedrock_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/Bedrock_v1001.java new file mode 100644 index 0000000..cbfc4ac --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/Bedrock_v1001.java @@ -0,0 +1,49 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001; + +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; +import org.cloudburstmc.protocol.bedrock.codec.v1001.serializer.*; +import org.cloudburstmc.protocol.bedrock.codec.v975.Bedrock_v975; +import org.cloudburstmc.protocol.bedrock.data.PacketRecipient; +import org.cloudburstmc.protocol.bedrock.data.SoundEvent; +import org.cloudburstmc.protocol.bedrock.packet.*; +import org.cloudburstmc.protocol.common.util.TypeMap; + +public class Bedrock_v1001 extends Bedrock_v975 { + + protected static final TypeMap SOUND_EVENTS = Bedrock_v975.SOUND_EVENTS + .toBuilder() + .replace(601, SoundEvent.SLIME_LANDING) + .insert(602, SoundEvent.ABSORB_BLOCK) + .insert(603, SoundEvent.EJECT_BLOCK) + .insert(604, SoundEvent.GEYSER_ERUPTION_START) + .insert(605, SoundEvent.GEYSER_ERUPTION_ACTIVE) + .insert(606, SoundEvent.RECORD_BOUNCE) + .insert(607, SoundEvent.BUCKET_FILL_LAND_ANIMAL) + .insert(608, SoundEvent.BUCKET_EMPTY_LAND_ANIMAL) + .insert(609, SoundEvent.GEYSER_CONTINUOUS_ERUPTION_START) + .insert(610, SoundEvent.GEYSER_CONTINUOUS_ERUPTION_ACTIVE) + .insert(611, SoundEvent.UNDEFINED) + .build(); + + public static final BedrockCodec CODEC = Bedrock_v975.CODEC.toBuilder() + .protocolVersion(1001) + .minecraftVersion("1.26.30") + .helper(() -> new BedrockCodecHelper_v1001(ENTITY_DATA, GAME_RULE_TYPES, ITEM_STACK_REQUEST_TYPES, CONTAINER_SLOT_TYPES, PLAYER_ABILITIES, TEXT_PROCESSING_ORIGINS)) + .updateSerializer(BiomeDefinitionListPacket.class, BiomeDefinitionListSerializer_v1001.INSTANCE) + .updateSerializer(BossEventPacket.class, BossEventSerializer_v1001.INSTANCE) + .updateSerializer(ClientboundAttributeLayerSyncPacket.class, ClientboundAttributeLayerSyncSerializer_v1001.INSTANCE) + .updateSerializer(ClientCacheBlobStatusPacket.class, ClientCacheBlobStatusSerializer_v1001.INSTANCE) + .updateSerializer(DebugDrawerPacket.class, DebugDrawerSerializer_v1001.INSTANCE) + .updateSerializer(GraphicsParameterOverridePacket.class, GraphicsParameterOverrideSerializer_v1001.INSTANCE) + .updateSerializer(InventoryContentPacket.class, InventoryContentSerializer_v1001.INSTANCE) + .updateSerializer(InventoryTransactionPacket.class, InventoryTransactionSerializer_v1001.INSTANCE) + .updateSerializer(LevelSoundEventPacket.class, new LevelSoundEventSerializer_v1001(SOUND_EVENTS)) + .updateSerializer(MobArmorEquipmentPacket.class, MobArmorEquipmentSerializer_v1001.INSTANCE) + .updateSerializer(ServerboundDiagnosticsPacket.class, ServerboundDiagnosticsSerializer_v1001.INSTANCE) + .updateSerializer(StartGamePacket.class, StartGameSerializer_v1001.INSTANCE) + .updateSerializer(SubChunkRequestPacket.class, SubChunkRequestSerializer_v1001.INSTANCE) + .registerPacket(ClientboundUpdateSoundDataPacket::new, ClientboundUpdateSoundDataSerializer_v1001.INSTANCE, 348, PacketRecipient.CLIENT) + .registerPacket(SendPartyDestinationCookiePacket::new, SendPartyDestinationCookieSerializer_v1001.INSTANCE, 349, PacketRecipient.CLIENT) + .registerPacket(PartyDestinationCookieResponsePacket::new, PartyDestinationCookieResponseSerializer_v1001.INSTANCE, 350, PacketRecipient.SERVER) + .build(); +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/BiomeDefinitionListSerializer_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/BiomeDefinitionListSerializer_v1001.java new file mode 100644 index 0000000..c10bbec --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/BiomeDefinitionListSerializer_v1001.java @@ -0,0 +1,43 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v975.serializer.BiomeDefinitionListSerializer_v975; +import org.cloudburstmc.protocol.bedrock.data.biome.*; + +import java.util.ArrayList; +import java.util.List; + +public class BiomeDefinitionListSerializer_v1001 extends BiomeDefinitionListSerializer_v975 { + + public static final BiomeDefinitionListSerializer_v1001 INSTANCE = new BiomeDefinitionListSerializer_v1001(); + + @Override + protected void writeNoiseGradientSurface(ByteBuf buffer, BedrockCodecHelper helper, BiomeNoiseGradientSurfaceData data) { + helper.writeArray(buffer, data.getNonReplaceableBlocks(), ByteBuf::writeIntLE); + helper.writeArray(buffer, data.getGradientBlocks(), (buf, val) -> { + helper.writeString(buf, val.getNoise()); + buf.writeFloatLE(val.getThreshold()); + buf.writeFloatLE(val.getRangeMin()); + buf.writeFloatLE(val.getRangeMax()); + buf.writeIntLE(val.getBlock()); + }); + helper.writeString(buffer, data.getNoise()); + buffer.writeIntLE(data.getFirstOctave()); + helper.writeArray(buffer, data.getAmplitudes(), ByteBuf::writeFloatLE); + } + + @Override + protected BiomeNoiseGradientSurfaceData readNoiseGradientSurface(ByteBuf buffer, BedrockCodecHelper helper) { + List nonReplaceableBlocks = new ArrayList<>(); + helper.readArray(buffer, nonReplaceableBlocks, (buf, h) -> (int) buf.readUnsignedIntLE()); + List gradientBlocks = new ArrayList<>(); + helper.readArray(buffer, gradientBlocks, (buf, h) -> + new NoiseBlockSpecifier(helper.readString(buf), buf.readFloatLE(), buf.readFloatLE(), buf.readFloatLE(), (int) buf.readUnsignedIntLE())); + String noiseSeedString = helper.readString(buffer); + int firstOctave = buffer.readIntLE(); + List amplitudes = new ArrayList<>(); + helper.readArray(buffer, amplitudes, (buf, h) -> buf.readFloatLE()); + return new BiomeNoiseGradientSurfaceData(nonReplaceableBlocks, gradientBlocks, noiseSeedString, firstOctave, amplitudes); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/BossEventSerializer_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/BossEventSerializer_v1001.java new file mode 100644 index 0000000..acc2802 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/BossEventSerializer_v1001.java @@ -0,0 +1,36 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v776.serializer.BossEventSerializer_v776; +import org.cloudburstmc.protocol.bedrock.packet.BossEventPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +public class BossEventSerializer_v1001 extends BossEventSerializer_v776 { + + public static final BossEventSerializer_v1001 INSTANCE = new BossEventSerializer_v1001(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, BossEventPacket packet) { + VarInts.writeLong(buffer, packet.getBossUniqueEntityId()); + VarInts.writeLong(buffer, packet.getPlayerUniqueEntityId()); + buffer.writeByte(packet.getAction().ordinal()); + helper.writeString(buffer, helper.getTextConverter().serialize(packet.getTitle(CharSequence.class))); + helper.writeString(buffer, helper.getTextConverter().serialize(packet.getFilteredTitle(CharSequence.class))); + buffer.writeFloatLE(packet.getHealthPercentage()); + buffer.writeByte(packet.getColor()); + buffer.writeByte(packet.getOverlay()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, BossEventPacket packet) { + packet.setBossUniqueEntityId(VarInts.readLong(buffer)); + packet.setPlayerUniqueEntityId(VarInts.readLong(buffer)); + packet.setAction(BossEventPacket.Action.values()[buffer.readUnsignedByte()]); + packet.setTitle(helper.getTextConverter().deserialize(helper.readString(buffer))); + packet.setFilteredTitle(helper.getTextConverter().deserialize(helper.readString(buffer))); + packet.setHealthPercentage(buffer.readFloatLE()); + packet.setColor(buffer.readUnsignedByte()); + packet.setOverlay(buffer.readUnsignedByte()); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/ClientCacheBlobStatusSerializer_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/ClientCacheBlobStatusSerializer_v1001.java new file mode 100644 index 0000000..31bba08 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/ClientCacheBlobStatusSerializer_v1001.java @@ -0,0 +1,23 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v361.serializer.ClientCacheBlobStatusSerializer_v361; +import org.cloudburstmc.protocol.bedrock.packet.ClientCacheBlobStatusPacket; + +public class ClientCacheBlobStatusSerializer_v1001 extends ClientCacheBlobStatusSerializer_v361 { + + public static final ClientCacheBlobStatusSerializer_v1001 INSTANCE = new ClientCacheBlobStatusSerializer_v1001(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ClientCacheBlobStatusPacket packet) { + helper.writeArray(buffer, packet.getNaks(), ByteBuf::writeLongLE); + helper.writeArray(buffer, packet.getAcks(), ByteBuf::writeLongLE); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ClientCacheBlobStatusPacket packet) { + helper.readArray(buffer, packet.getNaks(), ByteBuf::readLongLE, 4095); + helper.readArray(buffer, packet.getAcks(), ByteBuf::readLongLE, 4095); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/ClientboundAttributeLayerSyncSerializer_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/ClientboundAttributeLayerSyncSerializer_v1001.java new file mode 100644 index 0000000..367bfcb --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/ClientboundAttributeLayerSyncSerializer_v1001.java @@ -0,0 +1,73 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v975.serializer.ClientboundAttributeLayerSyncSerializer_v975; +import org.cloudburstmc.protocol.bedrock.data.attributelayer.*; +import org.cloudburstmc.protocol.bedrock.data.camera.CameraEase; +import org.cloudburstmc.protocol.common.util.VarInts; + +import java.util.ArrayList; +import java.util.List; + +public class ClientboundAttributeLayerSyncSerializer_v1001 extends ClientboundAttributeLayerSyncSerializer_v975 { + + public static final ClientboundAttributeLayerSyncSerializer_v1001 INSTANCE = new ClientboundAttributeLayerSyncSerializer_v1001(); + + @Override + protected void writeUpdateAttributeLayers(ByteBuf buf, BedrockCodecHelper helper, UpdateAttributeLayersData data) { + List layers = data.getAttributeLayers(); + helper.writeArray(buf, layers, (b, layer) -> { + helper.writeString(b, layer.getLayerName()); + helper.writeOptionalNull(b, layer.getNoiseName(), helper::writeString); // new + VarInts.writeInt(b, layer.getDimension()); + writeAttributeLayerSettings(b, helper, layer.getSettings()); + helper.writeArray(b, layer.getAttributes(), (bb, attr) -> + writeEnvironmentAttribute(bb, helper, attr)); + }); + } + + @Override + protected UpdateAttributeLayersData readUpdateAttributeLayers(ByteBuf buf, BedrockCodecHelper helper) { + List layers = new ArrayList<>(); + helper.readArray(buf, layers, b -> { + String name = helper.readStringMaxLen(buf, 128); + String noise = helper.readOptional(b, null, helper::readString); // new + int dim = VarInts.readInt(b); + AttributeLayerSettings settings = readAttributeLayerSettings(b, helper); + + List attrs = new ArrayList<>(); + helper.readArray(b, attrs, bb -> readEnvironmentAttribute(bb, helper), 1024); + + return new AttributeLayerData(name, noise, dim, settings, attrs); + }, 512); + return new UpdateAttributeLayersData(layers); + } + + @Override + protected void writeEnvironmentAttribute(ByteBuf buf, BedrockCodecHelper helper, EnvironmentAttributeData e) { + super.writeEnvironmentAttribute(buf, helper, e); + + buf.writeIntLE(e.getLocalTransitionTicks()); + buf.writeBoolean(e.isNoiseTransition()); + } + + @Override + protected EnvironmentAttributeData readEnvironmentAttribute(ByteBuf buf, BedrockCodecHelper helper) { + String name = helper.readStringMaxLen(buf, 128); + + AttributeData from = helper.readOptional(buf, null, b -> readAttributeData(b, helper)); + AttributeData attribute = readAttributeData(buf, helper); + AttributeData to = helper.readOptional(buf, null, b -> readAttributeData(b, helper)); + + int currentTicks = (int) buf.readUnsignedIntLE(); + int totalTicks = (int) buf.readUnsignedIntLE(); + + CameraEase easing = CameraEase.fromName(helper.readString(buf)); + + int localTransitionTicks = (int) buf.readUnsignedIntLE(); + boolean noiseTransition = buf.readBoolean(); + + return new EnvironmentAttributeData(name, from, attribute, to, currentTicks, totalTicks, easing, localTransitionTicks, noiseTransition); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/ClientboundUpdateSoundDataSerializer_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/ClientboundUpdateSoundDataSerializer_v1001.java new file mode 100644 index 0000000..b08b44e --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/ClientboundUpdateSoundDataSerializer_v1001.java @@ -0,0 +1,24 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.packet.ClientboundUpdateSoundDataPacket; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class ClientboundUpdateSoundDataSerializer_v1001 implements BedrockPacketSerializer { + + public static final ClientboundUpdateSoundDataSerializer_v1001 INSTANCE = new ClientboundUpdateSoundDataSerializer_v1001(); + + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundUpdateSoundDataPacket packet) { + buffer.writeLongLE(packet.getServerSoundHandle()); + helper.writeString(buffer, packet.getType()); + } + + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundUpdateSoundDataPacket packet) { + packet.setServerSoundHandle(buffer.readLongLE()); + packet.setType(helper.readString(buffer)); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/DebugDrawerSerializer_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/DebugDrawerSerializer_v1001.java new file mode 100644 index 0000000..716a657 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/DebugDrawerSerializer_v1001.java @@ -0,0 +1,215 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.math.vector.Vector3f; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v975.serializer.DebugDrawerSerializer_v975; +import org.cloudburstmc.protocol.bedrock.data.debugshape.*; +import org.cloudburstmc.protocol.common.util.VarInts; + +import java.awt.Color; + +public class DebugDrawerSerializer_v1001 extends DebugDrawerSerializer_v975 { + + public static final DebugDrawerSerializer_v1001 INSTANCE = new DebugDrawerSerializer_v1001(); + + + @Override + protected void writeShape(ByteBuf buffer, BedrockCodecHelper helper, DebugShape shape) { + DebugShape.Type type = shape.getType(); + if (type != null) { + switch (type) { + case ARROW: + case BOX: + case CIRCLE: + case LINE: + case SPHERE: + case TEXT: + super.writeShape(buffer, helper, shape); + return; + } + } + + writeCommonShapeData(buffer, helper, shape); + + VarInts.writeUnsignedInt(buffer, toPayloadType(type)); + if (type == null) { + return; + } + + switch (type) { + case CYLINDER: + DebugCylinder cylinder = (DebugCylinder) shape; + helper.writeVector2f(buffer, cylinder.getRadiusX()); + helper.writeVector2f(buffer, cylinder.getRadiusZ()); + buffer.writeFloatLE(cylinder.getHeight()); + buffer.writeByte(cylinder.getSegments()); + break; + case PYRAMID: + DebugPyramid pyramid = (DebugPyramid) shape; + buffer.writeFloatLE(pyramid.getWidth()); + helper.writeOptionalNull(buffer, pyramid.getDepth(), ByteBuf::writeFloatLE); + buffer.writeFloatLE(pyramid.getHeight()); + break; + case ELLIPSOID: + DebugEllipsoid ellipsoid = (DebugEllipsoid) shape; + helper.writeVector3f(buffer, ellipsoid.getRadii()); + buffer.writeByte(ellipsoid.getSegments()); + break; + case CONE: + DebugCone cone = (DebugCone) shape; + helper.writeVector2f(buffer, cone.getRadii()); + buffer.writeFloatLE(cone.getHeight()); + buffer.writeByte(cone.getSegments()); + break; + } + } + + @Override + protected DebugShape readShape(ByteBuf buffer, BedrockCodecHelper helper) { + long id = VarInts.readUnsignedLong(buffer); + + DebugShape.Type type = helper.readOptional(buffer, null, (buf, aHelper) -> SHAPE_TYPES[buf.readUnsignedByte()]); + Vector3f position = helper.readOptional(buffer, null, READ_VECTOR3F); + Float scale = helper.readOptional(buffer, null, ByteBuf::readFloatLE); + Vector3f rotation = helper.readOptional(buffer, null, READ_VECTOR3F); + Float totalTimeLeft = helper.readOptional(buffer, null, ByteBuf::readFloatLE); + Float maximumRenderDistance = helper.readOptional(buffer, null, ByteBuf::readFloatLE); + Color color = helper.readOptional(buffer, null, READ_COLOR); + Integer dimension = helper.readOptional(buffer, -1, VarInts::readInt); + Long attachedToEntityId = helper.readOptional(buffer, null, VarInts::readUnsignedLong); + VarInts.readUnsignedInt(buffer); // Unused payload type + + if (type == null) { + return new DebugShape(id, dimension); + } + + DebugShape shape; + switch (type) { + case ARROW: + shape = new DebugArrow(); + break; + case BOX: + shape = new DebugBox(); + break; + case CIRCLE: + shape = new DebugCircle(); + break; + case LINE: + shape = new DebugLine(); + break; + case SPHERE: + shape = new DebugSphere(); + break; + case TEXT: + shape = new DebugText(); + break; + case CYLINDER: + shape = new DebugCylinder(); + break; + case PYRAMID: + shape = new DebugPyramid(); + break; + case ELLIPSOID: + shape = new DebugEllipsoid(); + break; + case CONE: + shape = new DebugCone(); + break; + default: + throw new IllegalStateException("Unknown debug shape type"); + } + + shape.setId(id); + shape.setDimension(dimension); + shape.setPosition(position); + shape.setScale(scale); + shape.setRotation(rotation); + shape.setTotalTimeLeft(totalTimeLeft); + shape.setColor(color); + shape.setAttachedToEntityId(attachedToEntityId); + shape.setMaximumRenderDistance(maximumRenderDistance); + + switch (type) { + case ARROW: + DebugArrow arrow = (DebugArrow) shape; + arrow.setArrowEndPosition(helper.readOptional(buffer, null, READ_VECTOR3F)); + arrow.setArrowHeadLength(helper.readOptional(buffer, null, ByteBuf::readFloatLE)); + arrow.setArrowHeadRadius(helper.readOptional(buffer, null, ByteBuf::readFloatLE)); + arrow.setArrowHeadSegments(helper.readOptional(buffer, null, buf -> (int) buf.readUnsignedByte())); + return arrow; + case BOX: + DebugBox box = (DebugBox) shape; + box.setBoxBounds(helper.readVector3f(buffer)); + return box; + case CIRCLE: + DebugCircle circle = (DebugCircle) shape; + circle.setSegments((int) buffer.readUnsignedByte()); + return circle; + case LINE: + DebugLine line = (DebugLine) shape; + line.setLineEndPosition(helper.readVector3f(buffer)); + return line; + case SPHERE: + DebugSphere sphere = (DebugSphere) shape; + sphere.setSegments((int) buffer.readUnsignedByte()); + return sphere; + case TEXT: + DebugText text = (DebugText) shape; + text.setText(helper.readString(buffer)); + text.setUseRotation(buffer.readBoolean()); + text.setBackgroundColor(helper.readOptional(buffer, null, (buf, h) -> new Color(buf.readIntLE(), true))); + text.setDepthTest(buffer.readBoolean()); + text.setShowBackface(buffer.readBoolean()); + text.setShowTextBackface(buffer.readBoolean()); + return text; + case CYLINDER: + DebugCylinder cylinder = (DebugCylinder) shape; + cylinder.setRadiusX(helper.readVector2f(buffer)); + cylinder.setRadiusZ(helper.readVector2f(buffer)); + cylinder.setHeight(buffer.readFloatLE()); + cylinder.setSegments(buffer.readUnsignedByte()); + return cylinder; + case PYRAMID: + DebugPyramid pyramid = (DebugPyramid) shape; + pyramid.setWidth(buffer.readFloatLE()); + pyramid.setDepth(helper.readOptional(buffer, null, ByteBuf::readFloatLE)); + pyramid.setHeight(buffer.readFloatLE()); + return pyramid; + case ELLIPSOID: + DebugEllipsoid ellipsoid = (DebugEllipsoid) shape; + ellipsoid.setRadii(helper.readVector3f(buffer)); + ellipsoid.setSegments(buffer.readUnsignedByte()); + return ellipsoid; + case CONE: + DebugCone cone = (DebugCone) shape; + cone.setRadii(helper.readVector2f(buffer)); + cone.setHeight(buffer.readFloatLE()); + cone.setSegments(buffer.readUnsignedByte()); + return cone; + default: + throw new IllegalStateException("Unknown debug shape type"); + } + } + + @Override + protected int toPayloadType(DebugShape.Type type) { + if (type == null) { + return 0; + } + + switch (type) { + case ARROW: return 1; + case TEXT: return 2; + case BOX: return 3; + case LINE: return 4; + case SPHERE: + case CIRCLE: return 5; + case CYLINDER: return 6; + case PYRAMID: return 7; + case ELLIPSOID: return 8; + case CONE: return 9; + default: throw new IllegalStateException("Unknown debug shape type"); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/GraphicsParameterOverrideSerializer_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/GraphicsParameterOverrideSerializer_v1001.java new file mode 100644 index 0000000..d4f66d5 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/GraphicsParameterOverrideSerializer_v1001.java @@ -0,0 +1,49 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.math.vector.Vector3f; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v924.serializer.GraphicsParameterOverrideSerializer_v924; +import org.cloudburstmc.protocol.bedrock.data.GraphicsOverrideParameterType; +import org.cloudburstmc.protocol.bedrock.packet.GraphicsParameterOverridePacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class GraphicsParameterOverrideSerializer_v1001 extends GraphicsParameterOverrideSerializer_v924 { + + public static final GraphicsParameterOverrideSerializer_v1001 INSTANCE = new GraphicsParameterOverrideSerializer_v1001(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, GraphicsParameterOverridePacket packet) { + helper.writeArray(buffer, packet.getValues().entrySet(), (buf, aHelper, entry) -> { + buf.writeFloatLE(entry.getKey()); + helper.writeVector3f(buf, entry.getValue()); + }); + helper.writeOptionalNull(buffer, packet.getFloatValue(), ByteBuf::writeFloatLE); + helper.writeOptionalNull(buffer, packet.getVec3Value(), (buf, h, v) -> h.writeVector3f(buf, v)); + helper.writeString(buffer, packet.getBiomeIdentifier()); + helper.writeOptionalNull(buffer, packet.getPlayerIdentifier(), (buf, h, v) -> h.writeString(buf, v)); // new + buffer.writeByte(packet.getParameterType().ordinal()); + buffer.writeBoolean(packet.isReset()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, GraphicsParameterOverridePacket packet) { + Map values = new LinkedHashMap<>(); + int length = VarInts.readUnsignedInt(buffer); + for (int i = 0; i < length; i++) { + float key = buffer.readFloatLE(); + Vector3f value = helper.readVector3f(buffer); + values.put(key, value); + } + packet.setValues(values); + packet.setFloatValue(helper.readOptional(buffer, null, ByteBuf::readFloatLE)); + packet.setVec3Value(helper.readOptional(buffer, null, (buf, h) -> h.readVector3f(buf))); + packet.setBiomeIdentifier(helper.readString(buffer)); + packet.setPlayerIdentifier(helper.readOptional(buffer, null, (buf, h) -> h.readString(buf))); // new + packet.setParameterType(GraphicsOverrideParameterType.values()[buffer.readUnsignedByte()]); + packet.setReset(buffer.readBoolean()); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/InventoryContentSerializer_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/InventoryContentSerializer_v1001.java new file mode 100644 index 0000000..32b8fc2 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/InventoryContentSerializer_v1001.java @@ -0,0 +1,28 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v748.serializer.InventoryContentSerializer_v748; +import org.cloudburstmc.protocol.bedrock.packet.InventoryContentPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +public class InventoryContentSerializer_v1001 extends InventoryContentSerializer_v748 { + + public static final InventoryContentSerializer_v1001 INSTANCE = new InventoryContentSerializer_v1001(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, InventoryContentPacket packet) { + VarInts.writeUnsignedInt(buffer, packet.getContainerId()); + helper.writeArray(buffer, packet.getContents(), helper::writeNetworkItemStackDescriptor); + helper.writeFullContainerName(buffer, packet.getContainerNameData()); + helper.writeNetworkItemStackDescriptor(buffer, packet.getStorageItem()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, InventoryContentPacket packet) { + packet.setContainerId(VarInts.readUnsignedInt(buffer)); + helper.readArray(buffer, packet.getContents(), helper::readNetworkItemStackDescriptor); + packet.setContainerNameData(helper.readFullContainerName(buffer)); + packet.setStorageItem(helper.readNetworkItemStackDescriptor(buffer)); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/InventoryTransactionSerializer_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/InventoryTransactionSerializer_v1001.java new file mode 100644 index 0000000..ff9d5e6 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/InventoryTransactionSerializer_v1001.java @@ -0,0 +1,231 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v407.serializer.InventoryTransactionSerializer_v407; +import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; +import org.cloudburstmc.protocol.bedrock.data.inventory.transaction.*; +import org.cloudburstmc.protocol.bedrock.packet.InventoryTransactionPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +import java.util.List; + +import static java.util.Objects.requireNonNull; + +public class InventoryTransactionSerializer_v1001 extends InventoryTransactionSerializer_v407 { + + public static final InventoryTransactionSerializer_v1001 INSTANCE = new InventoryTransactionSerializer_v1001(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, InventoryTransactionPacket packet) { + int legacyRequestId = packet.getLegacyRequestId(); + VarInts.writeInt(buffer, legacyRequestId); + + if (legacyRequestId < -1 && (legacyRequestId & 1) == 0) { + buffer.writeBoolean(true); + helper.writeArray(buffer, packet.getLegacySlots(), (buf, packetHelper, data) -> { + buf.writeByte(data.getContainerId()); + packetHelper.writeByteArray(buf, data.getSlots()); + }); + } else { + buffer.writeBoolean(false); + } + + buffer.writeBoolean(true); + InventoryTransactionType transactionType = packet.getTransactionType(); + VarInts.writeUnsignedInt(buffer, transactionType.ordinal()); + + buffer.writeBoolean(true); + writeInventoryActions(buffer, helper, packet.getActions()); + + switch (transactionType) { + case ITEM_USE: + this.writeItemUse(buffer, helper, packet); + break; + case ITEM_USE_ON_ENTITY: + this.writeItemUseOnEntity(buffer, helper, packet); + break; + case ITEM_RELEASE: + this.writeItemRelease(buffer, helper, packet); + break; + } + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, InventoryTransactionPacket packet) { + int legacyRequestId = VarInts.readInt(buffer); + packet.setLegacyRequestId(legacyRequestId); + + if (buffer.readBoolean()) { + if (legacyRequestId < -1 && (legacyRequestId & 1) == 0) { + helper.readArray(buffer, packet.getLegacySlots(), (buf, packetHelper) -> { + int containerId = buffer.readUnsignedByte(); + byte[] slots = packetHelper.readByteArray(buf, 89); // 89 seems to be the largest slot count + return new LegacySetItemSlotData(containerId, slots); + }); + } + } + + if (!buffer.readBoolean()) { + throw new IllegalStateException("Expected InventoryTransactionType"); + } + InventoryTransactionType transactionType = InventoryTransactionType.values()[VarInts.readUnsignedInt(buffer)]; + packet.setTransactionType(transactionType); + + if (!buffer.readBoolean()) { + throw new IllegalStateException("Expected InventoryActionData"); + } + readInventoryActions(buffer, helper, packet.getActions()); + + switch (transactionType) { + case ITEM_USE: + this.readItemUse(buffer, helper, packet); + break; + case ITEM_USE_ON_ENTITY: + this.readItemUseOnEntity(buffer, helper, packet); + break; + case ITEM_RELEASE: + this.readItemRelease(buffer, helper, packet); + break; + } + } + + public void writeItemUse(ByteBuf buffer, BedrockCodecHelper helper, InventoryTransactionPacket packet) { + VarInts.writeInt(buffer, packet.getActionType()); + buffer.writeByte(packet.getTriggerType().ordinal()); + helper.writeBlockPosition(buffer, packet.getBlockPosition()); + buffer.writeByte(packet.getBlockFace()); + VarInts.writeInt(buffer, packet.getHotbarSlot()); + helper.writeNetworkItemStackDescriptor(buffer, packet.getItemInHand()); + helper.writeVector3f(buffer, packet.getPlayerPosition()); + helper.writeVector3f(buffer, packet.getClickPosition()); + VarInts.writeUnsignedInt(buffer, packet.getBlockDefinition().getRuntimeId()); + buffer.writeByte(packet.getClientInteractPrediction().ordinal()); + buffer.writeByte(packet.getClientCooldownState()); + } + + public void readItemUse(ByteBuf buffer, BedrockCodecHelper helper, InventoryTransactionPacket packet) { + packet.setActionType(VarInts.readInt(buffer)); + packet.setTriggerType(ItemUseTransaction.TriggerType.values()[buffer.readUnsignedByte()]); + packet.setBlockPosition(helper.readBlockPosition(buffer)); + packet.setBlockFace(buffer.readUnsignedByte()); + packet.setHotbarSlot(VarInts.readInt(buffer)); + packet.setItemInHand(helper.readNetworkItemStackDescriptor(buffer)); + packet.setPlayerPosition(helper.readVector3f(buffer)); + packet.setClickPosition(helper.readVector3f(buffer)); + packet.setBlockDefinition(helper.getBlockDefinitions().getDefinition(VarInts.readUnsignedInt(buffer))); + packet.setClientInteractPrediction(ItemUseTransaction.PredictedResult.values()[buffer.readUnsignedByte()]); + packet.setClientCooldownState(buffer.readByte()); + } + + @Override + public void readItemUseOnEntity(ByteBuf buffer, BedrockCodecHelper helper, InventoryTransactionPacket packet) { + packet.setRuntimeEntityId(VarInts.readUnsignedLong(buffer)); + packet.setActionType(VarInts.readInt(buffer)); + packet.setHotbarSlot(VarInts.readInt(buffer)); + packet.setItemInHand(helper.readNetworkItemStackDescriptor(buffer)); + packet.setPlayerPosition(helper.readVector3f(buffer)); + packet.setClickPosition(helper.readVector3f(buffer)); + } + + @Override + public void writeItemUseOnEntity(ByteBuf buffer, BedrockCodecHelper helper, InventoryTransactionPacket packet) { + VarInts.writeUnsignedLong(buffer, packet.getRuntimeEntityId()); + VarInts.writeInt(buffer, packet.getActionType()); + VarInts.writeInt(buffer, packet.getHotbarSlot()); + helper.writeNetworkItemStackDescriptor(buffer, packet.getItemInHand()); + helper.writeVector3f(buffer, packet.getPlayerPosition()); + helper.writeVector3f(buffer, packet.getClickPosition()); + } + + @Override + public void readItemRelease(ByteBuf buffer, BedrockCodecHelper helper, InventoryTransactionPacket packet) { + packet.setActionType(VarInts.readInt(buffer)); + packet.setHotbarSlot(VarInts.readInt(buffer)); + packet.setItemInHand(helper.readNetworkItemStackDescriptor(buffer)); + packet.setHeadPosition(helper.readVector3f(buffer)); + } + + @Override + public void writeItemRelease(ByteBuf buffer, BedrockCodecHelper helper, InventoryTransactionPacket packet) { + VarInts.writeInt(buffer, packet.getActionType()); + VarInts.writeInt(buffer, packet.getHotbarSlot()); + helper.writeNetworkItemStackDescriptor(buffer, packet.getItemInHand()); + helper.writeVector3f(buffer, packet.getHeadPosition()); + } + + public void readInventoryActions(ByteBuf buffer, BedrockCodecHelper helper, List actions) { + helper.readArray(buffer, actions, (buf, h) -> { + InventorySource source = readSource(buf); + int slot = VarInts.readUnsignedInt(buf); + ItemData fromItem = h.readNetworkItemStackDescriptor(buf); + ItemData toItem = h.readNetworkItemStackDescriptor(buf); + + return new InventoryActionData(source, slot, fromItem, toItem); + }, helper.getEncodingSettings().maxInventoryActionsOrRequests()); + } + + public void writeInventoryActions(ByteBuf buffer, BedrockCodecHelper helper, List actions) { + helper.writeArray(buffer, actions, (buf, h, action) -> { + writeSource(buf, action.getSource()); + VarInts.writeUnsignedInt(buf, action.getSlot()); + h.writeNetworkItemStackDescriptor(buf, action.getFromItem()); + h.writeNetworkItemStackDescriptor(buf, action.getToItem()); + }); + } + + protected InventorySource readSource(ByteBuf buffer) { + InventorySource.Type type = InventorySource.Type.byId(VarInts.readUnsignedInt(buffer)); + + int containerId = 0; + InventorySource.Flag flag = null; + if (buffer.readBoolean() && buffer.readBoolean()) containerId = buffer.readByte(); + if (buffer.readBoolean() && buffer.readBoolean()) flag = InventorySource.Flag.values()[VarInts.readUnsignedInt(buffer)]; + switch (type) { + case CONTAINER: + return InventorySource.fromContainerWindowId(containerId); + case GLOBAL: + return InventorySource.fromGlobalInventory(); + case WORLD_INTERACTION: + if (flag == null) throw new IllegalStateException(); + return InventorySource.fromWorldInteraction(flag); + case CREATIVE: + return InventorySource.fromCreativeInventory(); + case NON_IMPLEMENTED_TODO: + return InventorySource.fromNonImplementedTodo(containerId); + case UNTRACKED_INTERACTION_UI: + return InventorySource.fromUntrackedInteractionUI(containerId); + default: + return InventorySource.fromInvalid(); + } + } + + protected void writeSource(ByteBuf buffer, InventorySource inventorySource) { + requireNonNull(inventorySource, "InventorySource was null"); + + VarInts.writeUnsignedInt(buffer, inventorySource.getType().id()); + + buffer.writeBoolean(true); + switch (inventorySource.getType()) { + case CONTAINER: + case NON_IMPLEMENTED_TODO: + buffer.writeBoolean(true); + buffer.writeByte(inventorySource.getContainerId()); + break; + default: + buffer.writeBoolean(false); + break; + } + + buffer.writeBoolean(true); + switch (inventorySource.getType()) { + case WORLD_INTERACTION: + buffer.writeBoolean(true); + VarInts.writeUnsignedInt(buffer, inventorySource.getFlag().ordinal()); + break; + default: + buffer.writeBoolean(false); + break; + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/LevelSoundEventSerializer_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/LevelSoundEventSerializer_v1001.java new file mode 100644 index 0000000..1e660e8 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/LevelSoundEventSerializer_v1001.java @@ -0,0 +1,40 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v975.serializer.LevelSoundEventSerializer_v975; +import org.cloudburstmc.protocol.bedrock.data.SoundEvent; +import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEventPacket; +import org.cloudburstmc.protocol.common.util.TypeMap; +import org.cloudburstmc.protocol.common.util.VarInts; + +public class LevelSoundEventSerializer_v1001 extends LevelSoundEventSerializer_v975 { + + public LevelSoundEventSerializer_v1001(TypeMap typeMap) { + super(typeMap); + } + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, LevelSoundEventPacket packet) { + helper.writeString(buffer, packet.getSound().getSerializeName()); + helper.writeVector3f(buffer, packet.getPosition()); + VarInts.writeInt(buffer, packet.getExtraData()); + helper.writeString(buffer, packet.getIdentifier()); + buffer.writeBoolean(packet.isBabySound()); + buffer.writeBoolean(packet.isRelativeVolumeDisabled()); + buffer.writeLongLE(packet.getEntityUniqueId()); + helper.writeOptionalNull(buffer, packet.getFireAtPosition(), helper::writeVector3f); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, LevelSoundEventPacket packet) { + packet.setSound(SoundEvent.fromName(helper.readString(buffer))); + packet.setPosition(helper.readVector3f(buffer)); + packet.setExtraData(VarInts.readInt(buffer)); + packet.setIdentifier(helper.readString(buffer)); + packet.setBabySound(buffer.readBoolean()); + packet.setRelativeVolumeDisabled(buffer.readBoolean()); + packet.setEntityUniqueId(buffer.readLongLE()); + packet.setFireAtPosition(helper.readOptional(buffer, null, helper::readVector3f)); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/MobArmorEquipmentSerializer_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/MobArmorEquipmentSerializer_v1001.java new file mode 100644 index 0000000..7821fb2 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/MobArmorEquipmentSerializer_v1001.java @@ -0,0 +1,32 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v712.serializer.MobArmorEquipmentSerializer_v712; +import org.cloudburstmc.protocol.bedrock.packet.MobArmorEquipmentPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +public class MobArmorEquipmentSerializer_v1001 extends MobArmorEquipmentSerializer_v712 { + + public static final MobArmorEquipmentSerializer_v1001 INSTANCE = new MobArmorEquipmentSerializer_v1001(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, MobArmorEquipmentPacket packet) { + VarInts.writeUnsignedLong(buffer, packet.getRuntimeEntityId()); + helper.writeNetworkItemStackDescriptor(buffer, packet.getHelmet()); + helper.writeNetworkItemStackDescriptor(buffer, packet.getChestplate()); + helper.writeNetworkItemStackDescriptor(buffer, packet.getLeggings()); + helper.writeNetworkItemStackDescriptor(buffer, packet.getBoots()); + helper.writeNetworkItemStackDescriptor(buffer, packet.getBody()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, MobArmorEquipmentPacket packet) { + packet.setRuntimeEntityId(VarInts.readUnsignedLong(buffer)); + packet.setHelmet(helper.readNetworkItemStackDescriptor(buffer)); + packet.setChestplate(helper.readNetworkItemStackDescriptor(buffer)); + packet.setLeggings(helper.readNetworkItemStackDescriptor(buffer)); + packet.setBoots(helper.readNetworkItemStackDescriptor(buffer)); + packet.setBody(helper.readNetworkItemStackDescriptor(buffer)); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/PartyDestinationCookieResponseSerializer_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/PartyDestinationCookieResponseSerializer_v1001.java new file mode 100644 index 0000000..ed886b6 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/PartyDestinationCookieResponseSerializer_v1001.java @@ -0,0 +1,24 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.packet.PartyDestinationCookieResponsePacket; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class PartyDestinationCookieResponseSerializer_v1001 implements BedrockPacketSerializer { + + public static final PartyDestinationCookieResponseSerializer_v1001 INSTANCE = new PartyDestinationCookieResponseSerializer_v1001(); + + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, PartyDestinationCookieResponsePacket packet) { + helper.writeString(buffer, packet.getCookie()); + buffer.writeBoolean(packet.isAccepted()); + } + + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, PartyDestinationCookieResponsePacket packet) { + packet.setCookie(helper.readString(buffer)); + packet.setAccepted(buffer.readBoolean()); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/SendPartyDestinationCookieSerializer_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/SendPartyDestinationCookieSerializer_v1001.java new file mode 100644 index 0000000..c6c1a8b --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/SendPartyDestinationCookieSerializer_v1001.java @@ -0,0 +1,26 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.packet.SendPartyDestinationCookiePacket; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class SendPartyDestinationCookieSerializer_v1001 implements BedrockPacketSerializer { + + public static final SendPartyDestinationCookieSerializer_v1001 INSTANCE = new SendPartyDestinationCookieSerializer_v1001(); + + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, SendPartyDestinationCookiePacket packet) { + helper.writeString(buffer, packet.getCookie()); + helper.writeString(buffer, packet.getIntent().getSerializeName()); + helper.writeString(buffer, packet.getDestinationName()); + } + + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, SendPartyDestinationCookiePacket packet) { + packet.setCookie(helper.readString(buffer)); + packet.setIntent(SendPartyDestinationCookiePacket.Intent.fromName(helper.readString(buffer))); + packet.setDestinationName(helper.readString(buffer)); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/ServerboundDiagnosticsSerializer_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/ServerboundDiagnosticsSerializer_v1001.java new file mode 100644 index 0000000..a7e66e9 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/ServerboundDiagnosticsSerializer_v1001.java @@ -0,0 +1,38 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v975.serializer.ServerboundDiagnosticsSerializer_v975; +import org.cloudburstmc.protocol.bedrock.data.diagnostics.WhiskerScopeDataSummary; +import org.cloudburstmc.protocol.bedrock.packet.ServerboundDiagnosticsPacket; + +public class ServerboundDiagnosticsSerializer_v1001 extends ServerboundDiagnosticsSerializer_v975 { + + public static final ServerboundDiagnosticsSerializer_v1001 INSTANCE = new ServerboundDiagnosticsSerializer_v1001(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ServerboundDiagnosticsPacket packet) { + super.serialize(buffer, helper, packet); + + helper.writeArray(buffer, packet.getWhiskerScopes(), ((buf, h, info) -> { + helper.writeString(buf, info.getLabel()); + helper.writeString(buf, info.getIndentation()); + buf.writeLongLE(info.getTotalHighCostNS()); + buf.writeLongLE(info.getTotalMidCostNS()); + buf.writeLongLE(info.getTotalLowCostNS()); + })); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ServerboundDiagnosticsPacket packet) { + super.deserialize(buffer, helper, packet); + + helper.readArray(buffer, packet.getWhiskerScopes(), (buf, h) -> + new WhiskerScopeDataSummary( + helper.readString(buf), + helper.readString(buf), + buf.readLongLE(), + buf.readLongLE(), + buf.readLongLE())); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/StartGameSerializer_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/StartGameSerializer_v1001.java new file mode 100644 index 0000000..1804885 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/StartGameSerializer_v1001.java @@ -0,0 +1,42 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v944.serializer.StartGameSerializer_v944; +import org.cloudburstmc.protocol.bedrock.packet.StartGamePacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +public class StartGameSerializer_v1001 extends StartGameSerializer_v944 { + + public static final StartGameSerializer_v1001 INSTANCE = new StartGameSerializer_v1001(); + + @Override + protected void writeLevelSettings(ByteBuf buffer, BedrockCodecHelper helper, StartGamePacket packet) { + super.writeLevelSettings(buffer, helper, packet); + + VarInts.writeInt(buffer, packet.getServerEditorConnectionPolicy()); + buffer.writeBoolean(packet.isAllowAnonymousBlockDropsInEditorWorlds()); + } + + @Override + protected void readLevelSettings(ByteBuf buffer, BedrockCodecHelper helper, StartGamePacket packet) { + super.readLevelSettings(buffer, helper, packet); + + packet.setServerEditorConnectionPolicy(VarInts.readInt(buffer)); + packet.setAllowAnonymousBlockDropsInEditorWorlds(buffer.readBoolean()); + } + + @Override + protected void readBeforeNetworkPermissions(ByteBuf buffer, BedrockCodecHelper helper, StartGamePacket packet) { + packet.setNetworkPermissions(this.readNetworkPermissions(buffer, helper)); + + packet.setLoggingChat(buffer.readBoolean()); + } + + @Override + protected void writeBeforeNetworkPermissions(ByteBuf buffer, BedrockCodecHelper helper, StartGamePacket packet) { + this.writeNetworkPermissions(buffer, helper, packet.getNetworkPermissions()); + + buffer.writeBoolean(packet.isLoggingChat()); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/SubChunkRequestSerializer_v1001.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/SubChunkRequestSerializer_v1001.java new file mode 100644 index 0000000..f0abb88 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v1001/serializer/SubChunkRequestSerializer_v1001.java @@ -0,0 +1,37 @@ +package org.cloudburstmc.protocol.bedrock.codec.v1001.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.math.vector.Vector3i; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v486.serializer.SubChunkRequestSerializer_v486; +import org.cloudburstmc.protocol.bedrock.packet.SubChunkRequestPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +public class SubChunkRequestSerializer_v1001 extends SubChunkRequestSerializer_v486 { + + public static final SubChunkRequestSerializer_v1001 INSTANCE = new SubChunkRequestSerializer_v1001(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, SubChunkRequestPacket packet) { + VarInts.writeInt(buffer, packet.getDimension()); + helper.writeArray(buffer, packet.getPositionOffsets(), this::writeSubChunkOffset); + writeSubChunkPos(buffer, packet.getSubChunkPosition()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, SubChunkRequestPacket packet) { + packet.setDimension(VarInts.readInt(buffer)); + helper.readArray(buffer, packet.getPositionOffsets(), this::readSubChunkOffset, 8192); + packet.setSubChunkPosition(readSubChunkPos(buffer)); + } + + protected void writeSubChunkPos(ByteBuf buffer, Vector3i offsetPosition) { + buffer.writeIntLE(offsetPosition.getX()); + buffer.writeIntLE(offsetPosition.getY()); + buffer.writeIntLE(offsetPosition.getZ()); + } + + protected Vector3i readSubChunkPos(ByteBuf buffer) { + return Vector3i.from(buffer.readIntLE(), buffer.readIntLE(), buffer.readIntLE()); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/BedrockCodecHelper_v291.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/BedrockCodecHelper_v291.java index be175f8..03f3e10 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/BedrockCodecHelper_v291.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/BedrockCodecHelper_v291.java @@ -49,7 +49,7 @@ public EntityLinkData readEntityLink(ByteBuf buffer) { int type = buffer.readUnsignedByte(); boolean immediate = buffer.readBoolean(); - return new EntityLinkData(from, to, EntityLinkData.Type.values()[type], immediate); + return new EntityLinkData(from, to, EntityLinkData.Type.values()[type], immediate, false, 0f); } @Override @@ -149,6 +149,16 @@ public void writeItem(ByteBuf buffer, ItemData item) { writeArray(buffer, item.getCanBreak(), this::writeString); } + @Override + public ItemData readNetworkItemStackDescriptor(ByteBuf buffer) { + throw new UnsupportedOperationException(); + } + + @Override + public void writeNetworkItemStackDescriptor(ByteBuf buffer, ItemData item) { + throw new UnsupportedOperationException(); + } + @Override public ItemData readItemInstance(ByteBuf buffer) { return readItem(buffer); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/BookEditSerializer_v291.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/BookEditSerializer_v291.java index 7ebbb65..ef6b0ca 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/BookEditSerializer_v291.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/BookEditSerializer_v291.java @@ -14,7 +14,7 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) public class BookEditSerializer_v291 implements BedrockPacketSerializer { public static final BookEditSerializer_v291 INSTANCE = new BookEditSerializer_v291(); - private static final Int2ObjectBiMap types = new Int2ObjectBiMap<>(); + protected static final Int2ObjectBiMap types = new Int2ObjectBiMap<>(); static { types.put(0, Action.REPLACE_PAGE); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/ClientboundMapItemDataSerializer_v291.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/ClientboundMapItemDataSerializer_v291.java index eb74e77..03c6b26 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/ClientboundMapItemDataSerializer_v291.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/ClientboundMapItemDataSerializer_v291.java @@ -9,6 +9,7 @@ import org.cloudburstmc.protocol.bedrock.data.MapDecoration; import org.cloudburstmc.protocol.bedrock.data.MapTrackedObject; import org.cloudburstmc.protocol.bedrock.packet.ClientboundMapItemDataPacket; +import org.cloudburstmc.protocol.common.util.Preconditions; import org.cloudburstmc.protocol.common.util.VarInts; import java.util.List; @@ -142,6 +143,7 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundMa packet.setYOffset(VarInts.readInt(buffer)); int length = VarInts.readUnsignedInt(buffer); + Preconditions.checkArgument(buffer.isReadable(length), "Not enough readable bytes"); int[] colors = new int[length]; for (int i = 0; i < length; i++) { colors[i] = VarInts.readUnsignedInt(buffer); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/EntityEventSerializer_v291.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/EntityEventSerializer_v291.java index 65a21a2..f78aba8 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/EntityEventSerializer_v291.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/EntityEventSerializer_v291.java @@ -16,7 +16,7 @@ public class EntityEventSerializer_v291 implements BedrockPacketSerializer typeMap; + protected final TypeMap typeMap; @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, EntityEventPacket packet) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/EventSerializer_v291.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/EventSerializer_v291.java index 1e0a54e..288922f 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/EventSerializer_v291.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/EventSerializer_v291.java @@ -233,19 +233,18 @@ protected void writePatternRemoved(ByteBuf buffer, BedrockCodecHelper helper, Ev protected SlashCommandExecutedEventData readSlashCommandExecuted(ByteBuf buffer, BedrockCodecHelper helper) { int successCount = VarInts.readInt(buffer); - VarInts.readInt(buffer); + int errorCount = VarInts.readInt(buffer); String commandName = helper.readString(buffer); - List outputMessages = Arrays.asList(helper.readString(buffer).split(";")); - return new SlashCommandExecutedEventData(commandName, successCount, outputMessages); + List outputMessages = Arrays.asList(helper.readStringMaxLen(buffer, 2048).split(";")); + return new SlashCommandExecutedEventData(commandName, successCount, errorCount, outputMessages); } protected void writeSlashCommandExecuted(ByteBuf buffer, BedrockCodecHelper helper, EventData eventData) { SlashCommandExecutedEventData event = (SlashCommandExecutedEventData) eventData; VarInts.writeInt(buffer, event.getSuccessCount()); - List outputMessages = event.getOutputMessages(); - VarInts.writeInt(buffer, outputMessages.size()); + VarInts.writeInt(buffer, event.getErrorCount()); helper.writeString(buffer, event.getCommandName()); - helper.writeString(buffer, String.join(";", outputMessages)); + helper.writeString(buffer, String.join(";", event.getOutputMessages())); } protected FishBucketedEventData readFishBucketed(ByteBuf buffer, BedrockCodecHelper helper) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/PhotoTransferSerializer_v291.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/PhotoTransferSerializer_v291.java index 78a78cf..46adf67 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/PhotoTransferSerializer_v291.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/PhotoTransferSerializer_v291.java @@ -6,6 +6,7 @@ import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; import org.cloudburstmc.protocol.bedrock.packet.PhotoTransferPacket; +import org.cloudburstmc.protocol.common.util.Preconditions; import org.cloudburstmc.protocol.common.util.VarInts; @NoArgsConstructor(access = AccessLevel.PROTECTED) @@ -25,7 +26,9 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, PhotoTransferPa @Override public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, PhotoTransferPacket packet) { packet.setName(helper.readString(buffer)); - byte[] data = new byte[VarInts.readUnsignedInt(buffer)]; + int length = VarInts.readUnsignedInt(buffer); + Preconditions.checkArgument(buffer.isReadable(length), "Not enough readable bytes"); + byte[] data = new byte[length]; buffer.readBytes(data); packet.setData(data); packet.setBookId(helper.readString(buffer)); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/ResourcePackChunkDataSerializer_v291.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/ResourcePackChunkDataSerializer_v291.java index 8e6785f..560f8bc 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/ResourcePackChunkDataSerializer_v291.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/ResourcePackChunkDataSerializer_v291.java @@ -26,7 +26,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ResourcePackChu @Override public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ResourcePackChunkDataPacket packet) { - String[] packInfo = helper.readString(buffer).split("_"); + String[] packInfo = helper.readStringMaxLen(buffer, 100).split("_", 3); packet.setPackId(UUID.fromString(packInfo[0])); if (packInfo.length > 1) { packet.setPackVersion(packInfo[1]); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/ResourcePackChunkRequestSerializer_v291.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/ResourcePackChunkRequestSerializer_v291.java index 4c822ab..1cebb5d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/ResourcePackChunkRequestSerializer_v291.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/ResourcePackChunkRequestSerializer_v291.java @@ -23,7 +23,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ResourcePackChu @Override public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ResourcePackChunkRequestPacket packet) { - String[] packInfo = helper.readString(buffer).split("_"); + String[] packInfo = helper.readStringMaxLen(buffer, 100).split("_", 3); packet.setPackId(UUID.fromString(packInfo[0])); if (packInfo.length > 1) { packet.setPackVersion(packInfo[1]); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/ResourcePackDataInfoSerializer_v291.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/ResourcePackDataInfoSerializer_v291.java index 64bc1df..ad2d1ef 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/ResourcePackDataInfoSerializer_v291.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/ResourcePackDataInfoSerializer_v291.java @@ -6,6 +6,7 @@ import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; import org.cloudburstmc.protocol.bedrock.packet.ResourcePackDataInfoPacket; +import org.cloudburstmc.protocol.common.util.Preconditions; import org.cloudburstmc.protocol.common.util.VarInts; import java.util.UUID; @@ -28,7 +29,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ResourcePackDat @Override public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ResourcePackDataInfoPacket packet) { - String[] packInfo = helper.readString(buffer).split("_"); + String[] packInfo = helper.readStringMaxLen(buffer, 100).split("_", 3); packet.setPackId(UUID.fromString(packInfo[0])); if (packInfo.length > 1) { packet.setPackVersion(packInfo[1]); @@ -36,7 +37,9 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ResourcePackD packet.setMaxChunkSize(buffer.readIntLE()); packet.setChunkCount(buffer.readIntLE()); packet.setCompressedPackSize(buffer.readLongLE()); - byte[] hash = new byte[VarInts.readUnsignedInt(buffer)]; + int length = VarInts.readUnsignedInt(buffer); + Preconditions.checkArgument(buffer.isReadable(length), "Not enough readable bytes"); + byte[] hash = new byte[length]; buffer.readBytes(hash); packet.setHash(hash); } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/TextSerializer_v291.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/TextSerializer_v291.java index 90bd87f..fbeb4ff 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/TextSerializer_v291.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v291/serializer/TextSerializer_v291.java @@ -54,6 +54,7 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket pa packet.setType(type); TextConverter converter = helper.getTextConverter(); boolean needsTranslation = buffer.readBoolean(); + packet.setNeedsTranslation(needsTranslation); switch (type) { case CHAT: diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v332/serializer/TextSerializer_v332.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v332/serializer/TextSerializer_v332.java index d66036d..810a528 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v332/serializer/TextSerializer_v332.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v332/serializer/TextSerializer_v332.java @@ -58,6 +58,7 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket pa packet.setType(type); TextConverter converter = helper.getTextConverter(); boolean needsTranslation = buffer.readBoolean(); + packet.setNeedsTranslation(needsTranslation); switch (type) { case CHAT: diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v354/serializer/ClientboundMapItemDataSerializer_v354.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v354/serializer/ClientboundMapItemDataSerializer_v354.java index bb9a8c2..0fe1910 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v354/serializer/ClientboundMapItemDataSerializer_v354.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v354/serializer/ClientboundMapItemDataSerializer_v354.java @@ -9,6 +9,7 @@ import org.cloudburstmc.protocol.bedrock.data.MapDecoration; import org.cloudburstmc.protocol.bedrock.data.MapTrackedObject; import org.cloudburstmc.protocol.bedrock.packet.ClientboundMapItemDataPacket; +import org.cloudburstmc.protocol.common.util.Preconditions; import org.cloudburstmc.protocol.common.util.VarInts; import java.util.List; @@ -33,7 +34,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundMapI } List decorations = packet.getDecorations(); List trackedObjects = packet.getTrackedObjects(); - if (!decorations.isEmpty() && !trackedObjects.isEmpty()) { + if (!decorations.isEmpty() || !trackedObjects.isEmpty()) { type |= FLAG_DECORATION_UPDATE; } LongList trackedEntityIds = packet.getTrackedEntityIds(); @@ -107,13 +108,12 @@ protected void writeMapDecorations(ByteBuf buffer, BedrockCodecHelper helper, Cl VarInts.writeUnsignedInt(buffer, trackedObjects.size()); for (MapTrackedObject object : trackedObjects) { + buffer.writeIntLE(object.getType().ordinal()); switch (object.getType()) { case BLOCK: - buffer.writeIntLE(object.getType().ordinal()); helper.writeBlockPosition(buffer, object.getPosition()); break; case ENTITY: - buffer.writeIntLE(object.getType().ordinal()); VarInts.writeLong(buffer, object.getEntityId()); break; } @@ -178,6 +178,7 @@ protected void readTextureUpdate(ByteBuf buffer, BedrockCodecHelper helper, Clie packet.setYOffset(VarInts.readInt(buffer)); int length = VarInts.readUnsignedInt(buffer); + Preconditions.checkArgument(buffer.isReadable(length), "Not enough readable bytes"); int[] colors = new int[length]; for (int i = 0; i < length; i++) { colors[i] = VarInts.readUnsignedInt(buffer); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v361/serializer/ResourcePackDataInfoSerializer_v361.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v361/serializer/ResourcePackDataInfoSerializer_v361.java index 2aecf76..af78f63 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v361/serializer/ResourcePackDataInfoSerializer_v361.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v361/serializer/ResourcePackDataInfoSerializer_v361.java @@ -6,6 +6,7 @@ import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; import org.cloudburstmc.protocol.bedrock.data.ResourcePackType; import org.cloudburstmc.protocol.bedrock.packet.ResourcePackDataInfoPacket; +import org.cloudburstmc.protocol.common.util.Preconditions; import org.cloudburstmc.protocol.common.util.TypeMap; import org.cloudburstmc.protocol.common.util.VarInts; @@ -31,7 +32,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ResourcePackDat @Override public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ResourcePackDataInfoPacket packet) { - String[] packInfo = helper.readString(buffer).split("_"); + String[] packInfo = helper.readStringMaxLen(buffer, 100).split("_", 3); packet.setPackId(UUID.fromString(packInfo[0])); if (packInfo.length > 1) { packet.setPackVersion(packInfo[1]); @@ -39,7 +40,9 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ResourcePackD packet.setMaxChunkSize(buffer.readUnsignedIntLE()); packet.setChunkCount(buffer.readUnsignedIntLE()); packet.setCompressedPackSize(buffer.readLongLE()); - byte[] hash = new byte[VarInts.readUnsignedInt(buffer)]; + int length = VarInts.readUnsignedInt(buffer); + Preconditions.checkArgument(buffer.isReadable(length), "Not enough readable bytes"); + byte[] hash = new byte[length]; buffer.readBytes(hash); packet.setHash(hash); packet.setPremium(buffer.readBoolean()); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v388/serializer/AddPlayerSerializer_v388.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v388/serializer/AddPlayerSerializer_v388.java index b26eefe..9bc216a 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v388/serializer/AddPlayerSerializer_v388.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v388/serializer/AddPlayerSerializer_v388.java @@ -5,6 +5,7 @@ import lombok.NoArgsConstructor; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.AddPlayerSerializer_v291; +import org.cloudburstmc.protocol.bedrock.data.BuildPlatform; import org.cloudburstmc.protocol.bedrock.packet.AddPlayerPacket; @NoArgsConstructor(access = AccessLevel.PROTECTED) @@ -15,13 +16,13 @@ public class AddPlayerSerializer_v388 extends AddPlayerSerializer_v291 { public void serialize(ByteBuf buffer, BedrockCodecHelper helper, AddPlayerPacket packet) { super.serialize(buffer, helper, packet); - buffer.writeIntLE(packet.getBuildPlatform()); + buffer.writeIntLE(packet.getBuildPlatform().ordinal()); } @Override public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, AddPlayerPacket packet) { super.deserialize(buffer, helper, packet); - packet.setBuildPlatform(buffer.readIntLE()); + packet.setBuildPlatform(BuildPlatform.from(buffer.readIntLE())); } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v388/serializer/PlayerListSerializer_v388.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v388/serializer/PlayerListSerializer_v388.java index 41c49a9..e011cc4 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v388/serializer/PlayerListSerializer_v388.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v388/serializer/PlayerListSerializer_v388.java @@ -5,6 +5,7 @@ import lombok.NoArgsConstructor; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.data.BuildPlatform; import org.cloudburstmc.protocol.bedrock.packet.PlayerListPacket; import org.cloudburstmc.protocol.common.util.TextConverter; import org.cloudburstmc.protocol.common.util.VarInts; @@ -30,7 +31,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, PlayerListPacke helper.writeString(buffer, converter.serialize(entry.getName(CharSequence.class))); helper.writeString(buffer, entry.getXuid()); helper.writeString(buffer, entry.getPlatformChatId()); - buffer.writeIntLE(entry.getBuildPlatform()); + buffer.writeIntLE(entry.getBuildPlatform().ordinal()); helper.writeSkin(buffer, entry.getSkin()); buffer.writeBoolean(entry.isTeacher()); buffer.writeBoolean(entry.isHost()); @@ -53,7 +54,7 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, PlayerListPac entry.setName(converter.deserialize(helper.readString(buffer))); entry.setXuid(helper.readString(buffer)); entry.setPlatformChatId(helper.readString(buffer)); - entry.setBuildPlatform(buffer.readIntLE()); + entry.setBuildPlatform(BuildPlatform.from(buffer.readIntLE())); entry.setSkin(helper.readSkin(buffer)); entry.setTeacher(buffer.readBoolean()); entry.setHost(buffer.readBoolean()); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v388/serializer/ResourcePackChunkDataSerializer_v388.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v388/serializer/ResourcePackChunkDataSerializer_v388.java index af63b39..5e812b2 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v388/serializer/ResourcePackChunkDataSerializer_v388.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v388/serializer/ResourcePackChunkDataSerializer_v388.java @@ -24,7 +24,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ResourcePackChu @Override public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ResourcePackChunkDataPacket packet) { - String[] packInfo = helper.readString(buffer).split("_"); + String[] packInfo = helper.readStringMaxLen(buffer, 100).split("_", 3); packet.setPackId(UUID.fromString(packInfo[0])); if (packInfo.length > 1) { packet.setPackVersion(packInfo[1]); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v390/serializer/PlayerListSerializer_v390.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v390/serializer/PlayerListSerializer_v390.java index 5edfce3..8fafd3d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v390/serializer/PlayerListSerializer_v390.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v390/serializer/PlayerListSerializer_v390.java @@ -5,6 +5,7 @@ import lombok.NoArgsConstructor; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.data.BuildPlatform; import org.cloudburstmc.protocol.bedrock.packet.PlayerListPacket; import org.cloudburstmc.protocol.common.util.TextConverter; import org.cloudburstmc.protocol.common.util.VarInts; @@ -65,7 +66,7 @@ protected void writeEntryBase(ByteBuf buffer, BedrockCodecHelper helper, Entry e helper.writeString(buffer, converter.serialize(entry.getName(CharSequence.class))); helper.writeString(buffer, entry.getXuid()); helper.writeString(buffer, entry.getPlatformChatId()); - buffer.writeIntLE(entry.getBuildPlatform()); + buffer.writeIntLE(entry.getBuildPlatform().ordinal()); helper.writeSkin(buffer, entry.getSkin()); buffer.writeBoolean(entry.isTeacher()); buffer.writeBoolean(entry.isHost()); @@ -78,7 +79,7 @@ protected Entry readEntryBase(ByteBuf buffer, BedrockCodecHelper helper) { entry.setName(converter.deserialize(helper.readString(buffer))); entry.setXuid(helper.readString(buffer)); entry.setPlatformChatId(helper.readString(buffer)); - entry.setBuildPlatform(buffer.readIntLE()); + entry.setBuildPlatform(BuildPlatform.from(buffer.readIntLE())); entry.setSkin(helper.readSkin(buffer)); entry.setTeacher(buffer.readBoolean()); entry.setHost(buffer.readBoolean()); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v407/BedrockCodecHelper_v407.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v407/BedrockCodecHelper_v407.java index b70ec63..3485a5f 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v407/BedrockCodecHelper_v407.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v407/BedrockCodecHelper_v407.java @@ -49,7 +49,8 @@ public EntityLinkData readEntityLink(ByteBuf buffer) { VarInts.readLong(buffer), EntityLinkData.Type.byId(buffer.readUnsignedByte()), buffer.readBoolean(), - buffer.readBoolean() + buffer.readBoolean(), + 0f ); } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v465/serializer/AnimateEntitySerializer_v465.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v465/serializer/AnimateEntitySerializer_v465.java index d466115..3cdaa96 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v465/serializer/AnimateEntitySerializer_v465.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v465/serializer/AnimateEntitySerializer_v465.java @@ -18,7 +18,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, AnimateEntityPa helper.writeString(buffer, packet.getAnimation()); helper.writeString(buffer, packet.getNextState()); helper.writeString(buffer, packet.getStopExpression()); - buffer.writeInt(packet.getStopExpressionVersion()); + buffer.writeIntLE(packet.getStopExpressionVersion()); helper.writeString(buffer, packet.getController()); buffer.writeFloatLE(packet.getBlendOutTime()); @@ -36,7 +36,7 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, AnimateEntity packet.setAnimation(helper.readString(buffer)); packet.setNextState(helper.readString(buffer)); packet.setStopExpression(helper.readString(buffer)); - packet.setStopExpressionVersion(buffer.readInt()); + packet.setStopExpressionVersion(buffer.readIntLE()); packet.setController(helper.readString(buffer)); packet.setBlendOutTime(buffer.readFloatLE()); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v465/serializer/UpdateSubChunkBlocksSerializer_v465.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v465/serializer/UpdateSubChunkBlocksSerializer_v465.java index fbaacab..5994faa 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v465/serializer/UpdateSubChunkBlocksSerializer_v465.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v465/serializer/UpdateSubChunkBlocksSerializer_v465.java @@ -17,18 +17,14 @@ public class UpdateSubChunkBlocksSerializer_v465 implements BedrockPacketSeriali @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, UpdateSubChunkBlocksPacket packet) { - VarInts.writeInt(buffer, packet.getChunkX()); - VarInts.writeUnsignedInt(buffer, packet.getChunkY()); - VarInts.writeInt(buffer, packet.getChunkZ()); + helper.writeBlockPosition(buffer, packet.getPosition()); helper.writeArray(buffer, packet.getStandardBlocks(), this::writeBlockChangeEntry); helper.writeArray(buffer, packet.getExtraBlocks(), this::writeBlockChangeEntry); } @Override public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, UpdateSubChunkBlocksPacket packet) { - packet.setChunkX(VarInts.readInt(buffer)); - packet.setChunkY(VarInts.readUnsignedInt(buffer)); - packet.setChunkZ(VarInts.readInt(buffer)); + packet.setPosition(helper.readBlockPosition(buffer)); helper.readArray(buffer, packet.getStandardBlocks(), this::readBlockChangeEntry); helper.readArray(buffer, packet.getExtraBlocks(), this::readBlockChangeEntry); } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v503/serializer/AddPlayerSerializer_v503.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v503/serializer/AddPlayerSerializer_v503.java index d93cbce..27ce9bd 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v503/serializer/AddPlayerSerializer_v503.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v503/serializer/AddPlayerSerializer_v503.java @@ -4,6 +4,7 @@ import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.AdventureSettingsSerializer_v291; import org.cloudburstmc.protocol.bedrock.codec.v388.serializer.AddPlayerSerializer_v388; +import org.cloudburstmc.protocol.bedrock.data.BuildPlatform; import org.cloudburstmc.protocol.bedrock.data.GameType; import org.cloudburstmc.protocol.bedrock.packet.AddPlayerPacket; import org.cloudburstmc.protocol.common.util.VarInts; @@ -28,7 +29,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, AddPlayerPacket AdventureSettingsSerializer_v291.INSTANCE.serialize(buffer, helper, packet.getAdventureSettings()); helper.writeArray(buffer, packet.getEntityLinks(), helper::writeEntityLink); helper.writeString(buffer, packet.getDeviceId()); - buffer.writeIntLE(packet.getBuildPlatform()); + buffer.writeIntLE(packet.getBuildPlatform().ordinal()); } @Override @@ -47,6 +48,6 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, AddPlayerPack AdventureSettingsSerializer_v291.INSTANCE.deserialize(buffer, helper, packet.getAdventureSettings()); helper.readArray(buffer, packet.getEntityLinks(), helper::readEntityLink); packet.setDeviceId(helper.readString(buffer)); - packet.setBuildPlatform(buffer.readIntLE()); + packet.setBuildPlatform(BuildPlatform.from(buffer.readIntLE())); } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v503/serializer/DimensionDataSerializer_v503.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v503/serializer/DimensionDataSerializer_v503.java index 116cdba..4944cd5 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v503/serializer/DimensionDataSerializer_v503.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v503/serializer/DimensionDataSerializer_v503.java @@ -31,6 +31,6 @@ protected DimensionDefinition readDefinition(ByteBuf buffer, BedrockCodecHelper int maximumHeight = VarInts.readInt(buffer); int minimumHeight = VarInts.readInt(buffer); int generatorType = VarInts.readInt(buffer); - return new DimensionDefinition(id, maximumHeight, minimumHeight, generatorType); + return new DimensionDefinition(id, maximumHeight, minimumHeight, generatorType, 0); } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v534/serializer/AddPlayerSerializer_v534.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v534/serializer/AddPlayerSerializer_v534.java index a8d2ab2..76d72e2 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v534/serializer/AddPlayerSerializer_v534.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v534/serializer/AddPlayerSerializer_v534.java @@ -5,6 +5,7 @@ import lombok.NoArgsConstructor; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; import org.cloudburstmc.protocol.bedrock.codec.v503.serializer.AddPlayerSerializer_v503; +import org.cloudburstmc.protocol.bedrock.data.BuildPlatform; import org.cloudburstmc.protocol.bedrock.packet.AddPlayerPacket; import org.cloudburstmc.protocol.common.util.VarInts; @@ -27,7 +28,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, AddPlayerPacket helper.writePlayerAbilities(buffer, packet); helper.writeArray(buffer, packet.getEntityLinks(), helper::writeEntityLink); helper.writeString(buffer, packet.getDeviceId()); - buffer.writeIntLE(packet.getBuildPlatform()); + buffer.writeIntLE(packet.getBuildPlatform().ordinal()); } @Override @@ -45,6 +46,6 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, AddPlayerPack helper.readPlayerAbilities(buffer, packet); helper.readArray(buffer, packet.getEntityLinks(), helper::readEntityLink); packet.setDeviceId(helper.readString(buffer)); - packet.setBuildPlatform(buffer.readIntLE()); + packet.setBuildPlatform(BuildPlatform.from(buffer.readIntLE())); } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v544/serializer/ClientboundMapItemDataSerializer_v544.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v544/serializer/ClientboundMapItemDataSerializer_v544.java index 4ccc897..459e31b 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v544/serializer/ClientboundMapItemDataSerializer_v544.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v544/serializer/ClientboundMapItemDataSerializer_v544.java @@ -25,7 +25,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundMapI } List decorations = packet.getDecorations(); List trackedObjects = packet.getTrackedObjects(); - if (!decorations.isEmpty() && !trackedObjects.isEmpty()) { + if (!decorations.isEmpty() || !trackedObjects.isEmpty()) { type |= FLAG_DECORATION_UPDATE; } LongList trackedEntityIds = packet.getTrackedEntityIds(); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v554/serializer/TextSerializer_v554.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v554/serializer/TextSerializer_v554.java index 8955af4..30299f7 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v554/serializer/TextSerializer_v554.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v554/serializer/TextSerializer_v554.java @@ -56,6 +56,7 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket pa packet.setType(type); TextConverter converter = helper.getTextConverter(); boolean needsTranslation = buffer.readBoolean(); + packet.setNeedsTranslation(needsTranslation); switch (type) { case CHAT: diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v557/serializer/AddPlayerSerializer_v557.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v557/serializer/AddPlayerSerializer_v557.java index 8ea6237..075170c 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v557/serializer/AddPlayerSerializer_v557.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v557/serializer/AddPlayerSerializer_v557.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; import org.cloudburstmc.protocol.bedrock.codec.v534.serializer.AddPlayerSerializer_v534; +import org.cloudburstmc.protocol.bedrock.data.BuildPlatform; import org.cloudburstmc.protocol.bedrock.packet.AddPlayerPacket; import org.cloudburstmc.protocol.common.util.VarInts; @@ -24,7 +25,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, AddPlayerPacket helper.writePlayerAbilities(buffer, packet); helper.writeArray(buffer, packet.getEntityLinks(), helper::writeEntityLink); helper.writeString(buffer, packet.getDeviceId()); - buffer.writeIntLE(packet.getBuildPlatform()); + buffer.writeIntLE(packet.getBuildPlatform().ordinal()); } @Override @@ -43,6 +44,6 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, AddPlayerPack helper.readPlayerAbilities(buffer, packet); helper.readArray(buffer, packet.getEntityLinks(), helper::readEntityLink); packet.setDeviceId(helper.readString(buffer)); - packet.setBuildPlatform(buffer.readIntLE()); + packet.setBuildPlatform(BuildPlatform.from(buffer.readIntLE())); } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v575/Bedrock_v575.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v575/Bedrock_v575.java index dc5653f..2211446 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v575/Bedrock_v575.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v575/Bedrock_v575.java @@ -72,9 +72,9 @@ public class Bedrock_v575 extends Bedrock_v568 { .insert(6, CommandParam.OPERATOR) .insert(7, CommandParam.COMPARE_OPERATOR) .insert(8, CommandParam.TARGET) - .insert(9, CommandParam.UNKNOWN_STANDALONE) + .insert(9, CommandParam.STANDALONE_TARGET) .insert(10, CommandParam.WILDCARD_TARGET) - .insert(11, CommandParam.UNKNOWN_NON_ID) + .insert(11, CommandParam.NON_ID_TARGET) .insert(12, CommandParam.SCORE_ARG) .insert(13, CommandParam.SCORE_ARGS) .insert(14, CommandParam.SCORE_SELECT_PARAM) diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v618/serializer/ResourcePacksInfoSerializer_v618.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v618/serializer/ResourcePacksInfoSerializer_v618.java index 3880912..8094289 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v618/serializer/ResourcePacksInfoSerializer_v618.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v618/serializer/ResourcePacksInfoSerializer_v618.java @@ -10,7 +10,7 @@ import org.cloudburstmc.protocol.bedrock.packet.ResourcePacksInfoPacket; import org.cloudburstmc.protocol.common.util.VarInts; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import static org.cloudburstmc.protocol.common.util.Preconditions.checkArgument; @@ -62,7 +62,7 @@ protected void readCDNEntries(ByteBuf buffer, ResourcePacksInfoPacket packet, Be return; } - Map cdnUrls = new HashMap<>(); + Map cdnUrls = new LinkedHashMap<>(); for (int i = 0; i < size; i++) { String idVersion = helper.readString(buffer); String url = helper.readString(buffer); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v776/serializer/ItemComponentSerializer_v776.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v776/serializer/ItemComponentSerializer_v776.java index 121402a..2c6d961 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v776/serializer/ItemComponentSerializer_v776.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v776/serializer/ItemComponentSerializer_v776.java @@ -21,7 +21,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ItemComponentPa packetHelper.writeString(buf, item.getIdentifier()); buf.writeShortLE(item.getRuntimeId()); buf.writeBoolean(item.isComponentBased()); - VarInts.writeInt(buffer, item.getVersion().ordinal()); + VarInts.writeInt(buf, item.getVersion().ordinal()); if (item.getComponentData() != null) { // We should check for isComponentBased() instead, but for some reason there can be non-data driven items with component data packetHelper.writeTag(buf, item.getComponentData()); } else { @@ -36,7 +36,7 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ItemComponent String name = packetHelper.readString(buf); short itemId = buf.readShortLE(); boolean componentBased = buf.readBoolean(); - int version = VarInts.readInt(buffer); + int version = VarInts.readInt(buf); NbtMap data = packetHelper.readTag(buf, NbtMap.class); return new SimpleItemDefinition(name, itemId, ItemVersion.from(version), componentBased, data); }); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v800/serializer/BiomeDefinitionListSerializer_v800.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v800/serializer/BiomeDefinitionListSerializer_v800.java index 7af3a7f..8af86c1 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v800/serializer/BiomeDefinitionListSerializer_v800.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v800/serializer/BiomeDefinitionListSerializer_v800.java @@ -63,12 +63,12 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, BiomeDefiniti packet.setBiomes(new BiomeDefinitions(indexedBiomes)); } - protected void writeDefinitionId(ByteBuf buffer, BedrockCodecHelper helper, BiomeDefinitionData definition, SequencedHashSet strings) { - helper.writeOptional(buffer, Objects::nonNull, definition.getId(), (buf, id) -> buf.writeShortLE(strings.addAndGetIndex(id))); + protected void writeDefinitionId(ByteBuf buffer, BedrockCodecHelper helper, BiomeDefinitionData definition) { + helper.writeOptional(buffer, Objects::nonNull, definition.getId(), ByteBuf::writeShortLE); } protected void writeDefinition(ByteBuf buffer, BedrockCodecHelper helper, BiomeDefinitionData definition, SequencedHashSet strings) { - this.writeDefinitionId(buffer, helper, definition, strings); + this.writeDefinitionId(buffer, helper, definition); buffer.writeFloatLE(definition.getTemperature()); buffer.writeFloatLE(definition.getDownfall()); buffer.writeFloatLE(definition.getRedSporeDensity()); @@ -89,12 +89,12 @@ protected void writeDefinition(ByteBuf buffer, BedrockCodecHelper helper, BiomeD (buf, aHelper, data) -> writeDefinitionChunkGen(buf, aHelper, data, strings)); } - protected Indexed readDefinitionId(ByteBuf buffer, BedrockCodecHelper helper, List strings) { - return helper.readOptional(buffer, null, (buf, aHelper) -> new Indexed<>(strings, buf.readUnsignedShortLE())); + protected Integer readDefinitionId(ByteBuf buffer, BedrockCodecHelper helper) { + return helper.readOptional(buffer, null, (buf, aHelper) -> buf.readUnsignedShortLE()); } protected BiomeDefinitionData readDefinition(ByteBuf buffer, BedrockCodecHelper helper, List strings) { - Indexed id = this.readDefinitionId(buffer, helper, strings); + Integer id = this.readDefinitionId(buffer, helper); float temperature = buffer.readFloatLE(); float downfall = buffer.readFloatLE(); float redSporeDensity = buffer.readFloatLE(); @@ -171,7 +171,7 @@ protected BiomeDefinitionChunkGenData readDefinitionChunkGen(ByteBuf buffer, Bed hasFrozenOceanSurface, hasTheEndSurface, mesaSurface, cappedSurface, overworldGenRules, multinoiseGenRules, - legacyWorldGenRules, null); + legacyWorldGenRules, null, null, null, null); } protected void writeClimate(ByteBuf buffer, BedrockCodecHelper helper, BiomeClimateData climate) { @@ -224,9 +224,9 @@ protected void writeConsolidatedFeature(ByteBuf buffer, BedrockCodecHelper helpe protected BiomeConsolidatedFeatureData readConsolidatedFeature(ByteBuf buffer, BedrockCodecHelper helper, List strings) { BiomeScatterParamData scatter = readScatterParam(buffer, helper, strings); - Indexed feature = new Indexed<>(strings, buffer.readShortLE()); - Indexed identifier = new Indexed<>(strings, buffer.readShortLE()); - Indexed pass = new Indexed<>(strings, buffer.readShortLE()); + Indexed feature = new Indexed<>(strings, buffer.readUnsignedShortLE()); + Indexed identifier = new Indexed<>(strings, buffer.readUnsignedShortLE()); + Indexed pass = new Indexed<>(strings, buffer.readUnsignedShortLE()); boolean internalUse = buffer.readBoolean(); return new BiomeConsolidatedFeatureData(scatter, feature, identifier, pass, internalUse); @@ -252,12 +252,12 @@ protected BiomeScatterParamData readScatterParam(ByteBuf buffer, BedrockCodecHel CoordinateEvaluationOrder evalOrder = EVALUATION_ORDERS[VarInts.readInt(buffer)]; int chancePercentTypeInt = VarInts.readInt(buffer); ExpressionOp chancePercentType = chancePercentTypeInt == -1 ? null : EXPRESSION_OPS[chancePercentTypeInt]; - Indexed chancePercent = new Indexed<>(strings, buffer.readShortLE()); + Indexed chancePercent = new Indexed<>(strings, buffer.readUnsignedShortLE()); int chanceNumerator = buffer.readIntLE(); int chanceDenominator = buffer.readIntLE(); int iterationTypeInt = VarInts.readInt(buffer); ExpressionOp iterationsType = iterationTypeInt == -1 ? null : EXPRESSION_OPS[iterationTypeInt]; - Indexed iterations = new Indexed<>(strings, buffer.readShortLE()); + Indexed iterations = new Indexed<>(strings, buffer.readUnsignedShortLE()); return new BiomeScatterParamData(coordinates, evalOrder, chancePercentType, chancePercent, chanceNumerator, chanceDenominator, @@ -277,9 +277,9 @@ protected void writeCoordinate(ByteBuf buffer, BedrockCodecHelper helper, BiomeC protected BiomeCoordinateData readCoordinate(ByteBuf buffer, BedrockCodecHelper helper, List strings) { ExpressionOp minValueType = this.readExpressionOp(buffer); - Indexed minValue = new Indexed<>(strings, buffer.readShortLE()); + Indexed minValue = new Indexed<>(strings, buffer.readUnsignedShortLE()); ExpressionOp maxValueType = this.readExpressionOp(buffer); - Indexed maxValue = new Indexed<>(strings, buffer.readShortLE()); + Indexed maxValue = new Indexed<>(strings, buffer.readUnsignedShortLE()); long gridOffset = buffer.readUnsignedIntLE(); long gridStepSize = buffer.readUnsignedIntLE(); RandomDistributionType distribution = RANDOM_DISTRIBUTION_TYPES[VarInts.readInt(buffer)]; @@ -341,9 +341,9 @@ protected BiomeElementData readBiomeElement(ByteBuf buffer, BedrockCodecHelper h float noiseLowerBound = buffer.readFloatLE(); float noiseUpperBound = buffer.readFloatLE(); ExpressionOp heightMinType = this.readExpressionOp(buffer); - Indexed heightMin = new Indexed<>(strings, buffer.readShortLE()); + Indexed heightMin = new Indexed<>(strings, buffer.readUnsignedShortLE()); ExpressionOp heightMaxType = this.readExpressionOp(buffer); - Indexed heightMax = new Indexed<>(strings, buffer.readShortLE()); + Indexed heightMax = new Indexed<>(strings, buffer.readUnsignedShortLE()); BiomeSurfaceMaterialData adjustedMaterials = readSurfaceMaterial(buffer, helper); return new BiomeElementData(noiseFrequencyScale, noiseLowerBound, noiseUpperBound, @@ -458,8 +458,8 @@ protected void writeWeight(ByteBuf buffer, BiomeWeightedData weightedData, Seque } protected BiomeWeightedData readWeight(ByteBuf buffer, BedrockCodecHelper helper, List strings) { - Indexed biome = new Indexed<>(strings, buffer.readShortLE()); - int weight = buffer.readIntLE(); + Indexed biome = new Indexed<>(strings, buffer.readUnsignedShortLE()); + int weight = (int) buffer.readUnsignedIntLE(); return new BiomeWeightedData(biome, weight); } @@ -476,7 +476,7 @@ protected BiomeConditionalTransformationData readConditionalTransformation(ByteB List strings) { List weightedBiomes = new ObjectArrayList<>(); helper.readArray(buffer, weightedBiomes, (buf, aHelper) -> readWeight(buf, aHelper, strings)); - Indexed conditionJson = new Indexed<>(strings, buffer.readShortLE()); + Indexed conditionJson = new Indexed<>(strings, buffer.readUnsignedShortLE()); long minPassingNeighbors = buffer.readUnsignedIntLE(); return new BiomeConditionalTransformationData(weightedBiomes, conditionJson, minPassingNeighbors); } @@ -488,7 +488,7 @@ protected void writeWeightedTemperature(ByteBuf buffer, BedrockCodecHelper helpe protected BiomeWeightedTemperatureData readWeightedTemperature(ByteBuf buffer, BedrockCodecHelper helper) { BiomeTemperatureCategory temperature = TEMPERATURE_CATEGORIES[VarInts.readInt(buffer)]; - int weight = buffer.readIntLE(); + int weight = (int) buffer.readUnsignedIntLE(); return new BiomeWeightedTemperatureData(temperature, weight); } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v800/serializer/PlayerListSerializer_v800.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v800/serializer/PlayerListSerializer_v800.java index f7b7019..df80db4 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v800/serializer/PlayerListSerializer_v800.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v800/serializer/PlayerListSerializer_v800.java @@ -14,13 +14,13 @@ public class PlayerListSerializer_v800 extends PlayerListSerializer_v649 { @Override protected void writeEntryBase(ByteBuf buffer, BedrockCodecHelper helper, PlayerListPacket.Entry entry) { super.writeEntryBase(buffer, helper, entry); - buffer.writeIntLE(entry.getColor()); + buffer.writeIntLE(entry.getColor().getRGB()); } @Override protected PlayerListPacket.Entry readEntryBase(ByteBuf buffer, BedrockCodecHelper helper) { PlayerListPacket.Entry entry = super.readEntryBase(buffer, helper); - entry.setColor(buffer.readIntLE()); + entry.setColor(new Color(buffer.readIntLE(), true)); return entry; } -} \ No newline at end of file +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v818/serializer/DebugDrawerSerializer_v818.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v818/serializer/DebugDrawerSerializer_v818.java index b757316..c7f2eec 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v818/serializer/DebugDrawerSerializer_v818.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v818/serializer/DebugDrawerSerializer_v818.java @@ -44,7 +44,6 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, DebugDrawerPa } protected void writeShape(ByteBuf buffer, BedrockCodecHelper helper, DebugShape shape) { - VarInts.writeUnsignedLong(buffer, shape.getId()); writeCommonShapeData(buffer, helper, shape); switch (shape.getType()) { @@ -106,6 +105,7 @@ protected void writeShape(ByteBuf buffer, BedrockCodecHelper helper, DebugShape } protected void writeCommonShapeData(ByteBuf buffer, BedrockCodecHelper helper, DebugShape shape) { + VarInts.writeUnsignedLong(buffer, shape.getId()); helper.writeOptionalNull(buffer, shape.getType(), (buf, type) -> buf.writeByte(type.ordinal())); helper.writeOptionalNull(buffer, shape.getPosition(), WRITE_VECTOR3F); helper.writeOptionalNull(buffer, shape.getScale(), ByteBuf::writeFloatLE); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v827/serializer/BiomeDefinitionListSerializer_v827.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v827/serializer/BiomeDefinitionListSerializer_v827.java index 27e4f52..578d1c6 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v827/serializer/BiomeDefinitionListSerializer_v827.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v827/serializer/BiomeDefinitionListSerializer_v827.java @@ -4,31 +4,23 @@ import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; import org.cloudburstmc.protocol.bedrock.codec.v800.serializer.BiomeDefinitionListSerializer_v800; import org.cloudburstmc.protocol.bedrock.data.biome.BiomeDefinitionData; -import org.cloudburstmc.protocol.common.util.SequencedHashSet; -import org.cloudburstmc.protocol.common.util.index.Indexed; - -import java.util.List; public class BiomeDefinitionListSerializer_v827 extends BiomeDefinitionListSerializer_v800 { public static final BiomeDefinitionListSerializer_v827 INSTANCE = new BiomeDefinitionListSerializer_v827(); @Override - protected void writeDefinitionId(ByteBuf buffer, BedrockCodecHelper helper, BiomeDefinitionData definition, SequencedHashSet strings) { + protected void writeDefinitionId(ByteBuf buffer, BedrockCodecHelper helper, BiomeDefinitionData definition) { if (definition.getId() == null) { buffer.writeShortLE(-1); // Vanilla biomes don't contain ID field } else { - buffer.writeShortLE(strings.addAndGetIndex(definition.getId())); + buffer.writeShortLE(definition.getId()); } } @Override - protected Indexed readDefinitionId(ByteBuf buffer, BedrockCodecHelper helper, List strings) { - int idIndex = buffer.readShortLE(); - Indexed id = null; - if (idIndex != -1) { - id = new Indexed<>(strings, idIndex); - } - return id; + protected Integer readDefinitionId(ByteBuf buffer, BedrockCodecHelper helper) { + int id = buffer.readShortLE(); + return id != -1 ? id : null; } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v827/serializer/CameraInstructionSerializer_v827.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v827/serializer/CameraInstructionSerializer_v827.java index 810610a..cdb948a 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v827/serializer/CameraInstructionSerializer_v827.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v827/serializer/CameraInstructionSerializer_v827.java @@ -14,23 +14,27 @@ public class CameraInstructionSerializer_v827 extends CameraInstructionSerialize @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, CameraInstructionPacket packet) { super.serialize(buffer, helper, packet); - helper.writeOptionalNull(buffer, packet.getFovInstruction(), (buf, fovInstruction) -> { - buf.writeFloatLE(fovInstruction.getFov()); - buf.writeFloatLE(fovInstruction.getEaseTime()); - buf.writeByte(fovInstruction.getEaseType().ordinal()); - buf.writeBoolean(fovInstruction.isClear()); - }); + helper.writeOptionalNull(buffer, packet.getFovInstruction(), this::writeFovInstruction); } @Override public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, CameraInstructionPacket packet) { super.deserialize(buffer, helper, packet); - packet.setFovInstruction(helper.readOptional(buffer, null, buf -> { - float fow = buf.readFloatLE(); - float easeTime = buf.readFloatLE(); - CameraEase easeType = CameraEase.values()[buf.readUnsignedByte()]; - boolean fovClear = buf.readBoolean(); - return new CameraFovInstruction(fow, easeTime, easeType, fovClear); - })); + packet.setFovInstruction(helper.readOptional(buffer, null, this::readFovInstruction)); + } + + protected void writeFovInstruction(ByteBuf buffer, BedrockCodecHelper helper, CameraFovInstruction fovInstruction) { + buffer.writeFloatLE(fovInstruction.getFov()); + buffer.writeFloatLE(fovInstruction.getEaseTime()); + buffer.writeByte(fovInstruction.getEaseType().ordinal()); + buffer.writeBoolean(fovInstruction.isClear()); + } + + protected CameraFovInstruction readFovInstruction(ByteBuf buffer, BedrockCodecHelper helper) { + float fow = buffer.readFloatLE(); + float easeTime = buffer.readFloatLE(); + CameraEase easeType = CameraEase.values()[buffer.readUnsignedByte()]; + boolean fovClear = buffer.readBoolean(); + return new CameraFovInstruction(fow, easeTime, easeType, fovClear); } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v844/serializer/BiomeDefinitionListSerializer_v844.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v844/serializer/BiomeDefinitionListSerializer_v844.java index ffa5c46..be7bc9d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v844/serializer/BiomeDefinitionListSerializer_v844.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v844/serializer/BiomeDefinitionListSerializer_v844.java @@ -7,7 +7,6 @@ import org.cloudburstmc.protocol.common.util.Preconditions; import org.cloudburstmc.protocol.common.util.SequencedHashSet; import org.cloudburstmc.protocol.common.util.VarInts; -import org.cloudburstmc.protocol.common.util.index.Indexed; import org.cloudburstmc.protocol.common.util.index.IndexedList; import java.awt.*; @@ -19,7 +18,7 @@ public class BiomeDefinitionListSerializer_v844 extends BiomeDefinitionListSeria @Override protected void writeDefinition(ByteBuf buffer, BedrockCodecHelper helper, BiomeDefinitionData definition, SequencedHashSet strings) { - this.writeDefinitionId(buffer, helper, definition, strings); + this.writeDefinitionId(buffer, helper, definition); buffer.writeFloatLE(definition.getTemperature()); buffer.writeFloatLE(definition.getDownfall()); buffer.writeFloatLE(definition.getFoliageSnow()); @@ -39,7 +38,7 @@ protected void writeDefinition(ByteBuf buffer, BedrockCodecHelper helper, BiomeD @Override protected BiomeDefinitionData readDefinition(ByteBuf buffer, BedrockCodecHelper helper, List strings) { - Indexed id = this.readDefinitionId(buffer, helper, strings); + Integer id = this.readDefinitionId(buffer, helper); float temperature = buffer.readFloatLE(); float downfall = buffer.readFloatLE(); float foliageSnow = buffer.readFloatLE(); @@ -116,7 +115,7 @@ protected BiomeDefinitionChunkGenData readDefinitionChunkGen(ByteBuf buffer, Bed hasFrozenOceanSurface, hasTheEndSurface, mesaSurface, cappedSurface, overworldGenRules, multinoiseGenRules, - legacyWorldGenRules, null); + legacyWorldGenRules, null, null, null, null); } @Override diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v859/serializer/BiomeDefinitionListSerializer_v859.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v859/serializer/BiomeDefinitionListSerializer_v859.java index 79ca6d7..e8e8369 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v859/serializer/BiomeDefinitionListSerializer_v859.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v859/serializer/BiomeDefinitionListSerializer_v859.java @@ -17,7 +17,7 @@ public class BiomeDefinitionListSerializer_v859 extends BiomeDefinitionListSeria protected void writeDefinitionChunkGen(ByteBuf buffer, BedrockCodecHelper helper, BiomeDefinitionChunkGenData definitionChunkGen, SequencedHashSet strings) { super.writeDefinitionChunkGen(buffer, helper, definitionChunkGen, strings); - helper.writeOptionalNull(buffer, definitionChunkGen.getBiomeReplacementData(), this::writeBiomeReplacementData); + helper.writeOptionalNull(buffer, definitionChunkGen.getBiomeReplacements(), this::writeBiomeReplacementsData); } @Override @@ -40,7 +40,7 @@ protected BiomeDefinitionChunkGenData readDefinitionChunkGen(ByteBuf buffer, Bed BiomeMultinoiseGenRulesData multinoiseGenRules = helper.readOptional(buffer, null, this::readMultinoiseGenRules); BiomeLegacyWorldGenRulesData legacyWorldGenRules = helper.readOptional(buffer, null, (buf, aHelper) -> this.readLegacyWorldGenRules(buf, aHelper, strings)); - BiomeReplacementData replacementData = helper.readOptional(buffer, null, this::readBiomeReplacementData); + List replacementsData = helper.readOptional(buffer, null, this::readBiomeReplacementsData); return new BiomeDefinitionChunkGenData(climate, consolidatedFeatures, mountainParams, surfaceMaterialAdjustment, @@ -48,27 +48,33 @@ protected BiomeDefinitionChunkGenData readDefinitionChunkGen(ByteBuf buffer, Bed hasFrozenOceanSurface, hasTheEndSurface, mesaSurface, cappedSurface, overworldGenRules, multinoiseGenRules, - legacyWorldGenRules, replacementData); + legacyWorldGenRules, replacementsData, null, null, null); } - protected void writeBiomeReplacementData(ByteBuf buffer, BedrockCodecHelper helper, BiomeReplacementData replacementData) { - buffer.writeShortLE(replacementData.getBiome()); - buffer.writeShortLE(replacementData.getDimension()); - helper.writeArray(buffer, replacementData.getTargetBiomes(), (buf, value) -> buf.writeShortLE(value)); - buffer.writeFloatLE(replacementData.getAmount()); - buffer.writeFloatLE(replacementData.getNoiseFrequencyScale()); - buffer.writeIntLE(replacementData.getReplacementIndex()); + protected void writeBiomeReplacementsData(ByteBuf buffer, BedrockCodecHelper helper, List replacementsData) { + helper.writeArray(buffer, replacementsData, (buf, h, replacementData) -> { + buffer.writeShortLE(replacementData.getBiome()); + buffer.writeShortLE(replacementData.getDimension()); + helper.writeArray(buffer, replacementData.getTargetBiomes(), (buf1, value) -> buf1.writeShortLE(value)); + buffer.writeFloatLE(replacementData.getAmount()); + buffer.writeFloatLE(replacementData.getNoiseFrequencyScale()); + buffer.writeIntLE(replacementData.getReplacementIndex()); + }); } - protected BiomeReplacementData readBiomeReplacementData(ByteBuf buffer, BedrockCodecHelper helper) { - int biome = buffer.readShortLE(); - int dimension = buffer.readShortLE(); - List targetBiomes = new ArrayList<>(); - helper.readArray(buffer, targetBiomes, (buf, aHelper) -> buf.readShortLE()); - float amount = buffer.readFloatLE(); - float noiseFrequencyScale = buffer.readFloatLE(); - int replacementIndex = buffer.readIntLE(); + protected List readBiomeReplacementsData(ByteBuf buffer, BedrockCodecHelper helper) { + List replacementsData = new ArrayList<>(); + helper.readArray(buffer, replacementsData, (buf, h) -> { + int biome = buf.readUnsignedShortLE(); + int dimension = buf.readUnsignedShortLE(); + List targetBiomes = new ArrayList<>(); + h.readArray(buf, targetBiomes, (buf2, aHelper) -> (short) buf2.readUnsignedShortLE()); + float amount = buf.readFloatLE(); + float noiseFrequencyScale = buf.readFloatLE(); + int replacementIndex = (int) buf.readUnsignedIntLE(); - return new BiomeReplacementData(biome, dimension, targetBiomes, amount, noiseFrequencyScale, replacementIndex); + return new BiomeReplacementData(biome, dimension, targetBiomes, amount, noiseFrequencyScale, replacementIndex); + }); + return replacementsData; } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v859/serializer/CameraInstructionSerializer_v859.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v859/serializer/CameraInstructionSerializer_v859.java index da2fbf1..0f56a3e 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v859/serializer/CameraInstructionSerializer_v859.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v859/serializer/CameraInstructionSerializer_v859.java @@ -1,13 +1,10 @@ package org.cloudburstmc.protocol.bedrock.codec.v859.serializer; import io.netty.buffer.ByteBuf; -import org.cloudburstmc.math.vector.Vector2f; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; import org.cloudburstmc.protocol.bedrock.codec.v827.serializer.CameraInstructionSerializer_v827; -import org.cloudburstmc.protocol.bedrock.data.camera.CameraAttachToEntityInstruction; -import org.cloudburstmc.protocol.bedrock.data.camera.CameraSplineInstruction; -import org.cloudburstmc.protocol.bedrock.data.camera.CameraSplineType; +import org.cloudburstmc.protocol.bedrock.data.camera.*; import org.cloudburstmc.protocol.bedrock.packet.CameraInstructionPacket; import org.cloudburstmc.protocol.common.util.OptionalBoolean; @@ -21,16 +18,7 @@ public class CameraInstructionSerializer_v859 extends CameraInstructionSerialize @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, CameraInstructionPacket packet) { super.serialize(buffer, helper, packet); - helper.writeOptionalNull(buffer, packet.getSplineInstruction(), (buf, splineInstruction) -> { - buf.writeFloatLE(splineInstruction.getTotalTime()); - buf.writeByte(splineInstruction.getType().ordinal()); - helper.writeArray(buf, splineInstruction.getCurve(), helper::writeVector3f); - helper.writeArray(buf, splineInstruction.getProgressKeyFrames(), helper::writeVector2f); - helper.writeArray(buf, splineInstruction.getRotationOption(), (buf2, rotationOption) -> { - helper.writeVector3f(buf2, rotationOption.getKeyFrameValues()); - buf2.writeFloatLE(rotationOption.getKeyFrameTimes()); - }); - }); + helper.writeOptionalNull(buffer, packet.getSplineInstruction(), (buf, splineInstruction) -> writeSplineInstruction(buf, helper, splineInstruction)); helper.writeOptionalNull(buffer, packet.getAttachInstruction(), (buf, attachInstruction) -> buf.writeLongLE(attachInstruction.getUniqueEntityId())); helper.writeOptional(buffer, OptionalBoolean::isPresent, packet.getDetachFromEntity(), (buf, optional) -> buf.writeBoolean(optional.getAsBoolean())); } @@ -38,22 +26,42 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, CameraInstructi @Override public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, CameraInstructionPacket packet) { super.deserialize(buffer, helper, packet); - packet.setSplineInstruction(helper.readOptional(buffer, null, buf -> { - float totalTime = buf.readFloatLE(); - CameraSplineType type = CameraSplineType.values()[buf.readUnsignedByte()]; - List curve = new ArrayList<>(); - helper.readArray(buf, curve, helper::readVector3f); - List progressKeyFrames = new ArrayList<>(); - helper.readArray(buf, progressKeyFrames, helper::readVector2f); - List rotationOption = new ArrayList<>(); - helper.readArray(buf, rotationOption, buf2 -> { - Vector3f keyFrameValues = helper.readVector3f(buf2); - float keyFrameTimes = buf2.readFloatLE(); - return new CameraSplineInstruction.SplineRotationOption(keyFrameValues, keyFrameTimes); - }); - return new CameraSplineInstruction(totalTime, type, curve, progressKeyFrames, rotationOption); - })); + packet.setSplineInstruction(helper.readOptional(buffer, null, buf -> readSplineInstruction(buf, helper))); packet.setAttachInstruction(helper.readOptional(buffer, null, buf -> new CameraAttachToEntityInstruction(buf.readLongLE()))); packet.setDetachFromEntity(helper.readOptional(buffer, OptionalBoolean.empty(), buf -> OptionalBoolean.of(buf.readBoolean()))); } + + protected void writeSplineInstruction(ByteBuf buffer, BedrockCodecHelper helper, CameraSplineInstruction splineInstruction) { + buffer.writeFloatLE(splineInstruction.getTotalTime()); + buffer.writeByte(splineInstruction.getType().ordinal()); + helper.writeArray(buffer, splineInstruction.getCurve(), helper::writeVector3f); + helper.writeArray(buffer, splineInstruction.getProgressKeyFrames(), (buf2, frame) -> { + buf2.writeFloatLE(frame.getValue()); + buf2.writeFloatLE(frame.getTime()); + }); + helper.writeArray(buffer, splineInstruction.getRotationOption(), (buf2, rotationOption) -> { + helper.writeVector3f(buf2, rotationOption.getKeyFrameValues()); + buf2.writeFloatLE(rotationOption.getKeyFrameTimes()); + }); + } + + protected CameraSplineInstruction readSplineInstruction(ByteBuf buffer, BedrockCodecHelper helper) { + float totalTime = buffer.readFloatLE(); + CameraSplineType type = CameraSplineType.values()[buffer.readUnsignedByte()]; + List curve = new ArrayList<>(); + helper.readArray(buffer, curve, helper::readVector3f); + List progressKeyFrames = new ArrayList<>(); + helper.readArray(buffer, progressKeyFrames, buf2 -> { + float value = buf2.readFloatLE(); + float time = buf2.readFloatLE(); + return new CameraSplineInstruction.SplineProgressOption(value, time, CameraEase.LINEAR); + }); + List rotationOption = new ArrayList<>(); + helper.readArray(buffer, rotationOption, buf2 -> { + Vector3f keyFrameValues = helper.readVector3f(buf2); + float keyFrameTimes = buf2.readFloatLE(); + return new CameraSplineInstruction.SplineRotationOption(keyFrameValues, keyFrameTimes, CameraEase.LINEAR); + }); + return new CameraSplineInstruction(totalTime, type, curve, progressKeyFrames, rotationOption); + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v859/serializer/DebugDrawerSerializer_v859.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v859/serializer/DebugDrawerSerializer_v859.java index b2a3e81..74623fc 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v859/serializer/DebugDrawerSerializer_v859.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v859/serializer/DebugDrawerSerializer_v859.java @@ -31,12 +31,15 @@ protected int toPayloadType(DebugShape.Type type) { @Override protected void writeShape(ByteBuf buffer, BedrockCodecHelper helper, DebugShape shape) { - VarInts.writeUnsignedLong(buffer, shape.getId()); writeCommonShapeData(buffer, helper, shape); - VarInts.writeInt(buffer, shape.getDimension()); - VarInts.writeUnsignedInt(buffer, toPayloadType(shape.getType())); - switch (shape.getType()) { + DebugShape.Type type = shape.getType(); + VarInts.writeUnsignedInt(buffer, toPayloadType(type)); + if (type == null) { + return; + } + + switch (type) { case ARROW: DebugArrow arrow = (DebugArrow) shape; helper.writeOptionalNull(buffer, arrow.getArrowEndPosition(), WRITE_VECTOR3F); @@ -67,6 +70,13 @@ protected void writeShape(ByteBuf buffer, BedrockCodecHelper helper, DebugShape } } + @Override + protected void writeCommonShapeData(ByteBuf buffer, BedrockCodecHelper helper, DebugShape shape) { + super.writeCommonShapeData(buffer, helper, shape); + + VarInts.writeInt(buffer, shape.getDimension()); + } + @Override protected DebugShape readShape(ByteBuf buffer, BedrockCodecHelper helper) { long id = VarInts.readUnsignedLong(buffer); @@ -113,4 +123,4 @@ protected DebugShape readShape(ByteBuf buffer, BedrockCodecHelper helper) { throw new IllegalStateException("Unknown debug shape type"); } } -} \ No newline at end of file +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v859/serializer/GraphicsParameterOverrideSerializer_v859.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v859/serializer/GraphicsParameterOverrideSerializer_v859.java index bdfdaca..2d0f66b 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v859/serializer/GraphicsParameterOverrideSerializer_v859.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v859/serializer/GraphicsParameterOverrideSerializer_v859.java @@ -10,7 +10,7 @@ import org.cloudburstmc.protocol.bedrock.packet.GraphicsParameterOverridePacket; import org.cloudburstmc.protocol.common.util.VarInts; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; @NoArgsConstructor(access = AccessLevel.PROTECTED) @@ -31,7 +31,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, GraphicsParamet @Override public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, GraphicsParameterOverridePacket packet) { - Map values = new HashMap<>(); + Map values = new LinkedHashMap<>(); int length = VarInts.readUnsignedInt(buffer); for (int i = 0; i < length; i++) { float key = buffer.readFloatLE(); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v860/Bedrock_v860.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v860/Bedrock_v860.java index 9862e72..6e4bc00 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v860/Bedrock_v860.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v860/Bedrock_v860.java @@ -6,7 +6,6 @@ public class Bedrock_v860 extends Bedrock_v859 { public static final BedrockCodec CODEC = Bedrock_v859.CODEC.toBuilder() - .raknetProtocolVersion(11) .protocolVersion(860) .minecraftVersion("1.21.124") .build(); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/Bedrock_v898.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/Bedrock_v898.java index 33eebf7..06439d3 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/Bedrock_v898.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/Bedrock_v898.java @@ -51,6 +51,7 @@ public class Bedrock_v898 extends Bedrock_v860 { .updateSerializer(ResourcePackStackPacket.class, ResourcePackStackSerializer_v898.INSTANCE) .updateSerializer(StartGamePacket.class, StartGameSerializer_v898.INSTANCE) .updateSerializer(TextPacket.class, TextSerializer_v898.INSTANCE) + .registerPacket(ClientboundDataStorePacket::new, ClientboundDataStoreSerializer_v898.INSTANCE, 330, PacketRecipient.CLIENT) .registerPacket(ServerboundDataStorePacket::new, ServerboundDataStoreSerializer_v898.INSTANCE, 332, PacketRecipient.SERVER) .build(); } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/AvailableCommandsSerializer_v898.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/AvailableCommandsSerializer_v898.java index d261e06..802e04f 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/AvailableCommandsSerializer_v898.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/AvailableCommandsSerializer_v898.java @@ -38,7 +38,7 @@ protected void writeCommand(ByteBuf buffer, BedrockCodecHelper helper, CommandDa helper.writeArray(buffer, commandData.getSubcommands(), (buf, subcommand) -> { int index = subCommands.indexOf(subcommand); checkArgument(index > -1, "Invalid subcommand index: " + subcommand); - buf.writeShortLE(index); + buf.writeIntLE(index); }); CommandOverloadData[] overloads = commandData.getOverloads(); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/ClientboundDataStoreSerializer_v898.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/ClientboundDataStoreSerializer_v898.java new file mode 100644 index 0000000..a7d39f4 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/ClientboundDataStoreSerializer_v898.java @@ -0,0 +1,167 @@ +package org.cloudburstmc.protocol.bedrock.codec.v898.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.data.datastore.DataStoreChange; +import org.cloudburstmc.protocol.bedrock.data.datastore.DataStoreRemoval; +import org.cloudburstmc.protocol.bedrock.data.datastore.DataStoreUpdate; +import org.cloudburstmc.protocol.bedrock.packet.ClientboundDataStorePacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +import java.util.LinkedHashMap; +import java.util.Map; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class ClientboundDataStoreSerializer_v898 implements BedrockPacketSerializer { + + public static final ClientboundDataStoreSerializer_v898 INSTANCE = new ClientboundDataStoreSerializer_v898(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDataStorePacket packet) { + helper.writeArray(buffer, packet.getUpdates(), (buf, action) -> { + VarInts.writeUnsignedInt(buffer, action.getType()); + + switch (action.getType()) { + case 0: + helper.writeString(buffer, ((DataStoreUpdate) action).getDataStoreName()); + helper.writeString(buffer, ((DataStoreUpdate) action).getProperty()); + helper.writeString(buffer, ((DataStoreUpdate) action).getPath()); + + Object value = ((DataStoreUpdate) action).getData(); + + int type = value instanceof Number ? 0 : value instanceof Boolean ? 1 : value instanceof String ? 2 : -1; + + VarInts.writeUnsignedInt(buffer, type); + + switch (type) { + case 0: + buffer.writeDoubleLE(((Number) value).doubleValue()); + break; + case 1: + buffer.writeBoolean((boolean) value); + break; + case 2: + helper.writeString(buffer, (String) value); + break; + default: + throw new IllegalStateException("Invalid data store data type " + type); + } + + buffer.writeIntLE(((DataStoreUpdate) action).getUpdateCount()); + break; + case 1: + helper.writeString(buffer, ((DataStoreChange) action).getDataStoreName()); + helper.writeString(buffer, ((DataStoreChange) action).getProperty()); + buffer.writeIntLE(((DataStoreChange) action).getUpdateCount()); + writeDataStoreChange(buffer, helper, ((DataStoreChange) action).getNewValue()); + break; + case 2: + helper.writeString(buf, ((DataStoreRemoval) action).getDataStoreName()); + break; + default: + throw new UnsupportedOperationException("Unknown data store action"); + } + }); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDataStorePacket packet) { + helper.readArray(buffer, packet.getUpdates(), (buf -> { + switch (VarInts.readUnsignedInt(buffer)) { + case 0: + DataStoreUpdate update = new DataStoreUpdate(); + update.setDataStoreName(helper.readString(buffer)); + update.setProperty(helper.readString(buffer)); + update.setPath(helper.readString(buffer)); + + int type = VarInts.readUnsignedInt(buffer); + + switch (type) { + case 0: + update.setData(buffer.readDoubleLE()); + break; + case 1: + update.setData(buffer.readBoolean()); + break; + case 2: + update.setData(helper.readString(buffer)); + break; + default: + throw new IllegalStateException("Invalid data store data type: " + type); + } + + update.setUpdateCount((int) buffer.readUnsignedIntLE()); + return update; + case 1: + DataStoreChange change = new DataStoreChange(); + change.setDataStoreName(helper.readString(buf)); + change.setProperty(helper.readString(buffer)); + change.setUpdateCount((int) buffer.readUnsignedIntLE()); + change.setNewValue(readDataStoreChange(buffer, helper)); + return change; + case 2: + DataStoreRemoval removal = new DataStoreRemoval(); + removal.setDataStoreName(helper.readString(buf)); + return removal; + default: + throw new UnsupportedOperationException("Unknown data store action"); + } + })); + } + + protected void writeDataStoreChange(ByteBuf buffer, BedrockCodecHelper helper, Object value) { + int type = value instanceof Boolean ? 1 : value instanceof Number ? 2 : value instanceof String ? 4 : value instanceof Map ? 6 : 0; + + buffer.writeIntLE(type); + + switch (type) { + case 0: + break; + case 1: + buffer.writeBoolean((boolean) value); + break; + case 2: + buffer.writeLongLE(((Number) value).longValue()); + break; + case 4: + helper.writeString(buffer, (String) value); + break; + case 6: + VarInts.writeUnsignedInt(buffer, ((Map) value).size()); + ((Map) value).forEach((k, v) -> { + helper.writeString(buffer, (String) k); + writeDataStoreChange(buffer, helper, v); + }); + break; + default: + throw new IllegalStateException("Invalid data store change data type " + type); + } + } + + protected Object readDataStoreChange(ByteBuf buffer, BedrockCodecHelper helper) { + int type = buffer.readIntLE(); + + switch (type) { + case 0: + return null; + case 1: + return buffer.readBoolean(); + case 2: + return buffer.readLongLE(); + case 4: + return helper.readString(buffer); + case 6: + int size = VarInts.readUnsignedInt(buffer); + Map values = new LinkedHashMap<>(); + for (int i = 0; i < size; i++) { + values.put(helper.readString(buffer), readDataStoreChange(buffer, helper)); + } + return values; + default: + throw new IllegalStateException("Invalid data store change data type " + type); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/EventSerializer_v898.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/EventSerializer_v898.java index 8184b4d..089e41f 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/EventSerializer_v898.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/EventSerializer_v898.java @@ -26,6 +26,9 @@ public EventSerializer_v898() { public void serialize(ByteBuf buffer, BedrockCodecHelper helper, EventPacket packet) { VarInts.writeLong(buffer, packet.getUniqueEntityId()); EventData eventData = packet.getEventData(); + if (eventData.getPayloadType() == -1) { + throw new UnsupportedOperationException("Deprecated event type " + eventData.getType()); + } VarInts.writeInt(buffer, eventData.getType().ordinal()); buffer.writeBoolean(packet.isUsePlayerId()); @@ -35,7 +38,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, EventPacket pac throw new UnsupportedOperationException("Unknown event type " + eventData.getType()); } - VarInts.writeUnsignedInt(buffer, eventData.getType().ordinal()); + VarInts.writeUnsignedInt(buffer, eventData.getPayloadType()); function.accept(buffer, helper, eventData); } @@ -50,7 +53,7 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, EventPacket p packet.setUsePlayerId(buffer.readBoolean()); - VarInts.readUnsignedInt(buffer); + VarInts.readUnsignedInt(buffer); //oneOf BiFunction function = this.readers.get(type); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/ServerboundDataStoreSerializer_v898.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/ServerboundDataStoreSerializer_v898.java index 579965c..7096d48 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/ServerboundDataStoreSerializer_v898.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/ServerboundDataStoreSerializer_v898.java @@ -15,19 +15,19 @@ public class ServerboundDataStoreSerializer_v898 implements BedrockPacketSeriali @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ServerboundDataStorePacket packet) { - helper.writeString(buffer, packet.getDataStoreName()); - helper.writeString(buffer, packet.getProperty()); - helper.writeString(buffer, packet.getPath()); + helper.writeString(buffer, packet.getUpdate().getDataStoreName()); + helper.writeString(buffer, packet.getUpdate().getProperty()); + helper.writeString(buffer, packet.getUpdate().getPath()); - Object value = packet.getData(); + Object value = packet.getUpdate().getData(); - int type = value instanceof Double ? 0 : value instanceof Boolean ? 1 : value instanceof String ? 2 : -1; + int type = value instanceof Number ? 0 : value instanceof Boolean ? 1 : value instanceof String ? 2 : -1; VarInts.writeUnsignedInt(buffer, type); switch (type) { case 0: - buffer.writeDoubleLE((double) value); + buffer.writeDoubleLE(((Number) value).doubleValue()); break; case 1: buffer.writeBoolean((boolean) value); @@ -39,32 +39,31 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ServerboundData throw new IllegalStateException("Invalid data store data type"); } - buffer.writeIntLE(packet.getUpdateCount()); + buffer.writeIntLE(packet.getUpdate().getUpdateCount()); } @Override public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ServerboundDataStorePacket packet) { - packet.setDataStoreName(helper.readString(buffer)); - packet.setProperty(helper.readString(buffer)); - packet.setPath(helper.readString(buffer)); + packet.getUpdate().setDataStoreName(helper.readString(buffer)); + packet.getUpdate().setProperty(helper.readString(buffer)); + packet.getUpdate().setPath(helper.readString(buffer)); int type = VarInts.readUnsignedInt(buffer); switch (type) { case 0: - packet.setData(buffer.readDoubleLE()); + packet.getUpdate().setData(buffer.readDoubleLE()); break; case 1: - packet.setData(buffer.readBoolean()); + packet.getUpdate().setData(buffer.readBoolean()); break; case 2: - packet.setData(helper.readString(buffer)); + packet.getUpdate().setData(helper.readString(buffer)); break; default: throw new IllegalStateException("Invalid data store data type: " + type); } - packet.setUpdateCount((int) buffer.readUnsignedIntLE()); + packet.getUpdate().setUpdateCount((int) buffer.readUnsignedIntLE()); } } - diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/TextSerializer_v898.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/TextSerializer_v898.java index 4421305..462c499 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/TextSerializer_v898.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v898/serializer/TextSerializer_v898.java @@ -7,10 +7,13 @@ import org.cloudburstmc.protocol.bedrock.codec.v685.serializer.TextSerializer_v685; import org.cloudburstmc.protocol.bedrock.packet.TextPacket; import org.cloudburstmc.protocol.common.util.TextConverter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class TextSerializer_v898 extends TextSerializer_v685 { public static final TextSerializer_v898 INSTANCE = new TextSerializer_v898(); + private static final Logger log = LoggerFactory.getLogger(TextSerializer_v898.class); @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket packet) { @@ -20,6 +23,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket pack Boolean needsTranslation = converter.needsTranslation(message); buffer.writeBoolean(needsTranslation != null ? needsTranslation : packet.isNeedsTranslation()); + String text; switch (type) { case RAW: @@ -33,7 +37,14 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket pack helper.writeString(buffer, "textObjectAnnouncement"); helper.writeString(buffer, "textObject"); buffer.writeByte(type.ordinal()); - helper.writeString(buffer, converter.serialize(message)); + text = converter.serialize(message); + if (text.isEmpty()) { + text = " "; + if (log.isDebugEnabled()) { + log.debug("TextPacket of " + type + " with empty message"); + } + } + helper.writeString(buffer, text); break; case JSON: case WHISPER_JSON: @@ -46,7 +57,14 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket pack helper.writeString(buffer, "textObjectAnnouncement"); helper.writeString(buffer, "textObject"); buffer.writeByte(type.ordinal()); - helper.writeString(buffer, converter.serializeJson(message)); + text = converter.serializeJson(message); + if (text.isEmpty()) { + text = " "; + if (log.isDebugEnabled()) { + log.debug("TextPacket of " + type + " with empty message"); + } + } + helper.writeString(buffer, text); break; case CHAT: case WHISPER: @@ -57,7 +75,14 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket pack helper.writeString(buffer, "announcement"); buffer.writeByte(type.ordinal()); helper.writeString(buffer, packet.getSourceName()); - helper.writeString(buffer, converter.serialize(message)); + text = converter.serialize(message); + if (text.isEmpty()) { + text = " "; + if (log.isDebugEnabled()) { + log.debug("TextPacket of " + type + " with empty message"); + } + } + helper.writeString(buffer, text); break; case TRANSLATION: case POPUP: @@ -67,7 +92,13 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket pack helper.writeString(buffer, "popup"); helper.writeString(buffer, "jukeboxPopup"); buffer.writeByte(type.ordinal()); - String text = converter.serializeWithArguments(message, packet.getParameters()); + text = converter.serializeWithArguments(message, packet.getParameters()); + if (text.isEmpty()) { + text = " "; + if (log.isDebugEnabled()) { + log.debug("TextPacket of " + type + " with empty message"); + } + } helper.writeString(buffer, text); helper.writeArray(buffer, packet.getParameters(), helper::writeString); break; @@ -85,6 +116,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket pack public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket packet) { TextConverter converter = helper.getTextConverter(); boolean needsTranslation = buffer.readBoolean(); + packet.setNeedsTranslation(needsTranslation); switch (buffer.readByte()) { case 0: // MessageOnly diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/Bedrock_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/Bedrock_v924.java new file mode 100644 index 0000000..bfdc09d --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/Bedrock_v924.java @@ -0,0 +1,77 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924; + +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; +import org.cloudburstmc.protocol.bedrock.codec.EntityDataTypeMap; +import org.cloudburstmc.protocol.bedrock.codec.v786.serializer.LevelSoundEventSerializer_v786; +import org.cloudburstmc.protocol.bedrock.codec.v898.BedrockCodecHelper_v898; +import org.cloudburstmc.protocol.bedrock.codec.v898.Bedrock_v898; +import org.cloudburstmc.protocol.bedrock.codec.v924.serializer.*; +import org.cloudburstmc.protocol.bedrock.data.PacketRecipient; +import org.cloudburstmc.protocol.bedrock.data.SoundEvent; +import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataFormat; +import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; +import org.cloudburstmc.protocol.bedrock.packet.*; +import org.cloudburstmc.protocol.common.util.TypeMap; + +public class Bedrock_v924 extends Bedrock_v898 { + + protected static final EntityDataTypeMap ENTITY_DATA = Bedrock_v898.ENTITY_DATA + .toBuilder() + .insert(EntityDataTypes.ARROW_SHOOTER_ID, 17, EntityDataFormat.LONG) + .insert(EntityDataTypes.FIREWORK_DIRECTION, 17, EntityDataFormat.VECTOR3F) + .insert(EntityDataTypes.FIREWORK_SHOOTER_ID, 18, EntityDataFormat.LONG) + .insert(EntityDataTypes.AIM_ASSIST_PRIORITY_PRESET_ID, 136, EntityDataFormat.INT) + .insert(EntityDataTypes.AIM_ASSIST_PRIORITY_CATEGORY_ID, 137, EntityDataFormat.INT) + .insert(EntityDataTypes.AIM_ASSIST_PRIORITY_ACTOR_ID, 138, EntityDataFormat.INT) + .build(); + + protected static final TypeMap SOUND_EVENTS = Bedrock_v898.SOUND_EVENTS + .toBuilder() + .replace(578, SoundEvent.SADDLE_IN_WATER) + .insert(579, SoundEvent.STONE_SPEAR_ATTACK_HIT) + .insert(580, SoundEvent.IRON_SPEAR_ATTACK_HIT) + .insert(581, SoundEvent.COPPER_SPEAR_ATTACK_HIT) + .insert(582, SoundEvent.GOLDEN_SPEAR_ATTACK_HIT) + .insert(583, SoundEvent.DIAMOND_SPEAR_ATTACK_HIT) + .insert(584, SoundEvent.NETHERITE_SPEAR_ATTACK_HIT) + .insert(585, SoundEvent.STONE_SPEAR_ATTACK_MISS) + .insert(586, SoundEvent.IRON_SPEAR_ATTACK_MISS) + .insert(587, SoundEvent.COPPER_SPEAR_ATTACK_MISS) + .insert(588, SoundEvent.GOLDEN_SPEAR_ATTACK_MISS) + .insert(589, SoundEvent.DIAMOND_SPEAR_ATTACK_MISS) + .insert(590, SoundEvent.NETHERITE_SPEAR_ATTACK_MISS) + .insert(591, SoundEvent.STONE_SPEAR_USE) + .insert(592, SoundEvent.IRON_SPEAR_USE) + .insert(593, SoundEvent.COPPER_SPEAR_USE) + .insert(594, SoundEvent.GOLDEN_SPEAR_USE) + .insert(595, SoundEvent.DIAMOND_SPEAR_USE) + .insert(596, SoundEvent.NETHERITE_SPEAR_USE) + .insert(597, SoundEvent.UNDEFINED) + + .build(); + + public static final BedrockCodec CODEC = Bedrock_v898.CODEC.toBuilder() + .protocolVersion(924) + .minecraftVersion("1.26.0") + .helper(() -> new BedrockCodecHelper_v898(ENTITY_DATA, GAME_RULE_TYPES, ITEM_STACK_REQUEST_TYPES, CONTAINER_SLOT_TYPES, PLAYER_ABILITIES, TEXT_PROCESSING_ORIGINS)) + .updateSerializer(BiomeDefinitionListPacket.class, BiomeDefinitionListSerializer_v924.INSTANCE) + .updateSerializer(BookEditPacket.class, BookEditSerializer_v924.INSTANCE) + .updateSerializer(CameraAimAssistPresetsPacket.class, CameraAimAssistPresetsSerializer_v924.INSTANCE) + .updateSerializer(CameraInstructionPacket.class, CameraInstructionSerializer_v924.INSTANCE) + .updateSerializer(ClientboundDataStorePacket.class, ClientboundDataStoreSerializer_v924.INSTANCE) + .updateSerializer(DebugDrawerPacket.class, DebugDrawerSerializer_v924.INSTANCE) + .updateSerializer(GraphicsParameterOverridePacket.class, GraphicsParameterOverrideSerializer_v924.INSTANCE) + .updateSerializer(LevelSoundEventPacket.class, new LevelSoundEventSerializer_v786(SOUND_EVENTS)) + .updateSerializer(ServerboundDataStorePacket.class, ServerboundDataStoreSerializer_v924.INSTANCE) + .updateSerializer(ServerboundDiagnosticsPacket.class, ServerboundDiagnosticsSerializer_v924.INSTANCE) + .updateSerializer(StartGamePacket.class, StartGameSerializer_v924.INSTANCE) + .updateSerializer(TextPacket.class, TextSerializer_v924.INSTANCE) + .registerPacket(ClientboundDataDrivenUIShowScreenPacket::new, ClientboundDataDrivenUIShowScreenSerializer_v924.INSTANCE, 333, PacketRecipient.CLIENT) + .registerPacket(ClientboundDataDrivenUICloseScreenPacket::new, ClientboundDataDrivenUICloseScreenSerializer_v924.INSTANCE, 334, PacketRecipient.CLIENT) + .registerPacket(ClientboundDataDrivenUIReloadPacket::new, ClientboundDataDrivenUIReloadSerializer_v924.INSTANCE, 335, PacketRecipient.CLIENT) + .registerPacket(ClientboundTextureShiftPacket::new, ClientboundTextureShiftSerializer_v924.INSTANCE, 336, PacketRecipient.CLIENT) + .registerPacket(VoxelShapesPacket::new, VoxelShapesSerializer_v924.INSTANCE, 337, PacketRecipient.CLIENT) + .registerPacket(CameraSplinePacket::new, CameraSplineSerializer_v924.INSTANCE, 338, PacketRecipient.CLIENT) + .registerPacket(CameraAimAssistActorPriorityPacket::new, CameraAimAssistActorPrioritySerializer_v924.INSTANCE, 339, PacketRecipient.CLIENT) + .build(); +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/BiomeDefinitionListSerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/BiomeDefinitionListSerializer_v924.java new file mode 100644 index 0000000..9d1766e --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/BiomeDefinitionListSerializer_v924.java @@ -0,0 +1,54 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v859.serializer.BiomeDefinitionListSerializer_v859; +import org.cloudburstmc.protocol.bedrock.data.VillageType; +import org.cloudburstmc.protocol.bedrock.data.biome.*; +import org.cloudburstmc.protocol.common.util.SequencedHashSet; + +import java.util.List; + +public class BiomeDefinitionListSerializer_v924 extends BiomeDefinitionListSerializer_v859 { + + public static final BiomeDefinitionListSerializer_v924 INSTANCE = new BiomeDefinitionListSerializer_v924(); + + @Override + protected void writeDefinitionChunkGen(ByteBuf buffer, BedrockCodecHelper helper, BiomeDefinitionChunkGenData definitionChunkGen, + SequencedHashSet strings) { + super.writeDefinitionChunkGen(buffer, helper, definitionChunkGen, strings); + helper.writeOptionalNull(buffer, definitionChunkGen.getVillageType(), (b, n) -> b.writeByte(n.ordinal())); + } + + @Override + protected BiomeDefinitionChunkGenData readDefinitionChunkGen(ByteBuf buffer, BedrockCodecHelper helper, List strings) { + BiomeClimateData climate = helper.readOptional(buffer, null, this::readClimate); + List consolidatedFeatures = helper.readOptional(buffer, null, + (buf, aHelper) -> this.readConsolidatedFeatures(buf, aHelper, strings)); + BiomeMountainParamsData mountainParams = helper.readOptional(buffer, null, this::readMountainParamsData); + BiomeSurfaceMaterialAdjustmentData surfaceMaterialAdjustment = helper.readOptional(buffer, null, + (buf, aHelper) -> this.readSurfaceMaterialAdjustment(buf, aHelper, strings)); + BiomeSurfaceMaterialData surfaceMaterial = helper.readOptional(buffer, null, this::readSurfaceMaterial); + boolean hasDefaultOverworldSurface = buffer.readBoolean(); + boolean hasSwampSurface = buffer.readBoolean(); + boolean hasFrozenOceanSurface = buffer.readBoolean(); + boolean hasTheEndSurface = buffer.readBoolean(); + BiomeMesaSurfaceData mesaSurface = helper.readOptional(buffer, null, this::readMesaSurface); + BiomeCappedSurfaceData cappedSurface = helper.readOptional(buffer, null, this::readCappedSurface); + BiomeOverworldGenRulesData overworldGenRules = helper.readOptional(buffer, null, + (buf, aHelper) -> this.readOverworldGenRules(buf, aHelper, strings)); + BiomeMultinoiseGenRulesData multinoiseGenRules = helper.readOptional(buffer, null, this::readMultinoiseGenRules); + BiomeLegacyWorldGenRulesData legacyWorldGenRules = helper.readOptional(buffer, null, + (buf, aHelper) -> this.readLegacyWorldGenRules(buf, aHelper, strings)); + List replacementsData = helper.readOptional(buffer, null, this::readBiomeReplacementsData); + VillageType villageType = helper.readOptional(buffer, null, buf -> VillageType.values()[buf.readUnsignedByte()]); + + return new BiomeDefinitionChunkGenData(climate, consolidatedFeatures, + mountainParams, surfaceMaterialAdjustment, + surfaceMaterial, hasDefaultOverworldSurface, hasSwampSurface, + hasFrozenOceanSurface, hasTheEndSurface, + mesaSurface, cappedSurface, + overworldGenRules, multinoiseGenRules, + legacyWorldGenRules, replacementsData, villageType, null, null); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/BookEditSerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/BookEditSerializer_v924.java new file mode 100644 index 0000000..f5766cc --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/BookEditSerializer_v924.java @@ -0,0 +1,69 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.BookEditSerializer_v291; +import org.cloudburstmc.protocol.bedrock.packet.BookEditPacket; +import org.cloudburstmc.protocol.common.util.TextConverter; +import org.cloudburstmc.protocol.common.util.VarInts; + +public class BookEditSerializer_v924 extends BookEditSerializer_v291 { + + public static final BookEditSerializer_v924 INSTANCE = new BookEditSerializer_v924(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, BookEditPacket packet) { + VarInts.writeInt(buffer, packet.getInventorySlot()); + VarInts.writeUnsignedInt(buffer, packet.getAction().ordinal()); + + TextConverter converter = helper.getTextConverter(); + switch (packet.getAction()) { + case REPLACE_PAGE: + case ADD_PAGE: + VarInts.writeInt(buffer, packet.getPageNumber()); + helper.writeString(buffer, converter.serialize(packet.getText(CharSequence.class))); + helper.writeString(buffer, packet.getPhotoName()); + break; + case DELETE_PAGE: + VarInts.writeInt(buffer, packet.getPageNumber()); + break; + case SWAP_PAGES: + VarInts.writeInt(buffer, packet.getPageNumber()); + VarInts.writeInt(buffer, packet.getSecondaryPageNumber()); + break; + case SIGN_BOOK: + helper.writeString(buffer, converter.serialize(packet.getTitle(CharSequence.class))); + helper.writeString(buffer, converter.serialize(packet.getAuthor(CharSequence.class))); + helper.writeString(buffer, packet.getXuid()); + break; + } + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, BookEditPacket packet) { + packet.setInventorySlot(VarInts.readInt(buffer)); + packet.setAction(types.get(VarInts.readUnsignedInt(buffer))); + + TextConverter converter = helper.getTextConverter(); + switch (packet.getAction()) { + case REPLACE_PAGE: + case ADD_PAGE: + packet.setPageNumber(VarInts.readInt(buffer)); + packet.setText(converter.deserialize(helper.readString(buffer))); + packet.setPhotoName(helper.readString(buffer)); + break; + case DELETE_PAGE: + packet.setPageNumber(VarInts.readInt(buffer)); + break; + case SWAP_PAGES: + packet.setPageNumber(VarInts.readInt(buffer)); + packet.setSecondaryPageNumber(VarInts.readInt(buffer)); + break; + case SIGN_BOOK: + packet.setTitle(converter.deserialize(helper.readString(buffer))); + packet.setAuthor(converter.deserialize(helper.readString(buffer))); + packet.setXuid(helper.readString(buffer)); + break; + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/CameraAimAssistActorPrioritySerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/CameraAimAssistActorPrioritySerializer_v924.java new file mode 100644 index 0000000..544ab54 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/CameraAimAssistActorPrioritySerializer_v924.java @@ -0,0 +1,36 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.data.camera.AimAssistActorPriorityData; +import org.cloudburstmc.protocol.bedrock.packet.CameraAimAssistActorPriorityPacket; + +import java.util.ArrayList; +import java.util.List; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class CameraAimAssistActorPrioritySerializer_v924 implements BedrockPacketSerializer { + + public static final CameraAimAssistActorPrioritySerializer_v924 INSTANCE = new CameraAimAssistActorPrioritySerializer_v924(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, CameraAimAssistActorPriorityPacket packet) { + helper.writeArray(buffer, packet.getPriorityData(), (buf, value) -> { + buf.writeIntLE(value.getPresetIndex()); + buf.writeIntLE(value.getCategoryIndex()); + buf.writeIntLE(value.getActorIndex()); + buf.writeIntLE(value.getPriorityValue()); + }); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, CameraAimAssistActorPriorityPacket packet) { + List priorityData = new ArrayList<>(); + helper.readArray(buffer, priorityData, (buf, h) -> + new AimAssistActorPriorityData(buf.readIntLE(), buf.readIntLE(), buf.readIntLE(), buf.readIntLE())); + packet.setPriorityData(priorityData); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/CameraAimAssistPresetsSerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/CameraAimAssistPresetsSerializer_v924.java new file mode 100644 index 0000000..7fa7936 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/CameraAimAssistPresetsSerializer_v924.java @@ -0,0 +1,68 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v800.serializer.CameraAimAssistPresetsSerializer_v800; +import org.cloudburstmc.protocol.bedrock.data.camera.CameraAimAssistCategory; +import org.cloudburstmc.protocol.bedrock.data.camera.CameraAimAssistPresetDefinition; + +public class CameraAimAssistPresetsSerializer_v924 extends CameraAimAssistPresetsSerializer_v800 { + + public static final CameraAimAssistPresetsSerializer_v924 INSTANCE = new CameraAimAssistPresetsSerializer_v924(); + + @Override + protected void writeCategory(ByteBuf buffer, BedrockCodecHelper helper, CameraAimAssistCategory category) { + helper.writeString(buffer, category.getName()); + + helper.writeArray(buffer, category.getEntityPriorities(), this::writePriority); + helper.writeArray(buffer, category.getBlockPriorities(), this::writePriority); + helper.writeArray(buffer, category.getBlockTagPriorities(), this::writePriority); + helper.writeArray(buffer, category.getEntityTypeFamiliesPriorities(), this::writePriority); + + helper.writeOptionalNull(buffer, category.getEntityDefaultPriorities(), ByteBuf::writeIntLE); + helper.writeOptionalNull(buffer, category.getBlockDefaultPriorities(), ByteBuf::writeIntLE); + } + + @Override + protected CameraAimAssistCategory readCategory(ByteBuf buffer, BedrockCodecHelper helper) { + CameraAimAssistCategory category = new CameraAimAssistCategory(); + category.setName(helper.readString(buffer)); + + helper.readArray(buffer, category.getEntityPriorities(), this::readPriority); + helper.readArray(buffer, category.getBlockPriorities(), this::readPriority); + helper.readArray(buffer, category.getBlockTagPriorities(), this::readPriority); + helper.readArray(buffer, category.getEntityTypeFamiliesPriorities(), this::readPriority); + + category.setEntityDefaultPriorities(helper.readOptional(buffer, null, ByteBuf::readIntLE)); + category.setBlockDefaultPriorities(helper.readOptional(buffer, null, ByteBuf::readIntLE)); + return category; + } + + @Override + protected void writePreset(ByteBuf buffer, BedrockCodecHelper helper, CameraAimAssistPresetDefinition preset) { + helper.writeString(buffer, preset.getIdentifier()); + helper.writeArray(buffer, preset.getBlockExclusionList(), helper::writeString); + helper.writeArray(buffer, preset.getEntityExclusionList(), helper::writeString); + helper.writeArray(buffer, preset.getBlockTagExclusionList(), helper::writeString); + helper.writeArray(buffer, preset.getEntityTypeFamiliesExclusionList(), helper::writeString); + helper.writeArray(buffer, preset.getLiquidTargetingList(), helper::writeString); + helper.writeArray(buffer, preset.getItemSettings(), this::writeItemSetting); + helper.writeOptionalNull(buffer, preset.getDefaultItemSettings(), helper::writeString); + helper.writeOptionalNull(buffer, preset.getHandSettings(), helper::writeString); + } + + @Override + protected CameraAimAssistPresetDefinition readPreset(ByteBuf buffer, BedrockCodecHelper helper) { + final CameraAimAssistPresetDefinition preset = new CameraAimAssistPresetDefinition(); + preset.setIdentifier(helper.readString(buffer)); + helper.readArray(buffer, preset.getBlockExclusionList(), helper::readString); + helper.readArray(buffer, preset.getEntityExclusionList(), helper::readString); + helper.readArray(buffer, preset.getBlockTagExclusionList(), helper::readString); + helper.readArray(buffer, preset.getEntityTypeFamiliesExclusionList(), helper::readString); + helper.readArray(buffer, preset.getLiquidTargetingList(), helper::readString); + helper.readArray(buffer, preset.getItemSettings(), this::readItemSetting); + preset.setDefaultItemSettings(helper.readOptional(buffer, null, helper::readString)); + preset.setHandSettings(helper.readOptional(buffer, null, helper::readString)); + return preset; + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/CameraInstructionSerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/CameraInstructionSerializer_v924.java new file mode 100644 index 0000000..aff18cd --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/CameraInstructionSerializer_v924.java @@ -0,0 +1,59 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.math.vector.Vector3f; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v859.serializer.CameraInstructionSerializer_v859; +import org.cloudburstmc.protocol.bedrock.data.camera.*; + +import java.util.ArrayList; +import java.util.List; + +public class CameraInstructionSerializer_v924 extends CameraInstructionSerializer_v859 { + + public static final CameraInstructionSerializer_v924 INSTANCE = new CameraInstructionSerializer_v924(); + + @Override + protected void writeSplineInstruction(ByteBuf buffer, BedrockCodecHelper helper, CameraSplineInstruction splineInstruction) { + buffer.writeFloatLE(splineInstruction.getTotalTime()); + buffer.writeByte(splineInstruction.getType().ordinal()); + helper.writeArray(buffer, splineInstruction.getCurve(), helper::writeVector3f); + helper.writeArray(buffer, splineInstruction.getProgressKeyFrames(), (buf2, frame) -> { + buf2.writeFloatLE(frame.getValue()); + buf2.writeFloatLE(frame.getTime()); + buf2.writeByte(frame.getEase().ordinal()); + }); + helper.writeArray(buffer, splineInstruction.getRotationOption(), (buf2, rotationOption) -> { + helper.writeVector3f(buf2, rotationOption.getKeyFrameValues()); + buf2.writeFloatLE(rotationOption.getKeyFrameTimes()); + buf2.writeByte(rotationOption.getEase().ordinal()); + }); + helper.writeString(buffer, splineInstruction.getSplineIdentifier()); + buffer.writeBoolean(splineInstruction.isLoadFromJson()); + } + + @Override + protected CameraSplineInstruction readSplineInstruction(ByteBuf buffer, BedrockCodecHelper helper) { + float totalTime = buffer.readFloatLE(); + CameraSplineType type = CameraSplineType.values()[buffer.readUnsignedByte()]; + List curve = new ArrayList<>(); + helper.readArray(buffer, curve, helper::readVector3f); + List progressKeyFrames = new ArrayList<>(); + helper.readArray(buffer, progressKeyFrames, buf2 -> { + float value = buf2.readFloatLE(); + float time = buf2.readFloatLE(); + CameraEase ease = CameraEase.values()[buf2.readUnsignedByte()]; + return new CameraSplineInstruction.SplineProgressOption(value, time, ease); + }); + List rotationOption = new ArrayList<>(); + helper.readArray(buffer, rotationOption, buf2 -> { + Vector3f keyFrameValues = helper.readVector3f(buf2); + float keyFrameTimes = buf2.readFloatLE(); + CameraEase ease = CameraEase.values()[buf2.readUnsignedByte()]; + return new CameraSplineInstruction.SplineRotationOption(keyFrameValues, keyFrameTimes, ease); + }); + String splineIdentifier = helper.readString(buffer); + boolean loadFromJson = buffer.readBoolean(); + return new CameraSplineInstruction(totalTime, type, curve, progressKeyFrames, rotationOption, splineIdentifier, loadFromJson); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/CameraSplineSerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/CameraSplineSerializer_v924.java new file mode 100644 index 0000000..1de0e51 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/CameraSplineSerializer_v924.java @@ -0,0 +1,72 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.math.vector.Vector3f; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.data.camera.CameraEase; +import org.cloudburstmc.protocol.bedrock.data.camera.CameraSplineDefinition; +import org.cloudburstmc.protocol.bedrock.data.camera.CameraSplineInstruction; +import org.cloudburstmc.protocol.bedrock.data.camera.CameraSplineType; +import org.cloudburstmc.protocol.bedrock.packet.CameraSplinePacket; + +import java.util.ArrayList; +import java.util.List; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class CameraSplineSerializer_v924 implements BedrockPacketSerializer { + + public static final CameraSplineSerializer_v924 INSTANCE = new CameraSplineSerializer_v924(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, CameraSplinePacket packet) { + helper.writeArray(buffer, packet.getSplines(), (buf, spline) -> { + helper.writeString(buf, spline.getName()); + buf.writeFloatLE(spline.getInstruction().getTotalTime()); + helper.writeString(buf, spline.getInstruction().getType().getSerializeName()); + helper.writeArray(buf, spline.getInstruction().getCurve(), helper::writeVector3f); + helper.writeArray(buf, spline.getInstruction().getProgressKeyFrames(), (buf2, frame) -> { + buf2.writeFloatLE(frame.getValue()); + buf2.writeFloatLE(frame.getTime()); + helper.writeString(buf2, frame.getEase().getSerializeName()); + }); + helper.writeArray(buf, spline.getInstruction().getRotationOption(), (buf2, rotationOption) -> { + helper.writeVector3f(buf2, rotationOption.getKeyFrameValues()); + buf2.writeFloatLE(rotationOption.getKeyFrameTimes()); + helper.writeString(buf2, rotationOption.getEase().getSerializeName()); + }); + }); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, CameraSplinePacket packet) { + List splines = new ArrayList<>(); + + helper.readArray(buffer, splines, (buf, h) -> { + String name = helper.readString(buf); + float totalTime = buf.readFloatLE(); + CameraSplineType type = CameraSplineType.fromName(helper.readString(buf)); + List curve = new ArrayList<>(); + helper.readArray(buf, curve, helper::readVector3f); + List progressKeyFrames = new ArrayList<>(); + helper.readArray(buf, progressKeyFrames, buf2 -> { + float value = buf2.readFloatLE(); + float time = buf2.readFloatLE(); + CameraEase ease = CameraEase.fromName(helper.readString(buf2)); + return new CameraSplineInstruction.SplineProgressOption(value, time, ease); + }); + List rotationOption = new ArrayList<>(); + helper.readArray(buf, rotationOption, buf2 -> { + Vector3f keyFrameValues = helper.readVector3f(buf2); + float keyFrameTimes = buf2.readFloatLE(); + CameraEase ease = CameraEase.fromName(helper.readString(buf2)); + return new CameraSplineInstruction.SplineRotationOption(keyFrameValues, keyFrameTimes, ease); + }); + return new CameraSplineDefinition(name, new CameraSplineInstruction(totalTime, type, curve, progressKeyFrames, rotationOption)); + }); + + packet.setSplines(splines); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundDataDrivenUICloseScreenSerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundDataDrivenUICloseScreenSerializer_v924.java new file mode 100644 index 0000000..e1a46d5 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundDataDrivenUICloseScreenSerializer_v924.java @@ -0,0 +1,24 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.packet.ClientboundDataDrivenUICloseScreenPacket; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class ClientboundDataDrivenUICloseScreenSerializer_v924 implements BedrockPacketSerializer { + + public static final ClientboundDataDrivenUICloseScreenSerializer_v924 INSTANCE = new ClientboundDataDrivenUICloseScreenSerializer_v924(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDataDrivenUICloseScreenPacket packet) { + + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDataDrivenUICloseScreenPacket packet) { + + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundDataDrivenUIReloadSerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundDataDrivenUIReloadSerializer_v924.java new file mode 100644 index 0000000..6fcfa82 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundDataDrivenUIReloadSerializer_v924.java @@ -0,0 +1,24 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.packet.ClientboundDataDrivenUIReloadPacket; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class ClientboundDataDrivenUIReloadSerializer_v924 implements BedrockPacketSerializer { + + public static final ClientboundDataDrivenUIReloadSerializer_v924 INSTANCE = new ClientboundDataDrivenUIReloadSerializer_v924(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDataDrivenUIReloadPacket packet) { + + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDataDrivenUIReloadPacket packet) { + + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundDataDrivenUIShowScreenSerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundDataDrivenUIShowScreenSerializer_v924.java new file mode 100644 index 0000000..bfab8d7 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundDataDrivenUIShowScreenSerializer_v924.java @@ -0,0 +1,24 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.packet.ClientboundDataDrivenUIShowScreenPacket; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class ClientboundDataDrivenUIShowScreenSerializer_v924 implements BedrockPacketSerializer { + + public static final ClientboundDataDrivenUIShowScreenSerializer_v924 INSTANCE = new ClientboundDataDrivenUIShowScreenSerializer_v924(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDataDrivenUIShowScreenPacket packet) { + helper.writeString(buffer, packet.getScreenId()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDataDrivenUIShowScreenPacket packet) { + packet.setScreenId(helper.readString(buffer)); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundDataStoreSerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundDataStoreSerializer_v924.java new file mode 100644 index 0000000..7b01ec7 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundDataStoreSerializer_v924.java @@ -0,0 +1,110 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v898.serializer.ClientboundDataStoreSerializer_v898; +import org.cloudburstmc.protocol.bedrock.data.datastore.DataStoreChange; +import org.cloudburstmc.protocol.bedrock.data.datastore.DataStoreRemoval; +import org.cloudburstmc.protocol.bedrock.data.datastore.DataStoreUpdate; +import org.cloudburstmc.protocol.bedrock.packet.ClientboundDataStorePacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +public class ClientboundDataStoreSerializer_v924 extends ClientboundDataStoreSerializer_v898 { + + public static final ClientboundDataStoreSerializer_v924 INSTANCE = new ClientboundDataStoreSerializer_v924(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDataStorePacket packet) { + helper.writeArray(buffer, packet.getUpdates(), (buf, action) -> { + VarInts.writeUnsignedInt(buffer, action.getType()); + + switch (action.getType()) { + case 0: + helper.writeString(buffer, ((DataStoreUpdate) action).getDataStoreName()); + helper.writeString(buffer, ((DataStoreUpdate) action).getProperty()); + helper.writeString(buffer, ((DataStoreUpdate) action).getPath()); + + Object value = ((DataStoreUpdate) action).getData(); + + int type = value instanceof Number ? 0 : value instanceof Boolean ? 1 : value instanceof String ? 2 : -1; + + VarInts.writeUnsignedInt(buffer, type); + + switch (type) { + case 0: + buffer.writeDoubleLE(((Number) value).doubleValue()); + break; + case 1: + buffer.writeBoolean((boolean) value); + break; + case 2: + helper.writeString(buffer, (String) value); + break; + default: + throw new IllegalStateException("Invalid data store data type " + type); + } + + buffer.writeIntLE(((DataStoreUpdate) action).getUpdateCount()); + buffer.writeIntLE(((DataStoreUpdate) action).getPathUpdateCount()); + break; + case 1: + helper.writeString(buffer, ((DataStoreChange) action).getDataStoreName()); + helper.writeString(buffer, ((DataStoreChange) action).getProperty()); + buffer.writeIntLE(((DataStoreChange) action).getUpdateCount()); + writeDataStoreChange(buffer, helper, ((DataStoreChange) action).getNewValue()); + break; + case 2: + helper.writeString(buf, ((DataStoreRemoval) action).getDataStoreName()); + break; + default: + throw new UnsupportedOperationException("Unknown data store action"); + } + }); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDataStorePacket packet) { + helper.readArray(buffer, packet.getUpdates(), (buf -> { + switch (VarInts.readUnsignedInt(buffer)) { + case 0: + DataStoreUpdate update = new DataStoreUpdate(); + update.setDataStoreName(helper.readString(buffer)); + update.setProperty(helper.readString(buffer)); + update.setPath(helper.readString(buffer)); + + int type = VarInts.readUnsignedInt(buffer); + + switch (type) { + case 0: + update.setData(buffer.readDoubleLE()); + break; + case 1: + update.setData(buffer.readBoolean()); + break; + case 2: + update.setData(helper.readString(buffer)); + break; + default: + throw new IllegalStateException("Invalid data store data type: " + type); + } + + update.setUpdateCount((int) buffer.readUnsignedIntLE()); + update.setPathUpdateCount((int) buffer.readUnsignedIntLE()); + return update; + case 1: + DataStoreChange change = new DataStoreChange(); + change.setDataStoreName(helper.readString(buf)); + change.setProperty(helper.readString(buffer)); + change.setUpdateCount((int) buffer.readUnsignedIntLE()); + change.setNewValue(readDataStoreChange(buffer, helper)); + return change; + case 2: + DataStoreRemoval removal = new DataStoreRemoval(); + removal.setDataStoreName(helper.readString(buf)); + return removal; + default: + throw new UnsupportedOperationException("Unknown data store action"); + } + })); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundTextureShiftSerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundTextureShiftSerializer_v924.java new file mode 100644 index 0000000..7bc5c70 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ClientboundTextureShiftSerializer_v924.java @@ -0,0 +1,44 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.packet.ClientboundTextureShiftPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +import java.util.ArrayList; +import java.util.List; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class ClientboundTextureShiftSerializer_v924 implements BedrockPacketSerializer { + + public static final ClientboundTextureShiftSerializer_v924 INSTANCE = new ClientboundTextureShiftSerializer_v924(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundTextureShiftPacket packet) { + buffer.writeByte(packet.getAction().ordinal()); + helper.writeString(buffer, packet.getCollectionName()); + helper.writeString(buffer, packet.getFromStep()); + helper.writeString(buffer, packet.getToStep()); + helper.writeArray(buffer, packet.getAllSteps(), helper::writeString); + VarInts.writeUnsignedLong(buffer, packet.getCurrentLengthTicks()); + VarInts.writeUnsignedLong(buffer, packet.getTotalLengthTicks()); + buffer.writeBoolean(packet.isEnabled()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundTextureShiftPacket packet) { + packet.setAction(ClientboundTextureShiftPacket.Action.values()[buffer.readUnsignedByte()]); + packet.setCollectionName(helper.readString(buffer)); + packet.setFromStep(helper.readString(buffer)); + packet.setToStep(helper.readString(buffer)); + List allSteps = new ArrayList<>(); + helper.readArray(buffer, allSteps, helper::readString); + packet.setAllSteps(allSteps); + packet.setCurrentLengthTicks(VarInts.readUnsignedLong(buffer)); + packet.setTotalLengthTicks(VarInts.readUnsignedLong(buffer)); + packet.setEnabled(buffer.readBoolean()); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/DebugDrawerSerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/DebugDrawerSerializer_v924.java new file mode 100644 index 0000000..0ce41f0 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/DebugDrawerSerializer_v924.java @@ -0,0 +1,77 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.math.vector.Vector3f; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v859.serializer.DebugDrawerSerializer_v859; +import org.cloudburstmc.protocol.bedrock.data.debugshape.*; +import org.cloudburstmc.protocol.common.util.VarInts; + +import java.awt.Color; + +public class DebugDrawerSerializer_v924 extends DebugDrawerSerializer_v859 { + + public static final DebugDrawerSerializer_v924 INSTANCE = new DebugDrawerSerializer_v924(); + + @Override + protected void writeCommonShapeData(ByteBuf buffer, BedrockCodecHelper helper, DebugShape shape) { + VarInts.writeUnsignedLong(buffer, shape.getId()); + helper.writeOptionalNull(buffer, shape.getType(), (buf, type) -> buf.writeByte(type.ordinal())); + helper.writeOptionalNull(buffer, shape.getPosition(), WRITE_VECTOR3F); + helper.writeOptionalNull(buffer, shape.getScale(), ByteBuf::writeFloatLE); + helper.writeOptionalNull(buffer, shape.getRotation(), WRITE_VECTOR3F); + helper.writeOptionalNull(buffer, shape.getTotalTimeLeft(), ByteBuf::writeFloatLE); + helper.writeOptionalNull(buffer, shape.getColor(), WRITE_COLOR); + + helper.writeOptionalNull(buffer, shape.getDimension(), VarInts::writeInt); + helper.writeOptionalNull(buffer, shape.getAttachedToEntityId(), VarInts::writeUnsignedLong); + } + + @Override + protected DebugShape readShape(ByteBuf buffer, BedrockCodecHelper helper) { + long id = VarInts.readUnsignedLong(buffer); + + DebugShape.Type type = helper.readOptional(buffer, null, + (buf, aHelper) -> SHAPE_TYPES[buf.readUnsignedByte()]); + Vector3f position = helper.readOptional(buffer, null, READ_VECTOR3F); + Float scale = helper.readOptional(buffer, null, ByteBuf::readFloatLE); + Vector3f rotation = helper.readOptional(buffer, null, READ_VECTOR3F); + Float totalTimeLeft = helper.readOptional(buffer, null, ByteBuf::readFloatLE); + Color color = helper.readOptional(buffer, null, READ_COLOR); + + Integer dimension = helper.readOptional(buffer, -1, VarInts::readInt); + Long attachedToEntityId = helper.readOptional(buffer, null, VarInts::readUnsignedLong); + int payloadType = VarInts.readUnsignedInt(buffer); // Unused + + if (type == null) { + return new DebugShape(id, dimension); + } + + switch (type) { + case ARROW: + Vector3f arrowEndPosition = helper.readOptional(buffer, null, READ_VECTOR3F); + Float arrowHeadLength = helper.readOptional(buffer, null, ByteBuf::readFloatLE); + Float arrowHeadRadius = helper.readOptional(buffer, null, ByteBuf::readFloatLE); + Integer arrowHeadSegments = helper.readOptional(buffer, null, buf -> (int) buf.readUnsignedByte()); + return new DebugArrow(id, dimension, position, scale, rotation, totalTimeLeft, color, arrowEndPosition, + arrowHeadLength, arrowHeadRadius, arrowHeadSegments, attachedToEntityId); + case BOX: + Vector3f boxBounds = helper.readVector3f(buffer); + return new DebugBox(id, dimension, position, scale, rotation, totalTimeLeft, color, boxBounds, attachedToEntityId); + case CIRCLE: + Integer circleSegments = (int) buffer.readUnsignedByte(); + return new DebugCircle(id, dimension, position, scale, rotation, totalTimeLeft, color, circleSegments, attachedToEntityId); + case LINE: + Vector3f lineEndPosition = helper.readVector3f(buffer); + return new DebugLine(id, dimension, position, scale, rotation, totalTimeLeft, color, lineEndPosition, attachedToEntityId); + case SPHERE: + Integer sphereSegments = (int) buffer.readUnsignedByte(); + return new DebugSphere(id, dimension, position, scale, rotation, totalTimeLeft, color, sphereSegments, attachedToEntityId); + case TEXT: + String text = helper.readString(buffer); + return new DebugText(id, dimension, position, scale, rotation, totalTimeLeft, color, text, attachedToEntityId); + default: + throw new IllegalStateException("Unknown debug shape type"); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/GraphicsParameterOverrideSerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/GraphicsParameterOverrideSerializer_v924.java new file mode 100644 index 0000000..a183eba --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/GraphicsParameterOverrideSerializer_v924.java @@ -0,0 +1,47 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.math.vector.Vector3f; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v859.serializer.GraphicsParameterOverrideSerializer_v859; +import org.cloudburstmc.protocol.bedrock.data.GraphicsOverrideParameterType; +import org.cloudburstmc.protocol.bedrock.packet.GraphicsParameterOverridePacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class GraphicsParameterOverrideSerializer_v924 extends GraphicsParameterOverrideSerializer_v859 { + + public static final GraphicsParameterOverrideSerializer_v924 INSTANCE = new GraphicsParameterOverrideSerializer_v924(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, GraphicsParameterOverridePacket packet) { + helper.writeArray(buffer, packet.getValues().entrySet(), (buf, aHelper, entry) -> { + buf.writeFloatLE(entry.getKey()); + helper.writeVector3f(buf, entry.getValue()); + }); + helper.writeOptionalNull(buffer, packet.getFloatValue(), ByteBuf::writeFloatLE); + helper.writeOptionalNull(buffer, packet.getVec3Value(), (buf, h, v) -> h.writeVector3f(buf, v)); + helper.writeString(buffer, packet.getBiomeIdentifier()); + buffer.writeByte(packet.getParameterType().ordinal()); + buffer.writeBoolean(packet.isReset()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, GraphicsParameterOverridePacket packet) { + Map values = new LinkedHashMap<>(); + int length = VarInts.readUnsignedInt(buffer); + for (int i = 0; i < length; i++) { + float key = buffer.readFloatLE(); + Vector3f value = helper.readVector3f(buffer); + values.put(key, value); + } + packet.setValues(values); + packet.setFloatValue(helper.readOptional(buffer, null, ByteBuf::readFloatLE)); + packet.setVec3Value(helper.readOptional(buffer, null, (buf, h) -> h.readVector3f(buf))); + packet.setBiomeIdentifier(helper.readString(buffer)); + packet.setParameterType(GraphicsOverrideParameterType.values()[buffer.readUnsignedByte()]); + packet.setReset(buffer.readBoolean()); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ServerboundDataStoreSerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ServerboundDataStoreSerializer_v924.java new file mode 100644 index 0000000..d20aba3 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ServerboundDataStoreSerializer_v924.java @@ -0,0 +1,25 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v898.serializer.ServerboundDataStoreSerializer_v898; +import org.cloudburstmc.protocol.bedrock.packet.ServerboundDataStorePacket; + +public class ServerboundDataStoreSerializer_v924 extends ServerboundDataStoreSerializer_v898 { + + public static final ServerboundDataStoreSerializer_v924 INSTANCE = new ServerboundDataStoreSerializer_v924(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ServerboundDataStorePacket packet) { + super.serialize(buffer, helper, packet); + + buffer.writeIntLE(packet.getUpdate().getPathUpdateCount()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ServerboundDataStorePacket packet) { + super.deserialize(buffer, helper, packet); + + packet.getUpdate().setPathUpdateCount((int) buffer.readUnsignedIntLE()); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ServerboundDiagnosticsSerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ServerboundDiagnosticsSerializer_v924.java new file mode 100644 index 0000000..3f199a6 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/ServerboundDiagnosticsSerializer_v924.java @@ -0,0 +1,30 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v712.serializer.ServerboundDiagnosticsSerializer_v712; +import org.cloudburstmc.protocol.bedrock.data.diagnostics.MemoryCategoryCounter; +import org.cloudburstmc.protocol.bedrock.packet.ServerboundDiagnosticsPacket; + +public class ServerboundDiagnosticsSerializer_v924 extends ServerboundDiagnosticsSerializer_v712 { + + public static final ServerboundDiagnosticsSerializer_v924 INSTANCE = new ServerboundDiagnosticsSerializer_v924(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ServerboundDiagnosticsPacket packet) { + super.serialize(buffer, helper, packet); + + helper.writeArray(buffer, packet.getMemoryCategoryValues(), ((buf, h, counter) -> { + buf.writeByte(counter.getCategory().ordinal()); + buf.writeLongLE(counter.getCurrentBytes()); + })); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ServerboundDiagnosticsPacket packet) { + super.deserialize(buffer, helper, packet); + + helper.readArray(buffer, packet.getMemoryCategoryValues(), (buf, h) -> + new MemoryCategoryCounter(MemoryCategoryCounter.Category.values()[buf.readUnsignedByte()], buffer.readLongLE())); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/StartGameSerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/StartGameSerializer_v924.java new file mode 100644 index 0000000..72742d8 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/StartGameSerializer_v924.java @@ -0,0 +1,159 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v898.serializer.StartGameSerializer_v898; +import org.cloudburstmc.protocol.bedrock.data.*; +import org.cloudburstmc.protocol.bedrock.packet.StartGamePacket; +import org.cloudburstmc.protocol.common.util.OptionalBoolean; +import org.cloudburstmc.protocol.common.util.VarInts; + +public class StartGameSerializer_v924 extends StartGameSerializer_v898 { + + public static final StartGameSerializer_v924 INSTANCE = new StartGameSerializer_v924(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, StartGamePacket packet) { + super.serialize(buffer, helper, packet); + helper.writeOptionalNull(buffer, packet.getServerConfigurationJoinInfo(), this::writeServerJoinInfo); + + helper.writeString(buffer, packet.getServerId()); + helper.writeString(buffer, packet.getScenarioId()); + helper.writeString(buffer, packet.getWorldId()); + helper.writeString(buffer, packet.getOwnerId()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, StartGamePacket packet) { + super.deserialize(buffer, helper, packet); + packet.setServerConfigurationJoinInfo(helper.readOptional(buffer, null, this::readServerJoinInfo)); + + packet.setServerId(helper.readString(buffer)); + packet.setScenarioId(helper.readString(buffer)); + packet.setWorldId(helper.readString(buffer)); + packet.setOwnerId(helper.readString(buffer)); + } + + @Override + protected void writeLevelSettings(ByteBuf buffer, BedrockCodecHelper helper, StartGamePacket packet) { + //v671 + writeSeed(buffer, packet.getSeed()); + buffer.writeShortLE(packet.getSpawnBiomeType().ordinal()); + helper.writeString(buffer, packet.getCustomBiomeName()); + VarInts.writeInt(buffer, packet.getDimensionId()); + VarInts.writeInt(buffer, packet.getGeneratorId()); + VarInts.writeInt(buffer, packet.getLevelGameType().ordinal()); + buffer.writeBoolean(packet.isHardcore()); + VarInts.writeInt(buffer, packet.getDifficulty()); + helper.writeBlockPosition(buffer, packet.getDefaultSpawn()); + buffer.writeBoolean(packet.isAchievementsDisabled()); + VarInts.writeInt(buffer, packet.getEditorWorldType().ordinal()); + buffer.writeBoolean(packet.isCreatedInEditor()); + buffer.writeBoolean(packet.isExportedFromEditor()); + VarInts.writeInt(buffer, packet.getDayCycleStopTime()); + VarInts.writeInt(buffer, packet.getEduEditionOffers()); + buffer.writeBoolean(packet.isEduFeaturesEnabled()); + helper.writeString(buffer, packet.getEducationProductionId()); + buffer.writeFloatLE(packet.getRainLevel()); + buffer.writeFloatLE(packet.getLightningLevel()); + buffer.writeBoolean(packet.isPlatformLockedContentConfirmed()); + buffer.writeBoolean(packet.isMultiplayerGame()); + buffer.writeBoolean(packet.isBroadcastingToLan()); + VarInts.writeInt(buffer, packet.getXblBroadcastMode().ordinal()); + VarInts.writeInt(buffer, packet.getPlatformBroadcastMode().ordinal()); + buffer.writeBoolean(packet.isCommandsEnabled()); + buffer.writeBoolean(packet.isTexturePacksRequired()); + helper.writeArray(buffer, packet.getGamerules(), helper::writeGameRuleInStartGame); + helper.writeExperiments(buffer, packet.getExperiments()); + buffer.writeBoolean(packet.isExperimentsPreviouslyToggled()); + buffer.writeBoolean(packet.isBonusChestEnabled()); + buffer.writeBoolean(packet.isStartingWithMap()); + VarInts.writeInt(buffer, packet.getDefaultPlayerPermission().ordinal()); + buffer.writeIntLE(packet.getServerChunkTickRange()); + buffer.writeBoolean(packet.isBehaviorPackLocked()); + buffer.writeBoolean(packet.isResourcePackLocked()); + buffer.writeBoolean(packet.isFromLockedWorldTemplate()); + buffer.writeBoolean(packet.isUsingMsaGamertagsOnly()); + buffer.writeBoolean(packet.isFromWorldTemplate()); + buffer.writeBoolean(packet.isWorldTemplateOptionLocked()); + buffer.writeBoolean(packet.isOnlySpawningV1Villagers()); + buffer.writeBoolean(packet.isDisablingPersonas()); + buffer.writeBoolean(packet.isDisablingCustomSkins()); + buffer.writeBoolean(packet.isEmoteChatMuted()); + helper.writeString(buffer, packet.getVanillaVersion()); + buffer.writeIntLE(packet.getLimitedWorldWidth()); + buffer.writeIntLE(packet.getLimitedWorldHeight()); + buffer.writeBoolean(packet.isNetherType()); + helper.writeString(buffer, packet.getEduSharedUriResource().getButtonName()); + helper.writeString(buffer, packet.getEduSharedUriResource().getLinkUri()); + helper.writeOptional(buffer, OptionalBoolean::isPresent, packet.getForceExperimentalGameplay(), + (buf, optional) -> buf.writeBoolean(optional.getAsBoolean())); + buffer.writeByte(packet.getChatRestrictionLevel().ordinal()); + buffer.writeBoolean(packet.isDisablingPlayerInteractions()); + } + + @Override + protected void readLevelSettings(ByteBuf buffer, BedrockCodecHelper helper, StartGamePacket packet) { + //v671 + packet.setSeed(readSeed(buffer)); + packet.setSpawnBiomeType(SpawnBiomeType.byId(buffer.readShortLE())); + packet.setCustomBiomeName(helper.readString(buffer)); + packet.setDimensionId(VarInts.readInt(buffer)); + packet.setGeneratorId(VarInts.readInt(buffer)); + packet.setLevelGameType(GameType.from(VarInts.readInt(buffer))); + packet.setHardcore(buffer.readBoolean()); + packet.setDifficulty(VarInts.readInt(buffer)); + packet.setDefaultSpawn(helper.readBlockPosition(buffer)); + packet.setAchievementsDisabled(buffer.readBoolean()); + packet.setEditorWorldType(WorldType.values()[VarInts.readInt(buffer)]); + packet.setCreatedInEditor(buffer.readBoolean()); + packet.setExportedFromEditor(buffer.readBoolean()); + packet.setDayCycleStopTime(VarInts.readInt(buffer)); + packet.setEduEditionOffers(VarInts.readInt(buffer)); + packet.setEduFeaturesEnabled(buffer.readBoolean()); + packet.setEducationProductionId(helper.readString(buffer)); + packet.setRainLevel(buffer.readFloatLE()); + packet.setLightningLevel(buffer.readFloatLE()); + packet.setPlatformLockedContentConfirmed(buffer.readBoolean()); + packet.setMultiplayerGame(buffer.readBoolean()); + packet.setBroadcastingToLan(buffer.readBoolean()); + packet.setXblBroadcastMode(GamePublishSetting.byId(VarInts.readInt(buffer))); + packet.setPlatformBroadcastMode(GamePublishSetting.byId(VarInts.readInt(buffer))); + packet.setCommandsEnabled(buffer.readBoolean()); + packet.setTexturePacksRequired(buffer.readBoolean()); + helper.readArray(buffer, packet.getGamerules(), helper::readGameRuleInStartGame); + helper.readExperiments(buffer, packet.getExperiments()); + packet.setExperimentsPreviouslyToggled(buffer.readBoolean()); + packet.setBonusChestEnabled(buffer.readBoolean()); + packet.setStartingWithMap(buffer.readBoolean()); + packet.setDefaultPlayerPermission(PLAYER_PERMISSIONS[VarInts.readInt(buffer)]); + packet.setServerChunkTickRange(buffer.readIntLE()); + packet.setBehaviorPackLocked(buffer.readBoolean()); + packet.setResourcePackLocked(buffer.readBoolean()); + packet.setFromLockedWorldTemplate(buffer.readBoolean()); + packet.setUsingMsaGamertagsOnly(buffer.readBoolean()); + packet.setFromWorldTemplate(buffer.readBoolean()); + packet.setWorldTemplateOptionLocked(buffer.readBoolean()); + packet.setOnlySpawningV1Villagers(buffer.readBoolean()); + packet.setDisablingPersonas(buffer.readBoolean()); + packet.setDisablingCustomSkins(buffer.readBoolean()); + packet.setEmoteChatMuted(buffer.readBoolean()); + packet.setVanillaVersion(helper.readString(buffer)); + packet.setLimitedWorldWidth(buffer.readIntLE()); + packet.setLimitedWorldHeight(buffer.readIntLE()); + packet.setNetherType(buffer.readBoolean()); + packet.setEduSharedUriResource(new EduSharedUriResource(helper.readString(buffer), helper.readString(buffer))); + packet.setForceExperimentalGameplay(helper.readOptional(buffer, OptionalBoolean.empty(), buf -> OptionalBoolean.of(buf.readBoolean()))); + packet.setChatRestrictionLevel(ChatRestrictionLevel.values()[buffer.readByte()]); + packet.setDisablingPlayerInteractions(buffer.readBoolean()); + } + + protected void writeServerJoinInfo(ByteBuf buffer, BedrockCodecHelper helper, ServerConfigurationJoinInfo info) { + buffer.writeBoolean(false); + } + + protected ServerConfigurationJoinInfo readServerJoinInfo(ByteBuf buffer, BedrockCodecHelper helper) { + buffer.readBoolean(); + return new ServerConfigurationJoinInfo(null, null, null); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/TextSerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/TextSerializer_v924.java new file mode 100644 index 0000000..c553b93 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/TextSerializer_v924.java @@ -0,0 +1,137 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import it.unimi.dsi.fastutil.objects.ObjectList; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v898.serializer.TextSerializer_v898; +import org.cloudburstmc.protocol.bedrock.packet.TextPacket; +import org.cloudburstmc.protocol.common.util.TextConverter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TextSerializer_v924 extends TextSerializer_v898 { + + public static final TextSerializer_v924 INSTANCE = new TextSerializer_v924(); + private static final Logger log = LoggerFactory.getLogger(TextSerializer_v924.class); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket packet) { + TextPacket.Type type = packet.getType(); + TextConverter converter = helper.getTextConverter(); + CharSequence message = packet.getMessage(CharSequence.class); + Boolean needsTranslation = converter.needsTranslation(message); + + buffer.writeBoolean(needsTranslation != null ? needsTranslation : packet.isNeedsTranslation()); + String text; + + switch (type) { + case RAW: + case TIP: + case SYSTEM: + buffer.writeByte(0); // MessageOnly + buffer.writeByte(type.ordinal()); + text = converter.serialize(message); + if (text.isEmpty()) { + text = " "; + if (log.isDebugEnabled()) { + log.debug("TextPacket of " + type + " with empty message"); + } + } + helper.writeString(buffer, text); + break; + case JSON: + case WHISPER_JSON: + case ANNOUNCEMENT_JSON: + buffer.writeByte(0); // MessageOnly + buffer.writeByte(type.ordinal()); + text = converter.serializeJson(message); + if (text.isEmpty()) { + text = " "; + if (log.isDebugEnabled()) { + log.debug("TextPacket of " + type + " with empty message"); + } + } + helper.writeString(buffer, text); + break; + case CHAT: + case WHISPER: + case ANNOUNCEMENT: + buffer.writeByte(1); // AuthorAndMessage + buffer.writeByte(type.ordinal()); + helper.writeString(buffer, packet.getSourceName()); + text = converter.serialize(message); + if (text.isEmpty()) { + text = " "; + if (log.isDebugEnabled()) { + log.debug("TextPacket of " + type + " with empty message"); + } + } + helper.writeString(buffer, text); + break; + case TRANSLATION: + case POPUP: + case JUKEBOX_POPUP: + buffer.writeByte(2); // MessageAndParams + buffer.writeByte(type.ordinal()); + text = converter.serializeWithArguments(message, packet.getParameters()); + if (text.isEmpty()) { + text = " "; + if (log.isDebugEnabled()) { + log.debug("TextPacket of " + type + " with empty message"); + } + } + helper.writeString(buffer, text); + helper.writeArray(buffer, packet.getParameters(), helper::writeString); + break; + default: + throw new UnsupportedOperationException("Unsupported TextType " + type); + } + + helper.writeString(buffer, packet.getXuid()); + helper.writeString(buffer, packet.getPlatformChatId()); + String filtered = converter.serialize(packet.getFilteredMessage(CharSequence.class)); + helper.writeOptional(buffer, (s -> !s.isEmpty()), filtered, (buf, codecHelper, s) -> codecHelper.writeString(buf, s)); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket packet) { + TextConverter converter = helper.getTextConverter(); + boolean needsTranslation = buffer.readBoolean(); + packet.setNeedsTranslation(needsTranslation); + + switch (buffer.readByte()) { + case 0: // MessageOnly + TextPacket.Type type = TextPacket.Type.values()[buffer.readUnsignedByte()]; + packet.setType(type); + + String text = helper.readString(buffer); + if (type == TextPacket.Type.JSON || type == TextPacket.Type.WHISPER_JSON || type == TextPacket.Type.ANNOUNCEMENT_JSON) { + packet.setMessage(converter.deserializeJson(text, needsTranslation)); + } else { + packet.setMessage(converter.deserialize(text, needsTranslation)); + } + break; + case 1: // AuthorAndMessage + packet.setType(TextPacket.Type.values()[buffer.readUnsignedByte()]); + packet.setSourceName(helper.readString(buffer)); + packet.setMessage(converter.deserialize(helper.readString(buffer), needsTranslation)); + break; + case 2: // MessageAndParams + packet.setType(TextPacket.Type.values()[buffer.readUnsignedByte()]); + String text2 = helper.readString(buffer); + ObjectList parameters = new ObjectArrayList<>(); + helper.readArray(buffer, parameters, helper::readString); + packet.setMessage(converter.deserializeWithArguments(text2, parameters, needsTranslation)); + packet.setParameters(parameters); + break; + default: + throw new UnsupportedOperationException("Not oneOf"); + } + + packet.setXuid(helper.readString(buffer)); + packet.setPlatformChatId(helper.readString(buffer)); + String filtered = helper.readOptional(buffer, "", (buf, codecHelper) -> codecHelper.readString(buf)); + packet.setFilteredMessage(converter.deserialize(filtered, needsTranslation)); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/VoxelShapesSerializer_v924.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/VoxelShapesSerializer_v924.java new file mode 100644 index 0000000..0d667dd --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v924/serializer/VoxelShapesSerializer_v924.java @@ -0,0 +1,77 @@ +package org.cloudburstmc.protocol.bedrock.codec.v924.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.data.SerializableVoxelShape; +import org.cloudburstmc.protocol.bedrock.packet.VoxelShapesPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +import java.util.*; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class VoxelShapesSerializer_v924 implements BedrockPacketSerializer { + + public static final VoxelShapesSerializer_v924 INSTANCE = new VoxelShapesSerializer_v924(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, VoxelShapesPacket packet) { + helper.writeArray(buffer, packet.getShapes(), (buf, shape) -> { + buf.writeByte(shape.getCells().getXSize()); + buf.writeByte(shape.getCells().getYSize()); + buf.writeByte(shape.getCells().getZSize()); + + helper.writeArray(buf, shape.getCells().getStorage(), (buf2, value) -> buf2.writeByte(value)); + + helper.writeArray(buf, shape.getXCoordinates(), ByteBuf::writeFloatLE); + helper.writeArray(buf, shape.getYCoordinates(), ByteBuf::writeFloatLE); + helper.writeArray(buf, shape.getZCoordinates(), ByteBuf::writeFloatLE); + }); + + VarInts.writeUnsignedInt(buffer, packet.getNameMap().size()); + packet.getNameMap().forEach((k, v) -> { + helper.writeString(buffer, k); + buffer.writeShortLE(v); + }); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, VoxelShapesPacket packet) { + List shapes = new ArrayList<>(); + + helper.readArray(buffer, shapes, (buf, h) -> { + short xSize = buf.readUnsignedByte(); + short ySize = buf.readUnsignedByte(); + short zSize = buf.readUnsignedByte(); + + List storage = new ArrayList<>(); + helper.readArray(buf, storage, (ByteBuf::readUnsignedByte)); + + SerializableVoxelShape.SerializableCells cells = new SerializableVoxelShape.SerializableCells(xSize, ySize, zSize, storage); + + List xCoordinates = new ArrayList<>(); + helper.readArray(buf, xCoordinates, (ByteBuf::readFloatLE)); + + List yCoordinates = new ArrayList<>(); + helper.readArray(buf, yCoordinates, (ByteBuf::readFloatLE)); + + List zCoordinates = new ArrayList<>(); + helper.readArray(buf, zCoordinates, (ByteBuf::readFloatLE)); + + return new SerializableVoxelShape(cells, xCoordinates, yCoordinates, zCoordinates); + }); + + packet.setShapes(shapes); + + Map nameMap = new LinkedHashMap<>(); + + int size = VarInts.readUnsignedInt(buffer); + for (int i = 0; i < size; i++) { + nameMap.put(helper.readString(buffer), buffer.readUnsignedShortLE()); + } + + packet.setNameMap(nameMap); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/BedrockCodecHelper_v944.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/BedrockCodecHelper_v944.java new file mode 100644 index 0000000..13a8131 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/BedrockCodecHelper_v944.java @@ -0,0 +1,66 @@ +package org.cloudburstmc.protocol.bedrock.codec.v944; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.math.vector.Vector3i; +import org.cloudburstmc.protocol.bedrock.codec.EntityDataTypeMap; +import org.cloudburstmc.protocol.bedrock.codec.v898.BedrockCodecHelper_v898; +import org.cloudburstmc.protocol.bedrock.data.Ability; +import org.cloudburstmc.protocol.bedrock.data.PresenceConfiguration; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.data.inventory.itemstack.request.TextProcessingEventOrigin; +import org.cloudburstmc.protocol.bedrock.data.inventory.itemstack.request.action.ItemStackRequestActionType; +import org.cloudburstmc.protocol.bedrock.packet.InventoryTransactionPacket; +import org.cloudburstmc.protocol.common.util.TypeMap; +import org.cloudburstmc.protocol.common.util.VarInts; + +import static org.cloudburstmc.protocol.common.util.Preconditions.checkNotNull; + +public class BedrockCodecHelper_v944 extends BedrockCodecHelper_v898 { + + public BedrockCodecHelper_v944(EntityDataTypeMap entityData, TypeMap> gameRulesTypes, TypeMap stackRequestActionTypes, + TypeMap containerSlotTypes, TypeMap abilities, TypeMap textProcessingEventOrigins) { + super(entityData, gameRulesTypes, stackRequestActionTypes, containerSlotTypes, abilities, textProcessingEventOrigins); + } + + @Override + public Vector3i readBlockPosition(ByteBuf buffer) { + int x = VarInts.readInt(buffer); + int y = VarInts.readInt(buffer); + int z = VarInts.readInt(buffer); + + return Vector3i.from(x, y, z); + } + + @Override + public void writeBlockPosition(ByteBuf buffer, Vector3i blockPosition) { + checkNotNull(blockPosition, "blockPosition"); + VarInts.writeInt(buffer, blockPosition.getX()); + VarInts.writeInt(buffer, blockPosition.getY()); + VarInts.writeInt(buffer, blockPosition.getZ()); + } + + @Override + public void writeItemUse(ByteBuf buffer, InventoryTransactionPacket packet) { + super.writeItemUse(buffer, packet); + + buffer.writeByte(packet.getClientCooldownState()); + } + + @Override + public void readItemUse(ByteBuf buffer, InventoryTransactionPacket packet) { + super.readItemUse(buffer, packet); + + packet.setClientCooldownState(buffer.readByte()); + } + + @Override + public void writePresenceConfiguration(ByteBuf buffer, PresenceConfiguration configuration) { + writeString(buffer, configuration.getExperienceName()); + writeString(buffer, configuration.getWorldName()); + } + + @Override + public PresenceConfiguration readPresenceConfiguration(ByteBuf buffer) { + return new PresenceConfiguration(readString(buffer), readString(buffer), null); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/Bedrock_v944.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/Bedrock_v944.java new file mode 100644 index 0000000..cc2fd80 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/Bedrock_v944.java @@ -0,0 +1,73 @@ +package org.cloudburstmc.protocol.bedrock.codec.v944; + +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; +import org.cloudburstmc.protocol.bedrock.codec.EntityDataTypeMap; +import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.LevelEventSerializer_v291; +import org.cloudburstmc.protocol.bedrock.codec.v361.serializer.LevelEventGenericSerializer_v361; +import org.cloudburstmc.protocol.bedrock.codec.v786.serializer.LevelSoundEventSerializer_v786; +import org.cloudburstmc.protocol.bedrock.codec.v924.Bedrock_v924; +import org.cloudburstmc.protocol.bedrock.codec.v924.serializer.CameraInstructionSerializer_v924; +import org.cloudburstmc.protocol.bedrock.codec.v944.serializer.*; +import org.cloudburstmc.protocol.bedrock.data.LevelEventType; +import org.cloudburstmc.protocol.bedrock.data.PacketRecipient; +import org.cloudburstmc.protocol.bedrock.data.ParticleType; +import org.cloudburstmc.protocol.bedrock.data.SoundEvent; +import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.packet.*; +import org.cloudburstmc.protocol.bedrock.transformer.TypeMapTransformer; +import org.cloudburstmc.protocol.common.util.TypeMap; + +public class Bedrock_v944 extends Bedrock_v924 { + + protected static final TypeMap CONTAINER_SLOT_TYPES = Bedrock_v924.CONTAINER_SLOT_TYPES + .toBuilder() + .insert(64, ContainerSlotType.RECIPE_FOOD_CONTAINER) + .insert(65, ContainerSlotType.RECIPE_BLOCKS_CONTAINER) + .insert(66, ContainerSlotType.RECIPE_FURNACE_ITEMS_CONTAINER) + .build(); + + protected static final TypeMap PARTICLE_TYPES = Bedrock_v924.PARTICLE_TYPES.toBuilder() + .insert(99, ParticleType.PAUSE_MOB_GROWTH) + .insert(100, ParticleType.RESET_MOB_GROWTH) + .build(); + + protected static final EntityDataTypeMap ENTITY_DATA = Bedrock_v924.ENTITY_DATA + .toBuilder() + .update(EntityDataTypes.AREA_EFFECT_CLOUD_PARTICLE, new TypeMapTransformer<>(PARTICLE_TYPES)) + .build(); + + protected static final TypeMap LEVEL_EVENTS = Bedrock_v924.LEVEL_EVENTS.toBuilder() + .insert(LEVEL_EVENT_PARTICLE_TYPE, PARTICLE_TYPES) + .build(); + + protected static final TypeMap SOUND_EVENTS = Bedrock_v924.SOUND_EVENTS + .toBuilder() + .replace(597, SoundEvent.PAUSE_GROWTH) + .insert(598, SoundEvent.RESET_GROWTH) + .insert(599, SoundEvent.UNDEFINED) + .build(); + + public static final BedrockCodec CODEC = Bedrock_v924.CODEC.toBuilder() + .protocolVersion(944) + .minecraftVersion("1.26.10") + .helper(() -> new BedrockCodecHelper_v944(ENTITY_DATA, GAME_RULE_TYPES, ITEM_STACK_REQUEST_TYPES, CONTAINER_SLOT_TYPES, PLAYER_ABILITIES, TEXT_PROCESSING_ORIGINS)) + .updateSerializer(CameraInstructionPacket.class, CameraInstructionSerializer_v944.INSTANCE) + .updateSerializer(CameraSplinePacket.class, CameraSplineSerializer_v944.INSTANCE) + .updateSerializer(ClientboundDataDrivenUICloseScreenPacket.class, ClientboundDataDrivenUICloseScreenSerializer_v944.INSTANCE) + .updateSerializer(ClientboundDataDrivenUIShowScreenPacket.class, ClientboundDataDrivenUIShowScreenSerializer_v944.INSTANCE) + .updateSerializer(LevelEventPacket.class, new LevelEventSerializer_v291(LEVEL_EVENTS)) + .updateSerializer(LevelEventGenericPacket.class, new LevelEventGenericSerializer_v361(LEVEL_EVENTS)) + .updateSerializer(LevelSoundEventPacket.class, new LevelSoundEventSerializer_v786(SOUND_EVENTS)) + .updateSerializer(PlayerAuthInputPacket.class, PlayerAuthInputSerializer_v944.INSTANCE) + .updateSerializer(StartGamePacket.class, StartGameSerializer_v944.INSTANCE) + .updateSerializer(UpdateClientInputLocksPacket.class, UpdateClientInputLocksSerializer_v944.INSTANCE) + .updateSerializer(VoxelShapesPacket.class, VoxelShapesSerializer_v944.INSTANCE) + .registerPacket(ResourcePacksReadyForValidationPacket::new, ResourcePacksReadyForValidationSerializer_v944.INSTANCE, 340, PacketRecipient.SERVER) + .registerPacket(LocatorBarPacket::new, LocatorBarSerializer_v944.INSTANCE, 341, PacketRecipient.CLIENT) + .registerPacket(PartyChangedPacket::new, PartyChangedSerializer_v944.INSTANCE, 342, PacketRecipient.SERVER) + .registerPacket(ServerboundDataDrivenScreenClosedPacket::new, ServerboundDataDrivenScreenClosedSerializer_v944.INSTANCE, 343, PacketRecipient.SERVER) + .registerPacket(SyncWorldClocksPacket::new, SyncWorldClocksSerializer_v944.INSTANCE, 344, PacketRecipient.CLIENT) + .registerPacket(ClientboundAttributeLayerSyncPacket::new, ClientboundAttributeLayerSyncSerializer_v944.INSTANCE, 345, PacketRecipient.CLIENT) + .build(); +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/CameraInstructionSerializer_v944.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/CameraInstructionSerializer_v944.java new file mode 100644 index 0000000..7cd31bb --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/CameraInstructionSerializer_v944.java @@ -0,0 +1,76 @@ +package org.cloudburstmc.protocol.bedrock.codec.v944.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.math.vector.Vector3f; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v924.serializer.CameraInstructionSerializer_v924; +import org.cloudburstmc.protocol.bedrock.data.camera.*; + +import java.util.ArrayList; +import java.util.List; + +public class CameraInstructionSerializer_v944 extends CameraInstructionSerializer_v924 { + + public static final CameraInstructionSerializer_v944 INSTANCE = new CameraInstructionSerializer_v944(); + + @Override + protected void writeSplineInstruction(ByteBuf buffer, BedrockCodecHelper helper, CameraSplineInstruction splineInstruction) { + buffer.writeFloatLE(splineInstruction.getTotalTime()); + buffer.writeByte(splineInstruction.getType().ordinal()); + helper.writeArray(buffer, splineInstruction.getCurve(), helper::writeVector3f); + helper.writeArray(buffer, splineInstruction.getProgressKeyFrames(), (buf2, frame) -> { + buf2.writeFloatLE(frame.getValue()); + buf2.writeFloatLE(frame.getTime()); + helper.writeString(buf2, frame.getEase().getSerializeName()); + }); + helper.writeArray(buffer, splineInstruction.getRotationOption(), (buf2, rotationOption) -> { + helper.writeVector3f(buf2, rotationOption.getKeyFrameValues()); + buf2.writeFloatLE(rotationOption.getKeyFrameTimes()); + helper.writeString(buf2, rotationOption.getEase().getSerializeName()); + }); + helper.writeString(buffer, splineInstruction.getSplineIdentifier()); + buffer.writeBoolean(splineInstruction.isLoadFromJson()); + } + + @Override + protected CameraSplineInstruction readSplineInstruction(ByteBuf buffer, BedrockCodecHelper helper) { + float totalTime = buffer.readFloatLE(); + CameraSplineType type = CameraSplineType.values()[buffer.readUnsignedByte()]; + List curve = new ArrayList<>(); + helper.readArray(buffer, curve, helper::readVector3f); + List progressKeyFrames = new ArrayList<>(); + helper.readArray(buffer, progressKeyFrames, buf2 -> { + float value = buf2.readFloatLE(); + float time = buf2.readFloatLE(); + CameraEase ease = CameraEase.fromName(helper.readString(buf2)); + return new CameraSplineInstruction.SplineProgressOption(value, time, ease); + }); + List rotationOption = new ArrayList<>(); + helper.readArray(buffer, rotationOption, buf2 -> { + Vector3f keyFrameValues = helper.readVector3f(buf2); + float keyFrameTimes = buf2.readFloatLE(); + CameraEase ease = CameraEase.fromName(helper.readString(buf2)); + return new CameraSplineInstruction.SplineRotationOption(keyFrameValues, keyFrameTimes, ease); + }); + String splineIdentifier = helper.readString(buffer); + boolean loadFromJson = buffer.readBoolean(); + return new CameraSplineInstruction(totalTime, type, curve, progressKeyFrames, rotationOption, splineIdentifier, loadFromJson); + } + + @Override + protected void writeFovInstruction(ByteBuf buffer, BedrockCodecHelper helper, CameraFovInstruction fovInstruction) { + buffer.writeFloatLE(fovInstruction.getFov()); + buffer.writeFloatLE(fovInstruction.getEaseTime()); + helper.writeString(buffer, fovInstruction.getEaseType().getSerializeName()); + buffer.writeBoolean(fovInstruction.isClear()); + } + + @Override + protected CameraFovInstruction readFovInstruction(ByteBuf buffer, BedrockCodecHelper helper) { + float fow = buffer.readFloatLE(); + float easeTime = buffer.readFloatLE(); + CameraEase easeType = CameraEase.fromName(helper.readString(buffer)); + boolean fovClear = buffer.readBoolean(); + return new CameraFovInstruction(fow, easeTime, easeType, fovClear); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/CameraSplineSerializer_v944.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/CameraSplineSerializer_v944.java new file mode 100644 index 0000000..77e02d3 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/CameraSplineSerializer_v944.java @@ -0,0 +1,73 @@ +package org.cloudburstmc.protocol.bedrock.codec.v944.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.math.vector.Vector3f; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v924.serializer.CameraSplineSerializer_v924; +import org.cloudburstmc.protocol.bedrock.data.camera.CameraEase; +import org.cloudburstmc.protocol.bedrock.data.camera.CameraSplineDefinition; +import org.cloudburstmc.protocol.bedrock.data.camera.CameraSplineInstruction; +import org.cloudburstmc.protocol.bedrock.data.camera.CameraSplineType; +import org.cloudburstmc.protocol.bedrock.packet.CameraSplinePacket; + +import java.util.ArrayList; +import java.util.List; + +public class CameraSplineSerializer_v944 extends CameraSplineSerializer_v924 { + + public static final CameraSplineSerializer_v944 INSTANCE = new CameraSplineSerializer_v944(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, CameraSplinePacket packet) { + helper.writeArray(buffer, packet.getSplines(), (buf, spline) -> { + helper.writeString(buf, spline.getName()); + buf.writeFloatLE(spline.getInstruction().getTotalTime()); + helper.writeString(buf, spline.getInstruction().getType().getSerializeName()); + helper.writeArray(buf, spline.getInstruction().getCurve(), helper::writeVector3f); + helper.writeArray(buf, spline.getInstruction().getProgressKeyFrames(), (buf2, frame) -> { + buf2.writeFloatLE(frame.getValue()); + buf2.writeFloatLE(frame.getTime()); + helper.writeString(buf2, frame.getEase().getSerializeName()); + }); + helper.writeArray(buf, spline.getInstruction().getRotationOption(), (buf2, rotationOption) -> { + helper.writeVector3f(buf2, rotationOption.getKeyFrameValues()); + buf2.writeFloatLE(rotationOption.getKeyFrameTimes()); + helper.writeString(buf2, rotationOption.getEase().getSerializeName()); + }); + helper.writeString(buffer, spline.getInstruction().getSplineIdentifier()); + buffer.writeBoolean(spline.getInstruction().isLoadFromJson()); + }); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, CameraSplinePacket packet) { + List splines = new ArrayList<>(); + + helper.readArray(buffer, splines, (buf, h) -> { + String name = helper.readString(buf); + float totalTime = buf.readFloatLE(); + CameraSplineType type = CameraSplineType.fromName(helper.readString(buf)); + List curve = new ArrayList<>(); + helper.readArray(buf, curve, helper::readVector3f); + List progressKeyFrames = new ArrayList<>(); + helper.readArray(buf, progressKeyFrames, buf2 -> { + float value = buf2.readFloatLE(); + float time = buf2.readFloatLE(); + CameraEase ease = CameraEase.fromName(helper.readString(buf2)); + return new CameraSplineInstruction.SplineProgressOption(value, time, ease); + }); + List rotationOption = new ArrayList<>(); + helper.readArray(buf, rotationOption, buf2 -> { + Vector3f keyFrameValues = helper.readVector3f(buf2); + float keyFrameTimes = buf2.readFloatLE(); + CameraEase ease = CameraEase.fromName(helper.readString(buf2)); + return new CameraSplineInstruction.SplineRotationOption(keyFrameValues, keyFrameTimes, ease); + }); + String splineIdentifier = helper.readString(buffer); + boolean loadFromJson = buffer.readBoolean(); + return new CameraSplineDefinition(name, new CameraSplineInstruction(totalTime, type, curve, progressKeyFrames, rotationOption, splineIdentifier, loadFromJson)); + }); + + packet.setSplines(splines); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ClientboundAttributeLayerSyncSerializer_v944.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ClientboundAttributeLayerSyncSerializer_v944.java new file mode 100644 index 0000000..068e038 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ClientboundAttributeLayerSyncSerializer_v944.java @@ -0,0 +1,276 @@ +package org.cloudburstmc.protocol.bedrock.codec.v944.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.data.attributelayer.*; +import org.cloudburstmc.protocol.bedrock.data.camera.CameraEase; +import org.cloudburstmc.protocol.bedrock.packet.ClientboundAttributeLayerSyncPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class ClientboundAttributeLayerSyncSerializer_v944 implements BedrockPacketSerializer { + + public static final ClientboundAttributeLayerSyncSerializer_v944 INSTANCE = new ClientboundAttributeLayerSyncSerializer_v944(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundAttributeLayerSyncPacket packet) { + AttributeLayerSyncPayload data = packet.getData(); + + if (data instanceof UpdateAttributeLayersData) { + VarInts.writeUnsignedInt(buffer, 0); + writeUpdateAttributeLayers(buffer, helper, (UpdateAttributeLayersData) data); + } else if (data instanceof UpdateAttributeLayerSettingsData) { + VarInts.writeUnsignedInt(buffer, 1); + writeUpdateAttributeLayerSettings(buffer, helper, (UpdateAttributeLayerSettingsData) data); + } else if (data instanceof UpdateEnvironmentAttributesData) { + VarInts.writeUnsignedInt(buffer, 2); + writeUpdateEnvironmentAttributes(buffer, helper, (UpdateEnvironmentAttributesData) data); + } else if (data instanceof RemoveEnvironmentAttributesData) { + VarInts.writeUnsignedInt(buffer, 3); + writeRemoveEnvironmentAttributes(buffer, helper, (RemoveEnvironmentAttributesData) data); + } else { + throw new IllegalArgumentException("Not oneOf"); + } + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundAttributeLayerSyncPacket packet) { + int type = VarInts.readUnsignedInt(buffer); + + switch (type) { + case 0: + packet.setData(readUpdateAttributeLayers(buffer, helper)); + return; + case 1: + packet.setData(readUpdateAttributeLayerSettings(buffer, helper)); + return; + case 2: + packet.setData(readUpdateEnvironmentAttributes(buffer, helper)); + return; + case 3: + packet.setData(readRemoveEnvironmentAttributes(buffer, helper)); + return; + } + + throw new IllegalArgumentException(type + " is not oneOf"); + } + + protected void writeUpdateAttributeLayers(ByteBuf buf, BedrockCodecHelper helper, UpdateAttributeLayersData data) { + List layers = data.getAttributeLayers(); + helper.writeArray(buf, layers, (b, layer) -> { + helper.writeString(b, layer.getLayerName()); + VarInts.writeInt(b, layer.getDimension()); + writeAttributeLayerSettings(b, helper, layer.getSettings()); + helper.writeArray(b, layer.getAttributes(), (bb, attr) -> + writeEnvironmentAttribute(bb, helper, attr)); + }); + } + + protected UpdateAttributeLayersData readUpdateAttributeLayers(ByteBuf buf, BedrockCodecHelper helper) { + List layers = new ArrayList<>(); + helper.readArray(buf, layers, b -> { + String name = helper.readStringMaxLen(buf, 128); + int dim = VarInts.readInt(b); + AttributeLayerSettings settings = readAttributeLayerSettings(b, helper); + + List attrs = new ArrayList<>(); + helper.readArray(b, attrs, bb -> readEnvironmentAttribute(bb, helper), 1024); + + return new AttributeLayerData(name, null, dim, settings, attrs); + }, 512); + return new UpdateAttributeLayersData(layers); + } + + private void writeUpdateAttributeLayerSettings(ByteBuf buf, BedrockCodecHelper helper, UpdateAttributeLayerSettingsData data) { + helper.writeString(buf, data.getLayerName()); + VarInts.writeInt(buf, data.getDimension()); + writeAttributeLayerSettings(buf, helper, data.getSettings()); + } + + private UpdateAttributeLayerSettingsData readUpdateAttributeLayerSettings(ByteBuf buf, BedrockCodecHelper helper) { + String name = helper.readStringMaxLen(buf, 128); + int dim = VarInts.readInt(buf); + AttributeLayerSettings settings = readAttributeLayerSettings(buf, helper); + return new UpdateAttributeLayerSettingsData(name, dim, settings); + } + + private void writeUpdateEnvironmentAttributes(ByteBuf buf, BedrockCodecHelper helper, UpdateEnvironmentAttributesData data) { + helper.writeString(buf, data.getLayerName()); + VarInts.writeInt(buf, data.getDimension()); + helper.writeArray(buf, data.getAttributes(), (b, attr) -> + writeEnvironmentAttribute(b, helper, attr)); + } + + private UpdateEnvironmentAttributesData readUpdateEnvironmentAttributes(ByteBuf buf, BedrockCodecHelper helper) { + String name = helper.readStringMaxLen(buf, 128); + int dim = VarInts.readInt(buf); + List attrs = new ArrayList<>(); + helper.readArray(buf, attrs, b -> readEnvironmentAttribute(b, helper), 1024); + return new UpdateEnvironmentAttributesData(name, dim, attrs); + } + + private void writeRemoveEnvironmentAttributes(ByteBuf buf, BedrockCodecHelper helper, RemoveEnvironmentAttributesData data) { + helper.writeString(buf, data.getLayerName()); + VarInts.writeInt(buf, data.getDimension()); + helper.writeArray(buf, data.getAttributes(), helper::writeString); + } + + private RemoveEnvironmentAttributesData readRemoveEnvironmentAttributes(ByteBuf buf, BedrockCodecHelper helper) { + String name = helper.readStringMaxLen(buf, 128); + int dim = VarInts.readInt(buf); + List attrs = new ArrayList<>(); + helper.readArray(buf, attrs, helper::readString, 1024); + return new RemoveEnvironmentAttributesData(name, dim, attrs); + } + + protected void writeAttributeLayerSettings(ByteBuf buf, BedrockCodecHelper helper, AttributeLayerSettings s) { + buf.writeIntLE(s.getPriority()); + writeWeight(buf, helper, s.getWeight()); + buf.writeBoolean(s.isEnabled()); + buf.writeBoolean(s.isTransitionsPaused()); + } + + protected AttributeLayerSettings readAttributeLayerSettings(ByteBuf buf, BedrockCodecHelper helper) { + int priority = buf.readIntLE(); + AttributeLayerSettings.Weight weight = readWeight(buf, helper); + boolean enabled = buf.readBoolean(); + boolean paused = buf.readBoolean(); + return new AttributeLayerSettings(priority, weight, enabled, paused); + } + + protected void writeWeight(ByteBuf buf, BedrockCodecHelper helper, AttributeLayerSettings.Weight w) { + if (w instanceof AttributeLayerSettings.FloatWeight) { + VarInts.writeUnsignedInt(buf, 0); + buf.writeFloatLE(((AttributeLayerSettings.FloatWeight) w).getValue()); + } else if (w instanceof AttributeLayerSettings.StringWeight) { + VarInts.writeUnsignedInt(buf, 1); + helper.writeString(buf, ((AttributeLayerSettings.StringWeight) w).getValue()); + } else { + throw new IllegalArgumentException("Unknown Weight: " + w); + } + } + + protected AttributeLayerSettings.Weight readWeight(ByteBuf buf, BedrockCodecHelper helper) { + int type = VarInts.readUnsignedInt(buf); + switch (type) { + case 0: + return new AttributeLayerSettings.FloatWeight(buf.readFloatLE()); + case 1: + return new AttributeLayerSettings.StringWeight(helper.readString(buf)); + } + throw new IllegalArgumentException("Unknown Weight type: " + type); + } + + protected void writeEnvironmentAttribute(ByteBuf buf, BedrockCodecHelper helper, EnvironmentAttributeData e) { + helper.writeString(buf, e.getAttributeName()); + helper.writeOptionalNull(buf, e.getFrom(), (b, attr) -> writeAttributeData(b, helper, attr)); + writeAttributeData(buf, helper, e.getAttribute()); + helper.writeOptionalNull(buf, e.getTo(), (b, attr) -> writeAttributeData(b, helper, attr)); + buf.writeIntLE(e.getCurrentTransitionTicks()); + buf.writeIntLE(e.getTotalTransitionTicks()); + helper.writeString(buf, e.getEasing().getSerializeName()); + } + + protected EnvironmentAttributeData readEnvironmentAttribute(ByteBuf buf, BedrockCodecHelper helper) { + String name = helper.readStringMaxLen(buf, 128); + + AttributeData from = helper.readOptional(buf, null, b -> readAttributeData(b, helper)); + AttributeData attribute = readAttributeData(buf, helper); + AttributeData to = helper.readOptional(buf, null, b -> readAttributeData(b, helper)); + + int currentTicks = (int) buf.readUnsignedIntLE(); + int totalTicks = (int) buf.readUnsignedIntLE(); + + CameraEase easing = CameraEase.fromName(helper.readString(buf)); + + return new EnvironmentAttributeData(name, from, attribute, to, currentTicks, totalTicks, easing, 0, false); + } + + private static final List BOOL_OPERATIONS = Arrays.asList("override", "alpha_blend", "and", "nand", "or", "nor", "xor", "xnor"); + private static final List FLOAT_OPERATIONS = Arrays.asList("override", "alpha_blend", "add", "subtract", "multiply", "minimum", "maximum"); + private static final List COLOR_OPERATIONS = Arrays.asList("override", "alpha_blend", "add", "subtract", "multiply"); + + private void writeAttributeData(ByteBuf buf, BedrockCodecHelper helper, AttributeData data) { + if (data instanceof BoolAttributeData) { + BoolAttributeData at = (BoolAttributeData) data; + VarInts.writeUnsignedInt(buf, 0); + buf.writeBoolean(at.isValue()); + helper.writeString(buf, BOOL_OPERATIONS.get(at.getOperation().ordinal())); + } else if (data instanceof FloatAttributeData) { + FloatAttributeData at = (FloatAttributeData) data; + VarInts.writeUnsignedInt(buf, 1); + buf.writeFloatLE(at.getValue()); + helper.writeString(buf, FLOAT_OPERATIONS.get(at.getOperation().ordinal())); + helper.writeOptionalNull(buf, at.getConstraintMin(), ByteBuf::writeFloatLE); + helper.writeOptionalNull(buf, at.getConstraintMax(), ByteBuf::writeFloatLE); + } else if (data instanceof ColorAttributeData) { + ColorAttributeData at = (ColorAttributeData) data; + VarInts.writeUnsignedInt(buf, 2); + writeColor255(buf, helper, at.getValue()); + helper.writeString(buf, COLOR_OPERATIONS.get(at.getOperation().ordinal())); + } else { + throw new IllegalArgumentException("Unknown AttributeData: " + data); + } + } + + protected AttributeData readAttributeData(ByteBuf buf, BedrockCodecHelper helper) { + int type = VarInts.readUnsignedInt(buf); + switch (type) { + case 0: + return new BoolAttributeData( + buf.readBoolean(), + BoolAttributeData.Operation.values()[BOOL_OPERATIONS.indexOf(helper.readString(buf))] + ); + case 1: + return new FloatAttributeData( + buf.readFloatLE(), + FloatAttributeData.Operation.values()[FLOAT_OPERATIONS.indexOf(helper.readString(buf))], + helper.readOptional(buf, null, ByteBuf::readFloatLE), + helper.readOptional(buf, null, ByteBuf::readFloatLE) + ); + case 2: + return new ColorAttributeData( + readColor255(buf, helper), + ColorAttributeData.Operation.values()[COLOR_OPERATIONS.indexOf(helper.readString(buf))] + ); + } + throw new IllegalArgumentException("Unknown AttributeData type: " + type); + } + + private void writeColor255(ByteBuf buf, BedrockCodecHelper helper, ColorAttributeData.Color255RGBA c) { + if (c instanceof ColorAttributeData.StringColor) { + VarInts.writeUnsignedInt(buf, 0); + helper.writeString(buf, ((ColorAttributeData.StringColor) c).getValue()); + } else if (c instanceof ColorAttributeData.ArrayColor) { + VarInts.writeUnsignedInt(buf, 1); + int[] v = ((ColorAttributeData.ArrayColor) c).getValue(); + for (int i = 0; i < 4; i++) { + buf.writeIntLE(v[i]); + } + } else { + throw new IllegalArgumentException("Unknown Color255RGBA: " + c); + } + } + + private ColorAttributeData.Color255RGBA readColor255(ByteBuf buf, BedrockCodecHelper helper) { + int type = VarInts.readUnsignedInt(buf); + switch (type) { + case 0: + return new ColorAttributeData.StringColor(helper.readString(buf)); + case 1: + int[] v = new int[4]; + for (int i = 0; i < 4; i++) { + v[i] = buf.readIntLE(); + } + return new ColorAttributeData.ArrayColor(v); + } + throw new IllegalArgumentException("Unknown Color255RGBA type: " + type); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ClientboundDataDrivenUICloseScreenSerializer_v944.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ClientboundDataDrivenUICloseScreenSerializer_v944.java new file mode 100644 index 0000000..9680dfb --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ClientboundDataDrivenUICloseScreenSerializer_v944.java @@ -0,0 +1,24 @@ +package org.cloudburstmc.protocol.bedrock.codec.v944.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.packet.ClientboundDataDrivenUICloseScreenPacket; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class ClientboundDataDrivenUICloseScreenSerializer_v944 implements BedrockPacketSerializer { + + public static final ClientboundDataDrivenUICloseScreenSerializer_v944 INSTANCE = new ClientboundDataDrivenUICloseScreenSerializer_v944(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDataDrivenUICloseScreenPacket packet) { + helper.writeOptionalNull(buffer, packet.getFormId(), ByteBuf::writeIntLE); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDataDrivenUICloseScreenPacket packet) { + packet.setFormId(helper.readOptional(buffer, null, (buf, h) -> buf.readIntLE())); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ClientboundDataDrivenUIShowScreenSerializer_v944.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ClientboundDataDrivenUIShowScreenSerializer_v944.java new file mode 100644 index 0000000..44ce207 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ClientboundDataDrivenUIShowScreenSerializer_v944.java @@ -0,0 +1,28 @@ +package org.cloudburstmc.protocol.bedrock.codec.v944.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v924.serializer.ClientboundDataDrivenUIShowScreenSerializer_v924; +import org.cloudburstmc.protocol.bedrock.packet.ClientboundDataDrivenUIShowScreenPacket; + +public class ClientboundDataDrivenUIShowScreenSerializer_v944 extends ClientboundDataDrivenUIShowScreenSerializer_v924 { + + public static final ClientboundDataDrivenUIShowScreenSerializer_v944 INSTANCE = new ClientboundDataDrivenUIShowScreenSerializer_v944(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDataDrivenUIShowScreenPacket packet) { + super.serialize(buffer, helper, packet); + + buffer.writeIntLE(packet.getFormId()); + helper.writeOptionalNull(buffer, packet.getDataInstanceId(), ByteBuf::writeIntLE); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDataDrivenUIShowScreenPacket packet) { + super.deserialize(buffer, helper, packet); + + packet.setFormId((int) buffer.readUnsignedIntLE()); + Long id = helper.readOptional(buffer, null, ByteBuf::readUnsignedIntLE); + packet.setDataInstanceId(id == null ? null : id.intValue()); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/LocatorBarSerializer_v944.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/LocatorBarSerializer_v944.java new file mode 100644 index 0000000..30a4cda --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/LocatorBarSerializer_v944.java @@ -0,0 +1,70 @@ +package org.cloudburstmc.protocol.bedrock.codec.v944.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.data.LocatorBarWaypoint; +import org.cloudburstmc.protocol.bedrock.packet.LocatorBarPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +import java.awt.Color; +import java.util.UUID; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class LocatorBarSerializer_v944 implements BedrockPacketSerializer { + + public static final LocatorBarSerializer_v944 INSTANCE = new LocatorBarSerializer_v944(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, LocatorBarPacket packet) { + helper.writeArray(buffer, packet.getWaypoints(), (buf, payload) -> writePayload(buf, helper, payload)); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, LocatorBarPacket packet) { + helper.readArray(buffer, packet.getWaypoints(), buf -> readPayload(buf, helper), 40000); + } + + private void writePayload(ByteBuf buf, BedrockCodecHelper helper, LocatorBarPacket.Payload payload) { + helper.writeUuid(buf, payload.getGroupHandle()); + writeWaypoint(buf, helper, payload.getWaypoint()); + buf.writeByte(payload.getActionFlag().ordinal()); + } + + private LocatorBarPacket.Payload readPayload(ByteBuf buf, BedrockCodecHelper helper) { + UUID groupHandle = helper.readUuid(buf); + LocatorBarWaypoint waypoint = readWaypoint(buf, helper); + LocatorBarPacket.Action actionFlag = LocatorBarPacket.Action.values()[buf.readUnsignedByte()]; + return new LocatorBarPacket.Payload(actionFlag, groupHandle, waypoint); + } + + protected void writeWaypoint(ByteBuf buf, BedrockCodecHelper helper, LocatorBarWaypoint waypoint) { + buf.writeIntLE(waypoint.getUpdateFlag()); + helper.writeOptionalNull(buf, waypoint.getVisible(), ByteBuf::writeBoolean); + helper.writeOptionalNull(buf, waypoint.getWorldPosition(), (buf1, h, pos) -> { + h.writeVector3f(buf1, pos.getPosition()); + VarInts.writeInt(buf1, pos.getDimension()); + }); + helper.writeOptionalNull(buf, waypoint.getTextureId(), ByteBuf::writeIntLE); + helper.writeOptionalNull(buf, waypoint.getColor(), (buf1, h, c) -> buf1.writeIntLE(c.getRGB())); + helper.writeOptionalNull(buf, waypoint.getClientPositionAuthority(), ByteBuf::writeBoolean); + helper.writeOptionalNull(buf, waypoint.getEntityUniqueId(), VarInts::writeLong); + } + + protected LocatorBarWaypoint readWaypoint(ByteBuf buf, BedrockCodecHelper helper) { + LocatorBarWaypoint waypoint = new LocatorBarWaypoint(); + waypoint.setUpdateFlag((int) buf.readUnsignedIntLE()); + waypoint.setVisible(helper.readOptional(buf, null, ByteBuf::readBoolean)); + waypoint.setWorldPosition(helper.readOptional(buf, null, (buf1, h) -> + new LocatorBarWaypoint.WorldPosition(h.readVector3f(buf1), VarInts.readInt(buf1)))); + Long id = helper.readOptional(buf, null, ByteBuf::readUnsignedIntLE); + waypoint.setTextureId(id == null ? null : id.intValue()); + waypoint.setColor(helper.readOptional(buf, null, (buf1, h) -> + new Color(buf1.readIntLE(), true))); + waypoint.setClientPositionAuthority(helper.readOptional(buf, null, ByteBuf::readBoolean)); + waypoint.setEntityUniqueId(helper.readOptional(buf, null, VarInts::readLong)); + return waypoint; + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/PartyChangedSerializer_v944.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/PartyChangedSerializer_v944.java new file mode 100644 index 0000000..09395b3 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/PartyChangedSerializer_v944.java @@ -0,0 +1,32 @@ +package org.cloudburstmc.protocol.bedrock.codec.v944.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.packet.PartyChangedPacket; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class PartyChangedSerializer_v944 implements BedrockPacketSerializer { + + public static final PartyChangedSerializer_v944 INSTANCE = new PartyChangedSerializer_v944(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, PartyChangedPacket packet) { + helper.writeOptionalNull(buffer, packet.getParty(), this::writeParty); + } + + protected void writeParty(ByteBuf buffer, BedrockCodecHelper helper, PartyChangedPacket.PartyInfo info) { + helper.writeString(buffer, info.getPartyId()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, PartyChangedPacket packet) { + packet.setParty(helper.readOptional(buffer, null, this::readParty)); + } + + protected PartyChangedPacket.PartyInfo readParty(ByteBuf buffer, BedrockCodecHelper helper) { + return new PartyChangedPacket.PartyInfo(helper.readString(buffer), false); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/PlayerAuthInputSerializer_v944.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/PlayerAuthInputSerializer_v944.java new file mode 100644 index 0000000..1c196bb --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/PlayerAuthInputSerializer_v944.java @@ -0,0 +1,28 @@ +package org.cloudburstmc.protocol.bedrock.codec.v944.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v766.serializer.PlayerAuthInputSerializer_v766; +import org.cloudburstmc.protocol.bedrock.data.inventory.transaction.ItemUseTransaction; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class PlayerAuthInputSerializer_v944 extends PlayerAuthInputSerializer_v766 { + + public static final PlayerAuthInputSerializer_v944 INSTANCE = new PlayerAuthInputSerializer_v944(); + + @Override + protected void writeItemUseTransaction(ByteBuf buffer, BedrockCodecHelper helper, ItemUseTransaction transaction) { + super.writeItemUseTransaction(buffer, helper, transaction); + + buffer.writeByte(transaction.getClientCooldownState()); + } + + @Override + protected ItemUseTransaction readItemUseTransaction(ByteBuf buffer, BedrockCodecHelper helper) { + ItemUseTransaction itemTransaction = super.readItemUseTransaction(buffer, helper); + itemTransaction.setClientCooldownState(buffer.readByte()); + return itemTransaction; + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ResourcePacksReadyForValidationSerializer_v944.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ResourcePacksReadyForValidationSerializer_v944.java new file mode 100644 index 0000000..d271c3f --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ResourcePacksReadyForValidationSerializer_v944.java @@ -0,0 +1,22 @@ +package org.cloudburstmc.protocol.bedrock.codec.v944.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.packet.ResourcePacksReadyForValidationPacket; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class ResourcePacksReadyForValidationSerializer_v944 implements BedrockPacketSerializer { + + public static final ResourcePacksReadyForValidationSerializer_v944 INSTANCE = new ResourcePacksReadyForValidationSerializer_v944(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ResourcePacksReadyForValidationPacket packet) { + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ResourcePacksReadyForValidationPacket packet) { + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ServerboundDataDrivenScreenClosedSerializer_v944.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ServerboundDataDrivenScreenClosedSerializer_v944.java new file mode 100644 index 0000000..6eac2c6 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/ServerboundDataDrivenScreenClosedSerializer_v944.java @@ -0,0 +1,34 @@ +package org.cloudburstmc.protocol.bedrock.codec.v944.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.packet.ServerboundDataDrivenScreenClosedPacket; + +import java.util.Arrays; +import java.util.List; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class ServerboundDataDrivenScreenClosedSerializer_v944 implements BedrockPacketSerializer { + + public static final ServerboundDataDrivenScreenClosedSerializer_v944 INSTANCE = new ServerboundDataDrivenScreenClosedSerializer_v944(); + + private static final List CLOSE_REASONS = Arrays.asList("programmaticclose", "programmaticcloseall", "clientcanceled", "userbusy", "invalidform"); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ServerboundDataDrivenScreenClosedPacket packet) { + buffer.writeIntLE(packet.getFormId()); + //helper.writeOptionalNull(buffer, packet.getFormId(), ByteBuf::writeIntLE); + helper.writeString(buffer, CLOSE_REASONS.get(packet.getCloseReason().ordinal())); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ServerboundDataDrivenScreenClosedPacket packet) { + packet.setFormId((int) buffer.readUnsignedIntLE()); + //Long id = helper.readOptional(buffer, null, ByteBuf::readUnsignedIntLE); + //packet.setFormId(id == null ? null : id.intValue()); + packet.setCloseReason(ServerboundDataDrivenScreenClosedPacket.CloseReason.values()[CLOSE_REASONS.indexOf(helper.readString(buffer))]); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/StartGameSerializer_v944.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/StartGameSerializer_v944.java new file mode 100644 index 0000000..c001b9e --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/StartGameSerializer_v944.java @@ -0,0 +1,66 @@ +package org.cloudburstmc.protocol.bedrock.codec.v944.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v924.serializer.StartGameSerializer_v924; +import org.cloudburstmc.protocol.bedrock.data.ClientStoreEntrypointConfiguration; +import org.cloudburstmc.protocol.bedrock.data.GatheringsConfigurationJoinInfo; +import org.cloudburstmc.protocol.bedrock.data.PresenceConfiguration; +import org.cloudburstmc.protocol.bedrock.data.ServerConfigurationJoinInfo; + +public class StartGameSerializer_v944 extends StartGameSerializer_v924 { + + public static final StartGameSerializer_v944 INSTANCE = new StartGameSerializer_v944(); + + @Override + protected void writeServerJoinInfo(ByteBuf buffer, BedrockCodecHelper helper, ServerConfigurationJoinInfo info) { + helper.writeOptionalNull(buffer, info.getGatheringsConfigurationJoinInfo(), this::writeGatheringsConfiguration); + helper.writeOptionalNull(buffer, info.getClientStoreEntrypointConfiguration(), this::writeClientStoreEntrypointConfiguration); + helper.writeOptionalNull(buffer, info.getPresenceConfiguration(), helper::writePresenceConfiguration); + } + + private void writeClientStoreEntrypointConfiguration(ByteBuf buf, BedrockCodecHelper h, ClientStoreEntrypointConfiguration store) { + h.writeString(buf, store.getStoreId()); + h.writeString(buf, store.getStoreName()); + } + + protected void writeGatheringsConfiguration(ByteBuf buf, BedrockCodecHelper h, GatheringsConfigurationJoinInfo info) { + h.writeUuid(buf, info.getExperienceId()); + h.writeString(buf, info.getExperienceName()); + h.writeUuid(buf, info.getWorldId()); + h.writeString(buf, info.getWorldName()); + h.writeString(buf, info.getCreatorId()); + h.writeUuid(buf, info.getTargetId()); + h.writeString(buf, info.getScenarioId()); + h.writeString(buf, info.getServerId()); + } + + @Override + protected ServerConfigurationJoinInfo readServerJoinInfo(ByteBuf buffer, BedrockCodecHelper helper) { + GatheringsConfigurationJoinInfo gatheringsConfigurationJoinInfo = helper.readOptional(buffer, null, this::readGatheringsConfiguration); + ClientStoreEntrypointConfiguration clientStoreEntrypointConfiguration = helper.readOptional(buffer, null, this::readClientStoreEntrypointConfiguration); + PresenceConfiguration presenceConfiguration = helper.readOptional(buffer, null, helper::readPresenceConfiguration); + + return new ServerConfigurationJoinInfo(gatheringsConfigurationJoinInfo, clientStoreEntrypointConfiguration, presenceConfiguration); + } + + private ClientStoreEntrypointConfiguration readClientStoreEntrypointConfiguration(ByteBuf buf, BedrockCodecHelper h) { + return new ClientStoreEntrypointConfiguration( + h.readString(buf), + h.readString(buf) + ); + } + + protected GatheringsConfigurationJoinInfo readGatheringsConfiguration(ByteBuf buf, BedrockCodecHelper h) { + return new GatheringsConfigurationJoinInfo( + h.readUuid(buf), + h.readString(buf), + h.readUuid(buf), + h.readString(buf), + h.readString(buf), + h.readUuid(buf), + h.readString(buf), + h.readString(buf) + ); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/SyncWorldClocksSerializer_v944.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/SyncWorldClocksSerializer_v944.java new file mode 100644 index 0000000..76f4e29 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/SyncWorldClocksSerializer_v944.java @@ -0,0 +1,149 @@ +package org.cloudburstmc.protocol.bedrock.codec.v944.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.data.clock.*; +import org.cloudburstmc.protocol.bedrock.packet.SyncWorldClocksPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +import java.util.ArrayList; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class SyncWorldClocksSerializer_v944 implements BedrockPacketSerializer { + + public static final SyncWorldClocksSerializer_v944 INSTANCE = new SyncWorldClocksSerializer_v944(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, SyncWorldClocksPacket packet) { + SyncWorldClocksPayload data = packet.getData(); + + if (data instanceof SyncStateData) { + VarInts.writeUnsignedInt(buffer, 0); + writeSyncState(buffer, helper, (SyncStateData) data); + } else if (data instanceof InitializeRegistryData) { + VarInts.writeUnsignedInt(buffer, 1); + writeInitializeRegistry(buffer, helper, (InitializeRegistryData) data); + } else if (data instanceof AddTimeMarkerData) { + VarInts.writeUnsignedInt(buffer, 2); + writeAddTimeMarker(buffer, helper, (AddTimeMarkerData) data); + } else if (data instanceof RemoveTimeMarkerData) { + VarInts.writeUnsignedInt(buffer, 3); + writeRemoveTimeMarker(buffer, helper, (RemoveTimeMarkerData) data); + } else { + throw new IllegalArgumentException("Not oneOf"); + } + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, SyncWorldClocksPacket packet) { + int type = VarInts.readUnsignedInt(buffer); + + switch (type) { + case 0: + packet.setData(readSyncState(buffer, helper)); + return; + case 1: + packet.setData(readInitializeRegistry(buffer, helper)); + return; + case 2: + packet.setData(readAddTimeMarker(buffer, helper)); + return; + case 3: + packet.setData(readRemoveTimeMarker(buffer, helper)); + return; + } + + throw new IllegalArgumentException(type + " is not oneOf"); + } + + private void writeSyncState(ByteBuf buf, BedrockCodecHelper helper, SyncStateData data) { + helper.writeArray(buf, data.getClockData(), (b, entry) -> { + VarInts.writeUnsignedLong(b, entry.getClockId()); + VarInts.writeInt(b, entry.getTime()); + b.writeBoolean(entry.isPaused()); + }); + } + + private SyncStateData readSyncState(ByteBuf buf, BedrockCodecHelper helper) { + SyncStateData data = new SyncStateData(new ArrayList<>()); + + helper.readArray(buf, data.getClockData(), b -> { + long id = VarInts.readUnsignedLong(b); + int time = VarInts.readInt(b); + boolean paused = b.readBoolean(); + return new SyncWorldClockStateData(id, time, paused); + }, 256); + + return data; + } + + private void writeInitializeRegistry(ByteBuf buf, BedrockCodecHelper helper, InitializeRegistryData data) { + helper.writeArray(buf, data.getClockData(), (b, entry) -> { + VarInts.writeUnsignedLong(b, entry.getId()); + helper.writeString(b, entry.getName()); + VarInts.writeInt(b, entry.getTime()); + b.writeBoolean(entry.isPaused()); + + helper.writeArray(b, entry.getTimeMarkers(), (bb, marker) -> writeTimeMarker(bb, helper, marker)); + }); + } + + private void writeTimeMarker(ByteBuf buf, BedrockCodecHelper helper, TimeMarkerData marker) { + VarInts.writeUnsignedLong(buf, marker.getId()); + helper.writeString(buf, marker.getName()); + VarInts.writeInt(buf, marker.getTime()); + helper.writeOptionalNull(buf, marker.getPeriod(), ByteBuf::writeIntLE); + } + + private TimeMarkerData readTimeMarker(ByteBuf buf, BedrockCodecHelper helper) { + long markerId = VarInts.readUnsignedLong(buf); + String markerName = helper.readStringMaxLen(buf, 128); + int markerTime = VarInts.readInt(buf); + Integer period = helper.readOptional(buf, null, ByteBuf::readIntLE); + return new TimeMarkerData(markerId, markerName, markerTime, period); + } + + private InitializeRegistryData readInitializeRegistry(ByteBuf buf, BedrockCodecHelper helper) { + InitializeRegistryData data = new InitializeRegistryData(new ArrayList<>()); + + helper.readArray(buf, data.getClockData(), b -> { + long id = VarInts.readUnsignedLong(b); + String name = helper.readStringMaxLen(b, 128); + int time = VarInts.readInt(b); + boolean paused = b.readBoolean(); + + WorldClockData clock = new WorldClockData(id, name, time, paused, new ArrayList<>()); + + helper.readArray(b, clock.getTimeMarkers(), bb -> readTimeMarker(bb, helper), 256); + + return clock; + }, 256); + + return data; + } + + private void writeAddTimeMarker(ByteBuf buf, BedrockCodecHelper helper, AddTimeMarkerData data) { + VarInts.writeUnsignedLong(buf, data.getClockId()); + helper.writeArray(buf, data.getTimeMarkers(), (b, marker) -> writeTimeMarker(b, helper, marker)); + } + + private AddTimeMarkerData readAddTimeMarker(ByteBuf buf, BedrockCodecHelper helper) { + AddTimeMarkerData data = new AddTimeMarkerData(VarInts.readUnsignedLong(buf), new ArrayList<>()); + helper.readArray(buf, data.getTimeMarkers(), b -> readTimeMarker(b, helper), 256); + return data; + } + + private void writeRemoveTimeMarker(ByteBuf buf, BedrockCodecHelper helper, RemoveTimeMarkerData data) { + VarInts.writeUnsignedLong(buf, data.getClockId()); + helper.writeArray(buf, data.getTimeMarkerIds(), VarInts::writeUnsignedLong); + } + + private RemoveTimeMarkerData readRemoveTimeMarker(ByteBuf buf, BedrockCodecHelper helper) { + RemoveTimeMarkerData data = new RemoveTimeMarkerData(VarInts.readUnsignedLong(buf)); + helper.readArray(buf, data.getTimeMarkerIds(), VarInts::readUnsignedLong, 256); + return data; + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/UpdateClientInputLocksSerializer_v944.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/UpdateClientInputLocksSerializer_v944.java new file mode 100644 index 0000000..9add315 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/UpdateClientInputLocksSerializer_v944.java @@ -0,0 +1,22 @@ +package org.cloudburstmc.protocol.bedrock.codec.v944.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v560.serializer.UpdateClientInputLocksSerializer_v560; +import org.cloudburstmc.protocol.bedrock.packet.UpdateClientInputLocksPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +public class UpdateClientInputLocksSerializer_v944 extends UpdateClientInputLocksSerializer_v560 { + + public static final UpdateClientInputLocksSerializer_v944 INSTANCE = new UpdateClientInputLocksSerializer_v944(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, UpdateClientInputLocksPacket packet) { + VarInts.writeUnsignedInt(buffer, packet.getLockComponentData()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, UpdateClientInputLocksPacket packet) { + packet.setLockComponentData(VarInts.readUnsignedInt(buffer)); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/VoxelShapesSerializer_v944.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/VoxelShapesSerializer_v944.java new file mode 100644 index 0000000..7978165 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v944/serializer/VoxelShapesSerializer_v944.java @@ -0,0 +1,25 @@ +package org.cloudburstmc.protocol.bedrock.codec.v944.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v924.serializer.VoxelShapesSerializer_v924; +import org.cloudburstmc.protocol.bedrock.packet.VoxelShapesPacket; + +public class VoxelShapesSerializer_v944 extends VoxelShapesSerializer_v924 { + + public static final VoxelShapesSerializer_v944 INSTANCE = new VoxelShapesSerializer_v944(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, VoxelShapesPacket packet) { + super.serialize(buffer, helper, packet); + + buffer.writeShortLE(packet.getCustomShapeCount()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, VoxelShapesPacket packet) { + super.deserialize(buffer, helper, packet); + + packet.setCustomShapeCount(buffer.readUnsignedShortLE()); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/BedrockCodecHelper_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/BedrockCodecHelper_v975.java new file mode 100644 index 0000000..6902e94 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/BedrockCodecHelper_v975.java @@ -0,0 +1,185 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.ByteBufUtil; +import org.cloudburstmc.nbt.NBTInputStream; +import org.cloudburstmc.nbt.NBTOutputStream; +import org.cloudburstmc.nbt.NbtMap; +import org.cloudburstmc.protocol.bedrock.codec.EntityDataTypeMap; +import org.cloudburstmc.protocol.bedrock.codec.v944.BedrockCodecHelper_v944; +import org.cloudburstmc.protocol.bedrock.data.Ability; +import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; +import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; +import org.cloudburstmc.protocol.bedrock.data.inventory.itemstack.request.TextProcessingEventOrigin; +import org.cloudburstmc.protocol.bedrock.data.inventory.itemstack.request.action.ItemStackRequestActionType; +import org.cloudburstmc.protocol.common.util.TypeMap; +import org.cloudburstmc.protocol.common.util.VarInts; +import org.cloudburstmc.protocol.common.util.stream.LittleEndianByteBufInputStream; +import org.cloudburstmc.protocol.common.util.stream.LittleEndianByteBufOutputStream; + +import java.io.IOException; + +import static java.util.Objects.requireNonNull; +import static org.cloudburstmc.protocol.common.util.Preconditions.checkArgument; + +public class BedrockCodecHelper_v975 extends BedrockCodecHelper_v944 { + + public BedrockCodecHelper_v975(EntityDataTypeMap entityData, TypeMap> gameRulesTypes, TypeMap stackRequestActionTypes, + TypeMap containerSlotTypes, TypeMap abilities, TypeMap textProcessingEventOrigins) { + super(entityData, gameRulesTypes, stackRequestActionTypes, containerSlotTypes, abilities, textProcessingEventOrigins); + } + + @Override + public ItemData readNetworkItemStackDescriptor(ByteBuf buffer) { + int runtimeId = buffer.readShortLE(); + + ItemDefinition definition = runtimeId == 0 ? ItemDefinition.AIR : this.itemDefinitions.getDefinition(runtimeId); + int count = buffer.readUnsignedShortLE(); + int aux = VarInts.readUnsignedInt(buffer); + + int netId = 0; + boolean hasNetId = buffer.readBoolean(); + + if (hasNetId) { + int netIdVariant = VarInts.readUnsignedInt(buffer); + + switch (netIdVariant) { + case 0: // ItemStackNetId + case 1: // ItemStackRequestId + case 2: // ItemStackLegacyRequestId + netId = VarInts.readInt(buffer); + break; + default: + throw new IllegalArgumentException("Not oneOf"); + } + } + + int blockRuntimeId = VarInts.readUnsignedInt(buffer); + + NbtMap compoundTag = null; + long blockingTicks = 0; + String[] canPlace = new String[0]; + String[] canBreak = new String[0]; + + ByteBuf buf = buffer.readSlice(VarInts.readUnsignedInt(buffer)); + + if (buf.isReadable()) { + try (LittleEndianByteBufInputStream stream = new LittleEndianByteBufInputStream(buf); + NBTInputStream nbtStream = new NBTInputStream(stream, this.encodingSettings.maxItemNBTSize())) { + int nbtSize = stream.readShort(); + + if (nbtSize > 0) { + compoundTag = (NbtMap) nbtStream.readTag(); + } else if (nbtSize == -1) { + int tagCount = stream.readUnsignedByte(); + if (tagCount != 1) throw new IllegalArgumentException("Expected 1 tag but got " + tagCount); + compoundTag = (NbtMap) nbtStream.readTag(); + } + + int maxLength = this.encodingSettings.maxListSize(); + int length = stream.readInt(); + checkArgument(maxLength <= 0 || length <= maxLength, "Tried to read %s can place entries, but maximum is %s", length, maxLength); + canPlace = new String[length]; + for (int i = 0; i < canPlace.length; i++) { + canPlace[i] = stream.readUTFMaxLen(this.encodingSettings.maxItemStackTagLength()); + } + + length = stream.readInt(); + checkArgument(maxLength <= 0 || length <= maxLength, "Tried to read %s can break entries, but maximum is %s", length, maxLength); + canBreak = new String[length]; + for (int i = 0; i < canBreak.length; i++) { + canBreak[i] = stream.readUTFMaxLen(this.encodingSettings.maxItemStackTagLength()); + } + + if (definition != null && BLOCKING_ID.equals(definition.getIdentifier())) { + blockingTicks = stream.readLong(); + } + } catch (IOException e) { + throw new IllegalStateException("Unable to read item user data", e); + } + } + + if (buf.isReadable()) { + log.info("Item user data has {} readable bytes left", buf.readableBytes()); + + if (log.isDebugEnabled()) { + log.debug("Item data:\n{}", ByteBufUtil.prettyHexDump(buf.readerIndex(0))); + } + } + + return ItemData.builder() + .definition(definition) + .damage(aux) + .count(count) + .tag(compoundTag) + .canPlace(canPlace) + .canBreak(canBreak) + .blockingTicks(blockingTicks) + .blockDefinition(runtimeId == 0 ? ItemData.AIR.getBlockDefinition() : this.blockDefinitions.getDefinition(blockRuntimeId)) + .usingNetId(hasNetId) + .netId(netId) + .build(); + } + + @Override + public void writeNetworkItemStackDescriptor(ByteBuf buffer, ItemData item) { + requireNonNull(item, "item is null!"); + + ItemDefinition definition = item.getDefinition(); + boolean air = isAir(definition); + + buffer.writeShortLE(air ? 0 : definition.getRuntimeId()); + buffer.writeShortLE(item.getCount()); + VarInts.writeUnsignedInt(buffer, item.getDamage()); + + buffer.writeBoolean(item.isUsingNetId()); + if (item.isUsingNetId()) { + VarInts.writeUnsignedInt(buffer, 0); // TODO: variant: oneOf (all read the same but is there difference in behavior?) + VarInts.writeInt(buffer, item.getNetId()); + } + + VarInts.writeUnsignedInt(buffer, air || item.getBlockDefinition() == null ? 0 : item.getBlockDefinition().getRuntimeId()); + + if (air) { + VarInts.writeUnsignedInt(buffer, 0); + } else { + ByteBuf userDataBuf = ByteBufAllocator.DEFAULT.ioBuffer(); + try (LittleEndianByteBufOutputStream stream = new LittleEndianByteBufOutputStream(userDataBuf); + NBTOutputStream nbtStream = new NBTOutputStream(stream)) { + if (item.getTag() != null) { + stream.writeShort(-1); + stream.writeByte(1); // Hardcoded in current version + nbtStream.writeTag(item.getTag()); + } else { + userDataBuf.writeShortLE(0); + } + + String[] canPlace = item.getCanPlace(); + stream.writeInt(canPlace.length); + for (String aCanPlace : canPlace) { + stream.writeUTF(aCanPlace); + } + + String[] canBreak = item.getCanBreak(); + stream.writeInt(canBreak.length); + for (String aCanBreak : canBreak) { + stream.writeUTF(aCanBreak); + } + + if (BLOCKING_ID.equals(definition.getIdentifier())) { + stream.writeLong(item.getBlockingTicks()); + } + + VarInts.writeUnsignedInt(buffer, userDataBuf.readableBytes()); + buffer.writeBytes(userDataBuf); + } catch (IOException e) { + throw new IllegalStateException("Unable to write item user data", e); + } finally { + userDataBuf.release(); + } + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/Bedrock_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/Bedrock_v975.java new file mode 100644 index 0000000..c4b3003 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/Bedrock_v975.java @@ -0,0 +1,185 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975; + +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; +import org.cloudburstmc.protocol.bedrock.codec.EntityDataTypeMap; +import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.LevelEventSerializer_v291; +import org.cloudburstmc.protocol.bedrock.codec.v361.serializer.LevelEventGenericSerializer_v361; +import org.cloudburstmc.protocol.bedrock.codec.v898.serializer.AvailableCommandsSerializer_v898; +import org.cloudburstmc.protocol.bedrock.codec.v944.Bedrock_v944; +import org.cloudburstmc.protocol.bedrock.codec.v975.serializer.*; +import org.cloudburstmc.protocol.bedrock.data.LevelEventType; +import org.cloudburstmc.protocol.bedrock.data.PacketRecipient; +import org.cloudburstmc.protocol.bedrock.data.ParticleType; +import org.cloudburstmc.protocol.bedrock.data.SoundEvent; +import org.cloudburstmc.protocol.bedrock.data.command.CommandParam; +import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataFormat; +import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; +import org.cloudburstmc.protocol.bedrock.data.entity.EntityEventType; +import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; +import org.cloudburstmc.protocol.bedrock.packet.*; +import org.cloudburstmc.protocol.bedrock.transformer.FlagTransformer; +import org.cloudburstmc.protocol.bedrock.transformer.TypeMapTransformer; +import org.cloudburstmc.protocol.common.util.TypeMap; + +public class Bedrock_v975 extends Bedrock_v944 { + + protected static final TypeMap COMMAND_PARAMS = TypeMap.builder(CommandParam.class) + .insert(0, CommandParam.UNKNOWN) + .insert(1, CommandParam.INT) + .insert(2, CommandParam.FLOAT) + .insert(3, CommandParam.VALUE) + .insert(4, CommandParam.R_VALUE) + .insert(5, CommandParam.WILDCARD_INT) + .insert(6, CommandParam.OPERATOR) + .insert(7, CommandParam.COMPARE_OPERATOR) + .insert(8, CommandParam.TARGET) + .insert(9, CommandParam.STANDALONE_TARGET) + .insert(10, CommandParam.WILDCARD_TARGET) + .insert(11, CommandParam.NON_ID_TARGET) + .insert(12, CommandParam.SCORE_ARG) + .insert(13, CommandParam.SCORE_ARGS) + .insert(14, CommandParam.SCORE_SELECT_PARAM) + .insert(15, CommandParam.SCORE_SELECTOR) + .insert(16, CommandParam.TAG_SELECTOR) + .insert(17, CommandParam.FILE_PATH) + .insert(18, CommandParam.FILE_PATH_VAL) + .insert(19, CommandParam.FILE_PATH_CONT) + .insert(20, CommandParam.INT_RANGE_VAL) + .insert(21, CommandParam.INT_RANGE_POST_VAL) + .insert(22, CommandParam.INT_RANGE) + .insert(23, CommandParam.INT_RANGE_FULL) + .insert(24, CommandParam.RATIONAL_RANGE_VAL) + .insert(25, CommandParam.RATIONAL_RANGE_POST_VAL) + .insert(26, CommandParam.RATIONAL_RANGE) + .insert(27, CommandParam.RATIONAL_RANGE_FULL) + .insert(28, CommandParam.SEL_ARGS) + .insert(29, CommandParam.ARGS) + .insert(30, CommandParam.ARG) + .insert(31, CommandParam.MARG) + .insert(32, CommandParam.MVALUE) + .insert(33, CommandParam.NAME) + .insert(34, CommandParam.TYPE) + .insert(35, CommandParam.FAMILY) + .insert(36, CommandParam.PERMISSION) + .insert(37, CommandParam.PERMISSIONS) + .insert(38, CommandParam.PERMISSION_SELECTOR) + .insert(39, CommandParam.PERMISSION_ELEMENT) + .insert(40, CommandParam.PERMISSION_ELEMENTS) + .insert(41, CommandParam.TAG) + .insert(42, CommandParam.HAS_ITEM_ELEMENT) + .insert(43, CommandParam.HAS_ITEM_ELEMENTS) + .insert(44, CommandParam.HAS_ITEM) + .insert(45, CommandParam.HAS_ITEMS) + .insert(46, CommandParam.HAS_ITEM_SELECTOR) + .insert(47, CommandParam.EQUIPMENT_SLOTS) + .insert(48, CommandParam.PROPERTY_VALUE) + .insert(49, CommandParam.HAS_PROPERTY_PARAM_VALUE) + .insert(50, CommandParam.HAS_PROPERTY_PARAM_ENUM_VALUE) + .insert(51, CommandParam.HAS_PROPERTY_ARG) + .insert(52, CommandParam.HAS_PROPERTY_ARGS) + .insert(53, CommandParam.HAS_PROPERTY_ELEMENT) + .insert(54, CommandParam.HAS_PROPERTY_ELEMENTS) + .insert(55, CommandParam.HAS_PROPERTY_SELECTOR) + .insert(56, CommandParam.STRING) + .insert(57, CommandParam.ID_CONT) + .insert(58, CommandParam.COORD_X_INT) + .insert(59, CommandParam.COORD_Y_INT) + .insert(60, CommandParam.COORD_Z_INT) + .insert(61, CommandParam.COORD_X_FLOAT) + .insert(62, CommandParam.COORD_Y_FLOAT) + .insert(63, CommandParam.COORD_Z_FLOAT) + .insert(64, CommandParam.BLOCK_POSITION) + .insert(65, CommandParam.POSITION) + .insert(66, CommandParam.MESSAGE_XP) + .insert(67, CommandParam.MESSAGE) + .insert(68, CommandParam.MESSAGE_ROOT) + .insert(69, CommandParam.POST_SELECTOR) + .insert(70, CommandParam.TEXT) + .insert(71, CommandParam.TEXT_CONT) + .insert(72, CommandParam.JSON_VALUE) + .insert(73, CommandParam.JSON_FIELD) + .insert(74, CommandParam.JSON) + .insert(75, CommandParam.JSON_OBJECT_FIELDS) + .insert(76, CommandParam.JSON_OBJECT_CONT) + .insert(77, CommandParam.JSON_ARRAY) + .insert(78, CommandParam.JSON_ARRAY_VALUES) + .insert(79, CommandParam.JSON_ARRAY_CONT) + .insert(80, CommandParam.BLOCK_STATE) + .insert(81, CommandParam.BLOCK_STATE_KEY) + .insert(82, CommandParam.BLOCK_STATE_VALUE) + .insert(83, CommandParam.BLOCK_STATE_VALUES) + .insert(84, CommandParam.BLOCK_STATES) + .insert(85, CommandParam.BLOCK_STATES_CONT) + .insert(86, CommandParam.CLOCK_TIME_MARKER_NAME) + .insert(87, CommandParam.COMMAND) + .insert(88, CommandParam.SLASH_COMMAND) + .insert(89, CommandParam.CODE_BUILDER_ARG) + .insert(90, CommandParam.CODE_BUILDER_ARGS) + .insert(91, CommandParam.CODE_BUILDER_SELECT_PARAM) + .insert(92, CommandParam.CODE_BUILDER_SELECTOR) + .insert(134217728, CommandParam.CHAINED_COMMAND) + .build(); + + protected static final TypeMap ENTITY_EVENTS = Bedrock_v944.ENTITY_EVENTS.toBuilder() + .insert(81, EntityEventType.HURT_WITHOUT_RECEIVING_DAMAGE) + .build(); + + protected static final TypeMap ENTITY_FLAGS = Bedrock_v944.ENTITY_FLAGS + .toBuilder() + .insert(127, EntityFlag.USES_LEGACY_FRICTION) + .insert(128, EntityFlag.USES_UNIFORM_AIR_DRAG) + .insert(129, EntityFlag.NAMEPLATE_DEPTH_TESTED) + .build(); + + protected static final TypeMap PARTICLE_TYPES = Bedrock_v944.PARTICLE_TYPES.toBuilder() + .insert(101, ParticleType.SULFUR_CUBE) + .build(); + + protected static final EntityDataTypeMap ENTITY_DATA = Bedrock_v944.ENTITY_DATA + .toBuilder() + .update(EntityDataTypes.AREA_EFFECT_CLOUD_PARTICLE, new TypeMapTransformer<>(PARTICLE_TYPES)) + .update(EntityDataTypes.FLAGS, new FlagTransformer(ENTITY_FLAGS, 0)) + .update(EntityDataTypes.FLAGS_2, new FlagTransformer(ENTITY_FLAGS, 1)) + .insert(EntityDataTypes.RESERVED_139, 139, EntityDataFormat.LONG) + .insert(EntityDataTypes.NAMEPLATE_RENDER_DISTANCE_MAX, 140, EntityDataFormat.FLOAT) + .build(); + + protected static final TypeMap LEVEL_EVENTS = Bedrock_v944.LEVEL_EVENTS.toBuilder() + .insert(LEVEL_EVENT_PARTICLE_TYPE, PARTICLE_TYPES) + .build(); + + protected static final TypeMap SOUND_EVENTS = Bedrock_v944.SOUND_EVENTS + .toBuilder() + .replace(599, SoundEvent.PUSHED_BY_PLAYER) + .insert(600, SoundEvent.BOUNCE) + .insert(601, SoundEvent.UNDEFINED) + .build(); + + public static final BedrockCodec CODEC = Bedrock_v944.CODEC.toBuilder() + .protocolVersion(975) + .minecraftVersion("1.26.20") + .helper(() -> new BedrockCodecHelper_v975(ENTITY_DATA, GAME_RULE_TYPES, ITEM_STACK_REQUEST_TYPES, CONTAINER_SLOT_TYPES, PLAYER_ABILITIES, TEXT_PROCESSING_ORIGINS)) + .updateSerializer(AvailableCommandsPacket.class, new AvailableCommandsSerializer_v898(COMMAND_PARAMS)) + .updateSerializer(BiomeDefinitionListPacket.class, BiomeDefinitionListSerializer_v975.INSTANCE) + .updateSerializer(ClientboundAttributeLayerSyncPacket.class, ClientboundAttributeLayerSyncSerializer_v975.INSTANCE) + .updateSerializer(DebugDrawerPacket.class, DebugDrawerSerializer_v975.INSTANCE) + .updateSerializer(DimensionDataPacket.class, DimensionDataSerializer_v975.INSTANCE) + .updateSerializer(DisconnectPacket.class, DisconnectSerializer_v975.INSTANCE) + .updateSerializer(EntityEventPacket.class, new EntityEventSerializer_v975(ENTITY_EVENTS)) + .updateSerializer(InventorySlotPacket.class, InventorySlotSerializer_v975.INSTANCE) + .updateSerializer(LevelEventPacket.class, new LevelEventSerializer_v291(LEVEL_EVENTS)) + .updateSerializer(LevelEventGenericPacket.class, new LevelEventGenericSerializer_v361(LEVEL_EVENTS)) + .updateSerializer(LevelSoundEventPacket.class, new LevelSoundEventSerializer_v975(SOUND_EVENTS)) + .updateSerializer(LocatorBarPacket.class, LocatorBarSerializer_v975.INSTANCE) + .updateSerializer(MobEquipmentPacket.class, MobEquipmentSerializer_v975.INSTANCE) + .updateSerializer(MoveEntityAbsolutePacket.class, MoveEntityAbsoluteSerializer_v975.INSTANCE) + .updateSerializer(MovementPredictionSyncPacket.class, MovementPredictionSyncSerializer_v975.INSTANCE) + .updateSerializer(PartyChangedPacket.class, PartyChangedSerializer_v975.INSTANCE) + .updateSerializer(PlaySoundPacket.class, PlaySoundSerializer_v975.INSTANCE) + .updateSerializer(PlayerEnchantOptionsPacket.class, PlayerEnchantOptionsSerializer_v975.INSTANCE) + .updateSerializer(ServerboundDiagnosticsPacket.class, ServerboundDiagnosticsSerializer_v975.INSTANCE) + .updateSerializer(UpdateClientOptionsPacket.class, UpdateClientOptionsSerializer_v975.INSTANCE) + .registerPacket(ServerStoreInfoPacket::new, ServerStoreInfoSerializer_v975.INSTANCE, 346, PacketRecipient.CLIENT) + .registerPacket(ServerPresenceInfoPacket::new, ServerPresenceInfoSerializer_v975.INSTANCE, 347, PacketRecipient.CLIENT) + .build(); +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/BiomeDefinitionListSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/BiomeDefinitionListSerializer_v975.java new file mode 100644 index 0000000..51cca42 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/BiomeDefinitionListSerializer_v975.java @@ -0,0 +1,129 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v924.serializer.BiomeDefinitionListSerializer_v924; +import org.cloudburstmc.protocol.bedrock.data.VillageType; +import org.cloudburstmc.protocol.bedrock.data.biome.*; +import org.cloudburstmc.protocol.common.util.SequencedHashSet; + +import java.util.ArrayList; +import java.util.List; + +public class BiomeDefinitionListSerializer_v975 extends BiomeDefinitionListSerializer_v924 { + + public static final BiomeDefinitionListSerializer_v975 INSTANCE = new BiomeDefinitionListSerializer_v975(); + + @Override + protected void writeDefinitionChunkGen(ByteBuf buffer, BedrockCodecHelper helper, BiomeDefinitionChunkGenData definitionChunkGen, SequencedHashSet strings) { + helper.writeOptionalNull(buffer, definitionChunkGen.getClimate(), this::writeClimate); + + helper.writeOptionalNull(buffer, definitionChunkGen.getConsolidatedFeatures(), + (buf, aHelper, consolidatedFeatures) -> this.writeConsolidatedFeatures(buf, aHelper, consolidatedFeatures, strings)); + + helper.writeOptionalNull(buffer, definitionChunkGen.getMountainParams(), this::writeMountainParamsData); + + helper.writeOptionalNull(buffer, definitionChunkGen.getSurfaceMaterialAdjustment(), + (buf, aHelper, surfaceMaterialAdjustment) -> this.writeSurfaceMaterialAdjustment(buf, aHelper, surfaceMaterialAdjustment, strings)); + + helper.writeOptionalNull(buffer, definitionChunkGen.getOverworldGenRules(), + (buf, aHelper, overworldGenRules) -> this.writeOverworldGenRules(buf, aHelper, overworldGenRules, strings)); + + helper.writeOptionalNull(buffer, definitionChunkGen.getMultinoiseGenRules(), this::writeMultinoiseGenRules); + + helper.writeOptionalNull(buffer, definitionChunkGen.getLegacyWorldGenRules(), + (buf, aHelper, legacyWorldGenRules) -> this.writeLegacyWorldGenRules(buf, aHelper, legacyWorldGenRules, strings)); + + helper.writeOptionalNull(buffer, definitionChunkGen.getBiomeReplacements(), this::writeBiomeReplacementsData); + + helper.writeOptionalNull(buffer, definitionChunkGen.getVillageType(), (b, n) -> b.writeByte(n.ordinal())); + + writeBiomeSurfaceBuilderData(buffer, helper, definitionChunkGen.getSurfaceBuilderData()); + + writeBiomeSurfaceBuilderData(buffer, helper, definitionChunkGen.getSubsurfaceBuilderData()); + } + + protected void writeBiomeSurfaceBuilderData(ByteBuf buffer, BedrockCodecHelper helper, BiomeSurfaceBuilderData data) { + helper.writeOptionalNull(buffer, data.getSurfaceMaterials(), this::writeSurfaceMaterial); + buffer.writeBoolean(data.isHasDefaultOverworldSurface()); + buffer.writeBoolean(data.isHasSwampSurface()); + buffer.writeBoolean(data.isHasFrozenOceanSurface()); + buffer.writeBoolean(data.isHasTheEndSurface()); + helper.writeOptionalNull(buffer, data.getMesaSurface(), this::writeMesaSurface); + helper.writeOptionalNull(buffer, data.getCappedSurface(), this::writeCappedSurface); + helper.writeOptionalNull(buffer, data.getNoiseGradientSurface(), this::writeNoiseGradientSurface); + } + + protected void writeNoiseGradientSurface(ByteBuf buffer, BedrockCodecHelper helper, BiomeNoiseGradientSurfaceData data) { + helper.writeArray(buffer, data.getNonReplaceableBlocks(), ByteBuf::writeIntLE); + helper.writeArray(buffer, data.getGradientBlocks(), (buf, val) -> + buf.writeIntLE(val.getBlock())); + helper.writeString(buffer, data.getNoise()); + buffer.writeIntLE(data.getFirstOctave()); + helper.writeArray(buffer, data.getAmplitudes(), ByteBuf::writeFloatLE); + } + + @Override + protected BiomeDefinitionChunkGenData readDefinitionChunkGen(ByteBuf buffer, BedrockCodecHelper helper, List strings) { + BiomeClimateData climate = helper.readOptional(buffer, null, this::readClimate); + + List consolidatedFeatures = helper.readOptional(buffer, null, + (buf, aHelper) -> this.readConsolidatedFeatures(buf, aHelper, strings)); + + BiomeMountainParamsData mountainParams = helper.readOptional(buffer, null, this::readMountainParamsData); + + BiomeSurfaceMaterialAdjustmentData surfaceMaterialAdjustment = helper.readOptional(buffer, null, + (buf, aHelper) -> this.readSurfaceMaterialAdjustment(buf, aHelper, strings)); + + BiomeOverworldGenRulesData overworldGenRules = helper.readOptional(buffer, null, + (buf, aHelper) -> this.readOverworldGenRules(buf, aHelper, strings)); + + BiomeMultinoiseGenRulesData multinoiseGenRules = helper.readOptional(buffer, null, this::readMultinoiseGenRules); + + BiomeLegacyWorldGenRulesData legacyWorldGenRules = helper.readOptional(buffer, null, + (buf, aHelper) -> this.readLegacyWorldGenRules(buf, aHelper, strings)); + + List replacementsData = helper.readOptional(buffer, null, this::readBiomeReplacementsData); + + VillageType villageType = helper.readOptional(buffer, null, buf -> VillageType.values()[buf.readUnsignedByte()]); + + BiomeSurfaceBuilderData surfaceBuilderData = helper.readOptional(buffer, null, this::readBiomeSurfaceBuilderData); + + BiomeSurfaceBuilderData subsurfaceBuilderData = helper.readOptional(buffer, null, this::readBiomeSurfaceBuilderData); + + return new BiomeDefinitionChunkGenData(climate, consolidatedFeatures, + mountainParams, surfaceMaterialAdjustment, + null, false, false, + false, false, + null, null, + overworldGenRules, multinoiseGenRules, + legacyWorldGenRules, replacementsData, villageType, surfaceBuilderData, subsurfaceBuilderData); + } + + protected BiomeSurfaceBuilderData readBiomeSurfaceBuilderData(ByteBuf buffer, BedrockCodecHelper helper) { + BiomeSurfaceMaterialData surfaceMaterials = helper.readOptional(buffer, null, this::readSurfaceMaterial); + boolean hasDefaultOverworldSurface = buffer.readBoolean(); + boolean hasSwampSurface = buffer.readBoolean(); + boolean hasFrozenOceanSurface = buffer.readBoolean(); + boolean hasTheEndSurface = buffer.readBoolean(); + BiomeMesaSurfaceData mesaSurface = helper.readOptional(buffer, null, this::readMesaSurface); + BiomeCappedSurfaceData cappedSurface = helper.readOptional(buffer, null, this::readCappedSurface); + BiomeNoiseGradientSurfaceData noiseGradientSurface = helper.readOptional(buffer, null, this::readNoiseGradientSurface); + + return new BiomeSurfaceBuilderData(surfaceMaterials, hasDefaultOverworldSurface,hasSwampSurface, + hasFrozenOceanSurface, hasTheEndSurface, mesaSurface, cappedSurface, noiseGradientSurface); + } + + protected BiomeNoiseGradientSurfaceData readNoiseGradientSurface(ByteBuf buffer, BedrockCodecHelper helper) { + List nonReplaceableBlocks = new ArrayList<>(); + helper.readArray(buffer, nonReplaceableBlocks, (buf, h) -> (int) buf.readUnsignedIntLE()); + List gradientBlocks = new ArrayList<>(); + helper.readArray(buffer, gradientBlocks, (buf, h) -> + new NoiseBlockSpecifier(null, 0, 0, 0, (int) buf.readUnsignedIntLE())); + String noiseSeedString = helper.readString(buffer); + int firstOctave = buffer.readIntLE(); + List amplitudes = new ArrayList<>(); + helper.readArray(buffer, amplitudes, (buf, h) -> buf.readFloatLE()); + return new BiomeNoiseGradientSurfaceData(nonReplaceableBlocks, gradientBlocks, noiseSeedString, firstOctave, amplitudes); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/ClientboundAttributeLayerSyncSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/ClientboundAttributeLayerSyncSerializer_v975.java new file mode 100644 index 0000000..e7ecf5e --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/ClientboundAttributeLayerSyncSerializer_v975.java @@ -0,0 +1,23 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v944.serializer.ClientboundAttributeLayerSyncSerializer_v944; +import org.cloudburstmc.protocol.bedrock.data.attributelayer.*; +import org.cloudburstmc.protocol.common.util.VarInts; + +public class ClientboundAttributeLayerSyncSerializer_v975 extends ClientboundAttributeLayerSyncSerializer_v944 { + + public static final ClientboundAttributeLayerSyncSerializer_v975 INSTANCE = new ClientboundAttributeLayerSyncSerializer_v975(); + + @Override + protected void writeWeight(ByteBuf buf, BedrockCodecHelper helper, AttributeLayerSettings.Weight w) { + if (!(w instanceof AttributeLayerSettings.FloatWeight)) throw new IllegalArgumentException("Unknown Weight: " + w); + buf.writeFloatLE(((AttributeLayerSettings.FloatWeight) w).getValue()); + } + + @Override + protected AttributeLayerSettings.Weight readWeight(ByteBuf buf, BedrockCodecHelper helper) { + return new AttributeLayerSettings.FloatWeight(buf.readFloatLE()); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/DebugDrawerSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/DebugDrawerSerializer_v975.java new file mode 100644 index 0000000..80b1889 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/DebugDrawerSerializer_v975.java @@ -0,0 +1,141 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.math.vector.Vector3f; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v924.serializer.DebugDrawerSerializer_v924; +import org.cloudburstmc.protocol.bedrock.data.debugshape.*; +import org.cloudburstmc.protocol.common.util.VarInts; + +import java.awt.Color; + +public class DebugDrawerSerializer_v975 extends DebugDrawerSerializer_v924 { + + public static final DebugDrawerSerializer_v975 INSTANCE = new DebugDrawerSerializer_v975(); + + @Override + protected void writeCommonShapeData(ByteBuf buffer, BedrockCodecHelper helper, DebugShape shape) { + VarInts.writeUnsignedLong(buffer, shape.getId()); + helper.writeOptionalNull(buffer, shape.getType(), (buf, type) -> buf.writeByte(type.ordinal())); + helper.writeOptionalNull(buffer, shape.getPosition(), WRITE_VECTOR3F); + helper.writeOptionalNull(buffer, shape.getScale(), ByteBuf::writeFloatLE); + helper.writeOptionalNull(buffer, shape.getRotation(), WRITE_VECTOR3F); + helper.writeOptionalNull(buffer, shape.getTotalTimeLeft(), ByteBuf::writeFloatLE); + helper.writeOptionalNull(buffer, shape.getMaximumRenderDistance(), ByteBuf::writeFloatLE); // new + helper.writeOptionalNull(buffer, shape.getColor(), WRITE_COLOR); + + helper.writeOptionalNull(buffer, shape.getDimension(), VarInts::writeInt); + helper.writeOptionalNull(buffer, shape.getAttachedToEntityId(), VarInts::writeUnsignedLong); + } + + @Override + protected void writeShape(ByteBuf buffer, BedrockCodecHelper helper, DebugShape shape) { + if (shape.getType() != DebugShape.Type.TEXT) { + super.writeShape(buffer, helper, shape); + return; + } + + writeCommonShapeData(buffer, helper, shape); + + VarInts.writeUnsignedInt(buffer, toPayloadType(DebugShape.Type.TEXT)); + + DebugText text = (DebugText) shape; + helper.writeString(buffer, text.getText()); + buffer.writeBoolean(text.isUseRotation()); + helper.writeOptionalNull(buffer, text.getBackgroundColor(), (buf, h, c) -> buf.writeIntLE(c.getRGB())); + buffer.writeBoolean(text.isDepthTest()); + buffer.writeBoolean(text.isShowBackface()); + buffer.writeBoolean(text.isShowTextBackface()); + } + + @Override + protected DebugShape readShape(ByteBuf buffer, BedrockCodecHelper helper) { + long id = VarInts.readUnsignedLong(buffer); + + DebugShape.Type type = helper.readOptional(buffer, null, (buf, aHelper) -> SHAPE_TYPES[buf.readUnsignedByte()]); + Vector3f position = helper.readOptional(buffer, null, READ_VECTOR3F); + Float scale = helper.readOptional(buffer, null, ByteBuf::readFloatLE); + Vector3f rotation = helper.readOptional(buffer, null, READ_VECTOR3F); + Float totalTimeLeft = helper.readOptional(buffer, null, ByteBuf::readFloatLE); + Float maximumRenderDistance = helper.readOptional(buffer, null, ByteBuf::readFloatLE); // new + Color color = helper.readOptional(buffer, null, READ_COLOR); + Integer dimension = helper.readOptional(buffer, -1, VarInts::readInt); + Long attachedToEntityId = helper.readOptional(buffer, null, VarInts::readUnsignedLong); + VarInts.readUnsignedInt(buffer); // Unused payload type + + if (type == null) { + return new DebugShape(id, dimension); + } + + DebugShape shape; + switch (type) { + case ARROW: + shape = new DebugArrow(); + break; + case BOX: + shape = new DebugBox(); + break; + case CIRCLE: + shape = new DebugCircle(); + break; + case LINE: + shape = new DebugLine(); + break; + case SPHERE: + shape = new DebugSphere(); + break; + case TEXT: + shape = new DebugText(); + break; + default: + throw new IllegalStateException("Unknown debug shape type"); + } + + shape.setId(id); + shape.setDimension(dimension); + shape.setPosition(position); + shape.setScale(scale); + shape.setRotation(rotation); + shape.setTotalTimeLeft(totalTimeLeft); + shape.setColor(color); + shape.setAttachedToEntityId(attachedToEntityId); + shape.setMaximumRenderDistance(maximumRenderDistance); + + switch (type) { + case ARROW: + DebugArrow arrow = (DebugArrow) shape; + arrow.setArrowEndPosition(helper.readOptional(buffer, null, READ_VECTOR3F)); + arrow.setArrowHeadLength(helper.readOptional(buffer, null, ByteBuf::readFloatLE)); + arrow.setArrowHeadRadius(helper.readOptional(buffer, null, ByteBuf::readFloatLE)); + arrow.setArrowHeadSegments(helper.readOptional(buffer, null, buf -> (int) buf.readUnsignedByte())); + return arrow; + case BOX: + DebugBox box = (DebugBox) shape; + box.setBoxBounds(helper.readVector3f(buffer)); + return box; + case CIRCLE: + DebugCircle circle = (DebugCircle) shape; + circle.setSegments((int) buffer.readUnsignedByte()); + return circle; + case LINE: + DebugLine line = (DebugLine) shape; + line.setLineEndPosition(helper.readVector3f(buffer)); + return line; + case SPHERE: + DebugSphere sphere = (DebugSphere) shape; + sphere.setSegments((int) buffer.readUnsignedByte()); + return sphere; + case TEXT: + DebugText text = (DebugText) shape; + text.setText(helper.readString(buffer)); + text.setUseRotation(buffer.readBoolean()); + text.setBackgroundColor(helper.readOptional(buffer, null, (buf, h) -> new Color(buf.readIntLE(), true))); + text.setDepthTest(buffer.readBoolean()); + text.setShowBackface(buffer.readBoolean()); + text.setShowTextBackface(buffer.readBoolean()); + return text; + default: + throw new IllegalStateException("Unknown debug shape type"); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/DimensionDataSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/DimensionDataSerializer_v975.java new file mode 100644 index 0000000..8a7c7d2 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/DimensionDataSerializer_v975.java @@ -0,0 +1,36 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v503.serializer.DimensionDataSerializer_v503; +import org.cloudburstmc.protocol.bedrock.data.definitions.DimensionDefinition; +import org.cloudburstmc.protocol.bedrock.packet.DimensionDataPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +public class DimensionDataSerializer_v975 extends DimensionDataSerializer_v503 { + public static final DimensionDataSerializer_v975 INSTANCE = new DimensionDataSerializer_v975(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, DimensionDataPacket packet) { + helper.writeArray(buffer, packet.getDefinitions(), this::writeDefinition); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, DimensionDataPacket packet) { + helper.readArray(buffer, packet.getDefinitions(), this::readDefinition); + } + + protected void writeDefinition(ByteBuf buffer, BedrockCodecHelper helper, DimensionDefinition definition) { + super.writeDefinition(buffer, helper, definition); + VarInts.writeInt(buffer, definition.getDimensionType()); + } + + protected DimensionDefinition readDefinition(ByteBuf buffer, BedrockCodecHelper helper) { + String id = helper.readString(buffer); + int maximumHeight = VarInts.readInt(buffer); + int minimumHeight = VarInts.readInt(buffer); + int generatorType = VarInts.readInt(buffer); + int dimensionType = VarInts.readInt(buffer); + return new DimensionDefinition(id, maximumHeight, minimumHeight, generatorType, dimensionType); + } +} \ No newline at end of file diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/DisconnectSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/DisconnectSerializer_v975.java new file mode 100644 index 0000000..109f6ac --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/DisconnectSerializer_v975.java @@ -0,0 +1,36 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v712.serializer.DisconnectSerializer_v712; +import org.cloudburstmc.protocol.bedrock.data.DisconnectFailReason; +import org.cloudburstmc.protocol.bedrock.packet.DisconnectPacket; +import org.cloudburstmc.protocol.common.util.TextConverter; +import org.cloudburstmc.protocol.common.util.VarInts; + +public class DisconnectSerializer_v975 extends DisconnectSerializer_v712 { + + public static final DisconnectSerializer_v975 INSTANCE = new DisconnectSerializer_v975(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, DisconnectPacket packet) { + VarInts.writeInt(buffer, packet.getReason().ordinal()); + VarInts.writeUnsignedInt(buffer, packet.isMessageSkipped() ? 1 : 0); //oneOf + if (!packet.isMessageSkipped()) { + TextConverter converter = helper.getTextConverter(); + helper.writeString(buffer, converter.serialize(packet.getKickMessage(CharSequence.class))); + helper.writeString(buffer, converter.serialize(packet.getFilteredMessage(CharSequence.class))); + } + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, DisconnectPacket packet) { + packet.setReason(DisconnectFailReason.values()[VarInts.readInt(buffer)]); + packet.setMessageSkipped(VarInts.readUnsignedInt(buffer) != 0); + if (!packet.isMessageSkipped()) { + TextConverter converter = helper.getTextConverter(); + packet.setKickMessage(converter.deserialize(helper.readString(buffer))); + packet.setFilteredMessage(converter.deserialize(helper.readString(buffer))); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/EntityEventSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/EntityEventSerializer_v975.java new file mode 100644 index 0000000..24392be --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/EntityEventSerializer_v975.java @@ -0,0 +1,27 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.EntityEventSerializer_v291; +import org.cloudburstmc.protocol.bedrock.data.entity.EntityEventType; +import org.cloudburstmc.protocol.bedrock.packet.EntityEventPacket; +import org.cloudburstmc.protocol.common.util.TypeMap; + +public class EntityEventSerializer_v975 extends EntityEventSerializer_v291 { + + public EntityEventSerializer_v975(TypeMap typeMap) { + super(typeMap); + } + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, EntityEventPacket packet) { + super.serialize(buffer, helper, packet); + helper.writeOptionalNull(buffer, packet.getFireAtPosition(), helper::writeVector3f); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, EntityEventPacket packet) { + super.deserialize(buffer, helper, packet); + packet.setFireAtPosition(helper.readOptional(buffer, null, helper::readVector3f)); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/InventorySlotSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/InventorySlotSerializer_v975.java new file mode 100644 index 0000000..a6d5697 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/InventorySlotSerializer_v975.java @@ -0,0 +1,33 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.packet.InventorySlotPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class InventorySlotSerializer_v975 implements BedrockPacketSerializer { + + public static final InventorySlotSerializer_v975 INSTANCE = new InventorySlotSerializer_v975(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, InventorySlotPacket packet) { + VarInts.writeUnsignedInt(buffer, packet.getContainerId()); + VarInts.writeUnsignedInt(buffer, packet.getSlot()); + helper.writeOptionalNull(buffer, packet.getContainerNameData(), helper::writeFullContainerName); + helper.writeOptionalNull(buffer, packet.getStorageItem(), helper::writeNetworkItemStackDescriptor); + helper.writeNetworkItemStackDescriptor(buffer, packet.getItem()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, InventorySlotPacket packet) { + packet.setContainerId(VarInts.readUnsignedInt(buffer)); + packet.setSlot(VarInts.readUnsignedInt(buffer)); + packet.setContainerNameData(helper.readOptional(buffer, null, helper::readFullContainerName)); + packet.setStorageItem(helper.readOptional(buffer, null, helper::readNetworkItemStackDescriptor)); + packet.setItem(helper.readNetworkItemStackDescriptor(buffer)); + } +} \ No newline at end of file diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/LevelSoundEventSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/LevelSoundEventSerializer_v975.java new file mode 100644 index 0000000..8986b17 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/LevelSoundEventSerializer_v975.java @@ -0,0 +1,27 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v786.serializer.LevelSoundEventSerializer_v786; +import org.cloudburstmc.protocol.bedrock.data.SoundEvent; +import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEventPacket; +import org.cloudburstmc.protocol.common.util.TypeMap; + +public class LevelSoundEventSerializer_v975 extends LevelSoundEventSerializer_v786 { + + public LevelSoundEventSerializer_v975(TypeMap typeMap) { + super(typeMap); + } + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, LevelSoundEventPacket packet) { + super.serialize(buffer, helper, packet); + helper.writeOptionalNull(buffer, packet.getFireAtPosition(), helper::writeVector3f); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, LevelSoundEventPacket packet) { + super.deserialize(buffer, helper, packet); + packet.setFireAtPosition(helper.readOptional(buffer, null, helper::readVector3f)); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/LocatorBarSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/LocatorBarSerializer_v975.java new file mode 100644 index 0000000..4ee2361 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/LocatorBarSerializer_v975.java @@ -0,0 +1,45 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v944.serializer.LocatorBarSerializer_v944; +import org.cloudburstmc.protocol.bedrock.data.LocatorBarWaypoint; +import org.cloudburstmc.protocol.common.util.VarInts; + +import java.awt.Color; + +public class LocatorBarSerializer_v975 extends LocatorBarSerializer_v944 { + + public static final LocatorBarSerializer_v975 INSTANCE = new LocatorBarSerializer_v975(); + + @Override + protected void writeWaypoint(ByteBuf buf, BedrockCodecHelper helper, LocatorBarWaypoint waypoint) { + buf.writeIntLE(waypoint.getUpdateFlag()); + helper.writeOptionalNull(buf, waypoint.getVisible(), ByteBuf::writeBoolean); + helper.writeOptionalNull(buf, waypoint.getWorldPosition(), (buf1, h, pos) -> { + h.writeVector3f(buf1, pos.getPosition()); + VarInts.writeInt(buf1, pos.getDimension()); + }); + helper.writeOptionalNull(buf, waypoint.getTexturePath(), helper::writeString); + helper.writeOptionalNull(buf, waypoint.getIconSize(), helper::writeVector2f); + helper.writeOptionalNull(buf, waypoint.getColor(), (buf1, h, c) -> buf1.writeIntLE(c.getRGB())); + helper.writeOptionalNull(buf, waypoint.getClientPositionAuthority(), ByteBuf::writeBoolean); + helper.writeOptionalNull(buf, waypoint.getEntityUniqueId(), VarInts::writeLong); + } + + @Override + protected LocatorBarWaypoint readWaypoint(ByteBuf buf, BedrockCodecHelper helper) { + LocatorBarWaypoint waypoint = new LocatorBarWaypoint(); + waypoint.setUpdateFlag((int) buf.readUnsignedIntLE()); + waypoint.setVisible(helper.readOptional(buf, null, ByteBuf::readBoolean)); + waypoint.setWorldPosition(helper.readOptional(buf, null, (buf1, h) -> + new LocatorBarWaypoint.WorldPosition(h.readVector3f(buf1), VarInts.readInt(buf1)))); + waypoint.setTexturePath(helper.readOptional(buf, null, helper::readString)); + waypoint.setIconSize(helper.readOptional(buf, null, helper::readVector2f)); + waypoint.setColor(helper.readOptional(buf, null, (buf1, h) -> + new Color(buf1.readIntLE(), true))); + waypoint.setClientPositionAuthority(helper.readOptional(buf, null, ByteBuf::readBoolean)); + waypoint.setEntityUniqueId(helper.readOptional(buf, null, VarInts::readLong)); + return waypoint; + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/MobEquipmentSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/MobEquipmentSerializer_v975.java new file mode 100644 index 0000000..190d2a1 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/MobEquipmentSerializer_v975.java @@ -0,0 +1,33 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.packet.MobEquipmentPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class MobEquipmentSerializer_v975 implements BedrockPacketSerializer { + + public static final MobEquipmentSerializer_v975 INSTANCE = new MobEquipmentSerializer_v975(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, MobEquipmentPacket packet) { + VarInts.writeUnsignedLong(buffer, packet.getRuntimeEntityId()); + helper.writeNetworkItemStackDescriptor(buffer, packet.getItem()); + buffer.writeByte(packet.getInventorySlot()); + buffer.writeByte(packet.getHotbarSlot()); + buffer.writeByte(packet.getContainerId()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, MobEquipmentPacket packet) { + packet.setRuntimeEntityId(VarInts.readUnsignedLong(buffer)); + packet.setItem(helper.readNetworkItemStackDescriptor(buffer)); + packet.setInventorySlot(buffer.readUnsignedByte()); + packet.setHotbarSlot(buffer.readUnsignedByte()); + packet.setContainerId(buffer.readByte()); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/MoveEntityAbsoluteSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/MoveEntityAbsoluteSerializer_v975.java new file mode 100644 index 0000000..fb0c8f7 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/MoveEntityAbsoluteSerializer_v975.java @@ -0,0 +1,53 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.MoveEntityAbsoluteSerializer_v291; +import org.cloudburstmc.protocol.bedrock.packet.MoveEntityAbsolutePacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +public class MoveEntityAbsoluteSerializer_v975 extends MoveEntityAbsoluteSerializer_v291 { + + public static final MoveEntityAbsoluteSerializer_v975 INSTANCE = new MoveEntityAbsoluteSerializer_v975(); + + private static final int FLAG_ON_GROUND = 0x1; + private static final int FLAG_TELEPORTED = 0x2; + private static final int FLAG_FORCE_MOVE = 0x4; + /** + * @since v975 + */ + private static final int FLAG_FORCE_COMPLETION = 0x8; + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, MoveEntityAbsolutePacket packet) { + VarInts.writeUnsignedLong(buffer, packet.getRuntimeEntityId()); + int flags = 0; + if (packet.isOnGround()) { + flags |= FLAG_ON_GROUND; + } + if (packet.isTeleported()) { + flags |= FLAG_TELEPORTED; + } + if (packet.isForceMove()) { + flags |= FLAG_FORCE_MOVE; + } + if (packet.isForceCompletion()) { + flags |= FLAG_FORCE_COMPLETION; + } + buffer.writeByte(flags); + helper.writeVector3f(buffer, packet.getPosition()); + this.writeByteRotation(buffer, helper, packet.getRotation()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, MoveEntityAbsolutePacket packet) { + packet.setRuntimeEntityId(VarInts.readUnsignedLong(buffer)); + int flags = buffer.readUnsignedByte(); + packet.setOnGround((flags & FLAG_ON_GROUND) != 0); + packet.setTeleported((flags & FLAG_TELEPORTED) != 0); + packet.setForceMove((flags & FLAG_FORCE_MOVE) != 0); + packet.setForceCompletion((flags & FLAG_FORCE_COMPLETION) != 0); + packet.setPosition(helper.readVector3f(buffer)); + packet.setRotation(this.readByteRotation(buffer, helper)); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/MovementPredictionSyncSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/MovementPredictionSyncSerializer_v975.java new file mode 100644 index 0000000..d72354b --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/MovementPredictionSyncSerializer_v975.java @@ -0,0 +1,50 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v776.serializer.MovementPredictionSyncSerializer_v776; +import org.cloudburstmc.protocol.bedrock.codec.v786.serializer.MovementPredictionSyncSerializer_v786; +import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; +import org.cloudburstmc.protocol.bedrock.packet.MovementPredictionSyncPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class MovementPredictionSyncSerializer_v975 extends MovementPredictionSyncSerializer_v786 { + public static final MovementPredictionSyncSerializer_v975 INSTANCE = new MovementPredictionSyncSerializer_v975(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, MovementPredictionSyncPacket packet) { + helper.writeLargeVarIntFlags(buffer, packet.getFlags(), EntityFlag.class); + helper.writeVector3f(buffer, packet.getBoundingBox()); + buffer.writeFloatLE(packet.getSpeed()); + buffer.writeFloatLE(packet.getUnderwaterSpeed()); + buffer.writeFloatLE(packet.getLavaSpeed()); + buffer.writeFloatLE(packet.getJumpStrength()); + buffer.writeFloatLE(packet.getHealth()); + buffer.writeFloatLE(packet.getHunger()); + buffer.writeFloatLE(packet.getUnknown1()); + buffer.writeFloatLE(packet.getUnknown2()); + buffer.writeFloatLE(packet.getUnknown3()); + VarInts.writeUnsignedLong(buffer, packet.getRuntimeEntityId()); + buffer.writeBoolean(packet.isFlying()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, MovementPredictionSyncPacket packet) { + helper.readLargeVarIntFlags(buffer, packet.getFlags(), EntityFlag.class); + packet.setBoundingBox(helper.readVector3f(buffer)); + packet.setSpeed(buffer.readFloatLE()); + packet.setUnderwaterSpeed(buffer.readFloatLE()); + packet.setLavaSpeed(buffer.readFloatLE()); + packet.setJumpStrength(buffer.readFloatLE()); + packet.setHealth(buffer.readFloatLE()); + packet.setHunger(buffer.readFloatLE()); + packet.setUnknown1(buffer.readFloatLE()); + packet.setUnknown2(buffer.readFloatLE()); + packet.setUnknown3(buffer.readFloatLE()); + packet.setRuntimeEntityId(VarInts.readUnsignedLong(buffer)); + packet.setFlying(buffer.readBoolean()); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/PartyChangedSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/PartyChangedSerializer_v975.java new file mode 100644 index 0000000..bc18e70 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/PartyChangedSerializer_v975.java @@ -0,0 +1,22 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v944.serializer.PartyChangedSerializer_v944; +import org.cloudburstmc.protocol.bedrock.packet.PartyChangedPacket; + +public class PartyChangedSerializer_v975 extends PartyChangedSerializer_v944 { + + public static final PartyChangedSerializer_v975 INSTANCE = new PartyChangedSerializer_v975(); + + @Override + protected void writeParty(ByteBuf buffer, BedrockCodecHelper helper, PartyChangedPacket.PartyInfo info) { + helper.writeString(buffer, info.getPartyId()); + buffer.writeBoolean(info.isPartyLeader()); + } + + @Override + protected PartyChangedPacket.PartyInfo readParty(ByteBuf buffer, BedrockCodecHelper helper) { + return new PartyChangedPacket.PartyInfo(helper.readString(buffer), buffer.readBoolean()); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/PlaySoundSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/PlaySoundSerializer_v975.java new file mode 100644 index 0000000..7d4160e --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/PlaySoundSerializer_v975.java @@ -0,0 +1,23 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.PlaySoundSerializer_v291; +import org.cloudburstmc.protocol.bedrock.packet.PlaySoundPacket; + +public class PlaySoundSerializer_v975 extends PlaySoundSerializer_v291 { + + public static final PlaySoundSerializer_v975 INSTANCE = new PlaySoundSerializer_v975(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, PlaySoundPacket packet) { + super.serialize(buffer, helper, packet); + helper.writeOptionalNull(buffer, packet.getServerSoundHandle(), ByteBuf::writeLongLE); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, PlaySoundPacket packet) { + super.deserialize(buffer, helper, packet); + packet.setServerSoundHandle(helper.readOptional(buffer, null, ByteBuf::readLongLE)); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/PlayerEnchantOptionsSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/PlayerEnchantOptionsSerializer_v975.java new file mode 100644 index 0000000..d018b1f --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/PlayerEnchantOptionsSerializer_v975.java @@ -0,0 +1,55 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v407.serializer.PlayerEnchantOptionsSerializer_v407; +import org.cloudburstmc.protocol.bedrock.data.inventory.EnchantData; +import org.cloudburstmc.protocol.bedrock.data.inventory.EnchantOptionData; +import org.cloudburstmc.protocol.common.util.VarInts; + +import java.util.List; + +public class PlayerEnchantOptionsSerializer_v975 extends PlayerEnchantOptionsSerializer_v407 { + + public static final PlayerEnchantOptionsSerializer_v975 INSTANCE = new PlayerEnchantOptionsSerializer_v975(); + + @Override + protected void writeOption(ByteBuf buffer, BedrockCodecHelper helper, EnchantOptionData option) { + buffer.writeByte(option.getCost()); + buffer.writeIntLE(option.getPrimarySlot()); + helper.writeArray(buffer, option.getEnchants0(), this::serializeEnchant); + helper.writeArray(buffer, option.getEnchants1(), this::serializeEnchant); + helper.writeArray(buffer, option.getEnchants2(), this::serializeEnchant); + helper.writeString(buffer, option.getEnchantName()); + VarInts.writeUnsignedInt(buffer, option.getEnchantNetId()); + } + + @Override + protected EnchantOptionData readOption(ByteBuf buffer, BedrockCodecHelper helper) { + int cost = buffer.readUnsignedByte(); + int primarySlot = buffer.readIntLE(); + List enchants1 = new ObjectArrayList<>(); + helper.readArray(buffer, enchants1, this::deserializeEnchant); + List enchants2 = new ObjectArrayList<>(); + helper.readArray(buffer, enchants2, this::deserializeEnchant); + List enchants3 = new ObjectArrayList<>(); + helper.readArray(buffer, enchants3, this::deserializeEnchant); + String enchantName = helper.readString(buffer); + int enchantNetId = VarInts.readUnsignedInt(buffer); + return new EnchantOptionData(cost, primarySlot, enchants1, enchants2, enchants3, enchantName, enchantNetId); + } + + @Override + protected void serializeEnchant(ByteBuf buffer, EnchantData enchant) { + VarInts.writeUnsignedInt(buffer, enchant.getType()); + buffer.writeByte(enchant.getLevel()); + } + + @Override + protected EnchantData deserializeEnchant(ByteBuf buffer) { + int type = VarInts.readUnsignedInt(buffer); + int level = buffer.readUnsignedByte(); + return new EnchantData(type, level); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/ServerPresenceInfoSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/ServerPresenceInfoSerializer_v975.java new file mode 100644 index 0000000..87a9d9e --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/ServerPresenceInfoSerializer_v975.java @@ -0,0 +1,24 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.packet.ServerPresenceInfoPacket; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class ServerPresenceInfoSerializer_v975 implements BedrockPacketSerializer { + + public static final ServerPresenceInfoSerializer_v975 INSTANCE = new ServerPresenceInfoSerializer_v975(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ServerPresenceInfoPacket packet) { + helper.writeOptionalNull(buffer, packet.getPresenceConfiguration(), helper::writePresenceConfiguration); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ServerPresenceInfoPacket packet) { + packet.setPresenceConfiguration(helper.readOptional(buffer, null, helper::readPresenceConfiguration)); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/ServerStoreInfoSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/ServerStoreInfoSerializer_v975.java new file mode 100644 index 0000000..543f3a1 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/ServerStoreInfoSerializer_v975.java @@ -0,0 +1,29 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer; +import org.cloudburstmc.protocol.bedrock.data.ClientStoreEntrypointConfiguration; +import org.cloudburstmc.protocol.bedrock.packet.ServerStoreInfoPacket; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class ServerStoreInfoSerializer_v975 implements BedrockPacketSerializer { + + public static final ServerStoreInfoSerializer_v975 INSTANCE = new ServerStoreInfoSerializer_v975(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ServerStoreInfoPacket packet) { + helper.writeOptionalNull(buffer, packet.getStore(), (buf, h, store) -> { + h.writeString(buf, store.getStoreId()); + h.writeString(buf, store.getStoreName()); + }); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ServerStoreInfoPacket packet) { + packet.setStore(helper.readOptional(buffer, null, (buf, h) -> + new ClientStoreEntrypointConfiguration(h.readString(buf), h.readString(buf)))); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/ServerboundDiagnosticsSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/ServerboundDiagnosticsSerializer_v975.java new file mode 100644 index 0000000..ae3953d --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/ServerboundDiagnosticsSerializer_v975.java @@ -0,0 +1,51 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v924.serializer.ServerboundDiagnosticsSerializer_v924; +import org.cloudburstmc.protocol.bedrock.data.diagnostics.EntityDiagnosticTimingInfo; +import org.cloudburstmc.protocol.bedrock.data.diagnostics.SystemDiagnosticTimingInfo; +import org.cloudburstmc.protocol.bedrock.packet.ServerboundDiagnosticsPacket; + +public class ServerboundDiagnosticsSerializer_v975 extends ServerboundDiagnosticsSerializer_v924 { + + public static final ServerboundDiagnosticsSerializer_v975 INSTANCE = new ServerboundDiagnosticsSerializer_v975(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ServerboundDiagnosticsPacket packet) { + super.serialize(buffer, helper, packet); + + helper.writeArray(buffer, packet.getEntityDiagnostics(), ((buf, h, info) -> { + helper.writeString(buf, info.getDisplayName()); + helper.writeString(buf, info.getEntity()); + buf.writeLongLE(info.getTimeInNs()); + buf.writeByte(info.getPercentOfTotal()); + })); + + helper.writeArray(buffer, packet.getSystemDiagnostics(), ((buf, h, info) -> { + helper.writeString(buf, info.getDisplayName()); + buf.writeLongLE(info.getSystemIndex()); + buf.writeLongLE(info.getTimeInNs()); + buf.writeByte(info.getPercentOfTotal()); + })); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ServerboundDiagnosticsPacket packet) { + super.deserialize(buffer, helper, packet); + + helper.readArray(buffer, packet.getEntityDiagnostics(), (buf, h) -> + new EntityDiagnosticTimingInfo( + helper.readString(buf), + helper.readString(buf), + buf.readLongLE(), + (byte) buf.readUnsignedByte())); + + helper.readArray(buffer, packet.getSystemDiagnostics(), (buf, h) -> + new SystemDiagnosticTimingInfo( + helper.readString(buf), + buf.readLongLE(), + buf.readLongLE(), + (byte) buf.readUnsignedByte())); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/UpdateClientOptionsSerializer_v975.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/UpdateClientOptionsSerializer_v975.java new file mode 100644 index 0000000..6efc64a --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v975/serializer/UpdateClientOptionsSerializer_v975.java @@ -0,0 +1,23 @@ +package org.cloudburstmc.protocol.bedrock.codec.v975.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v786.serializer.UpdateClientOptionsSerializer_v786; +import org.cloudburstmc.protocol.bedrock.packet.UpdateClientOptionsPacket; + +public class UpdateClientOptionsSerializer_v975 extends UpdateClientOptionsSerializer_v786 { + + public static final UpdateClientOptionsSerializer_v975 INSTANCE = new UpdateClientOptionsSerializer_v975(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, UpdateClientOptionsPacket packet) { + super.serialize(buffer, helper, packet); + helper.writeOptionalNull(buffer, packet.getFilterProfanityChange(), ByteBuf::writeBoolean); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, UpdateClientOptionsPacket packet) { + super.deserialize(buffer, helper, packet); + packet.setFilterProfanityChange(helper.readOptional(buffer, null, ByteBuf::readBoolean)); + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/BuildPlatform.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/BuildPlatform.java index 9fa5958..2f18b2b 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/BuildPlatform.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/BuildPlatform.java @@ -1,15 +1,14 @@ package org.cloudburstmc.protocol.bedrock.data; public enum BuildPlatform { - - UNDEFINED, + UNKNOWN, /** * Android */ GOOGLE, IOS, /** - * Mac OS + * macOS */ OSX, /** @@ -23,16 +22,16 @@ public enum BuildPlatform { */ UWP, /** - * Educational edition + * Education Edition */ - WIN_32, + WIN32, DEDICATED, /** * Apple TV */ TV_OS, /** - * Playstation + * PlayStation */ SONY, /** diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/ClientStoreEntrypointConfiguration.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/ClientStoreEntrypointConfiguration.java new file mode 100644 index 0000000..8115c90 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/ClientStoreEntrypointConfiguration.java @@ -0,0 +1,9 @@ +package org.cloudburstmc.protocol.bedrock.data; + +import lombok.Value; + +@Value +public class ClientStoreEntrypointConfiguration { + String storeId; + String storeName; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/DisconnectFailReason.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/DisconnectFailReason.java index 9b06c2a..336c4c5 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/DisconnectFailReason.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/DisconnectFailReason.java @@ -152,5 +152,73 @@ public enum DisconnectFailReason { /** * @since v859 */ - HOST_WITHOUT_KEYS + HOST_WITHOUT_KEYS, + /** + * @since v924 + */ + HOST_SIGNED_OUT, + /** + * @since v924 + */ + SCRIPT_WATCHDOG_EXCEPTION, + /** + * @since v924 + */ + SCRIPT_MEMORY_LIMIT_EXCEEDED, + /** + * @since v924 + */ + STORAGE_LOW_DURING_GAMEPLAY, + /** + * @since v924 + */ + STORAGE_FULL_DURING_GAMEPLAY, + /** + * @since v924 + */ + LEVEL_STORAGE_CORRUPTION, + /** + * @since v924 + */ + EDITION_MISMATCH_VANILLA_TO_EDU, + /** + * @since v924 + */ + EDITION_MISMATCH_EDU_TO_VANILLA, + /** + * @since v924 + */ + EDITOR_MISMATCH_EDITOR_TO_VANILLA, + /** + * @since v924 + */ + EDITOR_MISMATCH_VANILLA_TO_EDITOR, + /** + * @since v924 + */ + DENY_LISTED, + /** + * @since v975 + */ + NONCE_MISSING, + /** + * @since v975 + */ + NONCE_NOT_FOUND, + /** + * @since v975 + */ + NONCE_EXPIRED, + /** + * @since v975 + */ + NONCE_NOT_VALID, + /** + * @since v1001 + */ + HOST_DISCONNECTED, + /** + * @since v1001 + */ + EDITOR_JOIN_INTENT_POLICY_FAILURE, } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/GatheringsConfigurationJoinInfo.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/GatheringsConfigurationJoinInfo.java new file mode 100644 index 0000000..754edea --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/GatheringsConfigurationJoinInfo.java @@ -0,0 +1,18 @@ +package org.cloudburstmc.protocol.bedrock.data; + +import lombok.Value; + +import java.util.UUID; + +@Value +public class GatheringsConfigurationJoinInfo { + + UUID experienceId; + String experienceName; + UUID worldId; + String worldName; + String creatorId; + UUID targetId; + String scenarioId; + String serverId; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/GraphicsOverrideParameterType.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/GraphicsOverrideParameterType.java index 573b704..2f57150 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/GraphicsOverrideParameterType.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/GraphicsOverrideParameterType.java @@ -2,5 +2,134 @@ public enum GraphicsOverrideParameterType { - SKY_ZENITH_COLOR + SKY_ZENITH_COLOR, + SKY_HORIZON_COLOR, + HORIZON_BLEND_MIN, + HORIZON_BLEND_MAX, + HORIZON_BLEND_START, + HORIZON_BLEND_MIE_START, + RAYLEIGH_STRENGTH, + SUN_MIE_STRENGTH, + MOON_MIE_STRENGTH, + SUN_GLARE_SHAPE, + CHLOROPHYLL, + CDOM, + SUSPENDED_SEDIMENT, + WAVES_DEPTH, + WAVES_FREQUENCY, + WAVES_FREQUENCY_SCALING, + WAVES_SPEED, + WAVES_SPEED_SCALING, + WAVES_SHAPE, + WAVES_OCTAVES, + WAVES_MIX, + WAVES_PULL, + WAVES_DIRECTION_INCREMENT, + MIDTONES_CONTRAST, + HIGHLIGHTS_CONTRAST, + SHADOWS_CONTRAST, + /** + * @since v944 + */ + HIGHLIGHTS_GAIN, + /** + * @since v944 + */ + HIGHLIGHTS_GAMMA, + /** + * @since v944 + */ + HIGHLIGHTS_OFFSET, + /** + * @since v944 + */ + HIGHLIGHTS_SATURATION, + /** + * @since v944 + */ + MIDTONES_GAIN, + /** + * @since v944 + */ + MIDTONES_GAMMA, + /** + * @since v944 + */ + MIDTONES_OFFSET, + /** + * @since v944 + */ + MIDTONES_SATURATION, + /** + * @since v944 + */ + SHADOWS_GAIN, + /** + * @since v944 + */ + SHADOWS_GAMMA, + /** + * @since v944 + */ + SHADOWS_OFFSET, + /** + * @since v944 + */ + SHADOWS_SATURATION, + /** + * @since v944 + */ + HIGHLIGHTS_MIN, + /** + * @since v944 + */ + SHADOWS_MAX, + /** + * @since v944 + */ + TEMPERATURE, + /** + * @since v944 + */ + SUN_COLOR, + /** + * @since v944 + */ + SUN_ILLUMINANCE, + /** + * @since v944 + */ + MOON_COLOR, + /** + * @since v944 + */ + MOON_ILLUMINANCE, + /** + * @since v944 + */ + FLASH_COLOR, + /** + * @since v944 + */ + FLASH_ILLUMINANCE, + /** + * @since v944 + */ + AMBIENT_COLOR, + /** + * @since v944 + */ + AMBIENT_ILLUMINANCE, + /** + * @since v975 + */ + EMISSIVE_DESATURATION, + /** + * @since v975 + */ + SKY_INTENSITY, + /** + * @since v975 + */ + ORBITAL_OFFSET_DEGREES, } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/LocatorBarWaypoint.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/LocatorBarWaypoint.java new file mode 100644 index 0000000..621ad68 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/LocatorBarWaypoint.java @@ -0,0 +1,34 @@ +package org.cloudburstmc.protocol.bedrock.data; + +import lombok.Data; +import lombok.Value; +import org.cloudburstmc.math.vector.Vector2f; +import org.cloudburstmc.math.vector.Vector3f; + +import java.awt.Color; + +@Data +public class LocatorBarWaypoint { + + private int updateFlag; + private Boolean visible; + private WorldPosition worldPosition; + /** + * @deprecated since v975 + */ + private Integer textureId; + private String texturePath; + /** + * @since v975 + */ + private Vector2f iconSize; + private Color color; + private Boolean clientPositionAuthority; + private Long entityUniqueId; + + @Value + public static class WorldPosition { + Vector3f position; + int dimension; + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/MovementEffectType.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/MovementEffectType.java index 8b979b9..c3becc2 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/MovementEffectType.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/MovementEffectType.java @@ -8,7 +8,12 @@ public enum MovementEffectType { INVALID(-1), - GLIDE_BOOST(0); + GLIDE_BOOST(0), + DOLPHIN_BOOST(1), + /** + * @since v1001 + */ + GEYSER_BOOST(2); private final int id; @@ -22,4 +27,4 @@ public static MovementEffectType byId(int id) { } return null; } -} \ No newline at end of file +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/ParticleType.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/ParticleType.java index 23d578d..362d54c 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/ParticleType.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/ParticleType.java @@ -141,5 +141,17 @@ public enum ParticleType implements LevelEventType { /** * @since v843 */ - GREEN_FLAME + GREEN_FLAME, + /** + * @since v944 + */ + PAUSE_MOB_GROWTH, + /** + * @since v944 + */ + RESET_MOB_GROWTH, + /** + * @since v975 + */ + SULFUR_CUBE, } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/PresenceConfiguration.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/PresenceConfiguration.java new file mode 100644 index 0000000..4ce9ed0 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/PresenceConfiguration.java @@ -0,0 +1,17 @@ +package org.cloudburstmc.protocol.bedrock.data; + +import lombok.Value; +import org.checkerframework.checker.nullness.qual.Nullable; + +@Value +public class PresenceConfiguration { + + @Nullable // since v1001 + String experienceName; + @Nullable // since v1001 + String worldName; + /** + * @since v1001 + */ + String richPresenceId; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/SerializableVoxelShape.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/SerializableVoxelShape.java new file mode 100644 index 0000000..15bfbb7 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/SerializableVoxelShape.java @@ -0,0 +1,23 @@ +package org.cloudburstmc.protocol.bedrock.data; + +import lombok.Value; + +import java.util.List; + +@Value +public class SerializableVoxelShape { + + SerializableCells cells; + List xCoordinates; + List yCoordinates; + List zCoordinates; + + @Value + public static class SerializableCells { + + short xSize; + short ySize; + short zSize; + List storage; + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/ServerConfigurationJoinInfo.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/ServerConfigurationJoinInfo.java new file mode 100644 index 0000000..5bf136d --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/ServerConfigurationJoinInfo.java @@ -0,0 +1,15 @@ +package org.cloudburstmc.protocol.bedrock.data; + +import lombok.Value; +import org.checkerframework.checker.nullness.qual.Nullable; + +@Value +public class ServerConfigurationJoinInfo { + + @Nullable + GatheringsConfigurationJoinInfo gatheringsConfigurationJoinInfo; + @Nullable + ClientStoreEntrypointConfiguration clientStoreEntrypointConfiguration; + @Nullable + PresenceConfiguration presenceConfiguration; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/SoundEvent.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/SoundEvent.java index 86aa05a..4e1232f 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/SoundEvent.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/SoundEvent.java @@ -1,930 +1,1194 @@ package org.cloudburstmc.protocol.bedrock.data; +import java.util.HashMap; +import java.util.Map; + +@SuppressWarnings("DeprecatedIsStillUsed") public enum SoundEvent { - ITEM_USE_ON, - HIT, - STEP, - FLY, - JUMP, - BREAK, - PLACE, - HEAVY_STEP, - GALLOP, - FALL, - AMBIENT, - AMBIENT_BABY, - AMBIENT_IN_WATER, - BREATHE, - DEATH, - DEATH_IN_WATER, - DEATH_TO_ZOMBIE, - HURT, - HURT_IN_WATER, - MAD, - BOOST, - BOW, - SQUISH_BIG, - SQUISH_SMALL, - FALL_BIG, - FALL_SMALL, - SPLASH, - FIZZ, - FLAP, - SWIM, - DRINK, - EAT, - TAKEOFF, - SHAKE, - PLOP, - LAND, - SADDLE, - ARMOR, - MOB_ARMOR_STAND_PLACE, - ADD_CHEST, - THROW, - ATTACK, - ATTACK_NODAMAGE, - ATTACK_STRONG, - WARN, - SHEAR, - MILK, - THUNDER, - EXPLODE, - FIRE, - IGNITE, - FUSE, - STARE, - SPAWN, - SHOOT, - BREAK_BLOCK, - LAUNCH, - BLAST, - LARGE_BLAST, - TWINKLE, - REMEDY, - UNFECT, - LEVELUP, - BOW_HIT, - BULLET_HIT, - EXTINGUISH_FIRE, - ITEM_FIZZ, - CHEST_OPEN, - CHEST_CLOSED, - SHULKERBOX_OPEN, - SHULKERBOX_CLOSED, - ENDERCHEST_OPEN, - ENDERCHEST_CLOSED, - POWER_ON, - POWER_OFF, - ATTACH, - DETACH, - DENY, - TRIPOD, - POP, - DROP_SLOT, - NOTE, - THORNS, - PISTON_IN, - PISTON_OUT, - PORTAL, - WATER, - LAVA_POP, - LAVA, - BURP, - BUCKET_FILL_WATER, - BUCKET_FILL_LAVA, - BUCKET_EMPTY_WATER, - BUCKET_EMPTY_LAVA, - ARMOR_EQUIP_CHAIN, - ARMOR_EQUIP_DIAMOND, - ARMOR_EQUIP_GENERIC, - ARMOR_EQUIP_GOLD, - ARMOR_EQUIP_IRON, - ARMOR_EQUIP_LEATHER, - ARMOR_EQUIP_ELYTRA, - RECORD_13, - RECORD_CAT, - RECORD_BLOCKS, - RECORD_CHIRP, - RECORD_FAR, - RECORD_MALL, - RECORD_MELLOHI, - RECORD_STAL, - RECORD_STRAD, - RECORD_WARD, - RECORD_11, - RECORD_WAIT, - STOP_RECORD, //Not really a sound - FLOP, - ELDERGUARDIAN_CURSE, - MOB_WARNING, - MOB_WARNING_BABY, - TELEPORT, - SHULKER_OPEN, - SHULKER_CLOSE, - HAGGLE, - HAGGLE_YES, - HAGGLE_NO, - HAGGLE_IDLE, - CHORUS_GROW, - CHORUS_DEATH, - GLASS, - POTION_BREWED, - CAST_SPELL, - PREPARE_ATTACK, - PREPARE_SUMMON, - PREPARE_WOLOLO, - FANG, - CHARGE, - CAMERA_TAKE_PICTURE, - LEASHKNOT_PLACE, - LEASHKNOT_BREAK, - GROWL, - WHINE, - PANT, - PURR, - PURREOW, - DEATH_MIN_VOLUME, - DEATH_MID_VOLUME, - IMITATE_BLAZE, - IMITATE_CAVE_SPIDER, - IMITATE_CREEPER, - IMITATE_ELDER_GUARDIAN, - IMITATE_ENDER_DRAGON, - IMITATE_ENDERMAN, - IMITATE_ENDERMITE, - IMITATE_EVOCATION_ILLAGER, - IMITATE_GHAST, - IMITATE_HUSK, - IMITATE_ILLUSION_ILLAGER, - IMITATE_MAGMA_CUBE, - IMITATE_POLAR_BEAR, - IMITATE_SHULKER, - IMITATE_SILVERFISH, - IMITATE_SKELETON, - IMITATE_SLIME, - IMITATE_SPIDER, - IMITATE_STRAY, - IMITATE_VEX, - IMITATE_VINDICATION_ILLAGER, - IMITATE_WITCH, - IMITATE_WITHER, - IMITATE_WITHER_SKELETON, - IMITATE_WOLF, - IMITATE_ZOMBIE, - IMITATE_ZOMBIE_PIGMAN, - IMITATE_ZOMBIE_VILLAGER, - BLOCK_END_PORTAL_FRAME_FILL, - BLOCK_END_PORTAL_SPAWN, - RANDOM_ANVIL_USE, - BOTTLE_DRAGONBREATH, - PORTAL_TRAVEL, - ITEM_TRIDENT_HIT, - ITEM_TRIDENT_RETURN, - ITEM_TRIDENT_RIPTIDE_1, - ITEM_TRIDENT_RIPTIDE_2, - ITEM_TRIDENT_RIPTIDE_3, - ITEM_TRIDENT_THROW, - ITEM_TRIDENT_THUNDER, - ITEM_TRIDENT_HIT_GROUND, - DEFAULT, - ELEMENT_CONSTRUCTOR_OPEN, - FLETCHING_TABLE_USE, - ICE_BOMB_HIT, - BALLOON_POP, - LT_REACTION_ICE_BOMB, - LT_REACTION_BLEACH, - LT_REACTION_E_PASTE, - LT_REACTION_E_PASTE2, - LT_REACTION_FERTILIZER, - LT_REACTION_FIREBALL, - LT_REACTION_MG_SALT, - LT_REACTION_MISC_FIRE, - LT_REACTION_FIRE, - LT_REACTION_MISC_EXPLOSION, - LT_REACTION_MISC_MYSTICAL, - LT_REACTION_MISC_MYSTICAL2, - LT_REACTION_PRODUCT, - SPARKLER_USE, - GLOWSTICK_USE, - SPARKLER_ACTIVE, - CONVERT_TO_DROWNED, - BUCKET_FILL_FISH, - BUCKET_EMPTY_FISH, - BUBBLE_UP, - BUBBLE_DOWN, - BUBBLE_POP, - BUBBLE_UP_INSIDE, - BUBBLE_DOWN_INSIDE, - BABY_HURT, - BABY_DEATH, - BABY_STEP, - BABY_SPAWN, - BORN, - BLOCK_TURTLE_EGG_BREAK, - BLOCK_TURTLE_EGG_CRACK, - BLOCK_TURTLE_EGG_HATCH, - TURTLE_LAY_EGG, - BLOCK_TURTLE_EGG_ATTACK, - BEACON_ACTIVATE, - BEACON_AMBIENT, - BEACON_DEACTIVATE, - BEACON_POWER, - CONDUIT_ACTIVATE, - CONDUIT_AMBIENT, - CONDUIT_ATTACK, - CONDUIT_DEACTIVATE, - CONDUIT_SHORT, - SWOOP, - BLOCK_BAMBOO_SAPLING_PLACE, - PRE_SNEEZE, - SNEEZE, - AMBIENT_TAME, - SCARED, - BLOCK_SCAFFOLDING_CLIMB, - CROSSBOW_LOADING_START, - CROSSBOW_LOADING_MIDDLE, - CROSSBOW_LOADING_END, - CROSSBOW_SHOOT, - CROSSBOW_QUICK_CHARGE_START, - CROSSBOW_QUICK_CHARGE_MIDDLE, - CROSSBOW_QUICK_CHARGE_END, - AMBIENT_AGGRESSIVE, - AMBIENT_WORRIED, - CANT_BREED, - SHIELD_BLOCK, - LECTERN_BOOK_PLACE, - GRINDSTONE_USE, - BELL, - CAMPFIRE_CRACKLE, - SWEET_BERRY_BUSH_HURT, - SWEET_BERRY_BUSH_PICK, - ROAR, - STUN, - CARTOGRAPHY_TABLE_USE, - TABLE_USE, - STONECUTTER_USE, - COMPOSTER_EMPTY, - COMPOSTER_FILL, - COMPOSTER_FILL_LAYER, - COMPOSTER_READY, - BARREL_OPEN, - BARREL_CLOSE, - RAID_HORN, - LOOM_USE, - AMBIENT_IN_RAID, - UI_CARTOGRAPHY_TABLE_USE, - UI_STONECUTTER_USE, - UI_LOOM_USE, - SMOKER_USE, - BLAST_FURNACE_USE, - SMITHING_TABLE_USE, - SCREECH, - SLEEP, - FURNACE_USE, - MOOSHROOM_CONVERT, - MILK_SUSPICIOUSLY, - CELEBRATE, - JUMP_PREVENT, - AMBIENT_POLLINATE, - BEEHIVE_DRIP, - BEEHIVE_ENTER, - BEEHIVE_EXIT, - BEEHIVE_WORK, - BEEHIVE_SHEAR, - HONEYBOTTLE_DRINK, - AMBIENT_CAVE, - RETREAT, - CONVERT_TO_ZOMBIFIED, - ADMIRE, - STEP_LAVA, - TEMPT, - PANIC, - ANGRY, - AMBIENT_WARPED_FOREST, - AMBIENT_SOULSAND_VALLEY, - AMBIENT_NETHER_WASTES, - AMBIENT_BASALT_DELTAS, - AMBIENT_CRIMSON_FOREST, - RESPAWN_ANCHOR_CHARGE, - RESPAWN_ANCHOR_DEPLETE, - RESPAWN_ANCHOR_SET_SPAWN, - RESPAWN_ANCHOR_AMBIENT, - SOUL_ESCAPE_QUIET, - SOUL_ESCAPE_LOUD, - RECORD_PIGSTEP, - LINK_COMPASS_TO_LODESTONE, - USE_SMITHING_TABLE, - EQUIP_NETHERITE, - AMBIENT_LOOP_WARPED_FOREST, - AMBIENT_LOOP_SOULSAND_VALLEY, - AMBIENT_LOOP_NETHER_WASTES, - AMBIENT_LOOP_BASALT_DELTAS, - AMBIENT_LOOP_CRIMSON_FOREST, - AMBIENT_ADDITION_WARPED_FOREST, - AMBIENT_ADDITION_SOULSAND_VALLEY, - AMBIENT_ADDITION_NETHER_WASTES, - AMBIENT_ADDITION_BASALT_DELTAS, - AMBIENT_ADDITION_CRIMSON_FOREST, - SCULK_SENSOR_POWER_ON, - SCULK_SENSOR_POWER_OFF, - BUCKET_FILL_POWDER_SNOW, - BUCKET_EMPTY_POWDER_SNOW, - POINTED_DRIPSTONE_CAULDRON_DRIP_WATER, - POINTED_DRIPSTONE_CAULDRON_DRIP_LAVA, - POINTED_DRIPSTONE_DRIP_WATER, - POINTED_DRIPSTONE_DRIP_LAVA, - CAVE_VINES_PICK_BERRIES, - BIG_DRIPLEAF_TILT_DOWN, - BIG_DRIPLEAF_TILT_UP, - COPPER_WAX_ON, - COPPER_WAX_OFF, - SCRAPE, - PLAYER_HURT_DROWN, - PLAYER_HURT_ON_FIRE, - PLAYER_HURT_FREEZE, - USE_SPYGLASS, - STOP_USING_SPYGLASS, - AMETHYST_BLOCK_CHIME, - AMBIENT_SCREAMER, - HURT_SCREAMER, - DEATH_SCREAMER, - MILK_SCREAMER, - JUMP_TO_BLOCK, - PRE_RAM, - PRE_RAM_SCREAMER, - RAM_IMPACT, - RAM_IMPACT_SCREAMER, - SQUID_INK_SQUIRT, - GLOW_SQUID_INK_SQUIRT, - CONVERT_TO_STRAY, - CAKE_ADD_CANDLE, - EXTINGUISH_CANDLE, - AMBIENT_CANDLE, - BLOCK_CLICK, - BLOCK_CLICK_FAIL, - SCULK_CATALYST_BLOOM, - SCULK_SHRIEKER_SHRIEK, - WARDEN_NEARBY_CLOSE, - WARDEN_NEARBY_CLOSER, - WARDEN_NEARBY_CLOSEST, - WARDEN_SLIGHTLY_ANGRY, - RECORD_OTHERSIDE, - TONGUE, - CRACK_IRON_GOLEM, - REPAIR_IRON_GOLEM, - LISTENING, - HEARTBEAT, - HORN_BREAK, - SCULK_PLACE, - SCULK_SPREAD, - SCULK_CHARGE, - SCULK_SENSOR_PLACE, - SCULK_SHRIEKER_PLACE, - GOAT_CALL_0, - GOAT_CALL_1, - GOAT_CALL_2, - GOAT_CALL_3, - GOAT_CALL_4, - GOAT_CALL_5, - GOAT_CALL_6, - GOAT_CALL_7, - GOAT_CALL_8, - GOAT_CALL_9, - GOAT_HARMONY_0, - GOAT_HARMONY_1, - GOAT_HARMONY_2, - GOAT_HARMONY_3, - GOAT_HARMONY_4, - GOAT_HARMONY_5, - GOAT_HARMONY_6, - GOAT_HARMONY_7, - GOAT_HARMONY_8, - GOAT_HARMONY_9, - GOAT_MELODY_0, - GOAT_MELODY_1, - GOAT_MELODY_2, - GOAT_MELODY_3, - GOAT_MELODY_4, - GOAT_MELODY_5, - GOAT_MELODY_6, - GOAT_MELODY_7, - GOAT_MELODY_8, - GOAT_MELODY_9, - GOAT_BASS_0, - GOAT_BASS_1, - GOAT_BASS_2, - GOAT_BASS_3, - GOAT_BASS_4, - GOAT_BASS_5, - GOAT_BASS_6, - GOAT_BASS_7, - GOAT_BASS_8, - GOAT_BASS_9, - IMITATE_WARDEN, - LISTENING_ANGRY, - ITEM_GIVEN, - ITEM_TAKEN, - DISAPPEARED, - REAPPEARED, - FROGSPAWN_HATCHED, - LAY_SPAWN, - FROGSPAWN_BREAK, - SONIC_BOOM, - SONIC_CHARGE, - ITEM_THROWN, - RECORD_5, - CONVERT_TO_FROG, - MILK_DRINK, - RECORD_PLAYING, - ENCHANTING_TABLE_USE, - BUNDLE_DROP_CONTENTS, - BUNDLE_INSERT, - BUNDLE_REMOVE_ONE, + ITEM_USE_ON("item.use.on"), + HIT("hit"), + STEP("step"), + FLY("fly"), + JUMP("jump"), + BREAK("break"), + PLACE("place"), + HEAVY_STEP("heavy.step"), + GALLOP("gallop"), + FALL("fall"), + AMBIENT("ambient"), + AMBIENT_BABY("ambient.baby"), + AMBIENT_IN_WATER("ambient.in.water"), + BREATHE("breathe"), + DEATH("death"), + DEATH_IN_WATER("death.in.water"), + DEATH_TO_ZOMBIE("death.to.zombie"), + HURT("hurt"), + HURT_IN_WATER("hurt.in.water"), + MAD("mad"), + BOOST("boost"), + BOW("bow"), + SQUISH_BIG("squish.big"), + SQUISH_SMALL("squish.small"), + FALL_BIG("fall.big"), + FALL_SMALL("fall.small"), + SPLASH("splash"), + FIZZ("fizz"), + FLAP("flap"), + SWIM("swim"), + DRINK("drink"), + EAT("eat"), + TAKEOFF("takeoff"), + SHAKE("shake"), + PLOP("plop"), + LAND("land"), + SADDLE("saddle"), + ARMOR("armor"), + MOB_ARMOR_STAND_PLACE("mob.armor_stand.place"), + ADD_CHEST("add.chest"), + THROW("throw"), + ATTACK("attack"), + ATTACK_NODAMAGE("attack.nodamage"), + ATTACK_STRONG("attack.strong"), + WARN("warn"), + SHEAR("shear"), + MILK("milk"), + THUNDER("thunder"), + EXPLODE("explode"), + FIRE("fire"), + IGNITE("ignite"), + FUSE("fuse"), + STARE("stare"), + SPAWN("spawn"), + SHOOT("shoot"), + BREAK_BLOCK("break.block"), + LAUNCH("launch"), + BLAST("blast"), + LARGE_BLAST("large.blast"), + TWINKLE("twinkle"), + REMEDY("remedy"), + UNFECT("unfect"), + LEVELUP("levelup"), + BOW_HIT("bow.hit"), + BULLET_HIT("bullet.hit"), + EXTINGUISH_FIRE("extinguish.fire"), + ITEM_FIZZ("item.fizz"), + CHEST_OPEN("chest.open"), + CHEST_CLOSED("chest.closed"), + SHULKERBOX_OPEN("shulkerbox.open"), + SHULKERBOX_CLOSED("shulkerbox.closed"), + ENDERCHEST_OPEN("enderchest.open"), + ENDERCHEST_CLOSED("enderchest.closed"), + POWER_ON("power.on"), + POWER_OFF("power.off"), + ATTACH("attach"), + DETACH("detach"), + DENY("deny"), + TRIPOD("tripod"), + POP("pop"), + DROP_SLOT("drop.slot"), + NOTE("note"), + THORNS("thorns"), + PISTON_IN("piston.in"), + PISTON_OUT("piston.out"), + PORTAL("portal"), + WATER("water"), + LAVA_POP("lava.pop"), + LAVA("lava"), + BURP("burp"), + BUCKET_FILL_WATER("bucket.fill.water"), + BUCKET_FILL_LAVA("bucket.fill.lava"), + BUCKET_EMPTY_WATER("bucket.empty.water"), + BUCKET_EMPTY_LAVA("bucket.empty.lava"), + ARMOR_EQUIP_CHAIN("armor.equip_chain"), + ARMOR_EQUIP_DIAMOND("armor.equip_diamond"), + ARMOR_EQUIP_GENERIC("armor.equip_generic"), + ARMOR_EQUIP_GOLD("armor.equip_gold"), + ARMOR_EQUIP_IRON("armor.equip_iron"), + ARMOR_EQUIP_LEATHER("armor.equip_leather"), + ARMOR_EQUIP_ELYTRA("armor.equip_elytra"), + RECORD_13("record.13"), + RECORD_CAT("record.cat"), + RECORD_BLOCKS("record.blocks"), + RECORD_CHIRP("record.chirp"), + RECORD_FAR("record.far"), + RECORD_MALL("record.mall"), + RECORD_MELLOHI("record.mellohi"), + RECORD_STAL("record.stal"), + RECORD_STRAD("record.strad"), + RECORD_WARD("record.ward"), + RECORD_11("record.11"), + RECORD_WAIT("record.wait"), + STOP_RECORD("record.null"), + FLOP("flop"), + ELDERGUARDIAN_CURSE("elderguardian.curse"), + MOB_WARNING("mob.warning"), + MOB_WARNING_BABY("mob.warning.baby"), + TELEPORT("teleport"), + SHULKER_OPEN("shulker.open"), + SHULKER_CLOSE("shulker.close"), + HAGGLE("haggle"), + HAGGLE_YES("haggle.yes"), + HAGGLE_NO("haggle.no"), + HAGGLE_IDLE("haggle.idle"), + CHORUS_GROW("chorusgrow"), + CHORUS_DEATH("chorusdeath"), + GLASS("glass"), + POTION_BREWED("potion.brewed"), + CAST_SPELL("cast.spell"), + PREPARE_ATTACK("prepare.attack"), + PREPARE_SUMMON("prepare.summon"), + PREPARE_WOLOLO("prepare.wololo"), + FANG("fang"), + CHARGE("charge"), + CAMERA_TAKE_PICTURE("camera.take_picture"), + LEASHKNOT_PLACE("leashknot.place"), + LEASHKNOT_BREAK("leashknot.break"), + GROWL("growl"), + WHINE("whine"), + PANT("pant"), + PURR("purr"), + PURREOW("purreow"), + DEATH_MIN_VOLUME("death.min.volume"), + DEATH_MID_VOLUME("death.mid.volume"), + IMITATE_BLAZE("imitate.blaze"), + IMITATE_CAVE_SPIDER("imitate.cave_spider"), + IMITATE_CREEPER("imitate.creeper"), + IMITATE_ELDER_GUARDIAN("imitate.elder_guardian"), + IMITATE_ENDER_DRAGON("imitate.ender_dragon"), + IMITATE_ENDERMAN("imitate.enderman"), + IMITATE_ENDERMITE("imitate.endermite"), + IMITATE_EVOCATION_ILLAGER("imitate.evocation_illager"), + IMITATE_GHAST("imitate.ghast"), + IMITATE_HUSK("imitate.husk"), + /** + * @deprecated since v1001 + */ + IMITATE_ILLUSION_ILLAGER("undefined"), + IMITATE_MAGMA_CUBE("imitate.magma_cube"), + IMITATE_POLAR_BEAR("imitate.polar_bear"), + IMITATE_SHULKER("imitate.shulker"), + IMITATE_SILVERFISH("imitate.silverfish"), + IMITATE_SKELETON("imitate.skeleton"), + IMITATE_SLIME("imitate.slime"), + IMITATE_SPIDER("imitate.spider"), + IMITATE_STRAY("imitate.stray"), + IMITATE_VEX("imitate.vex"), + IMITATE_VINDICATION_ILLAGER("imitate.vindication_illager"), + IMITATE_WITCH("imitate.witch"), + IMITATE_WITHER("imitate.wither"), + IMITATE_WITHER_SKELETON("imitate.wither_skeleton"), + IMITATE_WOLF("imitate.wolf"), + IMITATE_ZOMBIE("imitate.zombie"), + IMITATE_ZOMBIE_PIGMAN("imitate.zombie_pigman"), + IMITATE_ZOMBIE_VILLAGER("imitate.zombie_villager"), + BLOCK_END_PORTAL_FRAME_FILL("block.end_portal_frame.fill"), + BLOCK_END_PORTAL_SPAWN("block.end_portal.spawn"), + RANDOM_ANVIL_USE("random.anvil_use"), + BOTTLE_DRAGONBREATH("bottle.dragonbreath"), + PORTAL_TRAVEL("portal.travel"), + ITEM_TRIDENT_HIT("item.trident.hit"), + ITEM_TRIDENT_RETURN("item.trident.return"), + ITEM_TRIDENT_RIPTIDE_1("item.trident.riptide_1"), + ITEM_TRIDENT_RIPTIDE_2("item.trident.riptide_2"), + ITEM_TRIDENT_RIPTIDE_3("item.trident.riptide_3"), + ITEM_TRIDENT_THROW("item.trident.throw"), + ITEM_TRIDENT_THUNDER("item.trident.thunder"), + ITEM_TRIDENT_HIT_GROUND("item.trident.hit_ground"), + DEFAULT("default"), + ELEMENT_CONSTRUCTOR_OPEN("elemconstruct.open"), + FLETCHING_TABLE_USE("block.fletching_table.use"), + ICE_BOMB_HIT("icebomb.hit"), + BALLOON_POP("balloonpop"), + LT_REACTION_ICE_BOMB("lt.reaction.icebomb"), + LT_REACTION_BLEACH("lt.reaction.bleach"), + LT_REACTION_E_PASTE("lt.reaction.epaste"), + LT_REACTION_E_PASTE2("lt.reaction.epaste2"), + LT_REACTION_FERTILIZER("lt.reaction.fertilizer"), + LT_REACTION_FIREBALL("lt.reaction.fireball"), + LT_REACTION_MG_SALT("lt.reaction.mgsalt"), + LT_REACTION_MISC_FIRE("lt.reaction.miscfire"), + LT_REACTION_FIRE("lt.reaction.fire"), + LT_REACTION_MISC_EXPLOSION("lt.reaction.miscexplosion"), + LT_REACTION_MISC_MYSTICAL("lt.reaction.miscmystical"), + LT_REACTION_MISC_MYSTICAL2("lt.reaction.miscmystical2"), + LT_REACTION_PRODUCT("lt.reaction.product"), + SPARKLER_USE("sparkler.use"), + GLOWSTICK_USE("glowstick.use"), + SPARKLER_ACTIVE("sparkler.active"), + CONVERT_TO_DROWNED("convert_to_drowned"), + BUCKET_FILL_FISH("bucket.fill.fish"), + BUCKET_EMPTY_FISH("bucket.empty.fish"), + BUBBLE_UP("bubble.up"), + BUBBLE_DOWN("bubble.down"), + BUBBLE_POP("bubble.pop"), + BUBBLE_UP_INSIDE("bubble.upinside"), + BUBBLE_DOWN_INSIDE("bubble.downinside"), + BABY_HURT("hurt.baby"), + BABY_DEATH("death.baby"), + BABY_STEP("step.baby"), + /** + * @deprecated since v1001 + */ + BABY_SPAWN("undefined"), + BORN("born"), + BLOCK_TURTLE_EGG_BREAK("block.turtle_egg.break"), + BLOCK_TURTLE_EGG_CRACK("block.turtle_egg.crack"), + BLOCK_TURTLE_EGG_HATCH("block.turtle_egg.hatch"), + TURTLE_LAY_EGG("lay_egg"), + BLOCK_TURTLE_EGG_ATTACK("block.turtle_egg.attack"), + BEACON_ACTIVATE("beacon.activate"), + BEACON_AMBIENT("beacon.ambient"), + BEACON_DEACTIVATE("beacon.deactivate"), + BEACON_POWER("beacon.power"), + CONDUIT_ACTIVATE("conduit.activate"), + CONDUIT_AMBIENT("conduit.ambient"), + CONDUIT_ATTACK("conduit.attack"), + CONDUIT_DEACTIVATE("conduit.deactivate"), + CONDUIT_SHORT("conduit.short"), + SWOOP("swoop"), + BLOCK_BAMBOO_SAPLING_PLACE("block.bamboo_sapling.place"), + PRE_SNEEZE("presneeze"), + SNEEZE("sneeze"), + AMBIENT_TAME("ambient.tame"), + SCARED("scared"), + BLOCK_SCAFFOLDING_CLIMB("block.scaffolding.climb"), + CROSSBOW_LOADING_START("crossbow.loading.start"), + CROSSBOW_LOADING_MIDDLE("crossbow.loading.middle"), + CROSSBOW_LOADING_END("crossbow.loading.end"), + CROSSBOW_SHOOT("crossbow.shoot"), + CROSSBOW_QUICK_CHARGE_START("crossbow.quick_charge.start"), + CROSSBOW_QUICK_CHARGE_MIDDLE("crossbow.quick_charge.middle"), + CROSSBOW_QUICK_CHARGE_END("crossbow.quick_charge.end"), + AMBIENT_AGGRESSIVE("ambient.aggressive"), + AMBIENT_WORRIED("ambient.worried"), + CANT_BREED("cant_breed"), + SHIELD_BLOCK("item.shield.block"), + LECTERN_BOOK_PLACE("item.book.put"), + GRINDSTONE_USE("block.grindstone.use"), + BELL("block.bell.hit"), + CAMPFIRE_CRACKLE("block.campfire.crackle"), + SWEET_BERRY_BUSH_HURT("block.sweet_berry_bush.hurt"), + SWEET_BERRY_BUSH_PICK("block.sweet_berry_bush.pick"), + ROAR("roar"), + STUN("stun"), + CARTOGRAPHY_TABLE_USE("block.cartography_table.use"), + STONECUTTER_USE("block.stonecutter.use"), + COMPOSTER_EMPTY("block.composter.empty"), + COMPOSTER_FILL("block.composter.fill"), + COMPOSTER_FILL_LAYER("block.composter.fill_success"), + COMPOSTER_READY("block.composter.ready"), + BARREL_OPEN("block.barrel.open"), + BARREL_CLOSE("block.barrel.close"), + RAID_HORN("raid.horn"), + LOOM_USE("block.loom.use"), + AMBIENT_IN_RAID("ambient.in.raid"), + UI_CARTOGRAPHY_TABLE_USE("ui.cartography_table.take_result"), + UI_STONECUTTER_USE("ui.stonecutter.take_result"), + UI_LOOM_USE("ui.loom.take_result"), + SMOKER_USE("block.smoker.smoke"), + BLAST_FURNACE_USE("block.blastfurnace.fire_crackle"), + SMITHING_TABLE_USE("block.smithing_table.use"), + SCREECH("screech"), + SLEEP("sleep"), + FURNACE_USE("block.furnace.lit"), + MOOSHROOM_CONVERT("convert_mooshroom"), + MILK_SUSPICIOUSLY("milk_suspiciously"), + CELEBRATE("celebrate"), + JUMP_PREVENT("jump.prevent"), + AMBIENT_POLLINATE("ambient.pollinate"), + BEEHIVE_DRIP("block.beehive.drip"), + BEEHIVE_ENTER("block.beehive.enter"), + BEEHIVE_EXIT("block.beehive.exit"), + BEEHIVE_WORK("block.beehive.work"), + BEEHIVE_SHEAR("block.beehive.shear"), + HONEYBOTTLE_DRINK("drink.honey"), + AMBIENT_CAVE("ambient.cave"), + RETREAT("retreat"), + CONVERT_TO_ZOMBIFIED("converted_to_zombified"), + ADMIRE("admire"), + STEP_LAVA("step_lava"), + TEMPT("tempt"), + PANIC("panic"), + ANGRY("angry"), + AMBIENT_WARPED_FOREST("ambient.warped_forest.mood"), + AMBIENT_SOULSAND_VALLEY("ambient.soulsand_valley.mood"), + AMBIENT_NETHER_WASTES("ambient.nether_wastes.mood"), + AMBIENT_BASALT_DELTAS("ambient.basalt_deltas.mood"), + AMBIENT_CRIMSON_FOREST("ambient.crimson_forest.mood"), + RESPAWN_ANCHOR_CHARGE("respawn_anchor.charge"), + RESPAWN_ANCHOR_DEPLETE("respawn_anchor.deplete"), + RESPAWN_ANCHOR_SET_SPAWN("respawn_anchor.set_spawn"), + RESPAWN_ANCHOR_AMBIENT("respawn_anchor.ambient"), + SOUL_ESCAPE_QUIET("particle.soul_escape.quiet"), + SOUL_ESCAPE_LOUD("particle.soul_escape.loud"), + RECORD_PIGSTEP("record.pigstep"), + LINK_COMPASS_TO_LODESTONE("lodestone_compass.link_compass_to_lodestone"), + USE_SMITHING_TABLE("smithing_table.use"), + EQUIP_NETHERITE("armor.equip_netherite"), + AMBIENT_LOOP_WARPED_FOREST("ambient.warped_forest.loop"), + AMBIENT_LOOP_SOULSAND_VALLEY("ambient.soulsand_valley.loop"), + AMBIENT_LOOP_NETHER_WASTES("ambient.nether_wastes.loop"), + AMBIENT_LOOP_BASALT_DELTAS("ambient.basalt_deltas.loop"), + AMBIENT_LOOP_CRIMSON_FOREST("ambient.crimson_forest.loop"), + AMBIENT_ADDITION_WARPED_FOREST("ambient.warped_forest.additions"), + AMBIENT_ADDITION_SOULSAND_VALLEY("ambient.soulsand_valley.additions"), + AMBIENT_ADDITION_NETHER_WASTES("ambient.nether_wastes.additions"), + AMBIENT_ADDITION_BASALT_DELTAS("ambient.basalt_deltas.additions"), + AMBIENT_ADDITION_CRIMSON_FOREST("ambient.crimson_forest.additions"), + SCULK_SENSOR_POWER_ON("power.on.sculk_sensor"), + SCULK_SENSOR_POWER_OFF("power.off.sculk_sensor"), + BUCKET_FILL_POWDER_SNOW("bucket.fill.powder_snow"), + BUCKET_EMPTY_POWDER_SNOW("bucket.empty.powder_snow"), + POINTED_DRIPSTONE_CAULDRON_DRIP_WATER("cauldron_drip.lava.pointed_dripstone"), + POINTED_DRIPSTONE_CAULDRON_DRIP_LAVA("cauldron_drip.water.pointed_dripstone"), + POINTED_DRIPSTONE_DRIP_WATER("drip.lava.pointed_dripstone"), + POINTED_DRIPSTONE_DRIP_LAVA("drip.water.pointed_dripstone"), + CAVE_VINES_PICK_BERRIES("pick_berries.cave_vines"), + BIG_DRIPLEAF_TILT_DOWN("tilt_down.big_dripleaf"), + BIG_DRIPLEAF_TILT_UP("tilt_up.big_dripleaf"), + COPPER_WAX_ON("copper.wax.on"), + COPPER_WAX_OFF("copper.wax.off"), + SCRAPE("scrape"), + PLAYER_HURT_DROWN("mob.player.hurt_drown"), + PLAYER_HURT_ON_FIRE("mob.player.hurt_on_fire"), + PLAYER_HURT_FREEZE("mob.player.hurt_freeze"), + USE_SPYGLASS("item.spyglass.use"), + STOP_USING_SPYGLASS("item.spyglass.stop_using"), + AMETHYST_BLOCK_CHIME("chime.amethyst_block"), + AMBIENT_SCREAMER("ambient.screamer"), + HURT_SCREAMER("hurt.screamer"), + DEATH_SCREAMER("death.screamer"), + MILK_SCREAMER("milk.screamer"), + JUMP_TO_BLOCK("jump_to_block"), + PRE_RAM("pre_ram"), + PRE_RAM_SCREAMER("pre_ram.screamer"), + RAM_IMPACT("ram_impact"), + RAM_IMPACT_SCREAMER("ram_impact.screamer"), + SQUID_INK_SQUIRT("squid.ink_squirt"), + GLOW_SQUID_INK_SQUIRT("glow_squid.ink_squirt"), + CONVERT_TO_STRAY("convert_to_stray"), + CAKE_ADD_CANDLE("cake.add_candle"), + EXTINGUISH_CANDLE("extinguish.candle"), + AMBIENT_CANDLE("ambient.candle"), + BLOCK_CLICK("block.click"), + BLOCK_CLICK_FAIL("block.click.fail"), + SCULK_CATALYST_BLOOM("block.sculk_catalyst.bloom"), + SCULK_SHRIEKER_SHRIEK("block.sculk_shrieker.shriek"), + WARDEN_NEARBY_CLOSE("nearby_close"), + WARDEN_NEARBY_CLOSER("nearby_closer"), + WARDEN_NEARBY_CLOSEST("nearby_closest"), + WARDEN_SLIGHTLY_ANGRY("agitated"), + RECORD_OTHERSIDE("record.otherside"), + TONGUE("tongue"), + CRACK_IRON_GOLEM("irongolem.crack"), + REPAIR_IRON_GOLEM("irongolem.repair"), + LISTENING("listening"), + HEARTBEAT("heartbeat"), + HORN_BREAK("horn_break"), + /** + * @deprecated since v1001 + */ + SCULK_PLACE("undefined"), + SCULK_SPREAD("block.sculk.spread"), + SCULK_CHARGE("charge.sculk"), + SCULK_SENSOR_PLACE("block.sculk_sensor.place"), + SCULK_SHRIEKER_PLACE("block.sculk_shrieker.place"), + GOAT_CALL_0("horn_call0"), + GOAT_CALL_1("horn_call1"), + GOAT_CALL_2("horn_call2"), + GOAT_CALL_3("horn_call3"), + GOAT_CALL_4("horn_call4"), + GOAT_CALL_5("horn_call5"), + GOAT_CALL_6("horn_call6"), + GOAT_CALL_7("horn_call7"), + /** + * @deprecated since v1001 + */ + GOAT_CALL_8("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_CALL_9("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_HARMONY_0("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_HARMONY_1("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_HARMONY_2("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_HARMONY_3("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_HARMONY_4("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_HARMONY_5("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_HARMONY_6("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_HARMONY_7("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_HARMONY_8("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_HARMONY_9("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_MELODY_0("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_MELODY_1("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_MELODY_2("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_MELODY_3("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_MELODY_4("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_MELODY_5("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_MELODY_6("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_MELODY_7("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_MELODY_8("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_MELODY_9("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_BASS_0("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_BASS_1("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_BASS_2("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_BASS_3("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_BASS_4("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_BASS_5("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_BASS_6("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_BASS_7("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_BASS_8("undefined"), + /** + * @deprecated since v1001 + */ + GOAT_BASS_9("undefined"), + IMITATE_WARDEN("imitate.warden"), + LISTENING_ANGRY("listening_angry"), + ITEM_GIVEN("item_given"), + ITEM_TAKEN("item_taken"), + DISAPPEARED("disappeared"), + REAPPEARED("reappeared"), + FROGSPAWN_HATCHED("block.frog_spawn.hatch"), + LAY_SPAWN("lay_spawn"), + FROGSPAWN_BREAK("block.frog_spawn.break"), + SONIC_BOOM("sonic_boom"), + SONIC_CHARGE("sonic_charge"), + ITEM_THROWN("item_thrown"), + RECORD_5("record.5"), + CONVERT_TO_FROG("convert_to_frog"), + MILK_DRINK("drink.milk"), + /** + * @deprecated since v1001 + */ + RECORD_PLAYING("undefined"), + ENCHANTING_TABLE_USE("block.enchanting_table.use"), + BUNDLE_DROP_CONTENTS("bundle.drop_contents"), + BUNDLE_INSERT("bundle.insert"), + BUNDLE_REMOVE_ONE("bundle.remove_one"), /** * @since v560 */ - PRESSURE_PLATE_CLICK_OFF, - PRESSURE_PLATE_CLICK_ON, - BUTTON_CLICK_OFF, - BUTTON_CLICK_ON, - DOOR_OPEN, - DOOR_CLOSE, - TRAPDOOR_OPEN, - TRAPDOOR_CLOSE, - FENCE_GATE_OPEN, - FENCE_GATE_CLOSE, + PRESSURE_PLATE_CLICK_OFF("pressure_plate.click_off"), + PRESSURE_PLATE_CLICK_ON("pressure_plate.click_on"), + BUTTON_CLICK_OFF("button.click_off"), + BUTTON_CLICK_ON("button.click_on"), + DOOR_OPEN("door.open"), + DOOR_CLOSE("door.close"), + TRAPDOOR_OPEN("trapdoor.open"), + TRAPDOOR_CLOSE("trapdoor.close"), + FENCE_GATE_OPEN("fence_gate.open"), + FENCE_GATE_CLOSE("fence_gate.close"), /** * @since v567 */ - INSERT, + INSERT("insert"), /** * @since v567 */ - PICKUP, + PICKUP("pickup"), /** * @since v567 */ - INSERT_ENCHANTED, + INSERT_ENCHANTED("insert_enchanted"), /** * @since v567 */ - PICKUP_ENCHANTED, + PICKUP_ENCHANTED("pickup_enchanted"), /** * @since v575 */ - BRUSH, + BRUSH("brush"), /** * @since v575 */ - BRUSH_COMPLETED, + BRUSH_COMPLETED("brush_completed"), /** * @since v575 */ - SHATTER_DECORATED_POT, + SHATTER_DECORATED_POT("shatter_pot"), /** * @since v575 */ - BREAK_DECORATED_POD, + BREAK_DECORATED_POD("break_pot"), /** * @since v589 */ - SNIFFER_EGG_CRACK, + SNIFFER_EGG_CRACK("block.sniffer_egg.crack"), /** * @since v589 */ - SNIFFER_EGG_HATCHED, + SNIFFER_EGG_HATCHED("block.sniffer_egg.hatch"), /** * @since v589 */ - WAXED_SIGN_INTERACT_FAIL, + WAXED_SIGN_INTERACT_FAIL("block.sign.waxed_interact_fail"), /** * @since v589 */ - RECORD_RELIC, + RECORD_RELIC("record.relic"), /** * @since v618 */ - BUMP, + BUMP("note.bass"), /** * @since v618 */ - PUMPKIN_CARVE, + PUMPKIN_CARVE("pumpkin.carve"), /** * @since v618 */ - CONVERT_HUSK_TO_ZOMBIE, + CONVERT_HUSK_TO_ZOMBIE("mob.husk.convert_to_zombie"), /** * @since v618 */ - PIG_DEATH, + PIG_DEATH("mob.pig.death"), /** * @since v618 */ - HOGLIN_CONVERT_TO_ZOMBIE, + HOGLIN_CONVERT_TO_ZOMBIE("mob.hoglin.converted_to_zombified"), /** * @since v618 */ - AMBIENT_UNDERWATER_ENTER, + AMBIENT_UNDERWATER_ENTER("ambient.underwater.enter"), /** * @since v618 */ - AMBIENT_UNDERWATER_EXIT, + AMBIENT_UNDERWATER_EXIT("ambient.underwater.exit"), /** * @since v622 */ - BOTTLE_FILL, + BOTTLE_FILL("bottle.fill"), /** * @since v622 */ - BOTTLE_EMPTY, + BOTTLE_EMPTY("bottle.empty"), /** * @since v630 */ - CRAFTER_CRAFT, + CRAFTER_CRAFT("crafter.craft"), /** * @since v630 */ - CRAFTER_FAILED, + CRAFTER_FAILED("crafter.fail"), /** * @since v630 */ - CRAFTER_DISABLE_SLOT, + CRAFTER_DISABLE_SLOT("crafter.disable_slot"), /** * @since v630 */ - DECORATED_POT_INSERT, + DECORATED_POT_INSERT("block.decorated_pot.insert"), /** * @since v630 */ - DECORATED_POT_INSERT_FAILED, + DECORATED_POT_INSERT_FAILED("block.decorated_pot.insert_fail"), /** * @since v630 */ - COPPER_BULB_ON, + COPPER_BULB_ON("block.copper_bulb.turn_on"), /** * @since v630 */ - COPPER_BULB_OFF, + COPPER_BULB_OFF("block.copper_bulb.turn_off"), /** * @since v630 */ - TRIAL_SPAWNER_OPEN_SHUTTER, + TRIAL_SPAWNER_OPEN_SHUTTER("trial_spawner.open_shutter"), /** * @since v630 */ - TRIAL_SPAWNER_EJECT_ITEM, + TRIAL_SPAWNER_EJECT_ITEM("trial_spawner.eject_item"), /** * @since v630 */ - TRIAL_SPAWNER_DETECT_PLAYER, + TRIAL_SPAWNER_DETECT_PLAYER("trial_spawner.detect_player"), /** * @since v630 */ - TRIAL_SPAWNER_SPAWN_MOB, + TRIAL_SPAWNER_SPAWN_MOB("trial_spawner.spawn_mob"), /** * @since v630 */ - TRIAL_SPAWNER_CLOSE_SHUTTER, + TRIAL_SPAWNER_CLOSE_SHUTTER("trial_spawner.close_shutter"), /** * @since v630 */ - TRIAL_SPAWNER_AMBIENT, + TRIAL_SPAWNER_AMBIENT("trial_spawner.ambient"), /** * @since v649 */ - AMBIENT_IN_AIR, + AMBIENT_IN_AIR("ambient.in.air"), /** * @since v649 */ - WIND_BURST, + WIND_BURST("breeze_wind_charge.burst"), /** * @since v649 */ - IMITATE_BREEZE, + IMITATE_BREEZE("imitate.breeze"), /** * @since v649 */ - ARMADILLO_BRUSH, + ARMADILLO_BRUSH("mob.armadillo.brush"), /** * @since v649 */ - ARMADILLO_SCUTE_DROP, + ARMADILLO_SCUTE_DROP("mob.armadillo.scute_drop"), /** * @since v649 */ - EQUIP_WOLF, + EQUIP_WOLF("armor.equip_wolf"), /** * @since v649 */ - UNEQUIP_WOLF, + UNEQUIP_WOLF("armor.unequip_wolf"), /** * @since v649 */ - REFLECT, + REFLECT("reflect"), /** * @since v662 */ - VAULT_OPEN_SHUTTER, + VAULT_OPEN_SHUTTER("vault.open_shutter"), /** * @since v662 */ - VAULT_CLOSE_SHUTTER, + VAULT_CLOSE_SHUTTER("vault.close_shutter"), /** * @since v662 */ - VAULT_EJECT_ITEM, + VAULT_EJECT_ITEM("vault.eject_item"), /** * @since v662 */ - VAULT_INSERT_ITEM, + VAULT_INSERT_ITEM("vault.insert_item"), /** * @since v662 */ - VAULT_INSERT_ITEM_FAIL, + VAULT_INSERT_ITEM_FAIL("vault.insert_item_fail"), /** * @since v662 */ - VAULT_AMBIENT, + VAULT_AMBIENT("vault.ambient"), /** * @since v662 */ - VAULT_ACTIVATE, + VAULT_ACTIVATE("vault.activate"), /** * @since v662 */ - VAULT_DEACTIVATE, + VAULT_DEACTIVATE("vault.deactivate"), /** * @since v662 */ - HURT_REDUCED, + HURT_REDUCED("hurt.reduced"), /** * @since v662 */ - WIND_CHARGE_BURST, + WIND_CHARGE_BURST("wind_charge.burst"), /** * @since v671 */ - ARMOR_CRACK_WOLF, + ARMOR_CRACK_WOLF("armor.crack_wolf"), /** * @since v671 */ - ARMOR_BREAK_WOLF, + ARMOR_BREAK_WOLF("armor.break_wolf"), /** * @since v671 */ - ARMOR_REPAIR_WOLF, + ARMOR_REPAIR_WOLF("armor.repair_wolf"), /** * @since v671 */ - MACE_SMASH_AIR, + MACE_SMASH_AIR("mace.smash_air"), /** * @since v671 */ - MACE_SMASH_GROUND, + MACE_SMASH_GROUND("mace.smash_ground"), /** * @since v671 */ - MACE_SMASH_HEAVY_GROUND, + MACE_SMASH_HEAVY_GROUND("mace.heavy_smash_ground"), /** * @since v685 */ - TRIAL_SPAWNER_CHARGE_ACTIVATE, + TRIAL_SPAWNER_CHARGE_ACTIVATE("trial_spawner.charge_activate"), /** * @since v685 */ - TRIAL_SPAWNER_AMBIENT_OMINOUS, + TRIAL_SPAWNER_AMBIENT_OMINOUS("trial_spawner.ambient_ominous"), /** * @since v685 */ - OMINOUS_ITEM_SPAWNER_SPAWN_ITEM, + OMINOUS_ITEM_SPAWNER_SPAWN_ITEM("ominous_item_spawner.spawn_item"), /** * @since v685 */ - OMINOUS_BOTTLE_END_USE, + OMINOUS_BOTTLE_END_USE("ominous_bottle.end_use"), /** * @since v685 */ - OMINOUS_ITEM_SPAWNER_SPAWN_ITEM_BEGIN, + OMINOUS_ITEM_SPAWNER_SPAWN_ITEM_BEGIN("ominous_item_spawner.spawn_item_begin"), /** * @since v685 */ - APPLY_EFFECT_BAD_OMEN, + APPLY_EFFECT_BAD_OMEN("apply_effect.bad_omen"), /** * @since v685 */ - APPLY_EFFECT_RAID_OMEN, + APPLY_EFFECT_RAID_OMEN("apply_effect.raid_omen"), /** * @since v685 */ - APPLY_EFFECT_TRIAL_OMEN, + APPLY_EFFECT_TRIAL_OMEN("apply_effect.trial_omen"), /** * @since v685 */ - OMINOUS_ITEM_SPAWNER_ABOUT_TO_SPAWN_ITEM, + OMINOUS_ITEM_SPAWNER_ABOUT_TO_SPAWN_ITEM("ominous_item_spawner.about_to_spawn_item"), /** * @since v685 */ - RECORD_CREATOR, + RECORD_CREATOR("record.creator"), /** * @since v685 */ - RECORD_CREATOR_MUSIC_BOX, + RECORD_CREATOR_MUSIC_BOX("record.creator_music_box"), /** * @since v685 */ - RECORD_PRECIPICE, + RECORD_PRECIPICE("record.precipice"), /** * @since v712 */ - IMITATE_BOGGED, + IMITATE_BOGGED("imitate.bogged"), /** * @since v712 */ - VAULT_REJECT_REWARDED_PLAYER, + VAULT_REJECT_REWARDED_PLAYER("vault.reject_rewarded_player"), /** * @since v729 */ - IMITATE_DROWNED, + IMITATE_DROWNED("imitate.drowned"), /** * @since v729 */ - BUNDLE_INSERT_FAILED, + BUNDLE_INSERT_FAILED("bundle.insert_fail"), /** * @since v766 */ - IMITATE_CREAKING, + IMITATE_CREAKING("imitate.creaking"), /** * @since v766 */ - SPONGE_ABSORB, + SPONGE_ABSORB("sponge.absorb"), /** * @since v766 */ - BLOCK_CREAKING_HEART_TRAIL, + BLOCK_CREAKING_HEART_TRAIL("block.creaking_heart.trail"), /** * @since v766 */ - CREAKING_HEART_SPAWN, + CREAKING_HEART_SPAWN("creaking_heart_spawn"), /** * @since v766 */ - ACTIVATE, + ACTIVATE("activate"), /** * @since v766 */ - DEACTIVATE, + DEACTIVATE("deactivate"), /** * @since v766 */ - FREEZE, + FREEZE("freeze"), /** * @since v766 */ - UNFREEZE, + UNFREEZE("unfreeze"), /** * @since v766 */ - OPEN, + OPEN("open"), /** * @since v766 */ - OPEN_LONG, + OPEN_LONG("open_long"), /** * @since v766 */ - CLOSE, + CLOSE("close"), /** * @since v766 */ - CLOSE_LONG, + CLOSE_LONG("close_long"), /** * @since v800 */ - IMITATE_PHANTOM, + IMITATE_PHANTOM("imitate.phantom"), /** * @since v800 */ - IMITATE_ZOGLIN, + IMITATE_ZOGLIN("imitate.zoglin"), /** * @since v800 */ - IMITATE_GUARDIAN, + IMITATE_GUARDIAN("imitate.guardian"), /** * @since v800 */ - IMITATE_RAVAGER, + IMITATE_RAVAGER("imitate.ravager"), /** * @since v800 */ - IMITATE_PILLAGER, + IMITATE_PILLAGER("imitate.pillager"), /** * @since v800 */ - PLACE_IN_WATER, + PLACE_IN_WATER("place_in_water"), /** * @since v800 */ - STATE_CHANGE, + STATE_CHANGE("state_change"), /** * @since v800 */ - IMITATE_HAPPY_GHAST, + IMITATE_HAPPY_GHAST("imitate.happy_ghast"), /** * @since v800 */ - UNEQUIP_GENERIC, + UNEQUIP_GENERIC("armor.unequip_generic"), /** * @since v818 */ - RECORD_TEARS, + RECORD_TEARS("record.tears"), /** * @since v818 */ - THE_END_LIGHT_FLASH, + THE_END_LIGHT_FLASH("ambient.weather.the_end_light_flash"), /** * @since v818 */ - LEAD_LEASH, + LEAD_LEASH("lead.leash"), /** * @since v818 */ - LEAD_UNLEASH, + LEAD_UNLEASH("lead.unleash"), /** * @since v818 */ - LEAD_BREAK, + LEAD_BREAK("lead.break"), /** * @since v818 */ - UNSADDLE, + UNSADDLE("unsaddle"), /** * @since v819 */ - RECORD_LAVA_CHICKEN, + RECORD_LAVA_CHICKEN("record.lava_chicken"), /** * @since v827 */ - EQUIP_COPPER, + EQUIP_COPPER("armor.equip_copper"), /** * @since v843 */ - PLACE_ITEM, + PLACE_ITEM("place_item"), /** * @since v843 */ - SINGLE_ITEM_SWAP, + SINGLE_ITEM_SWAP("single_swap"), /** * @since v843 */ - MULTI_ITEM_SWAP, + MULTI_ITEM_SWAP("multi_swap"), + /** + * @since v897 + */ + LUNGE_1("item.enchant.lunge1"), /** - * @since v898 + * @since v897 */ - LUNGE_1, + LUNGE_2("item.enchant.lunge2"), /** - * @since v898 + * @since v897 */ - LUNGE_2, + LUNGE_3("item.enchant.lunge3"), /** - * @since v898 + * @since v897 */ - LUNGE_3, + ATTACK_CRITICAL("attack.critical"), /** - * @since v898 + * @since v897 */ - ATTACK_CRITICAL, + SPEAR_ATTACK_HIT("item.spear.attack_hit"), /** - * @since v898 + * @since v897 */ - SPEAR_ATTACK_HIT, + SPEAR_ATTACK_MISS("item.spear.attack_miss"), /** - * @since v898 + * @since v897 */ - SPEAR_ATTACK_MISS, + WOODEN_SPEAR_ATTACK_HIT("item.wooden_spear.attack_hit"), /** - * @since v898 + * @since v897 */ - WOODEN_SPEAR_ATTACK_HIT, + WOODEN_SPEAR_ATTACK_MISS("item.wooden_spear.attack_miss"), /** - * @since v898 + * @since v897 */ - WOODEN_SPEAR_ATTACK_MISS, + IMITATE_PARCHED("imitate.parched"), /** - * @since v898 + * @since v897 */ - IMITATE_PARCHED, + IMITATE_CAMEL_HUSK("imitate.camel_husk"), /** - * @since v898 + * @since v897 */ - IMITATE_CAMEL_HUSK, + SPEAR_USE("item.spear.use"), /** - * @since v898 + * @since v897 */ - SPEAR_USE, + WOODEN_SPEAR_USE("item.wooden_spear.use"), /** - * @since v898 + * @since v924 */ - WOODEN_SPEAR_USE, - UNDEFINED + SADDLE_IN_WATER("saddle_in_water"), + /** + * @since v924 + */ + STONE_SPEAR_ATTACK_HIT("item.stone_spear.attack_hit"), + /** + * @since v924 + */ + IRON_SPEAR_ATTACK_HIT("item.iron_spear.attack_hit"), + /** + * @since v924 + */ + COPPER_SPEAR_ATTACK_HIT("item.copper_spear.attack_hit"), + /** + * @since v924 + */ + GOLDEN_SPEAR_ATTACK_HIT("item.golden_spear.attack_hit"), + /** + * @since v924 + */ + DIAMOND_SPEAR_ATTACK_HIT("item.diamond_spear.attack_hit"), + /** + * @since v924 + */ + NETHERITE_SPEAR_ATTACK_HIT("item.netherite_spear.attack_hit"), + /** + * @since v924 + */ + STONE_SPEAR_ATTACK_MISS("item.stone_spear.attack_miss"), + /** + * @since v924 + */ + IRON_SPEAR_ATTACK_MISS("item.iron_spear.attack_miss"), + /** + * @since v924 + */ + COPPER_SPEAR_ATTACK_MISS("item.copper_spear.attack_miss"), + /** + * @since v924 + */ + GOLDEN_SPEAR_ATTACK_MISS("item.golden_spear.attack_miss"), + /** + * @since v924 + */ + DIAMOND_SPEAR_ATTACK_MISS("item.diamond_spear.attack_miss"), + /** + * @since v924 + */ + NETHERITE_SPEAR_ATTACK_MISS("item.netherite_spear.attack_miss"), + /** + * @since v924 + */ + STONE_SPEAR_USE("item.stone_spear.use"), + /** + * @since v924 + */ + IRON_SPEAR_USE("item.iron_spear.use"), + /** + * @since v924 + */ + COPPER_SPEAR_USE("item.copper_spear.use"), + /** + * @since v924 + */ + GOLDEN_SPEAR_USE("item.golden_spear.use"), + /** + * @since v924 + */ + DIAMOND_SPEAR_USE("item.diamond_spear.use"), + /** + * @since v924 + */ + NETHERITE_SPEAR_USE("item.netherite_spear.use"), + /** + * @since v944 + */ + PAUSE_GROWTH("pause_growth"), + /** + * @since v944 + */ + RESET_GROWTH("reset_growth"), + /** + * @since v975 + */ + PUSHED_BY_PLAYER("pushed_by_player"), + /** + * @since v975 + */ + BOUNCE("bounce"), + /** + * @since v1001 + */ + SLIME_LANDING("slime_landing"), + /** + * @since v1001 + */ + ABSORB_BLOCK("absorb_block"), + /** + * @since v1001 + */ + EJECT_BLOCK("eject_block"), + /** + * @since v1001 + */ + GEYSER_ERUPTION_START("geyser_eruption_start"), + /** + * @since v1001 + */ + GEYSER_ERUPTION_ACTIVE("geyser_eruption_active"), + /** + * @since v1001 + */ + RECORD_BOUNCE("record.bounce"), + /** + * @since v1001 + */ + BUCKET_FILL_LAND_ANIMAL("bucket.fill.land_animal"), + /** + * @since v1001 + */ + BUCKET_EMPTY_LAND_ANIMAL("bucket.empty.land_animal"), + /** + * @since v1001 + */ + GEYSER_CONTINUOUS_ERUPTION_START("geyser_continuous_eruption_start"), + /** + * @since v1001 + */ + GEYSER_CONTINUOUS_ERUPTION_ACTIVE("geyser_continuous_eruption_active"), + UNDEFINED("undefined"); + + private static final Map serializeNames = new HashMap<>(values().length); + static { + for (SoundEvent value : values()) { + serializeNames.put(value.getSerializeName(), value); + } + } + + private final String serializeName; + + SoundEvent(String serializeName) { + this.serializeName = serializeName; + } + + public String getSerializeName() { + return this.serializeName; + } + + public static SoundEvent fromName(String serializeName) { + return serializeNames.get(serializeName); + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/SubChunkData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/SubChunkData.java index fab005f..e691a58 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/SubChunkData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/SubChunkData.java @@ -20,12 +20,15 @@ public class SubChunkData extends AbstractReferenceCounted { private long blobId; @Override - public SubChunkData touch(Object o) { + public SubChunkData touch(Object hint) { if (this.data != null) { - this.data.touch(o); + this.data.touch(hint); } if (this.heightMapData != null) { - this.heightMapData.touch(o); + this.heightMapData.touch(hint); + } + if (this.renderHeightMapData != null) { + this.renderHeightMapData.touch(hint); } return this; } @@ -38,5 +41,8 @@ protected void deallocate() { if (this.heightMapData != null) { this.heightMapData.release(); } + if (this.renderHeightMapData != null) { + this.renderHeightMapData.release(); + } } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/VillageType.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/VillageType.java new file mode 100644 index 0000000..ed28e4d --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/VillageType.java @@ -0,0 +1,9 @@ +package org.cloudburstmc.protocol.bedrock.data; + +public enum VillageType { + DESERT, + ICE, + SAVANNA, + TAIGA, + DEFAULT, +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/AttributeData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/AttributeData.java new file mode 100644 index 0000000..08ba79f --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/AttributeData.java @@ -0,0 +1,4 @@ +package org.cloudburstmc.protocol.bedrock.data.attributelayer; + +public interface AttributeData { +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/AttributeLayerData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/AttributeLayerData.java new file mode 100644 index 0000000..495893f --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/AttributeLayerData.java @@ -0,0 +1,20 @@ +package org.cloudburstmc.protocol.bedrock.data.attributelayer; + +import lombok.Value; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.List; + +@Value +public class AttributeLayerData { + + String layerName; + /** + * @since v1001 + */ + @Nullable + String noiseName; + int dimension; + AttributeLayerSettings settings; + List attributes; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/AttributeLayerSettings.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/AttributeLayerSettings.java new file mode 100644 index 0000000..9e672ed --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/AttributeLayerSettings.java @@ -0,0 +1,28 @@ +package org.cloudburstmc.protocol.bedrock.data.attributelayer; + +import lombok.Value; + +@Value +public class AttributeLayerSettings { + + int priority; + Weight weight; + boolean enabled; + boolean transitionsPaused; + + public interface Weight { + } + + @Value + public static class FloatWeight implements Weight { + float value; + } + + /** + * @deprecated since v975 + */ + @Value + public static class StringWeight implements Weight { + String value; + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/AttributeLayerSyncPayload.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/AttributeLayerSyncPayload.java new file mode 100644 index 0000000..15479ee --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/AttributeLayerSyncPayload.java @@ -0,0 +1,4 @@ +package org.cloudburstmc.protocol.bedrock.data.attributelayer; + +public interface AttributeLayerSyncPayload { +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/BoolAttributeData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/BoolAttributeData.java new file mode 100644 index 0000000..5300293 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/BoolAttributeData.java @@ -0,0 +1,14 @@ +package org.cloudburstmc.protocol.bedrock.data.attributelayer; + +import lombok.Value; + +@Value +public class BoolAttributeData implements AttributeData { + + boolean value; + Operation operation; + + public enum Operation { + OVERRIDE, ALPHA_BLEND, AND, NAND, OR, NOR, XOR, XNOR + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/ColorAttributeData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/ColorAttributeData.java new file mode 100644 index 0000000..71d0178 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/ColorAttributeData.java @@ -0,0 +1,27 @@ +package org.cloudburstmc.protocol.bedrock.data.attributelayer; + +import lombok.Value; + +@Value +public class ColorAttributeData implements AttributeData { + + Color255RGBA value; + Operation operation; + + public interface Color255RGBA { + } + + @Value + public static class StringColor implements Color255RGBA { + String value; + } + + @Value + public static class ArrayColor implements Color255RGBA { + int[] value; + } + + public enum Operation { + OVERRIDE, ALPHA_BLEND, ADD, SUBTRACT, MULTIPLY + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/EnvironmentAttributeData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/EnvironmentAttributeData.java new file mode 100644 index 0000000..ea56665 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/EnvironmentAttributeData.java @@ -0,0 +1,27 @@ +package org.cloudburstmc.protocol.bedrock.data.attributelayer; + +import lombok.Value; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.cloudburstmc.protocol.bedrock.data.camera.CameraEase; + +@Value +public class EnvironmentAttributeData { + + String attributeName; + @Nullable + AttributeData from; + AttributeData attribute; + @Nullable + AttributeData to; + int currentTransitionTicks; + int totalTransitionTicks; + CameraEase easing; + /** + * @since v1001 + */ + int localTransitionTicks; + /** + * @since v1001 + */ + boolean noiseTransition; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/FloatAttributeData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/FloatAttributeData.java new file mode 100644 index 0000000..dc375f2 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/FloatAttributeData.java @@ -0,0 +1,19 @@ +package org.cloudburstmc.protocol.bedrock.data.attributelayer; + +import lombok.Value; +import org.checkerframework.checker.nullness.qual.Nullable; + +@Value +public class FloatAttributeData implements AttributeData { + + float value; + Operation operation; + @Nullable + Float constraintMin; + @Nullable + Float constraintMax; + + public enum Operation { + OVERRIDE, ALPHA_BLEND, ADD, SUBTRACT, MULTIPLY, MINIMUM, MAXIMUM + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/RemoveEnvironmentAttributesData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/RemoveEnvironmentAttributesData.java new file mode 100644 index 0000000..d286ae3 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/RemoveEnvironmentAttributesData.java @@ -0,0 +1,13 @@ +package org.cloudburstmc.protocol.bedrock.data.attributelayer; + +import lombok.Value; + +import java.util.List; + +@Value +public class RemoveEnvironmentAttributesData implements AttributeLayerSyncPayload { + + String layerName; + int dimension; + List attributes; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/UpdateAttributeLayerSettingsData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/UpdateAttributeLayerSettingsData.java new file mode 100644 index 0000000..f596436 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/UpdateAttributeLayerSettingsData.java @@ -0,0 +1,11 @@ +package org.cloudburstmc.protocol.bedrock.data.attributelayer; + +import lombok.Value; + +@Value +public class UpdateAttributeLayerSettingsData implements AttributeLayerSyncPayload { + + String layerName; + int dimension; + AttributeLayerSettings settings; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/UpdateAttributeLayersData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/UpdateAttributeLayersData.java new file mode 100644 index 0000000..da804fc --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/UpdateAttributeLayersData.java @@ -0,0 +1,11 @@ +package org.cloudburstmc.protocol.bedrock.data.attributelayer; + +import lombok.Value; + +import java.util.List; + +@Value +public class UpdateAttributeLayersData implements AttributeLayerSyncPayload { + + List attributeLayers; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/UpdateEnvironmentAttributesData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/UpdateEnvironmentAttributesData.java new file mode 100644 index 0000000..b2da143 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/attributelayer/UpdateEnvironmentAttributesData.java @@ -0,0 +1,13 @@ +package org.cloudburstmc.protocol.bedrock.data.attributelayer; + +import lombok.Value; + +import java.util.List; + +@Value +public class UpdateEnvironmentAttributesData implements AttributeLayerSyncPayload { + + String layerName; + int dimension; + List attributes; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/auth/AuthType.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/auth/AuthType.java index 79a52c8..f9b36e6 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/auth/AuthType.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/auth/AuthType.java @@ -11,6 +11,7 @@ public enum AuthType { FULL, /** * Split screen player using the host's authentication token. + * If accepting guests, you should limit the maximum number of guests per host. */ GUEST, /** diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeClimateData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeClimateData.java index b823aab..b41c26d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeClimateData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeClimateData.java @@ -6,9 +6,13 @@ public class BiomeClimateData { float temperature; float downfall; + @Deprecated float redSporeDensity; + @Deprecated float blueSporeDensity; + @Deprecated float ashDensity; + @Deprecated float whiteAshDensity; float snowAccumulationMin; float snowAccumulationMax; diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeDefinitionChunkGenData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeDefinitionChunkGenData.java index 0960604..1fc3118 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeDefinitionChunkGenData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeDefinitionChunkGenData.java @@ -2,6 +2,7 @@ import lombok.Value; import org.checkerframework.checker.nullness.qual.Nullable; +import org.cloudburstmc.protocol.bedrock.data.VillageType; import java.util.List; @@ -38,5 +39,20 @@ public class BiomeDefinitionChunkGenData { * @since v859 */ @Nullable - BiomeReplacementData biomeReplacementData; + List biomeReplacements; + /** + * @since v924 + */ + @Nullable + VillageType villageType; + /** + * @since v975 + */ + @Nullable + BiomeSurfaceBuilderData surfaceBuilderData; + /** + * @since v975 + */ + @Nullable + BiomeSurfaceBuilderData subsurfaceBuilderData; } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeDefinitionData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeDefinitionData.java index 44644fc..c6e812b 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeDefinitionData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeDefinitionData.java @@ -14,9 +14,11 @@ @Value public class BiomeDefinitionData { + /** + * The numeric id of this biome. This field is always {@code null} for vanilla biome, and is only set for custom biome (start at 30000). + */ @Nullable - @Getter(AccessLevel.NONE) - transient Indexable id; + Integer id; float temperature; float downfall; float redSporeDensity; @@ -35,23 +37,23 @@ public class BiomeDefinitionData { BiomeDefinitionChunkGenData chunkGenData; @JsonCreator - public BiomeDefinitionData(@Nullable String id, float temperature, float downfall, float redSporeDensity, float blueSporeDensity, float ashDensity, float whiteAshDensity, float foliageSnow, float depth, float scale, Color mapWaterColor, boolean rain, @Nullable List tags, @Nullable BiomeDefinitionChunkGenData chunkGenData) { - this(id == null ? null : new Unindexed<>(id), temperature, downfall, redSporeDensity, blueSporeDensity, ashDensity, whiteAshDensity, foliageSnow, depth, scale, mapWaterColor, rain, tags == null ? null : new Unindexed<>(tags), chunkGenData); + public BiomeDefinitionData(@Nullable Integer id, float temperature, float downfall, float redSporeDensity, float blueSporeDensity, float ashDensity, float whiteAshDensity, float foliageSnow, float depth, float scale, Color mapWaterColor, boolean rain, @Nullable List tags, @Nullable BiomeDefinitionChunkGenData chunkGenData) { + this(id, temperature, downfall, redSporeDensity, blueSporeDensity, ashDensity, whiteAshDensity, foliageSnow, depth, scale, mapWaterColor, rain, tags == null ? null : new Unindexed<>(tags), chunkGenData); } - public BiomeDefinitionData(@Nullable String id, float temperature, float downfall, float foliageSnow, float depth, float scale, Color mapWaterColor, boolean rain, @Nullable List tags, @Nullable BiomeDefinitionChunkGenData chunkGenData) { - this(id == null ? null : new Unindexed<>(id), temperature, downfall, 0, 0, 0, 0, foliageSnow, depth, scale, mapWaterColor, rain, tags == null ? null : new Unindexed<>(tags), chunkGenData); + public BiomeDefinitionData(@Nullable Integer id, float temperature, float downfall, float foliageSnow, float depth, float scale, Color mapWaterColor, boolean rain, @Nullable List tags, @Nullable BiomeDefinitionChunkGenData chunkGenData) { + this(id, temperature, downfall, 0, 0, 0, 0, foliageSnow, depth, scale, mapWaterColor, rain, tags == null ? null : new Unindexed<>(tags), chunkGenData); } - public BiomeDefinitionData(@Nullable Indexable id, float temperature, float downfall, float foliageSnow, float depth, float scale, Color mapWaterColor, boolean rain, @Nullable Indexable> tags, @Nullable BiomeDefinitionChunkGenData chunkGenData) { + public BiomeDefinitionData(@Nullable Integer id, float temperature, float downfall, float foliageSnow, float depth, float scale, Color mapWaterColor, boolean rain, @Nullable Indexable> tags, @Nullable BiomeDefinitionChunkGenData chunkGenData) { this(id, temperature, downfall, 0, 0, 0, 0, foliageSnow, depth, scale, mapWaterColor, rain, tags, chunkGenData); } - public BiomeDefinitionData(@Nullable Indexable id, float temperature, float downfall, float redSporeDensity, float blueSporeDensity, float ashDensity, float whiteAshDensity, float depth, float scale, Color mapWaterColor, boolean rain, @Nullable Indexable> tags, @Nullable BiomeDefinitionChunkGenData chunkGenData) { + public BiomeDefinitionData(@Nullable Integer id, float temperature, float downfall, float redSporeDensity, float blueSporeDensity, float ashDensity, float whiteAshDensity, float depth, float scale, Color mapWaterColor, boolean rain, @Nullable Indexable> tags, @Nullable BiomeDefinitionChunkGenData chunkGenData) { this(id, temperature, downfall, redSporeDensity, blueSporeDensity, ashDensity, whiteAshDensity, 0, depth, scale, mapWaterColor, rain, tags, chunkGenData); } - private BiomeDefinitionData(@Nullable Indexable id, float temperature, float downfall, float redSporeDensity, float blueSporeDensity, float ashDensity, float whiteAshDensity, float foliageSnow, float depth, float scale, Color mapWaterColor, boolean rain, @Nullable Indexable> tags, @Nullable BiomeDefinitionChunkGenData chunkGenData) { + private BiomeDefinitionData(@Nullable Integer id, float temperature, float downfall, float redSporeDensity, float blueSporeDensity, float ashDensity, float whiteAshDensity, float foliageSnow, float depth, float scale, Color mapWaterColor, boolean rain, @Nullable Indexable> tags, @Nullable BiomeDefinitionChunkGenData chunkGenData) { this.id = id; this.temperature = temperature; this.downfall = downfall; @@ -68,13 +70,6 @@ private BiomeDefinitionData(@Nullable Indexable id, float temperature, f this.chunkGenData = chunkGenData; } - public @Nullable String getId() { - if (id == null) { - return null; - } - return id.get(); - } - public @Nullable List getTags() { if (tags == null) { return null; diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeNoiseGradientSurfaceData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeNoiseGradientSurfaceData.java new file mode 100644 index 0000000..684c09f --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeNoiseGradientSurfaceData.java @@ -0,0 +1,16 @@ +package org.cloudburstmc.protocol.bedrock.data.biome; + +import lombok.Value; + +import java.util.List; + +@Value +public class BiomeNoiseGradientSurfaceData { + + List nonReplaceableBlocks; + List gradientBlocks; + // NoiseDescriptor + String noise; // "name" in v1001 or "seed" in v975 + int firstOctave; + List amplitudes; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeSurfaceBuilderData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeSurfaceBuilderData.java new file mode 100644 index 0000000..fcd7a38 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/BiomeSurfaceBuilderData.java @@ -0,0 +1,21 @@ +package org.cloudburstmc.protocol.bedrock.data.biome; + +import lombok.Value; +import org.checkerframework.checker.nullness.qual.Nullable; + +@Value +public class BiomeSurfaceBuilderData { + + @Nullable + BiomeSurfaceMaterialData surfaceMaterials; + boolean hasDefaultOverworldSurface; + boolean hasSwampSurface; + boolean hasFrozenOceanSurface; + boolean hasTheEndSurface; + @Nullable + BiomeMesaSurfaceData mesaSurface; + @Nullable + BiomeCappedSurfaceData cappedSurface; + @Nullable + BiomeNoiseGradientSurfaceData noiseGradientSurface; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/NoiseBlockSpecifier.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/NoiseBlockSpecifier.java new file mode 100644 index 0000000..0038792 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/biome/NoiseBlockSpecifier.java @@ -0,0 +1,13 @@ +package org.cloudburstmc.protocol.bedrock.data.biome; + +import lombok.Value; + +@Value +public class NoiseBlockSpecifier { + + String noise; + float threshold; + float rangeMin; + float rangeMax; + int block; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/AimAssistActorPriorityData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/AimAssistActorPriorityData.java new file mode 100644 index 0000000..3d21fd7 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/AimAssistActorPriorityData.java @@ -0,0 +1,12 @@ +package org.cloudburstmc.protocol.bedrock.data.camera; + +import lombok.Value; + +@Value +public class AimAssistActorPriorityData { + + int presetIndex; + int categoryIndex; + int actorIndex; + int priorityValue; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraAimAssistCategory.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraAimAssistCategory.java index 874ddae..daf5e75 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraAimAssistCategory.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraAimAssistCategory.java @@ -2,6 +2,7 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import lombok.Data; +import org.checkerframework.checker.nullness.qual.Nullable; import java.util.ArrayList; import java.util.List; @@ -12,6 +13,12 @@ public class CameraAimAssistCategory { private List entityPriorities = new ObjectArrayList<>(); private List blockPriorities = new ArrayList<>(); private List blockTagPriorities = new ArrayList<>(); + /** + * @since v897 + */ + private List entityTypeFamiliesPriorities = new ArrayList<>(); + @Nullable private Integer entityDefaultPriorities; + @Nullable private Integer blockDefaultPriorities; } \ No newline at end of file diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraAimAssistPresetDefinition.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraAimAssistPresetDefinition.java index 5a7dbe5..e43f749 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraAimAssistPresetDefinition.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraAimAssistPresetDefinition.java @@ -2,6 +2,7 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import lombok.Data; +import org.checkerframework.checker.nullness.qual.Nullable; import java.util.List; @@ -13,23 +14,29 @@ public class CameraAimAssistPresetDefinition { */ private String categories; /** - * @deprecated since v898 + * @deprecated since v897 */ private final List exclusionList = new ObjectArrayList<>(); /** - * @since v898 + * @since v897 */ private final List blockExclusionList = new ObjectArrayList<>(); /** - * @since v898 + * @since v897 */ private final List blockTagExclusionList = new ObjectArrayList<>(); /** - * @since v898 + * @since v897 */ private final List entityExclusionList = new ObjectArrayList<>(); + /** + * @since v897 + */ + private final List entityTypeFamiliesExclusionList = new ObjectArrayList<>(); private final List liquidTargetingList = new ObjectArrayList<>(); private final List itemSettings = new ObjectArrayList<>(); + @Nullable private String defaultItemSettings; + @Nullable private String handSettings; } \ No newline at end of file diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraEase.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraEase.java index 67d942c..3549b7b 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraEase.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraEase.java @@ -37,7 +37,7 @@ public enum CameraEase { EASE_OUT_BOUNCE("out_bounce"), EASE_IN_OUT_BOUNCE("in_out_bounce"); - private static final Map serializeNames = new HashMap<>(); + private static final Map serializeNames = new HashMap<>(values().length); static { for (CameraEase value : values()) { serializeNames.put(value.getSerializeName(), value); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraSplineDefinition.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraSplineDefinition.java new file mode 100644 index 0000000..5ed37bf --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraSplineDefinition.java @@ -0,0 +1,12 @@ +package org.cloudburstmc.protocol.bedrock.data.camera; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class CameraSplineDefinition { + + private String name; + private CameraSplineInstruction instruction; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraSplineInstruction.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraSplineInstruction.java index d8a26a4..faf5baa 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraSplineInstruction.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraSplineInstruction.java @@ -2,7 +2,6 @@ import lombok.AllArgsConstructor; import lombok.Data; -import org.cloudburstmc.math.vector.Vector2f; import org.cloudburstmc.math.vector.Vector3f; import java.util.List; @@ -14,8 +13,29 @@ public class CameraSplineInstruction { private float totalTime; private CameraSplineType type; private List curve; - private List progressKeyFrames; + private List progressKeyFrames; private List rotationOption; + private String splineIdentifier; + private boolean loadFromJson; + + public CameraSplineInstruction(float totalTime, CameraSplineType type, List curve, List progressKeyFrames, List rotationOption) { + this.totalTime = totalTime; + this.type = type; + this.curve = curve; + this.progressKeyFrames = progressKeyFrames; + this.rotationOption = rotationOption; + this.splineIdentifier = ""; + this.loadFromJson = false; + } + + @Data + @AllArgsConstructor + public static class SplineProgressOption { + + private float value; + private float time; + private CameraEase ease; + } @Data @AllArgsConstructor @@ -23,5 +43,6 @@ public static class SplineRotationOption { private Vector3f keyFrameValues; private float keyFrameTimes; + private CameraEase ease; } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraSplineType.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraSplineType.java index ead885f..efb125a 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraSplineType.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/camera/CameraSplineType.java @@ -1,7 +1,31 @@ package org.cloudburstmc.protocol.bedrock.data.camera; +import java.util.HashMap; +import java.util.Map; + public enum CameraSplineType { - CATMULL_ROM, - LINEAR + CATMULL_ROM("catmullrom"), + LINEAR("linear"); + + private static final Map serializeNames = new HashMap<>(values().length); + static { + for (CameraSplineType value : values()) { + serializeNames.put(value.getSerializeName(), value); + } + } + + private final String serializeName; + + CameraSplineType(String serializeName) { + this.serializeName = serializeName; + } + + public String getSerializeName() { + return this.serializeName; + } + + public static CameraSplineType fromName(String serializeName) { + return serializeNames.get(serializeName); + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/AddTimeMarkerData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/AddTimeMarkerData.java new file mode 100644 index 0000000..c160df0 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/AddTimeMarkerData.java @@ -0,0 +1,12 @@ +package org.cloudburstmc.protocol.bedrock.data.clock; + +import lombok.Value; + +import java.util.List; + +@Value +public class AddTimeMarkerData implements SyncWorldClocksPayload { + + long clockId; + List timeMarkers; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/InitializeRegistryData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/InitializeRegistryData.java new file mode 100644 index 0000000..73a21f4 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/InitializeRegistryData.java @@ -0,0 +1,11 @@ +package org.cloudburstmc.protocol.bedrock.data.clock; + +import lombok.Value; + +import java.util.List; + +@Value +public class InitializeRegistryData implements SyncWorldClocksPayload { + + List clockData; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/RemoveTimeMarkerData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/RemoveTimeMarkerData.java new file mode 100644 index 0000000..d907906 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/RemoveTimeMarkerData.java @@ -0,0 +1,13 @@ +package org.cloudburstmc.protocol.bedrock.data.clock; + +import lombok.Value; + +import java.util.ArrayList; +import java.util.List; + +@Value +public class RemoveTimeMarkerData implements SyncWorldClocksPayload { + + long clockId; + List timeMarkerIds = new ArrayList<>(); +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/SyncStateData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/SyncStateData.java new file mode 100644 index 0000000..3e85646 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/SyncStateData.java @@ -0,0 +1,11 @@ +package org.cloudburstmc.protocol.bedrock.data.clock; + +import lombok.Value; + +import java.util.List; + +@Value +public class SyncStateData implements SyncWorldClocksPayload { + + List clockData; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/SyncWorldClockStateData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/SyncWorldClockStateData.java new file mode 100644 index 0000000..f47e2ea --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/SyncWorldClockStateData.java @@ -0,0 +1,12 @@ +package org.cloudburstmc.protocol.bedrock.data.clock; + + +import lombok.Value; + +@Value +public class SyncWorldClockStateData { + + long clockId; + int time; + boolean paused; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/SyncWorldClocksPayload.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/SyncWorldClocksPayload.java new file mode 100644 index 0000000..8e492d4 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/SyncWorldClocksPayload.java @@ -0,0 +1,5 @@ +package org.cloudburstmc.protocol.bedrock.data.clock; + +public interface SyncWorldClocksPayload { + +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/TimeMarkerData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/TimeMarkerData.java new file mode 100644 index 0000000..7b0aa19 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/TimeMarkerData.java @@ -0,0 +1,12 @@ +package org.cloudburstmc.protocol.bedrock.data.clock; + +import lombok.Value; + +@Value +public class TimeMarkerData { + + long id; + String name; + int time; + Integer period; // changelog says required but whatever +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/WorldClockData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/WorldClockData.java new file mode 100644 index 0000000..eab65f9 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/clock/WorldClockData.java @@ -0,0 +1,15 @@ +package org.cloudburstmc.protocol.bedrock.data.clock; + + +import lombok.Value; + +import java.util.List; + +@Value +public class WorldClockData { + long id; + String name; + int time; + boolean paused; + List timeMarkers; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/command/CommandParam.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/command/CommandParam.java index 26b0452..0849deb 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/command/CommandParam.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/command/CommandParam.java @@ -17,9 +17,9 @@ public class CommandParam { public static final CommandParam OPERATOR = new CommandParam(CommandParamType.OPERATOR); public static final CommandParam COMPARE_OPERATOR = new CommandParam(CommandParamType.COMPARE_OPERATOR); public static final CommandParam TARGET = new CommandParam(CommandParamType.TARGET); - public static final CommandParam UNKNOWN_STANDALONE = new CommandParam(CommandParamType.UNKNOWN_STANDALONE); + public static final CommandParam STANDALONE_TARGET = new CommandParam(CommandParamType.STANDALONE_TARGET); public static final CommandParam WILDCARD_TARGET = new CommandParam(CommandParamType.WILDCARD_TARGET); - public static final CommandParam UNKNOWN_NON_ID = new CommandParam(CommandParamType.UNKNOWN_NON_ID); + public static final CommandParam NON_ID_TARGET = new CommandParam(CommandParamType.NON_ID_TARGET); public static final CommandParam SCORE_ARG = new CommandParam(CommandParamType.SCORE_ARG); public static final CommandParam SCORE_ARGS = new CommandParam(CommandParamType.SCORE_ARGS); public static final CommandParam SCORE_SELECT_PARAM = new CommandParam(CommandParamType.SCORE_SELECT_PARAM); @@ -32,6 +32,10 @@ public class CommandParam { public static final CommandParam INT_RANGE_POST_VAL = new CommandParam(CommandParamType.INT_RANGE_POST_VAL); public static final CommandParam INT_RANGE = new CommandParam(CommandParamType.INT_RANGE); public static final CommandParam INT_RANGE_FULL = new CommandParam(CommandParamType.INT_RANGE_FULL); + public static final CommandParam RATIONAL_RANGE_VAL = new CommandParam(CommandParamType.RATIONAL_RANGE_VAL); + public static final CommandParam RATIONAL_RANGE_POST_VAL = new CommandParam(CommandParamType.RATIONAL_RANGE_POST_VAL); + public static final CommandParam RATIONAL_RANGE = new CommandParam(CommandParamType.RATIONAL_RANGE); + public static final CommandParam RATIONAL_RANGE_FULL = new CommandParam(CommandParamType.RATIONAL_RANGE_FULL); public static final CommandParam SEL_ARGS = new CommandParam(CommandParamType.SEL_ARGS); public static final CommandParam ARGS = new CommandParam(CommandParamType.ARGS); public static final CommandParam ARG = new CommandParam(CommandParamType.ARG); @@ -52,6 +56,14 @@ public class CommandParam { public static final CommandParam HAS_ITEMS = new CommandParam(CommandParamType.HAS_ITEMS); public static final CommandParam HAS_ITEM_SELECTOR = new CommandParam(CommandParamType.HAS_ITEM_SELECTOR); public static final CommandParam EQUIPMENT_SLOTS = new CommandParam(CommandParamType.EQUIPMENT_SLOTS); + public static final CommandParam PROPERTY_VALUE = new CommandParam(CommandParamType.PROPERTY_VALUE); + public static final CommandParam HAS_PROPERTY_PARAM_VALUE = new CommandParam(CommandParamType.HAS_PROPERTY_PARAM_VALUE); + public static final CommandParam HAS_PROPERTY_PARAM_ENUM_VALUE = new CommandParam(CommandParamType.HAS_PROPERTY_PARAM_ENUM_VALUE); + public static final CommandParam HAS_PROPERTY_ARG = new CommandParam(CommandParamType.HAS_PROPERTY_ARG); + public static final CommandParam HAS_PROPERTY_ARGS = new CommandParam(CommandParamType.HAS_PROPERTY_ARGS); + public static final CommandParam HAS_PROPERTY_ELEMENT = new CommandParam(CommandParamType.HAS_PROPERTY_ELEMENT); + public static final CommandParam HAS_PROPERTY_ELEMENTS = new CommandParam(CommandParamType.HAS_PROPERTY_ELEMENTS); + public static final CommandParam HAS_PROPERTY_SELECTOR = new CommandParam(CommandParamType.HAS_PROPERTY_SELECTOR); public static final CommandParam STRING = new CommandParam(CommandParamType.STRING); public static final CommandParam ID_CONT = new CommandParam(CommandParamType.ID_CONT); public static final CommandParam COORD_X_INT = new CommandParam(CommandParamType.COORD_X_INT); @@ -82,21 +94,10 @@ public class CommandParam { public static final CommandParam BLOCK_STATE_VALUES = new CommandParam(CommandParamType.BLOCK_STATE_VALUES); public static final CommandParam BLOCK_STATES = new CommandParam(CommandParamType.BLOCK_STATES); public static final CommandParam BLOCK_STATES_CONT = new CommandParam(CommandParamType.BLOCK_STATES_CONT); + public static final CommandParam CLOCK_TIME_MARKER_NAME = new CommandParam(CommandParamType.CLOCK_TIME_MARKER_NAME); public static final CommandParam COMMAND = new CommandParam(CommandParamType.COMMAND); public static final CommandParam SLASH_COMMAND = new CommandParam(CommandParamType.SLASH_COMMAND); public static final CommandParam CHAINED_COMMAND = new CommandParam(CommandParamType.CHAINED_COMMAND); - public static final CommandParam RATIONAL_RANGE_VAL = new CommandParam(CommandParamType.RATIONAL_RANGE_VAL); - public static final CommandParam RATIONAL_RANGE_POST_VAL = new CommandParam(CommandParamType.RATIONAL_RANGE_POST_VAL); - public static final CommandParam RATIONAL_RANGE = new CommandParam(CommandParamType.RATIONAL_RANGE); - public static final CommandParam RATIONAL_RANGE_FULL = new CommandParam(CommandParamType.RATIONAL_RANGE_FULL); - public static final CommandParam PROPERTY_VALUE = new CommandParam(CommandParamType.PROPERTY_VALUE); - public static final CommandParam HAS_PROPERTY_PARAM_VALUE = new CommandParam(CommandParamType.HAS_PROPERTY_PARAM_VALUE); - public static final CommandParam HAS_PROPERTY_PARAM_ENUM_VALUE = new CommandParam(CommandParamType.HAS_PROPERTY_PARAM_ENUM_VALUE); - public static final CommandParam HAS_PROPERTY_ARG = new CommandParam(CommandParamType.HAS_PROPERTY_ARG); - public static final CommandParam HAS_PROPERTY_ARGS = new CommandParam(CommandParamType.HAS_PROPERTY_ARGS); - public static final CommandParam HAS_PROPERTY_ELEMENT = new CommandParam(CommandParamType.HAS_PROPERTY_ELEMENT); - public static final CommandParam HAS_PROPERTY_ELEMENTS = new CommandParam(CommandParamType.HAS_PROPERTY_ELEMENTS); - public static final CommandParam HAS_PROPERTY_SELECTOR = new CommandParam(CommandParamType.HAS_PROPERTY_SELECTOR); public static final CommandParam CODE_BUILDER_ARG = new CommandParam(CommandParamType.CODE_BUILDER_ARG); public static final CommandParam CODE_BUILDER_ARGS = new CommandParam(CommandParamType.CODE_BUILDER_ARGS); public static final CommandParam CODE_BUILDER_SELECT_PARAM = new CommandParam(CommandParamType.CODE_BUILDER_SELECT_PARAM); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/command/CommandParamType.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/command/CommandParamType.java index a872805..5c52f49 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/command/CommandParamType.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/command/CommandParamType.java @@ -5,91 +5,96 @@ public enum CommandParamType { INT, FLOAT, VALUE, - R_VALUE, // TODO: unknown + R_VALUE, WILDCARD_INT, OPERATOR, COMPARE_OPERATOR, - TARGET, - UNKNOWN_STANDALONE,// TODO: unknown - STANDALONESELECTION + TARGET, // selection + STANDALONE_TARGET, WILDCARD_TARGET, - UNKNOWN_NON_ID,// TODO: unknown - NONIDSELECTION + NON_ID_TARGET, SCORE_ARG, SCORE_ARGS, SCORE_SELECT_PARAM, SCORE_SELECTOR, TAG_SELECTOR, FILE_PATH, - FILE_PATH_VAL, // TODO: unknown - FILE_PATH_CONT, // TODO: unknown - INT_RANGE_VAL, // TODO: unknown - INT_RANGE_POST_VAL, // TODO: unknown + FILE_PATH_VAL, + FILE_PATH_CONT, + INT_RANGE_VAL, + INT_RANGE_POST_VAL, INT_RANGE, INT_RANGE_FULL, - SEL_ARGS, // TODO: unknown + RATIONAL_RANGE_VAL, + RATIONAL_RANGE_POST_VAL, + RATIONAL_RANGE, + RATIONAL_RANGE_FULL, + SEL_ARGS, ARGS, ARG, - MARG, // TODO: unknown - MVALUE, // TODO: unknown - NAME, // TODO: unknown - TYPE, // TODO: unknown - FAMILY, // TODO: unknown + MARG, + MVALUE, + NAME, + TYPE, + FAMILY, PERMISSION, PERMISSIONS, PERMISSION_SELECTOR, PERMISSION_ELEMENT, PERMISSION_ELEMENTS, TAG, - HAS_ITEM_ELEMENT, // TODO: unknown - HAS_ITEM_ELEMENTS, // TODO: unknown - HAS_ITEM, // TODO: unknown - HAS_ITEMS, // TODO: unknown - HAS_ITEM_SELECTOR, // TODO: unknown + HAS_ITEM_ELEMENT, + HAS_ITEM_ELEMENTS, + HAS_ITEM, + HAS_ITEMS, + HAS_ITEM_SELECTOR, EQUIPMENT_SLOTS, - STRING, - ID_CONT, // TODO: unknown + PROPERTY_VALUE, + HAS_PROPERTY_PARAM_VALUE, + HAS_PROPERTY_PARAM_ENUM_VALUE, + HAS_PROPERTY_ARG, + HAS_PROPERTY_ARGS, + HAS_PROPERTY_ELEMENT, + HAS_PROPERTY_ELEMENTS, + HAS_PROPERTY_SELECTOR, + STRING, // id + ID, + ID_CONT, COORD_X_INT, COORD_Y_INT, COORD_Z_INT, COORD_X_FLOAT, COORD_Y_FLOAT, COORD_Z_FLOAT, - BLOCK_POSITION, // POSITION_INT - POSITION, // POSITION_FLOAT - MESSAGE_XP, // TODO: unknown + BLOCK_POSITION, // int position + POSITION, // float position + MESSAGE_XP, MESSAGE, - MESSAGE_ROOT, // TODO: unknown + MESSAGE_ROOT, POST_SELECTOR, - TEXT, - TEXT_CONT, // TODO: unknown + TEXT, // raw text + TEXT_CONT, JSON_VALUE, JSON_FIELD, - JSON, + JSON, // json object JSON_OBJECT_FIELDS, - JSON_OBJECT_CONT, // TODO: unknown - maybe count? + JSON_OBJECT_CONT, JSON_ARRAY, JSON_ARRAY_VALUES, - JSON_ARRAY_CONT, // TODO: unknown - maybe count? + JSON_ARRAY_CONT, BLOCK_STATE, BLOCK_STATE_KEY, BLOCK_STATE_VALUE, BLOCK_STATE_VALUES, BLOCK_STATES, - BLOCK_STATES_CONT, // TODO: unknown - maybe count? + BLOCK_STATES_CONT, + /** + * @since v975 + */ + CLOCK_TIME_MARKER_NAME, COMMAND, SLASH_COMMAND, CHAINED_COMMAND, - RATIONAL_RANGE_VAL, - RATIONAL_RANGE_POST_VAL, - RATIONAL_RANGE, - RATIONAL_RANGE_FULL, - PROPERTY_VALUE, - HAS_PROPERTY_PARAM_VALUE, - HAS_PROPERTY_PARAM_ENUM_VALUE, - HAS_PROPERTY_ARG, - HAS_PROPERTY_ARGS, - HAS_PROPERTY_ELEMENT, - HAS_PROPERTY_ELEMENTS, - HAS_PROPERTY_SELECTOR, CODE_BUILDER_ARG, CODE_BUILDER_ARGS, CODE_BUILDER_SELECT_PARAM, diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/datastore/DataStoreAction.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/datastore/DataStoreAction.java new file mode 100644 index 0000000..fd474e4 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/datastore/DataStoreAction.java @@ -0,0 +1,6 @@ +package org.cloudburstmc.protocol.bedrock.data.datastore; + +public interface DataStoreAction { + + int getType(); +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/datastore/DataStoreChange.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/datastore/DataStoreChange.java new file mode 100644 index 0000000..43512dc --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/datastore/DataStoreChange.java @@ -0,0 +1,17 @@ +package org.cloudburstmc.protocol.bedrock.data.datastore; + +import lombok.Data; + +@Data +public class DataStoreChange implements DataStoreAction { + + private String dataStoreName; + private String property; + private Object newValue; + private int updateCount; + + @Override + public int getType() { + return 1; + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/datastore/DataStoreRemoval.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/datastore/DataStoreRemoval.java new file mode 100644 index 0000000..2c26e68 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/datastore/DataStoreRemoval.java @@ -0,0 +1,14 @@ +package org.cloudburstmc.protocol.bedrock.data.datastore; + +import lombok.Data; + +@Data +public class DataStoreRemoval implements DataStoreAction { + + private String dataStoreName; + + @Override + public int getType() { + return 2; + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/datastore/DataStoreUpdate.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/datastore/DataStoreUpdate.java new file mode 100644 index 0000000..cdb3225 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/datastore/DataStoreUpdate.java @@ -0,0 +1,19 @@ +package org.cloudburstmc.protocol.bedrock.data.datastore; + +import lombok.Data; + +@Data +public class DataStoreUpdate implements DataStoreAction { + + private String dataStoreName; + private String property; + private String path; + private Object data; + private int updateCount; + private int pathUpdateCount; + + @Override + public int getType() { + return 0; + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugArrow.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugArrow.java index 660f3d7..35fd1dd 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugArrow.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugArrow.java @@ -1,31 +1,46 @@ package org.cloudburstmc.protocol.bedrock.data.debugshape; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Value; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import java.awt.*; -@Value +@Data +@AllArgsConstructor @EqualsAndHashCode(callSuper = true) public class DebugArrow extends DebugShape { - @Nullable Vector3f arrowEndPosition; - @Nullable Float arrowHeadLength; - @Nullable Float arrowHeadRadius; - @Nullable Integer arrowHeadSegments; - public DebugArrow(long id, int dimension, @Nullable Vector3f position, @Nullable Float scale, @Nullable Vector3f rotation, @Nullable Float totalTimeLeft, @Nullable Color color, @Nullable Vector3f arrowEndPosition, @Nullable Float arrowHeadLength, @Nullable Float arrowHeadRadius, @Nullable Integer arrowHeadSegments) { - super(id, dimension, position, scale, rotation, totalTimeLeft, color); - this.arrowEndPosition = arrowEndPosition; - this.arrowHeadLength = arrowHeadLength; - this.arrowHeadRadius = arrowHeadRadius; - this.arrowHeadSegments = arrowHeadSegments; + public DebugArrow() { + } + + @Deprecated + public DebugArrow(long id, int dimension, @Nullable Vector3f position, @Nullable Float scale, @Nullable Vector3f rotation, @Nullable Float totalTimeLeft, @Nullable Color color, Vector3f arrowEndPosition, Float arrowHeadLength, Float arrowHeadRadius, Integer arrowHeadSegments) { + this(id, dimension, position, scale, rotation, totalTimeLeft, color, arrowEndPosition, arrowHeadLength, arrowHeadRadius, arrowHeadSegments, null); + } + + @Deprecated + public DebugArrow(long id, int dimension, @Nullable Vector3f position, @Nullable Float scale, @Nullable Vector3f rotation, @Nullable Float totalTimeLeft, @Nullable Color color, Vector3f arrowEndPosition, Float arrowHeadLength, Float arrowHeadRadius, Integer arrowHeadSegments, @Nullable Long attachedToEntityId) { + setId(id); + setDimension(dimension); + setPosition(position); + setScale(scale); + setRotation(rotation); + setTotalTimeLeft(totalTimeLeft); + setColor(color); + setAttachedToEntityId(attachedToEntityId); + + setArrowEndPosition(arrowEndPosition); + setArrowHeadLength(arrowHeadLength); + setArrowHeadRadius(arrowHeadRadius); + setArrowHeadSegments(arrowHeadSegments); } @Override diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugBox.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugBox.java index 8ad467c..95f9657 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugBox.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugBox.java @@ -1,21 +1,40 @@ package org.cloudburstmc.protocol.bedrock.data.debugshape; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Value; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import java.awt.*; -@Value +@Data +@AllArgsConstructor @EqualsAndHashCode(callSuper = true) public class DebugBox extends DebugShape { Vector3f boxBounds; + public DebugBox() { + } + + @Deprecated public DebugBox(long id, int dimension, @Nullable Vector3f position, @Nullable Float scale, @Nullable Vector3f rotation, @Nullable Float totalTimeLeft, @Nullable Color color, Vector3f boxBounds) { - super(id, dimension, position, scale, rotation, totalTimeLeft, color); - this.boxBounds = boxBounds; + this(id, dimension, position, scale, rotation, totalTimeLeft, color, boxBounds, null); + } + + @Deprecated + public DebugBox(long id, int dimension, @Nullable Vector3f position, @Nullable Float scale, @Nullable Vector3f rotation, @Nullable Float totalTimeLeft, @Nullable Color color, Vector3f boxBounds, @Nullable Long attachedToEntityId) { + setId(id); + setDimension(dimension); + setPosition(position); + setScale(scale); + setRotation(rotation); + setTotalTimeLeft(totalTimeLeft); + setColor(color); + setAttachedToEntityId(attachedToEntityId); + + setBoxBounds(boxBounds); } @Override diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugCircle.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugCircle.java index 2c664cd..060f667 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugCircle.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugCircle.java @@ -1,21 +1,40 @@ package org.cloudburstmc.protocol.bedrock.data.debugshape; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Value; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import java.awt.*; -@Value +@Data +@AllArgsConstructor @EqualsAndHashCode(callSuper = true) public class DebugCircle extends DebugShape { Integer segments; + public DebugCircle() { + } + + @Deprecated public DebugCircle(long id, int dimension, @Nullable Vector3f position, @Nullable Float scale, @Nullable Vector3f rotation, @Nullable Float totalTimeLeft, @Nullable Color color, Integer segments) { - super(id, dimension, position, scale, rotation, totalTimeLeft, color); - this.segments = segments; + this(id, dimension, position, scale, rotation, totalTimeLeft, color, segments, null); + } + + @Deprecated + public DebugCircle(long id, int dimension, @Nullable Vector3f position, @Nullable Float scale, @Nullable Vector3f rotation, @Nullable Float totalTimeLeft, @Nullable Color color, Integer segments, @Nullable Long attachedToEntityId) { + setId(id); + setDimension(dimension); + setPosition(position); + setScale(scale); + setRotation(rotation); + setTotalTimeLeft(totalTimeLeft); + setColor(color); + setAttachedToEntityId(attachedToEntityId); + + setSegments(segments); } @Override diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugCone.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugCone.java new file mode 100644 index 0000000..9d5e152 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugCone.java @@ -0,0 +1,27 @@ +package org.cloudburstmc.protocol.bedrock.data.debugshape; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.cloudburstmc.math.vector.Vector2f; + +/** + * @since v1001 + */ +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class DebugCone extends DebugShape { + + float height; + int segments; + Vector2f radii; + + public DebugCone() { + } + + @Override + public Type getType() { + return Type.CONE; + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugCylinder.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugCylinder.java new file mode 100644 index 0000000..3eecfb9 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugCylinder.java @@ -0,0 +1,28 @@ +package org.cloudburstmc.protocol.bedrock.data.debugshape; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.cloudburstmc.math.vector.Vector2f; + +/** + * @since v1001 + */ +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class DebugCylinder extends DebugShape { + + float height; + int segments; + Vector2f radiusX; + Vector2f radiusZ; + + public DebugCylinder() { + } + + @Override + public Type getType() { + return Type.CYLINDER; + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugEllipsoid.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugEllipsoid.java new file mode 100644 index 0000000..fe369c7 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugEllipsoid.java @@ -0,0 +1,26 @@ +package org.cloudburstmc.protocol.bedrock.data.debugshape; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.cloudburstmc.math.vector.Vector3f; + +/** + * @since v1001 + */ +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class DebugEllipsoid extends DebugShape { + + int segments; + Vector3f radii; + + public DebugEllipsoid() { + } + + @Override + public Type getType() { + return Type.ELLIPSOID; + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugLine.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugLine.java index 70d9f72..5fef437 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugLine.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugLine.java @@ -1,21 +1,40 @@ package org.cloudburstmc.protocol.bedrock.data.debugshape; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Value; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import java.awt.*; -@Value +@Data +@AllArgsConstructor @EqualsAndHashCode(callSuper = true) public class DebugLine extends DebugShape { Vector3f lineEndPosition; + public DebugLine() { + } + + @Deprecated public DebugLine(long id, int dimension, @Nullable Vector3f position, @Nullable Float scale, @Nullable Vector3f rotation, @Nullable Float totalTimeLeft, @Nullable Color color, Vector3f lineEndPosition) { - super(id, dimension, position, scale, rotation, totalTimeLeft, color); - this.lineEndPosition = lineEndPosition; + this(id, dimension, position, scale, rotation, totalTimeLeft, color, lineEndPosition, null); + } + + @Deprecated + public DebugLine(long id, int dimension, @Nullable Vector3f position, @Nullable Float scale, @Nullable Vector3f rotation, @Nullable Float totalTimeLeft, @Nullable Color color, Vector3f lineEndPosition, @Nullable Long attachedToEntityId) { + setId(id); + setDimension(dimension); + setPosition(position); + setScale(scale); + setRotation(rotation); + setTotalTimeLeft(totalTimeLeft); + setColor(color); + setAttachedToEntityId(attachedToEntityId); + + setLineEndPosition(lineEndPosition); } @Override diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugPyramid.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugPyramid.java new file mode 100644 index 0000000..ea47fee --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugPyramid.java @@ -0,0 +1,28 @@ +package org.cloudburstmc.protocol.bedrock.data.debugshape; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.checkerframework.checker.nullness.qual.Nullable; + +/** + * @since v1001 + */ +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class DebugPyramid extends DebugShape { + + float height; + float width; + @Nullable + Float depth; + + public DebugPyramid() { + } + + @Override + public Type getType() { + return Type.PYRAMID; + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugShape.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugShape.java index f659e2b..761864a 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugShape.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugShape.java @@ -1,6 +1,7 @@ package org.cloudburstmc.protocol.bedrock.data.debugshape; import lombok.AllArgsConstructor; +import lombok.Data; import lombok.Getter; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -8,32 +9,41 @@ import java.awt.*; @Getter +@Data @AllArgsConstructor public class DebugShape { - private final long id; + private long id; /** * @since v859 */ - private final int dimension; + private int dimension; @Nullable - private final Vector3f position; + private Vector3f position; @Nullable - private final Float scale; + private Float scale; @Nullable - private final Vector3f rotation; + private Vector3f rotation; @Nullable - private final Float totalTimeLeft; + private Float totalTimeLeft; @Nullable - private final Color color; + private Color color; + @Nullable + private Long attachedToEntityId; + @Nullable + private Float maximumRenderDistance; + + public DebugShape() { + } public DebugShape(long id) { - this(id, 0, null, null, null, null, null); + this(id, 0); } public DebugShape(long id, int dimension) { - this(id, dimension, null, null, null, null, null); + this.id = id; + this.dimension = dimension; } public Type getType() { @@ -46,6 +56,22 @@ public enum Type { SPHERE, CIRCLE, TEXT, - ARROW + ARROW, + /** + * @since v1001 + */ + CYLINDER, + /** + * @since v1001 + */ + PYRAMID, + /** + * @since v1001 + */ + ELLIPSOID, + /** + * @since v1001 + */ + CONE } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugSphere.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugSphere.java index 786ce93..7b1e523 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugSphere.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugSphere.java @@ -1,21 +1,40 @@ package org.cloudburstmc.protocol.bedrock.data.debugshape; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Value; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import java.awt.*; -@Value +@Data +@AllArgsConstructor @EqualsAndHashCode(callSuper = true) public class DebugSphere extends DebugShape { Integer segments; + public DebugSphere() { + } + + @Deprecated public DebugSphere(long id, int dimension, @Nullable Vector3f position, @Nullable Float scale, @Nullable Vector3f rotation, @Nullable Float totalTimeLeft, @Nullable Color color, Integer segments) { - super(id, dimension, position, scale, rotation, totalTimeLeft, color); - this.segments = segments; + this(id, dimension, position, scale, rotation, totalTimeLeft, color, segments, null); + } + + @Deprecated + public DebugSphere(long id, int dimension, @Nullable Vector3f position, @Nullable Float scale, @Nullable Vector3f rotation, @Nullable Float totalTimeLeft, @Nullable Color color, Integer segments, @Nullable Long attachedToEntityId) { + setId(id); + setDimension(dimension); + setPosition(position); + setScale(scale); + setRotation(rotation); + setTotalTimeLeft(totalTimeLeft); + setColor(color); + setAttachedToEntityId(attachedToEntityId); + + setSegments(segments); } @Override diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugText.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugText.java index 874a038..83539dd 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugText.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/debugshape/DebugText.java @@ -1,21 +1,59 @@ package org.cloudburstmc.protocol.bedrock.data.debugshape; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Value; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import java.awt.*; -@Value +@Data @EqualsAndHashCode(callSuper = true) public class DebugText extends DebugShape { String text; + /** + * @since v975 + */ + boolean useRotation; + /** + * @since v975 + */ + @Nullable + Color backgroundColor; + /** + * @since v975 + */ + boolean depthTest; + /** + * @since v975 + */ + boolean showBackface; + /** + * @since v975 + */ + boolean showTextBackface; + public DebugText() { + } + + @Deprecated public DebugText(long id, int dimension, @Nullable Vector3f position, @Nullable Float scale, @Nullable Vector3f rotation, @Nullable Float totalTimeLeft, @Nullable Color color, String text) { - super(id, dimension, position, scale, rotation, totalTimeLeft, color); - this.text = text; + this(id, dimension, position, scale, rotation, totalTimeLeft, color, text, null); + } + + @Deprecated + public DebugText(long id, int dimension, @Nullable Vector3f position, @Nullable Float scale, @Nullable Vector3f rotation, @Nullable Float totalTimeLeft, @Nullable Color color, String text, @Nullable Long attachedToEntityId) { + setId(id); + setDimension(dimension); + setPosition(position); + setScale(scale); + setRotation(rotation); + setTotalTimeLeft(totalTimeLeft); + setColor(color); + setAttachedToEntityId(attachedToEntityId); + + setText(text); } @Override diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/definitions/DimensionDefinition.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/definitions/DimensionDefinition.java index 50d4762..56004e2 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/definitions/DimensionDefinition.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/definitions/DimensionDefinition.java @@ -8,4 +8,8 @@ public class DimensionDefinition { int maximumHeight; int minimumHeight; int generatorType; + /** + * @since v975 + */ + int dimensionType; } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/diagnostics/EntityDiagnosticTimingInfo.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/diagnostics/EntityDiagnosticTimingInfo.java new file mode 100644 index 0000000..df60514 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/diagnostics/EntityDiagnosticTimingInfo.java @@ -0,0 +1,11 @@ +package org.cloudburstmc.protocol.bedrock.data.diagnostics; + +import lombok.Value; + +@Value +public class EntityDiagnosticTimingInfo { + String displayName; + String entity; + long timeInNs; + byte percentOfTotal; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/diagnostics/MemoryCategoryCounter.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/diagnostics/MemoryCategoryCounter.java new file mode 100644 index 0000000..8ee3f47 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/diagnostics/MemoryCategoryCounter.java @@ -0,0 +1,139 @@ +package org.cloudburstmc.protocol.bedrock.data.diagnostics; + +import lombok.Data; + +@Data +public class MemoryCategoryCounter { + + private final Category category; + private final long currentBytes; + + public enum Category { + + UNKNOWN, + INVALID_SIZE_UNKNOWN, + ACTOR, + ACTOR_ANIMATION, + ACTOR_RENDERING, + BALANCER, + BLOCK_TICKING_QUEUES, + BIOME_STORAGE, + CEREAL, + CIRCUIT_SYSTEM, + CLIENT, + COMMANDS, + DB_STORAGE, + DEBUG, + DOCUMENTATION, + ECS_SYSTEMS, + FMOD, + FONTS, + IM_GUI, + INPUT, + JSON_UI, + JSON_UI_CONTROL_FACTORY_JSON, + JSON_UI_CONTROL_TREE, + JSON_UI_CONTROL_TREE_CONTROL_ELEMENT, + JSON_UI_CONTROL_TREE_POPULATE_DATA_BINDING, + JSON_UI_CONTROL_TREE_POPULATE_FOCUS, + JSON_UI_CONTROL_TREE_POPULATE_LAYOUT, + JSON_UI_CONTROL_TREE_POPULATE_OTHER, + JSON_UI_CONTROL_TREE_POPULATE_SPRITE, + JSON_UI_CONTROL_TREE_POPULATE_TEXT, + JSON_UI_CONTROL_TREE_POPULATE_TTS, + JSON_UI_CONTROL_TREE_VISIBILITY, + JSON_UI_CREATE_UI, + JSON_UI_DEFS, + JSON_UI_LAYOUT_MANAGER, + JSON_UI_LAYOUT_MANAGER_REMOVE_DEPENDENCIES, + JSON_UI_LAYOUT_MANAGER_INIT_VARIABLE, + LANGUAGES, + LEVEL, + LEVEL_STRUCTURES, + LEVEL_CHUNK, + LEVEL_CHUNK_GEN, + LEVEL_CHUNK_GEN_THREAD_LOCAL, + NETWORK, + MARKETPLACE, + MATERIAL_DRAGON_COMPILED_DEFINITION, + MATERIAL_DRAGON_MATERIAL, + MATERIAL_DRAGON_RESOURCE, + MATERIAL_DRAGON_UNIFORM_MAP, + MATERIAL_RENDER_MATERIAL, + MATERIAL_RENDER_MATERIAL_GROUP, + MATERIAL_VARIATION_MANAGER, + MOLANG, + ORE_UI, + PERSONA, + PLAYER, + RENDER_CHUNK, + RENDER_CHUNK_INDEX_BUFFER, + RENDER_CHUNK_VERTEX_BUFFER, + RENDERING, + RENDERING_LIBRARY, + REQUEST_LOG, + RESOURCE_PACKS, + SOUND, + SUB_CHUNK_BIOME_DATA, + SUB_CHUNK_BLOCK_DATA, + SUB_CHUNK_LIGHT_DATA, + TEXTURES, + VR, + WEATHER_RENDERER, + WORLD_GENERATOR, + TASKS, + TEST, + SCRIPTING, + SCRIPTING_RUNTIME, + SCRIPTING_CONTEXT, + SCRIPTING_CONTEXT_BINDINGS_MC, + SCRIPTING_CONTEXT_BINDINGS_GT, + SCRIPTING_CONTEXT_RUN, + DATA_DRIVEN_UI, + DATA_DRIVEN_UI_DEFS, + /** + * @since v944 + */ + GAMEFACE, + /** + * @since v944 + */ + GAMEFACE_SYSTEM, + /** + * @since v944 + */ + GAMEFACE_DOM, + /** + * @since v944 + */ + GAMEFACE_CSS, + /** + * @since v944 + */ + GAMEFACE_DISPLAY, + /** + * @since v944 + */ + GAMEFACE_TEMP_ALLOCATOR, + /** + * @since v944 + */ + GAMEFACE_POOL_ALLOCATOR, + /** + * @since v944 + */ + GAMEFACE_DUMP, + /** + * @since v944 + */ + GAMEFACE_MEDIA, + /** + * @since v944 + */ + GAMEFACE_JSON, + /** + * @since v944 + */ + GAMEFACE_SCRIPT_ENGINE, + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/diagnostics/SystemDiagnosticTimingInfo.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/diagnostics/SystemDiagnosticTimingInfo.java new file mode 100644 index 0000000..01d2ef2 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/diagnostics/SystemDiagnosticTimingInfo.java @@ -0,0 +1,11 @@ +package org.cloudburstmc.protocol.bedrock.data.diagnostics; + +import lombok.Value; + +@Value +public class SystemDiagnosticTimingInfo { + String displayName; + long systemIndex; + long timeInNs; + byte percentOfTotal; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/diagnostics/WhiskerScopeDataSummary.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/diagnostics/WhiskerScopeDataSummary.java new file mode 100644 index 0000000..26cd419 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/diagnostics/WhiskerScopeDataSummary.java @@ -0,0 +1,13 @@ +package org.cloudburstmc.protocol.bedrock.data.diagnostics; + +import lombok.Value; + +@Value +public class WhiskerScopeDataSummary { + + String label; + String indentation; + long totalHighCostNS; + long totalMidCostNS; + long totalLowCostNS; +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityDamageCause.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityDamageCause.java index 4d203a2..435e4e9 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityDamageCause.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityDamageCause.java @@ -1,6 +1,7 @@ package org.cloudburstmc.protocol.bedrock.data.entity; public enum EntityDamageCause { + NONE, OVERRIDE, CONTACT, ENTITY_ATTACK, @@ -31,6 +32,8 @@ public enum EntityDamageCause { FREEZING, STALACTITE, STALAGMITE, + RAM_ATTACK, + SONIC_BOOM, CAMPFIRE, SOUL_CAMPFIRE, /** diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityDataTypes.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityDataTypes.java index e617418..a3513bb 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityDataTypes.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityDataTypes.java @@ -8,9 +8,7 @@ import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; import java.util.EnumMap; -import java.util.EnumSet; import java.util.Map; -import java.util.Set; @UtilityClass public class EntityDataTypes { @@ -303,4 +301,27 @@ public boolean isInstance(Object value) { * @since v800 */ public static final EntityDataType SEAT_CAMERA_RELAX_DISTANCE_SMOOTHING = new EntityDataType<>(Float.class, "SEAT_CAMERA_RELAX_DISTANCE_SMOOTHING"); + /** + * @since v924 + */ + public static final EntityDataType AIM_ASSIST_PRIORITY_PRESET_ID = new EntityDataType<>(Integer.class, "AIM_ASSIST_PRIORITY_PRESET_ID"); + /** + * @since v924 + */ + public static final EntityDataType AIM_ASSIST_PRIORITY_CATEGORY_ID = new EntityDataType<>(Integer.class, "AIM_ASSIST_PRIORITY_CATEGORY_ID"); + /** + * @since v924 + */ + public static final EntityDataType AIM_ASSIST_PRIORITY_ACTOR_ID = new EntityDataType<>(Integer.class, "AIM_ASSIST_PRIORITY_ACTOR_ID"); + public static final EntityDataType ARROW_SHOOTER_ID = new EntityDataType<>(Long.class, "ARROW_SHOOTER_ID"); + public static final EntityDataType FIREWORK_SHOOTER_ID = new EntityDataType<>(Long.class, "FIREWORK_SHOOTER_ID"); + public static final EntityDataType FIREWORK_DIRECTION = new EntityDataType<>(Vector3f.class, "FIREWORK_DIRECTION"); + /** + * @since v975 + */ + public static final EntityDataType RESERVED_139 = new EntityDataType<>(Long.class, "RESERVED_139"); + /** + * @since v975 + */ + public static final EntityDataType NAMEPLATE_RENDER_DISTANCE_MAX = new EntityDataType<>(Float.class, "NAMEPLATE_RENDER_DISTANCE_MAX"); } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityEventType.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityEventType.java index ca44b78..cdc0dec 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityEventType.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityEventType.java @@ -77,7 +77,11 @@ public enum EntityEventType { */ SHAKE_WETNESS_STOP, /** - * @since v898 + * @since v897 */ - KINETIC_DAMAGE_DEALT + KINETIC_DAMAGE_DEALT, + /** + * @since v975 + */ + HURT_WITHOUT_RECEIVING_DAMAGE } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityFlag.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityFlag.java index 9def36d..746a101 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityFlag.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityFlag.java @@ -182,5 +182,17 @@ public enum EntityFlag { /** * @since v859 */ - BODY_ROTATION_LOCKED_TO_VEHICLE + BODY_ROTATION_LOCKED_TO_VEHICLE, + /** + * @since v975 + */ + USES_LEGACY_FRICTION, + /** + * @since v975 + */ + USES_UNIFORM_AIR_DRAG, + /** + * @since v975 + */ + NAMEPLATE_DEPTH_TESTED, } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/AchievementAwardedEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/AchievementAwardedEventData.java index 029b584..e493d61 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/AchievementAwardedEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/AchievementAwardedEventData.java @@ -10,4 +10,9 @@ public class AchievementAwardedEventData implements EventData { public EventDataType getType() { return EventDataType.ACHIEVEMENT_AWARDED; } + + @Override + public int getPayloadType() { + return 0; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/AgentCommandEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/AgentCommandEventData.java index f22b947..cd89464 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/AgentCommandEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/AgentCommandEventData.java @@ -3,6 +3,7 @@ import lombok.Value; @Value +@Deprecated public class AgentCommandEventData implements EventData { private final AgentResult result; private final String command; diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/AgentCreatedEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/AgentCreatedEventData.java index 02d50f6..14c3742 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/AgentCreatedEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/AgentCreatedEventData.java @@ -4,6 +4,7 @@ import lombok.NoArgsConstructor; @NoArgsConstructor(access = AccessLevel.PRIVATE) +@Deprecated public class AgentCreatedEventData implements EventData { public static final AgentCreatedEventData INSTANCE = new AgentCreatedEventData(); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/BellUsedEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/BellUsedEventData.java index 2786e0e..e2f05ce 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/BellUsedEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/BellUsedEventData.java @@ -10,4 +10,9 @@ public class BellUsedEventData implements EventData { public EventDataType getType() { return EventDataType.BELL_USED; } + + @Override + public int getPayloadType() { + return 12; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/BossKilledEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/BossKilledEventData.java index 02e69ef..9d79d49 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/BossKilledEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/BossKilledEventData.java @@ -12,4 +12,9 @@ public class BossKilledEventData implements EventData { public EventDataType getType() { return EventDataType.BOSS_KILLED; } + + @Override + public int getPayloadType() { + return 7; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CarefulRestorationEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CarefulRestorationEventData.java index 6f2e995..c068ea1 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CarefulRestorationEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CarefulRestorationEventData.java @@ -4,6 +4,7 @@ import lombok.NoArgsConstructor; @NoArgsConstructor(access = AccessLevel.PRIVATE) +@Deprecated public class CarefulRestorationEventData implements EventData { public static final CarefulRestorationEventData INSTANCE = new CarefulRestorationEventData(); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CauldronInteractEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CauldronInteractEventData.java index 8deff4f..68bfdb7 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CauldronInteractEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CauldronInteractEventData.java @@ -12,4 +12,9 @@ public class CauldronInteractEventData implements EventData { public EventDataType getType() { return EventDataType.CAULDRON_INTERACT; } + + @Override + public int getPayloadType() { + return 10; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CauldronUsedEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CauldronUsedEventData.java index 914d70d..89a4952 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CauldronUsedEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CauldronUsedEventData.java @@ -12,4 +12,9 @@ public class CauldronUsedEventData implements EventData { public EventDataType getType() { return EventDataType.CAULDRON_USED; } + + @Override + public int getPayloadType() { + return 5; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CodeBuilderActionEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CodeBuilderActionEventData.java index 7de31df..dcd7c20 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CodeBuilderActionEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CodeBuilderActionEventData.java @@ -10,4 +10,9 @@ public class CodeBuilderActionEventData implements EventData { public EventDataType getType() { return EventDataType.CODE_BUILDER_ACTION; } + + @Override + public int getPayloadType() { + return 18; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CodeBuilderScoreboardEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CodeBuilderScoreboardEventData.java index f7cf0cc..278acc9 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CodeBuilderScoreboardEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CodeBuilderScoreboardEventData.java @@ -11,4 +11,9 @@ public class CodeBuilderScoreboardEventData implements EventData { public EventDataType getType() { return EventDataType.CODE_BUILDER_SCOREBOARD; } + + @Override + public int getPayloadType() { + return 19; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/ComposterInteractEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/ComposterInteractEventData.java index cb9fd17..e2e0c99 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/ComposterInteractEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/ComposterInteractEventData.java @@ -12,4 +12,9 @@ public class ComposterInteractEventData implements EventData { public EventDataType getType() { return EventDataType.COMPOSTER_INTERACT; } + + @Override + public int getPayloadType() { + return 11; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CopperWaxedOrUnwaxedEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CopperWaxedOrUnwaxedEventData.java index 352b04b..4ab974e 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CopperWaxedOrUnwaxedEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/CopperWaxedOrUnwaxedEventData.java @@ -11,4 +11,9 @@ public class CopperWaxedOrUnwaxedEventData implements EventData { public EventDataType getType() { return EventDataType.COPPER_WAXED_OR_UNWAXED; } + + @Override + public int getPayloadType() { + return 17; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/EntityDefinitionTriggerEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/EntityDefinitionTriggerEventData.java index 1eaacbb..e0bbb3c 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/EntityDefinitionTriggerEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/EntityDefinitionTriggerEventData.java @@ -10,4 +10,9 @@ public class EntityDefinitionTriggerEventData implements EventData { public EventDataType getType() { return EventDataType.ENTITY_DEFINITION_TRIGGER; } + + @Override + public int getPayloadType() { + return 13; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/EntityInteractEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/EntityInteractEventData.java index 4ac7c98..6547dbc 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/EntityInteractEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/EntityInteractEventData.java @@ -17,4 +17,9 @@ public class EntityInteractEventData implements EventData { public EventDataType getType() { return EventDataType.ENTITY_INTERACT; } + + @Override + public int getPayloadType() { + return 1; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/EventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/EventData.java index 53807f4..a358274 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/EventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/EventData.java @@ -3,4 +3,8 @@ public interface EventData { EventDataType getType(); + + default int getPayloadType() { + return -1; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/ExtractHoneyEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/ExtractHoneyEventData.java index 2e1d2d3..52dedd8 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/ExtractHoneyEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/ExtractHoneyEventData.java @@ -4,6 +4,7 @@ import lombok.NoArgsConstructor; @NoArgsConstructor(access = AccessLevel.PRIVATE) +@Deprecated public class ExtractHoneyEventData implements EventData { public static final ExtractHoneyEventData INSTANCE = new ExtractHoneyEventData(); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/FishBucketedEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/FishBucketedEventData.java index 82cbb2c..e6a397e 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/FishBucketedEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/FishBucketedEventData.java @@ -3,6 +3,7 @@ import lombok.Value; @Value +@Deprecated public class FishBucketedEventData implements EventData { private final int pattern; private final int preset; diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/ItemUsedEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/ItemUsedEventData.java index 2414064..0159b58 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/ItemUsedEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/ItemUsedEventData.java @@ -13,4 +13,9 @@ public class ItemUsedEventData implements EventData { public EventDataType getType() { return EventDataType.ITEM_USED_EVENT; } + + @Override + public int getPayloadType() { + return 20; + } } \ No newline at end of file diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/MobBornEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/MobBornEventData.java index e3aed14..a9d0985 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/MobBornEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/MobBornEventData.java @@ -12,4 +12,9 @@ public class MobBornEventData implements EventData { public EventDataType getType() { return EventDataType.MOB_BORN; } + + @Override + public int getPayloadType() { + return 9; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/MobKilledEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/MobKilledEventData.java index 3181d79..ccb5f23 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/MobKilledEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/MobKilledEventData.java @@ -22,4 +22,9 @@ public class MobKilledEventData implements EventData { public EventDataType getType() { return EventDataType.MOB_KILLED; } + + @Override + public int getPayloadType() { + return 4; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/MovementAnomalyEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/MovementAnomalyEventData.java index 58d2891..f423e52 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/MovementAnomalyEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/MovementAnomalyEventData.java @@ -3,6 +3,7 @@ import lombok.Value; @Value +@Deprecated public class MovementAnomalyEventData implements EventData { private final int eventType; private final float cheatingScore; diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/MovementCorrectedEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/MovementCorrectedEventData.java index efeedde..e72808c 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/MovementCorrectedEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/MovementCorrectedEventData.java @@ -3,6 +3,7 @@ import lombok.Value; @Value +@Deprecated public class MovementCorrectedEventData implements EventData { private final float positionDelta; private final float cheatingScore; diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PatternRemovedEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PatternRemovedEventData.java index 85d642c..ec4d6bf 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PatternRemovedEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PatternRemovedEventData.java @@ -3,6 +3,7 @@ import lombok.Value; @Value +@Deprecated public class PatternRemovedEventData implements EventData { private final int itemId; private final int auxValue; diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PetDiedEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PetDiedEventData.java index dd47ced..c26a086 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PetDiedEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PetDiedEventData.java @@ -3,6 +3,7 @@ import lombok.Value; @Value +@Deprecated public class PetDiedEventData implements EventData { private final boolean ownerKilled; private final long killerUniqueEntityId; diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PiglinBarterEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PiglinBarterEventData.java index bb2b9fc..22f402a 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PiglinBarterEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PiglinBarterEventData.java @@ -12,4 +12,9 @@ public class PiglinBarterEventData implements EventData { public EventDataType getType() { return EventDataType.PIGLIN_BARTER; } + + @Override + public int getPayloadType() { + return 16; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PlayerDiedEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PlayerDiedEventData.java index 5e69f0f..2d29b14 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PlayerDiedEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PlayerDiedEventData.java @@ -13,4 +13,9 @@ public class PlayerDiedEventData implements EventData { public EventDataType getType() { return EventDataType.PLAYER_DIED; } + + @Override + public int getPayloadType() { + return 6; + } } \ No newline at end of file diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PortalBuiltEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PortalBuiltEventData.java index 33df81a..1b7c961 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PortalBuiltEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PortalBuiltEventData.java @@ -10,4 +10,9 @@ public class PortalBuiltEventData implements EventData { public EventDataType getType() { return EventDataType.PORTAL_BUILT; } + + @Override + public int getPayloadType() { + return 2; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PortalUsedEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PortalUsedEventData.java index 1a7b2c7..c9a4469 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PortalUsedEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/PortalUsedEventData.java @@ -11,4 +11,9 @@ public class PortalUsedEventData implements EventData { public EventDataType getType() { return EventDataType.PORTAL_USED; } + + @Override + public int getPayloadType() { + return 3; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/RaidUpdateEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/RaidUpdateEventData.java index 1c38433..b88a51e 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/RaidUpdateEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/RaidUpdateEventData.java @@ -12,4 +12,9 @@ public class RaidUpdateEventData implements EventData { public EventDataType getType() { return EventDataType.RAID_UPDATE; } + + @Override + public int getPayloadType() { + return 14; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/SlashCommandExecutedEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/SlashCommandExecutedEventData.java index 59bf424..b75b3cc 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/SlashCommandExecutedEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/SlashCommandExecutedEventData.java @@ -8,10 +8,16 @@ public class SlashCommandExecutedEventData implements EventData { private final String commandName; private final int successCount; + private final int errorCount; private final List outputMessages; @Override public EventDataType getType() { return EventDataType.SLASH_COMMAND_EXECUTED; } + + @Override + public int getPayloadType() { + return 8; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/SneakCloseToSculkSensorEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/SneakCloseToSculkSensorEventData.java index ea9b62b..fd52186 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/SneakCloseToSculkSensorEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/SneakCloseToSculkSensorEventData.java @@ -4,6 +4,7 @@ import lombok.NoArgsConstructor; @NoArgsConstructor(access = AccessLevel.PRIVATE) +@Deprecated public class SneakCloseToSculkSensorEventData implements EventData { public static final SneakCloseToSculkSensorEventData INSTANCE = new SneakCloseToSculkSensorEventData(); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/StriderRiddenInLavaInOverworldEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/StriderRiddenInLavaInOverworldEventData.java index bf82253..341ea4e 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/StriderRiddenInLavaInOverworldEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/StriderRiddenInLavaInOverworldEventData.java @@ -4,6 +4,7 @@ import lombok.NoArgsConstructor; @NoArgsConstructor(access = AccessLevel.PRIVATE) +@Deprecated public class StriderRiddenInLavaInOverworldEventData implements EventData { public static final StriderRiddenInLavaInOverworldEventData INSTANCE = new StriderRiddenInLavaInOverworldEventData(); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/TargetBlockHitEventData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/TargetBlockHitEventData.java index 8f0ab2e..984210e 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/TargetBlockHitEventData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/event/TargetBlockHitEventData.java @@ -10,4 +10,9 @@ public class TargetBlockHitEventData implements EventData { public EventDataType getType() { return EventDataType.TARGET_BLOCK_HIT; } + + @Override + public int getPayloadType() { + return 15; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/ContainerSlotType.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/ContainerSlotType.java index fa8d2ae..25934f6 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/ContainerSlotType.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/ContainerSlotType.java @@ -72,5 +72,17 @@ public enum ContainerSlotType { /** * @since v712 */ - DYNAMIC_CONTAINER + DYNAMIC_CONTAINER, + /** + * @since v944 + */ + RECIPE_FOOD_CONTAINER, + /** + * @since v944 + */ + RECIPE_BLOCKS_CONTAINER, + /** + * @since v944 + */ + RECIPE_FURNACE_ITEMS_CONTAINER, } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/InventoryLayout.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/InventoryLayout.java index 939a21e..1c50c76 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/InventoryLayout.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/InventoryLayout.java @@ -2,9 +2,18 @@ public enum InventoryLayout { NONE, - SURVIVAL, - RECIPE_BOOK, - CREATIVE; + /** + * SURVIVAL before v924 + */ + INVENTORY_ONLY, + /** + * RECIPE_BOOK before v924 + */ + DEFAULT, + /** + * CREATIVE before v924 + */ + RECIPE_BOOK_ONLY; public static final InventoryLayout[] VALUES = values(); } \ No newline at end of file diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/crafting/CraftingDataType.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/crafting/CraftingDataType.java index 78875e5..e773cb6 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/crafting/CraftingDataType.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/crafting/CraftingDataType.java @@ -3,7 +3,13 @@ public enum CraftingDataType { SHAPELESS, SHAPED, + /** + * @deprecated since v975 + */ FURNACE, + /** + * @deprecated since v975 + */ FURNACE_DATA, MULTI, SHULKER_BOX, // USER_DATA_SHAPELESS diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/crafting/recipe/FurnaceRecipeData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/crafting/recipe/FurnaceRecipeData.java index f53fea7..968c8ea 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/crafting/recipe/FurnaceRecipeData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/crafting/recipe/FurnaceRecipeData.java @@ -6,6 +6,9 @@ import static org.cloudburstmc.protocol.common.util.Preconditions.checkArgument; +/** + * @deprecated since v975 + */ @Getter @ToString @EqualsAndHashCode diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/itemstack/request/TextProcessingEventOrigin.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/itemstack/request/TextProcessingEventOrigin.java index f636506..54af80a 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/itemstack/request/TextProcessingEventOrigin.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/itemstack/request/TextProcessingEventOrigin.java @@ -47,5 +47,9 @@ public enum TextProcessingEventOrigin { /** * @since v662 */ - SERVER_FORM + SERVER_FORM, + /** + * @since v975 + */ + DATA_DRIVEN_UI } \ No newline at end of file diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/itemstack/response/ItemStackResponseStatus.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/itemstack/response/ItemStackResponseStatus.java index a527135..343cada 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/itemstack/response/ItemStackResponseStatus.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/itemstack/response/ItemStackResponseStatus.java @@ -4,13 +4,72 @@ * Represents the status of a {@link ItemStackResponse}. */ public enum ItemStackResponseStatus { - /** - * The transaction request was valid. - */ OK, - - /** - * The transaction request was invalid. - */ - ERROR + ERROR, + INVALID_REQUEST_ACTION_TYPE, + ACTION_REQUEST_NOT_ALLOWED, + SCREEN_HANDLER_END_REQUEST_FAILED, + ITEM_REQUEST_ACTION_HANDLER_COMMIT_FAILED, + INVALID_REQUEST_CRAFT_ACTION_TYPE, + INVALID_CRAFT_REQUEST, + INVALID_CRAFT_REQUEST_SCREEN, + INVALID_CRAFT_RESULT, + INVALID_CRAFT_RESULT_INDEX, + INVALID_CRAFT_RESULT_ITEM, + INVALID_ITEM_NET_ID, + MISSING_CREATED_OUTPUT_CONTAINER, + FAILED_TO_SET_CREATED_ITEM_OUTPUT_SLOT, + REQUEST_ALREADY_IN_PROGRESS, + FAILED_TO_INIT_SPARSE_CONTAINER, + RESULT_TRANSFER_FAILED, + EXPECTED_ITEM_SLOT_NOT_FULLY_CONSUMED, + EXPECTED_ANYWHERE_ITEM_NOT_FULLY_CONSUMED, + ITEM_ALREADY_CONSUMED_FROM_SLOT, + CONSUMED_TOO_MUCH_FROM_SLOT, + MISMATCH_SLOT_EXPECTED_CONSUMED_ITEM, + MISMATCH_SLOT_EXPECTED_CONSUMED_ITEM_NET_ID_VARIANT, + FAILED_TO_MATCH_EXPECTED_SLOT_CONSUMED_ITEM, + FAILED_TO_MATCH_EXPECTED_ALLOWED_ANYWHERE_CONSUMED_ITEM, + CONSUMED_ITEM_OUT_OF_ALLOWED_SLOT_RANGE, + CONSUMED_ITEM_NOT_ALLOWED, + PLAYER_NOT_IN_CREATIVE_MODE, + INVALID_EXPERIMENTAL_RECIPE_REQUEST, + FAILED_TO_CRAFT_CREATIVE, + FAILED_TO_GET_LEVEL_RECIPE, + FAILED_TO_FIND_RECIPE_BY_NET_ID, + MISMATCHED_CRAFTING_SIZE, + MISSING_INPUT_SPARSE_CONTAINER, + MISMATCHED_RECIPE_FOR_INPUT_GRID_ITEMS, + EMPTY_CRAFT_RESULTS, + FAILED_TO_ENCHANT, + MISSING_INPUT_ITEM, + INSUFFICIENT_PLAYER_LEVEL_TO_ENCHANT, + MISSING_MATERIAL_ITEM, + MISSING_ACTOR, + UNKNOWN_PRIMARY_EFFECT, + PRIMARY_EFFECT_OUT_OF_RANGE, + PRIMARY_EFFECT_UNAVAILABLE, + SECONDARY_EFFECT_OUT_OF_RANGE, + SECONDARY_EFFECT_UNAVAILABLE, + DST_CONTAINER_EQUAL_TO_CREATED_OUTPUT_CONTAINER, + DST_CONTAINER_AND_SLOT_EQUAL_TO_SRC_CONTAINER_AND_SLOT, + FAILED_TO_VALIDATE_SRC_SLOT, + FAILED_TO_VALIDATE_DST_SLOT, + INVALID_ADJUSTED_AMOUNT, + INVALID_ITEM_SET_TYPE, + INVALID_TRANSFER_AMOUNT, + CANNOT_SWAP_ITEM, + CANNOT_PLACE_ITEM, + UNHANDLED_ITEM_SET_TYPE, + INVALID_REMOVED_AMOUNT, + INVALID_REGION, + CANNOT_DROP_ITEM, + CANNOT_DESTROY_ITEM, + INVALID_SOURCE_CONTAINER, + ITEM_NOT_CONSUMED, + INVALID_NUM_CRAFTS, + INVALID_CRAFT_RESULT_STACK_SIZE, + CANNOT_REMOVE_ITEM, + CANNOT_CONSUME_ITEM, + SCREEN_STACK_ERROR } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/transaction/InventorySource.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/transaction/InventorySource.java index b58f78b..2220952 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/transaction/InventorySource.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/transaction/InventorySource.java @@ -61,7 +61,7 @@ public enum Type { UNTRACKED_INTERACTION_UI(100), NON_IMPLEMENTED_TODO(99999); - private static final Int2ObjectMap BY_ID = new Int2ObjectOpenHashMap<>(6); + private static final Int2ObjectMap BY_ID = new Int2ObjectOpenHashMap<>(values().length); static { for (Type type : values()) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/transaction/ItemUseTransaction.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/transaction/ItemUseTransaction.java index 244af1a..6fe6beb 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/transaction/ItemUseTransaction.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/transaction/ItemUseTransaction.java @@ -15,7 +15,7 @@ public class ItemUseTransaction { private final List legacySlots = new ObjectArrayList<>(); private boolean usingNetIds; private final List actions = new ObjectArrayList<>(); - private int actionType; + private int actionType; // Interact|Attack|ItemInteract private Vector3i blockPosition; private int blockFace; private int hotbarSlot; @@ -31,6 +31,10 @@ public class ItemUseTransaction { * @since v712 */ private TriggerType triggerType; + /** + * @since v944 + */ + private int clientCooldownState; public enum PredictedResult { FAILURE, diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/skin/ImageData.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/skin/ImageData.java index 1836fd4..f9b3c56 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/skin/ImageData.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/skin/ImageData.java @@ -21,7 +21,7 @@ public class ImageData { public static final int SKIN_128_64_SIZE = 128 * 64 * PIXEL_SIZE; public static final int SKIN_128_128_SIZE = 128 * 128 * PIXEL_SIZE; public static final int SKIN_PERSONA_SIZE = 256 * 256 * PIXEL_SIZE; - public static final int ANIMATION_SIZE = 1024 * 1024; // 1 MB + public static final int ANIMATION_SIZE = 1024 * 1024 * PIXEL_SIZE; // 4 MB private final int width; private final int height; diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddBehaviorTreePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddBehaviorTreePacket.java index 510c4b0..2a11aee 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddBehaviorTreePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddBehaviorTreePacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class AddBehaviorTreePacket implements BedrockPacket { - public String behaviorTreeJson; + private String behaviorTreeJson; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddEntityPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddEntityPacket.java index 407d698..5c9007c 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddEntityPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddEntityPacket.java @@ -18,28 +18,28 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class AddEntityPacket implements BedrockPacket { - public List attributes = new ObjectArrayList<>(); - public EntityDataMap metadata = new EntityDataMap(); - public List entityLinks = new ObjectArrayList<>(); - public long uniqueEntityId; - public long runtimeEntityId; - public String identifier; - public int entityType; - public Vector3f position; - public Vector3f motion; - public Vector2f rotation; + private List attributes = new ObjectArrayList<>(); + private EntityDataMap metadata = new EntityDataMap(); + private List entityLinks = new ObjectArrayList<>(); + private long uniqueEntityId; + private long runtimeEntityId; + private String identifier; + private int entityType; + private Vector3f position; + private Vector3f motion; + private Vector2f rotation; /** * @since v534 */ - public float headRotation; + private float headRotation; /** * @since v534 */ - public float bodyRotation; + private float bodyRotation; /** * @since v557 */ - public final EntityProperties properties = new EntityProperties(); + private final EntityProperties properties = new EntityProperties(); @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddHangingEntityPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddHangingEntityPacket.java index 1e0fbf0..be168ac 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddHangingEntityPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddHangingEntityPacket.java @@ -10,10 +10,10 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class AddHangingEntityPacket implements BedrockPacket { - public long uniqueEntityId; - public long runtimeEntityId; - public Vector3f position; - public int direction; + private long uniqueEntityId; + private long runtimeEntityId; + private Vector3f position; + private int direction; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddItemEntityPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddItemEntityPacket.java index 34d5794..ea5f472 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddItemEntityPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddItemEntityPacket.java @@ -12,13 +12,13 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class AddItemEntityPacket implements BedrockPacket { - public EntityDataMap metadata = new EntityDataMap(); - public long uniqueEntityId; - public long runtimeEntityId; - public ItemData itemInHand; - public Vector3f position; - public Vector3f motion; - public boolean fromFishing; + private EntityDataMap metadata = new EntityDataMap(); + private long uniqueEntityId; + private long runtimeEntityId; + private ItemData itemInHand; + private Vector3f position; + private Vector3f motion; + private boolean fromFishing; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddPaintingPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddPaintingPacket.java index 9bf19b7..22b4821 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddPaintingPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddPaintingPacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true, callSuper = true) @ToString(doNotUseGetters = true) public class AddPaintingPacket extends AddHangingEntityPacket { - public String motive; + private String motive; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddPlayerPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddPlayerPacket.java index d5ba0f9..1dfa186 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddPlayerPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddPlayerPacket.java @@ -6,6 +6,7 @@ import lombok.ToString; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.AbilityLayer; +import org.cloudburstmc.protocol.bedrock.data.BuildPlatform; import org.cloudburstmc.protocol.bedrock.data.GameType; import org.cloudburstmc.protocol.bedrock.data.PlayerAbilityHolder; import org.cloudburstmc.protocol.bedrock.data.PlayerPermission; @@ -23,30 +24,30 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class AddPlayerPacket implements BedrockPacket, PlayerAbilityHolder { - public EntityDataMap metadata = new EntityDataMap(); - public List entityLinks = new ObjectArrayList<>(); - public UUID uuid; - public String username; - public long uniqueEntityId; - public long runtimeEntityId; - public String platformChatId; - public Vector3f position; - public Vector3f motion; - public Vector3f rotation; - public ItemData hand; - public AdventureSettingsPacket adventureSettings = new AdventureSettingsPacket(); - public String deviceId; - public int buildPlatform; - public GameType gameType; + private EntityDataMap metadata = new EntityDataMap(); + private List entityLinks = new ObjectArrayList<>(); + private UUID uuid; + private String username; + private long uniqueEntityId; + private long runtimeEntityId; + private String platformChatId; + private Vector3f position; + private Vector3f motion; + private Vector3f rotation; + private ItemData hand; + private AdventureSettingsPacket adventureSettings = new AdventureSettingsPacket(); + private String deviceId; + private BuildPlatform buildPlatform = BuildPlatform.UNKNOWN; + private GameType gameType; /** * @since v534 */ - public List abilityLayers = new ObjectArrayList<>(); + private List abilityLayers = new ObjectArrayList<>(); /** * @since v557 */ - public final EntityProperties properties = new EntityProperties(); + private final EntityProperties properties = new EntityProperties(); public void setUniqueEntityId(long uniqueEntityId) { this.uniqueEntityId = uniqueEntityId; diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddVolumeEntityPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddVolumeEntityPacket.java index 288f48b..4879678 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddVolumeEntityPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AddVolumeEntityPacket.java @@ -9,33 +9,33 @@ @Data @EqualsAndHashCode(doNotUseGetters = true, callSuper = false) public class AddVolumeEntityPacket implements BedrockPacket { - public int id; - public NbtMap data; + private int id; + private NbtMap data; /** * @since v465 */ - public String engineVersion; + private String engineVersion; /** * @since v485 */ - public String identifier; + private String identifier; /** * @since v485 */ - public String instanceName; + private String instanceName; /** * @since v503 */ - public Vector3i minBounds; + private Vector3i minBounds; /** * @since v503 */ - public Vector3i maxBounds; + private Vector3i maxBounds; /** * @since v503 */ - public int dimension; + private int dimension; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AdventureSettingsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AdventureSettingsPacket.java index e3bda04..2bf340f 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AdventureSettingsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AdventureSettingsPacket.java @@ -19,10 +19,10 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class AdventureSettingsPacket implements BedrockPacket { - public final Set settings = EnumSet.noneOf(AdventureSetting.class); - public CommandPermission commandPermission = CommandPermission.ANY; - public PlayerPermission playerPermission = PlayerPermission.VISITOR; - public long uniqueEntityId; + private final Set settings = EnumSet.noneOf(AdventureSetting.class); + private CommandPermission commandPermission = CommandPermission.ANY; + private PlayerPermission playerPermission = PlayerPermission.VISITOR; + private long uniqueEntityId; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AgentActionEventPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AgentActionEventPacket.java index ee7a6d9..48fb017 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AgentActionEventPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AgentActionEventPacket.java @@ -13,12 +13,12 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class AgentActionEventPacket implements BedrockPacket { - public String requestId; - public AgentActionType actionType; + private String requestId; + private AgentActionType actionType; /** * @see AgentActionType for type specific JSON */ - public String responseJson; + private String responseJson; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AgentAnimationPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AgentAnimationPacket.java index cefe82d..b15a8f0 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AgentAnimationPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AgentAnimationPacket.java @@ -9,8 +9,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class AgentAnimationPacket implements BedrockPacket { - public byte animation; - public long runtimeEntityId; + private byte animation; + private long runtimeEntityId; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AnimateEntityPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AnimateEntityPacket.java index 8e15fdd..0c19bd9 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AnimateEntityPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AnimateEntityPacket.java @@ -21,7 +21,7 @@ public class AnimateEntityPacket implements BedrockPacket { * @param animation entity animation * @return entity animation */ - public String animation; + private String animation; /** * The entity state to move to when the animation has finished playing. @@ -29,7 +29,7 @@ public class AnimateEntityPacket implements BedrockPacket { * @param nextState state after animation has finished * @return state after animation has finished */ - public String nextState; + private String nextState; /** * Expression to check if the animation needs to stop. @@ -37,7 +37,7 @@ public class AnimateEntityPacket implements BedrockPacket { * @param stopExpression molang expression (???) * @return molang expression (???) */ - public String stopExpression; + private String stopExpression; /** * The molang stop expression version @@ -47,7 +47,7 @@ public class AnimateEntityPacket implements BedrockPacket { * * @since v465 */ - public int stopExpressionVersion; + private int stopExpressionVersion; /** @@ -56,7 +56,7 @@ public class AnimateEntityPacket implements BedrockPacket { * @param controller controller name * @return controller name */ - public String controller; + private String controller; /** * Time taken to blend out of the specified animation. @@ -64,7 +64,7 @@ public class AnimateEntityPacket implements BedrockPacket { * @param blendOutTime time * @return time */ - public float blendOutTime; + private float blendOutTime; /** * Entity runtime IDs to run the animation on when sent to the client. @@ -72,7 +72,7 @@ public class AnimateEntityPacket implements BedrockPacket { * @param runtimeEntityIds runtime entity IDs list * @return runtime entity IDs list */ - public final LongList runtimeEntityIds = new LongArrayList(); + private final LongList runtimeEntityIds = new LongArrayList(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AnimatePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AnimatePacket.java index 58f2599..fd1153f 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AnimatePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AnimatePacket.java @@ -13,19 +13,19 @@ @ToString(doNotUseGetters = true) public class AnimatePacket implements BedrockPacket { /** - * @deprecated since v898 + * @deprecated since v897 */ - public float rowingTime; - public Action action; - public long runtimeEntityId; + private float rowingTime; + private Action action; + private long runtimeEntityId; /** * @since v859 */ - public float data; + private float data; /** - * @since v898 + * @since v897 */ - public SwingSource swingSource = SwingSource.NONE; + private SwingSource swingSource = SwingSource.NONE; @Override public final PacketSignal handle(BedrockPacketHandler handler) { @@ -63,7 +63,7 @@ public enum SwingSource { DROP_ITEM("dropitem"), EVENT("event"); - public static final HashMap BY_NAME = new HashMap<>(); + private static final HashMap BY_NAME = new HashMap<>(values().length); static { for (SwingSource value : values()) { @@ -72,7 +72,7 @@ public enum SwingSource { } @Getter - public final String name; + private final String name; SwingSource(String name) { this.name = name; diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AnvilDamagePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AnvilDamagePacket.java index 1490b27..9325546 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AnvilDamagePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AnvilDamagePacket.java @@ -10,8 +10,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class AnvilDamagePacket implements BedrockPacket { - public int damage; - public Vector3i position; + private int damage; + private Vector3i position; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AutomationClientConnectPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AutomationClientConnectPacket.java index 727b42b..d06a770 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AutomationClientConnectPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AutomationClientConnectPacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class AutomationClientConnectPacket implements BedrockPacket { - public String address; + private String address; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AvailableCommandsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AvailableCommandsPacket.java index be467d7..1f1e00e 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AvailableCommandsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AvailableCommandsPacket.java @@ -13,7 +13,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class AvailableCommandsPacket implements BedrockPacket { - public final List commands = new ObjectArrayList<>(); + private final List commands = new ObjectArrayList<>(); @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AvailableEntityIdentifiersPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AvailableEntityIdentifiersPacket.java index 59ca7bd..49d50bf 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AvailableEntityIdentifiersPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AvailableEntityIdentifiersPacket.java @@ -10,7 +10,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class AvailableEntityIdentifiersPacket implements BedrockPacket { - public NbtMap identifiers; + private NbtMap identifiers; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AwardAchievementPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AwardAchievementPacket.java index 192d153..376f63d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AwardAchievementPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/AwardAchievementPacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class AwardAchievementPacket implements BedrockPacket { - public int achievementId; + private int achievementId; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BedrockPacketHandler.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BedrockPacketHandler.java index c880779..1bbad9b 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BedrockPacketHandler.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BedrockPacketHandler.java @@ -927,4 +927,80 @@ default PacketSignal handle(ServerPlayerPostMovePositionPacket packet) { default PacketSignal handle(ServerboundDataStorePacket packet) { return PacketSignal.UNHANDLED; } + + default PacketSignal handle(ClientboundDataStorePacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(CameraAimAssistActorPriorityPacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(CameraSplinePacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(ClientboundDataDrivenUICloseScreenPacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(ClientboundDataDrivenUIReloadPacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(ClientboundDataDrivenUIShowScreenPacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(ClientboundTextureShiftPacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(VoxelShapesPacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(ResourcePacksReadyForValidationPacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(LocatorBarPacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(PartyChangedPacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(ServerboundDataDrivenScreenClosedPacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(SyncWorldClocksPacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(ClientboundAttributeLayerSyncPacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(ServerStoreInfoPacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(ServerPresenceInfoPacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(ClientboundUpdateSoundDataPacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(SendPartyDestinationCookiePacket packet) { + return PacketSignal.UNHANDLED; + } + + default PacketSignal handle(PartyDestinationCookieResponsePacket packet) { + return PacketSignal.UNHANDLED; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BedrockPacketType.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BedrockPacketType.java index 06a2f38..c7cd22b 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BedrockPacketType.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BedrockPacketType.java @@ -1,234 +1,267 @@ package org.cloudburstmc.protocol.bedrock.packet; -public enum BedrockPacketType { - ADD_BEHAVIOR_TREE, - ADD_ENTITY, - ADD_HANGING_ENTITY, - ADD_ITEM_ENTITY, - ADD_PAINTING, - ADD_PLAYER, - ADD_VOLUME_ENTITY, - ADVENTURE_SETTINGS, - AGENT_ACTION_EVENT, - ANIMATE, - ANIMATE_ENTITY, - ANVIL_DAMAGE, - AUTOMATION_CLIENT_CONNECT, - AVAILABLE_COMMANDS, - AVAILABLE_ENTITY_IDENTIFIERS, - BIOME_DEFINITIONS_LIST, - BLOCK_ENTITY_DATA, - BLOCK_EVENT, - BLOCK_PICK_REQUEST, - BOOK_EDIT, - BOSS_EVENT, - CAMERA, - CAMERA_SHAKE, - CHANGE_DIMENSION, - CHANGE_MOB_PROPERTY, - CHUNK_RADIUS_UPDATED, - CLIENTBOUND_DEBUG_RENDERER, - CLIENTBOUND_MAP_ITEM_DATA, - CLIENT_CACHE_BLOB_STATUS, - CLIENT_CACHE_MISS_RESPONSE, - CLIENT_CACHE_STATUS, - CLIENT_CHEAT_ABILITY, - CLIENT_TO_SERVER_HANDSHAKE, - CODE_BUILDER, - CODE_BUILDER_SOURCE, - COMMAND_BLOCK_UPDATE, - COMMAND_OUTPUT, - COMMAND_REQUEST, - COMPLETED_USING_ITEM, - CONTAINER_CLOSE, - CONTAINER_OPEN, - CONTAINER_SET_DATA, - CORRECT_PLAYER_MOVE_PREDICTION, - CRAFTING_DATA, - CRAFTING_EVENT, - CREATE_PHOTO, - CREATIVE_CONTENT, - DEATH_INFO, - DEBUG_INFO, - DIMENSION_DATA, - DISCONNECT, - EDITOR_NETWORK, - EDUCATION_SETTINGS, - EDU_URI_RESOURCE, - EMOTE, - EMOTE_LIST, - ENTITY_EVENT, - ENTITY_FALL, - ENTITY_PICK_REQUEST, - EVENT, - EXPLODE, - FEATURE_REGISTRY, - FILTER_TEXT, - GAME_RULES_CHANGED, - GAME_TEST_REQUEST, - GAME_TEST_RESULTS, - GUI_DATA_PICK_ITEM, - HURT_ARMOR, - INTERACT, - INVENTORY_CONTENT, - INVENTORY_SLOT, - INVENTORY_TRANSACTION, - ITEM_COMPONENT, - ITEM_FRAME_DROP_ITEM, - ITEM_STACK_REQUEST, - ITEM_STACK_RESPONSE, - LAB_TABLE, - LECTERN_UPDATE, - LESSON_PROGRESS, - LEVEL_CHUNK, - LEVEL_EVENT_GENERIC, - LEVEL_EVENT, - LEVEL_SOUND_EVENT, - LEVEL_SOUND_EVENT_1, - LEVEL_SOUND_EVENT_2, - LOGIN, - MAP_CREATE_LOCKED_COPY, - MAP_INFO_REQUEST, - MOB_ARMOR_EQUIPMENT, - MOB_EFFECT, - MOB_EQUIPMENT, - MODAL_FORM_REQUEST, - MODAL_FORM_RESPONSE, - MOVE_ENTITY_ABSOLUTE, - MOVE_ENTITY_DELTA, - MOVE_PLAYER, - MULTIPLAYER_SETTINGS, - NETWORK_CHUNK_PUBLISHER_UPDATE, - NETWORK_SETTINGS, - NETWORK_STACK_LATENCY, - NPC_DIALOGUE, - NPC_REQUEST, - ON_SCREEN_TEXTURE_ANIMATION, - PACKET_VIOLATION_WARNING, - PHOTO_INFO_REQUEST, - PHOTO_TRANSFER, - PLAYER_ACTION, - PLAYER_ARMOR_DAMAGE, - PLAYER_AUTH_INPUT, - PLAYER_ENCHANT_OPTIONS, - PLAYER_FOG, - PLAYER_HOTBAR, - PLAYER_INPUT, - PLAYER_LIST, - PLAYER_SKIN, - PLAYER_START_ITEM_COOLDOWN, - PLAY_SOUND, - PLAY_STATUS, - PURCHASE_RECEIPT, - POSITION_TRACKING_DB_SERVER_BROADCAST, - POSITION_TRACKING_DB_CLIENT_REQUEST, - REMOVE_ENTITY, - REMOVE_OBJECTIVE, - REMOVE_VOLUME_ENTITY, - REQUEST_ABILITY, - REQUEST_CHUNK_RADIUS, - REQUEST_NETWORK_SETTINGS, - REQUEST_PERMISSIONS, - RESOURCE_PACK_CHUNK_DATA, - RESOURCE_PACK_CHUNK_REQUEST, - RESOURCE_PACK_CLIENT_RESPONSE, - RESOURCE_PACK_DATA_INFO, - RESOURCE_PACKS_INFO, - RESOURCE_PACK_STACK, - RESPAWN, - RIDER_JUMP, - SCRIPT_CUSTOM_EVENT, - SCRIPT_MESSAGE, - SERVER_SETTINGS_REQUEST, - SERVER_SETTINGS_RESPONSE, - SERVER_STATS, - SERVER_TO_CLIENT_HANDSHAKE, - SET_COMMANDS_ENABLED, - SET_DEFAULT_GAME_TYPE, - SET_DIFFICULTY, - SET_DISPLAY_OBJECTIVE, - SET_ENTITY_DATA, - SET_ENTITY_LINK, - SET_ENTITY_MOTION, - SET_ENTITY_MOTION_PLUS, - SET_HEALTH, - SET_LAST_HURT_BY, - SET_LOCAL_PLAYER_AS_INITIALIZED, - SET_PLAYER_GAME_TYPE, - SET_SCOREBOARD_IDENTITY, - SET_SCORE, - SET_SPAWN_POSITION, - SET_TIME, - SETTINGS_COMMAND, - SET_TITLE, - SHOW_CREDITS, - SHOW_PROFILE, - SHOW_STORE_OFFER, - SIMPLE_EVENT, - SIMULATION_TYPE, - SPAWN_EXPERIENCE_ORB, - SPAWN_PARTICLE_EFFECT, - START_GAME, - STOP_SOUND, - STRUCTURE_BLOCK_UPDATE, - STRUCTURE_TEMPLATE_DATA_EXPORT_REQUEST, - STRUCTURE_TEMPLATE_DATA_EXPORT_RESPONSE, - SUB_CHUNK, - SUB_CHUNK_REQUEST, - SUB_CLIENT_LOGIN, - SYNC_ENTITY_PROPERTY, - TAKE_ITEM_ENTITY, - TEXT, - TICK_SYNC, - TICKING_AREAS_LOAD_STATUS, - TOAST_REQUEST, - TRANSFER, - UNKNOWN, - UPDATE_ABILITIES, - UPDATE_ADVENTURE_SETTINGS, - UPDATE_ATTRIBUTES, - UPDATE_BLOCK, - UPDATE_BLOCK_PROPERTIES, - UPDATE_BLOCK_SYNCED, - UPDATE_EQUIP, - UPDATE_PLAYER_GAME_TYPE, - UPDATE_SOFT_ENUM, - UPDATE_SUB_CHUNK_BLOCKS, - UPDATE_TRADE, - VIDEO_STREAM_CONNECT, - UPDATE_CLIENT_INPUT_LOCKS, - CAMERA_PRESETS, - UNLOCKED_RECIPES, - CAMERA_INSTRUCTION, - COMPRESSED_BIOME_DEFINITIONS_LIST, - TRIM_DATA, - OPEN_SIGN, - AGENT_ANIMATION, - REFRESH_ENTITLEMENTS, - TOGGLE_CRAFTER_SLOT_REQUEST, - SET_PLAYER_INVENTORY_OPTIONS, - SET_HUD, - AWARD_ACHIEVEMENT, - CLIENTBOUND_CLOSE_FORM, - SERVERBOUND_LOADING_SCREEN, - JIGSAW_STRUCTURE_DATA, - CURRENT_STRUCTURE_FEATURE, - SERVERBOUND_DIAGNOSTICS, - CAMERA_AIM_ASSIST, - CONTAINER_REGISTRY_CLEANUP, - MOVEMENT_EFFECT, - SET_MOVEMENT_AUTHORITY, - CAMERA_AIM_ASSIST_PRESETS, - CAMERA_AIM_ASSIST_INSTRUCTION, - MOVEMENT_PREDICTION_SYNC, - UPDATE_CLIENT_OPTIONS, - PLAYER_VIDEO_CAPTURE, - PLAYER_UPDATE_ENTITY_OVERRIDES, - PLAYER_LOCATION, - CLIENTBOUND_CONTROL_SCHEME_SET, - DEBUG_DRAWER, - SERVERBOUND_PACK_SETTING_CHANGE, - GRAPHICS_PARAMETER_OVERRIDE_PACKET, - SERVER_PLAYER_POST_MOVE_POSITION, - SERVERBOUND_DATA_STORE +import lombok.Getter; + +public class BedrockPacketType { + public static final BedrockPacketType ADD_BEHAVIOR_TREE = new BedrockPacketType("ADD_BEHAVIOR_TREE"); + public static final BedrockPacketType ADD_ENTITY = new BedrockPacketType("ADD_ENTITY"); + public static final BedrockPacketType ADD_HANGING_ENTITY = new BedrockPacketType("ADD_HANGING_ENTITY"); + public static final BedrockPacketType ADD_ITEM_ENTITY = new BedrockPacketType("ADD_ITEM_ENTITY"); + public static final BedrockPacketType ADD_PAINTING = new BedrockPacketType("ADD_PAINTING"); + public static final BedrockPacketType ADD_PLAYER = new BedrockPacketType("ADD_PLAYER"); + public static final BedrockPacketType ADD_VOLUME_ENTITY = new BedrockPacketType("ADD_VOLUME_ENTITY"); + public static final BedrockPacketType ADVENTURE_SETTINGS = new BedrockPacketType("ADVENTURE_SETTINGS"); + public static final BedrockPacketType AGENT_ACTION_EVENT = new BedrockPacketType("AGENT_ACTION_EVENT"); + public static final BedrockPacketType ANIMATE = new BedrockPacketType("ANIMATE"); + public static final BedrockPacketType ANIMATE_ENTITY = new BedrockPacketType("ANIMATE_ENTITY"); + public static final BedrockPacketType ANVIL_DAMAGE = new BedrockPacketType("ANVIL_DAMAGE"); + public static final BedrockPacketType AUTOMATION_CLIENT_CONNECT = new BedrockPacketType("AUTOMATION_CLIENT_CONNECT"); + public static final BedrockPacketType AVAILABLE_COMMANDS = new BedrockPacketType("AVAILABLE_COMMANDS"); + public static final BedrockPacketType AVAILABLE_ENTITY_IDENTIFIERS = new BedrockPacketType("AVAILABLE_ENTITY_IDENTIFIERS"); + public static final BedrockPacketType BIOME_DEFINITIONS_LIST = new BedrockPacketType("BIOME_DEFINITIONS_LIST"); + public static final BedrockPacketType BLOCK_ENTITY_DATA = new BedrockPacketType("BLOCK_ENTITY_DATA"); + public static final BedrockPacketType BLOCK_EVENT = new BedrockPacketType("BLOCK_EVENT"); + public static final BedrockPacketType BLOCK_PICK_REQUEST = new BedrockPacketType("BLOCK_PICK_REQUEST"); + public static final BedrockPacketType BOOK_EDIT = new BedrockPacketType("BOOK_EDIT"); + public static final BedrockPacketType BOSS_EVENT = new BedrockPacketType("BOSS_EVENT"); + public static final BedrockPacketType CAMERA = new BedrockPacketType("CAMERA"); + public static final BedrockPacketType CAMERA_SHAKE = new BedrockPacketType("CAMERA_SHAKE"); + public static final BedrockPacketType CHANGE_DIMENSION = new BedrockPacketType("CHANGE_DIMENSION"); + public static final BedrockPacketType CHANGE_MOB_PROPERTY = new BedrockPacketType("CHANGE_MOB_PROPERTY"); + public static final BedrockPacketType CHUNK_RADIUS_UPDATED = new BedrockPacketType("CHUNK_RADIUS_UPDATED"); + public static final BedrockPacketType CLIENTBOUND_DEBUG_RENDERER = new BedrockPacketType("CLIENTBOUND_DEBUG_RENDERER"); + public static final BedrockPacketType CLIENTBOUND_MAP_ITEM_DATA = new BedrockPacketType("CLIENTBOUND_MAP_ITEM_DATA"); + public static final BedrockPacketType CLIENT_CACHE_BLOB_STATUS = new BedrockPacketType("CLIENT_CACHE_BLOB_STATUS"); + public static final BedrockPacketType CLIENT_CACHE_MISS_RESPONSE = new BedrockPacketType("CLIENT_CACHE_MISS_RESPONSE"); + public static final BedrockPacketType CLIENT_CACHE_STATUS = new BedrockPacketType("CLIENT_CACHE_STATUS"); + public static final BedrockPacketType CLIENT_CHEAT_ABILITY = new BedrockPacketType("CLIENT_CHEAT_ABILITY"); + public static final BedrockPacketType CLIENT_TO_SERVER_HANDSHAKE = new BedrockPacketType("CLIENT_TO_SERVER_HANDSHAKE"); + public static final BedrockPacketType CODE_BUILDER = new BedrockPacketType("CODE_BUILDER"); + public static final BedrockPacketType CODE_BUILDER_SOURCE = new BedrockPacketType("CODE_BUILDER_SOURCE"); + public static final BedrockPacketType COMMAND_BLOCK_UPDATE = new BedrockPacketType("COMMAND_BLOCK_UPDATE"); + public static final BedrockPacketType COMMAND_OUTPUT = new BedrockPacketType("COMMAND_OUTPUT"); + public static final BedrockPacketType COMMAND_REQUEST = new BedrockPacketType("COMMAND_REQUEST"); + public static final BedrockPacketType COMPLETED_USING_ITEM = new BedrockPacketType("COMPLETED_USING_ITEM"); + public static final BedrockPacketType CONTAINER_CLOSE = new BedrockPacketType("CONTAINER_CLOSE"); + public static final BedrockPacketType CONTAINER_OPEN = new BedrockPacketType("CONTAINER_OPEN"); + public static final BedrockPacketType CONTAINER_SET_DATA = new BedrockPacketType("CONTAINER_SET_DATA"); + public static final BedrockPacketType CORRECT_PLAYER_MOVE_PREDICTION = new BedrockPacketType("CORRECT_PLAYER_MOVE_PREDICTION"); + public static final BedrockPacketType CRAFTING_DATA = new BedrockPacketType("CRAFTING_DATA"); + public static final BedrockPacketType CRAFTING_EVENT = new BedrockPacketType("CRAFTING_EVENT"); + public static final BedrockPacketType CREATE_PHOTO = new BedrockPacketType("CREATE_PHOTO"); + public static final BedrockPacketType CREATIVE_CONTENT = new BedrockPacketType("CREATIVE_CONTENT"); + public static final BedrockPacketType DEATH_INFO = new BedrockPacketType("DEATH_INFO"); + public static final BedrockPacketType DEBUG_INFO = new BedrockPacketType("DEBUG_INFO"); + public static final BedrockPacketType DIMENSION_DATA = new BedrockPacketType("DIMENSION_DATA"); + public static final BedrockPacketType DISCONNECT = new BedrockPacketType("DISCONNECT"); + public static final BedrockPacketType EDITOR_NETWORK = new BedrockPacketType("EDITOR_NETWORK"); + public static final BedrockPacketType EDUCATION_SETTINGS = new BedrockPacketType("EDUCATION_SETTINGS"); + public static final BedrockPacketType EDU_URI_RESOURCE = new BedrockPacketType("EDU_URI_RESOURCE"); + public static final BedrockPacketType EMOTE = new BedrockPacketType("EMOTE"); + public static final BedrockPacketType EMOTE_LIST = new BedrockPacketType("EMOTE_LIST"); + public static final BedrockPacketType ENTITY_EVENT = new BedrockPacketType("ENTITY_EVENT"); + public static final BedrockPacketType ENTITY_FALL = new BedrockPacketType("ENTITY_FALL"); + public static final BedrockPacketType ENTITY_PICK_REQUEST = new BedrockPacketType("ENTITY_PICK_REQUEST"); + public static final BedrockPacketType EVENT = new BedrockPacketType("EVENT"); + public static final BedrockPacketType EXPLODE = new BedrockPacketType("EXPLODE"); + public static final BedrockPacketType FEATURE_REGISTRY = new BedrockPacketType("FEATURE_REGISTRY"); + public static final BedrockPacketType FILTER_TEXT = new BedrockPacketType("FILTER_TEXT"); + public static final BedrockPacketType GAME_RULES_CHANGED = new BedrockPacketType("GAME_RULES_CHANGED"); + public static final BedrockPacketType GAME_TEST_REQUEST = new BedrockPacketType("GAME_TEST_REQUEST"); + public static final BedrockPacketType GAME_TEST_RESULTS = new BedrockPacketType("GAME_TEST_RESULTS"); + public static final BedrockPacketType GUI_DATA_PICK_ITEM = new BedrockPacketType("GUI_DATA_PICK_ITEM"); + public static final BedrockPacketType HURT_ARMOR = new BedrockPacketType("HURT_ARMOR"); + public static final BedrockPacketType INTERACT = new BedrockPacketType("INTERACT"); + public static final BedrockPacketType INVENTORY_CONTENT = new BedrockPacketType("INVENTORY_CONTENT"); + public static final BedrockPacketType INVENTORY_SLOT = new BedrockPacketType("INVENTORY_SLOT"); + public static final BedrockPacketType INVENTORY_TRANSACTION = new BedrockPacketType("INVENTORY_TRANSACTION"); + public static final BedrockPacketType ITEM_COMPONENT = new BedrockPacketType("ITEM_COMPONENT"); + public static final BedrockPacketType ITEM_FRAME_DROP_ITEM = new BedrockPacketType("ITEM_FRAME_DROP_ITEM"); + public static final BedrockPacketType ITEM_STACK_REQUEST = new BedrockPacketType("ITEM_STACK_REQUEST"); + public static final BedrockPacketType ITEM_STACK_RESPONSE = new BedrockPacketType("ITEM_STACK_RESPONSE"); + public static final BedrockPacketType LAB_TABLE = new BedrockPacketType("LAB_TABLE"); + public static final BedrockPacketType LECTERN_UPDATE = new BedrockPacketType("LECTERN_UPDATE"); + public static final BedrockPacketType LESSON_PROGRESS = new BedrockPacketType("LESSON_PROGRESS"); + public static final BedrockPacketType LEVEL_CHUNK = new BedrockPacketType("LEVEL_CHUNK"); + public static final BedrockPacketType LEVEL_EVENT_GENERIC = new BedrockPacketType("LEVEL_EVENT_GENERIC"); + public static final BedrockPacketType LEVEL_EVENT = new BedrockPacketType("LEVEL_EVENT"); + public static final BedrockPacketType LEVEL_SOUND_EVENT = new BedrockPacketType("LEVEL_SOUND_EVENT"); + public static final BedrockPacketType LEVEL_SOUND_EVENT_1 = new BedrockPacketType("LEVEL_SOUND_EVENT_1"); + public static final BedrockPacketType LEVEL_SOUND_EVENT_2 = new BedrockPacketType("LEVEL_SOUND_EVENT_2"); + public static final BedrockPacketType LOGIN = new BedrockPacketType("LOGIN"); + public static final BedrockPacketType MAP_CREATE_LOCKED_COPY = new BedrockPacketType("MAP_CREATE_LOCKED_COPY"); + public static final BedrockPacketType MAP_INFO_REQUEST = new BedrockPacketType("MAP_INFO_REQUEST"); + public static final BedrockPacketType MOB_ARMOR_EQUIPMENT = new BedrockPacketType("MOB_ARMOR_EQUIPMENT"); + public static final BedrockPacketType MOB_EFFECT = new BedrockPacketType("MOB_EFFECT"); + public static final BedrockPacketType MOB_EQUIPMENT = new BedrockPacketType("MOB_EQUIPMENT"); + public static final BedrockPacketType MODAL_FORM_REQUEST = new BedrockPacketType("MODAL_FORM_REQUEST"); + public static final BedrockPacketType MODAL_FORM_RESPONSE = new BedrockPacketType("MODAL_FORM_RESPONSE"); + public static final BedrockPacketType MOVE_ENTITY_ABSOLUTE = new BedrockPacketType("MOVE_ENTITY_ABSOLUTE"); + public static final BedrockPacketType MOVE_ENTITY_DELTA = new BedrockPacketType("MOVE_ENTITY_DELTA"); + public static final BedrockPacketType MOVE_PLAYER = new BedrockPacketType("MOVE_PLAYER"); + public static final BedrockPacketType MULTIPLAYER_SETTINGS = new BedrockPacketType("MULTIPLAYER_SETTINGS"); + public static final BedrockPacketType NETWORK_CHUNK_PUBLISHER_UPDATE = new BedrockPacketType("NETWORK_CHUNK_PUBLISHER_UPDATE"); + public static final BedrockPacketType NETWORK_SETTINGS = new BedrockPacketType("NETWORK_SETTINGS"); + public static final BedrockPacketType NETWORK_STACK_LATENCY = new BedrockPacketType("NETWORK_STACK_LATENCY"); + public static final BedrockPacketType NPC_DIALOGUE = new BedrockPacketType("NPC_DIALOGUE"); + public static final BedrockPacketType NPC_REQUEST = new BedrockPacketType("NPC_REQUEST"); + public static final BedrockPacketType ON_SCREEN_TEXTURE_ANIMATION = new BedrockPacketType("ON_SCREEN_TEXTURE_ANIMATION"); + public static final BedrockPacketType PACKET_VIOLATION_WARNING = new BedrockPacketType("PACKET_VIOLATION_WARNING"); + public static final BedrockPacketType PHOTO_INFO_REQUEST = new BedrockPacketType("PHOTO_INFO_REQUEST"); + public static final BedrockPacketType PHOTO_TRANSFER = new BedrockPacketType("PHOTO_TRANSFER"); + public static final BedrockPacketType PLAYER_ACTION = new BedrockPacketType("PLAYER_ACTION"); + public static final BedrockPacketType PLAYER_ARMOR_DAMAGE = new BedrockPacketType("PLAYER_ARMOR_DAMAGE"); + public static final BedrockPacketType PLAYER_AUTH_INPUT = new BedrockPacketType("PLAYER_AUTH_INPUT"); + public static final BedrockPacketType PLAYER_ENCHANT_OPTIONS = new BedrockPacketType("PLAYER_ENCHANT_OPTIONS"); + public static final BedrockPacketType PLAYER_FOG = new BedrockPacketType("PLAYER_FOG"); + public static final BedrockPacketType PLAYER_HOTBAR = new BedrockPacketType("PLAYER_HOTBAR"); + public static final BedrockPacketType PLAYER_INPUT = new BedrockPacketType("PLAYER_INPUT"); + public static final BedrockPacketType PLAYER_LIST = new BedrockPacketType("PLAYER_LIST"); + public static final BedrockPacketType PLAYER_SKIN = new BedrockPacketType("PLAYER_SKIN"); + public static final BedrockPacketType PLAYER_START_ITEM_COOLDOWN = new BedrockPacketType("PLAYER_START_ITEM_COOLDOWN"); + public static final BedrockPacketType PLAY_SOUND = new BedrockPacketType("PLAY_SOUND"); + public static final BedrockPacketType PLAY_STATUS = new BedrockPacketType("PLAY_STATUS"); + public static final BedrockPacketType PURCHASE_RECEIPT = new BedrockPacketType("PURCHASE_RECEIPT"); + public static final BedrockPacketType POSITION_TRACKING_DB_SERVER_BROADCAST = new BedrockPacketType("POSITION_TRACKING_DB_SERVER_BROADCAST"); + public static final BedrockPacketType POSITION_TRACKING_DB_CLIENT_REQUEST = new BedrockPacketType("POSITION_TRACKING_DB_CLIENT_REQUEST"); + public static final BedrockPacketType REMOVE_ENTITY = new BedrockPacketType("REMOVE_ENTITY"); + public static final BedrockPacketType REMOVE_OBJECTIVE = new BedrockPacketType("REMOVE_OBJECTIVE"); + public static final BedrockPacketType REMOVE_VOLUME_ENTITY = new BedrockPacketType("REMOVE_VOLUME_ENTITY"); + public static final BedrockPacketType REQUEST_ABILITY = new BedrockPacketType("REQUEST_ABILITY"); + public static final BedrockPacketType REQUEST_CHUNK_RADIUS = new BedrockPacketType("REQUEST_CHUNK_RADIUS"); + public static final BedrockPacketType REQUEST_NETWORK_SETTINGS = new BedrockPacketType("REQUEST_NETWORK_SETTINGS"); + public static final BedrockPacketType REQUEST_PERMISSIONS = new BedrockPacketType("REQUEST_PERMISSIONS"); + public static final BedrockPacketType RESOURCE_PACK_CHUNK_DATA = new BedrockPacketType("RESOURCE_PACK_CHUNK_DATA"); + public static final BedrockPacketType RESOURCE_PACK_CHUNK_REQUEST = new BedrockPacketType("RESOURCE_PACK_CHUNK_REQUEST"); + public static final BedrockPacketType RESOURCE_PACK_CLIENT_RESPONSE = new BedrockPacketType("RESOURCE_PACK_CLIENT_RESPONSE"); + public static final BedrockPacketType RESOURCE_PACK_DATA_INFO = new BedrockPacketType("RESOURCE_PACK_DATA_INFO"); + public static final BedrockPacketType RESOURCE_PACKS_INFO = new BedrockPacketType("RESOURCE_PACKS_INFO"); + public static final BedrockPacketType RESOURCE_PACK_STACK = new BedrockPacketType("RESOURCE_PACK_STACK"); + public static final BedrockPacketType RESPAWN = new BedrockPacketType("RESPAWN"); + public static final BedrockPacketType RIDER_JUMP = new BedrockPacketType("RIDER_JUMP"); + public static final BedrockPacketType SCRIPT_CUSTOM_EVENT = new BedrockPacketType("SCRIPT_CUSTOM_EVENT"); + public static final BedrockPacketType SCRIPT_MESSAGE = new BedrockPacketType("SCRIPT_MESSAGE"); + public static final BedrockPacketType SERVER_SETTINGS_REQUEST = new BedrockPacketType("SERVER_SETTINGS_REQUEST"); + public static final BedrockPacketType SERVER_SETTINGS_RESPONSE = new BedrockPacketType("SERVER_SETTINGS_RESPONSE"); + public static final BedrockPacketType SERVER_STATS = new BedrockPacketType("SERVER_STATS"); + public static final BedrockPacketType SERVER_TO_CLIENT_HANDSHAKE = new BedrockPacketType("SERVER_TO_CLIENT_HANDSHAKE"); + public static final BedrockPacketType SET_COMMANDS_ENABLED = new BedrockPacketType("SET_COMMANDS_ENABLED"); + public static final BedrockPacketType SET_DEFAULT_GAME_TYPE = new BedrockPacketType("SET_DEFAULT_GAME_TYPE"); + public static final BedrockPacketType SET_DIFFICULTY = new BedrockPacketType("SET_DIFFICULTY"); + public static final BedrockPacketType SET_DISPLAY_OBJECTIVE = new BedrockPacketType("SET_DISPLAY_OBJECTIVE"); + public static final BedrockPacketType SET_ENTITY_DATA = new BedrockPacketType("SET_ENTITY_DATA"); + public static final BedrockPacketType SET_ENTITY_LINK = new BedrockPacketType("SET_ENTITY_LINK"); + public static final BedrockPacketType SET_ENTITY_MOTION = new BedrockPacketType("SET_ENTITY_MOTION"); + public static final BedrockPacketType SET_ENTITY_MOTION_PLUS = new BedrockPacketType("SET_ENTITY_MOTION_PLUS"); + public static final BedrockPacketType SET_HEALTH = new BedrockPacketType("SET_HEALTH"); + public static final BedrockPacketType SET_LAST_HURT_BY = new BedrockPacketType("SET_LAST_HURT_BY"); + public static final BedrockPacketType SET_LOCAL_PLAYER_AS_INITIALIZED = new BedrockPacketType("SET_LOCAL_PLAYER_AS_INITIALIZED"); + public static final BedrockPacketType SET_PLAYER_GAME_TYPE = new BedrockPacketType("SET_PLAYER_GAME_TYPE"); + public static final BedrockPacketType SET_SCOREBOARD_IDENTITY = new BedrockPacketType("SET_SCOREBOARD_IDENTITY"); + public static final BedrockPacketType SET_SCORE = new BedrockPacketType("SET_SCORE"); + public static final BedrockPacketType SET_SPAWN_POSITION = new BedrockPacketType("SET_SPAWN_POSITION"); + public static final BedrockPacketType SET_TIME = new BedrockPacketType("SET_TIME"); + public static final BedrockPacketType SETTINGS_COMMAND = new BedrockPacketType("SETTINGS_COMMAND"); + public static final BedrockPacketType SET_TITLE = new BedrockPacketType("SET_TITLE"); + public static final BedrockPacketType SHOW_CREDITS = new BedrockPacketType("SHOW_CREDITS"); + public static final BedrockPacketType SHOW_PROFILE = new BedrockPacketType("SHOW_PROFILE"); + public static final BedrockPacketType SHOW_STORE_OFFER = new BedrockPacketType("SHOW_STORE_OFFER"); + public static final BedrockPacketType SIMPLE_EVENT = new BedrockPacketType("SIMPLE_EVENT"); + public static final BedrockPacketType SIMULATION_TYPE = new BedrockPacketType("SIMULATION_TYPE"); + public static final BedrockPacketType SPAWN_EXPERIENCE_ORB = new BedrockPacketType("SPAWN_EXPERIENCE_ORB"); + public static final BedrockPacketType SPAWN_PARTICLE_EFFECT = new BedrockPacketType("SPAWN_PARTICLE_EFFECT"); + public static final BedrockPacketType START_GAME = new BedrockPacketType("START_GAME"); + public static final BedrockPacketType STOP_SOUND = new BedrockPacketType("STOP_SOUND"); + public static final BedrockPacketType STRUCTURE_BLOCK_UPDATE = new BedrockPacketType("STRUCTURE_BLOCK_UPDATE"); + public static final BedrockPacketType STRUCTURE_TEMPLATE_DATA_EXPORT_REQUEST = new BedrockPacketType("STRUCTURE_TEMPLATE_DATA_EXPORT_REQUEST"); + public static final BedrockPacketType STRUCTURE_TEMPLATE_DATA_EXPORT_RESPONSE = new BedrockPacketType("STRUCTURE_TEMPLATE_DATA_EXPORT_RESPONSE"); + public static final BedrockPacketType SUB_CHUNK = new BedrockPacketType("SUB_CHUNK"); + public static final BedrockPacketType SUB_CHUNK_REQUEST = new BedrockPacketType("SUB_CHUNK_REQUEST"); + public static final BedrockPacketType SUB_CLIENT_LOGIN = new BedrockPacketType("SUB_CLIENT_LOGIN"); + public static final BedrockPacketType SYNC_ENTITY_PROPERTY = new BedrockPacketType("SYNC_ENTITY_PROPERTY"); + public static final BedrockPacketType TAKE_ITEM_ENTITY = new BedrockPacketType("TAKE_ITEM_ENTITY"); + public static final BedrockPacketType TEXT = new BedrockPacketType("TEXT"); + public static final BedrockPacketType TICK_SYNC = new BedrockPacketType("TICK_SYNC"); + public static final BedrockPacketType TICKING_AREAS_LOAD_STATUS = new BedrockPacketType("TICKING_AREAS_LOAD_STATUS"); + public static final BedrockPacketType TOAST_REQUEST = new BedrockPacketType("TOAST_REQUEST"); + public static final BedrockPacketType TRANSFER = new BedrockPacketType("TRANSFER"); + public static final BedrockPacketType UNKNOWN = new BedrockPacketType("UNKNOWN"); + public static final BedrockPacketType UPDATE_ABILITIES = new BedrockPacketType("UPDATE_ABILITIES"); + public static final BedrockPacketType UPDATE_ADVENTURE_SETTINGS = new BedrockPacketType("UPDATE_ADVENTURE_SETTINGS"); + public static final BedrockPacketType UPDATE_ATTRIBUTES = new BedrockPacketType("UPDATE_ATTRIBUTES"); + public static final BedrockPacketType UPDATE_BLOCK = new BedrockPacketType("UPDATE_BLOCK"); + public static final BedrockPacketType UPDATE_BLOCK_PROPERTIES = new BedrockPacketType("UPDATE_BLOCK_PROPERTIES"); + public static final BedrockPacketType UPDATE_BLOCK_SYNCED = new BedrockPacketType("UPDATE_BLOCK_SYNCED"); + public static final BedrockPacketType UPDATE_EQUIP = new BedrockPacketType("UPDATE_EQUIP"); + public static final BedrockPacketType UPDATE_PLAYER_GAME_TYPE = new BedrockPacketType("UPDATE_PLAYER_GAME_TYPE"); + public static final BedrockPacketType UPDATE_SOFT_ENUM = new BedrockPacketType("UPDATE_SOFT_ENUM"); + public static final BedrockPacketType UPDATE_SUB_CHUNK_BLOCKS = new BedrockPacketType("UPDATE_SUB_CHUNK_BLOCKS"); + public static final BedrockPacketType UPDATE_TRADE = new BedrockPacketType("UPDATE_TRADE"); + public static final BedrockPacketType VIDEO_STREAM_CONNECT = new BedrockPacketType("VIDEO_STREAM_CONNECT"); + public static final BedrockPacketType UPDATE_CLIENT_INPUT_LOCKS = new BedrockPacketType("UPDATE_CLIENT_INPUT_LOCKS"); + public static final BedrockPacketType CAMERA_PRESETS = new BedrockPacketType("CAMERA_PRESETS"); + public static final BedrockPacketType UNLOCKED_RECIPES = new BedrockPacketType("UNLOCKED_RECIPES"); + public static final BedrockPacketType CAMERA_INSTRUCTION = new BedrockPacketType("CAMERA_INSTRUCTION"); + public static final BedrockPacketType COMPRESSED_BIOME_DEFINITIONS_LIST = new BedrockPacketType("COMPRESSED_BIOME_DEFINITIONS_LIST"); + public static final BedrockPacketType TRIM_DATA = new BedrockPacketType("TRIM_DATA"); + public static final BedrockPacketType OPEN_SIGN = new BedrockPacketType("OPEN_SIGN"); + public static final BedrockPacketType AGENT_ANIMATION = new BedrockPacketType("AGENT_ANIMATION"); + public static final BedrockPacketType REFRESH_ENTITLEMENTS = new BedrockPacketType("REFRESH_ENTITLEMENTS"); + public static final BedrockPacketType TOGGLE_CRAFTER_SLOT_REQUEST = new BedrockPacketType("TOGGLE_CRAFTER_SLOT_REQUEST"); + public static final BedrockPacketType SET_PLAYER_INVENTORY_OPTIONS = new BedrockPacketType("SET_PLAYER_INVENTORY_OPTIONS"); + public static final BedrockPacketType SET_HUD = new BedrockPacketType("SET_HUD"); + public static final BedrockPacketType AWARD_ACHIEVEMENT = new BedrockPacketType("AWARD_ACHIEVEMENT"); + public static final BedrockPacketType CLIENTBOUND_CLOSE_FORM = new BedrockPacketType("CLIENTBOUND_CLOSE_FORM"); + public static final BedrockPacketType SERVERBOUND_LOADING_SCREEN = new BedrockPacketType("SERVERBOUND_LOADING_SCREEN"); + public static final BedrockPacketType JIGSAW_STRUCTURE_DATA = new BedrockPacketType("JIGSAW_STRUCTURE_DATA"); + public static final BedrockPacketType CURRENT_STRUCTURE_FEATURE = new BedrockPacketType("CURRENT_STRUCTURE_FEATURE"); + public static final BedrockPacketType SERVERBOUND_DIAGNOSTICS = new BedrockPacketType("SERVERBOUND_DIAGNOSTICS"); + public static final BedrockPacketType CAMERA_AIM_ASSIST = new BedrockPacketType("CAMERA_AIM_ASSIST"); + public static final BedrockPacketType CONTAINER_REGISTRY_CLEANUP = new BedrockPacketType("CONTAINER_REGISTRY_CLEANUP"); + public static final BedrockPacketType MOVEMENT_EFFECT = new BedrockPacketType("MOVEMENT_EFFECT"); + public static final BedrockPacketType SET_MOVEMENT_AUTHORITY = new BedrockPacketType("SET_MOVEMENT_AUTHORITY"); + public static final BedrockPacketType CAMERA_AIM_ASSIST_PRESETS = new BedrockPacketType("CAMERA_AIM_ASSIST_PRESETS"); + public static final BedrockPacketType CAMERA_AIM_ASSIST_INSTRUCTION = new BedrockPacketType("CAMERA_AIM_ASSIST_INSTRUCTION"); + public static final BedrockPacketType MOVEMENT_PREDICTION_SYNC = new BedrockPacketType("MOVEMENT_PREDICTION_SYNC"); + public static final BedrockPacketType UPDATE_CLIENT_OPTIONS = new BedrockPacketType("UPDATE_CLIENT_OPTIONS"); + public static final BedrockPacketType PLAYER_VIDEO_CAPTURE = new BedrockPacketType("PLAYER_VIDEO_CAPTURE"); + public static final BedrockPacketType PLAYER_UPDATE_ENTITY_OVERRIDES = new BedrockPacketType("PLAYER_UPDATE_ENTITY_OVERRIDES"); + public static final BedrockPacketType PLAYER_LOCATION = new BedrockPacketType("PLAYER_LOCATION"); + public static final BedrockPacketType CLIENTBOUND_CONTROL_SCHEME_SET = new BedrockPacketType("CLIENTBOUND_CONTROL_SCHEME_SET"); + public static final BedrockPacketType DEBUG_DRAWER = new BedrockPacketType("DEBUG_DRAWER"); + public static final BedrockPacketType SERVERBOUND_PACK_SETTING_CHANGE = new BedrockPacketType("SERVERBOUND_PACK_SETTING_CHANGE"); + public static final BedrockPacketType GRAPHICS_PARAMETER_OVERRIDE_PACKET = new BedrockPacketType("GRAPHICS_PARAMETER_OVERRIDE_PACKET"); + public static final BedrockPacketType SERVER_PLAYER_POST_MOVE_POSITION = new BedrockPacketType("SERVER_PLAYER_POST_MOVE_POSITION"); + public static final BedrockPacketType SERVERBOUND_DATA_STORE = new BedrockPacketType("SERVERBOUND_DATA_STORE"); + public static final BedrockPacketType CLIENTBOUND_DATA_STORE = new BedrockPacketType("CLIENTBOUND_DATA_STORE"); + public static final BedrockPacketType CLIENTBOUND_DATA_DRIVEN_UI_SHOW_SCREEN = new BedrockPacketType("CLIENTBOUND_DATA_DRIVEN_UI_SHOW_SCREEN"); + public static final BedrockPacketType CLIENTBOUND_DATA_DRIVEN_UI_CLOSE_SCREEN = new BedrockPacketType("CLIENTBOUND_DATA_DRIVEN_UI_CLOSE_SCREEN"); + public static final BedrockPacketType CLIENTBOUND_DATA_DRIVEN_UI_RELOAD = new BedrockPacketType("CLIENTBOUND_DATA_DRIVEN_UI_RELOAD"); + public static final BedrockPacketType CLIENTBOUND_TEXTURE_SHIFT = new BedrockPacketType("CLIENTBOUND_TEXTURE_SHIFT"); + public static final BedrockPacketType VOXEL_SHAPES = new BedrockPacketType("VOXEL_SHAPES"); + public static final BedrockPacketType CAMERA_SPLINE = new BedrockPacketType("CAMERA_SPLINE"); + public static final BedrockPacketType CAMERA_AIM_ASSIST_ACTOR_PRIORITY = new BedrockPacketType("CAMERA_AIM_ASSIST_ACTOR_PRIORITY"); + public static final BedrockPacketType RESOURCE_PACKS_READY_FOR_VALIDATION = new BedrockPacketType("RESOURCE_PACKS_READY_FOR_VALIDATION"); + public static final BedrockPacketType LOCATOR_BAR = new BedrockPacketType("LOCATOR_BAR"); + public static final BedrockPacketType PARTY_CHANGED = new BedrockPacketType("PARTY_CHANGED"); + public static final BedrockPacketType SERVERBOUND_DATA_DRIVEN_SCREEN_CLOSED = new BedrockPacketType("SERVERBOUND_DATA_DRIVEN_SCREEN_CLOSED"); + public static final BedrockPacketType SYNC_WORLD_CLOCKS = new BedrockPacketType("SYNC_WORLD_CLOCKS"); + public static final BedrockPacketType CLIENTBOUND_ATTRIBUTE_LAYER_SYNC = new BedrockPacketType("CLIENTBOUND_ATTRIBUTE_LAYER_SYNC"); + public static final BedrockPacketType SERVER_STORE_INFO = new BedrockPacketType("SERVER_STORE_INFO"); + public static final BedrockPacketType SERVER_PRESENCE_INFO = new BedrockPacketType("SERVER_PRESENCE_INFO"); + public static final BedrockPacketType CLIENTBOUND_UPDATE_SOUND_DATA = new BedrockPacketType("CLIENTBOUND_UPDATE_SOUND_DATA"); + public static final BedrockPacketType SEND_PARTY_DESTINATION_COOKIE = new BedrockPacketType("SEND_PARTY_DESTINATION_COOKIE"); + public static final BedrockPacketType PARTY_DESTINATION_COOKIE_RESPONSE = new BedrockPacketType("PARTY_DESTINATION_COOKIE_RESPONSE"); + + @Getter + private final String name; + + public BedrockPacketType(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } } diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BiomeDefinitionListPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BiomeDefinitionListPacket.java index 53620ad..b4b1f7d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BiomeDefinitionListPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BiomeDefinitionListPacket.java @@ -18,11 +18,11 @@ public class BiomeDefinitionListPacket implements BedrockPacket { /** * @deprecated As of v800 (1.21.80) the biomes are no longer sent as NBT. Use {@link #biomes} instead. */ - public NbtMap definitions; + private NbtMap definitions; /** * @since v800 (1.21.80) */ - public BiomeDefinitions biomes; + private BiomeDefinitions biomes; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BlockEntityDataPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BlockEntityDataPacket.java index 58ee7e2..b209402 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BlockEntityDataPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BlockEntityDataPacket.java @@ -11,8 +11,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class BlockEntityDataPacket implements BedrockPacket { - public Vector3i blockPosition; - public NbtMap data; + private Vector3i blockPosition; + private NbtMap data; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BlockEventPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BlockEventPacket.java index 7e3e237..27ea39d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BlockEventPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BlockEventPacket.java @@ -48,7 +48,7 @@ public class BlockEventPacket implements BedrockPacket { * @param blockPosition block event position * @return block event position */ - public Vector3i blockPosition; + private Vector3i blockPosition; /** * Block event type to execute @@ -56,7 +56,7 @@ public class BlockEventPacket implements BedrockPacket { * @param eventType block event type * @return block event type */ - public int eventType; + private int eventType; /** * Data used by event (if applicable) @@ -64,7 +64,7 @@ public class BlockEventPacket implements BedrockPacket { * @param eventData data for event * @return data for event */ - public int eventData; + private int eventData; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BlockPickRequestPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BlockPickRequestPacket.java index 25c4941..3e9ef71 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BlockPickRequestPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BlockPickRequestPacket.java @@ -10,9 +10,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class BlockPickRequestPacket implements BedrockPacket { - public Vector3i blockPosition; - public boolean addUserData; - public int hotbarSlot; + private Vector3i blockPosition; + private boolean addUserData; + private int hotbarSlot; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BookEditPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BookEditPacket.java index 522a501..0ada5f0 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BookEditPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BookEditPacket.java @@ -9,15 +9,15 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class BookEditPacket implements BedrockPacket { - public Action action; - public int inventorySlot; - public int pageNumber; - public int secondaryPageNumber; - public CharSequence text; - public String photoName; - public CharSequence title; - public CharSequence author; - public String xuid; + private Action action; + private int inventorySlot; + private int pageNumber; + private int secondaryPageNumber; + private CharSequence text; + private String photoName; + private CharSequence title; + private CharSequence author; + private String xuid; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BossEventPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BossEventPacket.java index 3f756be..0236f75 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BossEventPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/BossEventPacket.java @@ -9,15 +9,18 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class BossEventPacket implements BedrockPacket { - public long bossUniqueEntityId; - public Action action; - public long playerUniqueEntityId; - public CharSequence title; - public CharSequence filteredTitle = ""; - public float healthPercentage; - public int darkenSky; - public int color; - public int overlay; + private long bossUniqueEntityId; + private Action action; + private long playerUniqueEntityId; + private CharSequence title = ""; + private CharSequence filteredTitle = ""; + private float healthPercentage; + /** + * @deprecated since v1001 + */ + private int darkenSky; + private int color; // PINK|BLUE|RED|GREEN|YELLOW|PURPLE|REBECCA_PURPLE|WHITE + private int overlay; // PROGRESS|NOTCHED_6|NOTCHED_10|NOTCHED_12|NOTCHED_20 @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraAimAssistActorPriorityPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraAimAssistActorPriorityPacket.java new file mode 100644 index 0000000..c423634 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraAimAssistActorPriorityPacket.java @@ -0,0 +1,41 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.cloudburstmc.protocol.bedrock.data.camera.AimAssistActorPriorityData; +import org.cloudburstmc.protocol.common.PacketSignal; + +import java.util.List; + +/** + * Camera aim-assist actor priority data sent from the server to clients. + * Sent by the server to clients for updating the actor priority for client aim-assist systems. + * + * @since v924 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class CameraAimAssistActorPriorityPacket implements BedrockPacket { + + private List priorityData; + + @Override + public final PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + public BedrockPacketType getPacketType() { + return BedrockPacketType.CAMERA_AIM_ASSIST_ACTOR_PRIORITY; + } + + @Override + public CameraAimAssistActorPriorityPacket clone() { + try { + return (CameraAimAssistActorPriorityPacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraAimAssistInstructionPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraAimAssistInstructionPacket.java index d75ad9b..802906b 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraAimAssistInstructionPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraAimAssistInstructionPacket.java @@ -11,9 +11,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class CameraAimAssistInstructionPacket implements BedrockPacket { - public String presetId; - public AimAssistAction action; - public boolean allowAimAssist; + private String presetId; + private AimAssistAction action; + private boolean allowAimAssist; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraAimAssistPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraAimAssistPacket.java index a68e7c4..7bfda93 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraAimAssistPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraAimAssistPacket.java @@ -11,18 +11,18 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class CameraAimAssistPacket implements BedrockPacket { - public Vector2f viewAngle; - public float distance; - public TargetMode targetMode; - public AimAssistAction action; + private Vector2f viewAngle; + private float distance; + private TargetMode targetMode; + private AimAssistAction action; /** * @since v766 */ - public String presetId; + private String presetId; /** * @since v827 */ - public boolean showDebugRender; + private boolean showDebugRender; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraAimAssistPresetsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraAimAssistPresetsPacket.java index ddcbe2c..1a8989d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraAimAssistPresetsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraAimAssistPresetsPacket.java @@ -19,16 +19,16 @@ public class CameraAimAssistPresetsPacket implements BedrockPacket { /** * @deprecated since v800 (1.21.80). Use {@link #categoryDefinitions} instead. */ - public final List categories = new ObjectArrayList<>(); + private final List categories = new ObjectArrayList<>(); /** * @since v800 (1.21.80) */ - public final List categoryDefinitions = new ObjectArrayList<>(); - public final List presets = new ObjectArrayList<>(); + private final List categoryDefinitions = new ObjectArrayList<>(); + private final List presets = new ObjectArrayList<>(); /** * @since v776 */ - public CameraAimAssistOperation operation; + private CameraAimAssistOperation operation; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraInstructionPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraInstructionPacket.java index 0b0e73b..0d68a76 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraInstructionPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraInstructionPacket.java @@ -11,33 +11,33 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class CameraInstructionPacket implements BedrockPacket { - public CameraSetInstruction setInstruction; - public CameraFadeInstruction fadeInstruction; - public OptionalBoolean clear = OptionalBoolean.empty(); + private CameraSetInstruction setInstruction; + private CameraFadeInstruction fadeInstruction; + private OptionalBoolean clear = OptionalBoolean.empty(); /** * @since v712 */ - public CameraTargetInstruction targetInstruction; + private CameraTargetInstruction targetInstruction; /** * @since v712 */ - public OptionalBoolean removeTarget = OptionalBoolean.empty(); + private OptionalBoolean removeTarget = OptionalBoolean.empty(); /** * @since v827 */ - public CameraFovInstruction fovInstruction; + private CameraFovInstruction fovInstruction; /** * @since v859 */ - public CameraSplineInstruction splineInstruction; + private CameraSplineInstruction splineInstruction; /** * @since v859 */ - public CameraAttachToEntityInstruction attachInstruction; + private CameraAttachToEntityInstruction attachInstruction; /** * @since v859 */ - public OptionalBoolean detachFromEntity = OptionalBoolean.empty(); + private OptionalBoolean detachFromEntity = OptionalBoolean.empty(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraPacket.java index 2f197c6..40c6aee 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraPacket.java @@ -9,8 +9,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class CameraPacket implements BedrockPacket { - public long cameraUniqueEntityId; - public long playerUniqueEntityId; + private long cameraUniqueEntityId; + private long playerUniqueEntityId; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraPresetsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraPresetsPacket.java index 8aa09b4..7565e85 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraPresetsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraPresetsPacket.java @@ -14,7 +14,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class CameraPresetsPacket implements BedrockPacket { - public final List presets = new ObjectArrayList<>(); + private final List presets = new ObjectArrayList<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraShakePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraShakePacket.java index fa754cd..f1cbe92 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraShakePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraShakePacket.java @@ -23,7 +23,7 @@ public class CameraShakePacket implements BedrockPacket { * @param intensity shake intensity * @return shake intensity */ - public float intensity; + private float intensity; /** * Amount of time to shake the player's camera. @@ -31,14 +31,14 @@ public class CameraShakePacket implements BedrockPacket { * @param duration seconds to shake * @return seconds to shake */ - public float duration; + private float duration; - public CameraShakeType shakeType; + private CameraShakeType shakeType; /** * @since v428 */ - public CameraShakeAction shakeAction; + private CameraShakeAction shakeAction; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraSplinePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraSplinePacket.java new file mode 100644 index 0000000..89b1661 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CameraSplinePacket.java @@ -0,0 +1,41 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.cloudburstmc.protocol.bedrock.data.camera.CameraSplineDefinition; +import org.cloudburstmc.protocol.common.PacketSignal; + +import java.util.List; + +/** + * Camera custom spline data sent from server to client. + * Sent by the server to clients for initializing custom spline data that can be played later through the camera command. + * + * @since v924 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class CameraSplinePacket implements BedrockPacket { + + private List splines; + + @Override + public final PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + public BedrockPacketType getPacketType() { + return BedrockPacketType.CAMERA_SPLINE; + } + + @Override + public CameraSplinePacket clone() { + try { + return (CameraSplinePacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ChangeDimensionPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ChangeDimensionPacket.java index 82df788..efb86b3 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ChangeDimensionPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ChangeDimensionPacket.java @@ -10,14 +10,14 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ChangeDimensionPacket implements BedrockPacket { - public int dimension; - public Vector3f position; - public boolean respawn; + private int dimension; + private Vector3f position; + private boolean respawn; /** * Will be serialized as optional not present if null * @since v712 */ - public Integer loadingScreenId; + private Integer loadingScreenId; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ChangeMobPropertyPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ChangeMobPropertyPacket.java index 27726a0..a039f61 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ChangeMobPropertyPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ChangeMobPropertyPacket.java @@ -14,12 +14,12 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ChangeMobPropertyPacket implements BedrockPacket { - public long uniqueEntityId; - public String property; - public boolean boolValue; - public String stringValue; - public int intValue; - public float floatValue; + private long uniqueEntityId; + private String property; + private boolean boolValue; + private String stringValue; + private int intValue; + private float floatValue; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ChunkRadiusUpdatedPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ChunkRadiusUpdatedPacket.java index ed063bc..becf390 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ChunkRadiusUpdatedPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ChunkRadiusUpdatedPacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ChunkRadiusUpdatedPacket implements BedrockPacket { - public int radius; + private int radius; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientCacheBlobStatusPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientCacheBlobStatusPacket.java index fed68d7..0f666d6 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientCacheBlobStatusPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientCacheBlobStatusPacket.java @@ -11,8 +11,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ClientCacheBlobStatusPacket implements BedrockPacket { - public final LongList acks = new LongArrayList(); - public final LongList naks = new LongArrayList(); + private final LongList acks = new LongArrayList(); + private final LongList naks = new LongArrayList(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientCacheMissResponsePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientCacheMissResponsePacket.java index abf7732..36af0e9 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientCacheMissResponsePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientCacheMissResponsePacket.java @@ -14,7 +14,7 @@ @EqualsAndHashCode(doNotUseGetters = true, callSuper = false) @ToString(doNotUseGetters = true) public class ClientCacheMissResponsePacket extends AbstractReferenceCounted implements BedrockPacket { - public final Long2ObjectMap blobs = new Long2ObjectLinkedOpenHashMap<>(); + private final Long2ObjectMap blobs = new Long2ObjectLinkedOpenHashMap<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientCacheStatusPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientCacheStatusPacket.java index 7b96c79..eb88138 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientCacheStatusPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientCacheStatusPacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ClientCacheStatusPacket implements BedrockPacket { - public boolean supported; + private boolean supported; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientCheatAbilityPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientCheatAbilityPacket.java index 58c027c..58dbe09 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientCheatAbilityPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientCheatAbilityPacket.java @@ -25,10 +25,10 @@ @ToString(doNotUseGetters = true) public class ClientCheatAbilityPacket implements BedrockPacket, PlayerAbilityHolder { - public long uniqueEntityId; - public PlayerPermission playerPermission; - public CommandPermission commandPermission; - public List abilityLayers = new ObjectArrayList<>(); + private long uniqueEntityId; + private PlayerPermission playerPermission; + private CommandPermission commandPermission; + private List abilityLayers = new ObjectArrayList<>(); @Override public BedrockPacketType getPacketType() { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundAttributeLayerSyncPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundAttributeLayerSyncPacket.java new file mode 100644 index 0000000..f8bb60c --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundAttributeLayerSyncPacket.java @@ -0,0 +1,38 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.cloudburstmc.protocol.bedrock.data.attributelayer.AttributeLayerSyncPayload; +import org.cloudburstmc.protocol.common.PacketSignal; + +/** + * Syncs Attribute Layers to the Client (Currently disabled) + * + * @since v944 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class ClientboundAttributeLayerSyncPacket implements BedrockPacket { + + private AttributeLayerSyncPayload data; + + @Override + public final PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + public BedrockPacketType getPacketType() { + return BedrockPacketType.CLIENTBOUND_ATTRIBUTE_LAYER_SYNC; + } + + @Override + public ClientboundAttributeLayerSyncPacket clone() { + try { + return (ClientboundAttributeLayerSyncPacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundControlSchemeSetPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundControlSchemeSetPacket.java index 35c0a77..43920d6 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundControlSchemeSetPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundControlSchemeSetPacket.java @@ -11,7 +11,7 @@ @ToString(doNotUseGetters = true) public class ClientboundControlSchemeSetPacket implements BedrockPacket { - public ControlScheme scheme; + private ControlScheme scheme; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDataDrivenUICloseScreenPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDataDrivenUICloseScreenPacket.java new file mode 100644 index 0000000..6ac76e3 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDataDrivenUICloseScreenPacket.java @@ -0,0 +1,44 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.cloudburstmc.protocol.common.PacketSignal; + +/** + * Allows the server to tell the client to close all the Data Driven UI screens. + * Previously ClientboundDataDrivenUICloseAllScreensPacket + * + * @since v924 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class ClientboundDataDrivenUICloseScreenPacket implements BedrockPacket { + + /** + * The unique id of th form to close. If not supplied, this will close all forms + * @since v944 + */ + @Nullable + private Integer formId; + + @Override + public final PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + public BedrockPacketType getPacketType() { + return BedrockPacketType.CLIENTBOUND_DATA_DRIVEN_UI_CLOSE_SCREEN; + } + + @Override + public ClientboundDataDrivenUICloseScreenPacket clone() { + try { + return (ClientboundDataDrivenUICloseScreenPacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDataDrivenUIReloadPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDataDrivenUIReloadPacket.java new file mode 100644 index 0000000..bb662fc --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDataDrivenUIReloadPacket.java @@ -0,0 +1,35 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.cloudburstmc.protocol.common.PacketSignal; + +/** + * Allows the server to tell the client to reload the Data Driven UI. + * + * @since v924 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class ClientboundDataDrivenUIReloadPacket implements BedrockPacket { + + @Override + public final PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + public BedrockPacketType getPacketType() { + return BedrockPacketType.CLIENTBOUND_DATA_DRIVEN_UI_RELOAD; + } + + @Override + public ClientboundDataDrivenUIReloadPacket clone() { + try { + return (ClientboundDataDrivenUIReloadPacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDataDrivenUIShowScreenPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDataDrivenUIShowScreenPacket.java new file mode 100644 index 0000000..7ad4218 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDataDrivenUIShowScreenPacket.java @@ -0,0 +1,51 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.cloudburstmc.protocol.common.PacketSignal; + +/** + * Allows the server to tell the client to show a Data Driven UI screen. + * + * @since v924 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class ClientboundDataDrivenUIShowScreenPacket implements BedrockPacket { + + private String screenId; + + /** + * The unique id of this instance of the form for tracking in scripting + * @since v944 + */ + private int formId; + + /** + * The optional id of the data associated with this screen + * @since v944 + */ + @Nullable + private Integer dataInstanceId; + + @Override + public final PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + public BedrockPacketType getPacketType() { + return BedrockPacketType.CLIENTBOUND_DATA_DRIVEN_UI_SHOW_SCREEN; + } + + @Override + public ClientboundDataDrivenUIShowScreenPacket clone() { + try { + return (ClientboundDataDrivenUIShowScreenPacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDataStorePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDataStorePacket.java new file mode 100644 index 0000000..86dedfd --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDataStorePacket.java @@ -0,0 +1,42 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.cloudburstmc.protocol.bedrock.data.datastore.DataStoreAction; +import org.cloudburstmc.protocol.common.PacketSignal; + +import java.util.ArrayList; +import java.util.List; + +/** + * Sends a list of data store properties from the server to the client + * + * @since v897 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class ClientboundDataStorePacket implements BedrockPacket { + + private List updates = new ArrayList<>(); + + @Override + public PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + @Override + public BedrockPacketType getPacketType() { + return BedrockPacketType.CLIENTBOUND_DATA_STORE; + } + + @Override + public ClientboundDataStorePacket clone() { + try { + return (ClientboundDataStorePacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDebugRendererPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDebugRendererPacket.java index fcf3c8d..c508135 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDebugRendererPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundDebugRendererPacket.java @@ -12,37 +12,37 @@ @ToString(doNotUseGetters = true) public class ClientboundDebugRendererPacket implements BedrockPacket { - public ClientboundDebugRendererType debugMarkerType; + private ClientboundDebugRendererType debugMarkerType; /** * Only used if {@link #debugMarkerType} is set to {@link ClientboundDebugRendererType#ADD_DEBUG_MARKER_CUBE}. */ - public String markerText; + private String markerText; /** * Only used if {@link #debugMarkerType} is set to {@link ClientboundDebugRendererType#ADD_DEBUG_MARKER_CUBE}. */ - public Vector3f markerPosition; + private Vector3f markerPosition; /** * Only used if {@link #debugMarkerType} is set to {@link ClientboundDebugRendererType#ADD_DEBUG_MARKER_CUBE}. */ - public float markerColorRed; + private float markerColorRed; /** * Only used if {@link #debugMarkerType} is set to {@link ClientboundDebugRendererType#ADD_DEBUG_MARKER_CUBE}. */ - public float markerColorGreen; + private float markerColorGreen; /** * Only used if {@link #debugMarkerType} is set to {@link ClientboundDebugRendererType#ADD_DEBUG_MARKER_CUBE}. */ - public float markerColorBlue; + private float markerColorBlue; /** * Only used if {@link #debugMarkerType} is set to {@link ClientboundDebugRendererType#ADD_DEBUG_MARKER_CUBE}. */ - public float markerColorAlpha; + private float markerColorAlpha; /** * Only used if {@link #debugMarkerType} is set to {@link ClientboundDebugRendererType#ADD_DEBUG_MARKER_CUBE}. * In milliseconds. */ - public long markerDuration; + private long markerDuration; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundMapItemDataPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundMapItemDataPacket.java index e605bcb..db0a33a 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundMapItemDataPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundMapItemDataPacket.java @@ -17,24 +17,24 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ClientboundMapItemDataPacket implements BedrockPacket { - public final LongList trackedEntityIds = new LongArrayList(); - public final List trackedObjects = new ObjectArrayList<>(); - public final List decorations = new ObjectArrayList<>(); - public long uniqueMapId; - public int dimensionId; - public boolean locked; + private final LongList trackedEntityIds = new LongArrayList(); + private final List trackedObjects = new ObjectArrayList<>(); + private final List decorations = new ObjectArrayList<>(); + private long uniqueMapId; + private int dimensionId; + private boolean locked; /** * The world-relative position of the map's origin. * * @since 1.19.20 */ - public Vector3i origin; - public int scale; - public int height; - public int width; - public int xOffset; - public int yOffset; - public int[] colors; + private Vector3i origin; + private int scale; + private int height; + private int width; + private int xOffset; + private int yOffset; + private int[] colors; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundTextureShiftPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundTextureShiftPacket.java new file mode 100644 index 0000000..8b1005d --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundTextureShiftPacket.java @@ -0,0 +1,54 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.cloudburstmc.protocol.common.PacketSignal; + +import java.util.List; + +/** + * Sends a set of update properties for the texture shift system from the server to the client. + * + * @since v924 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class ClientboundTextureShiftPacket implements BedrockPacket { + + private Action action; + private String collectionName; + private String fromStep; + private String toStep; + private List allSteps; + private long currentLengthTicks; + private long totalLengthTicks; + private boolean enabled; + + @Override + public final PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + public BedrockPacketType getPacketType() { + return BedrockPacketType.CLIENTBOUND_TEXTURE_SHIFT; + } + + @Override + public ClientboundTextureShiftPacket clone() { + try { + return (ClientboundTextureShiftPacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } + + public enum Action { + INVALID, + INITIALIZE, + START, + SET_ENABLED, + SYNC + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundUpdateSoundDataPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundUpdateSoundDataPacket.java new file mode 100644 index 0000000..f31222c --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ClientboundUpdateSoundDataPacket.java @@ -0,0 +1,39 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.cloudburstmc.protocol.common.PacketSignal; + +/** + * Sent to update sound data. + * + * @since v1001 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class ClientboundUpdateSoundDataPacket implements BedrockPacket { + + private long serverSoundHandle; + private String type; + + @Override + public PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + @Override + public BedrockPacketType getPacketType() { + return BedrockPacketType.CLIENTBOUND_UPDATE_SOUND_DATA; + } + + @Override + public BedrockPacket clone() { + try { + return (ClientboundUpdateSoundDataPacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CodeBuilderPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CodeBuilderPacket.java index 9841f42..4a298eb 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CodeBuilderPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CodeBuilderPacket.java @@ -9,8 +9,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class CodeBuilderPacket implements BedrockPacket { - public String url; - public boolean opening; + private String url; + private boolean opening; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CodeBuilderSourcePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CodeBuilderSourcePacket.java index fc147f0..ff4218a 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CodeBuilderSourcePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CodeBuilderSourcePacket.java @@ -13,16 +13,16 @@ @ToString(doNotUseGetters = true) public class CodeBuilderSourcePacket implements BedrockPacket { - public CodeBuilderOperationType operation; - public CodeBuilderCategoryType category; + private CodeBuilderOperationType operation; + private CodeBuilderCategoryType category; /** * @deprecated since v685 */ - public String value; + private String value; /** * @since v685 */ - public CodeBuilderCodeStatus codeStatus; + private CodeBuilderCodeStatus codeStatus; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CommandBlockUpdatePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CommandBlockUpdatePacket.java index 3ef8dcf..17f4f7c 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CommandBlockUpdatePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CommandBlockUpdatePacket.java @@ -11,19 +11,19 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class CommandBlockUpdatePacket implements BedrockPacket { - public boolean block; - public Vector3i blockPosition; - public CommandBlockMode mode; - public boolean redstoneMode; - public boolean conditional; - public long minecartRuntimeEntityId; - public String command; - public String lastOutput; - public String name; - public String filteredName; - public boolean outputTracked; - public long tickDelay; - public boolean executingOnFirstTick; + private boolean block; + private Vector3i blockPosition; + private CommandBlockMode mode; + private boolean redstoneMode; + private boolean conditional; + private long minecartRuntimeEntityId; + private String command; + private String lastOutput; + private String name; + private String filteredName; + private boolean outputTracked; + private long tickDelay; + private boolean executingOnFirstTick; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CommandOutputPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CommandOutputPacket.java index ce2f810..838dd5e 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CommandOutputPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CommandOutputPacket.java @@ -17,12 +17,12 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class CommandOutputPacket implements BedrockPacket { - public final List messages = new ObjectArrayList<>(); - public CommandOriginData commandOriginData; - public CommandOutputType type; - public int successCount; + private final List messages = new ObjectArrayList<>(); + private CommandOriginData commandOriginData; + private CommandOutputType type; + private int successCount; @Nullable - public String data; + private String data; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CommandRequestPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CommandRequestPacket.java index 927fc7c..ccea9db 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CommandRequestPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CommandRequestPacket.java @@ -10,13 +10,13 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class CommandRequestPacket implements BedrockPacket { - public String command; - public CommandOriginData commandOriginData; - public boolean internal; + private String command; + private CommandOriginData commandOriginData; + private boolean internal; /** * @since v567 */ - public int version; + private int version; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CompletedUsingItemPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CompletedUsingItemPacket.java index d0032a7..cbbc33a 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CompletedUsingItemPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CompletedUsingItemPacket.java @@ -10,8 +10,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class CompletedUsingItemPacket implements BedrockPacket { - public int itemId; - public ItemUseType type; + private int itemId; + private ItemUseType type; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CompressedBiomeDefinitionListPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CompressedBiomeDefinitionListPacket.java index 1674944..fe6a8d7 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CompressedBiomeDefinitionListPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CompressedBiomeDefinitionListPacket.java @@ -10,7 +10,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true, exclude = "definitions") public class CompressedBiomeDefinitionListPacket implements BedrockPacket { - public NbtMap definitions; + private NbtMap definitions; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ContainerClosePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ContainerClosePacket.java index 159a772..4839f3b 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ContainerClosePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ContainerClosePacket.java @@ -10,12 +10,12 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ContainerClosePacket implements BedrockPacket { - public byte id; - public boolean serverInitiated; + private byte id; + private boolean serverInitiated; /** * @since v685 */ - public ContainerType type; + private ContainerType type; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ContainerOpenPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ContainerOpenPacket.java index 82df41b..557e7d5 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ContainerOpenPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ContainerOpenPacket.java @@ -11,10 +11,10 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ContainerOpenPacket implements BedrockPacket { - public byte id; - public ContainerType type; - public Vector3i blockPosition; - public long uniqueEntityId = -1; + private byte id; + private ContainerType type; + private Vector3i blockPosition; + private long uniqueEntityId = -1; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ContainerRegistryCleanupPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ContainerRegistryCleanupPacket.java index d0f3d72..705015c 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ContainerRegistryCleanupPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ContainerRegistryCleanupPacket.java @@ -16,7 +16,7 @@ public class ContainerRegistryCleanupPacket implements BedrockPacket { /** * A list of full containers to cleanup. */ - public final List containers = new ObjectArrayList<>(); + private final List containers = new ObjectArrayList<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ContainerSetDataPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ContainerSetDataPacket.java index 97e7190..584e2df 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ContainerSetDataPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ContainerSetDataPacket.java @@ -20,9 +20,9 @@ public class ContainerSetDataPacket implements BedrockPacket { public static final int BREWING_STAND_FUEL_AMOUNT = 1; public static final int BREWING_STAND_FUEL_TOTAL = 2; - public byte windowId; - public int property; - public int value; + private byte windowId; + private int property; + private int value; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CorrectPlayerMovePredictionPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CorrectPlayerMovePredictionPacket.java index 3c82940..7c866d4 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CorrectPlayerMovePredictionPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CorrectPlayerMovePredictionPacket.java @@ -22,7 +22,7 @@ public class CorrectPlayerMovePredictionPacket implements BedrockPacket { * @param position reported position * @return reported position */ - public Vector3f position; + private Vector3f position; /** * Difference in client and server prediction @@ -30,7 +30,7 @@ public class CorrectPlayerMovePredictionPacket implements BedrockPacket { * @param delta position difference * @return position difference */ - public Vector3f delta; + private Vector3f delta; /** * If the client is on the ground. (Not falling or jumping) @@ -38,7 +38,7 @@ public class CorrectPlayerMovePredictionPacket implements BedrockPacket { * @param onGround is client on the ground * @return is client on the ground */ - public boolean onGround; + private boolean onGround; /** * The tick which is being corrected by the server. @@ -46,26 +46,26 @@ public class CorrectPlayerMovePredictionPacket implements BedrockPacket { * @param tick to be corrected * @return to be corrected */ - public long tick; + private long tick; /** * @since 649 * * The type of prediction player sends. */ - public PredictionType predictionType = PredictionType.PLAYER; + private PredictionType predictionType = PredictionType.PLAYER; /** * @since 671 * * The rotation of the vehicle. */ - public Vector2f vehicleRotation; + private Vector2f vehicleRotation; /** * @since v712 */ - public Float vehicleAngularVelocity; + private Float vehicleAngularVelocity; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CraftingDataPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CraftingDataPacket.java index 440fb8e..42831ff 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CraftingDataPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CraftingDataPacket.java @@ -16,14 +16,14 @@ @ToString(doNotUseGetters = true) @EqualsAndHashCode(doNotUseGetters = true) public class CraftingDataPacket implements BedrockPacket { - public final List craftingData = new ObjectArrayList<>(); - public final List potionMixData = new ObjectArrayList<>(); - public final List containerMixData = new ObjectArrayList<>(); + private final List craftingData = new ObjectArrayList<>(); + private final List potionMixData = new ObjectArrayList<>(); + private final List containerMixData = new ObjectArrayList<>(); /** * @since v465 */ - public final List materialReducers = new ObjectArrayList<>(); - public boolean cleanRecipes; + private final List materialReducers = new ObjectArrayList<>(); + private boolean cleanRecipes; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CraftingEventPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CraftingEventPacket.java index 5000090..635c985 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CraftingEventPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CraftingEventPacket.java @@ -19,11 +19,11 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class CraftingEventPacket implements BedrockPacket { - public final List inputs = new ObjectArrayList<>(); - public final List outputs = new ObjectArrayList<>(); - public byte containerId; - public CraftingType type; - public UUID uuid; + private final List inputs = new ObjectArrayList<>(); + private final List outputs = new ObjectArrayList<>(); + private byte containerId; + private CraftingType type; + private UUID uuid; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CreatePhotoPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CreatePhotoPacket.java index 861d211..0d85d2e 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CreatePhotoPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CreatePhotoPacket.java @@ -9,9 +9,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class CreatePhotoPacket implements BedrockPacket { - public long id; - public String photoName; - public String photoItemName; + private long id; + private String photoName; + private String photoItemName; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CreativeContentPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CreativeContentPacket.java index bcf7f54..485643c 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CreativeContentPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CreativeContentPacket.java @@ -21,8 +21,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class CreativeContentPacket implements BedrockPacket { - public final List groups = new ObjectArrayList<>(); - public final List contents = new ObjectArrayList<>(); + private final List groups = new ObjectArrayList<>(); + private final List contents = new ObjectArrayList<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CurrentStructureFeaturePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CurrentStructureFeaturePacket.java index 820e3b0..9394471 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CurrentStructureFeaturePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CurrentStructureFeaturePacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class CurrentStructureFeaturePacket implements BedrockPacket { - public String currentStructureFeature; + private String currentStructureFeature; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DeathInfoPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DeathInfoPacket.java index 63a6318..f70ae08 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DeathInfoPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DeathInfoPacket.java @@ -12,8 +12,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class DeathInfoPacket implements BedrockPacket { - public String causeAttackName; - public final List messageList = new ObjectArrayList<>(); + private String causeAttackName; + private final List messageList = new ObjectArrayList<>(); @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DebugDrawerPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DebugDrawerPacket.java index 44d3f89..5988e2d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DebugDrawerPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DebugDrawerPacket.java @@ -17,7 +17,7 @@ @ToString(doNotUseGetters = true) public class DebugDrawerPacket implements BedrockPacket { - public final List shapes = new ObjectArrayList<>(); + private final List shapes = new ObjectArrayList<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DebugInfoPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DebugInfoPacket.java index 7b9bf7e..b89649a 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DebugInfoPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DebugInfoPacket.java @@ -9,8 +9,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class DebugInfoPacket implements BedrockPacket { - public long uniqueEntityId; - public String data; + private long uniqueEntityId; + private String data; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DimensionDataPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DimensionDataPacket.java index 3d78775..77ee9e5 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DimensionDataPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DimensionDataPacket.java @@ -21,7 +21,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class DimensionDataPacket implements BedrockPacket { - public final List definitions = new ObjectArrayList<>(); + private final List definitions = new ObjectArrayList<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DisconnectPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DisconnectPacket.java index 46a0bf7..1830ee9 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DisconnectPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/DisconnectPacket.java @@ -10,13 +10,13 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class DisconnectPacket implements BedrockPacket { - public DisconnectFailReason reason = DisconnectFailReason.UNKNOWN; - public boolean messageSkipped; - public CharSequence kickMessage; + private DisconnectFailReason reason = DisconnectFailReason.UNKNOWN; + private boolean messageSkipped; + private CharSequence kickMessage; /** * @since v712 */ - public CharSequence filteredMessage = ""; + private CharSequence filteredMessage = ""; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EditorNetworkPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EditorNetworkPacket.java index 5d043ba..8f70716 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EditorNetworkPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EditorNetworkPacket.java @@ -9,11 +9,11 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class EditorNetworkPacket implements BedrockPacket { - public Object payload; // NBT like + private Object payload; // NBT like /** * @since v712 */ - public boolean routeToManager; + private boolean routeToManager; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EduUriResourcePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EduUriResourcePacket.java index fff698c..8349612 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EduUriResourcePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EduUriResourcePacket.java @@ -10,7 +10,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class EduUriResourcePacket implements BedrockPacket { - public EduSharedUriResource eduSharedUriResource; + private EduSharedUriResource eduSharedUriResource; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EducationSettingsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EducationSettingsPacket.java index 203dea3..2728010 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EducationSettingsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EducationSettingsPacket.java @@ -13,25 +13,25 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class EducationSettingsPacket implements BedrockPacket { - public String codeBuilderUri; - public String codeBuilderTitle; - public boolean canResizeCodeBuilder; + private String codeBuilderUri; + private String codeBuilderTitle; + private boolean canResizeCodeBuilder; /** * @since v465 */ - public boolean disableLegacyTitle; + private boolean disableLegacyTitle; /** * @since v465 */ - public String postProcessFilter; + private String postProcessFilter; /** * @since v465 */ - public String screenshotBorderPath; - public OptionalBoolean entityCapabilities; - public Optional overrideUri; - public boolean quizAttached; - public OptionalBoolean externalLinkSettings; + private String screenshotBorderPath; + private OptionalBoolean entityCapabilities; + private Optional overrideUri; + private boolean quizAttached; + private OptionalBoolean externalLinkSettings; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EmoteListPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EmoteListPacket.java index c64ce2a..f489334 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EmoteListPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EmoteListPacket.java @@ -13,8 +13,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class EmoteListPacket implements BedrockPacket { - public long runtimeEntityId; - public final List pieceIds = new ObjectArrayList<>(); + private long runtimeEntityId; + private final List pieceIds = new ObjectArrayList<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EmotePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EmotePacket.java index f45a2c7..34654e2 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EmotePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EmotePacket.java @@ -13,21 +13,21 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class EmotePacket implements BedrockPacket { - public long runtimeEntityId; + private long runtimeEntityId; /** * @since v589 */ - public String xuid; + private String xuid; /** * @since 589 */ - public String platformId; - public String emoteId; - public final Set flags = EnumSet.noneOf(EmoteFlag.class); + private String platformId; + private String emoteId; + private final Set flags = EnumSet.noneOf(EmoteFlag.class); /** * @since v729 */ - public int emoteDuration; + private int emoteDuration; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EntityEventPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EntityEventPacket.java index a0b0919..df63508 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EntityEventPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EntityEventPacket.java @@ -3,6 +3,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityEventType; import org.cloudburstmc.protocol.common.PacketSignal; @@ -10,9 +12,14 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class EntityEventPacket implements BedrockPacket { - public long runtimeEntityId; - public EntityEventType type; - public int data; + private long runtimeEntityId; + private EntityEventType type; + private int data; + /** + * @since v975 + */ + @Nullable + private Vector3f fireAtPosition; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EntityFallPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EntityFallPacket.java index e583362..4118209 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EntityFallPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EntityFallPacket.java @@ -9,9 +9,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class EntityFallPacket implements BedrockPacket { - public long runtimeEntityId; - public float fallDistance; - public boolean inVoid; + private long runtimeEntityId; + private float fallDistance; + private boolean inVoid; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EntityPickRequestPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EntityPickRequestPacket.java index d94f22d..0cc5c67 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EntityPickRequestPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EntityPickRequestPacket.java @@ -9,12 +9,12 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class EntityPickRequestPacket implements BedrockPacket { - public long runtimeEntityId; - public int hotbarSlot; + private long runtimeEntityId; + private int hotbarSlot; /** * @since v465 */ - public boolean withData; + private boolean withData; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EventPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EventPacket.java index 566d0c0..8b28cac 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EventPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/EventPacket.java @@ -10,9 +10,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class EventPacket implements BedrockPacket { - public long uniqueEntityId; - public boolean usePlayerId; - public EventData eventData; + private long uniqueEntityId; + private boolean usePlayerId; + private EventData eventData; @Override public final PacketSignal handle(BedrockPacketHandler handler) { @@ -23,31 +23,6 @@ public BedrockPacketType getPacketType() { return BedrockPacketType.EVENT; } - public enum Event { - ACHIEVEMENT_AWARDED, - ENTITY_INTERACT, - PORTAL_BUILT, - PORTAL_USED, - MOB_KILLED, - CAULDRON_USED, - PLAYER_DEATH, - BOSS_KILLED, - /** - * @deprecated use {@link AgentActionEventPacket} - */ - @Deprecated - AGENT_COMMAND, - AGENT_CREATED, - PATTERN_REMOVED, - SLASH_COMMAND_EXECUTED, - FISH_BUCKETED, - MOB_BORN, - PET_DIED, - CAULDRON_BLOCK_USED, - COMPOSTER_BLOCK_USED, - BELL_BLOCK_USED - } - @Override public EventPacket clone() { try { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ExplodePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ExplodePacket.java index cac535a..74304b5 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ExplodePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ExplodePacket.java @@ -14,9 +14,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ExplodePacket implements BedrockPacket { - public final List records = new ObjectArrayList<>(); - public Vector3f position; - public float radius; + private final List records = new ObjectArrayList<>(); + private Vector3f position; + private float radius; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/FeatureRegistryPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/FeatureRegistryPacket.java index ba14850..dad8fcd 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/FeatureRegistryPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/FeatureRegistryPacket.java @@ -18,7 +18,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class FeatureRegistryPacket implements BedrockPacket { - public final List features = new ObjectArrayList<>(); + private final List features = new ObjectArrayList<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/FilterTextPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/FilterTextPacket.java index 0e85bf1..3a88af6 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/FilterTextPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/FilterTextPacket.java @@ -9,8 +9,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class FilterTextPacket implements BedrockPacket { - public String text; - public boolean fromServer; + private String text; + private boolean fromServer; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GameRulesChangedPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GameRulesChangedPacket.java index bae7283..17867df 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GameRulesChangedPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GameRulesChangedPacket.java @@ -13,7 +13,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class GameRulesChangedPacket implements BedrockPacket { - public final List> gameRules = new ObjectArrayList<>(); + private final List> gameRules = new ObjectArrayList<>(); @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GameTestRequestPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GameTestRequestPacket.java index 31c0be7..54b1898 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GameTestRequestPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GameTestRequestPacket.java @@ -10,13 +10,13 @@ @EqualsAndHashCode(doNotUseGetters = true, callSuper = false) @ToString(doNotUseGetters = true) public class GameTestRequestPacket implements BedrockPacket { - public int maxTestsPerBatch; - public int repeatCount; - public int rotation; - public boolean stoppingOnFailure; - public Vector3i testPos; - public int testsPerRow; - public String testName; + private int maxTestsPerBatch; + private int repeatCount; + private int rotation; + private boolean stoppingOnFailure; + private Vector3i testPos; + private int testsPerRow; + private String testName; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GameTestResultsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GameTestResultsPacket.java index dd9aaa2..56f2806 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GameTestResultsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GameTestResultsPacket.java @@ -9,9 +9,9 @@ @EqualsAndHashCode(doNotUseGetters = true, callSuper = false) @ToString(doNotUseGetters = true) public class GameTestResultsPacket implements BedrockPacket { - public boolean successful; - public String error; - public String testName; + private boolean successful; + private String error; + private String testName; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GraphicsParameterOverridePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GraphicsParameterOverridePacket.java index 62c8bb1..9a2b5a9 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GraphicsParameterOverridePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GraphicsParameterOverridePacket.java @@ -3,6 +3,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.GraphicsOverrideParameterType; import org.cloudburstmc.protocol.common.PacketSignal; @@ -19,10 +20,25 @@ @ToString(doNotUseGetters = true) public class GraphicsParameterOverridePacket implements BedrockPacket { - public String biomeIdentifier; - public GraphicsOverrideParameterType parameterType; - public Map values; - public boolean reset; + private String biomeIdentifier; + private GraphicsOverrideParameterType parameterType; + private Map values; + private boolean reset; + /** + * @since v924 + */ + @Nullable + private Float floatValue; + /** + * @since v924 + */ + @Nullable + private Vector3f vec3Value; + /** + * @since v1001 + */ + @Nullable + private String playerIdentifier; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GuiDataPickItemPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GuiDataPickItemPacket.java index 887c717..3ef0150 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GuiDataPickItemPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/GuiDataPickItemPacket.java @@ -9,9 +9,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class GuiDataPickItemPacket implements BedrockPacket { - public String description; - public String itemEffects; - public int hotbarSlot; + private String description; + private String itemEffects; + private int hotbarSlot; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/HurtArmorPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/HurtArmorPacket.java index 981eb6d..f89bc3c 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/HurtArmorPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/HurtArmorPacket.java @@ -9,12 +9,12 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class HurtArmorPacket implements BedrockPacket { - public int cause; - public int damage; + private int cause; + private int damage; /** * @since v465 */ - public long armorSlots; + private long armorSlots; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/InteractPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/InteractPacket.java index 7d88a56..99f3ceb 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/InteractPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/InteractPacket.java @@ -10,9 +10,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class InteractPacket implements BedrockPacket { - public Action action; - public long runtimeEntityId; - public Vector3f mousePosition; + private Action action; + private long runtimeEntityId; + private Vector3f mousePosition; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/InventoryContentPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/InventoryContentPacket.java index 4ee5924..14f55da 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/InventoryContentPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/InventoryContentPacket.java @@ -15,21 +15,21 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class InventoryContentPacket implements BedrockPacket { - public List contents = new ObjectArrayList<>(); - public int containerId; + private List contents = new ObjectArrayList<>(); + private int containerId; /** * @since v712 */ - public FullContainerName containerNameData = new FullContainerName(ContainerSlotType.ANVIL_INPUT, null); + private FullContainerName containerNameData = new FullContainerName(ContainerSlotType.ANVIL_INPUT, null); /** * @since v729 * @deprecated since v748. Use storageItem ItemData size instead. */ - public int dynamicContainerSize; + private int dynamicContainerSize; /** * @since v748 */ - public ItemData storageItem = ItemData.AIR; + private ItemData storageItem = ItemData.AIR; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/InventorySlotPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/InventorySlotPacket.java index 58a7f7e..6a518b8 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/InventorySlotPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/InventorySlotPacket.java @@ -12,22 +12,22 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class InventorySlotPacket implements BedrockPacket { - public int containerId; - public int slot; - public ItemData item; + private int containerId; + private int slot; + private ItemData item; /** * @since v712 */ - public FullContainerName containerNameData = new FullContainerName(ContainerSlotType.ANVIL_INPUT, null); + private FullContainerName containerNameData = new FullContainerName(ContainerSlotType.ANVIL_INPUT, null); /** * @since v729 * @deprecated since v748. Use storageItem ItemData size instead. */ - public int dynamicContainerSize; + private int dynamicContainerSize; /** * @since v748 */ - public ItemData storageItem = ItemData.AIR; + private ItemData storageItem = ItemData.AIR; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/InventoryTransactionPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/InventoryTransactionPacket.java index 4f4ecef..29a788c 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/InventoryTransactionPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/InventoryTransactionPacket.java @@ -20,25 +20,25 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class InventoryTransactionPacket implements BedrockPacket { - public int legacyRequestId; - public final List legacySlots = new ObjectArrayList<>(); - public final List actions = new ObjectArrayList<>(); - public InventoryTransactionType transactionType; - public int actionType; - public long runtimeEntityId; - public Vector3i blockPosition; - public int blockFace; - public int hotbarSlot; - public ItemData itemInHand; - public Vector3f playerPosition; - public Vector3f clickPosition; - public Vector3f headPosition; + private int legacyRequestId; + private final List legacySlots = new ObjectArrayList<>(); + private final List actions = new ObjectArrayList<>(); + private InventoryTransactionType transactionType; + private int actionType; + private long runtimeEntityId; + private Vector3i blockPosition; + private int blockFace; + private int hotbarSlot; + private ItemData itemInHand; + private Vector3f playerPosition; + private Vector3f clickPosition; + private Vector3f headPosition; /** * @since v407 * @deprecated v431 */ @Deprecated - public boolean usingNetIds; + private boolean usingNetIds; /** * Block definition of block being picked. * ItemUseInventoryTransaction only @@ -46,16 +46,20 @@ public class InventoryTransactionPacket implements BedrockPacket { * @param blockDefinition block definition of block * @return block definition of block */ - public BlockDefinition blockDefinition; + private BlockDefinition blockDefinition; /** * @since v712 */ - public ItemUseTransaction.TriggerType triggerType; + private ItemUseTransaction.TriggerType triggerType; /** * @since v712 */ - public ItemUseTransaction.PredictedResult clientInteractPrediction; + private ItemUseTransaction.PredictedResult clientInteractPrediction; + /** + * @since v944 + */ + private int clientCooldownState; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ItemComponentPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ItemComponentPacket.java index 5b56e12..c763e89 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ItemComponentPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ItemComponentPacket.java @@ -18,7 +18,7 @@ @ToString(doNotUseGetters = true) public class ItemComponentPacket implements BedrockPacket { - public final List items = new ObjectArrayList<>(); + private final List items = new ObjectArrayList<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ItemFrameDropItemPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ItemFrameDropItemPacket.java index 324e0e3..77cebdc 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ItemFrameDropItemPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ItemFrameDropItemPacket.java @@ -14,7 +14,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ItemFrameDropItemPacket implements BedrockPacket { - public Vector3i blockPosition; + private Vector3i blockPosition; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ItemStackRequestPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ItemStackRequestPacket.java index 511f9b2..e29a71b 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ItemStackRequestPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ItemStackRequestPacket.java @@ -13,7 +13,7 @@ @EqualsAndHashCode(callSuper = false) @ToString(doNotUseGetters = true) public class ItemStackRequestPacket implements BedrockPacket { - public final List requests = new ArrayList<>(); + private final List requests = new ArrayList<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ItemStackResponsePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ItemStackResponsePacket.java index c2a6eda..58f7893 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ItemStackResponsePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ItemStackResponsePacket.java @@ -19,7 +19,7 @@ @EqualsAndHashCode(callSuper = false) @ToString(doNotUseGetters = true) public class ItemStackResponsePacket implements BedrockPacket { - public final List entries = new ArrayList<>(); + private final List entries = new ArrayList<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/JigsawStructureDataPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/JigsawStructureDataPacket.java index beeb750..1e36391 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/JigsawStructureDataPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/JigsawStructureDataPacket.java @@ -10,7 +10,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class JigsawStructureDataPacket implements BedrockPacket { - public NbtMap jigsawStructureDataTag; + private NbtMap jigsawStructureDataTag; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LabTablePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LabTablePacket.java index b924837..b604b5c 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LabTablePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LabTablePacket.java @@ -12,9 +12,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class LabTablePacket implements BedrockPacket { - public LabTableType type; - public Vector3i position; - public LabTableReactionType reactionType; + private LabTableType type; + private Vector3i position; + private LabTableReactionType reactionType; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LecternUpdatePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LecternUpdatePacket.java index 1f53b48..9708f0d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LecternUpdatePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LecternUpdatePacket.java @@ -10,14 +10,14 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class LecternUpdatePacket implements BedrockPacket { - public int page; - public int totalPages; - public Vector3i blockPosition; + private int page; + private int totalPages; + private Vector3i blockPosition; /** * @deprecated since v662 */ @Deprecated - public boolean droppingBook; + private boolean droppingBook; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LessonProgressPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LessonProgressPacket.java index 332dd33..ff8d7dc 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LessonProgressPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LessonProgressPacket.java @@ -10,9 +10,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class LessonProgressPacket implements BedrockPacket { - public LessonAction action; - public int score; - public String activityId; + private LessonAction action; + private int score; + private String activityId; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelChunkPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelChunkPacket.java index d895c96..369740e 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelChunkPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelChunkPacket.java @@ -13,27 +13,27 @@ @ToString(doNotUseGetters = true, exclude = {"data"}) @EqualsAndHashCode(doNotUseGetters = true, callSuper = false) public class LevelChunkPacket extends AbstractReferenceCounted implements BedrockPacket { - public int chunkX; - public int chunkZ; - public int subChunksLength; - public boolean cachingEnabled; + private int chunkX; + private int chunkZ; + private int subChunksLength; + private boolean cachingEnabled; /** * @since v471 */ - public boolean requestSubChunks; + private boolean requestSubChunks; /** * @since v485 */ - public int subChunkLimit; + private int subChunkLimit; - public final LongList blobIds = new LongArrayList(); + private final LongList blobIds = new LongArrayList(); - public ByteBuf data; + private ByteBuf data; /** * @since v649 */ - public int dimension; + private int dimension; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelEventGenericPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelEventGenericPacket.java index 0c789a3..5a40b71 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelEventGenericPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelEventGenericPacket.java @@ -11,8 +11,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class LevelEventGenericPacket implements BedrockPacket { - public LevelEventType type; - public Object tag; + private LevelEventType type; + private Object tag; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelEventPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelEventPacket.java index af306d8..05a67f3 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelEventPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelEventPacket.java @@ -11,9 +11,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class LevelEventPacket implements BedrockPacket { - public LevelEventType type; - public Vector3f position; - public int data; + private LevelEventType type; + private Vector3f position; + private int data; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelSoundEvent1Packet.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelSoundEvent1Packet.java index 09c9244..2573fd3 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelSoundEvent1Packet.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelSoundEvent1Packet.java @@ -15,12 +15,12 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class LevelSoundEvent1Packet implements BedrockPacket { - public SoundEvent sound; - public Vector3f position; - public int extraData; - public int pitch; - public boolean babySound; - public boolean relativeVolumeDisabled; + private SoundEvent sound; + private Vector3f position; + private int extraData; + private int pitch; + private boolean babySound; + private boolean relativeVolumeDisabled; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelSoundEvent2Packet.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelSoundEvent2Packet.java index 29ed859..ea74c18 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelSoundEvent2Packet.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelSoundEvent2Packet.java @@ -15,12 +15,12 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class LevelSoundEvent2Packet implements BedrockPacket { - public SoundEvent sound; - public Vector3f position; - public int extraData; - public String identifier; - public boolean babySound; - public boolean relativeVolumeDisabled; + private SoundEvent sound; + private Vector3f position; + private int extraData; + private String identifier; + private boolean babySound; + private boolean relativeVolumeDisabled; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelSoundEventPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelSoundEventPacket.java index 00ed1ea..992f62b 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelSoundEventPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LevelSoundEventPacket.java @@ -3,6 +3,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.SoundEvent; import org.cloudburstmc.protocol.common.PacketSignal; @@ -11,13 +12,18 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class LevelSoundEventPacket implements BedrockPacket { - public SoundEvent sound; - public Vector3f position; - public int extraData; - public String identifier; - public boolean babySound; - public boolean relativeVolumeDisabled; - public long entityUniqueId; + private SoundEvent sound; + private Vector3f position; + private int extraData; + private String identifier; + private boolean babySound; + private boolean relativeVolumeDisabled; + private long entityUniqueId; + /** + * @since v975 + */ + @Nullable + private Vector3f fireAtPosition; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LocatorBarPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LocatorBarPacket.java new file mode 100644 index 0000000..fe901d1 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LocatorBarPacket.java @@ -0,0 +1,57 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import lombok.Value; +import org.cloudburstmc.protocol.bedrock.data.LocatorBarWaypoint; +import org.cloudburstmc.protocol.common.PacketSignal; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +/** + * Syncs LocatorBar changes on the server with the client. + * + * @since v944 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class LocatorBarPacket implements BedrockPacket { + + private List waypoints = new ArrayList<>(); + + @Override + public final PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + public BedrockPacketType getPacketType() { + return BedrockPacketType.LOCATOR_BAR; + } + + @Override + public LocatorBarPacket clone() { + try { + return (LocatorBarPacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } + + @Value + public static class Payload { + Action actionFlag; + UUID groupHandle; + LocatorBarWaypoint waypoint; + } + + public enum Action { + NONE, + ADD, + REMOVE, + UPDATE + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LoginPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LoginPacket.java index 7cc81b9..328152d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LoginPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/LoginPacket.java @@ -13,17 +13,17 @@ @EqualsAndHashCode(doNotUseGetters = true, callSuper = false) @ToString(doNotUseGetters = true) public class LoginPacket implements BedrockPacket { - public int protocolVersion; + private int protocolVersion; /** * The JWT payload signed by Minecraft's authentication server. * Assuming this is a valid signature, it can be trusted to contain the player's identity and other information. */ - public AuthPayload authPayload; + private AuthPayload authPayload; /** * The JWT payload signed by the client. * The client can modify this, so it should not be trusted. */ - public String clientJwt; + private String clientJwt; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MapCreateLockedCopyPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MapCreateLockedCopyPacket.java index 63b863e..1104cae 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MapCreateLockedCopyPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MapCreateLockedCopyPacket.java @@ -9,8 +9,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class MapCreateLockedCopyPacket implements BedrockPacket { - public long originalMapId; - public long newMapId; + private long originalMapId; + private long newMapId; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MapInfoRequestPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MapInfoRequestPacket.java index a00027e..41057b5 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MapInfoRequestPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MapInfoRequestPacket.java @@ -13,13 +13,13 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class MapInfoRequestPacket implements BedrockPacket { - public long uniqueMapId; + private long uniqueMapId; /** * Sends pixels that are generated by the client to the server. * * @since 1.19.20 */ - public final List pixels = new ObjectArrayList<>(); + private final List pixels = new ObjectArrayList<>(); @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MobArmorEquipmentPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MobArmorEquipmentPacket.java index 09f1b53..c76dd99 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MobArmorEquipmentPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MobArmorEquipmentPacket.java @@ -10,15 +10,15 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class MobArmorEquipmentPacket implements BedrockPacket { - public long runtimeEntityId; - public ItemData helmet; - public ItemData chestplate; - public ItemData leggings; - public ItemData boots; + private long runtimeEntityId; + private ItemData helmet; + private ItemData chestplate; + private ItemData leggings; + private ItemData boots; /** * @since v712 */ - public ItemData body; + private ItemData body; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MobEffectPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MobEffectPacket.java index e3c69bd..a45554f 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MobEffectPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MobEffectPacket.java @@ -9,20 +9,20 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class MobEffectPacket implements BedrockPacket { - public long runtimeEntityId; - public Event event; - public int effectId; - public int amplifier; - public boolean particles; - public int duration; + private long runtimeEntityId; + private Event event; + private int effectId; + private int amplifier; + private boolean particles; + private int duration; /** * @since v662 */ - public long tick; + private long tick; /** - * @since v898 + * @since v897 */ - public boolean ambient; + private boolean ambient; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MobEquipmentPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MobEquipmentPacket.java index fbd303b..757e070 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MobEquipmentPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MobEquipmentPacket.java @@ -10,11 +10,11 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class MobEquipmentPacket implements BedrockPacket { - public long runtimeEntityId; - public ItemData item; - public int inventorySlot; - public int hotbarSlot; - public int containerId; + private long runtimeEntityId; + private ItemData item; + private int inventorySlot; + private int hotbarSlot; + private int containerId; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ModalFormRequestPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ModalFormRequestPacket.java index d93fe23..e72acbc 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ModalFormRequestPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ModalFormRequestPacket.java @@ -9,8 +9,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ModalFormRequestPacket implements BedrockPacket { - public int formId; - public String formData; + private int formId; + private String formData; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ModalFormResponsePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ModalFormResponsePacket.java index c72262d..54ae1e6 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ModalFormResponsePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ModalFormResponsePacket.java @@ -12,15 +12,15 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ModalFormResponsePacket implements BedrockPacket { - public int formId; - public String formData; + private int formId; + private String formData; /** * The reason for why the form response was cancelled. * * @since 1.19.20 */ @SuppressWarnings("OptionalUsedAsFieldOrParameterType") - public Optional cancelReason; + private Optional cancelReason; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MotionPredictionHintsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MotionPredictionHintsPacket.java index 5cc2d09..ad9c8d3 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MotionPredictionHintsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MotionPredictionHintsPacket.java @@ -21,7 +21,7 @@ public class MotionPredictionHintsPacket implements BedrockPacket { * @param runtimeEntityId runtime ID * @return runtime ID */ - public long runtimeEntityId; + private long runtimeEntityId; /** * Motion to set onto the specified entity @@ -29,7 +29,7 @@ public class MotionPredictionHintsPacket implements BedrockPacket { * @param motion motion of entity * @return motion of entity */ - public Vector3f motion; + private Vector3f motion; /** * If the entity is on the ground. (Not falling or jumping) @@ -37,7 +37,7 @@ public class MotionPredictionHintsPacket implements BedrockPacket { * @param onGround is entity on the ground * @return is entity on the ground */ - public boolean onGround; + private boolean onGround; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MoveEntityAbsolutePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MoveEntityAbsolutePacket.java index b0a7100..cf8f70e 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MoveEntityAbsolutePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MoveEntityAbsolutePacket.java @@ -10,12 +10,16 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class MoveEntityAbsolutePacket implements BedrockPacket { - public long runtimeEntityId; - public Vector3f position; - public Vector3f rotation; - public boolean onGround; - public boolean teleported; - public boolean forceMove; + private long runtimeEntityId; + private Vector3f position; + private Vector3f rotation; + private boolean onGround; + private boolean teleported; + private boolean forceMove; + /** + * @since v975 + */ + private boolean forceCompletion; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MoveEntityDeltaPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MoveEntityDeltaPacket.java index fde7dec..e54a6e1 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MoveEntityDeltaPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MoveEntityDeltaPacket.java @@ -10,21 +10,21 @@ @Data @EqualsAndHashCode(doNotUseGetters = true) public class MoveEntityDeltaPacket implements BedrockPacket { - public long runtimeEntityId; + private long runtimeEntityId; - public final Set flags = EnumSet.noneOf(Flag.class); + private final Set flags = EnumSet.noneOf(Flag.class); - public int deltaX; - public int deltaY; - public int deltaZ; + private int deltaX; + private int deltaY; + private int deltaZ; - public float x; - public float y; - public float z; + private float x; + private float y; + private float z; - public float pitch; - public float yaw; - public float headYaw; + private float pitch; + private float yaw; + private float headYaw; @Override public final PacketSignal handle(BedrockPacketHandler handler) { @@ -51,7 +51,8 @@ public enum Flag { HAS_HEAD_YAW, ON_GROUND, TELEPORTING, - FORCE_MOVE_LOCAL_ENTITY + FORCE_MOVE_LOCAL_ENTITY, + FORCE_COMPLETION } @Override diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MovePlayerPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MovePlayerPacket.java index 5350795..b3d2439 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MovePlayerPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MovePlayerPacket.java @@ -12,15 +12,15 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class MovePlayerPacket implements BedrockPacket { - public long runtimeEntityId; - public Vector3f position; - public Vector3f rotation; - public Mode mode; - public boolean onGround; - public long ridingRuntimeEntityId; - public TeleportationCause teleportationCause; - public int entityType; - public long tick; + private long runtimeEntityId; + private Vector3f position; + private Vector3f rotation; + private Mode mode; + private boolean onGround; + private long ridingRuntimeEntityId; + private TeleportationCause teleportationCause; + private int entityType; + private long tick; @Override public final PacketSignal handle(BedrockPacketHandler handler) { @@ -45,9 +45,9 @@ public enum TeleportationCause { COMMAND, BEHAVIOR; - public static final InternalLogger log = InternalLoggerFactory.getInstance(TeleportationCause.class); + private static final InternalLogger log = InternalLoggerFactory.getInstance(TeleportationCause.class); - public static final TeleportationCause[] VALUES = values(); + private static final TeleportationCause[] VALUES = values(); public static TeleportationCause byId(int id) { if (id >= 0 && id < VALUES.length) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MovementEffectPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MovementEffectPacket.java index bb5f913..20480a6 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MovementEffectPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MovementEffectPacket.java @@ -10,10 +10,10 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class MovementEffectPacket implements BedrockPacket { - public long entityRuntimeId; - public MovementEffectType effectType; - public int duration; - public long tick; + private long entityRuntimeId; + private MovementEffectType effectType; + private int duration; + private long tick; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MovementPredictionSyncPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MovementPredictionSyncPacket.java index 8176b8c..e353d0a 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MovementPredictionSyncPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MovementPredictionSyncPacket.java @@ -13,19 +13,37 @@ @Data @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) +/* + * ClientMovementPredictionSyncPacket + */ public class MovementPredictionSyncPacket implements BedrockPacket { - public long runtimeEntityId; - - public final Set flags = new ObjectOpenHashSet<>(); - public Vector3f boundingBox; - - public float speed; - public float underwaterSpeed; - public float lavaSpeed; - public float jumpStrength; - public float health; - public float hunger; - public boolean flying; + private long runtimeEntityId; + + private final Set flags = new ObjectOpenHashSet<>(); + private Vector3f boundingBox; + + private float speed; + private float underwaterSpeed; + private float lavaSpeed; + private float jumpStrength; + private float health; + private float hunger; + /** + * @since v975 + */ + @Deprecated + private float unknown1; + /** + * @since v975 + */ + @Deprecated + private float unknown2; + /** + * @since v975 + */ + @Deprecated + private float unknown3; + private boolean flying; @Override diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MultiplayerSettingsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MultiplayerSettingsPacket.java index c2f5cc0..bae36f8 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MultiplayerSettingsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/MultiplayerSettingsPacket.java @@ -10,7 +10,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class MultiplayerSettingsPacket implements BedrockPacket { - public MultiplayerMode mode; + private MultiplayerMode mode; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NetworkChunkPublisherUpdatePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NetworkChunkPublisherUpdatePacket.java index 0b405dc..ecab104 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NetworkChunkPublisherUpdatePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NetworkChunkPublisherUpdatePacket.java @@ -14,15 +14,15 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class NetworkChunkPublisherUpdatePacket implements BedrockPacket { - public Vector3i position; - public int radius; + private Vector3i position; + private int radius; /** * Lets the client know which chunks have been saved, and need * requesting whilst client chunk generation is enabled. * * @since 1.19.20 */ - public final List savedChunks = new ObjectArrayList<>(); + private final List savedChunks = new ObjectArrayList<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NetworkSettingsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NetworkSettingsPacket.java index ea4438d..75ea8a3 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NetworkSettingsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NetworkSettingsPacket.java @@ -15,28 +15,28 @@ public class NetworkSettingsPacket implements BedrockPacket { /** * The smallest amount of bytes that should be compressed by the client. 0-65535 */ - public int compressionThreshold; + private int compressionThreshold; /** * Set the compression type to be used on the connection. * * @since v551 */ - public PacketCompressionAlgorithm compressionAlgorithm; + private PacketCompressionAlgorithm compressionAlgorithm; /** * Enable client throttling of players out of the threshold. Players out of the threshold will not be ticked on the * client, reducing the performance hit on lower end devices when in densely populated areas. * * @since v554 */ - public boolean clientThrottleEnabled; + private boolean clientThrottleEnabled; /** * @since v554 */ - public int clientThrottleThreshold; + private int clientThrottleThreshold; /** * @since v554 */ - public float clientThrottleScalar; + private float clientThrottleScalar; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NetworkStackLatencyPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NetworkStackLatencyPacket.java index 703ce0e..84ab6bd 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NetworkStackLatencyPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NetworkStackLatencyPacket.java @@ -9,8 +9,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class NetworkStackLatencyPacket implements BedrockPacket { - public long timestamp; - public boolean fromServer; + private long timestamp; + private boolean fromServer; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NpcDialoguePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NpcDialoguePacket.java index 9d2bf57..b21ef26 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NpcDialoguePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NpcDialoguePacket.java @@ -8,12 +8,12 @@ @EqualsAndHashCode(doNotUseGetters = true, callSuper = false) public class NpcDialoguePacket implements BedrockPacket { - public long uniqueEntityId; - public Action action; - public String dialogue; - public String sceneName; - public String npcName; - public String actionJson; + private long uniqueEntityId; + private Action action; + private String dialogue; + private String sceneName; + private String npcName; + private String actionJson; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NpcRequestPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NpcRequestPacket.java index 68cccaa..4e57d28 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NpcRequestPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/NpcRequestPacket.java @@ -10,14 +10,14 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class NpcRequestPacket implements BedrockPacket { - public long runtimeEntityId; - public NpcRequestType requestType; - public String command; - public int actionType; + private long runtimeEntityId; + private NpcRequestType requestType; + private String command; + private int actionType; /** * @since v448 */ - public String sceneName; + private String sceneName; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/OnScreenTextureAnimationPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/OnScreenTextureAnimationPacket.java index 0b4fe0f..d706f24 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/OnScreenTextureAnimationPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/OnScreenTextureAnimationPacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class OnScreenTextureAnimationPacket implements BedrockPacket { - public long effectId; + private long effectId; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/OpenSignPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/OpenSignPacket.java index a7bb1cb..33f2a59 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/OpenSignPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/OpenSignPacket.java @@ -15,8 +15,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class OpenSignPacket implements BedrockPacket { - public Vector3i position; - public boolean frontSide; + private Vector3i position; + private boolean frontSide; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PacketViolationWarningPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PacketViolationWarningPacket.java index ebe757a..dc4d8b8 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PacketViolationWarningPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PacketViolationWarningPacket.java @@ -11,10 +11,10 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class PacketViolationWarningPacket implements BedrockPacket { - public PacketViolationType type; - public PacketViolationSeverity severity; - public int packetCauseId; - public String context; + private PacketViolationType type; + private PacketViolationSeverity severity; + private int packetCauseId; + private String context; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PartyChangedPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PartyChangedPacket.java new file mode 100644 index 0000000..c110dcc --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PartyChangedPacket.java @@ -0,0 +1,49 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import lombok.Value; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.cloudburstmc.protocol.common.PacketSignal; + +/** + * Sent by the client to provide additional client metadata. + * + * @since v944 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class PartyChangedPacket implements BedrockPacket { + + @Nullable + private PartyInfo party; + + @Value + public static class PartyInfo { + String partyId; + /** + * @since v975 + */ + boolean isPartyLeader; + } + + @Override + public final PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + public BedrockPacketType getPacketType() { + return BedrockPacketType.PARTY_CHANGED; + } + + @Override + public PartyChangedPacket clone() { + try { + return (PartyChangedPacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PartyDestinationCookieResponsePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PartyDestinationCookieResponsePacket.java new file mode 100644 index 0000000..5442b29 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PartyDestinationCookieResponsePacket.java @@ -0,0 +1,39 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.cloudburstmc.protocol.common.PacketSignal; + +/** + * Sent by the client to the server with a party destination cookie response. + * + * @since v1001 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class PartyDestinationCookieResponsePacket implements BedrockPacket { + + private String cookie; + private boolean accepted; + + @Override + public PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + @Override + public BedrockPacketType getPacketType() { + return BedrockPacketType.PARTY_DESTINATION_COOKIE_RESPONSE; + } + + @Override + public BedrockPacket clone() { + try { + return (PartyDestinationCookieResponsePacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PhotoInfoRequestPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PhotoInfoRequestPacket.java index 588426d..2bd578a 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PhotoInfoRequestPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PhotoInfoRequestPacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class PhotoInfoRequestPacket implements BedrockPacket { - public long photoId; + private long photoId; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PhotoTransferPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PhotoTransferPacket.java index d2a31db..4f7d0f4 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PhotoTransferPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PhotoTransferPacket.java @@ -10,25 +10,25 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class PhotoTransferPacket implements BedrockPacket { - public String name; - public byte[] data; - public String bookId; + private String name; + private byte[] data; + private String bookId; /** * @since v465 */ - public PhotoType photoType; + private PhotoType photoType; /** * @since v465 */ - public PhotoType sourceType; + private PhotoType sourceType; /** * @since v465 */ - public long ownerId; + private long ownerId; /** * @since v465 */ - public String newPhotoName; + private String newPhotoName; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlaySoundPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlaySoundPacket.java index 52a6c50..70a5739 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlaySoundPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlaySoundPacket.java @@ -3,6 +3,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.common.PacketSignal; @@ -10,10 +11,15 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class PlaySoundPacket implements BedrockPacket { - public String sound; - public Vector3f position; - public float volume; - public float pitch; + private String sound; + private Vector3f position; + private float volume; + private float pitch; + /** + * @since v975 + */ + @Nullable + private Long serverSoundHandle; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayStatusPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayStatusPacket.java index aea5193..b14f6ba 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayStatusPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayStatusPacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class PlayStatusPacket implements BedrockPacket { - public Status status; + private Status status; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerActionPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerActionPacket.java index 9a0b8e9..ec8072d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerActionPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerActionPacket.java @@ -11,14 +11,14 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class PlayerActionPacket implements BedrockPacket { - public long runtimeEntityId; - public PlayerActionType action; - public Vector3i blockPosition; + private long runtimeEntityId; + private PlayerActionType action; + private Vector3i blockPosition; /** * @since v526 */ - public Vector3i resultPosition; - public int face; + private Vector3i resultPosition; + private int face; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerArmorDamagePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerArmorDamagePacket.java index 097dd88..b11e31f 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerArmorDamagePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerArmorDamagePacket.java @@ -13,8 +13,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class PlayerArmorDamagePacket implements BedrockPacket { - public final Set flags = EnumSet.noneOf(PlayerArmorDamageFlag.class); - public final int[] damage = new int[5]; + private final Set flags = EnumSet.noneOf(PlayerArmorDamageFlag.class); + private final int[] damage = new int[5]; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerAuthInputPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerAuthInputPacket.java index 4174950..cbd2580 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerAuthInputPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerAuthInputPacket.java @@ -19,64 +19,64 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class PlayerAuthInputPacket implements BedrockPacket { - public Vector3f rotation; // head rot after motion - public Vector3f position; - public Vector2f motion; - public final Set inputData = EnumSet.noneOf(PlayerAuthInputData.class); - public InputMode inputMode; - public ClientPlayMode playMode; + private Vector3f rotation; // head rot after motion + private Vector3f position; + private Vector2f motion; + private final Set inputData = EnumSet.noneOf(PlayerAuthInputData.class); + private InputMode inputMode; + private ClientPlayMode playMode; /** * @deprecated since v748 */ - public Vector3f vrGazeDirection; - public long tick; - public Vector3f delta; + private Vector3f vrGazeDirection; + private long tick; + private Vector3f delta; /** * {@link #inputData} must contain {@link PlayerAuthInputData#PERFORM_ITEM_INTERACTION} in order for this to not be null. * * @since v428 */ - public ItemUseTransaction itemUseTransaction; + private ItemUseTransaction itemUseTransaction; /** * {@link #inputData} must contain {@link PlayerAuthInputData#PERFORM_ITEM_STACK_REQUEST} in order for this to not be null. * * @since v428 */ - public ItemStackRequest itemStackRequest; + private ItemStackRequest itemStackRequest; /** * {@link #inputData} must contain {@link PlayerAuthInputData#PERFORM_BLOCK_ACTIONS} in order for this to not be empty. * * @since v428 */ - public final List playerActions = new ObjectArrayList<>(); + private final List playerActions = new ObjectArrayList<>(); /** * @since v527 */ - public InputInteractionModel inputInteractionModel; + private InputInteractionModel inputInteractionModel; /** * @since v748 */ - public Vector2f interactRotation; + private Vector2f interactRotation; /** * @since 575 */ - public Vector2f analogMoveVector; + private Vector2f analogMoveVector; /** * @since 649 */ - public long predictedVehicle; + private long predictedVehicle; /** * @since 662 */ - public Vector2f vehicleRotation; + private Vector2f vehicleRotation; /** * @since v748 */ - public Vector3f cameraOrientation; + private Vector3f cameraOrientation; /** * @since v766 */ - public Vector2f rawMoveVector; + private Vector2f rawMoveVector; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerEnchantOptionsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerEnchantOptionsPacket.java index b95ac20..474abef 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerEnchantOptionsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerEnchantOptionsPacket.java @@ -13,7 +13,7 @@ @EqualsAndHashCode(callSuper = false) @ToString(doNotUseGetters = true) public class PlayerEnchantOptionsPacket implements BedrockPacket { - public final List options = new ArrayList<>(); + private final List options = new ArrayList<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerFogPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerFogPacket.java index 34e191a..9e18e02 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerFogPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerFogPacket.java @@ -22,7 +22,7 @@ public class PlayerFogPacket implements BedrockPacket { * @param fogStack list of fog effects * @return list of fog effects */ - public final List fogStack = new ObjectArrayList<>(); + private final List fogStack = new ObjectArrayList<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerHotbarPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerHotbarPacket.java index 671bc5a..ce38167 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerHotbarPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerHotbarPacket.java @@ -9,9 +9,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class PlayerHotbarPacket implements BedrockPacket { - public int selectedHotbarSlot; - public int containerId; - public boolean selectHotbarSlot; + private int selectedHotbarSlot; + private int containerId; + private boolean selectHotbarSlot; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerInputPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerInputPacket.java index d87d022..3449df1 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerInputPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerInputPacket.java @@ -13,9 +13,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class PlayerInputPacket implements BedrockPacket { - public Vector2f inputMotion; - public boolean jumping; - public boolean sneaking; + private Vector2f inputMotion; + private boolean jumping; + private boolean sneaking; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerListPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerListPacket.java index 199741f..52e99fe 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerListPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerListPacket.java @@ -4,6 +4,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import org.cloudburstmc.protocol.bedrock.data.BuildPlatform; import org.cloudburstmc.protocol.bedrock.data.skin.SerializedSkin; import org.cloudburstmc.protocol.common.PacketSignal; @@ -15,8 +16,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class PlayerListPacket implements BedrockPacket { - public final List entries = new ObjectArrayList<>(); - public Action action; + private final List entries = new ObjectArrayList<>(); + private Action action; @Override public final PacketSignal handle(BedrockPacketHandler handler) { @@ -37,18 +38,18 @@ public enum Action { @ToString(doNotUseGetters = true) @EqualsAndHashCode(doNotUseGetters = true) public final static class Entry { - public final UUID uuid; - public long entityId; - public CharSequence name; - public String xuid; - public String platformChatId; - public int buildPlatform; - public SerializedSkin skin; - public boolean teacher; - public boolean host; - public boolean trustedSkin; - public boolean subClient; - public int color; + private final UUID uuid; + private long entityId; + private CharSequence name; + private String xuid; + private String platformChatId; + private BuildPlatform buildPlatform = BuildPlatform.UNKNOWN; + private SerializedSkin skin; + private boolean teacher; + private boolean host; + private boolean trustedSkin; + private boolean subClient; + private Color color; public String getName() { return getName(String.class); diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerLocationPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerLocationPacket.java index c69d686..0ca805d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerLocationPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerLocationPacket.java @@ -11,9 +11,9 @@ @ToString(doNotUseGetters = true) public class PlayerLocationPacket implements BedrockPacket { - public Type type; - public long targetEntityId; - public Vector3f position; + private Type type; + private long targetEntityId; + private Vector3f position; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerSkinPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerSkinPacket.java index 6d12428..08a2107 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerSkinPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerSkinPacket.java @@ -12,11 +12,11 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class PlayerSkinPacket implements BedrockPacket { - public UUID uuid; - public SerializedSkin skin; - public String newSkinName; - public String oldSkinName; - public boolean trustedSkin; + private UUID uuid; + private SerializedSkin skin; + private String newSkinName; + private String oldSkinName; + private boolean trustedSkin; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerStartItemCooldownPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerStartItemCooldownPacket.java index 13d6cdb..4c71a20 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerStartItemCooldownPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerStartItemCooldownPacket.java @@ -10,8 +10,8 @@ @ToString(doNotUseGetters = true) public class PlayerStartItemCooldownPacket implements BedrockPacket { - public String itemCategory; - public int cooldownDuration; + private String itemCategory; + private int cooldownDuration; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerUpdateEntityOverridesPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerUpdateEntityOverridesPacket.java index 6d2db41..df2ccdf 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerUpdateEntityOverridesPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerUpdateEntityOverridesPacket.java @@ -9,11 +9,11 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class PlayerUpdateEntityOverridesPacket implements BedrockPacket { - public long entityUniqueId; - public int propertyIndex; - public UpdateType updateType; - public int intValue; - public float floatValue; + private long entityUniqueId; + private int propertyIndex; + private UpdateType updateType; + private int intValue; + private float floatValue; @Override public PacketSignal handle(BedrockPacketHandler handler) { @@ -34,7 +34,7 @@ public BedrockPacket clone() { } } - public enum UpdateType { + public enum UpdateType { // TODO: changelog says it's now None|Neighbors|Connections CLEAR_OVERRIDES, REMOVE_OVERRIDE, SET_INT_OVERRIDE, diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerVideoCapturePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerVideoCapturePacket.java index ff60c56..98761f4 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerVideoCapturePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PlayerVideoCapturePacket.java @@ -9,9 +9,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class PlayerVideoCapturePacket implements BedrockPacket { - public Action action; - public int frameRate; - public String filePrefix; + private Action action; + private int frameRate; + private String filePrefix; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PositionTrackingDBClientRequestPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PositionTrackingDBClientRequestPacket.java index 2b142e2..85554dd 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PositionTrackingDBClientRequestPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PositionTrackingDBClientRequestPacket.java @@ -9,8 +9,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class PositionTrackingDBClientRequestPacket implements BedrockPacket { - public Action action; - public int trackingId; + private Action action; + private int trackingId; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PositionTrackingDBServerBroadcastPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PositionTrackingDBServerBroadcastPacket.java index b15b8d8..d21e3e7 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PositionTrackingDBServerBroadcastPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PositionTrackingDBServerBroadcastPacket.java @@ -10,9 +10,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class PositionTrackingDBServerBroadcastPacket implements BedrockPacket { - public Action action; - public int trackingId; - public NbtMap tag; + private Action action; + private int trackingId; + private NbtMap tag; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PurchaseReceiptPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PurchaseReceiptPacket.java index 3551651..669549a 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PurchaseReceiptPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/PurchaseReceiptPacket.java @@ -12,7 +12,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class PurchaseReceiptPacket implements BedrockPacket { - public final List receipts = new ObjectArrayList<>(); + private final List receipts = new ObjectArrayList<>(); @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RemoveEntityPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RemoveEntityPacket.java index d471fc9..7d79609 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RemoveEntityPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RemoveEntityPacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class RemoveEntityPacket implements BedrockPacket { - public long uniqueEntityId; + private long uniqueEntityId; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RemoveObjectivePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RemoveObjectivePacket.java index 2cd5ab1..79b9426 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RemoveObjectivePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RemoveObjectivePacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class RemoveObjectivePacket implements BedrockPacket { - public String objectiveId; + private String objectiveId; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RemoveVolumeEntityPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RemoveVolumeEntityPacket.java index 905a132..96c485e 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RemoveVolumeEntityPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RemoveVolumeEntityPacket.java @@ -7,11 +7,11 @@ @Data @EqualsAndHashCode(doNotUseGetters = true, callSuper = false) public class RemoveVolumeEntityPacket implements BedrockPacket { - public int id; + private int id; /** * @since v503 */ - public int dimension; + private int dimension; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RequestAbilityPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RequestAbilityPacket.java index 835c4ce..f42f837 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RequestAbilityPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RequestAbilityPacket.java @@ -10,10 +10,10 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class RequestAbilityPacket implements BedrockPacket { - public Ability ability; - public Ability.Type type; - public boolean boolValue; - public float floatValue; + private Ability ability; + private Ability.Type type; + private boolean boolValue; + private float floatValue; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RequestChunkRadiusPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RequestChunkRadiusPacket.java index 80d8f12..f26d535 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RequestChunkRadiusPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RequestChunkRadiusPacket.java @@ -9,11 +9,11 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class RequestChunkRadiusPacket implements BedrockPacket { - public int radius; + private int radius; /** * @since v582 */ - public int maxRadius; + private int maxRadius; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RequestNetworkSettingsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RequestNetworkSettingsPacket.java index 0027e65..1b4f34a 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RequestNetworkSettingsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RequestNetworkSettingsPacket.java @@ -14,7 +14,7 @@ @EqualsAndHashCode(doNotUseGetters = true, callSuper = false) @ToString(doNotUseGetters = true) public class RequestNetworkSettingsPacket implements BedrockPacket { - public int protocolVersion; + private int protocolVersion; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RequestPermissionsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RequestPermissionsPacket.java index 19d5984..bb99f42 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RequestPermissionsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RequestPermissionsPacket.java @@ -10,9 +10,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class RequestPermissionsPacket implements BedrockPacket { - public long uniqueEntityId; - public PlayerPermission permissions; - public int customPermissions; + private long uniqueEntityId; + private PlayerPermission permissions; + private int customPermissions; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackChunkDataPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackChunkDataPacket.java index 28f5225..9c6993f 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackChunkDataPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackChunkDataPacket.java @@ -13,11 +13,11 @@ @EqualsAndHashCode(doNotUseGetters = true, callSuper = false) @ToString(doNotUseGetters = true, exclude = {"data"}) public class ResourcePackChunkDataPacket extends AbstractReferenceCounted implements BedrockPacket { - public UUID packId; - public String packVersion; - public int chunkIndex; - public long progress; - public ByteBuf data; + private UUID packId; + private String packVersion; + private int chunkIndex; + private long progress; + private ByteBuf data; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackChunkRequestPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackChunkRequestPacket.java index 415ab2d..58b8c93 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackChunkRequestPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackChunkRequestPacket.java @@ -11,9 +11,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ResourcePackChunkRequestPacket implements BedrockPacket { - public UUID packId; - public String packVersion; - public int chunkIndex; + private UUID packId; + private String packVersion; + private int chunkIndex; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackClientResponsePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackClientResponsePacket.java index 1b69e60..8c8a15d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackClientResponsePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackClientResponsePacket.java @@ -12,8 +12,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ResourcePackClientResponsePacket implements BedrockPacket { - public final List packIds = new ObjectArrayList<>(); - public Status status; + private final List packIds = new ObjectArrayList<>(); + private Status status; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackDataInfoPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackDataInfoPacket.java index 7ce74e1..fbea2a7 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackDataInfoPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackDataInfoPacket.java @@ -12,14 +12,14 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ResourcePackDataInfoPacket implements BedrockPacket { - public UUID packId; - public String packVersion; - public long maxChunkSize; - public long chunkCount; - public long compressedPackSize; - public byte[] hash; - public boolean premium; - public ResourcePackType type; + private UUID packId; + private String packVersion; + private long maxChunkSize; + private long chunkCount; + private long compressedPackSize; + private byte[] hash; + private boolean premium; + private ResourcePackType type; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackStackPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackStackPacket.java index ac475d9..26a05e1 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackStackPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackStackPacket.java @@ -14,16 +14,16 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ResourcePackStackPacket implements BedrockPacket { - public boolean forcedToAccept; - public final List behaviorPacks = new ObjectArrayList<>(); - public final List resourcePacks = new ObjectArrayList<>(); - public String gameVersion; - public final List experiments = new ObjectArrayList<>(); - public boolean experimentsPreviouslyToggled; + private boolean forcedToAccept; + private final List behaviorPacks = new ObjectArrayList<>(); + private final List resourcePacks = new ObjectArrayList<>(); + private String gameVersion; + private final List experiments = new ObjectArrayList<>(); + private boolean experimentsPreviouslyToggled; /** * @since v671 */ - public boolean hasEditorPacks; + private boolean hasEditorPacks; @Override @@ -37,9 +37,9 @@ public BedrockPacketType getPacketType() { @Value public static class Entry { - public final String packId; - public final String packVersion; - public final String subPackName; + private final String packId; + private final String packVersion; + private final String subPackName; } @Override diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePacksInfoPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePacksInfoPacket.java index 7429f73..88e4545 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePacksInfoPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePacksInfoPacket.java @@ -14,33 +14,33 @@ public class ResourcePacksInfoPacket implements BedrockPacket { /** * @deprecated since v729 */ - public final List behaviorPackInfos = new ObjectArrayList<>(); - public final List resourcePackInfos = new ObjectArrayList<>(); - public boolean forcedToAccept; + private final List behaviorPackInfos = new ObjectArrayList<>(); + private final List resourcePackInfos = new ObjectArrayList<>(); + private boolean forcedToAccept; /** * @since v662 */ - public boolean hasAddonPacks; - public boolean scriptingEnabled; + private boolean hasAddonPacks; + private boolean scriptingEnabled; /** * @since v448 * @deprecated since v729 */ - public boolean forcingServerPacksEnabled; + private boolean forcingServerPacksEnabled; /** * @since v766 */ - public UUID worldTemplateId; + private UUID worldTemplateId; /** * @since v766 */ - public String worldTemplateVersion; + private String worldTemplateVersion; /** * Force the client to disable vibrant visuals, even if the client supports it. * * @since v818 */ - public boolean vibrantVisualsForceDisabled; + private boolean vibrantVisualsForceDisabled; @Override public final PacketSignal handle(BedrockPacketHandler handler) { @@ -54,22 +54,22 @@ public BedrockPacketType getPacketType() { @Data @AllArgsConstructor public static class Entry { - public UUID packId; - public String packVersion; - public long packSize; - public String contentKey; - public String subPackName; - public String contentId; - public boolean scripting; - public boolean raytracingCapable; + private UUID packId; + private String packVersion; + private long packSize; + private String contentKey; + private String subPackName; + private String contentId; + private boolean scripting; + private boolean raytracingCapable; /** * @since v712 */ - public boolean addonPack; + private boolean addonPack; /** * @since v748 */ - public String cdnUrl; + private String cdnUrl; } @Override diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePacksReadyForValidationPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePacksReadyForValidationPacket.java new file mode 100644 index 0000000..44b6a92 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePacksReadyForValidationPacket.java @@ -0,0 +1,35 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.cloudburstmc.protocol.common.PacketSignal; + +/** + * Used to inform the server that the client has finished loading all resource packs. + * + * @since v944 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class ResourcePacksReadyForValidationPacket implements BedrockPacket { + + @Override + public final PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + public BedrockPacketType getPacketType() { + return BedrockPacketType.RESOURCE_PACKS_READY_FOR_VALIDATION; + } + + @Override + public ResourcePacksReadyForValidationPacket clone() { + try { + return (ResourcePacksReadyForValidationPacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RespawnPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RespawnPacket.java index 542f1c1..5694dc0 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RespawnPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RespawnPacket.java @@ -10,9 +10,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class RespawnPacket implements BedrockPacket { - public Vector3f position; - public State state; - public long runtimeEntityId; // Only used server bound and pretty pointless + private Vector3f position; + private State state; + private long runtimeEntityId; // Only used server bound and pretty pointless @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RiderJumpPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RiderJumpPacket.java index 0bb8eea..99ecea1 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RiderJumpPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/RiderJumpPacket.java @@ -12,7 +12,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class RiderJumpPacket implements BedrockPacket { - public int jumpStrength; + private int jumpStrength; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ScriptCustomEventPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ScriptCustomEventPacket.java index 41f7ffa..4193a66 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ScriptCustomEventPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ScriptCustomEventPacket.java @@ -13,8 +13,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ScriptCustomEventPacket implements BedrockPacket { - public String eventName; - public String data; + private String eventName; + private String data; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ScriptMessagePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ScriptMessagePacket.java index f269ff3..1812a9a 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ScriptMessagePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ScriptMessagePacket.java @@ -10,8 +10,8 @@ @ToString(doNotUseGetters = true) public class ScriptMessagePacket implements BedrockPacket { - public String channel; - public String message; + private String channel; + private String message; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SendPartyDestinationCookiePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SendPartyDestinationCookiePacket.java new file mode 100644 index 0000000..2d14c3b --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SendPartyDestinationCookiePacket.java @@ -0,0 +1,69 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.cloudburstmc.protocol.bedrock.data.camera.CameraSplineType; +import org.cloudburstmc.protocol.common.PacketSignal; + +import java.util.HashMap; +import java.util.Map; + +/** + * Sent by the server to a client with a party destination cookie. + * + * @since v1001 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class SendPartyDestinationCookiePacket implements BedrockPacket { + + private String cookie; + private Intent intent; + private String destinationName; + + @Override + public PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + @Override + public BedrockPacketType getPacketType() { + return BedrockPacketType.SEND_PARTY_DESTINATION_COOKIE; + } + + @Override + public BedrockPacket clone() { + try { + return (SendPartyDestinationCookiePacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } + + public enum Intent { + NOTIFY("notify"), OPT_IN("optin"), OPT_OUT("optout"); + + private static final Map serializeNames = new HashMap<>(values().length); + static { + for (Intent value : values()) { + serializeNames.put(value.getSerializeName(), value); + } + } + + private final String serializeName; + + Intent(String serializeName) { + this.serializeName = serializeName; + } + + public String getSerializeName() { + return this.serializeName; + } + + public static Intent fromName(String serializeName) { + return serializeNames.get(serializeName); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerPlayerPostMovePositionPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerPlayerPostMovePositionPacket.java index dbca21c..be5ff63 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerPlayerPostMovePositionPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerPlayerPostMovePositionPacket.java @@ -10,7 +10,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ServerPlayerPostMovePositionPacket implements BedrockPacket { - public Vector3f position; + private Vector3f position; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerPresenceInfoPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerPresenceInfoPacket.java new file mode 100644 index 0000000..169d0c9 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerPresenceInfoPacket.java @@ -0,0 +1,38 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.cloudburstmc.protocol.bedrock.data.PresenceConfiguration; +import org.cloudburstmc.protocol.common.PacketSignal; + +/** + * Sent by the server to provide PresenceConfiguration to the client. + * + * @since v975 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class ServerPresenceInfoPacket implements BedrockPacket { + + private PresenceConfiguration presenceConfiguration; + + @Override + public final PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + public BedrockPacketType getPacketType() { + return BedrockPacketType.SERVER_PRESENCE_INFO; + } + + @Override + public ServerPresenceInfoPacket clone() { + try { + return (ServerPresenceInfoPacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerSettingsResponsePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerSettingsResponsePacket.java index 0b57346..072c777 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerSettingsResponsePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerSettingsResponsePacket.java @@ -9,8 +9,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ServerSettingsResponsePacket implements BedrockPacket { - public int formId; - public String formData; + private int formId; + private String formData; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerStatsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerStatsPacket.java index a1864c5..a6258dc 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerStatsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerStatsPacket.java @@ -13,8 +13,8 @@ @EqualsAndHashCode(doNotUseGetters = true, callSuper = false) @ToString(doNotUseGetters = true) public class ServerStatsPacket implements BedrockPacket { - public float serverTime; - public float networkTime; + private float serverTime; + private float networkTime; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerStoreInfoPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerStoreInfoPacket.java new file mode 100644 index 0000000..49e2038 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerStoreInfoPacket.java @@ -0,0 +1,40 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.cloudburstmc.protocol.bedrock.data.ClientStoreEntrypointConfiguration; +import org.cloudburstmc.protocol.common.PacketSignal; + +/** + * Sent by the server to provide ClientStoreEntryPointConfiguration to the client. + * + * @since v975 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class ServerStoreInfoPacket implements BedrockPacket { + + @Nullable + private ClientStoreEntrypointConfiguration store; + + @Override + public final PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + public BedrockPacketType getPacketType() { + return BedrockPacketType.SERVER_STORE_INFO; + } + + @Override + public ServerStoreInfoPacket clone() { + try { + return (ServerStoreInfoPacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerToClientHandshakePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerToClientHandshakePacket.java index 19c865d..6ef7c8a 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerToClientHandshakePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerToClientHandshakePacket.java @@ -12,7 +12,7 @@ @ToString(doNotUseGetters = true) @NoEncryption // This is sent in plain text to complete the Diffie Hellman key exchange. public class ServerToClientHandshakePacket implements BedrockPacket { - public String jwt; + private String jwt; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundDataDrivenScreenClosedPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundDataDrivenScreenClosedPacket.java new file mode 100644 index 0000000..6301412 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundDataDrivenScreenClosedPacket.java @@ -0,0 +1,46 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.cloudburstmc.protocol.common.PacketSignal; + +/** + * Sent from the client to the server when a data driven screen is closed. + * + * @since v944 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class ServerboundDataDrivenScreenClosedPacket implements BedrockPacket { + + private Integer formId; + private CloseReason closeReason; + + @Override + public final PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + public BedrockPacketType getPacketType() { + return BedrockPacketType.SERVERBOUND_DATA_DRIVEN_SCREEN_CLOSED; + } + + @Override + public ServerboundDataDrivenScreenClosedPacket clone() { + try { + return (ServerboundDataDrivenScreenClosedPacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } + + public enum CloseReason { + PROGRAMMATIC_CLOSE, + PROGRAMMATIC_CLOSE_ALL, + CLIENT_CANCELED, + USER_BUSY, + INVALID_FORM, + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundDataStorePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundDataStorePacket.java index dfe621d..245ac11 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundDataStorePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundDataStorePacket.java @@ -3,20 +3,20 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import org.cloudburstmc.protocol.bedrock.data.datastore.DataStoreUpdate; import org.cloudburstmc.protocol.common.PacketSignal; -import java.util.UUID; - +/** + * Applies a single update to the server data store from the client + * + * @since v897 + */ @Data @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ServerboundDataStorePacket implements BedrockPacket { - public String dataStoreName; - public String property; - public String path; - public Object data; - public int updateCount; + private DataStoreUpdate update = new DataStoreUpdate(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundDiagnosticsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundDiagnosticsPacket.java index ccb1ab1..40a7c8b 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundDiagnosticsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundDiagnosticsPacket.java @@ -3,21 +3,41 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import org.cloudburstmc.protocol.bedrock.data.diagnostics.EntityDiagnosticTimingInfo; +import org.cloudburstmc.protocol.bedrock.data.diagnostics.MemoryCategoryCounter; +import org.cloudburstmc.protocol.bedrock.data.diagnostics.SystemDiagnosticTimingInfo; +import org.cloudburstmc.protocol.bedrock.data.diagnostics.WhiskerScopeDataSummary; import org.cloudburstmc.protocol.common.PacketSignal; +import java.util.ArrayList; +import java.util.List; + @Data @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ServerboundDiagnosticsPacket implements BedrockPacket{ - public float avgFps; - public float avgServerSimTickTimeMS; - public float avgClientSimTickTimeMS; - public float avgBeginFrameTimeMS; - public float avgInputTimeMS; - public float avgRenderTimeMS; - public float avgEndFrameTimeMS; - public float avgRemainderTimePercent; - public float avgUnaccountedTimePercent; + private float avgFps; + private float avgServerSimTickTimeMS; + private float avgClientSimTickTimeMS; + private float avgBeginFrameTimeMS; + private float avgInputTimeMS; + private float avgRenderTimeMS; + private float avgEndFrameTimeMS; + private float avgRemainderTimePercent; + private float avgUnaccountedTimePercent; + private final List memoryCategoryValues = new ArrayList<>(); + /** + * @since v975 + */ + private final List entityDiagnostics = new ArrayList<>(); + /** + * @since v975 + */ + private final List systemDiagnostics = new ArrayList<>(); + /** + * @since v1001 + */ + private final List whiskerScopes = new ArrayList<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundLoadingScreenPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundLoadingScreenPacket.java index 8838457..811a248 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundLoadingScreenPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundLoadingScreenPacket.java @@ -10,11 +10,11 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ServerboundLoadingScreenPacket implements BedrockPacket { - public ServerboundLoadingScreenPacketType type; + private ServerboundLoadingScreenPacketType type; /** * Optional int, not present if null */ - public Integer loadingScreenId; + private Integer loadingScreenId; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundPackSettingChangePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundPackSettingChangePacket.java index f8bdd9c..534f6a2 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundPackSettingChangePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ServerboundPackSettingChangePacket.java @@ -12,9 +12,9 @@ @ToString(doNotUseGetters = true) public class ServerboundPackSettingChangePacket implements BedrockPacket { - public UUID packId; - public String packSettingName; - public Object packSettingValue; + private UUID packId; + private String packSettingName; + private Object packSettingValue; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetCommandsEnabledPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetCommandsEnabledPacket.java index 52119c1..ed2a5d8 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetCommandsEnabledPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetCommandsEnabledPacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetCommandsEnabledPacket implements BedrockPacket { - public boolean commandsEnabled; + private boolean commandsEnabled; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetDefaultGameTypePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetDefaultGameTypePacket.java index d9deb12..f0d8dd6 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetDefaultGameTypePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetDefaultGameTypePacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetDefaultGameTypePacket implements BedrockPacket { - public int gamemode; + private int gamemode; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetDifficultyPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetDifficultyPacket.java index 3a38636..707ef79 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetDifficultyPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetDifficultyPacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetDifficultyPacket implements BedrockPacket { - public int difficulty; + private int difficulty; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetDisplayObjectivePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetDisplayObjectivePacket.java index af3271d..b1e2842 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetDisplayObjectivePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetDisplayObjectivePacket.java @@ -9,11 +9,11 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetDisplayObjectivePacket implements BedrockPacket { - public String displaySlot; - public String objectiveId; - public CharSequence displayName; - public String criteria; - public int sortOrder; + private String displaySlot; + private String objectiveId; + private CharSequence displayName; + private String criteria; + private int sortOrder; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetEntityDataPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetEntityDataPacket.java index b324681..137226a 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetEntityDataPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetEntityDataPacket.java @@ -11,13 +11,13 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetEntityDataPacket implements BedrockPacket { - public EntityDataMap metadata = new EntityDataMap(); - public long runtimeEntityId; - public long tick; + private EntityDataMap metadata = new EntityDataMap(); + private long runtimeEntityId; + private long tick; /** * @since v557 */ - public EntityProperties properties = new EntityProperties(); + private EntityProperties properties = new EntityProperties(); @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetEntityLinkPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetEntityLinkPacket.java index c5be22b..663ee09 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetEntityLinkPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetEntityLinkPacket.java @@ -10,7 +10,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetEntityLinkPacket implements BedrockPacket { - public EntityLinkData entityLink; + private EntityLinkData entityLink; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetEntityMotionPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetEntityMotionPacket.java index 9617ac7..076a405 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetEntityMotionPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetEntityMotionPacket.java @@ -10,12 +10,12 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetEntityMotionPacket implements BedrockPacket { - public long runtimeEntityId; - public Vector3f motion; + private long runtimeEntityId; + private Vector3f motion; /** * @since v662 */ - public long tick; + private long tick; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetHealthPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetHealthPacket.java index 2395d91..cdac2cb 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetHealthPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetHealthPacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetHealthPacket implements BedrockPacket { - public int health; + private int health; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetHudPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetHudPacket.java index 0a75dff..52da40d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetHudPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetHudPacket.java @@ -17,8 +17,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetHudPacket implements BedrockPacket { - public final Set elements = new ObjectOpenHashSet<>(); - public HudVisibility visibility; + private final Set elements = new ObjectOpenHashSet<>(); + private HudVisibility visibility; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetLastHurtByPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetLastHurtByPacket.java index 3d5e49b..826d6d8 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetLastHurtByPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetLastHurtByPacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetLastHurtByPacket implements BedrockPacket { - public int entityTypeId; + private int entityTypeId; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetLocalPlayerAsInitializedPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetLocalPlayerAsInitializedPacket.java index 7b67f77..5a7cc48 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetLocalPlayerAsInitializedPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetLocalPlayerAsInitializedPacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetLocalPlayerAsInitializedPacket implements BedrockPacket { - public long runtimeEntityId; + private long runtimeEntityId; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetMovementAuthorityPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetMovementAuthorityPacket.java index d9c9924..2e8dd25 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetMovementAuthorityPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetMovementAuthorityPacket.java @@ -10,7 +10,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetMovementAuthorityPacket implements BedrockPacket { - public AuthoritativeMovementMode movementMode; + private AuthoritativeMovementMode movementMode; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetPlayerGameTypePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetPlayerGameTypePacket.java index 59e05c7..0149de5 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetPlayerGameTypePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetPlayerGameTypePacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetPlayerGameTypePacket implements BedrockPacket { - public int gamemode; + private int gamemode; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetPlayerInventoryOptionsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetPlayerInventoryOptionsPacket.java index 8ceccb5..6561f49 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetPlayerInventoryOptionsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetPlayerInventoryOptionsPacket.java @@ -12,11 +12,11 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetPlayerInventoryOptionsPacket implements BedrockPacket { - public InventoryTabLeft leftTab; - public InventoryTabRight rightTab; - public boolean filtering; - public InventoryLayout layout; - public InventoryLayout craftingLayout; + private InventoryTabLeft leftTab; + private InventoryTabRight rightTab; + private boolean filtering; + private InventoryLayout layout; + private InventoryLayout craftingLayout; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetScorePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetScorePacket.java index 57c4409..c7f85ea 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetScorePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetScorePacket.java @@ -13,8 +13,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetScorePacket implements BedrockPacket { - public Action action; - public List infos = new ObjectArrayList<>(); + private Action action; + private List infos = new ObjectArrayList<>(); @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetScoreboardIdentityPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetScoreboardIdentityPacket.java index f61c09d..d633700 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetScoreboardIdentityPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetScoreboardIdentityPacket.java @@ -14,8 +14,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetScoreboardIdentityPacket implements BedrockPacket { - public final List entries = new ObjectArrayList<>(); - public Action action; + private final List entries = new ObjectArrayList<>(); + private Action action; @Override public final PacketSignal handle(BedrockPacketHandler handler) { @@ -33,8 +33,8 @@ public enum Action { @Value public static class Entry { - public final long scoreboardId; - public final UUID uuid; + private final long scoreboardId; + private final UUID uuid; } @Override diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetSpawnPositionPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetSpawnPositionPacket.java index b5b0adb..e68afce 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetSpawnPositionPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetSpawnPositionPacket.java @@ -13,23 +13,23 @@ public class SetSpawnPositionPacket implements BedrockPacket { // spawnType is the type of spawn to set. It is either PLAYER_SPAWN or WORLD_SPAWN, and specifies // the behaviour of the spawn set. If WORLD_SPAWN is set, the position to which compasses will point is // also changed. - public Type spawnType; + private Type spawnType; // blockPosition is the new position of the spawn that was set. If spawnType is WORLD_SPAWN, compasses will // point to this position. As of 1.16, blockPosition is always the position of the player. - public Vector3i blockPosition; + private Vector3i blockPosition; // dimensionId is the ID of the dimension that had its spawn updated. This is specifically relevant for // behaviour added in 1.16 such as the respawn anchor, which allows setting the spawn in a specific // dimension. - public int dimensionId; + private int dimensionId; // SpawnPosition is a new field added in 1.16. It holds the spawn position of the world. This spawn // position is {-2147483648, -2147483648, -2147483648} for a default spawn position. - public Vector3i spawnPosition = Vector3i.from(-2147483648, -2147483648, -2147483648); + private Vector3i spawnPosition = Vector3i.from(-2147483648, -2147483648, -2147483648); @Deprecated - public boolean spawnForced; + private boolean spawnForced; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetTimePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetTimePacket.java index a7af291..5a3e531 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetTimePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetTimePacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetTimePacket implements BedrockPacket { - public int time; + private int time; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetTitlePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetTitlePacket.java index 513fd12..d010622 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetTitlePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SetTitlePacket.java @@ -9,23 +9,23 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SetTitlePacket implements BedrockPacket { - public Type type; - public CharSequence text; - public int fadeInTime; - public int stayTime; - public int fadeOutTime; + private Type type; + private CharSequence text; + private int fadeInTime; + private int stayTime; + private int fadeOutTime; /** * @since v448 */ - public String xuid; + private String xuid; /** * @since v448 */ - public String platformOnlineId; + private String platformOnlineId; /** * @since v712 */ - public CharSequence filteredTitleText = ""; + private CharSequence filteredTitleText = ""; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SettingsCommandPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SettingsCommandPacket.java index 3dcb700..fb1dd1f 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SettingsCommandPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SettingsCommandPacket.java @@ -9,8 +9,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SettingsCommandPacket implements BedrockPacket { - public String command; - public boolean suppressingOutput; + private String command; + private boolean suppressingOutput; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ShowCreditsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ShowCreditsPacket.java index 0e01cb9..ddbff0c 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ShowCreditsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ShowCreditsPacket.java @@ -9,8 +9,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ShowCreditsPacket implements BedrockPacket { - public long runtimeEntityId; - public Status status; + private long runtimeEntityId; + private Status status; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ShowProfilePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ShowProfilePacket.java index 3967121..a3d6547 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ShowProfilePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ShowProfilePacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ShowProfilePacket implements BedrockPacket { - public String xuid; + private String xuid; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ShowStoreOfferPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ShowStoreOfferPacket.java index 98f8926..ca61cfa 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ShowStoreOfferPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ShowStoreOfferPacket.java @@ -10,17 +10,17 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ShowStoreOfferPacket implements BedrockPacket { - public String offerId; + private String offerId; /** * @since v630 deprecated */ @Deprecated - public boolean shownToAll; + private boolean shownToAll; /** * @since v630 */ - public StoreOfferRedirectType redirectType; + private StoreOfferRedirectType redirectType; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SimpleEventPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SimpleEventPacket.java index f7e00f1..334f6d5 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SimpleEventPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SimpleEventPacket.java @@ -10,7 +10,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SimpleEventPacket implements BedrockPacket { - public SimpleEventType event; + private SimpleEventType event; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SimulationTypePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SimulationTypePacket.java index d753fb4..9232b24 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SimulationTypePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SimulationTypePacket.java @@ -9,7 +9,7 @@ @EqualsAndHashCode(doNotUseGetters = true, callSuper = false) public class SimulationTypePacket implements BedrockPacket { - public SimulationType type; + private SimulationType type; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SpawnExperienceOrbPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SpawnExperienceOrbPacket.java index 890d104..979c77d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SpawnExperienceOrbPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SpawnExperienceOrbPacket.java @@ -10,8 +10,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SpawnExperienceOrbPacket implements BedrockPacket { - public Vector3f position; - public int amount; + private Vector3f position; + private int amount; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SpawnParticleEffectPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SpawnParticleEffectPacket.java index 6d6252a..a02729c 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SpawnParticleEffectPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SpawnParticleEffectPacket.java @@ -13,11 +13,11 @@ @ToString(doNotUseGetters = true) @SuppressWarnings("OptionalUsedAsFieldOrParameterType") public class SpawnParticleEffectPacket implements BedrockPacket { - public int dimensionId; - public long uniqueEntityId = -1; - public Vector3f position; - public String identifier; - public Optional molangVariablesJson; + private int dimensionId; + private long uniqueEntityId = -1; + private Vector3f position; + private String identifier; + private Optional molangVariablesJson; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StartGamePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StartGamePacket.java index 802ea45..f5bfbf1 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StartGamePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StartGamePacket.java @@ -21,111 +21,119 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true, exclude = {"itemDefinitions", "blockPalette"}) public class StartGamePacket implements BedrockPacket { - public final List> gamerules = new ObjectArrayList<>(); - public long uniqueEntityId; - public long runtimeEntityId; - public GameType playerGameType; - public Vector3f playerPosition; - public Vector2f rotation; + private final List> gamerules = new ObjectArrayList<>(); + private long uniqueEntityId; + private long runtimeEntityId; + private GameType playerGameType; + private Vector3f playerPosition; + private Vector2f rotation; // Level settings start - public long seed; - public SpawnBiomeType spawnBiomeType; - public String customBiomeName; - public int dimensionId; - public int generatorId; - public GameType levelGameType; - public int difficulty; - public Vector3i defaultSpawn; - public boolean achievementsDisabled; - public int dayCycleStopTime; - public int eduEditionOffers; - public boolean eduFeaturesEnabled; - public String educationProductionId; - public float rainLevel; - public float lightningLevel; - public boolean platformLockedContentConfirmed; - public boolean multiplayerGame; - public boolean broadcastingToLan; - public GamePublishSetting xblBroadcastMode; - public GamePublishSetting platformBroadcastMode; - public boolean commandsEnabled; - public boolean texturePacksRequired; - public final List experiments = new ObjectArrayList<>(); - public boolean experimentsPreviouslyToggled; - public boolean bonusChestEnabled; - public boolean startingWithMap; - public boolean trustingPlayers; - public PlayerPermission defaultPlayerPermission; - public int serverChunkTickRange; - public boolean behaviorPackLocked; - public boolean resourcePackLocked; - public boolean fromLockedWorldTemplate; - public boolean usingMsaGamertagsOnly; - public boolean fromWorldTemplate; - public boolean worldTemplateOptionLocked; - public boolean onlySpawningV1Villagers; - public String vanillaVersion; - public int limitedWorldWidth; - public int limitedWorldHeight; - public boolean netherType; + private long seed; + private SpawnBiomeType spawnBiomeType; + private String customBiomeName; + private int dimensionId; + private int generatorId; + private GameType levelGameType; + private int difficulty; + private Vector3i defaultSpawn; + private boolean achievementsDisabled; + private int dayCycleStopTime; + private int eduEditionOffers; + private boolean eduFeaturesEnabled; + private String educationProductionId; + private float rainLevel; + private float lightningLevel; + private boolean platformLockedContentConfirmed; + private boolean multiplayerGame; + private boolean broadcastingToLan; + private GamePublishSetting xblBroadcastMode; + private GamePublishSetting platformBroadcastMode; + private boolean commandsEnabled; + private boolean texturePacksRequired; + private final List experiments = new ObjectArrayList<>(); + private boolean experimentsPreviouslyToggled; + private boolean bonusChestEnabled; + private boolean startingWithMap; + private boolean trustingPlayers; + private PlayerPermission defaultPlayerPermission; + private int serverChunkTickRange; + private boolean behaviorPackLocked; + private boolean resourcePackLocked; + private boolean fromLockedWorldTemplate; + private boolean usingMsaGamertagsOnly; + private boolean fromWorldTemplate; + private boolean worldTemplateOptionLocked; + private boolean onlySpawningV1Villagers; + private String vanillaVersion; + private int limitedWorldWidth; + private int limitedWorldHeight; + private boolean netherType; /** * @since v465 */ - public EduSharedUriResource eduSharedUriResource = EduSharedUriResource.EMPTY; - public OptionalBoolean forceExperimentalGameplay; + private EduSharedUriResource eduSharedUriResource = EduSharedUriResource.EMPTY; + private OptionalBoolean forceExperimentalGameplay; /** * @since 1.19.20 */ - public ChatRestrictionLevel chatRestrictionLevel; + private ChatRestrictionLevel chatRestrictionLevel; /** * @since 1.19.20 */ - public boolean disablingPlayerInteractions; + private boolean disablingPlayerInteractions; /** * @since 1.19.20 */ - public boolean disablingPersonas; + private boolean disablingPersonas; /** * @since 1.19.20 */ - public boolean disablingCustomSkins; + private boolean disablingCustomSkins; + /** + * @since v1001 + */ + private int serverEditorConnectionPolicy; + /** + * @since v1001 + */ + private boolean allowAnonymousBlockDropsInEditorWorlds; // Level settings end - public String levelId; - public CharSequence levelName; - public String premiumWorldTemplateId; - public boolean trial; + private String levelId; + private CharSequence levelName; + private String premiumWorldTemplateId; + private boolean trial; // SyncedPlayerMovementSettings start /** * @deprecated since v818. {@link AuthoritativeMovementMode#SERVER_WITH_REWIND} is now the default movement mode. */ - public AuthoritativeMovementMode authoritativeMovementMode; - public int rewindHistorySize; + private AuthoritativeMovementMode authoritativeMovementMode; + private int rewindHistorySize; boolean serverAuthoritativeBlockBreaking; // SyncedPlayerMovementSettings end - public long currentTick; - public int enchantmentSeed; - public NbtList blockPalette; - public final List blockProperties = new ObjectArrayList<>(); + private long currentTick; + private int enchantmentSeed; + private NbtList blockPalette; + private final List blockProperties = new ObjectArrayList<>(); /** * @deprecated since v776. Use ItemComponentPacket instead. */ - public List itemDefinitions = new ObjectArrayList<>(); - public String multiplayerCorrelationId; + private List itemDefinitions = new ObjectArrayList<>(); + private String multiplayerCorrelationId; /** * @since v407 */ - public boolean inventoriesServerAuthoritative; + private boolean inventoriesServerAuthoritative; /** * The name of the server software. * Used for telemetry within the Bedrock client. * * @since v440 */ - public String serverEngine; + private String serverEngine; /** * @since v527 */ - public NbtMap playerPropertyData; + private NbtMap playerPropertyData; /** * A XXHash64 of all block states by their compound tag. * The exact way this is calculated is not currently known. @@ -134,68 +142,76 @@ public class StartGamePacket implements BedrockPacket { * * @since v475 */ - public long blockRegistryChecksum; + private long blockRegistryChecksum; /** * @since v527 */ - public UUID worldTemplateId; + private UUID worldTemplateId; /** * @since v534 */ - public WorldType editorWorldType = WorldType.NON_EDITOR; + private WorldType editorWorldType = WorldType.NON_EDITOR; /** * Enables client side chunk generation * * @since 1.19.20 */ - public boolean clientSideGenerationEnabled; + private boolean clientSideGenerationEnabled; /** * @since v567 */ - public boolean emoteChatMuted; + private boolean emoteChatMuted; /** * Whether block runtime IDs should be replaced by 32-bit integer hashes of NBT block state. * Unlike runtime IDs, this hashes should be persistent across versions and should make support for data-driven/custom blocks easier. * * @since v582 */ - public boolean blockNetworkIdsHashed; + private boolean blockNetworkIdsHashed; /** * @since v582 */ - public boolean createdInEditor; + private boolean createdInEditor; /** * @since v582 */ - public boolean exportedFromEditor; + private boolean exportedFromEditor; /** * @since v589 */ - public NetworkPermissions networkPermissions = NetworkPermissions.DEFAULT; + private NetworkPermissions networkPermissions = NetworkPermissions.DEFAULT; /** * @since v671 */ - public boolean hardcore; + private boolean hardcore; /** * @since v685 */ - public String serverId; + private String serverId; /** * @since v685 */ - public String worldId; + private String worldId; /** * @since v685 */ - public String scenarioId; + private String scenarioId; /** * @since v818 */ - public String ownerId; + private String ownerId; /** * @since v827 */ - public boolean tickDeathSystemsEnabled; + private boolean tickDeathSystemsEnabled; + /** + * @since v924 + */ + private ServerConfigurationJoinInfo serverConfigurationJoinInfo; + /** + * @since v1001 + */ + private boolean isLoggingChat; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StopSoundPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StopSoundPacket.java index 4fa0096..e87c6c2 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StopSoundPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StopSoundPacket.java @@ -9,12 +9,12 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class StopSoundPacket implements BedrockPacket { - public String soundName; - public boolean stoppingAllSound; + private String soundName; + private boolean stoppingAllSound; /** * @since v712 */ - public boolean stopMusicLegacy; + private boolean stopMusicLegacy; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StructureBlockUpdatePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StructureBlockUpdatePacket.java index 6cd79fc..41eb7a2 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StructureBlockUpdatePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StructureBlockUpdatePacket.java @@ -11,13 +11,13 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class StructureBlockUpdatePacket implements BedrockPacket { - public Vector3i blockPosition; - public StructureEditorData editorData; - public boolean powered; + private Vector3i blockPosition; + private StructureEditorData editorData; + private boolean powered; /** * @since v553 */ - public boolean waterlogged; + private boolean waterlogged; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StructureTemplateDataRequestPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StructureTemplateDataRequestPacket.java index 70936bc..302ee41 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StructureTemplateDataRequestPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StructureTemplateDataRequestPacket.java @@ -12,10 +12,10 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class StructureTemplateDataRequestPacket implements BedrockPacket { - public String name; - public Vector3i position; - public StructureSettings settings; - public StructureTemplateRequestOperation operation; + private String name; + private Vector3i position; + private StructureSettings settings; + private StructureTemplateRequestOperation operation; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StructureTemplateDataResponsePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StructureTemplateDataResponsePacket.java index 55fd37c..d505d61 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StructureTemplateDataResponsePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StructureTemplateDataResponsePacket.java @@ -11,10 +11,10 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class StructureTemplateDataResponsePacket implements BedrockPacket { - public String name; - public boolean save; - public NbtMap tag; - public StructureTemplateResponseType type; + private String name; + private boolean save; + private NbtMap tag; + private StructureTemplateResponseType type; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SubChunkPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SubChunkPacket.java index 5cc2dec..71794a8 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SubChunkPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SubChunkPacket.java @@ -15,13 +15,13 @@ @EqualsAndHashCode(doNotUseGetters = true, callSuper = false) @ToString(doNotUseGetters = true) public class SubChunkPacket extends AbstractReferenceCounted implements BedrockPacket { - public int dimension; - public boolean cacheEnabled; + private int dimension; + private boolean cacheEnabled; /** * @since v485 */ - public Vector3i centerPosition; - public List subChunks = new ObjectArrayList<>(); + private Vector3i centerPosition; + private List subChunks = new ObjectArrayList<>(); @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SubChunkRequestPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SubChunkRequestPacket.java index bc92299..4090621 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SubChunkRequestPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SubChunkRequestPacket.java @@ -13,12 +13,12 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class SubChunkRequestPacket implements BedrockPacket { - public int dimension; - public Vector3i subChunkPosition; + private int dimension; + private Vector3i subChunkPosition; /** * @since v485 */ - public List positionOffsets = new ObjectArrayList<>(); + private List positionOffsets = new ObjectArrayList<>(); @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SubClientLoginPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SubClientLoginPacket.java index 4691ad2..3172f82 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SubClientLoginPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SubClientLoginPacket.java @@ -17,12 +17,12 @@ public class SubClientLoginPacket implements BedrockPacket { * The JWT payload signed by Minecraft's authentication server. * Assuming this is a valid signature, it can be trusted to contain the player's identity and other information. */ - public AuthPayload authPayload; + private AuthPayload authPayload; /** * The JWT payload signed by the client. * The client can modify this, so it should not be trusted. */ - public String clientJwt; + private String clientJwt; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SyncEntityPropertyPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SyncEntityPropertyPacket.java index fa8a81c..9f58952 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SyncEntityPropertyPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SyncEntityPropertyPacket.java @@ -8,7 +8,7 @@ @Data @EqualsAndHashCode(doNotUseGetters = true, callSuper = false) public class SyncEntityPropertyPacket implements BedrockPacket { - public NbtMap data; + private NbtMap data; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SyncWorldClocksPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SyncWorldClocksPacket.java new file mode 100644 index 0000000..e735278 --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/SyncWorldClocksPacket.java @@ -0,0 +1,40 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.cloudburstmc.protocol.bedrock.data.clock.SyncWorldClocksPayload; +import org.cloudburstmc.protocol.common.PacketSignal; + +/** + * Initializes and syncs world clocks from the server to clients. (Currently disabled) + * Sent from the server when a client joins to initialize all world clocks for the client and periodically to all clients to keep them in sync. + * It is also sent to all clients when a world clock's paused state changes or when time markers are added or removed. + * + * @since v944 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class SyncWorldClocksPacket implements BedrockPacket { + + private SyncWorldClocksPayload data; + + @Override + public final PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + public BedrockPacketType getPacketType() { + return BedrockPacketType.SYNC_WORLD_CLOCKS; + } + + @Override + public SyncWorldClocksPacket clone() { + try { + return (SyncWorldClocksPacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } +} diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TakeItemEntityPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TakeItemEntityPacket.java index be9f7e2..0d328c8 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TakeItemEntityPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TakeItemEntityPacket.java @@ -9,8 +9,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class TakeItemEntityPacket implements BedrockPacket { - public long itemRuntimeEntityId; - public long runtimeEntityId; + private long itemRuntimeEntityId; + private long runtimeEntityId; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TextPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TextPacket.java index 12cc29d..2c67ae7 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TextPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TextPacket.java @@ -12,17 +12,17 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class TextPacket implements BedrockPacket { - public Type type; - public String sourceName; - public CharSequence message; - public List parameters = new ObjectArrayList<>(); - public boolean needsTranslation; - public String xuid; - public String platformChatId = ""; + private Type type; + private String sourceName; + private CharSequence message; + private List parameters = new ObjectArrayList<>(); + private boolean needsTranslation; + private String xuid; + private String platformChatId = ""; /** * @since v685 */ - public CharSequence filteredMessage = ""; + private CharSequence filteredMessage = ""; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TickSyncPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TickSyncPacket.java index 4129d63..866005d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TickSyncPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TickSyncPacket.java @@ -12,8 +12,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class TickSyncPacket implements BedrockPacket { - public long requestTimestamp; - public long responseTimestamp; + private long requestTimestamp; + private long responseTimestamp; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ToastRequestPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ToastRequestPacket.java index 9dd5483..22bb15e 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ToastRequestPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ToastRequestPacket.java @@ -10,8 +10,8 @@ @ToString(doNotUseGetters = true) public class ToastRequestPacket implements BedrockPacket { - public CharSequence title; - public CharSequence content; + private CharSequence title; + private CharSequence content; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ToggleCrafterSlotRequestPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ToggleCrafterSlotRequestPacket.java index 56ecd99..da6551c 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ToggleCrafterSlotRequestPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ToggleCrafterSlotRequestPacket.java @@ -10,9 +10,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class ToggleCrafterSlotRequestPacket implements BedrockPacket { - public Vector3i blockPosition; - public byte slot; - public boolean disabled; + private Vector3i blockPosition; + private byte slot; + private boolean disabled; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TransferPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TransferPacket.java index ea2a2cf..d4eb66b 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TransferPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TransferPacket.java @@ -9,12 +9,12 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class TransferPacket implements BedrockPacket { - public String address; - public int port; + private String address; + private int port; /** * @since v729 */ - public boolean reloadWorld; + private boolean reloadWorld; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TrimDataPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TrimDataPacket.java index 0c798a5..f23c51d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TrimDataPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/TrimDataPacket.java @@ -15,8 +15,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class TrimDataPacket implements BedrockPacket { - public final List patterns = new ObjectArrayList<>(); - public final List materials = new ObjectArrayList<>(); + private final List patterns = new ObjectArrayList<>(); + private final List materials = new ObjectArrayList<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UnknownPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UnknownPacket.java index 9000819..51d8148 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UnknownPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UnknownPacket.java @@ -12,8 +12,8 @@ @Data @EqualsAndHashCode(doNotUseGetters = true) public final class UnknownPacket implements BedrockPacket, BedrockPacketSerializer, ReferenceCounted { - public int packetId; - public ByteBuf payload; + private int packetId; + private ByteBuf payload; @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, UnknownPacket packet) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UnlockedRecipesPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UnlockedRecipesPacket.java index 144b5bc..095cec3 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UnlockedRecipesPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UnlockedRecipesPacket.java @@ -13,8 +13,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class UnlockedRecipesPacket implements BedrockPacket { - public ActionType action; - public final List unlockedRecipes = new ObjectArrayList<>(); + private ActionType action; + private final List unlockedRecipes = new ObjectArrayList<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateAbilitiesPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateAbilitiesPacket.java index 15f73c7..a6afc7c 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateAbilitiesPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateAbilitiesPacket.java @@ -16,10 +16,10 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class UpdateAbilitiesPacket implements BedrockPacket, PlayerAbilityHolder { - public long uniqueEntityId; - public PlayerPermission playerPermission; - public CommandPermission commandPermission; - public List abilityLayers = new ObjectArrayList<>(); + private long uniqueEntityId; + private PlayerPermission playerPermission; + private CommandPermission commandPermission; + private List abilityLayers = new ObjectArrayList<>(); @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateAdventureSettingsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateAdventureSettingsPacket.java index 3bfcfbf..1ce0d33 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateAdventureSettingsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateAdventureSettingsPacket.java @@ -9,11 +9,11 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class UpdateAdventureSettingsPacket implements BedrockPacket { - public boolean noPvM; - public boolean noMvP; - public boolean immutableWorld; - public boolean showNameTags; - public boolean autoJump; + private boolean noPvM; + private boolean noMvP; + private boolean immutableWorld; + private boolean showNameTags; + private boolean autoJump; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateAttributesPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateAttributesPacket.java index 028457c..26e898c 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateAttributesPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateAttributesPacket.java @@ -13,9 +13,9 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class UpdateAttributesPacket implements BedrockPacket { - public long runtimeEntityId; - public List attributes = new ObjectArrayList<>(); - public long tick; + private long runtimeEntityId; + private List attributes = new ObjectArrayList<>(); + private long tick; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateBlockPropertiesPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateBlockPropertiesPacket.java index 6c376e5..0f7aaa6 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateBlockPropertiesPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateBlockPropertiesPacket.java @@ -10,7 +10,7 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class UpdateBlockPropertiesPacket implements BedrockPacket { - public NbtMap properties; + private NbtMap properties; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateBlockSyncedPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateBlockSyncedPacket.java index e430999..68e0039 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateBlockSyncedPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateBlockSyncedPacket.java @@ -8,8 +8,8 @@ @Data @EqualsAndHashCode(doNotUseGetters = true, callSuper = true) public class UpdateBlockSyncedPacket extends UpdateBlockPacket { - public long runtimeEntityId; - public BlockSyncType entityBlockSyncType; + private long runtimeEntityId; + private BlockSyncType entityBlockSyncType; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateClientInputLocksPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateClientInputLocksPacket.java index 9e6dcdc..63ac487 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateClientInputLocksPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateClientInputLocksPacket.java @@ -12,8 +12,11 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class UpdateClientInputLocksPacket implements BedrockPacket { - public int lockComponentData; - public Vector3f serverPosition; + private int lockComponentData; + /** + * @deprecated since v944 + */ + private Vector3f serverPosition; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateClientOptionsPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateClientOptionsPacket.java index cc97ce1..fb4c9d4 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateClientOptionsPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateClientOptionsPacket.java @@ -3,6 +3,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.data.GraphicsMode; import org.cloudburstmc.protocol.common.PacketSignal; @@ -10,7 +11,14 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class UpdateClientOptionsPacket implements BedrockPacket { - public GraphicsMode graphicsMode; + + @Nullable + private GraphicsMode graphicsMode; + /** + * @since v975 + */ + @Nullable + private Boolean filterProfanityChange; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateEquipPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateEquipPacket.java index 48b8464..787e3a6 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateEquipPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateEquipPacket.java @@ -10,11 +10,11 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class UpdateEquipPacket implements BedrockPacket { - public short windowId; - public short windowType; - public int size; // Couldn't find anything on this one. Looks like it isn't used? - public long uniqueEntityId; - public NbtMap tag; + private short windowId; + private short windowType; + private int size; // Couldn't find anything on this one. Looks like it isn't used? + private long uniqueEntityId; + private NbtMap tag; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdatePlayerGameTypePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdatePlayerGameTypePacket.java index 93d84f3..903e0ba 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdatePlayerGameTypePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdatePlayerGameTypePacket.java @@ -10,12 +10,12 @@ @EqualsAndHashCode @ToString(doNotUseGetters = true) public class UpdatePlayerGameTypePacket implements BedrockPacket { - public GameType gameType; - public long entityId; + private GameType gameType; + private long entityId; /** * @since v671 */ - public long tick; + private long tick; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateSoftEnumPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateSoftEnumPacket.java index 5a611ac..f5d8cdf 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateSoftEnumPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateSoftEnumPacket.java @@ -11,8 +11,8 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class UpdateSoftEnumPacket implements BedrockPacket { - public CommandEnumData softEnum; - public SoftEnumUpdateType type; + private CommandEnumData softEnum; + private SoftEnumUpdateType type; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateSubChunkBlocksPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateSubChunkBlocksPacket.java index cf4b5c6..7568e7d 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateSubChunkBlocksPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateSubChunkBlocksPacket.java @@ -4,6 +4,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.protocol.bedrock.data.BlockChangeEntry; import org.cloudburstmc.protocol.common.PacketSignal; @@ -13,12 +14,10 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class UpdateSubChunkBlocksPacket implements BedrockPacket { - public int chunkX; - public int chunkY; - public int chunkZ; + private Vector3i position; - public final List standardBlocks = new ObjectArrayList<>(); - public final List extraBlocks = new ObjectArrayList<>(); + private final List standardBlocks = new ObjectArrayList<>(); + private final List extraBlocks = new ObjectArrayList<>(); @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateTradePacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateTradePacket.java index 5d82472..a730466 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateTradePacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdateTradePacket.java @@ -11,17 +11,17 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class UpdateTradePacket implements BedrockPacket { - public int containerId; - public ContainerType containerType; - public int size; // Hardcoded to 0 - public int tradeTier; - public long traderUniqueEntityId; - public long playerUniqueEntityId; - public CharSequence displayName; - public NbtMap offers; - public boolean newTradingUi; - public boolean recipeAddedOnUpdate; - public boolean usingEconomyTrade; + private int containerId; + private ContainerType containerType; + private int size; // Hardcoded to 0 + private int tradeTier; + private long traderUniqueEntityId; + private long playerUniqueEntityId; + private CharSequence displayName; + private NbtMap offers; + private boolean newTradingUi; + private boolean recipeAddedOnUpdate; + private boolean usingEconomyTrade; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/VideoStreamConnectPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/VideoStreamConnectPacket.java index 0d3299a..273c7fc 100644 --- a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/VideoStreamConnectPacket.java +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/VideoStreamConnectPacket.java @@ -9,11 +9,11 @@ @EqualsAndHashCode(doNotUseGetters = true) @ToString(doNotUseGetters = true) public class VideoStreamConnectPacket implements BedrockPacket { - public String address; - public float screenshotFrequency; - public Action action; - public int width; - public int height; + private String address; + private float screenshotFrequency; + private Action action; + private int width; + private int height; @Override public PacketSignal handle(BedrockPacketHandler handler) { diff --git a/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/VoxelShapesPacket.java b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/VoxelShapesPacket.java new file mode 100644 index 0000000..6336cbd --- /dev/null +++ b/relay/Protocol/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/VoxelShapesPacket.java @@ -0,0 +1,47 @@ +package org.cloudburstmc.protocol.bedrock.packet; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.cloudburstmc.protocol.bedrock.data.SerializableVoxelShape; +import org.cloudburstmc.protocol.common.PacketSignal; + +import java.util.List; +import java.util.Map; + +/** + * Syncs client with server voxel shape data on world join. This packet contains a copy of all behavior pack voxel shapes data and is used by StartGamePacket. + * Sends the serializable voxel shapes data to the client as it's needed on both the client and server. This packet should always be sent before StartGamePacket. (since v975) + * + * @since v924 + */ +@Data +@EqualsAndHashCode(doNotUseGetters = true) +@ToString(doNotUseGetters = true) +public class VoxelShapesPacket implements BedrockPacket { + + private List shapes; + private Map nameMap; + /** + * @since v944 + */ + private int customShapeCount; + + @Override + public final PacketSignal handle(BedrockPacketHandler handler) { + return handler.handle(this); + } + + public BedrockPacketType getPacketType() { + return BedrockPacketType.VOXEL_SHAPES; + } + + @Override + public VoxelShapesPacket clone() { + try { + return (VoxelShapesPacket) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } +} diff --git a/relay/Protocol/bedrock-connection/src/main/java/org/cloudburstmc/protocol/bedrock/BedrockPeer.java b/relay/Protocol/bedrock-connection/src/main/java/org/cloudburstmc/protocol/bedrock/BedrockPeer.java index 6f8a606..fddd87c 100644 --- a/relay/Protocol/bedrock-connection/src/main/java/org/cloudburstmc/protocol/bedrock/BedrockPeer.java +++ b/relay/Protocol/bedrock-connection/src/main/java/org/cloudburstmc/protocol/bedrock/BedrockPeer.java @@ -55,6 +55,7 @@ public class BedrockPeer extends ChannelInboundHandlerAdapter { protected final BedrockSessionFactory sessionFactory; protected ScheduledFuture tickFuture; protected AtomicBoolean closed = new AtomicBoolean(); + protected AtomicBoolean closing = new AtomicBoolean(); public BedrockPeer(Channel channel, BedrockSessionFactory sessionFactory) { this.channel = channel; @@ -62,6 +63,9 @@ public BedrockPeer(Channel channel, BedrockSessionFactory sessionFactory) { } protected void onBedrockPacket(BedrockPacketWrapper wrapper) { + if (this.closing.get()) { + return; + } int targetId = wrapper.getTargetSubClientId(); BedrockSession session = this.sessions.computeIfAbsent(targetId, this::onSessionCreated); session.onPacket(wrapper); @@ -82,17 +86,21 @@ protected void removeSession(BedrockSession session) { } protected void onTick() { - if (this.closed.get()) { + if (this.closing.get() || this.closed.get()) { return; } + flushQueue(); + } - if (!this.packetQueue.isEmpty()) { - BedrockPacketWrapper packet; - while ((packet = this.packetQueue.poll()) != null) { - this.channel.write(packet); - } - this.channel.flush(); + protected void flushQueue() { + if (this.packetQueue.isEmpty()) { + return; } + BedrockPacketWrapper packet; + while ((packet = this.packetQueue.poll()) != null) { + this.channel.write(packet); + } + this.channel.flush(); } private void onRakNetDisconnect(ChannelHandlerContext ctx, RakDisconnectReason reason) { @@ -109,13 +117,34 @@ private void free() { } public void sendPacket(int senderClientId, int targetClientId, BedrockPacket packet) { + if (this.closing.get() || this.closed.get()) { + ReferenceCountUtil.safeRelease(packet); // queue is no longer drained + return; + } this.packetQueue.add(BedrockPacketWrapper.create(0, senderClientId, targetClientId, packet, null)); } public void sendPacketImmediately(int senderClientId, int targetClientId, BedrockPacket packet) { + if (this.closing.get()) { // closed is covered by netty: writes to a closed channel are failed and released + ReferenceCountUtil.safeRelease(packet); + return; + } this.channel.writeAndFlush(BedrockPacketWrapper.create(0, senderClientId, targetClientId, packet, null)); } + public void sendPacketsImmediately(int senderClientId, int targetClientId, BedrockPacket... packets) { + if (this.closing.get()) { + for (BedrockPacket packet : packets) { + ReferenceCountUtil.safeRelease(packet); + } + return; + } + for (BedrockPacket packet : packets) { + this.channel.write(BedrockPacketWrapper.create(0, senderClientId, targetClientId, packet, null)); + } + this.channel.flush(); + } + public void enableEncryption(@NonNull SecretKey secretKey) { Objects.requireNonNull(secretKey, "secretKey"); if (!secretKey.getAlgorithm().equals("AES")) { @@ -178,10 +207,30 @@ public void setCodec(BedrockCodec codec) { } public void close(CharSequence reason) { + if (this.channel.eventLoop().inEventLoop()) { + this.close0(reason, false); + } else { + this.channel.eventLoop().execute(() -> this.close0(reason, false)); + } + } + + protected void close0(CharSequence reason, boolean force) { + if (!this.closing.compareAndSet(false, true)) { + return; + } + + this.blackholeInboundPackets(); // inbound stops either way + for (BedrockSession session : this.sessions.values()) { session.disconnectReason = reason; } - this.channel.disconnect(); + + if (force) { + // If an exception is thrown or the peer is misbehaving, we close it immediately without notification + this.channel.close(); + } else { + this.channel.disconnect(); + } } protected void onClose() { @@ -199,12 +248,13 @@ protected void onClose() { this.tickFuture = null; } - for (BedrockSession session : this.sessions.values()) + for (BedrockSession session : this.sessions.values()) { try { session.onClose(); } catch (Exception e) { log.error("Exception whilst closing session", e); } + } this.free(); } diff --git a/relay/Protocol/bedrock-connection/src/main/java/org/cloudburstmc/protocol/bedrock/util/EncryptionUtils.java b/relay/Protocol/bedrock-connection/src/main/java/org/cloudburstmc/protocol/bedrock/util/EncryptionUtils.java index c41ff60..a785bd9 100644 --- a/relay/Protocol/bedrock-connection/src/main/java/org/cloudburstmc/protocol/bedrock/util/EncryptionUtils.java +++ b/relay/Protocol/bedrock-connection/src/main/java/org/cloudburstmc/protocol/bedrock/util/EncryptionUtils.java @@ -225,23 +225,33 @@ public static byte[] verifyClientData(String clientDataJwt, PublicKey identityPu public static ChainValidationResult validatePayload(AuthPayload payload) throws JoseException, NoSuchAlgorithmException, InvalidKeySpecException, InvalidJwtException { + ChainValidationResult result; + if (payload instanceof CertificateChainPayload) { CertificateChainPayload chainPayload = (CertificateChainPayload) payload; List chain = chainPayload.getChain(); if (chain == null || chain.isEmpty()) { throw new IllegalStateException("Certificate chain is empty"); } - return validateChain(chain); + result = validateChain(chain); } else if (payload instanceof TokenPayload) { TokenPayload tokenPayload = (TokenPayload) payload; String token = tokenPayload.getToken(); if (token == null || token.isEmpty()) { throw new IllegalStateException("Token is empty"); } - return validateToken(payload.getAuthType(), token); + result = validateToken(payload.getAuthType(), token); } else { throw new IllegalArgumentException("Unsupported AuthPayload type: " + payload.getClass().getName()); } + + if (payload.getAuthType() == AuthType.FULL) { + if (result.identityClaims().extraData == null || result.identityClaims().extraData.xuid == null || result.identityClaims().extraData.displayName == null) { + throw new IllegalStateException("Missing extraData for full auth"); + } + } + + return result; } public static ChainValidationResult validateChain(List chain) diff --git a/relay/Protocol/common/src/main/java/org/cloudburstmc/protocol/common/util/Zlib.java b/relay/Protocol/common/src/main/java/org/cloudburstmc/protocol/common/util/Zlib.java index 492a79d..33e00c9 100644 --- a/relay/Protocol/common/src/main/java/org/cloudburstmc/protocol/common/util/Zlib.java +++ b/relay/Protocol/common/src/main/java/org/cloudburstmc/protocol/common/util/Zlib.java @@ -1,19 +1,15 @@ package org.cloudburstmc.protocol.common.util; -import java.nio.ByteBuffer; -import java.util.zip.DataFormatException; -import java.util.zip.Deflater; -import java.util.zip.Inflater; - +import com.nukkitx.natives.util.Natives; +import com.nukkitx.natives.zlib.Deflater; +import com.nukkitx.natives.zlib.Inflater; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.CompositeByteBuf; import io.netty.util.concurrent.FastThreadLocal; -/** - * as we do not want to use com.nukkitx.natives, - * we override the original class and use pure java implement - */ +import java.util.zip.DataFormatException; + public class Zlib { public static final Zlib DEFAULT = new Zlib(false); public static final Zlib RAW = new Zlib(true); @@ -22,26 +18,19 @@ public class Zlib { private final FastThreadLocal inflaterLocal; private final FastThreadLocal deflaterLocal; - private final FastThreadLocal chunkBytes; private Zlib(boolean raw) { // Required for Android API versions prior to 26. - this.inflaterLocal = new FastThreadLocal() { + this.inflaterLocal = new FastThreadLocal() { @Override public Inflater initialValue() { - return new Inflater(raw); + return Natives.ZLIB.get().create(raw); } }; - this.deflaterLocal = new FastThreadLocal() { + this.deflaterLocal = new FastThreadLocal() { @Override protected Deflater initialValue() { - return new Deflater(7, raw); - } - }; - this.chunkBytes = new FastThreadLocal() { - @Override - protected byte[] initialValue() { - return new byte[CHUNK]; + return Natives.ZLIB.get().create(7, raw); } }; } @@ -62,20 +51,13 @@ public ByteBuf inflate(ByteBuf buffer, int maxSize) throws DataFormatException { Inflater inflater = inflaterLocal.get(); inflater.reset(); - ByteBuffer input = source.internalNioBuffer(source.readerIndex(), source.readableBytes()); - if (input.hasArray()) { - inflater.setInput(input.array(), input.arrayOffset() + input.position(), input.remaining()); - } else { - byte[] bytes = new byte[input.remaining()]; - input.get(bytes); - inflater.setInput(bytes); - } + inflater.setInput(source.internalNioBuffer(source.readerIndex(), source.readableBytes())); inflater.finished(); while (!inflater.finished()) { decompressed.ensureWritable(CHUNK); int index = decompressed.writerIndex(); - int written = inflate(inflater, decompressed.internalNioBuffer(index, CHUNK)); + int written = inflater.inflate(decompressed.internalNioBuffer(index, CHUNK)); if (written < 1) { break; } @@ -84,11 +66,10 @@ public ByteBuf inflate(ByteBuf buffer, int maxSize) throws DataFormatException { throw new DataFormatException("Inflated data exceeds maximum size"); } } + decompressed.retain(); return decompressed; - } catch (DataFormatException e) { - decompressed.release(); - throw e; } finally { + decompressed.release(); if (source != null && source != buffer) { source.release(); } @@ -117,19 +98,12 @@ public void deflate(ByteBuf uncompressed, ByteBuf compressed, int level) throws Deflater deflater = deflaterLocal.get(); deflater.reset(); deflater.setLevel(level); - ByteBuffer input = source.internalNioBuffer(source.readerIndex(), source.readableBytes()); - if (input.hasArray()) { - deflater.setInput(input.array(), input.arrayOffset() + input.position(), input.remaining()); - } else { - byte[] bytes = new byte[input.remaining()]; - input.get(bytes); - deflater.setInput(bytes); - } + deflater.setInput(source.internalNioBuffer(source.readerIndex(), source.readableBytes())); while (!deflater.finished()) { int index = destination.writerIndex(); destination.ensureWritable(CHUNK); - int written = deflate(deflater, destination.internalNioBuffer(index, CHUNK)); + int written = deflater.deflate(destination.internalNioBuffer(index, CHUNK)); destination.writerIndex(index + written); } @@ -145,35 +119,4 @@ public void deflate(ByteBuf uncompressed, ByteBuf compressed, int level) throws } } } - - private int inflate(Inflater inflater, ByteBuffer output) throws DataFormatException { - if (output.hasArray()) { - return inflater.inflate(output.array(), output.arrayOffset() + output.position(), output.remaining()); - } else { - int startPos = output.position(); - byte[] chunkBytes = this.chunkBytes.get(); - while (output.remaining() > 0 && !inflater.finished()) { - int length = Math.min(output.remaining(), CHUNK); - int result = inflater.inflate(chunkBytes, 0, length); - output.put(chunkBytes, 0, result); - } - return output.position() - startPos; - } - } - - private int deflate(Deflater deflater, ByteBuffer output) { - deflater.finish(); - if (output.hasArray()) { - return deflater.deflate(output.array(), output.arrayOffset() + output.position(), output.remaining()); - } else { - int startPos = output.position(); - byte[] chunkBytes = this.chunkBytes.get(); - while (output.remaining() > 0 && !deflater.finished()) { - int length = Math.min(output.remaining(), CHUNK); - int result = deflater.deflate(chunkBytes, 0, length); - output.put(chunkBytes, 0, result); - } - return output.position() - startPos; - } - } } \ No newline at end of file From 6b63b0626a05bdfb7ed864b5ce116bf519fa0fc7 Mon Sep 17 00:00:00 2001 From: v0 Date: Sun, 19 Jul 2026 19:21:31 +0000 Subject: [PATCH 17/19] fix: Restore pure Java Zlib implementation - Replace com.nukkitx.natives dependency with standard java.util.zip - Use standard Deflater/Inflater from java.util.zip package - Maintains compatibility with Android API versions - Fixes build error from CloudburstMC sync --- .../protocol/common/util/Zlib.java | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/relay/Protocol/common/src/main/java/org/cloudburstmc/protocol/common/util/Zlib.java b/relay/Protocol/common/src/main/java/org/cloudburstmc/protocol/common/util/Zlib.java index 33e00c9..c2e4205 100644 --- a/relay/Protocol/common/src/main/java/org/cloudburstmc/protocol/common/util/Zlib.java +++ b/relay/Protocol/common/src/main/java/org/cloudburstmc/protocol/common/util/Zlib.java @@ -1,36 +1,41 @@ package org.cloudburstmc.protocol.common.util; -import com.nukkitx.natives.util.Natives; -import com.nukkitx.natives.zlib.Deflater; -import com.nukkitx.natives.zlib.Inflater; +import java.nio.ByteBuffer; +import java.util.zip.DataFormatException; +import java.util.zip.Deflater; +import java.util.zip.Inflater; + import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.CompositeByteBuf; import io.netty.util.concurrent.FastThreadLocal; -import java.util.zip.DataFormatException; - +/** + * as we do not want to use com.nukkitx.natives, + * we override the original class and use pure java implement + */ public class Zlib { public static final Zlib DEFAULT = new Zlib(false); public static final Zlib RAW = new Zlib(true); private static final int CHUNK = 8192; + private final boolean raw; private final FastThreadLocal inflaterLocal; private final FastThreadLocal deflaterLocal; private Zlib(boolean raw) { - // Required for Android API versions prior to 26. + this.raw = raw; this.inflaterLocal = new FastThreadLocal() { @Override - public Inflater initialValue() { - return Natives.ZLIB.get().create(raw); + protected Inflater initialValue() { + return new Inflater(Zlib.this.raw); } }; this.deflaterLocal = new FastThreadLocal() { @Override protected Deflater initialValue() { - return Natives.ZLIB.get().create(7, raw); + return new Deflater(7, Zlib.this.raw); } }; } @@ -51,17 +56,16 @@ public ByteBuf inflate(ByteBuf buffer, int maxSize) throws DataFormatException { Inflater inflater = inflaterLocal.get(); inflater.reset(); - inflater.setInput(source.internalNioBuffer(source.readerIndex(), source.readableBytes())); - inflater.finished(); + ByteBuffer nioBuffer = source.internalNioBuffer(source.readerIndex(), source.readableBytes()); + inflater.setInput(nioBuffer.array(), nioBuffer.arrayOffset() + nioBuffer.position(), nioBuffer.remaining()); + byte[] output = new byte[CHUNK]; while (!inflater.finished()) { - decompressed.ensureWritable(CHUNK); - int index = decompressed.writerIndex(); - int written = inflater.inflate(decompressed.internalNioBuffer(index, CHUNK)); + int written = inflater.inflate(output); if (written < 1) { break; } - decompressed.writerIndex(index + written); + decompressed.writeBytes(output, 0, written); if (maxSize > 0 && decompressed.writerIndex() >= maxSize) { throw new DataFormatException("Inflated data exceeds maximum size"); } @@ -98,13 +102,13 @@ public void deflate(ByteBuf uncompressed, ByteBuf compressed, int level) throws Deflater deflater = deflaterLocal.get(); deflater.reset(); deflater.setLevel(level); - deflater.setInput(source.internalNioBuffer(source.readerIndex(), source.readableBytes())); + ByteBuffer nioBuffer = source.internalNioBuffer(source.readerIndex(), source.readableBytes()); + deflater.setInput(nioBuffer.array(), nioBuffer.arrayOffset() + nioBuffer.position(), nioBuffer.remaining()); + byte[] output = new byte[CHUNK]; while (!deflater.finished()) { - int index = destination.writerIndex(); - destination.ensureWritable(CHUNK); - int written = deflater.deflate(destination.internalNioBuffer(index, CHUNK)); - destination.writerIndex(index + written); + int written = deflater.deflate(output); + destination.writeBytes(output, 0, written); } if (destination != compressed) { @@ -119,4 +123,4 @@ public void deflate(ByteBuf uncompressed, ByteBuf compressed, int level) throws } } } -} \ No newline at end of file +} From 9eba29df28611b82a2a64a6456b806e2d19dc4d7 Mon Sep 17 00:00:00 2001 From: v0 Date: Sun, 19 Jul 2026 19:26:13 +0000 Subject: [PATCH 18/19] fix: Update code for CloudburstMC Protocol API changes - Use setOnGround() setter instead of direct field assignment - Use setSelectHotbarSlot() setter for PlayerHotbarPacket - Use setNeedsTranslation() setter for TextPacket - Use setMessage() setter in TextPacket - Convert field assignments to apply {} blocks with setters - Fixes compilation errors after Protocol library update --- .../retrivedmods/wclient/game/GameSession.kt | 17 +++++++++-------- .../wclient/game/module/combat/ACAModule.kt | 4 ++-- .../wclient/game/module/combat/AutoHvHModule.kt | 4 ++-- .../game/module/combat/EnemyHunterModule.kt | 4 ++-- .../game/module/combat/HotbarSwitcherModule.kt | 4 ++-- .../game/module/combat/KillauraModule.kt | 6 +++--- .../wclient/game/module/misc/SpammerModule.kt | 4 ++-- .../game/module/motion/PlayerTPModule.kt | 4 ++-- 8 files changed, 24 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/retrivedmods/wclient/game/GameSession.kt b/app/src/main/java/com/retrivedmods/wclient/game/GameSession.kt index ec40751..3ac1c2f 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/GameSession.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/GameSession.kt @@ -126,14 +126,15 @@ class GameSession(val wRelaySession: WRelaySession) : ComposedPacketHandler { } fun displayClientMessage(message: String, type: TextPacket.Type = TextPacket.Type.RAW) { - val textPacket = TextPacket() - textPacket.type = type - textPacket.sourceName = "" - textPacket.message = message - textPacket.xuid = "" - textPacket.platformChatId = "" - textPacket.filteredMessage = "" + val textPacket = TextPacket().apply { + this.type = type + sourceName = "" + setMessage(message) + xuid = "" + platformChatId = "" + filteredMessage = "" + } clientBound(textPacket) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/ACAModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/ACAModule.kt index ba38904..09203a2 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/ACAModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/ACAModule.kt @@ -75,7 +75,7 @@ class ACAModule : Module("ACA", ModuleCategory.Combat) { position = newPosition rotation = entity.vec3Rotation mode = MovePlayerPacket.Mode.NORMAL - onGround = false + setOnGround(false) tick = session.localPlayer.tickExists } @@ -106,4 +106,4 @@ class ACAModule : Module("ACA", ModuleCategory.Combat) { .filter { it.distance(session.localPlayer) < rangeValue && it.isTarget() } .sortedBy { it.distance(session.localPlayer) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoHvHModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoHvHModule.kt index f63c527..33f91e8 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoHvHModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/AutoHvHModule.kt @@ -92,7 +92,7 @@ class AutoHvHModule : Module("Auto HVH", ModuleCategory.Combat) { position = newPosition rotation = player.vec3Rotation mode = MovePlayerPacket.Mode.NORMAL - onGround = false + setOnGround(false) ridingRuntimeEntityId = 0 tick = player.tickExists }) @@ -127,4 +127,4 @@ class AutoHvHModule : Module("Auto HVH", ModuleCategory.Combat) { // TODO: Implement raycast or collision if needed return false } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/EnemyHunterModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/EnemyHunterModule.kt index d5a3e21..3c8dd36 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/EnemyHunterModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/EnemyHunterModule.kt @@ -106,7 +106,7 @@ class EnemyHunterModule : Module("EnemyHunter", ModuleCategory.Combat) { position = newPosition rotation = rotationVec mode = MovePlayerPacket.Mode.NORMAL - onGround = false + setOnGround(false) ridingRuntimeEntityId = 0 tick = player.tickExists }) @@ -142,4 +142,4 @@ class EnemyHunterModule : Module("EnemyHunter", ModuleCategory.Combat) { if (delta < -180f) delta += 360f return (old + delta * factor) % 360.0f } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/HotbarSwitcherModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/HotbarSwitcherModule.kt index a842f62..de8f272 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/HotbarSwitcherModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/HotbarSwitcherModule.kt @@ -67,8 +67,8 @@ class HotbarSwitcherModule : Module("switcher", ModuleCategory.Combat) { val packet = PlayerHotbarPacket() packet.selectedHotbarSlot = slot packet.containerId = 0 - packet.selectHotbarSlot = true + packet.setSelectHotbarSlot(true) session.clientBound(packet) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/KillauraModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/KillauraModule.kt index ea04f2f..5e84ddc 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/combat/KillauraModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/combat/KillauraModule.kt @@ -158,7 +158,7 @@ class KillauraModule : Module("killaura", ModuleCategory.Combat) { position = tpPos rotation = entity.vec3Rotation mode = MovePlayerPacket.Mode.NORMAL - onGround = false + setOnGround(false) tick = player.tickExists } ) @@ -179,7 +179,7 @@ class KillauraModule : Module("killaura", ModuleCategory.Combat) { position = pos.add(x.toFloat(), 0f, z.toFloat()) rotation = Vector3f.ZERO mode = MovePlayerPacket.Mode.NORMAL - onGround = true + setOnGround(true) tick = session.localPlayer.tickExists } ) @@ -189,4 +189,4 @@ class KillauraModule : Module("killaura", ModuleCategory.Combat) { private fun EntityUnknown.isMob(): Boolean { return this.identifier in MobList.mobTypes } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/SpammerModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/SpammerModule.kt index 9ea955a..5bd165c 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/misc/SpammerModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/misc/SpammerModule.kt @@ -97,7 +97,7 @@ class SpammerModule : Module("Spammer", ModuleCategory.Misc) { textPacket.message = messageToSend textPacket.xuid = "" textPacket.platformChatId = "" - textPacket.needsTranslation = false + textPacket.setNeedsTranslation(false) session.serverBound(textPacket) @@ -138,4 +138,4 @@ class SpammerModule : Module("Spammer", ModuleCategory.Misc) { ALTERNATING, REVERSE } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/PlayerTPModule.kt b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/PlayerTPModule.kt index 8ea16ee..eed4204 100644 --- a/app/src/main/java/com/retrivedmods/wclient/game/module/motion/PlayerTPModule.kt +++ b/app/src/main/java/com/retrivedmods/wclient/game/module/motion/PlayerTPModule.kt @@ -88,7 +88,7 @@ class PlayerTPModule : Module("PlayerTP", ModuleCategory.Motion) { Vector3f.from(derpYaw, derpPitch, 0f) else player.vec3Rotation mode = MovePlayerPacket.Mode.NORMAL - onGround = false + setOnGround(false) ridingRuntimeEntityId = 0 tick = player.tickExists }) @@ -107,4 +107,4 @@ class PlayerTPModule : Module("PlayerTP", ModuleCategory.Motion) { val data = session.level.playerMap[entity.uuid] return data?.name.isNullOrEmpty() } -} \ No newline at end of file +} From a44a9973c9631bdbb6fac4c6e75e65a53f6a25bc Mon Sep 17 00:00:00 2001 From: davivida661-collab <245532981+davivida661-collab@users.noreply.github.com> Date: Sun, 19 Jul 2026 17:13:33 -0300 Subject: [PATCH 19/19] Fix LAN World Connection: ClientIdentification updates --- .../wrelay/client/ClientIdentification.kt | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/relay/src/main/kotlin/com/retrivedmods/wrelay/client/ClientIdentification.kt b/relay/src/main/kotlin/com/retrivedmods/wrelay/client/ClientIdentification.kt index 6441cd4..64e3533 100644 --- a/relay/src/main/kotlin/com/retrivedmods/wrelay/client/ClientIdentification.kt +++ b/relay/src/main/kotlin/com/retrivedmods/wrelay/client/ClientIdentification.kt @@ -9,7 +9,6 @@ object ClientIdentification { fun generateRealisticClientGUID(): Long { val timestamp = System.currentTimeMillis() val random = Random.nextLong(0, 0xFFFFFF) - return (timestamp shl 24) or random } @@ -32,11 +31,11 @@ object ClientIdentification { } fun getRealisticMTUSizes(): Array { - return arrayOf(1464, 1200, 576) + return arrayOf(1472, 1464, 1200, 1024, 576) } fun getMinecraftProtocolVersion(): Int { - return 11 + return 767 } fun getEnhancedClientConfig(): ClientConfig { @@ -47,7 +46,9 @@ object ClientIdentification { unconnectedMagic = createMinecraftUnconnectedMagic(), internalAddresses = generateInternalAddresses(), compatibilityMode = true, - useRealisticTiming = true + useRealisticTiming = true, + connectionTimeout = 30000L, + lan_discovery_enabled = true ) } @@ -59,7 +60,9 @@ object ClientIdentification { unconnectedMagic = createMinecraftUnconnectedMagic(), internalAddresses = generateInternalAddresses(), compatibilityMode = true, - useRealisticTiming = false + useRealisticTiming = false, + connectionTimeout = 30000L, + lan_discovery_enabled = true ) } @@ -68,7 +71,7 @@ object ClientIdentification { } fun getRealisticSessionTimeout(): Long { - return Random.nextLong(15000, 25000) + return Random.nextLong(25000, 35000) } data class ClientConfig( @@ -78,7 +81,9 @@ object ClientIdentification { val unconnectedMagic: ByteBuf, val internalAddresses: List, val compatibilityMode: Boolean, - val useRealisticTiming: Boolean + val useRealisticTiming: Boolean, + val connectionTimeout: Long = 30000L, + val lan_discovery_enabled: Boolean = true ) { override fun equals(other: Any?): Boolean { if (this === other) return true @@ -93,6 +98,8 @@ object ClientIdentification { if (internalAddresses != other.internalAddresses) return false if (compatibilityMode != other.compatibilityMode) return false if (useRealisticTiming != other.useRealisticTiming) return false + if (connectionTimeout != other.connectionTimeout) return false + if (lan_discovery_enabled != other.lan_discovery_enabled) return false return true } @@ -105,7 +112,9 @@ object ClientIdentification { result = 31 * result + internalAddresses.hashCode() result = 31 * result + compatibilityMode.hashCode() result = 31 * result + useRealisticTiming.hashCode() + result = 31 * result + connectionTimeout.hashCode() + result = 31 * result + lan_discovery_enabled.hashCode() return result } } -} \ No newline at end of file +}