Skip to content
All projects
MaintainedMinecraft Bedrock Combat Addon2023 – Present

Blurry's Java PvP

Bedrock has no attack cooldown, no sweep attack, no saturation stat and no custom HUD layer. This addon rebuilds all of them in the Script API and resource pack UI to get Java 1.9 combat working on Bedrock. Released in 2023 and actively maintained since.

  • Minecraft Bedrock
  • Script API
  • Behavior Packs
  • Resource Packs
  • JSON UI
  • Molang
  • TypeScript
  • JavaScript
3 years
Shipped and maintained since 2023
Blurry's Java PvP — Minecraft Bedrock Combat Addon

Overview

Java and Bedrock are different games where combat is concerned, and the difference is structural rather than numerical.

Java's 1.9 combat is built on an attack charge that refills over time. Damage scaling, sweeping edge and the attack indicator all read from that one piece of state. Bedrock has no equivalent. Its combat is click-driven, and the engine exposes no charge value to content creators.

Blurry's Java PvP rebuilds that model on top of Bedrock. It reconstructs the systems the engine does not provide, then gets them to cooperate with the combat Bedrock is already running rather than trying to replace the game wholesale.

The problem

The shallow version of this project is a pack that edits damage numbers.

That approach produces values that match Java and combat that still feels like Bedrock, because the feel does not live in the numbers. It lives in the systems around them: how long an attack takes to recharge, what a sprint hit does to a target's momentum, whether a sword catches more than one entity, whether a shield comes up the instant you ask for it.

Every one of those is something Bedrock either does not provide or provides differently. They also interact, so they cannot be solved one at a time and bolted together. The real work is closer to running a combat state machine alongside the engine's own and keeping the two consistent.

  • No attack cooldown or charge state exists in the engine.
  • No sweep attack hook, so multi-target swings have to be found and applied manually.
  • No saturation stat is exposed, despite it governing regeneration in Java.
  • No HUD API, so none of this state can be shown to the player through supported means.
  • No right-click event, which is how Java raises a shield.
  • The offhand slot is restricted and cannot normally be eaten from.
  • No settings UI, so configuration has to become a command surface.

Combat architecture

Everything else in the addon hangs off one piece of reconstructed state.

What a hit has to pass through
  1. Bedrock attack event
  2. BJP combat state (per-player attack charge)
  3. Attack readiness at moment of hit
  4. Outcome: full hit, weak hit, sweep, knockback
  5. Player feedback via HUD

The model the addon has to implement. Bedrock supplies the attack event and applies its own damage; the steps in between are reconstructed in script, then reconciled with what the engine already did.

Because the engine runs its own combat regardless, the addon cannot simply decide an outcome and write it. It has to account for damage Bedrock has already applied, which is why so many of the systems below are described as reconciling rather than replacing.

Combat systems

Each system below states what Bedrock gives you, what the addon does about it, and why it matters.

Attack cooldown and timed hits

Script APIStateful
Problem
Bedrock has no attack cooldown. There is no charge value to read, no per-weapon recharge rate, and no engine concept of a fully charged hit. In Java that single value governs damage scaling and feeds sweeping edge and the attack indicator.
Approach
The addon tracks its own attack state per player and advances it over time, so at the moment of a hit it knows whether that attack was ready. The outcome is decided from that state, then reconciled with the damage Bedrock has already applied.
Why it matters
This is the foundation the rest of the addon depends on. Without a reliable charge value there is no timed hit, no meaningful sweep, and nothing for the attack indicator to display.

Knockback

Combat feelIterated
Problem
Knockback is where matching Java and matching numbers come apart. Bedrock applies its own impulse on hit, and sprint hits in particular behave differently from Java. Two builds can have identical damage values and feel nothing alike.
Approach
The addon's stated design target is that landing a hit while sprinting gives the same knockback as Java. Reaching that means applying its own impulse without fighting the one the engine has already applied, and tuning the result by feel rather than by matching a number. Java knockback is exposed as a configurable rule rather than hard-coded, so servers can decide whether to run it.
Why it matters
Knockback is the most felt part of combat and the hardest to argue about objectively. It is the clearest case on this project of tuning against player experience instead of a spec.

Sweeping edge

Entity queries
Problem
Bedrock has no sweep. Nothing in the engine says a sword swing should also catch nearby entities, and nothing prevents a naive implementation from hitting the primary target twice once the engine has already damaged it.
Approach
Sweeping Edge finds valid nearby entities and applies damage and knockback to them, while excluding the target Bedrock already handled. The radius used for that search is a tuned value, and a release in the current line corrected it after it was found to be selecting the wrong set of entities.
Why it matters
Multi-target swings are a core part of Java sword combat. The radius correction is a good example of the class of bug that only surfaces once a lot of people are playing.

