完成无人机炸机,撞击引爆功能

This commit is contained in:
Atsuihsio 2024-11-28 06:16:34 +08:00
parent 72da5c171e
commit de13ad8897
9 changed files with 103 additions and 40 deletions

View file

@ -1,15 +1,15 @@
package com.atsuishio.superbwarfare.client.screens; package com.atsuishio.superbwarfare.client.screens;
import com.atsuishio.superbwarfare.config.client.KillMessageConfig;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.ModUtils;
import com.atsuishio.superbwarfare.config.client.KillMessageConfig;
import com.atsuishio.superbwarfare.event.KillMessageHandler; import com.atsuishio.superbwarfare.event.KillMessageHandler;
import com.atsuishio.superbwarfare.init.ModDamageTypes; import com.atsuishio.superbwarfare.init.ModDamageTypes;
import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.tools.DamageTypeTool; import com.atsuishio.superbwarfare.tools.DamageTypeTool;
import com.atsuishio.superbwarfare.tools.PlayerKillRecord; import com.atsuishio.superbwarfare.tools.PlayerKillRecord;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font; import net.minecraft.client.gui.Font;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
@ -42,6 +42,7 @@ public class KillMessageOverlay {
private static final ResourceLocation SHOCK = ModUtils.loc("textures/screens/damage_types/shock.png"); private static final ResourceLocation SHOCK = ModUtils.loc("textures/screens/damage_types/shock.png");
private static final ResourceLocation BLOOD_CRYSTAL = ModUtils.loc("textures/screens/damage_types/blood_crystal.png"); private static final ResourceLocation BLOOD_CRYSTAL = ModUtils.loc("textures/screens/damage_types/blood_crystal.png");
private static final ResourceLocation BURN = ModUtils.loc("textures/screens/damage_types/burn.png"); private static final ResourceLocation BURN = ModUtils.loc("textures/screens/damage_types/burn.png");
private static final ResourceLocation DRONE = ModUtils.loc("textures/screens/damage_types/drone.png");
private static final ResourceLocation WORLD_PEACE_STAFF = ModUtils.loc("textures/gun_icon/compat/world_peace_staff.png"); private static final ResourceLocation WORLD_PEACE_STAFF = ModUtils.loc("textures/gun_icon/compat/world_peace_staff.png");
@ -272,7 +273,9 @@ public class KillMessageOverlay {
icon = SHOCK; icon = SHOCK;
} else if (record.damageType == ModDamageTypes.BURN || record.damageType == DamageTypes.IN_FIRE || record.damageType == DamageTypes.ON_FIRE || record.damageType == DamageTypes.LAVA) { } else if (record.damageType == ModDamageTypes.BURN || record.damageType == DamageTypes.IN_FIRE || record.damageType == DamageTypes.ON_FIRE || record.damageType == DamageTypes.LAVA) {
icon = BURN; icon = BURN;
} else { } else if (record.damageType == ModDamageTypes.DRONE_HIT) {
icon = DRONE;
}else {
icon = GENERIC; icon = GENERIC;
} }
} }

View file

