添加QBZ191
This commit is contained in:
parent
7e0a8aab38
commit
dc9f63bfbf
43 changed files with 24689 additions and 6 deletions
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"base": {
|
||||
"parent": "superbwarfare:item/qbz_191_base"
|
||||
},
|
||||
"gui_light": "front",
|
||||
"loader": "neoforge:separate_transforms",
|
||||
"perspectives": {
|
||||
"gui": {
|
||||
"parent": "superbwarfare:item/qbz_191_icon"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "superbwarfare:displaysettings/qbz_191.item",
|
||||
"textures": {
|
||||
"layer0": "superbwarfare:item/qbz_191"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "minecraft:item/generated",
|
||||
"textures": {
|
||||
"layer0": "superbwarfare:item/gun_blueprint"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "minecraft:item/generated",
|
||||
"textures": {
|
||||
"layer0": "superbwarfare:item/qbz_191_icon"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
{
|
||||
"parent": "minecraft:recipes/root",
|
||||
"criteria": {
|
||||
"has_qbz_191_blueprint": {
|
||||
"conditions": {
|
||||
"items": [
|
||||
{
|
||||
"items": "superbwarfare:qbz_191_blueprint"
|
||||
}
|
||||
]
|
||||
},
|
||||
"trigger": "minecraft:inventory_changed"
|
||||
},
|
||||
"has_the_recipe": {
|
||||
"conditions": {
|
||||
"recipe": "superbwarfare:qbz_191_smithing"
|
||||
},
|
||||
"trigger": "minecraft:recipe_unlocked"
|
||||
}
|
||||
},
|
||||
"requirements": [
|
||||
[
|
||||
"has_the_recipe",
|
||||
"has_qbz_191_blueprint"
|
||||
]
|
||||
],
|
||||
"rewards": {
|
||||
"recipes": [
|
||||
"superbwarfare:qbz_191_smithing"
|
||||
]
|
||||
}
|
||||
}
|
|
@ -147,6 +147,10 @@
|
|||
{
|
||||
"type": "minecraft:item",
|
||||
"name": "superbwarfare:insidious_blueprint"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"name": "superbwarfare:qbz_191_blueprint"
|
||||
}
|
||||
],
|
||||
"rolls": 1.0
|
||||
|
|
|
@ -59,6 +59,11 @@
|
|||
"name": "superbwarfare:insidious_blueprint",
|
||||
"weight": 10
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"name": "superbwarfare:qbz_191_blueprint",
|
||||
"weight": 10
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"name": "superbwarfare:aa_12_blueprint",
|
||||
|
|
|
@ -154,6 +154,11 @@
|
|||
"name": "superbwarfare:insidious_blueprint",
|
||||
"weight": 10
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"name": "superbwarfare:qbz_191_blueprint",
|
||||
"weight": 10
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"name": "superbwarfare:aa_12_blueprint",
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"type": "minecraft:smithing_transform",
|
||||
"addition": {
|
||||
"tag": "superbwarfare:ingots/cemented_carbide"
|
||||
},
|
||||
"base": {
|
||||
"item": "superbwarfare:epic_material_pack"
|
||||
},
|
||||
"result": {
|
||||
"count": 1,
|
||||
"id": "superbwarfare:qbz_191"
|
||||
},
|
||||
"template": {
|
||||
"item": "superbwarfare:qbz_191_blueprint"
|
||||
}
|
||||
}
|
|
@ -15,6 +15,7 @@
|
|||
"superbwarfare:m_4",
|
||||
"superbwarfare:hk_416",
|
||||
"superbwarfare:qbz_95",
|
||||
"superbwarfare:qbz_191",
|
||||
"superbwarfare:insidious",
|
||||
"superbwarfare:mk_14",
|
||||
"superbwarfare:marlin",
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
"superbwarfare:taser",
|
||||
"superbwarfare:minigun",
|
||||
"superbwarfare:mp_5",
|
||||
"superbwarfare:m_2_hb"
|
||||
"superbwarfare:m_2_hb",
|
||||
"superbwarfare:qbz_191"
|
||||
]
|
||||
}
|
|
@ -0,0 +1,155 @@
|
|||
package com.atsuishio.superbwarfare.client.model.item;
|
||||
|
||||
import com.atsuishio.superbwarfare.Mod;
|
||||
import com.atsuishio.superbwarfare.client.AnimationHelper;
|
||||
import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay;
|
||||
import com.atsuishio.superbwarfare.data.gun.GunData;
|
||||
import com.atsuishio.superbwarfare.data.gun.value.AttachmentType;
|
||||
import com.atsuishio.superbwarfare.event.ClientEventHandler;
|
||||
import com.atsuishio.superbwarfare.item.gun.rifle.Qbz191Item;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import software.bernie.geckolib.animation.AnimationState;
|
||||
import software.bernie.geckolib.cache.object.GeoBone;
|
||||
|
||||
public class Qbz191ItemModel extends CustomGunModel<Qbz191Item> {
|
||||
|
||||
public static float rotXSight = 0f;
|
||||
public static float rotXBipod = 0f;
|
||||
public static float fireRotY = 0f;
|
||||
public static float fireRotZ = 0f;
|
||||
|
||||
@Override
|
||||
public ResourceLocation getAnimationResource(Qbz191Item animatable) {
|
||||
return Mod.loc("animations/qbz_191.animation.json");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceLocation getModelResource(Qbz191Item animatable) {
|
||||
return Mod.loc("geo/qbz_191.geo.json");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceLocation getTextureResource(Qbz191Item animatable) {
|
||||
return Mod.loc("textures/item/qbz_191.png");
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public ResourceLocation getLODModelResource(Qbz191Item animatable) {
|
||||
// return Mod.loc("geo/lod/m_4.geo.json");
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public ResourceLocation getLODTextureResource(Qbz191Item animatable) {
|
||||
// return Mod.loc("textures/item/lod/m_4.png");
|
||||
// }
|
||||
|
||||
@Override
|
||||
public void setCustomAnimations(Qbz191Item animatable, long instanceId, AnimationState<Qbz191Item> animationState) {
|
||||
Player player = Minecraft.getInstance().player;
|
||||
if (player == null) return;
|
||||
ItemStack stack = player.getMainHandItem();
|
||||
if (shouldCancelRender(stack, animationState)) return;
|
||||
|
||||
GeoBone gun = getAnimationProcessor().getBone("bone");
|
||||
GeoBone scope = getAnimationProcessor().getBone("Scope1");
|
||||
GeoBone scope2 = getAnimationProcessor().getBone("Scope2");
|
||||
GeoBone scope3 = getAnimationProcessor().getBone("Scope3");
|
||||
GeoBone sight1fold = getAnimationProcessor().getBone("sight1fold");
|
||||
GeoBone sight2fold = getAnimationProcessor().getBone("sight2fold");
|
||||
|
||||
float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(), 0.8);
|
||||
double zt = ClientEventHandler.zoomTime;
|
||||
double zp = ClientEventHandler.zoomPos;
|
||||
double zpz = ClientEventHandler.zoomPosZ;
|
||||
double fpz = ClientEventHandler.firePosZ * 17 * times;
|
||||
double fp = ClientEventHandler.firePos;
|
||||
double fr = ClientEventHandler.fireRot;
|
||||
|
||||
int type = GunData.from(stack).attachment.get(AttachmentType.SCOPE);
|
||||
rotXSight = Mth.lerp(1.5f * times, rotXSight, type == 0 ? 0 : 90);
|
||||
|
||||
float posY = switch (type) {
|
||||
case 0 -> 0.52f;
|
||||
case 1 -> 0.63f;
|
||||
case 2 -> 0.43f;
|
||||
case 3 -> 0.27f;
|
||||
default -> 0f;
|
||||
};
|
||||
float scaleZ = switch (type) {
|
||||
case 0, 1 -> 0.5f;
|
||||
case 2 -> 0.85f;
|
||||
case 3 -> 0.94f;
|
||||
default -> 0f;
|
||||
};
|
||||
float posZ = switch (type) {
|
||||
case 0 -> 3.4f;
|
||||
case 1 -> 3.5f;
|
||||
case 2 -> 6.6f;
|
||||
case 3 -> 6.4f;
|
||||
default -> 0f;
|
||||
};
|
||||
|
||||
sight1fold.setRotX(rotXSight * Mth.DEG_TO_RAD);
|
||||
sight2fold.setRotX(rotXSight * Mth.DEG_TO_RAD);
|
||||
|
||||
gun.setPosX(3.21f * (float) zp);
|
||||
gun.setPosY(posY * (float) zp - (float) (0.2f * zpz));
|
||||
gun.setPosZ(posZ * (float) zp + (float) (0.2f * zpz));
|
||||
gun.setScaleZ(1f - (scaleZ * (float) zp));
|
||||
gun.setRotZ((float) (0.05f * zpz));
|
||||
scope.setScaleZ(1f - (0.4f * (float) zp));
|
||||
scope2.setScaleZ(1f - (0.27f * (float) zp));
|
||||
scope3.setScaleZ(1f + (0.2f * (float) zp));
|
||||
|
||||
GeoBone shen;
|
||||
if (zt < 0.5) {
|
||||
shen = getAnimationProcessor().getBone("fireRootNormal");
|
||||
} else {
|
||||
shen = switch (type) {
|
||||
case 0 -> getAnimationProcessor().getBone("fireRoot0");
|
||||
case 1 -> getAnimationProcessor().getBone("fireRoot1");
|
||||
case 2 -> getAnimationProcessor().getBone("fireRoot2");
|
||||
case 3 -> getAnimationProcessor().getBone("fireRoot3");
|
||||
default -> getAnimationProcessor().getBone("fireRootNormal");
|
||||
};
|
||||
}
|
||||
|
||||
fireRotY = (float) Mth.lerp(0.5f * times, fireRotY, 0.2f * ClientEventHandler.recoilHorizon * fpz);
|
||||
fireRotZ = (float) Mth.lerp(2f * times, fireRotZ, (0.2f + 0.3 * fpz) * ClientEventHandler.recoilHorizon);
|
||||
|
||||
shen.setPosX(-0.4f * (float) (ClientEventHandler.recoilHorizon * (0.5 + 0.4 * ClientEventHandler.fireSpread)));
|
||||
shen.setPosY((float) (0.15f * fp + 0.18f * fr));
|
||||
shen.setPosZ((float) (0.375 * fp + 0.44f * fr + 0.75 * fpz));
|
||||
shen.setRotX((float) (0.01f * fp + 0.05f * fr + 0.01f * fpz));
|
||||
shen.setRotY(fireRotY);
|
||||
shen.setRotZ(fireRotZ);
|
||||
|
||||
shen.setPosX((float) (shen.getPosX() * (1 - 0.1 * zt)));
|
||||
shen.setPosY((float) (shen.getPosY() * (-1 + 0.8 * zt)));
|
||||
shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt)));
|
||||
shen.setRotX((float) (shen.getRotX() * (1 - (type == 3 ? 0.98 : type == 2 ? 0.97 : 0.92) * zt)));
|
||||
shen.setRotY((float) (shen.getRotY() * (1 - (type == 3 ? 0.95 : 0.9) * zt)));
|
||||
shen.setRotZ((float) (shen.getRotZ() * (1 - 0.4 * zt)));
|
||||
|
||||
CrossHairOverlay.gunRot = shen.getRotZ();
|
||||
|
||||
GeoBone bolt = getAnimationProcessor().getBone("bolt");
|
||||
bolt.setPosZ(3f * (float) ClientEventHandler.firePos);
|
||||
|
||||
ClientEventHandler.gunRootMove(getAnimationProcessor());
|
||||
|
||||
GeoBone camera = getAnimationProcessor().getBone("camera");
|
||||
GeoBone main = getAnimationProcessor().getBone("0");
|
||||
|
||||
float numR = (float) (1 - 0.985 * zt);
|
||||
float numP = (float) (1 - 0.92 * zt);
|
||||
|
||||
AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP);
|
||||
ClientEventHandler.handleReloadShake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ());
|
||||
AnimationHelper.handleShellsAnimation(getAnimationProcessor(), 1f, 0.55f);
|
||||
}
|
||||
}
|
|
@ -48,8 +48,7 @@ public class Hk416ItemRenderer extends CustomGunRenderer<Hk416Item> {
|
|||
ItemModelHelper.handleGunAttachments(bone, itemStack, name);
|
||||
|
||||
if (this.renderPerspective == ItemDisplayContext.FIRST_PERSON_RIGHT_HAND) {
|
||||
if (GunData.from(itemStack).attachment.get(AttachmentType.SCOPE) == 2
|
||||
&& (name.equals("hidden"))) {
|
||||
if (GunData.from(itemStack).attachment.get(AttachmentType.SCOPE) == 2 && name.equals("hidden")) {
|
||||
bone.setHidden(ClientEventHandler.zoomPos > 0.7 && ClientEventHandler.zoom);
|
||||
}
|
||||
if (GunData.from(itemStack).attachment.get(AttachmentType.SCOPE) == 3
|
||||
|
|
|
@ -54,7 +54,7 @@ public class Mp5ItemRenderer extends CustomGunRenderer<Mp5Item> {
|
|||
ItemModelHelper.handleGunAttachments(bone, itemStack, name);
|
||||
|
||||
if (this.renderPerspective == ItemDisplayContext.FIRST_PERSON_RIGHT_HAND) {
|
||||
if (GunData.from(itemStack).attachment.get(AttachmentType.SCOPE) == 2 && (bone.getName().endsWith("_hide2"))) {
|
||||
if (GunData.from(itemStack).attachment.get(AttachmentType.SCOPE) == 2 && bone.getName().endsWith("_hide2")) {
|
||||
bone.setHidden(ClientEventHandler.zoomPos > 0.7 && ClientEventHandler.zoom);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,92 @@
|
|||
package com.atsuishio.superbwarfare.client.renderer.gun;
|
||||
|
||||
import com.atsuishio.superbwarfare.client.AnimationHelper;
|
||||
import com.atsuishio.superbwarfare.client.ItemModelHelper;
|
||||
import com.atsuishio.superbwarfare.client.model.item.Qbz191ItemModel;
|
||||
import com.atsuishio.superbwarfare.client.renderer.CustomGunRenderer;
|
||||
import com.atsuishio.superbwarfare.data.gun.GunData;
|
||||
import com.atsuishio.superbwarfare.data.gun.value.AttachmentType;
|
||||
import com.atsuishio.superbwarfare.event.ClientEventHandler;
|
||||
import com.atsuishio.superbwarfare.item.gun.GunItem;
|
||||
import com.atsuishio.superbwarfare.item.gun.rifle.Qbz191Item;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.world.item.ItemDisplayContext;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import software.bernie.geckolib.animatable.GeoItem;
|
||||
import software.bernie.geckolib.cache.object.GeoBone;
|
||||
|
||||
public class Qbz191ItemRenderer extends CustomGunRenderer<Qbz191Item> {
|
||||
|
||||
public Qbz191ItemRenderer() {
|
||||
super(new Qbz191ItemModel());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderRecursively(PoseStack stack, Qbz191Item animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) {
|
||||
Minecraft mc = Minecraft.getInstance();
|
||||
String name = bone.getName();
|
||||
boolean renderingArms = false;
|
||||
if (name.equals("Lefthand") || name.equals("Righthand")) {
|
||||
bone.setHidden(true);
|
||||
renderingArms = true;
|
||||
} else {
|
||||
bone.setHidden(false);
|
||||
}
|
||||
|
||||
var player = mc.player;
|
||||
if (player == null) return;
|
||||
ItemStack itemStack = player.getMainHandItem();
|
||||
|
||||
boolean needHide = name.equals("Tuoxin");
|
||||
if (itemStack.getItem() instanceof GunItem && GeoItem.getId(itemStack) == this.getInstanceId(animatable)) {
|
||||
if (this.renderPerspective == ItemDisplayContext.FIRST_PERSON_RIGHT_HAND || this.renderPerspective == ItemDisplayContext.THIRD_PERSON_RIGHT_HAND) {
|
||||
|
||||
if (needHide) {
|
||||
bone.setHidden(GunData.from(itemStack).attachment.get(AttachmentType.STOCK) == 0);
|
||||
}
|
||||
|
||||
AnimationHelper.handleShootFlare(name, stack, itemStack, bone, buffer, packedLightIn, 0, 0, 1.353125, 0.3);
|
||||
ItemModelHelper.handleGunAttachments(bone, itemStack, name);
|
||||
|
||||
if (this.renderPerspective == ItemDisplayContext.FIRST_PERSON_RIGHT_HAND) {
|
||||
if (GunData.from(itemStack).attachment.get(AttachmentType.SCOPE) == 2 && bone.getName().endsWith("_hide2")) {
|
||||
bone.setHidden(ClientEventHandler.zoomPos > 0.7 && ClientEventHandler.zoom);
|
||||
}
|
||||
if (GunData.from(itemStack).attachment.get(AttachmentType.SCOPE) == 3 && bone.getName().endsWith("_hide3")) {
|
||||
bone.setHidden(ClientEventHandler.zoomPos > 0.7 && ClientEventHandler.zoom);
|
||||
}
|
||||
|
||||
int scopeType = GunData.from(itemStack).attachment.get(AttachmentType.SCOPE);
|
||||
|
||||
switch (scopeType) {
|
||||
case 1 ->
|
||||
AnimationHelper.handleZoomCrossHair(currentBuffer, renderType, name, stack, bone, buffer, 0, 0.27, 20, 1.2f, 255, 0, 0, 255, "dot", false);
|
||||
case 2 ->
|
||||
AnimationHelper.handleZoomCrossHair(currentBuffer, renderType, name, stack, bone, buffer, 0, 0.28, 13, 1.5f, 255, 0, 0, 255, "qmk", true);
|
||||
case 3 ->
|
||||
AnimationHelper.handleZoomCrossHair(currentBuffer, renderType, name, stack, bone, buffer, 0, 0.275, 27, 0.35f * (float) ClientEventHandler.customZoom, 255, 0, 0, 255, "lpvo", true);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ItemModelHelper.hideAllAttachments(bone, name);
|
||||
if (needHide) {
|
||||
bone.setHidden(true);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ItemModelHelper.hideAllAttachments(bone, name);
|
||||
if (needHide) {
|
||||
bone.setHidden(true);
|
||||
}
|
||||
}
|
||||
|
||||
if (renderingArms) {
|
||||
AnimationHelper.renderArms(player, this.renderPerspective, stack, name, bone, buffer, type, packedLightIn, false);
|
||||
}
|
||||
super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color);
|
||||
}
|
||||
}
|
|
@ -81,7 +81,8 @@ public class ModCustomLootProvider implements LootTableSubProvider {
|
|||
new ItemEntry(ModItems.SVD_BLUEPRINT.get(), 1),
|
||||
new ItemEntry(ModItems.M_98B_BLUEPRINT.get(), 1),
|
||||
new ItemEntry(ModItems.DEVOTION_BLUEPRINT.get(), 1),
|
||||
new ItemEntry(ModItems.INSIDIOUS_BLUEPRINT.get(), 1)
|
||||
new ItemEntry(ModItems.INSIDIOUS_BLUEPRINT.get(), 1),
|
||||
new ItemEntry(ModItems.QBZ_191_BLUEPRINT.get(), 1)
|
||||
))
|
||||
.withPool(multiItems(2, 0,
|
||||
new ItemEntry(ModItems.HANDGUN_AMMO_BOX.get(), 12)
|
||||
|
@ -136,6 +137,7 @@ public class ModCustomLootProvider implements LootTableSubProvider {
|
|||
new ItemEntry(ModItems.M_98B_BLUEPRINT.get(), 10),
|
||||
new ItemEntry(ModItems.DEVOTION_BLUEPRINT.get(), 10),
|
||||
new ItemEntry(ModItems.INSIDIOUS_BLUEPRINT.get(), 10),
|
||||
new ItemEntry(ModItems.QBZ_191_BLUEPRINT.get(), 10),
|
||||
|
||||
new ItemEntry(ModItems.AA_12_BLUEPRINT.get(), 3),
|
||||
new ItemEntry(ModItems.NTW_20_BLUEPRINT.get(), 3),
|
||||
|
@ -181,6 +183,7 @@ public class ModCustomLootProvider implements LootTableSubProvider {
|
|||
new ItemEntry(ModItems.M_98B_BLUEPRINT.get(), 10),
|
||||
new ItemEntry(ModItems.DEVOTION_BLUEPRINT.get(), 10),
|
||||
new ItemEntry(ModItems.INSIDIOUS_BLUEPRINT.get(), 10),
|
||||
new ItemEntry(ModItems.QBZ_191_BLUEPRINT.get(), 10),
|
||||
|
||||
new ItemEntry(ModItems.AA_12_BLUEPRINT.get(), 20),
|
||||
new ItemEntry(ModItems.NTW_20_BLUEPRINT.get(), 20),
|
||||
|
|
|
@ -65,6 +65,7 @@ public class ModItemModelProvider extends ItemModelProvider {
|
|||
gunItem(ModItems.VECTOR);
|
||||
gunItem(ModItems.MP_5);
|
||||
gunItem(ModItems.M_2_HB);
|
||||
gunItem(ModItems.QBZ_191);
|
||||
|
||||
simpleItem(ModItems.EMPTY_PERK, "perk/");
|
||||
|
||||
|
@ -196,6 +197,7 @@ public class ModItemModelProvider extends ItemModelProvider {
|
|||
gunBlueprintItem(ModItems.SECONDARY_CATACLYSM_BLUEPRINT);
|
||||
gunBlueprintItem(ModItems.INSIDIOUS_BLUEPRINT);
|
||||
gunBlueprintItem(ModItems.MP_5_BLUEPRINT);
|
||||
gunBlueprintItem(ModItems.QBZ_191_BLUEPRINT);
|
||||
|
||||
// blocks
|
||||
evenSimplerBlockItem(ModBlocks.BARBED_WIRE);
|
||||
|
|
|
@ -94,7 +94,7 @@ public class ModItemTagProvider extends ItemTagsProvider {
|
|||
ModItems.SKS.get(), ModItems.RPK.get(), ModItems.HK_416.get(), ModItems.AA_12.get(), ModItems.M_4.get(), ModItems.DEVOTION.get(), ModItems.TRACHELIUM.get(), ModItems.M_79.get(),
|
||||
ModItems.HUNTING_RIFLE.get(), ModItems.NTW_20.get(), ModItems.M_98B.get(), ModItems.SENTINEL.get(), ModItems.M_870.get(), ModItems.MARLIN.get(), ModItems.GLOCK_17.get(), ModItems.RPG.get(),
|
||||
ModItems.GLOCK_18.get(), ModItems.M_1911.get(), ModItems.AURELIA_SCEPTRE.get(), ModItems.QBZ_95.get(), ModItems.K_98.get(), ModItems.MOSIN_NAGANT.get(), ModItems.MP_443.get(), ModItems.INSIDIOUS.get(), ModItems.SECONDARY_CATACLYSM.get(),
|
||||
ModItems.TASER.get(), ModItems.MINIGUN.get(), ModItems.MP_5.get(), ModItems.M_2_HB.get());
|
||||
ModItems.TASER.get(), ModItems.MINIGUN.get(), ModItems.MP_5.get(), ModItems.M_2_HB.get(), ModItems.QBZ_191.get());
|
||||
|
||||
this.tag(ModTags.Items.LAUNCHER).add(ModItems.RPG.get(), ModItems.JAVELIN.get())
|
||||
.addTag(ModTags.Items.LAUNCHER_GRENADE);
|
||||
|
|
|
@ -141,6 +141,7 @@ public class ModRecipeProvider extends RecipeProvider {
|
|||
gunSmithing(writer, ModItems.TASER_BLUEPRINT.get(), GunRarity.COMMON, Items.YELLOW_CONCRETE, ModItems.TASER.get());
|
||||
gunSmithing(writer, ModItems.M_1911_BLUEPRINT.get(), GunRarity.COMMON, ModTags.Items.INGOTS_STEEL, ModItems.M_1911.get());
|
||||
gunSmithing(writer, ModItems.QBZ_95_BLUEPRINT.get(), GunRarity.RARE, ModTags.Items.INGOTS_STEEL, ModItems.QBZ_95.get());
|
||||
gunSmithing(writer, ModItems.QBZ_191_BLUEPRINT.get(), GunRarity.EPIC, ModTags.Items.INGOTS_CEMENTED_CARBIDE, ModItems.QBZ_191.get());
|
||||
gunSmithing(writer, ModItems.K_98_BLUEPRINT.get(), GunRarity.RARE, ItemTags.LOGS, ModItems.K_98.get());
|
||||
gunSmithing(writer, ModItems.MOSIN_NAGANT_BLUEPRINT.get(), GunRarity.RARE, ItemTags.LOGS, ModItems.MOSIN_NAGANT.get());
|
||||
gunSmithing(writer, ModItems.JAVELIN_BLUEPRINT.get(), GunRarity.LEGENDARY, ModItems.ANCIENT_CPU.get(), ModItems.JAVELIN.get());
|
||||
|
|
|
@ -61,6 +61,7 @@ public class ModItems {
|
|||
public static final DeferredHolder<Item, M4Item> M_4 = GUNS.register("m_4", M4Item::new);
|
||||
public static final DeferredHolder<Item, Hk416Item> HK_416 = GUNS.register("hk_416", Hk416Item::new);
|
||||
public static final DeferredHolder<Item, Qbz95Item> QBZ_95 = GUNS.register("qbz_95", Qbz95Item::new);
|
||||
public static final DeferredHolder<Item, Qbz191Item> QBZ_191 = GUNS.register("qbz_191", Qbz191Item::new);
|
||||
public static final DeferredHolder<Item, InsidiousItem> INSIDIOUS = GUNS.register("insidious", InsidiousItem::new);
|
||||
public static final DeferredHolder<Item, Mk14Item> MK_14 = GUNS.register("mk_14", Mk14Item::new);
|
||||
public static final DeferredHolder<Item, MarlinItem> MARLIN = GUNS.register("marlin", MarlinItem::new);
|
||||
|
@ -240,6 +241,7 @@ public class ModItems {
|
|||
public static final DeferredHolder<Item, BlueprintItem> TASER_BLUEPRINT = ITEMS.register("taser_blueprint", () -> new BlueprintItem(Rarity.COMMON));
|
||||
public static final DeferredHolder<Item, BlueprintItem> M_1911_BLUEPRINT = ITEMS.register("m_1911_blueprint", () -> new BlueprintItem(Rarity.COMMON));
|
||||
public static final DeferredHolder<Item, BlueprintItem> QBZ_95_BLUEPRINT = ITEMS.register("qbz_95_blueprint", () -> new BlueprintItem(Rarity.RARE));
|
||||
public static final DeferredHolder<Item, BlueprintItem> QBZ_191_BLUEPRINT = ITEMS.register("qbz_191_blueprint", () -> new BlueprintItem(Rarity.EPIC));
|
||||
public static final DeferredHolder<Item, BlueprintItem> K_98_BLUEPRINT = ITEMS.register("k_98_blueprint", () -> new BlueprintItem(Rarity.RARE));
|
||||
public static final DeferredHolder<Item, BlueprintItem> MOSIN_NAGANT_BLUEPRINT = ITEMS.register("mosin_nagant_blueprint", () -> new BlueprintItem(Rarity.RARE));
|
||||
public static final DeferredHolder<Item, BlueprintItem> JAVELIN_BLUEPRINT = ITEMS.register("javelin_blueprint", () -> new BlueprintItem(ModEnumExtensions.getLegendary()));
|
||||
|
|
|
@ -354,6 +354,17 @@ public class ModSounds {
|
|||
public static final DeferredHolder<SoundEvent, SoundEvent> M_2_HB_RELOAD_NORMAL = REGISTRY.register("m_2_hb_reload_normal", () -> SoundEvent.createVariableRangeEvent(Mod.loc("m_2_hb_reload_normal")));
|
||||
public static final DeferredHolder<SoundEvent, SoundEvent> M_2_HB_RELOAD_EMPTY = REGISTRY.register("m_2_hb_reload_empty", () -> SoundEvent.createVariableRangeEvent(Mod.loc("m_2_hb_reload_empty")));
|
||||
|
||||
public static final DeferredHolder<SoundEvent, SoundEvent> QBZ_191_FIRE_1P = REGISTRY.register("qbz_191_fire_1p", () -> SoundEvent.createVariableRangeEvent(Mod.loc("qbz_191_fire_1p")));
|
||||
public static final DeferredHolder<SoundEvent, SoundEvent> QBZ_191_FIRE_3P = REGISTRY.register("qbz_191_fire_3p", () -> SoundEvent.createVariableRangeEvent(Mod.loc("qbz_191_fire_3p")));
|
||||
public static final DeferredHolder<SoundEvent, SoundEvent> QBZ_191_FIRE_1P_S = REGISTRY.register("qbz_191_fire_1p_s", () -> SoundEvent.createVariableRangeEvent(Mod.loc("qbz_191_fire_1p_s")));
|
||||
public static final DeferredHolder<SoundEvent, SoundEvent> QBZ_191_FIRE_3P_S = REGISTRY.register("qbz_191_fire_3p_s", () -> SoundEvent.createVariableRangeEvent(Mod.loc("qbz_191_fire_3p_s")));
|
||||
public static final DeferredHolder<SoundEvent, SoundEvent> QBZ_191_FAR = REGISTRY.register("qbz_191_far", () -> SoundEvent.createVariableRangeEvent(Mod.loc("qbz_191_far")));
|
||||
public static final DeferredHolder<SoundEvent, SoundEvent> QBZ_191_VERYFAR = REGISTRY.register("qbz_191_veryfar", () -> SoundEvent.createVariableRangeEvent(Mod.loc("qbz_191_veryfar")));
|
||||
public static final DeferredHolder<SoundEvent, SoundEvent> QBZ_191_RELOAD_NORMAL = REGISTRY.register("qbz_191_reload_normal", () -> SoundEvent.createVariableRangeEvent(Mod.loc("qbz_191_reload_normal")));
|
||||
public static final DeferredHolder<SoundEvent, SoundEvent> QBZ_191_RELOAD_EMPTY = REGISTRY.register("qbz_191_reload_empty", () -> SoundEvent.createVariableRangeEvent(Mod.loc("qbz_191_reload_empty")));
|
||||
public static final DeferredHolder<SoundEvent, SoundEvent> QBZ_191_FAR_S = REGISTRY.register("qbz_191_far_s", () -> SoundEvent.createVariableRangeEvent(Mod.loc("ak_12_far_s")));
|
||||
public static final DeferredHolder<SoundEvent, SoundEvent> QBZ_191_VERYFAR_S = REGISTRY.register("qbz_191_veryfar_s", () -> SoundEvent.createVariableRangeEvent(Mod.loc("ak_12_veryfar_s")));
|
||||
|
||||
public static final DeferredHolder<SoundEvent, SoundEvent> MK_42_FIRE_1P = REGISTRY.register("mk_42_fire_1p", () -> SoundEvent.createVariableRangeEvent(Mod.loc("mk_42_fire_1p")));
|
||||
public static final DeferredHolder<SoundEvent, SoundEvent> MK_42_FIRE_3P = REGISTRY.register("mk_42_fire_3p", () -> SoundEvent.createVariableRangeEvent(Mod.loc("mk_42_fire_3p")));
|
||||
public static final DeferredHolder<SoundEvent, SoundEvent> MK_42_FAR = REGISTRY.register("mk_42_far", () -> SoundEvent.createVariableRangeEvent(Mod.loc("mk_42_far")));
|
||||
|
|
|
@ -0,0 +1,239 @@
|
|||
package com.atsuishio.superbwarfare.item.gun.rifle;
|
||||
|
||||
import com.atsuishio.superbwarfare.Mod;
|
||||
import com.atsuishio.superbwarfare.client.ClickHandler;
|
||||
import com.atsuishio.superbwarfare.client.renderer.gun.Qbz191ItemRenderer;
|
||||
import com.atsuishio.superbwarfare.data.gun.GunData;
|
||||
import com.atsuishio.superbwarfare.data.gun.value.AttachmentType;
|
||||
import com.atsuishio.superbwarfare.event.ClientEventHandler;
|
||||
import com.atsuishio.superbwarfare.init.ModSounds;
|
||||
import com.atsuishio.superbwarfare.item.gun.GunItem;
|
||||
import com.atsuishio.superbwarfare.tools.GunsTool;
|
||||
import com.atsuishio.superbwarfare.tools.NBTTool;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.player.LocalPlayer;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.sounds.SoundEvent;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.ItemDisplayContext;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.Rarity;
|
||||
import net.minecraft.world.level.Level;
|
||||
import software.bernie.geckolib.animation.*;
|
||||
import software.bernie.geckolib.constant.DataTickets;
|
||||
import software.bernie.geckolib.renderer.GeoItemRenderer;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class Qbz191Item extends GunItem {
|
||||
|
||||
public Qbz191Item() {
|
||||
super(new Properties().stacksTo(1).rarity(Rarity.EPIC));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Supplier<? extends GeoItemRenderer<? extends Item>> getRenderer() {
|
||||
return Qbz191ItemRenderer::new;
|
||||
}
|
||||
|
||||
private PlayState idlePredicate(AnimationState<Qbz191Item> event) {
|
||||
LocalPlayer player = Minecraft.getInstance().player;
|
||||
if (player == null) return PlayState.STOP;
|
||||
ItemStack stack = player.getMainHandItem();
|
||||
if (!(stack.getItem() instanceof GunItem)) return PlayState.STOP;
|
||||
if (event.getData(DataTickets.ITEM_RENDER_PERSPECTIVE) != ItemDisplayContext.FIRST_PERSON_RIGHT_HAND)
|
||||
return event.setAndContinue(RawAnimation.begin().thenLoop("animation.qbz_191.idle"));
|
||||
|
||||
boolean drum = GunData.from(stack).attachment.get(AttachmentType.MAGAZINE) == 2;
|
||||
boolean grip = GunData.from(stack).attachment.get(AttachmentType.GRIP) == 1;
|
||||
|
||||
if (GunData.from(stack).reload.empty()) {
|
||||
if (drum) {
|
||||
if (grip) {
|
||||
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz_191.reload_empty_drum_grip"));
|
||||
} else {
|
||||
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz_191.reload_empty_drum"));
|
||||
}
|
||||
} else {
|
||||
if (grip) {
|
||||
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz_191.reload_empty_grip"));
|
||||
} else {
|
||||
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz_191.reload_empty"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (GunData.from(stack).reload.normal()) {
|
||||
if (drum) {
|
||||
if (grip) {
|
||||
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz_191.reload_normal_drum_grip"));
|
||||
} else {
|
||||
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz_191.reload_normal_drum"));
|
||||
}
|
||||
} else {
|
||||
if (grip) {
|
||||
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz_191.reload_normal_grip"));
|
||||
} else {
|
||||
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz_191.reload_normal"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (player.isSprinting() && player.onGround() && ClientEventHandler.cantSprint == 0 && ClientEventHandler.drawTime < 0.01) {
|
||||
if (ClientEventHandler.tacticalSprint) {
|
||||
return event.setAndContinue(RawAnimation.begin().thenLoop("animation.qbz_191.run_fast"));
|
||||
} else {
|
||||
if (grip) {
|
||||
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz_191.run_grip"));
|
||||
} else {
|
||||
return event.setAndContinue(RawAnimation.begin().thenLoop("animation.qbz_191.run"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (grip) {
|
||||
return event.setAndContinue(RawAnimation.begin().thenLoop("animation.qbz_191.idle_grip"));
|
||||
} else {
|
||||
return event.setAndContinue(RawAnimation.begin().thenLoop("animation.qbz_191.idle"));
|
||||
}
|
||||
}
|
||||
|
||||
private PlayState editPredicate(AnimationState<Qbz191Item> event) {
|
||||
LocalPlayer player = Minecraft.getInstance().player;
|
||||
if (player == null) return PlayState.STOP;
|
||||
ItemStack stack = player.getMainHandItem();
|
||||
if (!(stack.getItem() instanceof GunItem)) return PlayState.STOP;
|
||||
if (event.getData(DataTickets.ITEM_RENDER_PERSPECTIVE) != ItemDisplayContext.FIRST_PERSON_RIGHT_HAND)
|
||||
return event.setAndContinue(RawAnimation.begin().thenLoop("animation.qbz_191.idle"));
|
||||
|
||||
if (ClickHandler.isEditing) {
|
||||
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz_191.edit"));
|
||||
}
|
||||
|
||||
return event.setAndContinue(RawAnimation.begin().thenLoop("animation.qbz_191.idle"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerControllers(AnimatableManager.ControllerRegistrar data) {
|
||||
var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate);
|
||||
data.add(idleController);
|
||||
var editController = new AnimationController<>(this, "editController", 1, this::editPredicate);
|
||||
data.add(editController);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ParametersAreNonnullByDefault
|
||||
public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) {
|
||||
super.inventoryTick(stack, world, entity, slot, selected);
|
||||
|
||||
int magType = GunData.from(stack).attachment.get(AttachmentType.MAGAZINE);
|
||||
if (magType == 1) {
|
||||
CompoundTag tag = GunData.from(stack).attachment();
|
||||
tag.putInt("Magazine", 2);
|
||||
}
|
||||
|
||||
int gripType = GunData.from(stack).attachment.get(AttachmentType.GRIP);
|
||||
if (gripType == 3) {
|
||||
CompoundTag tag = GunData.from(stack).attachment();
|
||||
tag.putInt("Grip", 0);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCustomMagazine(ItemStack stack) {
|
||||
int magType = GunData.from(stack).attachment.get(AttachmentType.MAGAZINE);
|
||||
return magType == 2 ? 45 : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getCustomZoom(ItemStack stack) {
|
||||
int scopeType = GunData.from(stack).attachment.get(AttachmentType.SCOPE);
|
||||
return switch (scopeType) {
|
||||
case 2 -> 1.75;
|
||||
case 3 -> GunsTool.getGunDoubleTag(NBTTool.getTag(stack), "CustomZoom");
|
||||
default -> 0;
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canAdjustZoom(ItemStack stack) {
|
||||
return GunData.from(stack).attachment.get(AttachmentType.SCOPE) == 3;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SoundEvent> getReloadSound() {
|
||||
return Set.of(ModSounds.QBZ_191_RELOAD_EMPTY.get(), ModSounds.QBZ_191_RELOAD_NORMAL.get());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceLocation getGunIcon() {
|
||||
return Mod.loc("textures/gun_icon/qbz_191_icon.png");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getGunDisplayName() {
|
||||
return "QBZ-191";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOpenBolt(ItemStack stack) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasBulletInBarrel(ItemStack stack) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCustomizable(ItemStack stack) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasCustomBarrel(ItemStack stack) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasCustomGrip(ItemStack stack) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasCustomMagazine(ItemStack stack) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasCustomScope(ItemStack stack) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasCustomStock(ItemStack stack) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canEjectShell(ItemStack stack) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasBipod(ItemStack stack) {
|
||||
return GunData.from(stack).attachment.get(AttachmentType.GRIP) == 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addReloadTimeBehavior(Map<Integer, Consumer<GunData>> behaviors) {
|
||||
super.addReloadTimeBehavior(behaviors);
|
||||
behaviors.put(14, data -> data.holdOpen.set(false));
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
18187
src/main/resources/assets/superbwarfare/geo/qbz_191.geo.json
Normal file
18187
src/main/resources/assets/superbwarfare/geo/qbz_191.geo.json
Normal file
File diff suppressed because it is too large
Load diff
|
@ -57,6 +57,7 @@
|
|||
"des.superbwarfare.secondary_cataclysm_1": "\"Like the remnants after a shower of stars fall\"",
|
||||
"des.superbwarfare.secondary_cataclysm_2": "Hiru",
|
||||
"item.superbwarfare.insidious": "Insidious",
|
||||
"item.superbwarfare.qbz_191": "QBZ-191",
|
||||
|
||||
"des.superbwarfare.guns.damage": "Damage: ",
|
||||
"des.superbwarfare.guns.level": "Level: ",
|
||||
|
@ -121,6 +122,7 @@
|
|||
"item.superbwarfare.hpj_11_blueprint": "H/PJ-11 CIWS Blueprint",
|
||||
"item.superbwarfare.aurelia_sceptre_blueprint": "Aurelia Sceptre Blueprint",
|
||||
"item.superbwarfare.mp_5_blueprint": "MP5 Blueprint",
|
||||
"item.superbwarfare.qbz_191_blueprint": "QBZ-191 Blueprint",
|
||||
|
||||
"item.superbwarfare.common_material_pack": "Common Material Pack",
|
||||
"item.superbwarfare.rare_material_pack": "Rare Material Pack",
|
||||
|
|
|
@ -57,6 +57,7 @@
|
|||
"des.superbwarfare.secondary_cataclysm_1": "“宛若群星陨落后的余烬”",
|
||||
"des.superbwarfare.secondary_cataclysm_2": "灯瑠Hiru",
|
||||
"item.superbwarfare.insidious": "阴险",
|
||||
"item.superbwarfare.qbz_191": "QBZ-191突击步枪步枪",
|
||||
|
||||
"des.superbwarfare.guns.upgrade_point": "升级点数: ",
|
||||
"des.superbwarfare.guns.damage": "伤害: ",
|
||||
|
@ -121,6 +122,7 @@
|
|||
"item.superbwarfare.hpj_11_blueprint": "H/PJ-11近防炮蓝图",
|
||||
"item.superbwarfare.aurelia_sceptre_blueprint": "海月权杖蓝图",
|
||||
"item.superbwarfare.mp_5_blueprint": "MP5冲锋枪蓝图",
|
||||
"item.superbwarfare.qbz_191_blueprint": "QBZ-191突击步枪步枪蓝图",
|
||||
|
||||
"item.superbwarfare.common_material_pack": "普通材料包",
|
||||
"item.superbwarfare.rare_material_pack": "稀有材料包",
|
||||
|
|
|
@ -0,0 +1,104 @@
|
|||
{
|
||||
"credit": "Made with Blockbench",
|
||||
"parent": "builtin/entity",
|
||||
"texture_size": [
|
||||
128,
|
||||
128
|
||||
],
|
||||
"display": {
|
||||
"thirdperson_righthand": {
|
||||
"translation": [
|
||||
-1.5,
|
||||
0.25,
|
||||
0.5
|
||||
],
|
||||
"scale": [
|
||||
0.52,
|
||||
0.52,
|
||||
0.52
|
||||
]
|
||||
},
|
||||
"thirdperson_lefthand": {
|
||||
"scale": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"firstperson_righthand": {
|
||||
"translation": [
|
||||
-5.75,
|
||||
3.5,
|
||||
3
|
||||
],
|
||||
"scale": [
|
||||
1,
|
||||
1,
|
||||
1.1
|
||||
]
|
||||
},
|
||||
"firstperson_lefthand": {
|
||||
"scale": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [
|
||||
0,
|
||||
2,
|
||||
2
|
||||
],
|
||||
"scale": [
|
||||
0.5,
|
||||
0.5,
|
||||
0.5
|
||||
]
|
||||
},
|
||||
"gui": {
|
||||
"rotation": [
|
||||
165.69,
|
||||
-39.63,
|
||||
178.66
|
||||
],
|
||||
"translation": [
|
||||
-1.5,
|
||||
0.25,
|
||||
0
|
||||
],
|
||||
"scale": [
|
||||
0.55,
|
||||
0.55,
|
||||
0.55
|
||||
]
|
||||
},
|
||||
"head": {
|
||||
"translation": [
|
||||
0,
|
||||
11,
|
||||
1.5
|
||||
]
|
||||
},
|
||||
"fixed": {
|
||||
"rotation": [
|
||||
-180,
|
||||
-90,
|
||||
-180
|
||||
],
|
||||
"translation": [
|
||||
-3,
|
||||
0,
|
||||
-0.5
|
||||
],
|
||||
"scale": [
|
||||
1.1,
|
||||
1.1,
|
||||
1.1
|
||||
]
|
||||
}
|
||||
},
|
||||
"textures": {
|
||||
"particle": "item/qbz_191"
|
||||
}
|
||||
}
|
|
@ -3322,5 +3322,69 @@
|
|||
"stream": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"qbz_191_fire_1p": {
|
||||
"sounds": [
|
||||
{
|
||||
"name": "superbwarfare:qbz_191/qbz_191_fire_1p",
|
||||
"stream": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"qbz_191_fire_1p_s": {
|
||||
"sounds": [
|
||||
{
|
||||
"name": "superbwarfare:qbz_191/qbz_191_fire_1p_s",
|
||||
"stream": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"qbz_191_fire_3p": {
|
||||
"sounds": [
|
||||
{
|
||||
"name": "superbwarfare:qbz_191/qbz_191_fire_3p",
|
||||
"stream": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"qbz_191_fire_3p_s": {
|
||||
"sounds": [
|
||||
{
|
||||
"name": "superbwarfare:qbz_191/qbz_191_fire_3p_s",
|
||||
"stream": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"qbz_191_far": {
|
||||
"sounds": [
|
||||
{
|
||||
"name": "superbwarfare:qbz_191/qbz_191_far",
|
||||
"stream": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"qbz_191_veryfar": {
|
||||
"sounds": [
|
||||
{
|
||||
"name": "superbwarfare:qbz_191/qbz_191_veryfar",
|
||||
"stream": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"qbz_191_reload_normal": {
|
||||
"sounds": [
|
||||
{
|
||||
"name": "superbwarfare:qbz_191/qbz_191_reload_normal",
|
||||
"stream": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"qbz_191_reload_empty": {
|
||||
"sounds": [
|
||||
{
|
||||
"name": "superbwarfare:qbz_191/qbz_191_reload_empty",
|
||||
"stream": false
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
Binary file not shown.
After Width: | Height: | Size: 7.5 KiB |
Binary file not shown.
After Width: | Height: | Size: 38 KiB |
Binary file not shown.
After Width: | Height: | Size: 156 KiB |
46
src/main/resources/data/superbwarfare/guns/qbz_191.json
Normal file
46
src/main/resources/data/superbwarfare/guns/qbz_191.json
Normal file
|
@ -0,0 +1,46 @@
|
|||
{
|
||||
"ID": "superbwarfare:qbz_191",
|
||||
"MinZoom": 1,
|
||||
"MaxZoom": 6,
|
||||
"Spread": 3.5,
|
||||
"RecoilX": 0.0011,
|
||||
"RecoilY": 0.008,
|
||||
"Damage": 8.5,
|
||||
"Headshot": 2,
|
||||
"Velocity": 40,
|
||||
"Magazine": 30,
|
||||
"Weight": 3.5,
|
||||
"DefaultFireMode": "Auto",
|
||||
"NormalReloadTime": 62,
|
||||
"EmptyReloadTime": 66,
|
||||
"BypassesArmor": 0.35,
|
||||
"SoundRadius": 13,
|
||||
"RPM": 750,
|
||||
"AvailableFireModes": [
|
||||
"Semi",
|
||||
"Auto"
|
||||
],
|
||||
"DamageReduce": {
|
||||
"Type": "Rifle"
|
||||
},
|
||||
"AmmoType": "@RifleAmmo",
|
||||
"AvailablePerks": [
|
||||
"@Ammo",
|
||||
"superbwarfare:heal_clip",
|
||||
"superbwarfare:field_doctor",
|
||||
"superbwarfare:fourth_times_charm",
|
||||
"superbwarfare:subsistence",
|
||||
"superbwarfare:powerful_attraction",
|
||||
"superbwarfare:intelligent_chip",
|
||||
"superbwarfare:kill_clip",
|
||||
"superbwarfare:gutshot_straight",
|
||||
"superbwarfare:monster_hunter",
|
||||
"superbwarfare:head_seeker",
|
||||
"superbwarfare:desperado",
|
||||
"superbwarfare:vorpal_weapon",
|
||||
"superbwarfare:firefly",
|
||||
"!superbwarfare:micro_missile",
|
||||
"!superbwarfare:longer_wire",
|
||||
"!superbwarfare:cupid_arrow"
|
||||
]
|
||||
}
|
Loading…
Add table
Reference in a new issue