添加QBZ191

This commit is contained in:
Atsuishio 2025-07-05 19:23:46 +08:00 committed by Light_Quanta
parent 7e0a8aab38
commit dc9f63bfbf
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
43 changed files with 24689 additions and 6 deletions

View file

@ -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"
}
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "superbwarfare:displaysettings/qbz_191.item",
"textures": {
"layer0": "superbwarfare:item/qbz_191"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "superbwarfare:item/gun_blueprint"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "superbwarfare:item/qbz_191_icon"
}
}

View file

@ -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"
]
}
}

View file

@ -147,6 +147,10 @@
{
"type": "minecraft:item",
"name": "superbwarfare:insidious_blueprint"
},
{
"type": "minecraft:item",
"name": "superbwarfare:qbz_191_blueprint"
}
],
"rolls": 1.0

View file

@ -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",

View file

@ -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",

View file

@ -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"
}
}

View file

@ -15,6 +15,7 @@
"superbwarfare:m_4",
"superbwarfare:hk_416",
"superbwarfare:qbz_95",
"superbwarfare:qbz_191",
"superbwarfare:insidious",
"superbwarfare:mk_14",
"superbwarfare:marlin",

View file

@ -35,6 +35,7 @@
"superbwarfare:taser",
"superbwarfare:minigun",
"superbwarfare:mp_5",
"superbwarfare:m_2_hb"
"superbwarfare:m_2_hb",
"superbwarfare:qbz_191"
]
}

View file

@ -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);
}
}

View file

@ -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

View file

@ -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);
}

View file

@ -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);
}
}

View file

@ -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),

View file

@ -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);

View file

@ -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);

View file

@ -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());

View file

@ -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()));

View file

@ -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")));

View file

@ -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

File diff suppressed because it is too large Load diff

View file

@ -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",

View file

@ -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": "稀有材料包",

View file

@ -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"
}
}

View file

@ -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.

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

View 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"
]
}