@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModSounds;
import com.atsuishio.superbwarfare.item.Monitor; import com.atsuishio.superbwarfare.item.Monitor;
import com.atsuishio.superbwarfare.tools.CustomExplosion; import com.atsuishio.superbwarfare.tools.CustomExplosion;
import com.atsuishio.superbwarfare.tools.EntityFindUtil; import com.atsuishio.superbwarfare.tools.EntityFindUtil;
import com.atsuishio.superbwarfare.tools.ParticleTool;
import com.atsuishio.superbwarfare.tools.SoundTool; import com.atsuishio.superbwarfare.tools.SoundTool;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
@ -33,12 +34,16 @@ import net.minecraft.world.damagesource.DamageTypes;
import net.minecraft.world.entity.*; import net.minecraft.world.entity.*;
import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Explosion;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.BooleanOp;
import net.minecraft.world.phys.shapes.Shapes;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.network.NetworkHooks; import net.minecraftforge.network.NetworkHooks;
import net.minecraftforge.network.PlayMessages; import net.minecraftforge.network.PlayMessages;
@ -48,6 +53,7 @@ import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache
import software.bernie.geckolib.core.animation.AnimatableManager; import software.bernie.geckolib.core.animation.AnimatableManager;
import software.bernie.geckolib.util.GeckoLibUtil; import software.bernie.geckolib.util.GeckoLibUtil;
import java.util.Comparator;
import java.util.Objects; import java.util.Objects;
import java.util.UUID; import java.util.UUID;
@ -214,9 +220,9 @@ public class DroneEntity extends LivingEntity implements GeoEntity {
this.entityData.set(MOVE_Y, Mth.lerp(0.5f, this.entityData.get(MOVE_Y), 0)); this.entityData.set(MOVE_Y, Mth.lerp(0.5f, this.entityData.get(MOVE_Y), 0));
this.setDeltaMovement(new Vec3( this.setDeltaMovement(new Vec3(
this.getDeltaMovement().x + -this.entityData.get(MOVE_Z) * 0.1f * this.getLookAngle().x, this.getDeltaMovement().x + -this.entityData.get(MOVE_Z) * 0.07f * this.getLookAngle().x,
this.getDeltaMovement().y + (this.onGround() ? 0.059 : 0) + -this.entityData.get(MOVE_Y) * 0.05f, this.getDeltaMovement().y + (this.onGround() ? 0.059 : 0) + -this.entityData.get(MOVE_Y) * 0.05f,
this.getDeltaMovement().z + -this.entityData.get(MOVE_Z) * 0.1f * this.getLookAngle().z this.getDeltaMovement().z + -this.entityData.get(MOVE_Z) * 0.07f * this.getLookAngle().z
)); ));
this.move = this.getPersistentData().getBoolean("left") this.move = this.getPersistentData().getBoolean("left")
@ -229,7 +235,7 @@ public class DroneEntity extends LivingEntity implements GeoEntity {
Vec3 vec = this.getDeltaMovement(); Vec3 vec = this.getDeltaMovement();
if (this.getDeltaMovement().horizontalDistanceSqr() < 0.75) { if (this.getDeltaMovement().horizontalDistanceSqr() < 0.75) {
if (this.move) { if (this.move) {
this.setDeltaMovement(vec.multiply(1.04, 0.99, 1.04)); this.setDeltaMovement(vec.multiply(1.035, 0.99, 1.035));
} }
} }
@ -242,9 +248,23 @@ public class DroneEntity extends LivingEntity implements GeoEntity {
if (stack.getOrCreateTag().getBoolean("Using") && controller instanceof ServerPlayer serverPlayer) { if (stack.getOrCreateTag().getBoolean("Using") && controller instanceof ServerPlayer serverPlayer) {
SoundTool.playLocalSound(serverPlayer, ModSounds.DRONE_SOUND.get(), 100, 1); SoundTool.playLocalSound(serverPlayer, ModSounds.DRONE_SOUND.get(), 100, 1);
} }
controller.setYRot(controller.getYRot() - 5 * this.entityData.get(ROT_X) * Mth.abs(this.entityData.get(MOVE_Z))); controller.setYRot(controller.getYRot() - 5 * this.entityData.get(ROT_X) * Mth.abs(this.entityData.get(MOVE_Z)));
} }
float f = 0.7f;
AABB aabb = AABB.ofSize(this.getEyePosition(), f, 0.3, f);
var level = this.level();
final Vec3 center = new Vec3(this.getX(), this.getY(), this.getZ());
for (Entity target : level.getEntitiesOfClass(Entity.class, aabb, e -> true).stream().sorted(Comparator.comparingDouble(e -> e.distanceToSqr(center))).toList()) {
if (this != target && target != null) {
target.hurt(ModDamageTypes.causeDroneHitDamage(this.level().registryAccess(), this, controller), 1);
target.invulnerableTime = 0;
if (target instanceof Mob mobEntity) {
mobEntity.setTarget(this);
}
this.hurt(new DamageSource(level().registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolderOrThrow(DamageTypes.EXPLOSION), Objects.requireNonNullElse(controller, this)), 1);
}
}
} }
if (this.getPersistentData().getBoolean("firing")) { if (this.getPersistentData().getBoolean("firing")) {
@ -387,21 +407,51 @@ public class DroneEntity extends LivingEntity implements GeoEntity {
this.setDeltaMovement(vec3.multiply(0.9, 0.8, 0.9)); this.setDeltaMovement(vec3.multiply(0.9, 0.8, 0.9));
} }
lastTickSpeed = this.getDeltaMovement().length();
double x0 = this.getX() - this.xOld; crash(controller);
double y0 = this.getY() - this.yOld; float f = 0.7f;
double z0 = this.getZ() - this.zOld; AABB aabb = AABB.ofSize(this.getEyePosition(), f, 0.3, f);
var level = this.level();
lastTickSpeed = Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0); final Vec3 center = new Vec3(this.getX(), this.getY(), this.getZ());
for (Entity target : level.getEntitiesOfClass(Entity.class, aabb, e -> true).stream().sorted(Comparator.comparingDouble(e -> e.distanceToSqr(center))).toList()) {
if (this != target && target != null) {
if (controller != null) { hitEntityCrash(controller, target);
controller.displayClientMessage(Component.literal( new java.text.DecimalFormat("##.####").format(Mth.abs((float) (this.getDeltaMovement().length() - lastTickSpeed)))), false); }
} }
if (Mth.abs((float) (this.getDeltaMovement().length() - lastTickSpeed)) > 1.0) {
this.hurt(new DamageSource(level().registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolderOrThrow(DamageTypes.EXPLOSION), controller), 10000);
} }
public void crash(Player controller) {
if (isHit() && lastTickSpeed > 0.3) {
this.hurt(new DamageSource(level().registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolderOrThrow(DamageTypes.EXPLOSION), Objects.requireNonNullElse(controller, this)), (float) ((this.entityData.get(KAMIKAZE) ? 6 : 2) * lastTickSpeed));
}
}
public void hitEntityCrash(Player controller, Entity target) {
if (lastTickSpeed > 0.2) {
if (this.entityData.get(KAMIKAZE) && 6 * lastTickSpeed > this.getHealth()) {
target.hurt(ModDamageTypes.causeCustomExplosionDamage(this.level().registryAccess(), this, controller), 600);
}
target.hurt(ModDamageTypes.causeDroneHitDamage(this.level().registryAccess(), this, controller), (float) (5 * lastTickSpeed));
if (target instanceof Mob mobEntity) {
mobEntity.setTarget(this);
}
this.hurt(new DamageSource(level().registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolderOrThrow(DamageTypes.EXPLOSION), Objects.requireNonNullElse(controller, this)), (float) ((this.entityData.get(KAMIKAZE) ? 6 : 0.5) * lastTickSpeed));
}
}
public boolean isHit() {
float f = 0.7f;
AABB aabb = AABB.ofSize(this.getEyePosition(), f, 0.3, f);
return BlockPos.betweenClosedStream(aabb).anyMatch((block) -> {
BlockState blockstate = this.level().getBlockState(block);
return !blockstate.isAir() && blockstate.isSuffocating(this.level(), block) && Shapes.joinIsNotEmpty(blockstate.getCollisionShape(this.level(), block).move(block.getX(), block.getY(), block.getZ()), Shapes.create(aabb), BooleanOp.AND);
});
}
@Override
public boolean canBeCollidedWith() {
return super.canBeCollidedWith();
} }
@Override @Override
@ -409,7 +459,6 @@ public class DroneEntity extends LivingEntity implements GeoEntity {
super.die(source); super.die(source);
String id = this.entityData.get(CONTROLLER); String id = this.entityData.get(CONTROLLER);
UUID uuid; UUID uuid;
try { try {
uuid = UUID.fromString(id); uuid = UUID.fromString(id);
@ -431,28 +480,29 @@ public class DroneEntity extends LivingEntity implements GeoEntity {
kamikazeExplosion(source.getEntity()); kamikazeExplosion(source.getEntity());
} }
ItemStack stack = new ItemStack(ModItems.RGO_GRENADE.get(),this.entityData.get(AMMO));
if (this.level() instanceof ServerLevel level) {
ItemEntity itemEntity = new ItemEntity(level, this.getX(), this.getY(), this.getZ(), stack);
itemEntity.setPickUpDelay(10);
level.addFreshEntity(itemEntity);
}
if (level() instanceof ServerLevel) { if (level() instanceof ServerLevel) {
level().explode(null, this.getX(), this.getY(), this.getZ(), 0, Level.ExplosionInteraction.NONE); level().explode(null, this.getX(), this.getY(), this.getZ(), 0, Level.ExplosionInteraction.NONE);
} }
this.discard(); this.discard();
} }
private void kamikazeExplosion(Entity source) { private void kamikazeExplosion(Entity source) {
CustomExplosion explosionCore = new CustomExplosion(this.level(), this,
ModDamageTypes.causeProjectileBoomDamage(this.level().registryAccess(), source, source), 1000,
this.getX(), this.getY(), this.getZ(), 4f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1);
explosionCore.explode();
net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosionCore);
explosionCore.finalizeExplosion(false);
CustomExplosion explosion = new CustomExplosion(this.level(), this, CustomExplosion explosion = new CustomExplosion(this.level(), this,
ModDamageTypes.causeProjectileBoomDamage(this.level().registryAccess(), source, source), 150, ModDamageTypes.causeProjectileBoomDamage(this.level().registryAccess(), source, source), 125,
this.getX(), this.getY(), this.getZ(), 12.5f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1); this.getX(), this.getY(), this.getZ(), 7.5f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1);
explosion.explode(); explosion.explode();
net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosion); net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosion);
explosion.finalizeExplosion(false); explosion.finalizeExplosion(false);
ParticleTool.spawnMediumExplosionParticles(this.level(), this.position());
} }
@Override @Override
@ -479,17 +529,11 @@ public class DroneEntity extends LivingEntity implements GeoEntity {
public void registerControllers(AnimatableManager.ControllerRegistrar data) { public void registerControllers(AnimatableManager.ControllerRegistrar data) {
} }
@Override
protected void pushEntities() {
}
@Override @Override
public HumanoidArm getMainArm() { public HumanoidArm getMainArm() {
return HumanoidArm.RIGHT; return HumanoidArm.RIGHT;
} }
@Override @Override
public AnimatableInstanceCache getAnimatableInstanceCache() { public AnimatableInstanceCache getAnimatableInstanceCache() {
return this.cache; return this.cache;

View file

@ -27,6 +27,7 @@ public class ModDamageTypes {
public static final ResourceKey<DamageType> PROJECTILE_BOOM = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(ModUtils.MODID, "projectile_boom")); public static final ResourceKey<DamageType> PROJECTILE_BOOM = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(ModUtils.MODID, "projectile_boom"));
public static final ResourceKey<DamageType> CANNON_FIRE = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(ModUtils.MODID, "cannon_fire")); public static final ResourceKey<DamageType> CANNON_FIRE = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(ModUtils.MODID, "cannon_fire"));
public static final ResourceKey<DamageType> CUSTOM_EXPLOSION = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(ModUtils.MODID, "custom_explosion")); public static final ResourceKey<DamageType> CUSTOM_EXPLOSION = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(ModUtils.MODID, "custom_explosion"));
public static final ResourceKey<DamageType> DRONE_HIT = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(ModUtils.MODID, "drone_hit"));
public static DamageSource causeGunFireDamage(RegistryAccess registryAccess, @Nullable Entity directEntity, @Nullable Entity attacker) { public static DamageSource causeGunFireDamage(RegistryAccess registryAccess, @Nullable Entity directEntity, @Nullable Entity attacker) {
return new DamageMessages(registryAccess.registry(Registries.DAMAGE_TYPE).get().getHolderOrThrow(GUN_FIRE), directEntity, attacker); return new DamageMessages(registryAccess.registry(Registries.DAMAGE_TYPE).get().getHolderOrThrow(GUN_FIRE), directEntity, attacker);
@ -68,6 +69,10 @@ public class ModDamageTypes {
return new DamageMessages(registryAccess.registry(Registries.DAMAGE_TYPE).get().getHolderOrThrow(CUSTOM_EXPLOSION), directEntity, attacker); return new DamageMessages(registryAccess.registry(Registries.DAMAGE_TYPE).get().getHolderOrThrow(CUSTOM_EXPLOSION), directEntity, attacker);
} }
public static DamageSource causeDroneHitDamage(RegistryAccess registryAccess, @Nullable Entity directEntity, @Nullable Entity attacker) {
return new DamageMessages(registryAccess.registry(Registries.DAMAGE_TYPE).get().getHolderOrThrow(DRONE_HIT), directEntity, attacker);
}
private static class DamageMessages extends DamageSource { private static class DamageMessages extends DamageSource {
public DamageMessages(Holder.Reference<DamageType> typeReference) { public DamageMessages(Holder.Reference<DamageType> typeReference) {
super(typeReference); super(typeReference);

View file

@ -36,7 +36,7 @@ public class ModEntities {
EntityType.Builder.<Mle1934Entity>of(Mle1934Entity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(512).setUpdateInterval(3).setCustomClientFactory(Mle1934Entity::new).fireImmune().sized(4.5f, 2.8f)); EntityType.Builder.<Mle1934Entity>of(Mle1934Entity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(512).setUpdateInterval(3).setCustomClientFactory(Mle1934Entity::new).fireImmune().sized(4.5f, 2.8f));
public static final RegistryObject<EntityType<DroneEntity>> DRONE = register("drone", public static final RegistryObject<EntityType<DroneEntity>> DRONE = register("drone",
EntityType.Builder.<DroneEntity>of(DroneEntity::new, MobCategory.CREATURE).setShouldReceiveVelocityUpdates(true).setTrackingRange(512).setUpdateInterval(3).setCustomClientFactory(DroneEntity::new).sized(0.7f, 0.175f)); EntityType.Builder.<DroneEntity>of(DroneEntity::new, MobCategory.CREATURE).setShouldReceiveVelocityUpdates(true).setTrackingRange(512).setUpdateInterval(3).setCustomClientFactory(DroneEntity::new).sized(0.6f, 0.2f));
public static final RegistryObject<EntityType<TaserBulletProjectileEntity>> TASER_BULLET_PROJECTILE = register("projectile_taser_bullet_projectile", public static final RegistryObject<EntityType<TaserBulletProjectileEntity>> TASER_BULLET_PROJECTILE = register("projectile_taser_bullet_projectile",
EntityType.Builder.<TaserBulletProjectileEntity>of(TaserBulletProjectileEntity::new, MobCategory.MISC).setCustomClientFactory(TaserBulletProjectileEntity::new).setShouldReceiveVelocityUpdates(true).setTrackingRange(64) EntityType.Builder.<TaserBulletProjectileEntity>of(TaserBulletProjectileEntity::new, MobCategory.MISC).setCustomClientFactory(TaserBulletProjectileEntity::new).setShouldReceiveVelocityUpdates(true).setTrackingRange(64)

View file

@ -1,10 +1,10 @@
package com.atsuishio.superbwarfare.item; package com.atsuishio.superbwarfare.item;
import com.atsuishio.superbwarfare.entity.DroneEntity;
import com.atsuishio.superbwarfare.tools.EntityFindUtil; import com.atsuishio.superbwarfare.tools.EntityFindUtil;
import com.atsuishio.superbwarfare.tools.ItemNBTTool; import com.atsuishio.superbwarfare.tools.ItemNBTTool;
import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import com.atsuishio.superbwarfare.entity.DroneEntity;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.client.CameraType; import net.minecraft.client.CameraType;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;

View file

@ -314,6 +314,9 @@
"death.attack.burn": "%1$s被烧糊了", "death.attack.burn": "%1$s被烧糊了",
"death.attack.burn.entity": "%1$s被%2$s烧成了焦炭", "death.attack.burn.entity": "%1$s被%2$s烧成了焦炭",
"death.attack.burn.item": "%1$s被%2$s烧成了焦炭", "death.attack.burn.item": "%1$s被%2$s烧成了焦炭",
"death.attack.drone_hit": "%1$s被无人机叶片切碎了",
"death.attack.drone_hit.entity": "%1$s被%2$s用无人机叶片切碎了",
"death.attack.drone_hit.item": "%1$s被%2$s用无人机叶片切碎了",
"gui.superbwarfare.mortar_gui.button_set": "Confirm", "gui.superbwarfare.mortar_gui.button_set": "Confirm",

View file

@ -314,6 +314,9 @@
"death.attack.burn": "%1$s被烧糊了", "death.attack.burn": "%1$s被烧糊了",
"death.attack.burn.entity": "%1$s被%2$s烧成了焦炭", "death.attack.burn.entity": "%1$s被%2$s烧成了焦炭",
"death.attack.burn.item": "%1$s被%2$s烧成了焦炭", "death.attack.burn.item": "%1$s被%2$s烧成了焦炭",
"death.attack.drone_hit": "%1$s被无人机叶片切碎了",
"death.attack.drone_hit.entity": "%1$s被%2$s用无人机叶片切碎了",
"death.attack.drone_hit.item": "%1$s被%2$s用无人机叶片切碎了",
"gui.superbwarfare.mortar_gui.button_set": "确认", "gui.superbwarfare.mortar_gui.button_set": "确认",

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

View file

@ -0,0 +1,5 @@
{
"exhaustion": 0,
"message_id": "drone_hit",
"scaling": "never"
}