添加老干妈

This commit is contained in:
Atsuishio 2025-06-27 18:46:09 +08:00 committed by Light_Quanta
parent b845ad4dc8
commit 0fb8a642e2
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
35 changed files with 46286 additions and 19 deletions

View file

@ -0,0 +1,12 @@
{
"base": {
"parent": "superbwarfare:item/m_2_base"
},
"gui_light": "front",
"loader": "neoforge:separate_transforms",
"perspectives": {
"gui": {
"parent": "superbwarfare:item/m_2_icon"
}
}
}

View file

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

View file

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

View file

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_m2hb_blueprint": {
"conditions": {
"items": [
{
"items": "superbwarfare:m2hb_blueprint"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "superbwarfare:m_2_smithing"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_m2hb_blueprint"
]
],
"rewards": {
"recipes": [
"superbwarfare:m_2_smithing"
]
}
}

View file

@ -0,0 +1,16 @@
{
"type": "minecraft:smithing_transform",
"addition": {
"tag": "superbwarfare:storage_blocks/steel"
},
"base": {
"item": "superbwarfare:rare_material_pack"
},
"result": {
"count": 1,
"id": "superbwarfare:m_2"
},
"template": {
"item": "superbwarfare:m2hb_blueprint"
}
}

View file

@ -30,6 +30,7 @@
"superbwarfare:devotion", "superbwarfare:devotion",
"superbwarfare:rpk", "superbwarfare:rpk",
"superbwarfare:m_60", "superbwarfare:m_60",
"superbwarfare:m_2",
"superbwarfare:minigun", "superbwarfare:minigun",
"superbwarfare:m_79", "superbwarfare:m_79",
"superbwarfare:secondary_cataclysm", "superbwarfare:secondary_cataclysm",

View file

@ -1,5 +1,6 @@
{ {
"values": [ "values": [
"superbwarfare:ntw_20" "superbwarfare:ntw_20",
"superbwarfare:m_2"
] ]
} }

View file

@ -34,6 +34,7 @@
"superbwarfare:secondary_cataclysm", "superbwarfare:secondary_cataclysm",
"superbwarfare:taser", "superbwarfare:taser",
"superbwarfare:minigun", "superbwarfare:minigun",
"superbwarfare:mp_5" "superbwarfare:mp_5",
"superbwarfare:m_2"
] ]
} }

View file

@ -0,0 +1,119 @@
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.event.ClientEventHandler;
import com.atsuishio.superbwarfare.item.gun.machinegun.M2Item;
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 M2ItemModel extends CustomGunModel<M2Item> {
public static float fireRotY = 0f;
public static float fireRotZ = 0f;
@Override
public ResourceLocation getAnimationResource(M2Item animatable) {
return Mod.loc("animations/m_2.animation.json");
}
@Override
public ResourceLocation getModelResource(M2Item animatable) {
return Mod.loc("geo/m_2.geo.json");
}
@Override
public ResourceLocation getTextureResource(M2Item animatable) {
return Mod.loc("textures/item/m_2.png");
}
@Override
public ResourceLocation getLODModelResource(M2Item animatable) {
return Mod.loc("geo/lod/m_2.geo.json");
}
@Override
public ResourceLocation getLODTextureResource(M2Item animatable) {
return Mod.loc("textures/item/lod/m_2.png");
}
@Override
public void setCustomAnimations(M2Item animatable, long instanceId, AnimationState<M2Item> animationState) {
Player player = Minecraft.getInstance().player;
if (player == null) return;
ItemStack stack = player.getMainHandItem();
if (shouldCancelRender(stack, animationState)) return;
GeoBone b1 = getAnimationProcessor().getBone("b1");
GeoBone b2 = getAnimationProcessor().getBone("b2");
GeoBone b3 = getAnimationProcessor().getBone("b3");
GeoBone b4 = getAnimationProcessor().getBone("b4");
GeoBone b5 = getAnimationProcessor().getBone("b5");
int ammo = GunData.from(stack).ammo.get();
boolean flag = GunData.from(stack).hideBulletChain.get();
if (ammo < 5 && flag) {
b5.setScaleX(0);
b5.setScaleY(0);
b5.setScaleZ(0);
}
if (ammo < 4 && flag) {
b4.setScaleX(0);
b4.setScaleY(0);
b4.setScaleZ(0);
}
if (ammo < 3 && flag) {
b3.setScaleX(0);
b3.setScaleY(0);
b3.setScaleZ(0);
}
if (ammo < 2 && flag) {
b2.setScaleX(0);
b2.setScaleY(0);
b2.setScaleZ(0);
}
if (ammo < 1 && flag) {
b1.setScaleX(0);
b1.setScaleY(0);
b1.setScaleZ(0);
}
float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(), 0.8);
double fpz = ClientEventHandler.firePosZ * 4 * times;
double fp = ClientEventHandler.firePos;
double fr = ClientEventHandler.fireRot;
GeoBone shen = getAnimationProcessor().getBone("fireRootNormal");
fireRotY = (float) Mth.lerp(0.3f * times, fireRotY, 0.6f * ClientEventHandler.recoilHorizon * fpz);
fireRotZ = (float) Mth.lerp(2f * times, fireRotZ, (0.4f + 0.5f * fpz) * ClientEventHandler.recoilHorizon);
shen.setPosX(-0.7f * (float) (ClientEventHandler.recoilHorizon * (0.5 + 0.4 * ClientEventHandler.fireSpread)));
shen.setPosY((float) (0.4f * fp + 0.44f * fr));
shen.setPosZ((float) (2.825 * fp + 0.24f * fr + 1.25 * fpz));
shen.setRotX((float) (0.01f * fp + 0.08f * fr + 0.01f * fpz));
shen.setRotY(fireRotY);
shen.setRotZ(fireRotZ);
CrossHairOverlay.gunRot = shen.getRotZ();
ClientEventHandler.gunRootMove(getAnimationProcessor());
GeoBone camera = getAnimationProcessor().getBone("camera");
AnimationHelper.handleShellsAnimation(getAnimationProcessor(), 1f, 0.45f);
ClientEventHandler.handleReloadShake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ());
}
}

