完成M18烟雾弹

This commit is contained in:
Atsuishio 2025-07-07 16:22:27 +08:00 committed by Light_Quanta
parent bd1abe8fc6
commit c69536f32c
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
18 changed files with 758 additions and 57 deletions

View file

@ -12,15 +12,13 @@ public class M18SmokeGrenadeEntityModel extends GeoModel<M18SmokeGrenadeEntity>
return null;
}
// TODO 添加烟雾手雷资源文件
@Override
public ResourceLocation getModelResource(M18SmokeGrenadeEntity entity) {
return Mod.loc("geo/rgo_grenade.geo.json");
return Mod.loc("geo/m18_smoke_grenade.geo.json");
}
@Override
public ResourceLocation getTextureResource(M18SmokeGrenadeEntity entity) {
return Mod.loc("textures/item/rgo_grenade.png");
return Mod.loc("textures/item/m_18.png");
}
}

View file

@ -34,7 +34,7 @@ public class CustomSmokeParticle extends TextureSheetParticle {
this.quadSize *= 10f;
this.lifetime = this.random.nextInt(200) + 600;
this.gravity = 0.001f;
this.hasPhysics = false;
this.hasPhysics = true;
this.xd = vx * 0.9;
this.yd = vy * 0.9;
this.zd = vz * 0.9;

View file

@ -18,6 +18,7 @@ import net.minecraft.sounds.SoundSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.ThrowableItemProjectile;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.BellBlock;
@ -32,7 +33,7 @@ import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache;
import software.bernie.geckolib.animation.AnimatableManager;
import software.bernie.geckolib.util.GeckoLibUtil;
public class HandGrenadeEntity extends FastThrowableProjectile implements GeoEntity, ExplosiveProjectile {
public class HandGrenadeEntity extends ThrowableItemProjectile implements GeoEntity, ExplosiveProjectile {
private float damage = 1f;
private float explosionDamage = ExplosionConfig.M67_GRENADE_EXPLOSION_DAMAGE.get();
@ -53,7 +54,6 @@ public class HandGrenadeEntity extends FastThrowableProjectile implements GeoEnt
public HandGrenadeEntity(LivingEntity entity, Level level, int fuse) {
super(ModEntities.HAND_GRENADE.get(), entity, level);
this.noCulling = true;
this.fuse = fuse;
}

View file

@ -1,14 +1,27 @@
package com.atsuishio.superbwarfare.entity.projectile;
import com.atsuishio.superbwarfare.Mod;
import com.atsuishio.superbwarfare.init.ModEntities;
import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.init.ModParticleTypes;
import com.atsuishio.superbwarfare.init.ModSounds;
import com.atsuishio.superbwarfare.network.message.receive.ClientIndicatorMessage;
import com.atsuishio.superbwarfare.tools.ParticleTool;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.ClientGamePacketListener;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.ThrowableItemProjectile;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.BellBlock;
@ -17,16 +30,18 @@ import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.EntityHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.network.NetworkHooks;
import net.minecraftforge.network.PacketDistributor;
import net.minecraftforge.network.PlayMessages;
import org.jetbrains.annotations.NotNull;
import software.bernie.geckolib.animatable.GeoEntity;
import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache;
import software.bernie.geckolib.animation.AnimatableManager;
import software.bernie.geckolib.util.GeckoLibUtil;
public class M18SmokeGrenadeEntity extends FastThrowableProjectile implements GeoEntity {
private int fuse = 80;
public class M18SmokeGrenadeEntity extends ThrowableItemProjectile implements GeoEntity {
private int count = 8;
private int fuse = 100;
private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
public M18SmokeGrenadeEntity(EntityType<? extends M18SmokeGrenadeEntity> type, Level world) {
@ -42,7 +57,6 @@ public class M18SmokeGrenadeEntity extends FastThrowableProjectile implements Ge
public M18SmokeGrenadeEntity(LivingEntity entity, Level level, int fuse) {
super(ModEntities.M18_SMOKE_GRENADE.get(), entity, level);
this.noCulling = true;
this.fuse = fuse;
}
@ -65,8 +79,13 @@ public class M18SmokeGrenadeEntity extends FastThrowableProjectile implements Ge
}
@Override
protected @NotNull Item getDefaultItem() {
return ModItems.RGO_GRENADE.get();
public Packet<ClientGamePacketListener> getAddEntityPacket() {
return NetworkHooks.getEntitySpawningPacket(this);
}
@Override
protected Item getDefaultItem() {
return ModItems.M18_SMOKE_GRENADE.get();
}
@Override
@ -75,30 +94,60 @@ public class M18SmokeGrenadeEntity extends FastThrowableProjectile implements Ge
}
@Override
protected void onHit(@NotNull HitResult result) {
if (level().isClientSide) return;
protected void onHit(HitResult result) {
switch (result.getType()) {
case BLOCK:
BlockHitResult blockResult = (BlockHitResult) result;
BlockPos resultPos = blockResult.getBlockPos();
BlockState state = this.level().getBlockState(resultPos);
SoundEvent event = state.getBlock().getSoundType(state, this.level(), resultPos, this).getBreakSound();
double speed = this.getDeltaMovement().length();
if (speed > 0.1) {
this.level().playSound(null, result.getLocation().x, result.getLocation().y, result.getLocation().z, event, SoundSource.AMBIENT, 1.0F, 1.0F);
}
this.bounce(blockResult.getDirection());
if (state.getBlock() instanceof BellBlock bell) {
bell.attemptToRing(this.level(), resultPos, blockResult.getDirection());
}
releaseSmoke();
break;
case ENTITY:
EntityHitResult entityResult = (EntityHitResult) result;
Entity entity = entityResult.getEntity();
if (this.getOwner() != null
&& this.getOwner().getVehicle() != null
&& entity == this.getOwner().getVehicle()
|| entity == this.getOwner()
) return;
if (entity == this.getOwner() || entity == this.getVehicle()) return;
double speed_e = this.getDeltaMovement().length();
if (speed_e > 0.1) {
if (this.getOwner() instanceof LivingEntity living) {
if (!living.level().isClientSide() && living instanceof ServerPlayer player) {
living.level().playSound(null, living.blockPosition(), ModSounds.INDICATION.get(), SoundSource.VOICE, 1, 1);
releaseSmoke();
Mod.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> player), new ClientIndicatorMessage(0, 5));
}
}
entity.hurt(entity.damageSources().thrown(this, this.getOwner()), 1);
}
this.bounce(Direction.getNearest(this.getDeltaMovement().x(), this.getDeltaMovement().y(), this.getDeltaMovement().z()).getOpposite());
this.setDeltaMovement(this.getDeltaMovement().multiply(0.25, 1.0, 0.25));
break;
default:
break;
}
}
private void bounce(Direction direction) {
switch (direction.getAxis()) {
case X:
this.setDeltaMovement(this.getDeltaMovement().multiply(-0.5, 0.75, 0.75));
break;
case Y:
this.setDeltaMovement(this.getDeltaMovement().multiply(0.75, -0.25, 0.75));
if (this.getDeltaMovement().y() < this.getGravity()) {
this.setDeltaMovement(this.getDeltaMovement().multiply(1, 0, 1));
}
break;
case Z:
this.setDeltaMovement(this.getDeltaMovement().multiply(0.75, 0.75, -0.5));
break;
}
}
@ -108,31 +157,40 @@ public class M18SmokeGrenadeEntity extends FastThrowableProjectile implements Ge
super.tick();
--this.fuse;
if (this.fuse <= 0) {
if (tickCount > 200) {
this.discard();
}
if (fuse == -20) {
releaseSmoke();
}
}
// TODO 优化烟雾效果
public void releaseSmoke() {
var vec3 = new Vec3(1, 1, 0);
for (int i = 0; i < this.count; i++) {
var decoy = new SmokeDecoyEntity(this.level());
decoy.setPos(this.getX(), this.getY() + getBbHeight(), this.getZ());
decoy.decoyShoot(this, vec3.yRot(i * (360f / this.count) * Mth.DEG_TO_RAD), 3, 2);
this.level().addFreshEntity(decoy);
if (fuse == 0) {
this.level().playSound(null, this, ModSounds.SM0KE_GRENADE_RELEASE.get(), this.getSoundSource(), 2, 1);
}
this.level().playSound(null, this, ModSounds.DECOY_FIRE.get(), this.getSoundSource(), 1, 1);
this.discard();
if (fuse <= 0 && tickCount % 2 == 0) {
if (this.level() instanceof ServerLevel serverLevel) {
ParticleTool.sendParticle(serverLevel, ModParticleTypes.CUSTOM_SMOKE.get(), this.getX(), this.getY() + getBbHeight(), this.getZ(),
8, 0.075, 0.01, 0.075, 0.08, true);
}
}
if (!this.level().isClientSide() && this.level() instanceof ServerLevel serverLevel) {
ParticleTool.sendParticle(serverLevel, ParticleTypes.SMOKE, this.xo, this.yo, this.zo,
1, 0, 0, 0, 0.01, true);
}
}
@Override
protected double getDefaultGravity() {
return 0.07F;
public void releaseSmoke() {
var vec3 = new Vec3(1, 0.05, 0);
for (int i = 0; i < this.count; i++) {
var decoy = new SmokeDecoyEntity(ModEntities.SMOKE_DECOY.get(), this.level(), false);
decoy.setPos(this.getX(), this.getY() + getBbHeight(), this.getZ());
decoy.decoyShoot(this, vec3.yRot(i * (360f / this.count) * Mth.DEG_TO_RAD), 1.5f, 5);
this.level().addFreshEntity(decoy);
}
}
@Override
@ -144,4 +202,8 @@ public class M18SmokeGrenadeEntity extends FastThrowableProjectile implements Ge
return this.cache;
}
@Override
protected float getGravity() {
return 0.07F;
}
}

View file

@ -17,6 +17,7 @@ import net.minecraft.sounds.SoundSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.ThrowableItemProjectile;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.BellBlock;
@ -31,7 +32,7 @@ import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache;
import software.bernie.geckolib.animation.AnimatableManager;
import software.bernie.geckolib.util.GeckoLibUtil;
public class RgoGrenadeEntity extends FastThrowableProjectile implements GeoEntity, ExplosiveProjectile {
public class RgoGrenadeEntity extends ThrowableItemProjectile implements GeoEntity, ExplosiveProjectile {
private float explosionDamage = ExplosionConfig.RGO_GRENADE_EXPLOSION_DAMAGE.get();
private float explosionRadius = ExplosionConfig.RGO_GRENADE_EXPLOSION_RADIUS.get();

View file

@ -17,15 +17,29 @@ import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;
public class SmokeDecoyEntity extends Entity {
public boolean releaseSmoke = true;
public SmokeDecoyEntity(EntityType<? extends SmokeDecoyEntity> type, Level world) {
super(type, world);
}
public SmokeDecoyEntity(Level level) {
public SmokeDecoyEntity(EntityType<? extends SmokeDecoyEntity> type, Level world, boolean release) {
super(type, world);
releaseSmoke = release;
}
public SmokeDecoyEntity(LivingEntity entity, Level level) {
super(ModEntities.SMOKE_DECOY.get(), level);
}
public SmokeDecoyEntity(PlayMessages.SpawnEntity spawnEntity, Level level) {
this(ModEntities.SMOKE_DECOY.get(), level, true);
}
@Override
public @NotNull Packet<ClientGamePacketListener> getAddEntityPacket() {
return NetworkHooks.getEntitySpawningPacket(this);
}
public int life = 400;
public int igniteTime = 4;
@ -54,13 +68,15 @@ public class SmokeDecoyEntity extends Entity {
super.tick();
this.move(MoverType.SELF, this.getDeltaMovement());
if (tickCount == this.igniteTime) {
if (this.level() instanceof ServerLevel serverLevel) {
ParticleTool.sendParticle(serverLevel, ModParticleTypes.CUSTOM_SMOKE.get(), this.xo, this.yo, this.zo,
50, 0, 0, 0, 0.07, true);
ParticleTool.sendParticle(serverLevel, ParticleTypes.LARGE_SMOKE, this.xo, this.yo, this.zo, 10, 1, 1, 1, 0.1, true);
ParticleTool.sendParticle(serverLevel, ModParticleTypes.FIRE_STAR.get(), this.xo, this.yo, this.zo, 30, 0, 0, 0, 0.2, true);
if (releaseSmoke) {
if (this.level() instanceof ServerLevel serverLevel) {
ParticleTool.sendParticle(serverLevel, ModParticleTypes.CUSTOM_SMOKE.get(), this.xo, this.yo, this.zo,
50, 0, 0, 0, 0.07, true);
ParticleTool.sendParticle(serverLevel, ParticleTypes.LARGE_SMOKE, this.xo, this.yo, this.zo, 10, 1, 1, 1, 0.1, true);
ParticleTool.sendParticle(serverLevel, ModParticleTypes.FIRE_STAR.get(), this.xo, this.yo, this.zo, 30, 0, 0, 0, 0.2, true);
}
this.level().playSound(null, this, ModSounds.SMOKE_FIRE.get(), this.getSoundSource(), 2, random.nextFloat() * 0.05f + 1);
}
this.level().playSound(null, this, ModSounds.SMOKE_FIRE.get(), this.getSoundSource(), 2, random.nextFloat() * 0.05f + 1);
this.setDeltaMovement(Vec3.ZERO);
}

View file

@ -73,11 +73,11 @@ public class ModEntities {
public static final DeferredHolder<EntityType<?>, EntityType<MelonBombEntity>> MELON_BOMB = register("melon_bomb",
EntityType.Builder.<MelonBombEntity>of(MelonBombEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).setUpdateInterval(1).sized(1f, 1f));
public static final DeferredHolder<EntityType<?>, EntityType<HandGrenadeEntity>> HAND_GRENADE = register("hand_grenade",
EntityType.Builder.<HandGrenadeEntity>of(HandGrenadeEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).setUpdateInterval(1).sized(0.3f, 0.3f));
EntityType.Builder.<HandGrenadeEntity>of(HandGrenadeEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).noSave().setTrackingRange(64).setUpdateInterval(1).sized(0.3f, 0.3f));
public static final DeferredHolder<EntityType<?>, EntityType<RgoGrenadeEntity>> RGO_GRENADE = register("rgo_grenade",
EntityType.Builder.<RgoGrenadeEntity>of(RgoGrenadeEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).setUpdateInterval(1).sized(0.3f, 0.3f));
EntityType.Builder.<RgoGrenadeEntity>of(RgoGrenadeEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).noSave().setTrackingRange(64).setUpdateInterval(1).sized(0.3f, 0.3f));
public static final DeferredHolder<EntityType<?>, EntityType<M18SmokeGrenadeEntity>> M18_SMOKE_GRENADE = register("m18_smoke_grenade",
EntityType.Builder.<M18SmokeGrenadeEntity>of(M18SmokeGrenadeEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).setUpdateInterval(1).sized(0.3f, 0.3f));
EntityType.Builder.<M18SmokeGrenadeEntity>of(M18SmokeGrenadeEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).noSave().setTrackingRange(64).setUpdateInterval(1).sized(0.3f, 0.3f));
public static final DeferredHolder<EntityType<?>, EntityType<JavelinMissileEntity>> JAVELIN_MISSILE = register("javelin_missile",
EntityType.Builder.<JavelinMissileEntity>of(JavelinMissileEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f));
public static final DeferredHolder<EntityType<?>, EntityType<Agm65Entity>> AGM_65 = register("agm_65",

View file

@ -494,6 +494,7 @@ public class ModSounds {
public static final DeferredHolder<SoundEvent, SoundEvent> DPS_GENERATOR_EVOLVE = REGISTRY.register("dps_generator_evolve", () -> SoundEvent.createVariableRangeEvent(Mod.loc("dps_generator_evolve")));
public static final DeferredHolder<SoundEvent, SoundEvent> STEEL_PIPE_HIT = REGISTRY.register("steel_pipe_hit", () -> SoundEvent.createVariableRangeEvent(Mod.loc("steel_pipe_hit")));
public static final DeferredHolder<SoundEvent, SoundEvent> STEEL_PIPE_DROP = REGISTRY.register("steel_pipe_drop", () -> SoundEvent.createVariableRangeEvent(Mod.loc("steel_pipe_drop")));
public static final DeferredHolder<SoundEvent, SoundEvent> SM0KE_GRENADE_RELEASE = REGISTRY.register("smoke_grenade_release", () -> SoundEvent.createVariableRangeEvent(Mod.loc("smoke_grenade_release")));
}

View file

@ -21,8 +21,6 @@ import org.jetbrains.annotations.NotNull;
import javax.annotation.ParametersAreNonnullByDefault;
// TODO 物品图标合成配方等资源
public class M18SmokeGrenade extends Item implements ProjectileItem {
public M18SmokeGrenade() {
@ -73,9 +71,8 @@ public class M18SmokeGrenade extends Item implements ProjectileItem {
@ParametersAreNonnullByDefault
public @NotNull ItemStack finishUsingItem(ItemStack pStack, Level pLevel, LivingEntity pLivingEntity) {
if (!pLevel.isClientSide) {
var grenade = new M18SmokeGrenadeEntity(pLivingEntity, pLevel, 100);
grenade.setPos(pLivingEntity.position());
grenade.releaseSmoke();
M18SmokeGrenadeEntity grenade = new M18SmokeGrenadeEntity(pLivingEntity, pLevel, 2);
pLevel.addFreshEntity(grenade);
if (pLivingEntity instanceof Player player) {
player.getCooldowns().addCooldown(pStack.getItem(), 20);

View file

@ -0,0 +1,243 @@
{
"format_version": "1.12.0",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.m18_smoke_grenade - Converted",
"texture_width": 16,
"texture_height": 16,
"visible_bounds_width": 2,
"visible_bounds_height": 1.5,
"visible_bounds_offset": [0, 0.25, 0]
},
"bones": [
{
"name": "group",
"pivot": [0, 1.75, 1.75],
"rotation": [90, 0, -90]
},
{
"name": "bone4",
"parent": "group",
"pivot": [0, 3.14219, -17.07809],
"cubes": [
{
"origin": [-1.91426, 0.35254, 1.2125],
"size": [2.59528, 5.575, 1.075],
"uv": {
"east": {"uv": [0, 0], "uv_size": [1, 5.5]},
"west": {"uv": [1, 0], "uv_size": [1, 5.5]},
"up": {"uv": [3, 6], "uv_size": [2.5, 1]},
"down": {"uv": [6, 7], "uv_size": [2.5, -1]}
}
},
{
"origin": [-1.91426, 0.35254, 1.2125],
"size": [2.59528, 5.575, 1.075],
"pivot": [-0.61662, 3.14004, 1.75],
"rotation": [0, 45, 0],
"uv": {
"east": {"uv": [2, 0], "uv_size": [1, 5.5]},
"west": {"uv": [3, 0], "uv_size": [1, 5.5]},
"up": {"uv": [7, 0], "uv_size": [2.5, 1]},
"down": {"uv": [7, 2], "uv_size": [2.5, -1]}
}
},
{
"origin": [-1.15412, 0.35254, 0.45236],
"size": [1.075, 5.575, 2.59528],
"uv": {
"north": {"uv": [4, 0], "uv_size": [1, 5.5]},
"south": {"uv": [5, 0], "uv_size": [1, 5.5]},
"up": {"uv": [7, 2], "uv_size": [1, 2.5]},
"down": {"uv": [3, 9.5], "uv_size": [1, -2.5]}
}
},
{
"origin": [-1.15412, 0.35254, 0.45236],
"size": [1.075, 5.575, 2.59528],
"pivot": [-0.61662, 3.14004, 1.75],
"rotation": [0, 45, 0],
"uv": {
"north": {"uv": [0, 6], "uv_size": [1, 5.5]},
"south": {"uv": [6, 0], "uv_size": [1, 5.5]},
"up": {"uv": [4, 7], "uv_size": [1, 2.5]},
"down": {"uv": [5, 9.5], "uv_size": [1, -2.5]}
}
}
]
},
{
"name": "bone175",
"parent": "group",
"pivot": [0, 3.14219, -17.07809],
"cubes": [
{
"origin": [-1.52497, 5.92754, 1.37375],
"size": [1.8167, 0.25, 0.7525],
"uv": {
"east": {"uv": [10, 5], "uv_size": [1, 0.5]},
"west": {"uv": [6, 10], "uv_size": [1, 0.5]},
"up": {"uv": [7, 5], "uv_size": [2, 1]}
}
},
{
"origin": [-1.52497, 5.92754, 1.37375],
"size": [1.8167, 0.25, 0.7525],
"pivot": [-0.61662, 3.97629, 1.75],
"rotation": [0, 45, 0],
"uv": {
"east": {"uv": [10, 6], "uv_size": [1, 0.5]},
"west": {"uv": [7, 10], "uv_size": [1, 0.5]},
"up": {"uv": [6, 7], "uv_size": [2, 1]}
}
},
{
"origin": [-0.99287, 5.92754, 0.84165],
"size": [0.7525, 0.25, 1.8167],
"uv": {
"north": {"uv": [10, 7], "uv_size": [1, 0.5]},
"south": {"uv": [10, 8], "uv_size": [1, 0.5]},
"up": {"uv": [8, 2], "uv_size": [1, 2]}
}
},
{
"origin": [-0.99287, 5.92754, 0.84165],
"size": [0.7525, 0.25, 1.8167],
"pivot": [-0.61662, 3.97629, 1.75],
"rotation": [0, 45, 0],
"uv": {
"north": {"uv": [9, 10], "uv_size": [1, 0.5]},
"south": {"uv": [10, 9], "uv_size": [1, 0.5]},
"up": {"uv": [6, 8], "uv_size": [1, 2]}
}
}
]
},
{
"name": "bone2",
"parent": "group",
"pivot": [1, 6.78847, 1.92961],
"cubes": [
{
"origin": [-1.05412, 6.03768, 1.2125],
"size": [0.875, 0.3, 1.075],
"uv": {
"north": {"uv": [10, 10], "uv_size": [1, 0.5]},
"east": {"uv": [11, 0], "uv_size": [1, 0.5]},
"south": {"uv": [1, 11], "uv_size": [1, 0.5]},
"west": {"uv": [2, 11], "uv_size": [1, 0.5]}
}
},
{
"origin": [-1.06662, 6.34004, 1.15],
"size": [0.9, 0.85, 1.35],
"uv": {
"east": {"uv": [8, 4], "uv_size": [1.5, 1]},
"south": {"uv": [9, 3], "uv_size": [1, 1]},
"west": {"uv": [9, 2], "uv_size": [1.5, 1]},
"down": {"uv": [9, 6.5], "uv_size": [1, -1.5]}
}
},
{
"origin": [-1.06662, 6.34004, 2.5],
"size": [0.9, 0.85, 0.3],
"uv": {
"east": {"uv": [11, 2], "uv_size": [0.5, 1]},
"west": {"uv": [3, 11], "uv_size": [0.5, 1]},
"down": {"uv": [11, 3.5], "uv_size": [1, -0.5]}
}
},
{
"origin": [-1.06662, 6.34004, 2.8],
"size": [0.9, 0.35, 0.3],
"uv": {
"east": {"uv": [6, 12], "uv_size": [0.5, 0.5]},
"south": {"uv": [4, 11], "uv_size": [1, 0.5]},
"west": {"uv": [12, 6], "uv_size": [0.5, 0.5]},
"down": {"uv": [11, 4.5], "uv_size": [1, -0.5]}
}
},
{
"origin": [-1.06662, 6.69004, 2.8],
"size": [0.9, 0.3, 0.2],
"uv": {
"east": {"uv": [7, 12], "uv_size": [0.5, 0.5]},
"south": {"uv": [11, 5], "uv_size": [1, 0.5]},
"west": {"uv": [12, 7], "uv_size": [0.5, 0.5]},
"down": {"uv": [6, 11.5], "uv_size": [1, -0.5]}
}
},
{
"origin": [-1.06662, 6.21741, 1.33352],
"size": [0.9, 0.93907, 0.35078],
"pivot": [0.38338, 5.81741, 0.93352],
"rotation": [22.5, 0, 0],
"uv": {
"north": {"uv": [10, 0], "uv_size": [1, 1]},
"east": {"uv": [11, 6], "uv_size": [0.5, 1]},
"west": {"uv": [7, 11], "uv_size": [0.5, 1]},
"up": {"uv": [11, 7], "uv_size": [1, 0.5]},
"down": {"uv": [11, 8.5], "uv_size": [1, -0.5]}
}
},
{
"origin": [-1.11662, 7.19004, 0.65],
"size": [1, 0.2, 2.2],
"uv": {
"north": {"uv": [9, 11], "uv_size": [1, 0.5]},
"east": {"uv": [10, 1], "uv_size": [2, 0.5]},
"west": {"uv": [3, 10], "uv_size": [2, 0.5]},
"up": {"uv": [7, 8], "uv_size": [1, 2]},
"down": {"uv": [8, 9], "uv_size": [1, -2]}
}
},
{
"origin": [-1.11662, 6.0047, 2.85594],
"size": [1, 0.75, 0.2],
"pivot": [0.38338, 6.5547, 1.35594],
"rotation": [22.5, 0, 0],
"uv": {
"north": {"uv": [1, 9], "uv_size": [1, 2]},
"east": {"uv": [10, 3], "uv_size": [0.5, 2]},
"south": {"uv": [2, 9], "uv_size": [1, 2]},
"west": {"uv": [5, 10], "uv_size": [0.5, 2]},
"up": {"uv": [4, 12], "uv_size": [1, 0.5]},
"down": {"uv": [12, 4.5], "uv_size": [1, -0.5]}
}
}
]
}
],
"item_display_transforms": {
"firstperson_righthand": {
"rotation": [-3, -19, -7.25],
"translation": [5.5, -0.75, -3.5],
"scale": [2, 2, 2]
},
"firstperson_lefthand": {
"rotation": [-3, -19, -7.25],
"translation": [5.5, -0.75, -3.5],
"scale": [2, 2, 2]
},
"ground": {
"translation": [0, 1, 0]
},
"gui": {
"rotation": [-140.06, -16.8, -135.22],
"translation": [1.75, 1.5, 0],
"scale": [2.25, 2.25, 2.25]
},
"head": {
"translation": [0, -1.75, -6.75],
"scale": [1.5, 1.5, 1.5]
},
"fixed": {
"rotation": [90, -45, 90],
"translation": [-1.25, 1.5, 0],
"scale": [2, 2, 2]
}
}
}
]
}

View file

@ -496,6 +496,7 @@
"entity.superbwarfare.dps_generator": "DPS Generator",
"entity.superbwarfare.blu_43": "BLU-43B DragonTooth",
"entity.superbwarfare.tm_62": "TM-62 Anti-tank Mine",
"entity.superbwarfare.m18_smoke_grenade": "M-18 Smoke Grenade",
"key.categories.superbwarfare": "Superb Warfare",
"key.superbwarfare.hold_zoom": "Zoom (Hold)",

View file

@ -495,6 +495,7 @@
"entity.superbwarfare.dps_generator": "DPS发电机",
"entity.superbwarfare.blu_43": "BLU-43蝴蝶雷",
"entity.superbwarfare.tm_62": "TM-62反坦克地雷",
"entity.superbwarfare.m18_smoke_grenade": "M-18烟雾弹",
"key.categories.superbwarfare": "卓越前线",
"key.superbwarfare.hold_zoom": "瞄准(按住)",

View file

@ -0,0 +1,346 @@
{
"credit": "Made with Blockbench",
"textures": {
"1": "superbwarfare:item/m_18"
},
"elements": [
{
"name": "bone177",
"from": [6.70236, 3.6125, 7.4625],
"to": [9.29764, 9.1875, 8.5375],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 6.4, 8]},
"faces": {
"east": {"uv": [0, 0, 1, 5.5], "texture": "#1"},
"west": {"uv": [1, 0, 2, 5.5], "texture": "#1"},
"up": {"uv": [5.5, 7, 3, 6], "texture": "#1"},
"down": {"uv": [8.5, 6, 6, 7], "texture": "#1"}
}
},
{
"name": "bone178",
"from": [6.70236, 3.6125, 7.4625],
"to": [9.29764, 9.1875, 8.5375],
"rotation": {"angle": -45, "axis": "y", "origin": [8, 6.4, 8]},
"faces": {
"east": {"uv": [2, 0, 3, 5.5], "texture": "#1"},
"west": {"uv": [3, 0, 4, 5.5], "texture": "#1"},
"up": {"uv": [9.5, 1, 7, 0], "texture": "#1"},
"down": {"uv": [9.5, 1, 7, 2], "texture": "#1"}
}
},
{
"name": "bone179",
"from": [7.4625, 3.6125, 6.70236],
"to": [8.5375, 9.1875, 9.29764],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 6.4, 8]},
"faces": {
"north": {"uv": [4, 0, 5, 5.5], "texture": "#1"},
"south": {"uv": [5, 0, 6, 5.5], "texture": "#1"},
"up": {"uv": [8, 4.5, 7, 2], "texture": "#1"},
"down": {"uv": [4, 7, 3, 9.5], "texture": "#1"}
}
},
{
"name": "bone180",
"from": [7.4625, 3.6125, 6.70236],
"to": [8.5375, 9.1875, 9.29764],
"rotation": {"angle": -45, "axis": "y", "origin": [8, 6.4, 8]},
"faces": {
"north": {"uv": [0, 6, 1, 11.5], "texture": "#1"},
"south": {"uv": [6, 0, 7, 5.5], "texture": "#1"},
"up": {"uv": [5, 9.5, 4, 7], "texture": "#1"},
"down": {"uv": [6, 7, 5, 9.5], "texture": "#1"}
}
},
{
"name": "bone178",
"from": [7.09165, 9.1875, 7.62375],
"to": [8.90835, 9.4375, 8.37625],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.23625, 8]},
"faces": {
"east": {"uv": [10, 5, 11, 5.5], "texture": "#1"},
"west": {"uv": [6, 10, 7, 10.5], "texture": "#1"},
"up": {"uv": [9, 6, 7, 5], "texture": "#1"}
}
},
{
"name": "bone179",
"from": [7.09165, 9.1875, 7.62375],
"to": [8.90835, 9.4375, 8.37625],
"rotation": {"angle": -45, "axis": "y", "origin": [8, 7.23625, 8]},
"faces": {
"east": {"uv": [10, 6, 11, 6.5], "texture": "#1"},
"west": {"uv": [7, 10, 8, 10.5], "texture": "#1"},
"up": {"uv": [8, 8, 6, 7], "texture": "#1"}
}
},
{
"name": "bone180",
"from": [7.62375, 9.1875, 7.09165],
"to": [8.37625, 9.4375, 8.90835],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.23625, 8]},
"faces": {
"north": {"uv": [10, 7, 11, 7.5], "texture": "#1"},
"south": {"uv": [10, 8, 11, 8.5], "texture": "#1"},
"up": {"uv": [9, 4, 8, 2], "texture": "#1"}
}
},
{
"name": "bone181",
"from": [7.62375, 9.1875, 7.09165],
"to": [8.37625, 9.4375, 8.90835],
"rotation": {"angle": -45, "axis": "y", "origin": [8, 7.23625, 8]},
"faces": {
"north": {"uv": [9, 10, 10, 10.5], "texture": "#1"},
"south": {"uv": [10, 9, 11, 9.5], "texture": "#1"},
"up": {"uv": [7, 10, 6, 8], "texture": "#1"}
}
},
{
"name": "bone177",
"from": [7.5625, 9.29764, 7.4625],
"to": [8.4375, 9.59764, 8.5375],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [10, 10, 11, 10.5], "texture": "#1"},
"east": {"uv": [11, 0, 12, 0.5], "texture": "#1"},
"south": {"uv": [1, 11, 2, 11.5], "texture": "#1"},
"west": {"uv": [2, 11, 3, 11.5], "texture": "#1"}
}
},
{
"from": [7.55, 9.6, 7.4],
"to": [8.45, 10.45, 8.75],
"rotation": {"angle": 0, "axis": "y", "origin": [7, 9.2, 7]},
"faces": {
"east": {"uv": [8, 4, 9.5, 5], "texture": "#1"},
"south": {"uv": [9, 3, 10, 4], "texture": "#1"},
"west": {"uv": [9, 2, 10.5, 3], "texture": "#1"},
"down": {"uv": [10, 5, 9, 6.5], "texture": "#1"}
}
},
{
"from": [7.55, 9.6, 8.75],
"to": [8.45, 10.45, 9.05],
"rotation": {"angle": 0, "axis": "y", "origin": [7, 9.2, 7]},
"faces": {
"east": {"uv": [11, 2, 11.5, 3], "texture": "#1"},
"west": {"uv": [3, 11, 3.5, 12], "texture": "#1"},
"down": {"uv": [12, 3, 11, 3.5], "texture": "#1"}
}
},
{
"from": [7.55, 9.6, 9.05],
"to": [8.45, 9.95, 9.35],
"rotation": {"angle": 0, "axis": "y", "origin": [7, 9.2, 7]},
"faces": {
"east": {"uv": [6, 12, 6.5, 12.5], "texture": "#1"},
"south": {"uv": [4, 11, 5, 11.5], "texture": "#1"},
"west": {"uv": [12, 6, 12.5, 6.5], "texture": "#1"},
"down": {"uv": [12, 4, 11, 4.5], "texture": "#1"}
}
},
{
"from": [7.55, 9.95, 9.05],
"to": [8.45, 10.25, 9.25],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 10.1, 9.15]},
"faces": {
"east": {"uv": [7, 12, 7.5, 12.5], "texture": "#1"},
"south": {"uv": [11, 5, 12, 5.5], "texture": "#1"},
"west": {"uv": [12, 7, 12.5, 7.5], "texture": "#1"},
"down": {"uv": [7, 11, 6, 11.5], "texture": "#1"}
}
},
{
"from": [7.55, 9.47737, 7.58352],
"to": [8.45, 10.41644, 7.9343],
"rotation": {"angle": -22.5, "axis": "x", "origin": [7, 9.07737, 7.18352]},
"faces": {
"north": {"uv": [10, 0, 11, 1], "texture": "#1"},
"east": {"uv": [11, 6, 11.5, 7], "texture": "#1"},
"west": {"uv": [7, 11, 7.5, 12], "texture": "#1"},
"up": {"uv": [12, 7.5, 11, 7], "texture": "#1"},
"down": {"uv": [12, 8, 11, 8.5], "texture": "#1"}
}
},
{
"from": [7.5, 10.45, 6.9],
"to": [8.5, 10.65, 9.1],
"rotation": {"angle": 0, "axis": "y", "origin": [7, 8.95, 7]},
"faces": {
"north": {"uv": [9, 11, 10, 11.5], "texture": "#1"},
"east": {"uv": [10, 1, 12, 1.5], "texture": "#1"},
"west": {"uv": [3, 10, 5, 10.5], "texture": "#1"},
"up": {"uv": [8, 10, 7, 8], "texture": "#1"},
"down": {"uv": [9, 7, 8, 9], "texture": "#1"}
}
},
{
"from": [7.4, 10.32266, 8.87031],
"to": [8.6, 10.42266, 8.97031],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 10.37266, 8.92031]},
"faces": {
"north": {"uv": [11, 9, 12, 9.5], "texture": "#1"},
"east": {"uv": [8, 12, 8.5, 12.5], "texture": "#1"},
"south": {"uv": [10, 11, 11, 11.5], "texture": "#1"},
"west": {"uv": [12, 8, 12.5, 8.5], "texture": "#1"},
"up": {"uv": [12, 10.5, 11, 10], "texture": "#1"},
"down": {"uv": [12, 11, 11, 11.5], "texture": "#1"}
}
},
{
"from": [7.35, 10.32266, 8.57031],
"to": [7.45, 10.42266, 9.27031],
"rotation": {"angle": -22.5, "axis": "z", "origin": [7.4, 10.37266, 8.92031]},
"faces": {
"north": {"uv": [9, 12, 9.5, 12.5], "texture": "#1"},
"east": {"uv": [12, 9, 12.5, 9.5], "texture": "#1"},
"south": {"uv": [10, 12, 10.5, 12.5], "texture": "#1"},
"west": {"uv": [12, 10, 12.5, 10.5], "texture": "#1"},
"up": {"uv": [11.5, 12.5, 11, 12], "texture": "#1"},
"down": {"uv": [12.5, 11, 12, 11.5], "texture": "#1"}
}
},
{
"from": [7.04385, 9.58355, 8.57031],
"to": [7.14385, 9.68355, 9.27031],
"rotation": {"angle": -22.5, "axis": "z", "origin": [7.09385, 9.63355, 8.92031]},
"faces": {
"north": {"uv": [12, 12, 12.5, 12.5], "texture": "#1"},
"east": {"uv": [0, 13, 0.5, 13.5], "texture": "#1"},
"south": {"uv": [13, 0, 13.5, 0.5], "texture": "#1"},
"west": {"uv": [1, 13, 1.5, 13.5], "texture": "#1"},
"up": {"uv": [13.5, 1.5, 13, 1], "texture": "#1"},
"down": {"uv": [2.5, 13, 2, 13.5], "texture": "#1"}
}
},
{
"from": [7.21606, 9.5493, 9.27031],
"to": [7.31606, 10.4493, 9.37031],
"rotation": {"angle": -22.5, "axis": "z", "origin": [7.26606, 10.0493, 9.32031]},
"faces": {
"north": {"uv": [0, 12, 0.5, 13], "texture": "#1"},
"east": {"uv": [12, 0, 12.5, 1], "texture": "#1"},
"south": {"uv": [1, 12, 1.5, 13], "texture": "#1"},
"west": {"uv": [12, 1, 12.5, 2], "texture": "#1"},
"up": {"uv": [13.5, 2.5, 13, 2], "texture": "#1"},
"down": {"uv": [3.5, 13, 3, 13.5], "texture": "#1"}
}
},
{
"from": [7.21606, 9.5493, 8.47031],
"to": [7.31606, 10.4493, 8.57031],
"rotation": {"angle": -22.5, "axis": "z", "origin": [7.26606, 10.0493, 8.52031]},
"faces": {
"north": {"uv": [2, 12, 2.5, 13], "texture": "#1"},
"east": {"uv": [12, 2, 12.5, 3], "texture": "#1"},
"south": {"uv": [3, 12, 3.5, 13], "texture": "#1"},
"west": {"uv": [12, 3, 12.5, 4], "texture": "#1"},
"up": {"uv": [13.5, 3.5, 13, 3], "texture": "#1"},
"down": {"uv": [4.5, 13, 4, 13.5], "texture": "#1"}
}
},
{
"from": [7.5, 8.06466, 9.10594],
"to": [8.5, 10.01466, 9.30594],
"rotation": {"angle": -22.5, "axis": "x", "origin": [7, 9.81466, 7.60594]},
"faces": {
"north": {"uv": [1, 9, 2, 11], "texture": "#1"},
"east": {"uv": [10, 3, 10.5, 5], "texture": "#1"},
"south": {"uv": [2, 9, 3, 11], "texture": "#1"},
"west": {"uv": [5, 10, 5.5, 12], "texture": "#1"},
"up": {"uv": [5, 12.5, 4, 12], "texture": "#1"},
"down": {"uv": [13, 4, 12, 4.5], "texture": "#1"}
}
},
{
"from": [7.5, 5.64843, 9.64623],
"to": [8.5, 8.84843, 9.84623],
"rotation": {"angle": 0, "axis": "y", "origin": [7, 8.64843, 8.14623]},
"faces": {
"north": {"uv": [1, 6, 2, 9], "texture": "#1"},
"east": {"uv": [9, 7, 9.5, 10], "texture": "#1"},
"south": {"uv": [2, 6, 3, 9], "texture": "#1"},
"west": {"uv": [8, 9, 8.5, 12], "texture": "#1"},
"up": {"uv": [6, 12.5, 5, 12], "texture": "#1"},
"down": {"uv": [13, 5, 12, 5.5], "texture": "#1"}
}
}
],
"display": {
"firstperson_righthand": {
"rotation": [-3, -19, -7.25],
"translation": [5.5, -0.75, -3.5],
"scale": [2, 2, 2]
},
"firstperson_lefthand": {
"rotation": [-3, -19, -7.25],
"translation": [5.5, -0.75, -3.5],
"scale": [2, 2, 2]
},
"ground": {
"translation": [0, 1, 0]
},
"gui": {
"rotation": [-140.06, -16.8, -135.22],
"translation": [1.75, 1.5, 0],
"scale": [2.25, 2.25, 2.25]
},
"head": {
"translation": [0, -1.75, -6.75],
"scale": [1.5, 1.5, 1.5]
},
"fixed": {
"rotation": [90, -45, 90],
"translation": [-1.25, 1.5, 0],
"scale": [2, 2, 2]
}
},
"groups": [
{
"name": "group",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "bone175",
"origin": [8, 7.99219, -17.72809],
"color": 2,
"children": []
},
{
"name": "bone175",
"origin": [8, 7.99219, -17.72809],
"color": 2,
"children": []
},
{
"name": "bone175",
"origin": [8, 7.99219, -17.72809],
"color": 2,
"children": [0, 1, 2, 3]
},
{
"name": "bone175",
"origin": [8, 7.99219, -17.72809],
"color": 2,
"children": [4, 5, 6, 7]
},
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21
]
}
]
}

View file

@ -3386,5 +3386,13 @@
"stream": false
}
]
},
"smoke_grenade_release": {
"sounds": [
{
"name": "superbwarfare:smoke_grenade_release",
"stream": false
}
]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 973 B

View file

@ -0,0 +1,27 @@
{
"type": "minecraft:crafting_shaped",
"category": "misc",
"pattern": [
" a ",
"bcb",
"bdb"
],
"key": {
"a": {
"item": "minecraft:tripwire_hook"
},
"b": {
"item": "minecraft:iron_nugget"
},
"c": {
"item": "minecraft:wheat"
},
"d": {
"item": "minecraft:gunpowder"
}
},
"result": {
"item": "superbwarfare:m18_smoke_grenade",
"count": 2
}
}