diff --git a/src/main/java/net/mcreator/target/TargetMod.java b/src/main/java/net/mcreator/target/TargetMod.java index 3f41a40d9..de7782095 100644 --- a/src/main/java/net/mcreator/target/TargetMod.java +++ b/src/main/java/net/mcreator/target/TargetMod.java @@ -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()))); diff --git a/src/main/java/net/mcreator/target/client/ClickHandler.java b/src/main/java/net/mcreator/target/client/ClickHandler.java index 30260d272..2b9536691 100644 --- a/src/main/java/net/mcreator/target/client/ClickHandler.java +++ b/src/main/java/net/mcreator/target/client/ClickHandler.java @@ -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)); diff --git a/src/main/java/net/mcreator/target/client/renderer/entity/DroneGrenadeRenderer.java b/src/main/java/net/mcreator/target/client/renderer/entity/DroneGrenadeRenderer.java new file mode 100644 index 000000000..ef4f0b881 --- /dev/null +++ b/src/main/java/net/mcreator/target/client/renderer/entity/DroneGrenadeRenderer.java @@ -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 { + private static final ResourceLocation texture = new ResourceLocation("target:textures/entity/grenade.png"); + private final ModelGrenade 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; + } +} diff --git a/src/main/java/net/mcreator/target/entity/DroneEntity.java b/src/main/java/net/mcreator/target/entity/DroneEntity.java index d59c9364c..82448caa9 100644 --- a/src/main/java/net/mcreator/target/entity/DroneEntity.java +++ b/src/main/java/net/mcreator/target/entity/DroneEntity.java @@ -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; } diff --git a/src/main/java/net/mcreator/target/entity/DroneGrenadeEntity.java b/src/main/java/net/mcreator/target/entity/DroneGrenadeEntity.java new file mode 100644 index 000000000..a22c01a06 --- /dev/null +++ b/src/main/java/net/mcreator/target/entity/DroneGrenadeEntity.java @@ -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 type, Level world) { + super(type, world); + } + + public DroneGrenadeEntity(EntityType 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 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; + } +} diff --git a/src/main/java/net/mcreator/target/init/TargetModEntities.java b/src/main/java/net/mcreator/target/init/TargetModEntities.java index 22af698df..3d397e81c 100644 --- a/src/main/java/net/mcreator/target/init/TargetModEntities.java +++ b/src/main/java/net/mcreator/target/init/TargetModEntities.java @@ -37,6 +37,8 @@ public class TargetModEntities { .setUpdateInterval(1).sized(0.5f, 0.5f)); public static final RegistryObject> GUN_GRENADE = register("projectile_gun_grenade", EntityType.Builder.of(GunGrenadeEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(1).setCustomClientFactory(GunGrenadeEntity::new).sized(0.5f, 0.5f)); + public static final RegistryObject> DRONE_GRENADE = register("projectile_drone_grenade", + EntityType.Builder.of(DroneGrenadeEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(1).setCustomClientFactory(DroneGrenadeEntity::new).sized(0.5f, 0.5f)); public static final RegistryObject> FRAG = register("projectile_frag", EntityType.Builder.of(FragEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(1).setCustomClientFactory(FragEntity::new).sized(0.5f, 0.5f)); public static final RegistryObject> TARGET = register("target", diff --git a/src/main/java/net/mcreator/target/init/TargetModEntityRenderers.java b/src/main/java/net/mcreator/target/init/TargetModEntityRenderers.java index c10fc9285..1d99190de 100644 --- a/src/main/java/net/mcreator/target/init/TargetModEntityRenderers.java +++ b/src/main/java/net/mcreator/target/init/TargetModEntityRenderers.java @@ -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); } } diff --git a/src/main/java/net/mcreator/target/init/TargetModSounds.java b/src/main/java/net/mcreator/target/init/TargetModSounds.java index da3afb6a5..7e83c3aef 100644 --- a/src/main/java/net/mcreator/target/init/TargetModSounds.java +++ b/src/main/java/net/mcreator/target/init/TargetModSounds.java @@ -191,4 +191,5 @@ public class TargetModSounds { public static final RegistryObject BULLET_SUPPLY = REGISTRY.register("bullet_supply", () -> SoundEvent.createVariableRangeEvent(new ResourceLocation("target", "bullet_supply"))); public static final RegistryObject ADJUST_FOV = REGISTRY.register("adjust_fov", () -> SoundEvent.createVariableRangeEvent(new ResourceLocation("target", "adjust_fov"))); + public static final RegistryObject DRONE_SOUND = REGISTRY.register("drone_sound", () -> SoundEvent.createVariableRangeEvent(new ResourceLocation("target", "drone_sound"))); } diff --git a/src/main/java/net/mcreator/target/item/Monitor.java b/src/main/java/net/mcreator/target/item/Monitor.java index 441915628..e2c68dd8f 100644 --- a/src/main/java/net/mcreator/target/item/Monitor.java +++ b/src/main/java/net/mcreator/target/item/Monitor.java @@ -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; } diff --git a/src/main/java/net/mcreator/target/network/message/DroneFireMessage.java b/src/main/java/net/mcreator/target/network/message/DroneFireMessage.java new file mode 100644 index 000000000..ffbcb495b --- /dev/null +++ b/src/main/java/net/mcreator/target/network/message/DroneFireMessage.java @@ -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 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); + } + } + } + } +} diff --git a/src/main/resources/assets/target/sounds.json b/src/main/resources/assets/target/sounds.json index fa0dbe8de..e1724785f 100644 --- a/src/main/resources/assets/target/sounds.json +++ b/src/main/resources/assets/target/sounds.json @@ -1574,5 +1574,13 @@ "stream": false } ] + }, + "drone_sound": { + "sounds": [ + { + "name": "target:drone_sound", + "stream": false + } + ] } } \ No newline at end of file diff --git a/src/main/resources/assets/target/sounds/drone_sound.ogg b/src/main/resources/assets/target/sounds/drone_sound.ogg new file mode 100644 index 000000000..f68b56e42 Binary files /dev/null and b/src/main/resources/assets/target/sounds/drone_sound.ogg differ