View file

@ -95,7 +95,7 @@ public class CrossHairOverlay implements LayeredDraw.Layer {
float finPosX = ((w - finLength) / 2) + moveX; float finPosX = ((w - finLength) / 2) + moveX;
float finPosY = ((h - finLength) / 2) + moveY; float finPosY = ((h - finLength) / 2) + moveY;
if (shouldRenderCrossHair(player) || (Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON && (stack.is(ModItems.MINIGUN.get()) || stack.is(ModItems.AURELIA_SCEPTRE.get()))) || (Minecraft.getInstance().options.getCameraType() == CameraType.THIRD_PERSON_BACK && (ClientEventHandler.zoomTime > 0 || ClientEventHandler.bowPullPos > 0))) { if (shouldRenderCrossHair(player) || (Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON && (stack.is(ModItems.MINIGUN.get()) || stack.is(ModItems.AURELIA_SCEPTRE.get()) || stack.is(ModItems.M_2.get()))) || (Minecraft.getInstance().options.getCameraType() == CameraType.THIRD_PERSON_BACK && (ClientEventHandler.zoomTime > 0 || ClientEventHandler.bowPullPos > 0))) {
preciseBlit(guiGraphics, Mod.loc("textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); preciseBlit(guiGraphics, Mod.loc("textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16);
if (!player.isSprinting() || ClientEventHandler.cantSprint > 0) { if (!player.isSprinting() || ClientEventHandler.cantSprint > 0) {
if (data.projectileAmount() > 1) { if (data.projectileAmount() > 1) {

View file

@ -0,0 +1,51 @@
package com.atsuishio.superbwarfare.client.renderer.gun;
import com.atsuishio.superbwarfare.client.AnimationHelper;
import com.atsuishio.superbwarfare.client.model.item.M2ItemModel;
import com.atsuishio.superbwarfare.client.renderer.CustomGunRenderer;
import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.item.gun.machinegun.M2Item;
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 M2ItemRenderer extends CustomGunRenderer<M2Item> {
public M2ItemRenderer() {
super(new M2ItemModel());
}
@Override
public void renderRecursively(PoseStack stack, M2Item 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();
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) {
AnimationHelper.handleShootFlare(name, stack, itemStack, bone, buffer, packedLightIn, 0, 0.1, 2.95, 1.2);
}
}
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

@ -64,6 +64,7 @@ public class ModItemModelProvider extends ItemModelProvider {
gunItem(ModItems.TRACHELIUM); gunItem(ModItems.TRACHELIUM);
gunItem(ModItems.VECTOR); gunItem(ModItems.VECTOR);
gunItem(ModItems.MP_5); gunItem(ModItems.MP_5);
gunItem(ModItems.M_2);
simpleItem(ModItems.EMPTY_PERK, "perk/"); simpleItem(ModItems.EMPTY_PERK, "perk/");

View file

@ -86,7 +86,7 @@ public class ModItemTagProvider extends ItemTagsProvider {
this.tag(ModTags.Items.SNIPER_RIFLE).add(ModItems.HUNTING_RIFLE.get(), ModItems.SENTINEL.get(), this.tag(ModTags.Items.SNIPER_RIFLE).add(ModItems.HUNTING_RIFLE.get(), ModItems.SENTINEL.get(),
ModItems.SVD.get(), ModItems.M_98B.get(), ModItems.K_98.get(), ModItems.MOSIN_NAGANT.get()); ModItems.SVD.get(), ModItems.M_98B.get(), ModItems.K_98.get(), ModItems.MOSIN_NAGANT.get());
this.tag(ModTags.Items.HEAVY_WEAPON).add(ModItems.NTW_20.get()); this.tag(ModTags.Items.HEAVY_WEAPON).add(ModItems.NTW_20.get(), ModItems.M_2.get());
this.tag(ModTags.Items.SHOTGUN).add(ModItems.HOMEMADE_SHOTGUN.get(), ModItems.M_870.get(), ModItems.AA_12.get()); this.tag(ModTags.Items.SHOTGUN).add(ModItems.HOMEMADE_SHOTGUN.get(), ModItems.M_870.get(), ModItems.AA_12.get());
@ -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.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.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.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.TASER.get(), ModItems.MINIGUN.get(), ModItems.MP_5.get(), ModItems.M_2.get());
this.tag(ModTags.Items.LAUNCHER).add(ModItems.RPG.get(), ModItems.JAVELIN.get()) this.tag(ModTags.Items.LAUNCHER).add(ModItems.RPG.get(), ModItems.JAVELIN.get())
.addTag(ModTags.Items.LAUNCHER_GRENADE); .addTag(ModTags.Items.LAUNCHER_GRENADE);

View file

@ -131,7 +131,7 @@ public class ModRecipeProvider extends RecipeProvider {
gunSmithing(writer, ModItems.K_98_BLUEPRINT.get(), GunRarity.RARE, ItemTags.LOGS, ModItems.K_98.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.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()); gunSmithing(writer, ModItems.JAVELIN_BLUEPRINT.get(), GunRarity.LEGENDARY, ModItems.ANCIENT_CPU.get(), ModItems.JAVELIN.get());
// gunSmithing(writer, ModItems.M_2_HB_BLUEPRINT.get(), GunRarity.RARE, ModTags.Items.INGOTS_STEEL, ModItems.M_2_HB.get()); gunSmithing(writer, ModItems.M_2_HB_BLUEPRINT.get(), GunRarity.RARE, ModTags.Items.STORAGE_BLOCK_STEEL, ModItems.M_2.get());
gunSmithing(writer, ModItems.SECONDARY_CATACLYSM_BLUEPRINT.get(), GunRarity.LEGENDARY, ModItems.KNIFE.get(), ModItems.SECONDARY_CATACLYSM.get()); gunSmithing(writer, ModItems.SECONDARY_CATACLYSM_BLUEPRINT.get(), GunRarity.LEGENDARY, ModItems.KNIFE.get(), ModItems.SECONDARY_CATACLYSM.get());
gunSmithing(writer, ModItems.INSIDIOUS_BLUEPRINT.get(), GunRarity.EPIC, ModTags.Items.INGOTS_CEMENTED_CARBIDE, ModItems.INSIDIOUS.get()); gunSmithing(writer, ModItems.INSIDIOUS_BLUEPRINT.get(), GunRarity.EPIC, ModTags.Items.INGOTS_CEMENTED_CARBIDE, ModItems.INSIDIOUS.get());
gunSmithing(writer, ModItems.AURELIA_SCEPTRE_BLUEPRINT.get(), GunRarity.LEGENDARY, Items.END_CRYSTAL, ModItems.AURELIA_SCEPTRE.get()); gunSmithing(writer, ModItems.AURELIA_SCEPTRE_BLUEPRINT.get(), GunRarity.LEGENDARY, Items.END_CRYSTAL, ModItems.AURELIA_SCEPTRE.get());

View file

@ -48,7 +48,7 @@ import javax.annotation.ParametersAreNonnullByDefault;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import static com.atsuishio.superbwarfare.item.C4Bomb.TAG_CONTROL; import static com.atsuishio.superbwarfare.item.C4BombItem.TAG_CONTROL;
public class C4Entity extends Entity implements GeoEntity, OwnableEntity { public class C4Entity extends Entity implements GeoEntity, OwnableEntity {

View file

@ -74,5 +74,22 @@ public class ModEnumExtensions {
public static HumanoidModel.ArmPose getMinigunPose() { public static HumanoidModel.ArmPose getMinigunPose() {
return SUPERBWARFARE_MINIGUN_POSE.getValue(); return SUPERBWARFARE_MINIGUN_POSE.getValue();
} }
public static final EnumProxy<HumanoidModel.ArmPose> SUPERBWARFARE_M2_POSE = new EnumProxy<>(
HumanoidModel.ArmPose.class,
false,
(IArmPoseTransformer) (model, entity, arm) -> {
if (arm != HumanoidArm.LEFT) {
model.rightArm.xRot = 45f * Mth.DEG_TO_RAD + model.head.xRot;
model.rightArm.yRot = -10f * Mth.DEG_TO_RAD;
model.leftArm.xRot = -45f * Mth.DEG_TO_RAD + model.head.xRot;
model.leftArm.yRot = 40f * Mth.DEG_TO_RAD;
}
}
);
public static HumanoidModel.ArmPose getM2Pose() {
return SUPERBWARFARE_M2_POSE.getValue();
}
} }
} }

View file

@ -13,10 +13,7 @@ import com.atsuishio.superbwarfare.item.gun.launcher.JavelinItem;
import com.atsuishio.superbwarfare.item.gun.launcher.M79Item; import com.atsuishio.superbwarfare.item.gun.launcher.M79Item;
import com.atsuishio.superbwarfare.item.gun.launcher.RpgItem; import com.atsuishio.superbwarfare.item.gun.launcher.RpgItem;
import com.atsuishio.superbwarfare.item.gun.launcher.SecondaryCataclysm; import com.atsuishio.superbwarfare.item.gun.launcher.SecondaryCataclysm;
import com.atsuishio.superbwarfare.item.gun.machinegun.DevotionItem; import com.atsuishio.superbwarfare.item.gun.machinegun.*;
import com.atsuishio.superbwarfare.item.gun.machinegun.M60Item;
import com.atsuishio.superbwarfare.item.gun.machinegun.MinigunItem;
import com.atsuishio.superbwarfare.item.gun.machinegun.RpkItem;
import com.atsuishio.superbwarfare.item.gun.rifle.*; import com.atsuishio.superbwarfare.item.gun.rifle.*;
import com.atsuishio.superbwarfare.item.gun.shotgun.Aa12Item; import com.atsuishio.superbwarfare.item.gun.shotgun.Aa12Item;
import com.atsuishio.superbwarfare.item.gun.shotgun.HomemadeShotgunItem; import com.atsuishio.superbwarfare.item.gun.shotgun.HomemadeShotgunItem;
@ -79,6 +76,7 @@ public class ModItems {
public static final DeferredHolder<Item, DevotionItem> DEVOTION = GUNS.register("devotion", DevotionItem::new); public static final DeferredHolder<Item, DevotionItem> DEVOTION = GUNS.register("devotion", DevotionItem::new);
public static final DeferredHolder<Item, RpkItem> RPK = GUNS.register("rpk", RpkItem::new); public static final DeferredHolder<Item, RpkItem> RPK = GUNS.register("rpk", RpkItem::new);
public static final DeferredHolder<Item, M60Item> M_60 = GUNS.register("m_60", M60Item::new); public static final DeferredHolder<Item, M60Item> M_60 = GUNS.register("m_60", M60Item::new);
public static final DeferredHolder<Item, M2Item> M_2 = GUNS.register("m_2", M2Item::new);
public static final DeferredHolder<Item, MinigunItem> MINIGUN = GUNS.register("minigun", MinigunItem::new); public static final DeferredHolder<Item, MinigunItem> MINIGUN = GUNS.register("minigun", MinigunItem::new);
public static final DeferredHolder<Item, M79Item> M_79 = GUNS.register("m_79", M79Item::new); public static final DeferredHolder<Item, M79Item> M_79 = GUNS.register("m_79", M79Item::new);
public static final DeferredHolder<Item, SecondaryCataclysm> SECONDARY_CATACLYSM = GUNS.register("secondary_cataclysm", SecondaryCataclysm::new); public static final DeferredHolder<Item, SecondaryCataclysm> SECONDARY_CATACLYSM = GUNS.register("secondary_cataclysm", SecondaryCataclysm::new);

View file

@ -351,6 +351,8 @@ public class ModSounds {
public static final DeferredHolder<SoundEvent, SoundEvent> M_2_FIRE_3P = REGISTRY.register("m2_fire_3p", () -> SoundEvent.createVariableRangeEvent(Mod.loc("m2_fire_3p"))); public static final DeferredHolder<SoundEvent, SoundEvent> M_2_FIRE_3P = REGISTRY.register("m2_fire_3p", () -> SoundEvent.createVariableRangeEvent(Mod.loc("m2_fire_3p")));
public static final DeferredHolder<SoundEvent, SoundEvent> M_2_FAR = REGISTRY.register("m2_far", () -> SoundEvent.createVariableRangeEvent(Mod.loc("m2_far"))); public static final DeferredHolder<SoundEvent, SoundEvent> M_2_FAR = REGISTRY.register("m2_far", () -> SoundEvent.createVariableRangeEvent(Mod.loc("m2_far")));
public static final DeferredHolder<SoundEvent, SoundEvent> M_2_VERYFAR = REGISTRY.register("m2_veryfar", () -> SoundEvent.createVariableRangeEvent(Mod.loc("m2_veryfar"))); public static final DeferredHolder<SoundEvent, SoundEvent> M_2_VERYFAR = REGISTRY.register("m2_veryfar", () -> SoundEvent.createVariableRangeEvent(Mod.loc("m2_veryfar")));
public static final DeferredHolder<SoundEvent, SoundEvent> M_2_RELOAD_NORMAL = REGISTRY.register("m_2_reload_normal", () -> SoundEvent.createVariableRangeEvent(Mod.loc("m2_reload_normal")));
public static final DeferredHolder<SoundEvent, SoundEvent> M_2_RELOAD_EMPTY = REGISTRY.register("m_2_reload_empty", () -> SoundEvent.createVariableRangeEvent(Mod.loc("m_2_reload_empty")));
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_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_FIRE_3P = REGISTRY.register("mk_42_fire_3p", () -> SoundEvent.createVariableRangeEvent(Mod.loc("mk_42_fire_3p")));

View file

@ -0,0 +1,163 @@
package com.atsuishio.superbwarfare.item.gun.machinegun;
import com.atsuishio.superbwarfare.Mod;
import com.atsuishio.superbwarfare.client.renderer.gun.M2ItemRenderer;
import com.atsuishio.superbwarfare.data.gun.GunData;
import com.atsuishio.superbwarfare.event.ClientEventHandler;
import com.atsuishio.superbwarfare.init.ModEnumExtensions;
import com.atsuishio.superbwarfare.init.ModSounds;
import com.atsuishio.superbwarfare.item.gun.GunItem;
import net.minecraft.client.Minecraft;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
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 M2Item extends GunItem {
public M2Item() {
super(new Properties().stacksTo(1).rarity(Rarity.RARE));
}
@Override
public Supplier<GeoItemRenderer<? extends Item>> getRenderer() {
return M2ItemRenderer::new;
}
@Override
public HumanoidModel.ArmPose getArmPose(LivingEntity entityLiving, InteractionHand hand, ItemStack stack) {
if (!stack.isEmpty()) {
if (entityLiving.getUsedItemHand() == hand) {
return ModEnumExtensions.Client.getM2Pose();
}
}
return HumanoidModel.ArmPose.EMPTY;
}
private PlayState fireAnimPredicate(AnimationState<M2Item> 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.m_2.idle"));
if (ClientEventHandler.firePosTimer > 0 && ClientEventHandler.firePosTimer < 0.45) {
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m_2.fire"));
}
return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m_2.idle"));
}
private PlayState idlePredicate(AnimationState<M2Item> 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.m_2.idle"));
if (GunData.from(stack).reload.empty()) {
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m_2.reload_empty"));
}
if (GunData.from(stack).reload.normal()) {
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m_2.reload_normal"));
}
if (player.isSprinting() && player.onGround() && ClientEventHandler.cantSprint == 0 && ClientEventHandler.drawTime < 0.01) {
if (ClientEventHandler.tacticalSprint) {
return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m_2.run_fast"));
} else {
return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m_2.run"));
}
}
return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m_2.idle"));
}
@Override
public void registerControllers(AnimatableManager.ControllerRegistrar data) {
var fireAnimController = new AnimationController<>(this, "fireAnimController", 0, this::fireAnimPredicate);
data.add(fireAnimController);
var idleController = new AnimationController<>(this, "idleController", 4, this::idlePredicate);
data.add(idleController);
}
@Override
public Set<SoundEvent> getReloadSound() {
return Set.of(ModSounds.M_2_RELOAD_EMPTY.get(), ModSounds.M_2_RELOAD_NORMAL.get());
}
@Override
@ParametersAreNonnullByDefault
public void inventoryTick(ItemStack stack, Level level, Entity entity, int slot, boolean selected) {
var data = GunData.from(stack);
if (data.draw.get()) {
data.draw.set(false);
if (data.ammo.get() <= 5) {
data.hideBulletChain.set(true);
}
}
super.inventoryTick(stack, level, entity, slot, selected);
}
@Override
public ResourceLocation getGunIcon() {
return Mod.loc("textures/gun_icon/m2_icon.png");
}
@Override
public String getGunDisplayName() {
return "M2HB";
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;
}
@Override
public boolean canEjectShell(ItemStack stack) {
return true;
}
@Override
public boolean hasBulletInBarrel(ItemStack stack) {
return true;
}
@Override
public void beforeShoot(GunData data, Player player, double spread, boolean zoom) {
super.beforeShoot(data, player, spread, zoom);
if (data.ammo.get() <= 5) {
data.hideBulletChain.set(true);
}
}
@Override
public void addReloadTimeBehavior(Map<Integer, Consumer<GunData>> behaviors) {
super.addReloadTimeBehavior(behaviors);
behaviors.put(70, data -> data.hideBulletChain.reset());
}
}

View file

@ -35,6 +35,15 @@
"class": "com/atsuishio/superbwarfare/init/ModEnumExtensions$Client", "class": "com/atsuishio/superbwarfare/init/ModEnumExtensions$Client",
"field": "SUPERBWARFARE_MINIGUN_POSE" "field": "SUPERBWARFARE_MINIGUN_POSE"
} }
},
{
"enum": "net/minecraft/client/model/HumanoidModel$ArmPose",
"name": "SUPERBWARFARE_M2_POSE",
"constructor": "(ZLnet/neoforged/neoforge/client/IArmPoseTransformer;)V",
"parameters": {
"class": "com/atsuishio/superbwarfare/init/ModEnumExtensions$Client",
"field": "SUPERBWARFARE_M2_POSE"
}
} }
] ]
} }

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -16,6 +16,7 @@
"item.superbwarfare.rpg": "RPG-7", "item.superbwarfare.rpg": "RPG-7",
"item.superbwarfare.m_98b": "M98B", "item.superbwarfare.m_98b": "M98B",
"item.superbwarfare.m_60": "M60", "item.superbwarfare.m_60": "M60",
"item.superbwarfare.m_2": "M2HB",
"item.superbwarfare.mk_14": "MK-14EBR", "item.superbwarfare.mk_14": "MK-14EBR",
"item.superbwarfare.m_79": "M79", "item.superbwarfare.m_79": "M79",
"item.superbwarfare.mp_5": "MP5", "item.superbwarfare.mp_5": "MP5",

View file

@ -16,6 +16,7 @@
"item.superbwarfare.rpg": "RPG-7火箭筒", "item.superbwarfare.rpg": "RPG-7火箭筒",
"item.superbwarfare.m_98b": "M98B狙击步枪", "item.superbwarfare.m_98b": "M98B狙击步枪",
"item.superbwarfare.m_60": "M60通用机枪", "item.superbwarfare.m_60": "M60通用机枪",
"item.superbwarfare.m_2": "M2HB重机枪",
"item.superbwarfare.mk_14": "MK-14EBR射手步枪", "item.superbwarfare.mk_14": "MK-14EBR射手步枪",
"item.superbwarfare.m_79": "M79榴弹发射器", "item.superbwarfare.m_79": "M79榴弹发射器",
"item.superbwarfare.vector": "短剑冲锋枪", "item.superbwarfare.vector": "短剑冲锋枪",

View file

@ -0,0 +1,109 @@
{
"credit": "Made with Blockbench",
"parent": "builtin/entity",
"texture_size": [
128,
128
],
"display": {
"thirdperson_righthand": {
"rotation": [
135,
0,
0
],
"translation": [
-1,
7,
6.5
],
"scale": [
0.6,
0.6,
0.6
]
},
"thirdperson_lefthand": {
"scale": [
0,
0,
0
]
},
"firstperson_righthand": {
"rotation": [
0,
0,
4
],
"translation": [
-3.5,
-0.5,
-1
]
},
"firstperson_lefthand": {
"scale": [
0,
0,
0
]
},
"ground": {
"translation": [
0,
0,
5.25
],
"scale": [
0.6,
0.6,
0.6
]
},
"gui": {
"rotation": [
165.69,
-39.63,
178.66
],
"translation": [
-3.25,
-0.75,
0
],
"scale": [
0.37,
0.37,
0.37
]
},
"head": {
"translation": [
-4.75,
6.5,
0.75
]
},
"fixed": {
"rotation": [
0,
-90,
0
],
"translation": [
-12,
0,
-1
],
"scale": [
1.25,
1.25,
1.25
]
}
},
"textures": {
"particle": "item/m_2"
}
}

View file

@ -2489,6 +2489,22 @@
} }
] ]
}, },
"m2_reload_normal": {
"sounds": [
{
"name": "superbwarfare:m2/m2_reload_normal",
"stream": false
}
]
},
"m2_reload_empty": {
"sounds": [
{
"name": "superbwarfare:m2/m2_reload_empty",
"stream": false
}
]
},
"wheel_chair_engine": { "wheel_chair_engine": {
"sounds": [ "sounds": [
{ {

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

View file

@ -0,0 +1,40 @@
{
"ID": "superbwarfare:m_2",
"Spread": 5,
"RecoilX": 0.012,
"RecoilY": 0.02,
"Damage": 40,
"Headshot": 2.5,
"Velocity": 43,
"Magazine": 100,
"Weight": 15,
"DefaultFireMode": "Auto",
"NormalReloadTime": 100,
"EmptyReloadTime": 124,
"BypassesArmor": 0.4,
"SoundRadius": 15,
"RPM": 400,
"HeatPerShoot": 2,
"AvailableFireModes": [
"Semi",
"Auto"
],
"DamageReduce": {
"Type": "Heavy"
},
"AmmoType": "@HeavyAmmo",
"AvailablePerks": [
"@Ammo",
"superbwarfare:fourth_times_charm",
"superbwarfare:subsistence",
"superbwarfare:powerful_attraction",
"superbwarfare:intelligent_chip",
"superbwarfare:killing_tally",
"superbwarfare:desperado",
"superbwarfare:monster_hunter",
"superbwarfare:vorpal_weapon",
"!superbwarfare:micro_missile",
"!superbwarfare:longer_wire",
"!superbwarfare:cupid_arrow"
]
}

View file

@ -2,19 +2,13 @@
"type": "minecraft:crafting_shaped", "type": "minecraft:crafting_shaped",
"category": "misc", "category": "misc",
"pattern": [ "pattern": [
"abc", " b ",
"def", "def",
"ghi" "ghi"
], ],
"key": { "key": {
"a": {
"item": "superbwarfare:m2hb_blueprint"
},
"b": { "b": {
"item": "superbwarfare:rare_material_pack" "item": "superbwarfare:m_2"
},
"c": {
"tag": "superbwarfare:ingots/steel"
}, },
"d": { "d": {
"item": "minecraft:comparator" "item": "minecraft:comparator"