Tags
Creators
Details
Licensed GPL-3.0-only
Published 2 months ago
Updated 2 months ago
All versions
0.3.0
Release
ModularShoot 0.3.02 months ago 20
Compatibility
Minecraft: Java Edition
1.21.1
Platform
NeoForge
Supported environments
Client and server
Changes
Breaking Changes
- Network protocol bumped to 4: delta positions now travel at double precision, per-bullet stat/trait snapshots ride inline with each bullet (content addressing keeps pure visuals only), and bullet entries gained a third-party extension field. 0.3.0 is not interoperable with older clients/servers; both sides must update together.
- Unified query return types:
getGunIdandgetStatenow returnOptional(consistent with the other queries) instead ofnull. - Pre-install event enhancement: the plugin install pre-event now carries the framework-selected slot type and supports listener-supplied custom cancellation reasons (constructor change).
Added
- Plugin Java registration and dynamic providers: symmetric to the gun side, plugin definitions can now be registered programmatically (random loot affixes and similar gameplay are no longer a dead end).
- Bullet sync extension channel: third parties can attach custom bytes to every bullet and read them from the client render object (custom rotation/orientation fields no longer need bespoke networking).
- Tunable bullet sync: distance bands, per-band update frequency and the full-sync interval moved into
modularshoot-common.tomlso servers can trade bandwidth to taste. - Dedicated "plugin definition missing" install error: a missing datapack entry after reload no longer misreports as "no slot".
- Extension-point catalogue in the facade javadoc: every registration/event/hook entry listed by subsystem for one-stop discovery.
Changed
- Trait hooks dispatch only for bullets carrying their trait: removes the misleading "register once, self-filter per bullet" semantics and cuts dispatch overhead under heavy bullet counts.
- Idempotent predicate/effect registration: re-registering the same instance no longer stacks it.
- Outline tint registration is thread-safe: GPU texture release is deferred to the render thread when registered elsewhere.
- Batch-uninstall event docs corrected: attribute refresh is deferred to the end of a batch.
- Binding index re-registration repairs stale entries: moving a key to a different item cleans the old reverse index.
- Facade class javadoc corrected: it describes the full framework surface (previously claimed plugins only).
- Two duplicated item-binding indexes collapsed into one generic implementation.
- Render texture cache keys reused across frames instead of rebuilding and re-hashing per draw.
Fixed
- Ammo damage-type presets no longer silently ignored: presets written through the state system are now read by the shooting pipeline.
- Corrupted/malicious bullet sync packets can no longer trigger giant allocations: entry counts and extension lengths are bounded on decode.
- Far-coordinate bullet precision: incremental positions no longer degrade to float, removing drift beyond |16M| and the first-delta position step.
- Cleared state no longer shows stale values on the client: clears now flag the throttled sync too.
- Corrupted/retyped state data no longer crashes tooltip and render reads: decode failures degrade to zero values with rate-limited warnings.
- State default-value type drift: a JSON default for
value_type: floatis no longer decoded as a double and read back as zero. - Datapack error-handling docs corrected: they now state that a single bad JSON aborts the whole registry load (vanilla pipeline behaviour).
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:9y0nNlNt:YLLJYDLN"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:9y0nNlNt:YLLJYDLN"
}