Shields

Cross-platform input
Problem
Bedrock requires a crouch to raise a shield. Java raises it on right click. Bedrock also gives content creators no direct right-click event to read, so the intent has to be inferred from item use state.
Approach
The shield raises instantly with no crouch required, bound to right click on mouse and to the left trigger on controller.
Why it matters
Supporting both input paths matters on Bedrock, where one world is played on console, mobile and desktop. A combat mechanic that only works on one input method is not shippable on this platform.

Saturation and regeneration

Hidden statHUD
Problem
Bedrock does not expose saturation to content creators. In Java, saturation is a hidden value behind the hunger bar that governs how fast health regenerates and how long hunger holds off. Without it, food behaves noticeably differently.
Approach
The addon models saturation per food item and drives healing from it, so food heals for more and faster. It then surfaces the value in its own HUD bar, making a stat the engine keeps hidden visible to the player.
Why it matters
Sustain between fights is part of how a PvP loop feels. Showing the value also turns an invisible mechanic into something players can actually play around.

Offhand systems

Input design
Problem
Bedrock's offhand is heavily restricted. It accepts a narrow set of items and cannot normally be eaten from, so the Java habit of holding food in the offhand during a fight does not transfer.
Approach
Food can be placed in the offhand and eaten directly from it, toggled by a double-crouch gesture. The gesture exists because Bedrock has no spare input to bind a new action to.
Why it matters
Inventing an input that does not collide with existing controls, and works across touch, controller and keyboard, is its own constraint on this platform.

Custom weapon items

ArchitectureTradeoff
Problem
A Bedrock pack cannot freely reassign attack attributes on vanilla items the way a mod can. Controlling damage and attribute behaviour precisely means controlling the item itself.
Approach
The addon ships its own weapon items rather than trying to reshape vanilla ones. That is what makes the combat attributes controllable, and it is what enables attribute and breach swapping between weapons, along with the axe-only stun slam added in the current line.
Why it matters
The tradeoff is real and is stated up front on the download page: removing the addon deletes all weapons, and players are told to test on a backup world first. Full control over combat attributes in exchange for a destructive uninstall, disclosed rather than hidden.

Java parity details

World behaviour
Problem
Beyond combat itself, a set of small Bedrock behaviours break the illusion: doors and cobwebs behave differently, TNT minecarts do not detonate on impact, and armour durability does not drain the same way.
Approach
Doors create air pockets, cobwebs clear when water touches them, TNT minecarts explode instantly, and armour durability behaviour was corrected in a recent release.
Why it matters
Individually minor. Collectively they are the difference between combat that is Java-like and a world that behaves the way a Java player expects.

HUD and JSON UI

Bedrock gives content creators no HUD API, which makes displaying any of the above a separate engineering problem.

There is no supported way to add a gauge to the player's screen. The attack indicator, the saturation bar and the armour HUD are built in the resource pack UI layer and driven from the same state that governs combat, so what the player sees cannot drift from the mechanic behind it. Both HUD elements are per-player toggles rather than forced on, because not everyone wants extra gauges on a small screen.

This is the part of the project that sits outside the Script API entirely, and it is where the resource pack and UI side of Bedrock does the work.

Configuration

Bedrock has no settings UI for add-ons, so configuration became a command surface split along a permissions boundary.

For a server operator this is the difference between an add-on they can deploy and one they cannot. Locking world rules while leaving personal settings alone is what makes the addon usable in a multiplayer context rather than only in single-player.

  • /admin_config controls world-wide rules and affects everyone on the world or server.
  • /config controls per-player, client-side preferences and affects only the caller.
  • The split is a permissions boundary rather than organisation. A release in the current line tightened admin config so it could not be reached by players who should not have it.
  • Java knockback and the HUD elements are configurable rather than hard-coded, so a server can set its own combat rules while players keep personal display preferences.

Compatibility

Compatibility was treated as a design constraint from the start, not something checked at the end.

The direct route to Java combat on Bedrock runs through experimental toggles or a custom player.json. Both were ruled out. Experimental toggles change engine behaviour for the entire world and break other content; a custom player.json collides with every other add-on that touches the player entity.

Ruling them out meant building the whole feature set from the surface stable Minecraft actually exposes. That is a smaller toolset, and it is the reason the addon can sit alongside other creators' work.

  • Runs on stable Minecraft. No experimental toggles required.
  • No custom player.json, so the player entity is not claimed exclusively.
  • Ships as a single .mcaddon and as separate behaviour and resource packs, so a server can deploy only what it needs.
  • Does not claim perfect compatibility. Conflicts with other add-ons are handled as they are reported.

