Links
Tags
Creators
Details
All versions
0.0.2-ALPHA
Alpha
OptiX 0.0.2-ALPHA5 months ago 56
Uploaded by
Compatibility
Minecraft: Java Edition
1.21–1.21.8
1.20.x
1.19.x
1.18.x
Platforms
Bukkit
Paper
Spigot
Required content
Unavailable version
Changes
[Build]
- Version bumped from 1.0.1-ALPHA to 0.0.2-ALPHA
- build.gradle: added repos for PlaceholderAPI and WorldGuard [Bug Fixes]
- ChunkCommand: uses sender's world instead of hardcoded "world"
- MobCapManager: removed DROPPED_ITEM from hostile list; moved HOGLIN/ZOGLIN to passive; spawn caps now apply to ALL spawn reasons
- HopperBatcher: uses hopper-specific threshold (hopper-batching.threshold) instead of mob cap threshold
- PlayerViewDistanceManager: uses PVD-specific threshold (player-view-distance.threshold) instead of redstone threshold
- TickBudgetEnforcer: replaced fragile reflection with Paper Mob.setAI() API; AI saves/restores on recovery + shutdown via UUID-to-state map
- ParticleLimiter: removed unrelated teleport-cancel logic
- ChunkActivityListener.onChunkUnload: properly cleans up heat map entries (added ChunkHeatMap.removeEntry())
- EntityPacketSmoother: actually staggers view distance over 60 ticks instead of being a no-op loop
- Duplicate imports in OptiX.java cleaned up
- SpawnAggregator: shutdown() now called in onDisable() (was orphaned) [Stub Implementations Completed]
- PacketOptimizer: full PacketEvents 2.9.3 integration (packet send/receive listeners, count-based throttling, particle routing)
- RandomTickDegradation: dynamic gamerule RANDOM_TICK_SPEED adjustment
- MobAIDegradation: Mob.setAI(false) in cold chunks
- HopperDegradation: Bukkit metadata tagging for degraded hoppers
- BlockUpdateDegradation: deferred block update queue with flush on restore [PacketEvents Pipeline]
- Initialization uses SpigotPacketEventsBuilder.build()
- PacketOptimizer registers listeners at LOW priority
- Per-player per-packet-type frequency tracking with state thresholds
- PacketThrottleManager shouldDropPacket/shouldThrottleClientPacket wired [Feature Enhancements]
- SpawnAggregator: PlayerQuitEvent handler + 5-minute cleanup task prevents armor stand leaks; TTL-based buffer eviction
- HopperBatcher: O(n*m) entity scan replaced with per-chunk item cache (500ms refresh); item consumption decrements stacks correctly
- ItemEntityOptimizer: chunk-based entity iteration instead of world scan
- MemoryManager: chunk.unload(true) saves before unloading; InterruptedException handled with Thread.currentThread().interrupt()
- GPUEntityTickIntegrator: new class integrated into tick loop (256 batch, 100-tick cycle, processes far mobs when MSPT > 30ms) [New Integrations]
- WorldGuardHook: reflection-based region detection (no compile dep)
- OptiXPlaceholders: runtime PlaceholderAPI detection + resolution
- Metrics (bStats): standalone GZIP-compressed JSON submission every 30min
- UpdateChecker: async GitHub releases API check on startup; notifies admins with optix.admin permission
- ReloadCommand: /opt reload re-reads config + restarts all managers
- DebugCommand: /opt debug [on|off] toggles config debug flag
- ReportCommand: /opt report generates formatted performance report [Polish & Hardening]
- Config validation: budget sum check (auto-adjusts to 100), view distance bounds clamped (2-32), mob cap minimums enforced (10)
- Debug logging toggle via ConfigKeys.DEBUG + OptiXConfig.isDebug()/setDebug()
- Config defaults added for debug, hopper-batching.threshold, player-view-distance.threshold
- Graceful shutdown: stops GPU integrator, metrics, restores all AI [Quality of Life]
- StatusCommand: enhanced with /opt status worlds (per-world breakdown) and memory/governor/chunk statistics
- Updated /opt help with all new subcommands
- DebugCommand, ReportCommand, ReloadCommand registered [EntityTickEvent (Paper API)]
- New EntityTickListener: reflectively registers io.papermc.paper.event.entity .EntityTickEvent at LOWEST priority
- Cancels 50% of ticks for far-from-player mobs, vehicles, and projectiles
- Paper path: zero entity iteration (event-based)
- Spigot fallback: timer task with chunk iteration (getLoadedChunks() -> chunk.getEntities()), avoids world.getEntities() copy allocation
- EntityAIOptimizer, VehicleProcessor, ProjectileTickManager: setPaperMode() and shouldOptimize() support [Auto-Tuning]
- OptiXConfig.applyAutoTune() runs 30s after first enable
- Calibrates: mob caps (entity density), view distance (entity/player ratio), all MSPT thresholds (measured baseline x0.8-2.5)
- Sets auto-tuned: true to prevent re-run [Per-World Config Overrides]
- 3 private helpers in OptiXConfig: getWorldDouble/Int/Boolean
- World-aware overloads for all mob cap and degradation getters
- Pattern: getMobCapHostile("world_nether") checks per-world.world_nether.mob-cap.hostile-cap, falls back to global
- MobCapManager passes world names to cap getters
- ChunkDegradationManager checks per-world enabled flags per strategy
- config.yml updated with per-world documentation + examples
- Added changelogformat.md to project root to outline changelogs
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:8I4CP9mt:CfBxwVb8"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:8I4CP9mt:CfBxwVb8"
}

