diff --git a/projects/pswg_gadgets/src/client/java/dev/pswg/GadgetsClient.java b/projects/pswg_gadgets/src/client/java/dev/pswg/GadgetsClient.java index 35a4e9096..a36c1ea99 100644 --- a/projects/pswg_gadgets/src/client/java/dev/pswg/GadgetsClient.java +++ b/projects/pswg_gadgets/src/client/java/dev/pswg/GadgetsClient.java @@ -1,10 +1,7 @@ package dev.pswg; import dev.pswg.api.GalaxiesClientAddon; -import dev.pswg.particles.FragmentationGrenadeSparkParticle; -import dev.pswg.particles.ExplosionSmokeParticle; -import dev.pswg.particles.FragmentationGrenadeWaveParticle; -import dev.pswg.particles.SmokeParticle; +import dev.pswg.particles.*; import dev.pswg.renderer.FragmentationGrenadeEntityRenderer; import dev.pswg.renderer.ThermalDetonatorEntityRenderer; import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; @@ -28,6 +25,7 @@ public void onGalaxiesClientReady() ParticleFactoryRegistry.getInstance().register(Gadgets.FRAGMENTATION_GRENADE_SPARK_PARTICLE, FragmentationGrenadeSparkParticle.Factory::new); ParticleFactoryRegistry.getInstance().register(Gadgets.FRAGMENTATION_GRENADE_WAVE_PARTICLE, FragmentationGrenadeWaveParticle.Factory::new); ParticleFactoryRegistry.getInstance().register(Gadgets.SMOKE_PARTICLE, SmokeParticle.Factory::new); + ParticleFactoryRegistry.getInstance().register(Gadgets.NEURAL_GAS_PARTICLE, NeuralGasParticle.Factory::new); Gadgets.LOGGER.info("Client module initialized"); } diff --git a/projects/pswg_gadgets/src/client/java/dev/pswg/PswgGadgetsRenderLayers.java b/projects/pswg_gadgets/src/client/java/dev/pswg/PswgGadgetsRenderLayers.java new file mode 100644 index 000000000..00ea61dd6 --- /dev/null +++ b/projects/pswg_gadgets/src/client/java/dev/pswg/PswgGadgetsRenderLayers.java @@ -0,0 +1,34 @@ +package dev.pswg; + +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.RenderPhase; +import net.minecraft.client.render.VertexFormat; +import net.minecraft.client.render.VertexFormats; +import net.minecraft.util.Identifier; +import net.minecraft.util.TriState; +import net.minecraft.util.Util; + +import java.util.function.BiFunction; + +import static net.minecraft.client.render.RenderPhase.*; + +public class PswgGadgetsRenderLayers +{ + private static final BiFunction PSWG_PARTICLE = Util + .memoize((texture, affectsOutline) -> { + RenderLayer.MultiPhaseParameters multiPhaseParameters = RenderLayer.MultiPhaseParameters.builder() + .program(RenderLayer.PARTICLE) + .texture(new RenderPhase.Texture(texture, TriState.FALSE, false)) + .transparency(RenderLayer.TRANSLUCENT_TRANSPARENCY).cull(DISABLE_CULLING) + .lightmap(RenderLayer.ENABLE_LIGHTMAP).overlay(ENABLE_OVERLAY_COLOR).layering(VIEW_OFFSET_Z_LAYERING) + .writeMaskState(RenderLayer.ALL_MASK).build(true); + return RenderLayer.of("pswg_particle", + VertexFormats.POSITION_TEXTURE_COLOR_LIGHT, VertexFormat.DrawMode.QUADS, 1536, + false, true, multiPhaseParameters); + }); + + public static RenderLayer pswgParticle(Identifier texture, boolean affectsOutline) + { + return PSWG_PARTICLE.apply(texture, affectsOutline); + } +} diff --git a/projects/pswg_gadgets/src/client/java/dev/pswg/datagen/GadgetsDataGenerator.java b/projects/pswg_gadgets/src/client/java/dev/pswg/datagen/GadgetsDataGenerator.java index e9792441a..4acbca81c 100644 --- a/projects/pswg_gadgets/src/client/java/dev/pswg/datagen/GadgetsDataGenerator.java +++ b/projects/pswg_gadgets/src/client/java/dev/pswg/datagen/GadgetsDataGenerator.java @@ -134,7 +134,8 @@ protected void configure(RegistryWrapper.WrapperLookup wrapperLookup) .add(Blocks.RED_MUSHROOM) .add(Blocks.DEAD_BUSH) .add(Blocks.SHORT_GRASS) - .add(Blocks.TALL_GRASS); + .add(Blocks.TALL_GRASS) + .add(Blocks.SNOW); getOrCreateTagBuilder(Gadgets.DETONATES_GRENADE) .add(Blocks.REDSTONE_BLOCK) diff --git a/projects/pswg_gadgets/src/client/java/dev/pswg/particles/NeuralGasParticle.java b/projects/pswg_gadgets/src/client/java/dev/pswg/particles/NeuralGasParticle.java new file mode 100644 index 000000000..db55e8c48 --- /dev/null +++ b/projects/pswg_gadgets/src/client/java/dev/pswg/particles/NeuralGasParticle.java @@ -0,0 +1,90 @@ +package dev.pswg.particles; + +import dev.pswg.PswgGadgetsRenderLayers; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.particle.*; +import net.minecraft.client.render.*; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.particle.SimpleParticleType; +import org.jetbrains.annotations.Nullable; + +@Environment(value = EnvType.CLIENT) +public class NeuralGasParticle extends SpriteBillboardParticle +{ + private final int variant; + final int NUM_VARIANTS = 7; + + protected NeuralGasParticle(ClientWorld clientWorld, double x, double y, double z, double vX, double vY, double vZ, SpriteProvider spriteProvider) + { + super(clientWorld, x, y, z); + scale(16f); + + setBoundingBoxSpacing(0.25f, 0.25f); + this.setAlpha(0.95f); + variant = random.nextInt(NUM_VARIANTS); + velocityX = random.nextFloat() / 10f * (random.nextBoolean() ? 1 : -1); + velocityZ = random.nextFloat() / 10f * (random.nextBoolean() ? 1 : -1); + this.setColor(1, 0.8f, 1); + } + + @Override + public void render(VertexConsumer vertexConsumer, Camera camera, float tickDelta) + { + var texture = this.sprite.getAtlasId(); + var mc = MinecraftClient.getInstance(); + var v = mc.getBufferBuilders().getEffectVertexConsumers().getBuffer(PswgGadgetsRenderLayers.pswgParticle(texture, true)); + super.render(v, camera, tickDelta); + } + + @Override + public void tick() + { + + prevPosX = x; + prevPosY = y; + prevPosZ = z; + age++; + if (alpha <= 0.0f) + { + markDead(); + return; + } + if (age >= 100) + { + alpha -= 0.001f; + } + if (alpha <= 0.25f) + velocityY += 1 / 2000f; + velocityX *= 0.95; + velocityZ *= 0.95; + move(velocityX, velocityY, velocityZ); + } + + @Override + public ParticleTextureSheet getType() + { + return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + } + + @Environment(value = EnvType.CLIENT) + public static class Factory implements ParticleFactory + { + private final SpriteProvider spriteProvider; + + public Factory(SpriteProvider spriteProvider) + { + this.spriteProvider = spriteProvider; + } + + @Nullable + @Override + public Particle createParticle(SimpleParticleType parameters, ClientWorld world, double x, double y, double z, double velocityX, double velocityY, double velocityZ) + { + NeuralGasParticle neuralGasParticle = new NeuralGasParticle(world, x, y, z, velocityX, velocityY, velocityZ, spriteProvider); + neuralGasParticle.setSprite(spriteProvider); + return neuralGasParticle; + } + } +} diff --git a/projects/pswg_gadgets/src/client/java/dev/pswg/particles/SmokeParticle.java b/projects/pswg_gadgets/src/client/java/dev/pswg/particles/SmokeParticle.java index c415fbba2..448b6bfca 100644 --- a/projects/pswg_gadgets/src/client/java/dev/pswg/particles/SmokeParticle.java +++ b/projects/pswg_gadgets/src/client/java/dev/pswg/particles/SmokeParticle.java @@ -21,6 +21,7 @@ protected SmokeParticle(ClientWorld clientWorld, double x, double y, double z, d setBoundingBoxSpacing(0.25f, 0.25f); this.setAlpha(0.95f); variant = random.nextInt(NUM_VARIANTS); + this.setColor(0.975f, 0.975f, 1); } @Override @@ -47,7 +48,6 @@ public void tick() velocityY += 0.00005; } move(velocityX, velocityY, velocityZ); - setColor(1, 0.8f, 1); } @Override @@ -70,9 +70,9 @@ public Factory(SpriteProvider spriteProvider) @Override public Particle createParticle(SimpleParticleType parameters, ClientWorld world, double x, double y, double z, double velocityX, double velocityY, double velocityZ) { - SmokeParticle explosionSmokeParticle = new SmokeParticle(world, x, y, z, velocityX, velocityY, velocityZ, spriteProvider); - explosionSmokeParticle.setSprite(spriteProvider); - return explosionSmokeParticle; + SmokeParticle smokeParticle = new SmokeParticle(world, x, y, z, velocityX, velocityY, velocityZ, spriteProvider); + smokeParticle.setSprite(spriteProvider); + return smokeParticle; } } } diff --git a/projects/pswg_gadgets/src/main/java/dev/pswg/Gadgets.java b/projects/pswg_gadgets/src/main/java/dev/pswg/Gadgets.java index 53b31bc35..305bc61ee 100644 --- a/projects/pswg_gadgets/src/main/java/dev/pswg/Gadgets.java +++ b/projects/pswg_gadgets/src/main/java/dev/pswg/Gadgets.java @@ -94,6 +94,7 @@ public static Identifier id(String path) public static final SimpleParticleType FRAGMENTATION_GRENADE_SPARK_PARTICLE = Registry.register(Registries.PARTICLE_TYPE, id("fragmentation_grenade_spark"), FabricParticleTypes.simple()); public static final SimpleParticleType FRAGMENTATION_GRENADE_WAVE_PARTICLE = Registry.register(Registries.PARTICLE_TYPE, id("fragmentation_grenade_wave"), FabricParticleTypes.simple()); public static final SimpleParticleType SMOKE_PARTICLE = Registry.register(Registries.PARTICLE_TYPE, id("smoke"), FabricParticleTypes.simple()); + public static final SimpleParticleType NEURAL_GAS_PARTICLE = Registry.register(Registries.PARTICLE_TYPE, id("neural_gas"), FabricParticleTypes.simple()); public static final SoundEvent ARM = registerSound(id("shared.arm")); public static final SoundEvent DISARM = registerSound(id("shared.disarm")); diff --git a/projects/pswg_gadgets/src/main/java/dev/pswg/entity/NeuralGasEntity.java b/projects/pswg_gadgets/src/main/java/dev/pswg/entity/NeuralGasEntity.java new file mode 100644 index 000000000..1b01e462e --- /dev/null +++ b/projects/pswg_gadgets/src/main/java/dev/pswg/entity/NeuralGasEntity.java @@ -0,0 +1,48 @@ +package dev.pswg.entity; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.data.DataTracker; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.World; + +public class NeuralGasEntity extends Entity +{ + + public NeuralGasEntity(EntityType type, World world) + { + super(type, world); + } + + @Override + protected void initDataTracker(DataTracker.Builder builder) + { + + } + + @Override + public boolean damage(ServerWorld world, DamageSource source, float amount) + { + return false; + } + + @Override + protected void readCustomDataFromNbt(NbtCompound nbt) + { + + } + + @Override + protected void writeCustomDataToNbt(NbtCompound nbt) + { + + } + + @Override + public void tick() + { + super.tick(); + } +} diff --git a/projects/pswg_gadgets/src/main/java/dev/pswg/entity/NeuralGasGrenadeEntity.java b/projects/pswg_gadgets/src/main/java/dev/pswg/entity/NeuralGasGrenadeEntity.java new file mode 100644 index 000000000..9414d9eef --- /dev/null +++ b/projects/pswg_gadgets/src/main/java/dev/pswg/entity/NeuralGasGrenadeEntity.java @@ -0,0 +1,26 @@ +package dev.pswg.entity; + +import dev.pswg.item.GrenadeItem; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.projectile.thrown.ThrownEntity; +import net.minecraft.world.World; + +public class NeuralGasGrenadeEntity extends GrenadeEntity +{ + public NeuralGasGrenadeEntity(EntityType entityType, World world) + { + super(entityType, world); + } + + @Override + public GrenadeItem getItem() + { + return null; + } + + @Override + public void explode() + { + super.explode(); + } +} diff --git a/projects/pswg_gadgets/src/main/resources/assets/pswg_gadgets/particles/neural_gas.json b/projects/pswg_gadgets/src/main/resources/assets/pswg_gadgets/particles/neural_gas.json new file mode 100644 index 000000000..78ba28aaf --- /dev/null +++ b/projects/pswg_gadgets/src/main/resources/assets/pswg_gadgets/particles/neural_gas.json @@ -0,0 +1,11 @@ +{ + "textures": [ + "minecraft:big_smoke_0", + "minecraft:big_smoke_1", + "minecraft:big_smoke_2", + "minecraft:big_smoke_3", + "minecraft:big_smoke_4", + "minecraft:big_smoke_5", + "minecraft:big_smoke_6" + ] +} \ No newline at end of file