Performance

The performance floor on Bedrock is not a desktop. It is a phone.

Bedrock scripting runs on the server tick, and the same world is played on mobile and console hardware. That sets the budget. Entity queries are the expensive part of combat work, so the systems that need them, sweep and knockback, are scoped to the area around the attacker rather than scanning broadly.

The practical constraint is that combat code runs on every hit, for every player, on the lowest-spec device in the session. Designing to that floor is a different exercise from optimising afterwards.

Maintaining it through Minecraft updates

This is the part that separates a released product from a prototype.

The current release targets two Minecraft Bedrock lines at once, 26.10 and 1.21.130. Supporting both simultaneously means changes have to hold on the current version without breaking players who have not moved yet.

Across that period the Script API has moved modules out of beta and changed signatures underneath already-shipped content. Tracking those changes is the single largest ongoing cost of Bedrock work, and it does not stop once a feature is finished.

  • Shipped continuously since 2023, through the 1.x line and into the current 2.x beta.
  • Both .mcaddon and split behaviour/resource pack builds published for each release.
  • Distributed on CurseForge and MCPEDL, which have to be kept in step.
  • Older behaviour has to keep working for players who have not updated.

Real player feedback

With a user base this size, the bug reports are the specification.

The loop the project actually runs on
  1. Build
  2. Release
  3. Player reports
  4. Reproduce
  5. Fix
  6. Ship

Releases are driven by what players hit in practice, not by a roadmap written in advance.

A recent release corrected armour durability, fixed shield reset when the shield was not in the offhand, corrected the sweep attack entity radius, restricted admin configuration access, and resolved a floating exploit caused by repeated hits. Every one of those came from real use rather than from local testing.

The beta line is published openly rather than held back, which trades polish for feedback. Open reports currently include shield behaviour, HUD placement on some devices, and mace damage during breach swapping. Those are tracked rather than hidden, and the project is described as in development on its own download page.

Result

  • 1,024,947 downloads on CurseForge, with a separate distribution on MCPEDL.
  • Shipped and maintained from 2023 to the present, across a major version transition.
  • Currently supports two Minecraft Bedrock lines at once, 26.10 and 1.21.130.
  • Runs on stable Minecraft with no experimental toggles and no custom player.json.
  • Serves as the combat foundation for Paragon.

What I learned

  • Combat feel is not a number you can match. Knockback had to be tuned against how it played, which is a different discipline from implementing a spec.
  • Compatibility is an architectural decision made early. Ruling out experimental toggles and player.json shrank the toolset and is the reason the addon still coexists with other content.
  • On Bedrock, a mechanic is not finished until it works on a controller and a phone. Input and HUD constraints are as real as engine ones.
  • Scale changes what a bug is. Exploits and edge cases arrive from players long before they would ever surface in local testing.
  • Shipping into two Minecraft lines at once is a maintenance cost you take on deliberately, in exchange for not stranding the players who have not updated.

Systems I built

Each system is labelled with what is actually shipped today.

  • Attack cooldown and timed hits

    Live

    Per-player attack charge driven off item attack speed, gating full damage on hit timing the way Java 1.9 does.

  • Attack indicator HUD

    Live

    Charge indicator drawn through the resource pack UI layer, since Bedrock gives creators no HUD API.

  • Sweeping edge

    Live

    Sword sweep that damages and knocks back nearby entities without double hitting the primary target.

  • Java knockback

    Live

    Sprint hit knockback retuned to Java feel without fighting the engine's own impulse handling.

  • Shield behaviour

    Live

    Instant raise on right click with no crouch required, rebuilt from item use state.

  • Saturation model

    Live

    Per-food saturation values and a saturation bar, modelled in script because Bedrock exposes no saturation stat.

  • Offhand food eating

    Live

    Eating straight from the offhand slot, toggled by a double crouch, working around Bedrock's offhand restrictions.

  • Attribute and breach swapping

    Live

    Weapon attribute swapping between spear and hotbar items, plus an axe-only stun slam.

  • Two-tier configuration

    Live

    /admin_config for world-wide rules and /config for per-player preferences, with scoped permissions.

  • Java parity details

    Live

    Door air pockets, instant TNT minecart detonation, cobwebs cleared by water, corrected armour durability.

Technologies

  • Minecraft Bedrock
  • Script API
  • Behavior Packs
  • Resource Packs
  • JSON UI
  • Molang
  • TypeScript
  • JavaScript

Want to talk about this work?

I am open to Bedrock development roles, Marketplace studio work and contract projects.