Skip to content
This repository was archived by the owner on Jun 19, 2026. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
065df60
perf: port mojang mappings
Neamyoo-dev Apr 6, 2026
428f49c
chore: prepare to update Minecraft 26.1.1
Neamyoo-dev Apr 6, 2026
7ec7779
chore: update java
Neamyoo-dev Apr 6, 2026
293b1cb
chore: update minecraft, fabric, modlib etc..
Neamyoo-dev Apr 6, 2026
ae4d71d
fix(skia): fix skia (i guess)
Neamyoo-dev Apr 11, 2026
d331a8a
chore(skija): update skija version
Neamyoo-dev Apr 11, 2026
6af3424
fix(utils): port Minecraft 26.1
Neamyoo-dev Apr 11, 2026
3f342be
fix(skia): update skija import and usage
Neamyoo-dev Apr 11, 2026
56f7caf
fix shader work progress...
Neamyoo-dev Apr 11, 2026
a74227b
chore: update Minecraft 26.1.2
Neamyoo-dev Apr 11, 2026
aa40062
feat: fix shader some errors
Neamyoo-dev Apr 11, 2026
701c9fe
chore: clean useless renderer2d
Neamyoo-dev Apr 11, 2026
08288b2
fix(shader): Port Minecraft 26.1
Neamyoo-dev Apr 11, 2026
463ec57
chore: update version
Neamyoo-dev Apr 11, 2026
3f6caf9
fix(mixin): Port Minecraft 26.1
Neamyoo-dev Apr 11, 2026
d4f5e61
fix(gui): Port Minecraft 26.1
Neamyoo-dev Apr 11, 2026
216a0f7
fix(gui): fix GuiResourcePackConvert
Neamyoo-dev Apr 11, 2026
1f22b02
fix(component): Port Minecraft 26.1.2
Neamyoo-dev Apr 11, 2026
3dd4de7
fix(component/TextField): Port Minecraft 26.1.2
Neamyoo-dev Apr 11, 2026
320e11e
fix(command): Port Minecraft 26.1.2
Neamyoo-dev Apr 11, 2026
e9c9f67
Make it Compile! :D
Neamyoo-dev Apr 11, 2026
6a74b23
fix(classTweaker): clean and remove removed mappings
Neamyoo-dev Apr 11, 2026
7915acc
refactor(gradle): migrate build scripts to Kotlin DSL and use version…
Neamyoo-dev Apr 11, 2026
7a6cee5
chore: expand minecraft_version in fabric.mod.json during build
Neamyoo-dev Apr 11, 2026
1ce27a1
fix: resolve mod compatibility issues and missing dependencies
Neamyoo-dev Apr 11, 2026
0f2bcd0
made it can use (maybe only use command to enabled mod)
Neamyoo-dev Apr 12, 2026
383c08b
clean useless logger
Neamyoo-dev Apr 12, 2026
3bf3dc4
feat: javadoc
Neamyoo-dev Apr 12, 2026
022446b
eee
Neamyoo-dev Apr 12, 2026
35c8ffa
ai agents
Neamyoo-dev Apr 17, 2026
64d4d25
Remove Pupper Title Screen and Splash Screen
Neamyoo-dev Apr 17, 2026
9a0a97c
Remove smtc native dll (use the implementation in future)
Neamyoo-dev Apr 17, 2026
f8d5743
Remove useless logo
Neamyoo-dev Apr 17, 2026
ee50dd2
clean
Neamyoo-dev Apr 17, 2026
f692c72
clean
Neamyoo-dev Apr 17, 2026
b27fe77
new gui api
Neamyoo-dev May 10, 2026
f569353
chore: deleted eldodebug license
Neamyoo-dev May 24, 2026
71b04ec
refactor: optimize MusicPlayGui rendering and mouse handling
Neamyoo-dev May 24, 2026
1cf6948
fix: adjust formatting in getClientModName method
Neamyoo-dev May 24, 2026
e84b3ae
fix: update CLIENT_VERSION to 9.0.0a
Neamyoo-dev May 24, 2026
cebecbc
feat: add ias mod for in-game account switching
Neamyoo-dev May 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Pupper Client AI Agent Guide

## Architecture Overview
- **Mod Structure**: Fabric mod with singleton `PupperClient` managing specialized managers (ModManager, EventBus, etc.)
- **Event System**: Custom `EventBus` using reflection for `@EventListener` methods and `EventListener<T>` fields
- **Mods**: Categorized features (HUD, player, render, misc) in `management/mod/impl/`
- **Rendering**: Skia-based UI in `skia/` package, custom shaders in `shader/`
- **Integration**: ViaFabricPlus for version switching, WebSocket for real-time features

## Key Workflows
- **Build**: `./gradlew build` (Loom plugin, Java 25, Minecraft 26.1.2)
- **Run Client**: `./gradlew runClient` (outputs to `run/` directory)
- **First Launch**: Creates `pupper.ok` config file and shows terms screen
- **Mod Initialization**: `ModManager.init()` registers all mods and settings

## Project Conventions
- **Package**: `cn.pupperclient` with subpackages by feature (animation, event, gui, management, mixin, shader, skia, ui, utils)
- **Managers**: Singleton pattern for core systems (e.g., `EventBus.getInstance()`)
- **Events**: Extend `Event` class, post via `EventBus.getInstance().post(event)`
- **Mixins**: Located in `mixin/mixins/` with accessors in `mixin/interfaces/`
- **Dependencies**: Managed via `gradle/libs.versions.toml` version catalog
- **Resources**: Assets in `src/main/resources/assets/pupper/`, configs processed by Gradle

