All versions
๐ด
๐ด
2.3.0
Release
CombatGunSSS 2.3.03 months ago 1,145
Compatibility
Minecraft: Java Edition
1.21.x
Platforms
Bukkit
Paper
Purpur
Spigot
Changes
[2.3.0] - 2026-07-18
Fixed
๐ด CustomItemManager โ Ammo/component items craftable into real vanilla resources without a resource pack (Critical / Economy exploit)
- Root cause: Ammo and component items are built on top of vanilla
Materials purely so a resource pack has something to visually re-skin โ e.g.ar_ammo=Material.GOLD_NUGGET,smg_ammo(and the fallback case) =Material.IRON_NUGGET,sg_ammo=Material.CLAY_BALL, and ingot-type components =Material.IRON_INGOT. Without a resource pack installed, players see these exactly as plain vanilla nuggets/ingots โ and worse, they are those vanilla materials underneath the custom name/lore/model data. The vanilla crafting grid recognised 9ar_ammoitems as 9 realGOLD_NUGGETs and happily crafted them into a realGOLD_INGOT(same forsmg_ammoโ iron ingot, andsg_ammoโ brick via furnace smelting), letting players convert unlimited free ammo into real vanilla resources. - Fix 1: Added
CustomItemManager.isCustomItem(ItemStack)โ a generic check for ourcustom_item_typePDC tag, true for any ammo/component/station item regardless of which vanillaMaterialit's built on. - Fix 2:
CraftingListener.onPrepareCraft()now blocks the vanilla crafting-table result (craftingInventory.setResult(null)) whenever the 3ร3/2ร2 grid contains any of our tagged items and the grid doesn't match one of our own recognised workbench recipes. - Fix 3: New
CraftingListener.onFurnaceSmelt()handler cancelsFurnaceSmeltEvent(covers furnace, blast furnace, and smoker) whenever the item being smelted carries our custom tag โ closing the same hole for materials with a vanilla smelting recipe (e.g. clay ball โ brick).
๐ด GunListener.onMeleeAttack() โ Melee weapons play the hit sound but deal no damage and don't affect the target (Critical)
- Root cause:
onMeleeAttack()cancelled the original swing'sEntityDamageByEntityEventand then calledtarget.damage(gun.getDamage(), player)to apply custom damage manually. That call fires its own freshEntityDamageByEntityEventwith the same damager (the attacking player) and the sameENTITY_ATTACKcause โ which re-entersonMeleeAttack()a second time, synchronously, before the outer call returns. On this inner call,ammoManager.tryMeleeAttack()always failed (the cooldown had just been consumed a few lines above in the outer call), so the inner call cancelled its event โ which was the event actually carrying the damage. The outer call then continued on to play the hit sound and particles regardless, producing the exact symptom reported: audible hit, zero damage, target completely unaffected. This affected melee weapons only (ranged hitscan damage isn't triggered from a listenedEntityDamageByEntityEvent, so it can't recurse the same way). - Fix: Added a
meleeInProgressreentrancy guard (Set<UUID>). The player's UUID is added immediately before callingtarget.damage(...)and removed in afinallyblock right after. IfonMeleeAttack()re-enters for the same player while their UUID is already in the set, it now returns immediately without touchingevent.setCancelled()โ letting the synthetic inner event proceed uncancelled so the damage actually applies.
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:BSt2YZOI:iXLSAsUY"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:BSt2YZOI:iXLSAsUY"
}

