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:

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
inspectemptyYou’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": trueThat’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"
}
]
}