diff --git a/src/main/java/com/atsuishio/superbwarfare/client/AnimationHelper.java b/src/main/java/com/atsuishio/superbwarfare/client/AnimationHelper.java index bc722432b..72dc8812a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/AnimationHelper.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/AnimationHelper.java @@ -1,5 +1,6 @@ package com.atsuishio.superbwarfare.client; +import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.item.gun.data.value.AttachmentType; @@ -18,6 +19,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; +import org.joml.Matrix4f; import software.bernie.geckolib.animation.AnimationProcessor; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.util.RenderUtil; @@ -110,7 +112,7 @@ public class AnimationHelper { RenderUtil.scaleMatrixForBone(stack, bone); RenderUtil.translateAwayFromPivotPoint(stack, bone); PoseStack.Pose pose = stack.last(); - VertexConsumer vertexConsumer = buffer.getBuffer(ModRenderTypes.MUZZLE_FLASH_TYPE); + VertexConsumer vertexConsumer = buffer.getBuffer(ModRenderTypes.MUZZLE_FLASH_TYPE.apply(Mod.loc("textures/particle/flare.png"))); vertex(vertexConsumer, pose, packedLightIn, 0.0F, 0, 0, 1); vertex(vertexConsumer, pose, packedLightIn, 1.0F, 0, 1, 1); vertex(vertexConsumer, pose, packedLightIn, 1.0F, 1, 1, 0); @@ -175,4 +177,34 @@ public class AnimationHelper { stack.popPose(); } } + + public static void handleZoomCrossHair(MultiBufferSource currentBuffer, RenderType renderType, String boneName, PoseStack stack, GeoBone bone, MultiBufferSource buffer, int packedLightIn, double x, double y, double z, int r, int g, int b, int a, String name) { + if (boneName.equals("cross") && ClientEventHandler.zoomPos > 0.8) { + stack.pushPose(); + stack.translate(x, y, -z); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + PoseStack.Pose pose = stack.last(); + Matrix4f $$7 = pose.pose(); + VertexConsumer $$9 = buffer.getBuffer(ModRenderTypes.MUZZLE_FLASH_TYPE.apply(Mod.loc("textures/crosshair/" + name + ".png"))); + vertexRGB($$9, $$7, pose, packedLightIn, 0.0F, 0, 0, 1, r, g, b, a); + vertexRGB($$9, $$7, pose, packedLightIn, 1.0F, 0, 1, 1, r, g, b, a); + vertexRGB($$9, $$7, pose, packedLightIn, 1.0F, 1, 1, 0, r, g, b, a); + vertexRGB($$9, $$7, pose, packedLightIn, 0.0F, 1, 0, 0, r, g, b, a); + stack.popPose(); + } + currentBuffer.getBuffer(renderType); + } + + private static void vertexRGB(VertexConsumer pConsumer, Matrix4f pPose, PoseStack.Pose pNormal, int pLightmapUV, float pX, float pY, int pU, int pV, int r, int g, int b, int a) { + pConsumer.addVertex(pPose, pX - 0.5F, pY - 0.5F, 0.0F) + .setColor(r, g, b, a) + .setUv((float) pU, (float) pV) + .setOverlay(OverlayTexture.NO_OVERLAY) + .setLight(pLightmapUV) + .setNormal(pNormal, 0.0F, 1.0F, 0.0F); + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/ModRenderTypes.java b/src/main/java/com/atsuishio/superbwarfare/client/ModRenderTypes.java index 06df4adf0..19d3b76d4 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/ModRenderTypes.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/ModRenderTypes.java @@ -1,6 +1,5 @@ package com.atsuishio.superbwarfare.client; -import com.atsuishio.superbwarfare.Mod; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; import net.minecraft.Util; @@ -34,34 +33,21 @@ public class ModRenderTypes extends RenderType { //DickSheep的恩情还不完 - public static final RenderType MUZZLE_FLASH_TYPE = - RenderType.create( - "muzzle_flash", - DefaultVertexFormat.POSITION_TEX_COLOR, // 注意:格式名改为 POSITION_COLOR_TEX(不是 TEX) - VertexFormat.Mode.QUADS, - 256, - false, - true, - // 使用新的 CompositeState 构造方式 - RenderType.CompositeState.builder() - // 关键修复:使用内置的 POSITION_COLOR_TEX_SHADER(直接调用 ShaderStateShard) - .setShaderState(RENDERTYPE_EYES_SHADER) - // 启用半透明(确保正确排序) - .setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY) - // 绑定贴图(替换为你的路径) - .setTextureState(new RenderStateShard.TextureStateShard( - Mod.loc("textures/particle/flare.png"), - false, // 不模糊 - false // 不生成Mipmap - )) - // 禁用光照和覆盖颜色 - .setLightmapState(RenderStateShard.NO_LIGHTMAP) - .setOverlayState(RenderStateShard.NO_OVERLAY) - // 深度测试和写入设置 -// .setDepthTestState(RenderStateShard.NO_DEPTH_TEST) - .setWriteMaskState(RenderStateShard.COLOR_WRITE) - .createCompositeState(false) - ); - + public static final Function MUZZLE_FLASH_TYPE = Util.memoize((location) -> { + TextureStateShard shard = new RenderStateShard.TextureStateShard(location, false, false); + RenderType.CompositeState state = RenderType.CompositeState.builder() + // 关键修复:使用内置的 POSITION_COLOR_TEX_SHADER(直接调用 ShaderStateShard) + .setShaderState(RENDERTYPE_EYES_SHADER) + // 启用半透明(确保正确排序) + .setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY) + // 绑定贴图 + .setTextureState(shard) + // 禁用光照和覆盖颜色 + .setLightmapState(RenderStateShard.NO_LIGHTMAP) + .setOverlayState(RenderStateShard.NO_OVERLAY) + .setWriteMaskState(RenderStateShard.COLOR_WRITE) + .createCompositeState(false); + return RenderType.create("muzzle_flash", DefaultVertexFormat.POSITION_TEX_COLOR, VertexFormat.Mode.QUADS, 256, false, true, state); + }); } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Hk416Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Hk416Layer.java deleted file mode 100644 index a20838005..000000000 --- a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Hk416Layer.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.atsuishio.superbwarfare.client.layer.gun; - -import com.atsuishio.superbwarfare.Mod; -import com.atsuishio.superbwarfare.item.gun.rifle.Hk416Item; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.resources.ResourceLocation; -import software.bernie.geckolib.cache.object.BakedGeoModel; -import software.bernie.geckolib.renderer.GeoRenderer; -import software.bernie.geckolib.renderer.layer.GeoRenderLayer; - -public class Hk416Layer extends GeoRenderLayer { - private static final ResourceLocation LAYER = Mod.loc("textures/item/hk416_e.png"); - - public Hk416Layer(GeoRenderer entityRenderer) { - super(entityRenderer); - } - - @Override - public void render(PoseStack poseStack, Hk416Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { - RenderType glowRenderType = RenderType.eyes(LAYER); - getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); - } -} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/Hk416ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Hk416ItemModel.java index 2d6a72072..d34379386 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/item/Hk416ItemModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Hk416ItemModel.java @@ -46,9 +46,6 @@ public class Hk416ItemModel extends GeoModel { GeoBone scope = getAnimationProcessor().getBone("Scope1"); GeoBone scope2 = getAnimationProcessor().getBone("Scope2"); GeoBone scope3 = getAnimationProcessor().getBone("Scope3"); - GeoBone cross1 = getAnimationProcessor().getBone("Cross1"); - GeoBone cross2 = getAnimationProcessor().getBone("Cross2"); - GeoBone cross3 = getAnimationProcessor().getBone("Cross3"); GeoBone kuaimanji = getAnimationProcessor().getBone("kuaimanji"); Player player = Minecraft.getInstance().player; @@ -79,14 +76,14 @@ public class Hk416ItemModel extends GeoModel { case 0 -> 0.2f; case 1 -> 0.4f; case 2 -> 0.8f; - case 3 -> 0.78f; + case 3 -> 0.9f; default -> 0f; }; float posZ = switch (type) { case 0 -> 3f; case 1 -> 3.5f; case 2 -> 7.4f; - case 3 -> 6.8f; + case 3 -> 7.5f; default -> 0f; }; @@ -99,8 +96,6 @@ public class Hk416ItemModel extends GeoModel { scope2.setScaleZ(1f - (0.8f * (float) zp)); scope3.setScaleZ(1f - (0.5f * (float) zp)); - var data = GunData.from(stack); - GeoBone shen; if (zt < 0.5) { shen = getAnimationProcessor().getBone("fireRootNormal"); @@ -133,17 +128,13 @@ public class Hk416ItemModel extends GeoModel { CrossHairOverlay.gunRot = shen.getRotZ(); - cross1.setPosY(-0.75f * (float) fpz); - cross2.setPosY(-0.7f * (float) fpz); - cross3.setPosY(-0.2f * (float) fpz); - GeoBone l = getAnimationProcessor().getBone("l"); GeoBone r = getAnimationProcessor().getBone("r"); rotXBipod = Mth.lerp(1.5f * times, rotXBipod, isProne(player) ? -90 : 0); l.setRotX(rotXBipod * Mth.DEG_TO_RAD); r.setRotX(rotXBipod * Mth.DEG_TO_RAD); - int mode = data.fireMode.get(); + int mode = GunData.from(stack).fireMode.get(); kuaimanji.setRotX(mode == 2 ? 90 * Mth.DEG_TO_RAD : 0); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Hk416ItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Hk416ItemRenderer.java index b9158b2de..41bc2809f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Hk416ItemRenderer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Hk416ItemRenderer.java @@ -8,12 +8,14 @@ import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.item.gun.data.value.AttachmentType; import com.atsuishio.superbwarfare.item.gun.rifle.Hk416Item; +import com.atsuishio.superbwarfare.tools.GunsTool; 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.resources.ResourceLocation; +import net.minecraft.util.Mth; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import software.bernie.geckolib.cache.object.BakedGeoModel; @@ -24,11 +26,10 @@ import java.util.HashSet; import java.util.Set; public class Hk416ItemRenderer extends GeoItemRenderer { + public static double zoomFactor; public Hk416ItemRenderer() { super(new Hk416ItemModel()); - // TODO layer -// this.addRenderLayer(new Hk416Layer(this)); } @Override @@ -82,18 +83,6 @@ public class Hk416ItemRenderer extends GeoItemRenderer { if (!(itemStack.getItem() instanceof GunItem)) return; var data = GunData.from(itemStack); - if (name.equals("Cross1")) { - bone.setHidden(ClientEventHandler.zoomPos < 0.7 || data.attachment.get(AttachmentType.SCOPE) != 1); - } - - if (name.equals("Cross2")) { - bone.setHidden(ClientEventHandler.zoomPos < 0.7 || data.attachment.get(AttachmentType.SCOPE) != 2); - } - - if (name.equals("Cross3")) { - bone.setHidden(ClientEventHandler.zoomPos < 0.7 || data.attachment.get(AttachmentType.SCOPE) != 3); - } - if (GunData.from(itemStack).attachment.get(AttachmentType.SCOPE) == 2 && (name.equals("hidden"))) { bone.setHidden(ClientEventHandler.zoomPos > 0.7 && ClientEventHandler.zoom); @@ -104,6 +93,19 @@ public class Hk416ItemRenderer extends GeoItemRenderer { bone.setHidden(ClientEventHandler.zoomPos > 0.7 && ClientEventHandler.zoom); } + int scopeType = GunData.from(itemStack).attachment.get(AttachmentType.SCOPE); + zoomFactor = Mth.lerp(0.01 * partialTick, zoomFactor, GunsTool.getGunDoubleTag(GunData.from(itemStack).tag, "CustomZoom")); + + switch (scopeType) { + case 1 -> + AnimationHelper.handleZoomCrossHair(currentBuffer, renderType, name, stack, bone, buffer, packedLightIn, 0, 0.25, 30, 0, 255, 0, 255, "eotech"); + case 2 -> + AnimationHelper.handleZoomCrossHair(currentBuffer, renderType, name, stack, bone, buffer, packedLightIn, 0, 0.313, 9, 255, 0, 0, 255, "acog"); + case 3 -> + AnimationHelper.handleZoomCrossHair(currentBuffer, renderType, name, stack, bone, buffer, packedLightIn, 0, 0.29, Math.max(38 - 5.2 * zoomFactor, 3), 255, 0, 0, 255, "lpvo"); + } + ; + AnimationHelper.handleShootFlare(name, stack, itemStack, bone, buffer, packedLightIn, 0, 0, 1.440625, 0.3); ItemModelHelper.handleGunAttachments(bone, itemStack, name); diff --git a/src/main/resources/assets/superbwarfare/geo/hk416.geo.json b/src/main/resources/assets/superbwarfare/geo/hk416.geo.json index bdc6b1dc8..cfbf5d5c0 100644 --- a/src/main/resources/assets/superbwarfare/geo/hk416.geo.json +++ b/src/main/resources/assets/superbwarfare/geo/hk416.geo.json @@ -9839,489 +9839,6 @@ } ] }, - { - "name": "Cross1", - "parent": "0", - "pivot": [0, 4.81172, -497.5], - "cubes": [ - { - "origin": [-1, 9.33906, -497.5], - "size": [2, 0.5, 0], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-2.4319, 8.74595, -497.5], - "size": [2, 0.5, 0], - "pivot": [-2.20684, 8.1145, -497.5], - "rotation": [0, 0, -22.5], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-3.98178, 8.74595, -497.5], - "size": [2, 0.5, 0], - "pivot": [-2.20684, 8.1145, -497.5], - "rotation": [0, 0, -45], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-5.41369, 9.33906, -497.5], - "size": [2, 0.5, 0], - "pivot": [-2.20684, 8.1145, -497.5], - "rotation": [0, 0, -67.5], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-5.07771, 3.23633, -497.5], - "size": [2, 0.5, 0], - "pivot": [-3.30277, 2.60488, -497.5], - "rotation": [0, 0, -135], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-6.50962, 3.82945, -497.5], - "size": [2, 0.5, 0], - "pivot": [-3.30277, 2.60488, -497.5], - "rotation": [0, 0, -157.5], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-3.52783, 3.23633, -497.5], - "size": [2, 0.5, 0], - "pivot": [-3.30277, 2.60488, -497.5], - "rotation": [0, 0, -112.5], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-5.77734, 4.56172, -497.5], - "size": [2, 0.5, 0], - "pivot": [-4.77734, 4.81172, -497.5], - "rotation": [0, 0, -90], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.25, 9.83906, -497.5], - "size": [0.5, 2, 0], - "pivot": [0, 4.81172, -497.5], - "rotation": [0, 0, -90], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.25, 9.83906, -497.5], - "size": [0.5, 2, 0], - "pivot": [0, 4.81172, -497.5], - "rotation": [0, 0, 90], - "uv": { - "south": {"uv": [78.25, 56], "uv_size": [-0.25, 0.25]} - } - }, - { - "origin": [-0.25, 9.83906, -497.5], - "size": [0.5, 2, 0], - "uv": { - "south": {"uv": [78.25, 56], "uv_size": [-0.25, 0.25]} - } - }, - { - "origin": [-0.25, 9.83906, -497.5], - "size": [0.5, 2, 0], - "pivot": [0, 4.81172, -497.5], - "rotation": [0, 0, -180], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.5, 4.31172, -497.5], - "size": [1, 1, 0], - "pivot": [0, 4.81172, -497.5], - "rotation": [0, 0, -135], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [3.52593, 8.07515, -497.5], - "size": [2, 0.5, 0], - "pivot": [2.38867, 4.6299, -497.5], - "rotation": [0, 0, 157.5], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [2.13479, 6.88081, -497.5], - "size": [2, 0.5, 0], - "pivot": [2.38867, 4.6299, -497.5], - "rotation": [0, 0, 112.5], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [2.94914, 7.33962, -497.5], - "size": [2, 0.5, 0], - "pivot": [2.38867, 4.6299, -497.5], - "rotation": [0, 0, 135], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [1.20684, 6.76857, -497.5], - "size": [2, 0.5, 0], - "pivot": [2.38867, 4.6299, -497.5], - "rotation": [0, 0, 90], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [0.30658, 7.01997, -497.5], - "size": [2, 0.5, 0], - "pivot": [2.38867, 4.6299, -497.5], - "rotation": [0, 0, 67.5], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.88776, 8.41112, -497.5], - "size": [2, 0.5, 0], - "pivot": [2.38867, 4.6299, -497.5], - "rotation": [0, 0, 22.5], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.42895, 7.59676, -497.5], - "size": [2, 0.5, 0], - "pivot": [2.38867, 4.6299, -497.5], - "rotation": [0, 0, 45], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [3.77734, 8.97541, -497.5], - "size": [2, 0.5, 0], - "pivot": [2.38867, 4.6299, -497.5], - "rotation": [0, 0, -180], - "uv": { - "south": {"uv": [78, 56], "uv_size": [0.25, 0.25]} - } - } - ] - }, - { - "name": "Cross2", - "parent": "0", - "pivot": [0, -1.88125, -329.05], - "cubes": [ - { - "origin": [-3.675, -11.08125, -329.05], - "size": [7.35, 18.4, 0], - "uv": { - "south": {"uv": [219.25, 164], "uv_size": [36.75, 92]} - } - } - ] - }, - { - "name": "Cross3", - "parent": "0", - "pivot": [0, 4.79044, -115.99707], - "cubes": [ - { - "origin": [-0.03795, -5.41758, -115.99707], - "size": [0.07591, 20.41603, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, -90], - "uv": { - "south": {"uv": [29, 111], "uv_size": [0.25, 19.75]} - } - }, - { - "origin": [-0.03795, -5.41758, -115.99707], - "size": [0.07591, 20.41603, 0], - "uv": { - "south": {"uv": [30, 111], "uv_size": [0.25, 19.75]} - } - }, - { - "origin": [-0.07167, -5.41758, -115.99707], - "size": [0.14334, 4.16, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, -90], - "uv": { - "south": {"uv": [35, 128], "uv_size": [0.25, 4]} - } - }, - { - "origin": [-0.07167, -5.41758, -115.99707], - "size": [0.14334, 4.16, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, 90], - "uv": { - "south": {"uv": [36, 128], "uv_size": [0.25, 4]} - } - }, - { - "origin": [-0.07167, -5.41758, -115.99707], - "size": [0.13928, 4.16, 0], - "uv": { - "south": {"uv": [46, 127], "uv_size": [0.25, 4]} - } - }, - { - "origin": [-0.07167, -5.41758, -115.99707], - "size": [0.13928, 4.16, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, -180], - "uv": { - "south": {"uv": [47, 111], "uv_size": [0.25, 4]} - } - } - ] - }, - { - "name": "bone97", - "parent": "Cross3", - "pivot": [0, 4.70349, -96.3082], - "cubes": [ - { - "origin": [0.03797, 4.38338, -96.3082], - "size": [0.07053, 0.3688, 0], - "pivot": [0, 4.78984, -96.3082], - "rotation": [0, 0, -90], - "uv": { - "south": {"uv": [236.375, 176.5], "uv_size": [0.875, 1]} - } - }, - { - "origin": [-0.10851, 4.38338, -96.3082], - "size": [0.07053, 0.3688, 0], - "pivot": [0, 4.78984, -96.3082], - "rotation": [0, 0, 90], - "uv": { - "south": {"uv": [237.25, 176.5], "uv_size": [-0.875, 1]} - } - }, - { - "origin": [-0.10818, 4.89835, -96.3082], - "size": [0.07053, 0.30111, 0], - "pivot": [0, 4.78984, -96.3082], - "rotation": [0, 0, 180], - "uv": { - "south": {"uv": [236.375, 177.5], "uv_size": [0.875, -1]} - } - }, - { - "origin": [0.03797, 4.82749, -96.3082], - "size": [0.07053, 0.3688, 0], - "pivot": [0, 4.78984, -96.3082], - "rotation": [0, 0, 90], - "uv": { - "south": {"uv": [236.375, 177.5], "uv_size": [0.875, -1]} - } - }, - { - "origin": [0.03765, 4.89835, -96.3082], - "size": [0.07053, 0.30111, 0], - "pivot": [0, 4.78984, -96.3082], - "rotation": [0, 0, -180], - "uv": { - "south": {"uv": [237.25, 177.5], "uv_size": [-0.875, -1]} - } - }, - { - "origin": [-0.10851, 4.82749, -96.3082], - "size": [0.07053, 0.3688, 0], - "pivot": [0, 4.78984, -96.3082], - "rotation": [0, 0, -90], - "uv": { - "south": {"uv": [237.25, 177.5], "uv_size": [-0.875, -1]} - } - } - ] - }, - { - "name": "bone173", - "parent": "Cross3", - "pivot": [0, 4.79044, -115.99707], - "cubes": [ - { - "origin": [-0.05542, 3.6028, -115.99707], - "size": [0.11084, 0.07962, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, -90], - "uv": { - "south": {"uv": [44, 141], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.05542, 2.5628, -115.99707], - "size": [0.11084, 0.07962, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, -90], - "uv": { - "south": {"uv": [59, 126], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.05542, 1.5228, -115.99707], - "size": [0.11084, 0.07963, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, -90], - "uv": { - "south": {"uv": [45, 141], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.05542, 0.4828, -115.99707], - "size": [0.11084, 0.07963, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, -90], - "uv": { - "south": {"uv": [59, 127], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.05542, 0.4828, -115.99707], - "size": [0.11084, 0.07963, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, 90], - "uv": { - "south": {"uv": [46, 141], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.05542, 3.6028, -115.99707], - "size": [0.11084, 0.07962, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, 90], - "uv": { - "south": {"uv": [59, 128], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.05542, 2.5628, -115.99707], - "size": [0.11084, 0.07962, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, 90], - "uv": { - "south": {"uv": [47, 141], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.05542, 1.5228, -115.99707], - "size": [0.11084, 0.07963, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, 90], - "uv": { - "south": {"uv": [59, 129], "uv_size": [0.25, 0.25]} - } - } - ] - }, - { - "name": "bone174", - "parent": "Cross3", - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, -90], - "cubes": [ - { - "origin": [-0.05542, 3.6028, -115.99707], - "size": [0.11084, 0.07962, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, -90], - "uv": { - "south": {"uv": [48, 141], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.05542, 2.5628, -115.99707], - "size": [0.11084, 0.07962, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, -90], - "uv": { - "south": {"uv": [59, 130], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.05542, 1.5228, -115.99707], - "size": [0.11084, 0.07963, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, -90], - "uv": { - "south": {"uv": [49, 141], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.05542, 0.4828, -115.99707], - "size": [0.11084, 0.07963, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, -90], - "uv": { - "south": {"uv": [59, 131], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.05542, 0.4828, -115.99707], - "size": [0.11084, 0.07963, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, 90], - "uv": { - "south": {"uv": [50, 141], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.05542, 3.6028, -115.99707], - "size": [0.11084, 0.07962, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, 90], - "uv": { - "south": {"uv": [59, 132], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.05542, 2.5628, -115.99707], - "size": [0.11084, 0.07962, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, 90], - "uv": { - "south": {"uv": [51, 141], "uv_size": [0.25, 0.25]} - } - }, - { - "origin": [-0.05542, 1.5228, -115.99707], - "size": [0.11084, 0.07963, 0], - "pivot": [0, 4.79044, -115.99707], - "rotation": [0, 0, 90], - "uv": { - "south": {"uv": [59, 133], "uv_size": [0.25, 0.25]} - } - } - ] - }, { "name": "magazine", "parent": "0", @@ -20117,11 +19634,6 @@ } ] }, - { - "name": "flare", - "parent": "0", - "pivot": [0.05, 1.75, -23.05] - }, { "name": "Righthand", "parent": "0", @@ -20142,6 +19654,16 @@ } ] }, + { + "name": "flare", + "parent": "0", + "pivot": [0.05, 1.75, -23.05] + }, + { + "name": "cross", + "parent": "0", + "pivot": [0, 4, -1000] + }, { "name": "camera", "pivot": [3.17141, 5.16276, 9.77702] diff --git a/src/main/resources/assets/superbwarfare/textures/crosshair/acog.png b/src/main/resources/assets/superbwarfare/textures/crosshair/acog.png new file mode 100644 index 000000000..26a255510 Binary files /dev/null and b/src/main/resources/assets/superbwarfare/textures/crosshair/acog.png differ diff --git a/src/main/resources/assets/superbwarfare/textures/crosshair/eotech.png b/src/main/resources/assets/superbwarfare/textures/crosshair/eotech.png new file mode 100644 index 000000000..ab39eff6a Binary files /dev/null and b/src/main/resources/assets/superbwarfare/textures/crosshair/eotech.png differ diff --git a/src/main/resources/assets/superbwarfare/textures/crosshair/lpvo.png b/src/main/resources/assets/superbwarfare/textures/crosshair/lpvo.png new file mode 100644 index 000000000..404314c12 Binary files /dev/null and b/src/main/resources/assets/superbwarfare/textures/crosshair/lpvo.png differ diff --git a/src/main/resources/assets/superbwarfare/textures/item/hk416.png b/src/main/resources/assets/superbwarfare/textures/item/hk416.png index 379db37f7..48ca4c2bb 100644 Binary files a/src/main/resources/assets/superbwarfare/textures/item/hk416.png and b/src/main/resources/assets/superbwarfare/textures/item/hk416.png differ diff --git a/src/main/resources/assets/superbwarfare/textures/item/hk416_e.png b/src/main/resources/assets/superbwarfare/textures/item/hk416_e.png deleted file mode 100644 index e8dfc8c81..000000000 Binary files a/src/main/resources/assets/superbwarfare/textures/item/hk416_e.png and /dev/null differ