添加无人机的投弹功能

This commit is contained in:
Atsuihsio 2024-07-24 21:54:25 +08:00
parent d4dbd87637
commit 59de873d91
12 changed files with 303 additions and 11 deletions

View file

@ -105,12 +105,14 @@ public class TargetMod {
addNetworkMessage(AdjustZoomFovMessage.class, AdjustZoomFovMessage::encode, AdjustZoomFovMessage::decode, AdjustZoomFovMessage::handler);
addNetworkMessage(AdjustMortarAngleMessage.class, AdjustMortarAngleMessage::encode, AdjustMortarAngleMessage::decode, AdjustMortarAngleMessage::handler);
addNetworkMessage(InteractMessage.class, InteractMessage::encode, InteractMessage::decode, InteractMessage::handler);
addNetworkMessage(DroneMoveLeftMessage.class, DroneMoveLeftMessage::encode, DroneMoveLeftMessage::decode, DroneMoveLeftMessage::handler);
addNetworkMessage(DroneMoveRightMessage.class, DroneMoveRightMessage::encode, DroneMoveRightMessage::decode, DroneMoveRightMessage::handler);
addNetworkMessage(DroneMoveForwardMessage.class, DroneMoveForwardMessage::encode, DroneMoveForwardMessage::decode, DroneMoveForwardMessage::handler);
addNetworkMessage(DroneMoveBackwardMessage.class, DroneMoveBackwardMessage::encode, DroneMoveBackwardMessage::decode, DroneMoveBackwardMessage::handler);
addNetworkMessage(DroneMoveUpMessage.class, DroneMoveUpMessage::encode, DroneMoveUpMessage::decode, DroneMoveUpMessage::handler);
addNetworkMessage(DroneMoveDownMessage.class, DroneMoveDownMessage::encode, DroneMoveDownMessage::decode, DroneMoveDownMessage::handler);
addNetworkMessage(DroneFireMessage.class, DroneFireMessage::buffer, DroneFireMessage::new, DroneFireMessage::handler);
event.enqueueWork(() -> BrewingRecipeRegistry.addRecipe(Ingredient.of(PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER)),
Ingredient.of(Items.LIGHTNING_ROD), PotionUtils.setPotion(new ItemStack(Items.POTION), TargetModPotion.SHOCK.get())));

View file

