Skip to Content
Dual Wielding

Dual Wielding

As of Point Blank 2.0, available for Minecraft 1.21.11 and (soon, as of writing this) 26.1.2, you may also create dual-wielding functionality for any weapon you want.

The work for this is actually very simple. All of the work is done in creating new animations in Blockbench, and then writing one line of code in the gun json.

In Blockbench, you need to create animations for all animations for the left hand. These should be named the same as the regular animations, with _dwleft as a suffix.

You also need to create animations for the right hand, with the suffix _dwright.

It depends on the animations you have for your gun. If you have just one default reload animation, you only need to create two more.

If your weapon is realistic, maybe you have 3 defaults. You need to create 6 more—3 for the left hand, and 3 for the right hand.

Make sure the length of the animations match their original.

if reload lasts 2000 milliseconds, reload_dwleft also needs to last 2000 milliseconds.

Example of extra dual-wielding animations:

Blockbench dualwielding example

In this example, there are many animations that don’t appear in the screenshot (since the list is so long).

In the example screenshot’s gun, this is the total list of all animations:

fire reload reloadoneleft reloadempty fire_dwleft reloadempty_dwright reloadempty_dwleft reload_dwright reloadoneleft_dwright reload_dwleft reloadoneleft_dwleft draw drawempty idle idleempty idleempty_dwleft idle_dwleft running_dwright runingstart_dwright runningend_dwright off_ground_sprinting_dwright hide hide_dwleft off_ground_sprinting_dwleft running_dwleft runningend_dwleft runningstart_dwleft runing runningstart runningend off_ground_sprinting draw_dwleft drawempty_dwleft inspect inspectempty

You’ll notice that the inspect animations don’t have their own dual-wielding animations. This is because it’s impossible to inspect your guns while dual-wielding in-game.

Usually, games like Call of Duty allow you to inspect while doing so, but that’s because the dual-wielding is fixed. When you’re dual-wielding, you’re holding two of the same type of pistol. But in Point Blank, you can dual-wield any pistols together. Since the system is flexible, it’s impossible to create new inspect animations for every single pair combination of potential dual-wieldable weapons. Especially when you consider dual-wieldable weapons that might appear in content packs.

As you can see, there are already an absurd amount of new animations that have to be created to make dual-wielding work properly. So creating more inspect animations is out of the question.

But after the animation work, you’re basically done.

Enter the gun json and type in this code:

"dualWielding": true

That’s it. When you enter the game, your pistol can be dual-wielded.

Example of a dual-wieldable pistol from the official Blue Archive pack:

{ "name": "ba_commonsense", "type": "Gun", "maxAmmoCapacity": 10, "compatibleAmmo": [ "ammocreative", "ammo9mm" ], "damage": 5, "fireSound": "ba_commonsense", "fireModes" : ["SINGLE"], "rpm": 750, "dualWielding": true, "gunRecoilInitialAmplitude": 0.8, "shakeRecoilAmplitude": 0.35, "shakeRecoilSpeed": 3, "viewRecoilAmplitude": 3, "glowingParts": [ { "name": "glowy" } ], "compatibleAttachmentGroups": [ "smg_muzzle", "hg_sights" ], "features": [ { "type": "MuzzleFlash", "effects": [ { "phase": "firing", "name": "muzzle_flash" } ], "condition": { "allOf": [ { "isUsingDefaultMuzzle": true }, { "doesNotHaveAttachmentGroup": "smg_suppressors" } ] } }, { "type": "PartVisibility", "parts": [ { "name": "sightmount", "visible": true, "condition": { "hasAttachmentGroup": "hg_sights" } } ] }, { "type": "Aiming", "zoom": 0.25, "condition": { "doesNotHaveAttachmentGroup": "hg_sights" } }, { "type": "Sound", "fireSounds": [ { "sound": "ba_commonsense_silenced", "volume": 1, "condition": { "hasAttachmentGroup": "smg_suppressors" } } ] } ], "phasedReloads": [ { "phase": "RELOADING", "condition": "reloadIterationIndex > 1", "duration": 1870, "animation": "animation.model.reload" }, { "phase": "RELOADING", "condition": "reloadIterationIndex == 1", "duration": 1870, "animation": "animation.model.reloadoneleft" }, { "phase": "RELOADING", "condition": "reloadIterationIndex == 0", "duration": 2180, "animation": "animation.model.reloadempty" } ], "effects": [ { "phase": "hit_scan_acquired", "name": "tracer" } ], "inspectAnimations": [ { "name": "animation.model.inspect", "duration": 5450, "condition": "ammoCount > 0" }, { "name": "animation.model.inspectempty", "duration": 5970, "condition": "ammoCount == 0" } ], "idleAnimations": [ { "name": "animation.model.idle", "duration": 100, "condition": "ammoCount > 0" }, { "name": "animation.model.idleempty", "duration": 100, "condition": "ammoCount == 0" } ], "drawAnimations": [ { "name": "animation.model.draw", "duration": 570, "condition": "ammoCount > 0" }, { "name": "animation.model.drawempty", "duration": 570, "condition": "ammoCount == 0" } ] }
Last updated on