Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
f2472c5
feat: add CI workflow to build APK via GitHub Actions
davivida661-collab Jul 19, 2026
76d1387
fix: replace deprecated setup-android with pre-installed SDK, fix Jav…
davivida661-collab Jul 19, 2026
c22dc2d
fix: install Java 8 via apt to avoid JAVA_HOME conflict
davivida661-collab Jul 19, 2026
373250f
fix: add chmod +x gradlew before build
davivida661-collab Jul 19, 2026
810345c
feat: all improvements - auth removed, modules enhanced, cyberpunk th…
davivida661-collab Jul 19, 2026
f761029
fix: compilation errors - imports, Spring reference, Dp type
davivida661-collab Jul 19, 2026
f447e61
fix: OverlayClickGUI module count calculation, add ModuleManager import
davivida661-collab Jul 19, 2026
ddd21ab
feat: protocol 1001 support + 50 new modules (10 per category)
davivida661-collab Jul 19, 2026
66eed4f
fix: rewrite 50 modules - implement beforePacketBound, replace listVa…
davivida661-collab Jul 19, 2026
db2891e
fix: register 49 new modules in ModuleManager so they appear in app
davivida661-collab Jul 19, 2026
799342d
fix: correct ModuleManager imports - AutoBuilderModule path, TargetHu…
davivida661-collab Jul 19, 2026
37e4ead
fix: remove invalid protocol 1001 - library doesn't have v1001 codec
davivida661-collab Jul 19, 2026
cb5f835
fix: remove invalid protocol 1001 from VersionDetector
davivida661-collab Jul 19, 2026
47500a3
feat: add protocol v924/v944/v975/v1001 support (Minecraft 1.26.x)
davivida661-collab Jul 19, 2026
32e5f11
refactor: improve protocol version selection logic
v0 Jul 19, 2026
77d2d5a
refactor: introduce Lombok annotations and update serializer references
v0 Jul 19, 2026
4cdf9f0
Merge pull request #1 from davivida661-collab/servidor-minecraft
vercel[bot] Jul 19, 2026
6b63b06
fix: Restore pure Java Zlib implementation
v0 Jul 19, 2026
9eba29d
fix: Update code for CloudburstMC Protocol API changes
v0 Jul 19, 2026
38d50c8
Merge pull request #2 from davivida661-collab/v0/davivida984-34e7e29d
vercel[bot] Jul 19, 2026
a44a997
Fix LAN World Connection: ClientIdentification updates
davivida661-collab Jul 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
69 changes: 69 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: Compilar WClient APK

on:
push:
branches: [ "*" ]
pull_request:
branches: [ "*" ]
workflow_dispatch:

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: 📦 Instalar Java 8 (via apt, para toolchain do relay)
run: |
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: |
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
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
~/.gradle/build-cache
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-

- name: 🔨 Compilar APK Debug
run: |
chmod +x gradlew
./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 {} \;
3 changes: 1 addition & 2 deletions app/src/main/assets/mcpedata/blocks/index.json
Original file line number Diff line number Diff line change
@@ -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]
Binary file not shown.
2 changes: 1 addition & 1 deletion app/src/main/assets/mcpedata/items/index.json
Original file line number Diff line number Diff line change
@@ -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]

Large diffs are not rendered by default.

148 changes: 22 additions & 126 deletions app/src/main/java/com/retrivedmods/wclient/activity/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,158 +5,56 @@ 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() {
Expand All @@ -177,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")
}
)
}
Expand Down Expand Up @@ -222,8 +120,6 @@ class MainActivity : ComponentActivity() {

override fun onDestroy() {
super.onDestroy()
VerificationManager.cancelAll()

ModuleManager.saveConfig()
}
}
}
Loading