## Integration Points
- **ViaFabricPlus**: Version protocol management via `PupperClient.getProtocolVersion()`
- **WebSocket**: Real-time communication in `management/websocket/`
- **Hypixel**: Server-specific features in `management/hypixel/`
- **Music**: MP3 playback with JLayer in `management/music/`
- **UI**: Custom GUI screens in `gui/`, HUD mods in `management/mod/impl/hud/`

## Examples
- Add mod: Extend `Mod` class, register in `ModManager.initHudMods()`
- Handle event: Annotate method `@EventListener` or use `EventListener<TickEvent>`
- Access Minecraft: Use mixins like `MixinMinecraftClient` for client modifications
- Add setting: Create `Setting` subclass, add via `ModManager.addSetting()`

21 changes: 0 additions & 21 deletions OLD_ELDODEBUG_LICENSE

This file was deleted.

145 changes: 0 additions & 145 deletions build.gradle

This file was deleted.

134 changes: 134 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
plugins {
alias(libs.plugins.fabric.loom)
}

val lwjglVersion = "3.4.1"

val suffix: String = providers.gradleProperty("build_number").getOrElse("local")
version = "${libs.versions.minecraft.get()}-$suffix"
group = property("maven_group") as String
val minecraftVersion = property("minecraft_version") as String

base {
archivesName = property("archives_base_name") as String
}

loom {
accessWidenerPath = file("src/main/resources/pupper.classtweaker")
runs {
named("client") {
vmArgs.addAll(
listOf(
"-Xms512M",
"-Xmx4G",
"-XX:HeapBaseMinAddress=34g"
)
)
}
}
}

repositories {
mavenCentral()
maven("https://jitpack.io")
maven("https://api.modrinth.com/maven")
maven("https://maven.lenni0451.net/everything")
maven("https://repo.viaversion.com/")
maven("https://repo.opencollab.dev/maven-snapshots/")
maven("https://maven.terraformersmc.com/")
maven("https://maven.florianreuth.de/snapshots")
}

configurations {
create("modJij")
"include" {
extendsFrom(getByName("modJij"))
}
"implementation" {
extendsFrom(getByName("modJij"))
}
}

dependencies {
// Minecraft & Fabric base
minecraft(libs.minecraft)
implementation(libs.fabric.loader)
implementation(libs.fabric.api)

// Mod runtime
implementation(libs.viafabricplus.api)
runtimeOnly(libs.sodium)
runtimeOnly(libs.iris)
runtimeOnly(libs.lithium)
runtimeOnly(libs.immediatelyfast)
runtimeOnly(libs.entityculling)
runtimeOnly(libs.ias)
implementation(libs.modmenu)
implementation(libs.viafabricplus)

// lib
"modJij"(libs.smartboot.aio)
"modJij"(libs.caffeine)
"modJij"(libs.humbleui.types)
"modJij"(libs.skija.windows)
"modJij"(libs.junixsocket.common)
"modJij"(libs.java.websocket)
"modJij"(libs.mp3agic)
"modJij"(libs.jlayer)
"modJij"(libs.mp3spi)
"modJij"(libs.jaudiotagger)
"modJij"(libs.jlayer.google)
"modJij"(libs.mcping)
"modJij"(libs.reflect)

// JNA
implementation(libs.jna)
implementation(libs.jna.platform)

// LWJGL NFD
"modJij"(libs.lwjgl.nfd)

// LWJGL NFD Natives
val nfdNatives = listOf(
"natives-linux",
"natives-macos",
"natives-macos-arm64",
"natives-windows"
)
nfdNatives.forEach { classifier ->
"modJij"("org.lwjgl:lwjgl-nfd:$lwjglVersion:$classifier")
}
}

tasks.processResources {
inputs.property("version", project.version)
inputs.property("minecraft_version", minecraftVersion)

filesMatching("fabric.mod.json") {
expand(
mapOf(
"version" to project.version,
"minecraft_version" to minecraftVersion
)
)
}

doLast {
val resourcePath = sourceSets.main.get().resources.srcDirs.first()
val iconFile = File(resourcePath, "assets/pupper/logo.png")
if (!iconFile.exists()) {
throw GradleException("Pupper icon not found: ${iconFile.absolutePath}")
}
}
}

tasks.withType<JavaCompile>().configureEach {
options.release = 25
}

java {
toolchain {
languageVersion = JavaLanguageVersion.of(25)
}
withSourcesJar()
}
10 changes: 4 additions & 6 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
# Done to increase the memory available to gradle.
org.gradle.jvmargs=-Xmx4G
org.gradle.parallel=true

# Fabric Properties
# check these on https://fabricmc.net/develop
minecraft_version=1.21.4
yarn_mappings=1.21.4+build.8
loader_version=0.18.2
minecraft_version=26.1.2
loader_version=0.18.6

# Mod Properties
mod_version=26.1.1
mod_version=26.4.1
maven_group=cn.pupperclient
archives_base_name=pupper

# Dependencies
fabric_version=0.119.4+1.21.4
fabric_api_version=0.145.4+26.1.1
Loading
Loading