@ -5,6 +5,7 @@ import net.mcreator.target.TargetMod;
import net.mcreator.target.client.gui.RangeHelper;
import net.mcreator.target.entity.Mk42Entity;
import net.mcreator.target.entity.MortarEntity;
import net.mcreator.target.init.TargetModItems;
import net.mcreator.target.init.TargetModKeyMappings;
import net.mcreator.target.init.TargetModMobEffects;
import net.mcreator.target.init.TargetModTags;
@ -62,6 +63,7 @@ public class ClickHandler {
Player player = Minecraft.getInstance().player;
if (player == null) return;
ItemStack stack = player.getMainHandItem();
int button = event.getButton();
@ -70,6 +72,10 @@ public class ClickHandler {
event.setCanceled(true);
return;
}
if (stack.is(TargetModItems.MONITOR.get())) {
event.setCanceled(true);
TargetMod.PACKET_HANDLER.sendToServer(new DroneFireMessage(0));
}
if (player.getVehicle() != null && player.getVehicle() instanceof Mk42Entity) {
event.setCanceled(true);
TargetMod.PACKET_HANDLER.sendToServer(new VehicleFireMessage(0));

View file

@ -0,0 +1,40 @@
package net.mcreator.target.client.renderer.entity;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.math.Axis;
import net.mcreator.target.client.model.entity.ModelGrenade;
import net.mcreator.target.entity.DroneGrenadeEntity;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
public class DroneGrenadeRenderer extends EntityRenderer<DroneGrenadeEntity> {
private static final ResourceLocation texture = new ResourceLocation("target:textures/entity/grenade.png");
private final ModelGrenade<DroneGrenadeEntity> model;
public DroneGrenadeRenderer(EntityRendererProvider.Context context) {
super(context);
model = new ModelGrenade<>(context.bakeLayer(ModelGrenade.LAYER_LOCATION));
}
@Override
public void render(DroneGrenadeEntity entityIn, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int packedLightIn) {
VertexConsumer vb = bufferIn.getBuffer(RenderType.entityCutout(this.getTextureLocation(entityIn)));
poseStack.pushPose();
poseStack.mulPose(Axis.YP.rotationDegrees(Mth.lerp(partialTicks, entityIn.yRotO, entityIn.getYRot()) - 90));
poseStack.mulPose(Axis.ZP.rotationDegrees(90 + Mth.lerp(partialTicks, entityIn.xRotO, entityIn.getXRot())));
model.renderToBuffer(poseStack, vb, packedLightIn, OverlayTexture.NO_OVERLAY, 1, 1, 1, 0.0625f);
poseStack.popPose();
super.render(entityIn, entityYaw, partialTicks, poseStack, bufferIn, packedLightIn);
}
@Override
public ResourceLocation getTextureLocation(DroneGrenadeEntity entity) {
return texture;
}
}

View file

@ -1,8 +1,13 @@
package net.mcreator.target.entity;
import net.mcreator.target.init.TargetModItems;
import net.mcreator.target.init.*;
import net.mcreator.target.item.common.ammo.CannonShellItem;
import net.mcreator.target.tools.SoundTool;
import net.minecraft.ChatFormatting;
import net.minecraft.commands.CommandSource;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
@ -14,6 +19,7 @@ import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.*;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.enchantment.EnchantmentHelper;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.registries.ForgeRegistries;
@ -44,7 +50,6 @@ import net.minecraft.network.protocol.Packet;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.core.BlockPos;
import net.mcreator.target.init.TargetModEntities;
import net.mcreator.target.item.Monitor;
import java.util.Objects;
@ -57,6 +62,7 @@ public class DroneEntity extends PathfinderMob implements GeoEntity {
private float moveX = 0;
private float moveY = 0;
private float moveZ = 0;
private boolean move = false;
public String animationprocedure = "empty";
@ -184,17 +190,59 @@ public class DroneEntity extends PathfinderMob implements GeoEntity {
}
}
LivingEntity control = this.level().getEntitiesOfClass(Player.class, this.getBoundingBox().inflate(512))
.stream().filter(e -> e.getStringUUID().equals(this.entityData.get(CONTROLLER))).findFirst().orElse(null);
if (this.getPersistentData().getBoolean("left")
|| this.getPersistentData().getBoolean("right")
|| this.getPersistentData().getBoolean("forward")
|| this.getPersistentData().getBoolean("backward")
|| this.getPersistentData().getBoolean("up")
|| this.getPersistentData().getBoolean("down")) {
move = true;
} else {
move = false;
}
if (move || !this.onGround()) {
this.level().playSound(null, this.getOnPos(), TargetModSounds.DRONE_SOUND.get(), SoundSource.AMBIENT, 3, 1);
if (control != null) {
ItemStack stack = control.getMainHandItem();
if (stack.getOrCreateTag().getBoolean("Using") && control instanceof ServerPlayer serverPlayer) {
SoundTool.playLocalSound(serverPlayer, TargetModSounds.DRONE_SOUND.get(), 100, 1);
}
}
}
Vec3 vec = this.getDeltaMovement();
double x = vec.x;
double y = vec.y;
double z = vec.z;
if (this.getDeltaMovement().horizontalDistanceSqr() < 1) {
if (move) {
this.setDeltaMovement(vec.multiply(1.04, 1, 1.04));
}
}
this.setDeltaMovement(Mth.clamp(1.06 * x ,-0.95,0.95), y, Mth.clamp(1.06 * z,-0.95,0.95));
if (this.getPersistentData().getBoolean("firing")) {
if (control instanceof Player player) {
DroneDrop(player);
}
this.getPersistentData().putBoolean("firing",false);
}
this.refreshDimensions();
}
private void DroneDrop(Player player) {
Level level = player.level();
if (!level.isClientSide()) {
DroneGrenadeEntity droneGrenadeEntity = new DroneGrenadeEntity(player, level);
droneGrenadeEntity.setPos(this.getX(), this.getY(), this.getZ());
droneGrenadeEntity.shoot(0, -1, 0, 0,0.5f);
level.addFreshEntity(droneGrenadeEntity);
}
}
@Override
public InteractionResult mobInteract(Player player, InteractionHand hand) {
super.mobInteract(player, hand);
@ -254,18 +302,24 @@ public class DroneEntity extends PathfinderMob implements GeoEntity {
if (control != null) {
ItemStack stack = control.getMainHandItem();
if (stack.getOrCreateTag().getBoolean("Using")) {
this.setYRot(control.getYRot());
this.setYRot(control.getYRot() + 180);
this.yRotO = this.getYRot();
this.setXRot(Mth.clamp(control.getXRot(),-25,95));
this.setRot(this.getYRot(), this.getXRot());
this.yBodyRot = control.getYRot();
this.yHeadRot = control.getYRot();
this.yBodyRot = control.getYRot() + 180;
this.yHeadRot = control.getYRot() + 180;
this.setMaxUpStep(1.0F);
this.setSpeed(4 * (float)this.getAttributeValue(Attributes.MOVEMENT_SPEED));
float forward = -moveZ;
float upDown = -moveY;
float strafe = -moveX;
super.travel(new Vec3(strafe, upDown, forward));
super.travel(new Vec3(2 * strafe, 2 * upDown, 2 * forward));
Vec3 vec3 = this.getDeltaMovement();
if (!move) {
this.setDeltaMovement(vec3.multiply(0.9, 0.8, 0.9));
} else {
this.setDeltaMovement(vec3.multiply(1.05, 0.99, 1.05));
}
return;
}

View file

@ -0,0 +1,117 @@
package net.mcreator.target.entity;
import net.mcreator.target.TargetMod;
import net.mcreator.target.init.TargetModDamageTypes;
import net.mcreator.target.init.TargetModEntities;
import net.mcreator.target.init.TargetModItems;
import net.mcreator.target.init.TargetModSounds;
import net.mcreator.target.network.message.ClientIndicatorMessage;
import net.mcreator.target.tools.CustomExplosion;
import net.mcreator.target.tools.ParticleTool;
import net.minecraft.core.particles.ParticleTypes;
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.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.Explosion;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.EntityHitResult;
import net.minecraftforge.network.NetworkHooks;
import net.minecraftforge.network.PacketDistributor;
import net.minecraftforge.network.PlayMessages;
public class DroneGrenadeEntity extends ThrowableItemProjectile {
public DroneGrenadeEntity(EntityType<? extends DroneGrenadeEntity> type, Level world) {
super(type, world);
}
public DroneGrenadeEntity(EntityType<? extends DroneGrenadeEntity> type, LivingEntity entity, Level world) {
super(type, entity, world);
}
public DroneGrenadeEntity(LivingEntity entity, Level level) {
super(TargetModEntities.DRONE_GRENADE.get(), entity, level);
}
public DroneGrenadeEntity(PlayMessages.SpawnEntity spawnEntity, Level level) {
this(TargetModEntities.DRONE_GRENADE.get(), level);
}
@Override
public Packet<ClientGamePacketListener> getAddEntityPacket() {
return NetworkHooks.getEntitySpawningPacket(this);
}
@Override
protected Item getDefaultItem() {
return TargetModItems.GRENADE_40MM.get();
}
@Override
protected void onHitEntity(EntityHitResult result) {
Entity entity = result.getEntity();
if (this.getOwner() instanceof LivingEntity living) {
if (!living.level().isClientSide() && living instanceof ServerPlayer player) {
living.level().playSound(null, living.blockPosition(), TargetModSounds.INDICATION.get(), SoundSource.VOICE, 1, 1);
TargetMod.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> player), new ClientIndicatorMessage(0, 5));
}
}
if (entity instanceof LivingEntity) {
entity.invulnerableTime = 0;
}
entity.hurt(TargetModDamageTypes.causeGunFireHeadshotDamage(this.level().registryAccess(), this, this.getOwner()), 50);
if (this.level() instanceof ServerLevel) {
causeExplode();
this.discard();
}
this.discard();
}
@Override
public void onHitBlock(BlockHitResult blockHitResult) {
super.onHitBlock(blockHitResult);
if (this.level() instanceof ServerLevel) {
causeExplode();
}
this.discard();
}
@Override
public void tick() {
super.tick();
if (!this.level().isClientSide() && this.level() instanceof ServerLevel serverLevel) {
ParticleTool.sendParticle(serverLevel, ParticleTypes.SMOKE, this.getX(), this.getY(), this.getZ(),
1, 0, 0, 0, 0.01, true);
}
if (this.tickCount > 200 || this.isInWater()) {
if (this.level() instanceof ServerLevel) {
causeExplode();
}
this.discard();
}
}
private void causeExplode() {
CustomExplosion explosion = new CustomExplosion(this.level(), this,
TargetModDamageTypes.causeProjectileBoomDamage(this.level().registryAccess(), this, this.getOwner()), 90,
this.getX(), this.getY(), this.getZ(), 7.5f, Explosion.BlockInteraction.KEEP).setDamageMultiplier(1);
explosion.explode();
net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosion);
explosion.finalizeExplosion(false);
ParticleTool.spawnMediumExplosionParticles(this.level(), this.position());
}
@Override
protected float getGravity() {
return 0.08F;
}
}

View file

@ -37,6 +37,8 @@ public class TargetModEntities {
.setUpdateInterval(1).sized(0.5f, 0.5f));
public static final RegistryObject<EntityType<GunGrenadeEntity>> GUN_GRENADE = register("projectile_gun_grenade",
EntityType.Builder.<GunGrenadeEntity>of(GunGrenadeEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(1).setCustomClientFactory(GunGrenadeEntity::new).sized(0.5f, 0.5f));
public static final RegistryObject<EntityType<DroneGrenadeEntity>> DRONE_GRENADE = register("projectile_drone_grenade",
EntityType.Builder.<DroneGrenadeEntity>of(DroneGrenadeEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(1).setCustomClientFactory(DroneGrenadeEntity::new).sized(0.5f, 0.5f));
public static final RegistryObject<EntityType<FragEntity>> FRAG = register("projectile_frag",
EntityType.Builder.<FragEntity>of(FragEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(1).setCustomClientFactory(FragEntity::new).sized(0.5f, 0.5f));
public static final RegistryObject<EntityType<TargetEntity>> TARGET = register("target",

View file

@ -25,6 +25,6 @@ public class TargetModEntityRenderers {
event.registerEntityRenderer(TargetModEntities.FRAG.get(), FragRenderer::new);
event.registerEntityRenderer(TargetModEntities.MK_42.get(), Mk42Renderer::new);
event.registerEntityRenderer(TargetModEntities.DRONE.get(), DroneRenderer::new);
event.registerEntityRenderer(TargetModEntities.DRONE_GRENADE.get(), DroneGrenadeRenderer::new);
}
}

View file

@ -191,4 +191,5 @@ public class TargetModSounds {
public static final RegistryObject<SoundEvent> BULLET_SUPPLY = REGISTRY.register("bullet_supply", () -> SoundEvent.createVariableRangeEvent(new ResourceLocation("target", "bullet_supply")));
public static final RegistryObject<SoundEvent> ADJUST_FOV = REGISTRY.register("adjust_fov", () -> SoundEvent.createVariableRangeEvent(new ResourceLocation("target", "adjust_fov")));
public static final RegistryObject<SoundEvent> DRONE_SOUND = REGISTRY.register("drone_sound", () -> SoundEvent.createVariableRangeEvent(new ResourceLocation("target", "drone_sound")));
}

View file

@ -48,6 +48,16 @@ public class Monitor extends Item {
mc.options.setCameraType(CameraType.FIRST_PERSON);
}
DroneEntity drone = player.level().getEntitiesOfClass(DroneEntity.class, player.getBoundingBox().inflate(512))
.stream().filter(e -> e.getStringUUID().equals(stack.getOrCreateTag().getString("LinkedDrone"))).findFirst().orElse(null);
if (drone != null) {
drone.getPersistentData().putBoolean("left",false);
drone.getPersistentData().putBoolean("right",false);
drone.getPersistentData().putBoolean("forward",false);
drone.getPersistentData().putBoolean("backward",false);
drone.getPersistentData().putBoolean("up",false);
drone.getPersistentData().putBoolean("down",false);
}
return ar;
}

View file

@ -0,0 +1,52 @@
package net.mcreator.target.network.message;
import net.mcreator.target.entity.DroneEntity;
import net.mcreator.target.entity.Mk42Entity;
import net.mcreator.target.init.TargetModItems;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraftforge.network.NetworkEvent;
import java.util.function.Supplier;
public class DroneFireMessage {
private final int type;
public DroneFireMessage(int type) {
this.type = type;
}
public DroneFireMessage(FriendlyByteBuf buffer) {
this.type = buffer.readInt();
}
public static void buffer(DroneFireMessage message, FriendlyByteBuf buffer) {
buffer.writeInt(message.type);
}
public static void handler(DroneFireMessage message, Supplier<NetworkEvent.Context> contextSupplier) {
NetworkEvent.Context context = contextSupplier.get();
context.enqueueWork(() -> {
if (context.getSender() != null) {
pressAction(context.getSender(), message.type);
}
});
context.setPacketHandled(true);
}
public static void pressAction(Player player, int type) {
ItemStack stack = player.getMainHandItem();
if (stack.is(TargetModItems.MONITOR.get()) && stack.getOrCreateTag().getBoolean("Using") && stack.getOrCreateTag().getBoolean("Linked")) {
DroneEntity drone = player.level().getEntitiesOfClass(DroneEntity.class, player.getBoundingBox().inflate(512))
.stream().filter(e -> e.getStringUUID().equals(stack.getOrCreateTag().getString("LinkedDrone"))).findFirst().orElse(null);
if (drone != null) {
if (type == 0) {
drone.getPersistentData().putBoolean("firing",true);
}
}
}
}
}

View file

@ -1574,5 +1574,13 @@
"stream": false
}
]
},
"drone_sound": {
"sounds": [
{
"name": "target:drone_sound",
"stream": false
}
]
}
}