diff --git a/build.gradle b/build.gradle index 2fdf5b1..61a081c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,7 @@ plugins { id 'fabric-loom' version '1.10-SNAPSHOT' id 'maven-publish' + id 'org.jetbrains.kotlin.jvm' } archivesBaseName = project.archives_base_name @@ -26,7 +27,8 @@ repositories { name = 'minelp-release' url = 'https://repo.minelittlepony-mod.com/maven/release' } - // Add repositories to retrieve artifacts from in here. + mavenCentral() + // Add repositories to retrieve artifacts from in here. // You should only use this when depending on other mods because // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. // See https://docs.gradle.org/current/userguide/declaring_repositories.html @@ -46,6 +48,7 @@ dependencies { include "com.minelittlepony:kirin:${project.kirin_version}" modCompileOnly("com.terraformersmc:modmenu:${project.modmenu_version}") + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" } processResources { @@ -66,8 +69,6 @@ java { // if it is present. // If you remove this line, sources will not be generated. withSourcesJar() - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 } jar { @@ -92,3 +93,6 @@ publishing { // retrieving dependencies. } } +kotlin { + jvmToolchain(21) +} diff --git a/settings.gradle b/settings.gradle index b02216b..8f57143 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,4 +7,10 @@ pluginManagement { mavenCentral() gradlePluginPortal() } + plugins { + id 'org.jetbrains.kotlin.jvm' version '2.2.0' + } +} +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' } diff --git a/src/main/java/net/lizistired/cavedust/CaveDust.java b/src/main/java/net/lizistired/cavedust/CaveDust.java index 57d26f2..5fae004 100644 --- a/src/main/java/net/lizistired/cavedust/CaveDust.java +++ b/src/main/java/net/lizistired/cavedust/CaveDust.java @@ -2,18 +2,30 @@ package net.lizistired.cavedust; //minecraft imports import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; +import net.fabricmc.fabric.api.client.particle.v1.ParticleRenderEvents; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.lizistired.cavedust.utils.CubeCreator; +import net.minecraft.block.Block; import net.minecraft.client.MinecraftClient; import net.minecraft.particle.ParticleEffect; +import net.minecraft.particle.ParticleType; +import net.minecraft.particle.ParticleUtil; import net.minecraft.registry.Registries; -import net.minecraft.registry.Registry; +import net.minecraft.server.MinecraftServer; import net.minecraft.text.Text; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.World; //other imports import com.minelittlepony.common.util.GamePaths; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.minecraft.world.event.GameEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; //java imports @@ -44,6 +56,9 @@ public class CaveDust implements ClientModInitializer { public static ParticleEffect WHITE_ASH_ID = (ParticleEffect) Registries.PARTICLE_TYPE.get(Identifier.of("cavedust", "cave_dust")); public static int PARTICLE_AMOUNT = 0; + public static int PARTICLE_RADIUS_PLUME = 50; + CubeCreator cubeCreator = new CubeCreator(); + MinecraftClient client; @@ -55,47 +70,92 @@ public class CaveDust implements ClientModInitializer { config = new CaveDustConfig(CaveDustFolder.getParent().resolve("cavedust.json"), this); config.load(); registerKeyBindings(); - ParticleFactoryRegistry.getInstance().register(CaveDustServer.CAVE_DUST, CaveDustParticleFactory.Factory::new); + ParticleFactoryRegistry.getInstance().register(CaveDustServer.CAVE_DUST_MOTE, CaveDustMoteParticleFactory.Factory::new); + ParticleFactoryRegistry.getInstance().register(CaveDustServer.CAVE_DUST_PLUME, CaveDustPlumeParticleFactory.Factory::new); //register end client tick to create cave dust function, using end client tick for async - ClientTickEvents.END_CLIENT_TICK.register(this::createCaveDust); + WorldRenderEvents.LAST.register(this::createCaveDust); + ServerLifecycleEvents.SERVER_STOPPING.register(this::nullClient); } - private void createCaveDust(MinecraftClient client) { + private void nullClient(MinecraftServer minecraftServer) { + client = null; + } + + private void createCaveDust(WorldRenderContext worldRenderContext) { + if(client == null) { + try { + client = worldRenderContext.gameRenderer().getClient(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + if (keyBinding1.wasPressed()){ getConfig().toggleCaveDust(); LOGGER.info("Toggled dust"); - client.player.sendMessage(Text.translatable("debug.cavedust.toggle." + config.getCaveDustEnabled()), false); + client.player.sendMessage(Text.translatable("debug.cavedust.toggle." + config.getCaveDustEnabled()), true); } if (keyBinding2.wasPressed()){ getConfig().load(); LOGGER.info("Reloaded config"); - client.player.sendMessage(Text.translatable("debug.cavedust.reload"), false); + client.player.sendMessage(Text.translatable("debug.cavedust.reload"), true); } //ensure world is not null if (client.world == null) return; World world = client.world; + for (int i = 0; i < 5000; i++) { + cubeCreator.randomSphereCreator(5, 0, 0, 0); + } + + } + + private void createCaveDust(MinecraftClient client) { + //LOGGER.info(String.valueOf(((ClientWorldAccessor) client.world.getLevelProperties()).getFlatWorld())); // ) double probabilityNormalized = normalize(config.getLowerLimit(), config.getUpperLimit(), client.player.getBlockY()); PARTICLE_AMOUNT = (int) (probabilityNormalized * config.getParticleMultiplier() * config.getParticleMultiplierMultiplier()); - for (int i = 0; i < PARTICLE_AMOUNT; i++) { - int x = (int) (client.player.getPos().getX() + (int) generateRandomDouble(config.getDimensionWidth() *-1, config.getDimensionWidth())); - int y = (int) (client.player.getEyePos().getY() + (int) generateRandomDouble(config.getDimensionHeight() *-1, config.getDimensionHeight())); - int z = (int) (client.player.getPos().getZ() + (int) generateRandomDouble(config.getDimensionWidth() *-1, config.getDimensionWidth())); - double miniX = (x + Math.random()); - double miniY = (y + Math.random()); - double miniZ = (z + Math.random()); - BlockPos particlePos = new BlockPos(x, y, z); + //for (int i = 0; i < PARTICLE_AMOUNT; i++) { + // int x = (int) (client.player.getPos().getX() + (int) generateRandomDouble(config.getDimensionWidth() *-1, config.getDimensionWidth())); + // int y = (int) (client.player.getEyePos().getY() + (int) generateRandomDouble(config.getDimensionHeight() *-1, config.getDimensionHeight())); + // int z = (int) (client.player.getPos().getZ() + (int) generateRandomDouble(config.getDimensionWidth() *-1, config.getDimensionWidth())); + // double miniX = (x + Math.random()); + // double miniY = (y + Math.random()); + // double miniZ = (z + Math.random()); + // BlockPos particlePos = new BlockPos(x, y, z); +// + // if (shouldParticlesSpawn(client, config, particlePos)) { + // if (client.world.getBlockState(particlePos).isAir()) { + // world.addParticleClient((ParticleEffect) Registries.PARTICLE_TYPE.get(Identifier.of("cavedust", "cave_dust_mote")), miniX, miniY, miniZ, config.getVelocityRandomnessRandom() * 0.01, config.getVelocityRandomnessRandom() * 0.01, config.getVelocityRandomnessRandom() * 0.01); + // } + // } + // } - if (shouldParticlesSpawn(client, config, particlePos)) { - if (client.world.getBlockState(particlePos).isAir()) { - world.addParticleClient(getConfig().getParticle(), miniX, miniY, miniZ, config.getVelocityRandomnessRandom() * 0.01, config.getVelocityRandomnessRandom() * 0.01, config.getVelocityRandomnessRandom() * 0.01); - } - } - } + //cubeCreator.cubeCreator(50, 0, 0, 0); + for (int i = 0; i < 5000; i++) { + cubeCreator.randomSphereCreator(5, 0, 0, 0); + } + + + //Vec3d playerPos = client.player.getEyePos(); + //int x = (int) (playerPos.getX() + (int) generateRandomDouble(generateRandomDouble(-50, -25), (generateRandomDouble(25, 50)))); + ////int y = (int) (playerPos.getY() + (int) generateRandomDouble(PARTICLE_RADIUS_PLUME *-1, PARTICLE_RADIUS_PLUME)); + //int z = (int) (playerPos.getZ() + (int) generateRandomDouble(PARTICLE_RADIUS_PLUME *-1, PARTICLE_RADIUS_PLUME)); + //BlockPos particlePos = new BlockPos(x, (int) playerPos.y, z); +// +// + //if (shouldParticlesSpawn(client, config, particlePos)) { +// + // if (playerPos.distanceTo(particlePos.toCenterPos()) >= 45 && playerPos.distanceTo(particlePos.toCenterPos()) <= 55) { + // if (client.world.getBlockState(particlePos).isAir()) { + // world.addParticleClient((ParticleEffect) Registries.PARTICLE_TYPE.get(Identifier.of("cavedust", "cave_dust_mote")), x, playerPos.y, z, 0, 0, 0); + // } + // } + //} +//} } } diff --git a/src/main/java/net/lizistired/cavedust/CaveDustConfig.java b/src/main/java/net/lizistired/cavedust/CaveDustConfig.java index ecb487a..2de64a1 100644 --- a/src/main/java/net/lizistired/cavedust/CaveDustConfig.java +++ b/src/main/java/net/lizistired/cavedust/CaveDustConfig.java @@ -40,7 +40,7 @@ public class CaveDustConfig extends JsonFile { List list = List.of(Registries.PARTICLE_TYPE.getIds().toArray(new Identifier[0])); - Identifier newId = Identifier.of("cavedust", "cave_dust"); + Identifier newId = Identifier.of("cavedust", "cave_dust_mote"); public CaveDustConfig(Path file, net.lizistired.cavedust.CaveDust caveDust) { super(file); diff --git a/src/main/java/net/lizistired/cavedust/CaveDustParticleFactory.java b/src/main/java/net/lizistired/cavedust/CaveDustMoteParticleFactory.java similarity index 83% rename from src/main/java/net/lizistired/cavedust/CaveDustParticleFactory.java rename to src/main/java/net/lizistired/cavedust/CaveDustMoteParticleFactory.java index 50e7a4e..021973e 100644 --- a/src/main/java/net/lizistired/cavedust/CaveDustParticleFactory.java +++ b/src/main/java/net/lizistired/cavedust/CaveDustMoteParticleFactory.java @@ -6,9 +6,9 @@ import net.minecraft.client.particle.*; import net.minecraft.client.world.ClientWorld; import net.minecraft.particle.SimpleParticleType; -public class CaveDustParticleFactory extends SpriteBillboardParticle { +public class CaveDustMoteParticleFactory extends SpriteBillboardParticle { private final SpriteProvider spriteProvider; - CaveDustParticleFactory(ClientWorld clientWorld, double x, double y, double z, double velocityX, double velocityY, double velocityZ, SpriteProvider spriteProvider) { + CaveDustMoteParticleFactory(ClientWorld clientWorld, double x, double y, double z, double velocityX, double velocityY, double velocityZ, SpriteProvider spriteProvider) { super(clientWorld, x, y, z); this.spriteProvider = spriteProvider; //Sets the sprite provider from above to the sprite provider in the constructor method this.maxAge = 200; //20 ticks = 1 second @@ -48,7 +48,7 @@ public class CaveDustParticleFactory extends SpriteBillboardParticle { public Particle createParticle(SimpleParticleType type, ClientWorld world, double x, double y, double z, double velocityX, double velocityY, double velocityZ) { - return new CaveDustParticleFactory(world, x, y, z, velocityX, velocityY, velocityZ, this.spriteProvider); + return new CaveDustMoteParticleFactory(world, x, y, z, velocityX, velocityY, velocityZ, this.spriteProvider); } } } diff --git a/src/main/java/net/lizistired/cavedust/CaveDustPlumeParticleFactory.java b/src/main/java/net/lizistired/cavedust/CaveDustPlumeParticleFactory.java new file mode 100644 index 0000000..37f03b3 --- /dev/null +++ b/src/main/java/net/lizistired/cavedust/CaveDustPlumeParticleFactory.java @@ -0,0 +1,65 @@ +package net.lizistired.cavedust; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.lizistired.cavedust.utils.MathHelper; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.particle.*; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.particle.SimpleParticleType; +import net.minecraft.util.math.Vec3d; + +public class CaveDustPlumeParticleFactory extends SpriteBillboardParticle { + private final SpriteProvider spriteProvider; + CaveDustPlumeParticleFactory(ClientWorld clientWorld, double x, double y, double z, double velocityX, double velocityY, double velocityZ, SpriteProvider spriteProvider) { + super(clientWorld, x, y, z); + this.spriteProvider = spriteProvider; //Sets the sprite provider from above to the sprite provider in the constructor method + this.maxAge = 60; //20 ticks = 1 second + this.scale = 10f; + this.velocityX = velocityX; //The velX from the constructor parameters + this.velocityY = -0.007f; //Allows the particle to slowly fall + this.velocityZ = velocityZ; + this.x = x; //The x from the constructor parameters + this.y = y; + this.z = z; + this.collidesWithWorld = false; + this.alpha = 0.5f; //Setting the alpha to 1.0f means there will be no opacity change until the alpha value is changed + this.setSprite(spriteProvider); //Required + } + + @Override + public void tick() { + super.tick(); + ClientPlayerEntity player = MinecraftClient.getInstance().player; + Vec3d particlePos = new Vec3d(this.x, this.y, this.z); + double distanceFromParticleToPlayer = particlePos.distanceTo(player.getEyePos()); + this.alpha = net.minecraft.util.math.MathHelper.clamp((float) MathHelper.normalize(0, 50, distanceFromParticleToPlayer) * -1, -1, 1); + if(this.alpha < 0.001f){ + this.markDead(); + } + this.alpha -= 0.00005f; + } + + + @Override + public ParticleTextureSheet getType() { + return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + } + + @Environment(EnvType.CLIENT) + public static class Factory implements ParticleFactory { + private final SpriteProvider spriteProvider; + + public Factory(SpriteProvider spriteProvider) { + this.spriteProvider = spriteProvider; + } + + + + + public Particle createParticle(SimpleParticleType type, ClientWorld world, double x, double y, double z, double velocityX, double velocityY, double velocityZ) { + return new CaveDustPlumeParticleFactory(world, x, y, z, velocityX, velocityY, velocityZ, this.spriteProvider); + } + } +} diff --git a/src/main/java/net/lizistired/cavedust/CaveDustServer.java b/src/main/java/net/lizistired/cavedust/CaveDustServer.java index 29aa4d5..8fb8018 100644 --- a/src/main/java/net/lizistired/cavedust/CaveDustServer.java +++ b/src/main/java/net/lizistired/cavedust/CaveDustServer.java @@ -8,12 +8,14 @@ import net.minecraft.registry.Registry; import net.minecraft.util.Identifier; public class CaveDustServer implements ModInitializer { - public static final SimpleParticleType CAVE_DUST = FabricParticleTypes.simple(); + public static final SimpleParticleType CAVE_DUST_MOTE = FabricParticleTypes.simple(); + public static final SimpleParticleType CAVE_DUST_PLUME = FabricParticleTypes.simple(); /** * Runs the mod initializer. */ @Override public void onInitialize() { - Registry.register(Registries.PARTICLE_TYPE, Identifier.of("cavedust", "cave_dust"), CAVE_DUST); + Registry.register(Registries.PARTICLE_TYPE, Identifier.of("cavedust", "cave_dust_mote"), CAVE_DUST_MOTE); + Registry.register(Registries.PARTICLE_TYPE, Identifier.of("cavedust", "cave_dust_plume"), CAVE_DUST_PLUME); } } diff --git a/src/main/java/net/lizistired/cavedust/ModMenuConfigScreen.java b/src/main/java/net/lizistired/cavedust/ModMenuConfigScreen.java index 6f0fec5..432604d 100644 --- a/src/main/java/net/lizistired/cavedust/ModMenuConfigScreen.java +++ b/src/main/java/net/lizistired/cavedust/ModMenuConfigScreen.java @@ -35,66 +35,10 @@ public class ModMenuConfigScreen extends GameGui { .setText("menu.cavedust.global." + config.getCaveDustEnabled()) .setTooltip(Text.translatable("menu.cavedust.global.tooltip." + config.getCaveDustEnabled())); - /*addButton(new Button(left, row += 24).onClick(sender -> { - sender.getStyle().setText("menu.cavedust.enhanceddetection." + config.setEnhancedDetection()).setTooltip(Text.translatable("menu.cavedust.enhanceddetection.tooltip")); - })).getStyle() - .setText("menu.cavedust.enhanceddetection." + config.getEnhancedDetection()) - .setTooltip(Text.translatable("menu.cavedust.enhanceddetection.tooltip"));*/ - - addButton(new Button(left, row += 24).onClick(sender -> { - sender.getStyle().setText("menu.cavedust.superflatstatus." + config.setSuperFlatStatus()).setTooltip(Text.translatable("menu.cavedust.superflatstatus.tooltip")); - })).getStyle() - .setText("menu.cavedust.superflatstatus." + config.getSuperFlatStatus()) - .setTooltip(Text.translatable("menu.cavedust.superflatstatus.tooltip")); - - - - /*addButton(new Slider(left, row += 48, -64, 319, config.getUpperLimit())) - .onChange(config::setUpperLimit) - .setTextFormat(transText::formatUpperLimit) - .getStyle().setTooltip(Text.translatable("menu.cavedust.upperlimit.tooltip")); - - addButton(new Slider(left, row += 24, -64, 319, config.getLowerLimit())) - .onChange(config::setLowerLimit) - .setTextFormat(transText::formatLowerLimit) - .getStyle().setTooltip(Text.translatable("menu.cavedust.lowerlimit.tooltip"));*/ - - addButton(new Slider(left, row += 24, 1, 100, config.getParticleMultiplier())) - .onChange(config::setParticleMultiplier) - .setTextFormat(transText::formatParticleMultiplier) - .getStyle().setTooltip(Text.translatable("menu.cavedust.particlemultiplier.tooltip")); - - addButton(new Slider(left, row += 24, 1, 100, config.getParticleMultiplierMultiplier())) - .onChange(config::setParticleMultiplierMultiplier) - .setTextFormat(transText::formatParticleMultiplierMultiplier) - .getStyle().setTooltip(Text.translatable("menu.cavedust.particlemultipliermultiplier.tooltip")); - addButton(new Button(left, row += 24).onClick(sender ->{ - config.iterateParticle(); - sender.getStyle().setText("Particle: " + (getNameOfParticle())); - })).getStyle().setText("Particle: " + (getNameOfParticle())) - .setTooltip(Text.translatable("menu.cavedust.particle.tooltip")); - - addButton(new Slider(left += 220, row -= 96, 1, 50, config.getDimensionWidth())) - .onChange(config::setDimensionWidth) - .setTextFormat(transText::formatMaxWidth) - .getStyle().setTooltip(Text.translatable("menu.cavedust.width.tooltip")); - - addButton(new Slider(left, row += 24, 1, 50, config.getDimensionHeight())) - .onChange(config::setDimensionHeight) - .setTextFormat(transText::formatMaxHeight) - .getStyle().setTooltip(Text.translatable("menu.cavedust.height.tooltip")); - - addButton(new Slider(left, row += 24, 0, 10, config.getVelocityRandomness())) - .onChange(config::setVelocityRandomness) - .setTextFormat(transText::formatVelocityRandomness) - .getStyle().setTooltip(Text.translatable("menu.cavedust.velocityrandomness.tooltip")); - - - addButton(new Button(left -= 110, row += 120).onClick(sender -> { - config.resetConfig(); - finish(); - client.setScreen(new ModMenuConfigScreen(parent)); - })).getStyle().setText(Text.translatable("menu.cavedust.reset")).setTooltip(Text.translatable("menu.cavedust.reset.tooltip")); + addButton(new Button(left, row += 120) + .onClick(sender -> + client.setScreen(new ModMenuConfigScreenAdvanced(parent) + ))); addButton(new Button(left, row += 24) .onClick(sender -> finish())).getStyle() diff --git a/src/main/java/net/lizistired/cavedust/ModMenuConfigScreenAdvanced.java b/src/main/java/net/lizistired/cavedust/ModMenuConfigScreenAdvanced.java new file mode 100644 index 0000000..e9067ec --- /dev/null +++ b/src/main/java/net/lizistired/cavedust/ModMenuConfigScreenAdvanced.java @@ -0,0 +1,119 @@ +package net.lizistired.cavedust; + +import com.minelittlepony.common.client.gui.GameGui; +import com.minelittlepony.common.client.gui.element.Button; +import com.minelittlepony.common.client.gui.element.Label; +import com.minelittlepony.common.client.gui.element.Slider; +import net.lizistired.cavedust.utils.TranslatableTextHelper; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.particle.ParticleType; +import net.minecraft.registry.Registries; +import net.minecraft.text.Text; +import org.jetbrains.annotations.Nullable; + +import java.util.NoSuchElementException; + +public class ModMenuConfigScreenAdvanced extends GameGui { + public ModMenuConfigScreenAdvanced(@Nullable Screen parent) { + super(Text.translatable("menu.cavedust.title.advanced"), parent); + } + + @Override + public void init() { + int left = width / 2 - 100; + int row = height / 4 + 14; + + CaveDustConfig config = CaveDust.getInstance().getConfig(); + TranslatableTextHelper transText = new TranslatableTextHelper();; + config.load(); + + addButton(new Label(width / 2, 30)).setCentered().getStyle() + .setText(getTitle()); + + + /*addButton(new Button(left, row += 24).onClick(sender -> { + sender.getStyle().setText("menu.cavedust.enhanceddetection." + config.setEnhancedDetection()).setTooltip(Text.translatable("menu.cavedust.enhanceddetection.tooltip")); + })).getStyle() + .setText("menu.cavedust.enhanceddetection." + config.getEnhancedDetection()) + .setTooltip(Text.translatable("menu.cavedust.enhanceddetection.tooltip"));*/ + + addButton(new Button(left, row += 24).onClick(sender -> { + sender.getStyle().setText("menu.cavedust.superflatstatus." + config.setSuperFlatStatus()).setTooltip(Text.translatable("menu.cavedust.superflatstatus.tooltip")); + })).getStyle() + .setText("menu.cavedust.superflatstatus." + config.getSuperFlatStatus()) + .setTooltip(Text.translatable("menu.cavedust.superflatstatus.tooltip")); + + + + /*addButton(new Slider(left, row += 48, -64, 319, config.getUpperLimit())) + .onChange(config::setUpperLimit) + .setTextFormat(transText::formatUpperLimit) + .getStyle().setTooltip(Text.translatable("menu.cavedust.upperlimit.tooltip")); + + addButton(new Slider(left, row += 24, -64, 319, config.getLowerLimit())) + .onChange(config::setLowerLimit) + .setTextFormat(transText::formatLowerLimit) + .getStyle().setTooltip(Text.translatable("menu.cavedust.lowerlimit.tooltip"));*/ + + addButton(new Slider(left, row += 24, 1, 100, config.getParticleMultiplier())) + .onChange(config::setParticleMultiplier) + .setTextFormat(transText::formatParticleMultiplier) + .getStyle().setTooltip(Text.translatable("menu.cavedust.particlemultiplier.tooltip")); + + addButton(new Slider(left, row += 24, 1, 100, config.getParticleMultiplierMultiplier())) + .onChange(config::setParticleMultiplierMultiplier) + .setTextFormat(transText::formatParticleMultiplierMultiplier) + .getStyle().setTooltip(Text.translatable("menu.cavedust.particlemultipliermultiplier.tooltip")); + addButton(new Button(left, row += 24).onClick(sender ->{ + config.iterateParticle(); + sender.getStyle().setText("Particle: " + (getNameOfParticle())); + })).getStyle().setText("Particle: " + (getNameOfParticle())) + .setTooltip(Text.translatable("menu.cavedust.particle.tooltip")); + + addButton(new Slider(left += 220, row -= 96, 1, 50, config.getDimensionWidth())) + .onChange(config::setDimensionWidth) + .setTextFormat(transText::formatMaxWidth) + .getStyle().setTooltip(Text.translatable("menu.cavedust.width.tooltip")); + + addButton(new Slider(left, row += 24, 1, 50, config.getDimensionHeight())) + .onChange(config::setDimensionHeight) + .setTextFormat(transText::formatMaxHeight) + .getStyle().setTooltip(Text.translatable("menu.cavedust.height.tooltip")); + + addButton(new Slider(left, row += 24, 0, 10, config.getVelocityRandomness())) + .onChange(config::setVelocityRandomness) + .setTextFormat(transText::formatVelocityRandomness) + .getStyle().setTooltip(Text.translatable("menu.cavedust.velocityrandomness.tooltip")); + + + addButton(new Button(left -= 110, row += 120).onClick(sender -> { + config.resetConfig(); + finish(); + client.setScreen(new ModMenuConfigScreenAdvanced(parent)); + })).getStyle().setText(Text.translatable("menu.cavedust.reset")).setTooltip(Text.translatable("menu.cavedust.reset.tooltip")); + + addButton(new Button(left, row += 24) + .onClick(sender -> finish())).getStyle() + .setText("gui.done"); + + } + + + @Override + public void render(DrawContext context, int mouseX, int mouseY, float partialTicks) { + renderBackground(context, mouseX, mouseY, partialTicks); + super.render(context, mouseX, mouseY, partialTicks); + } + + private String getNameOfParticle(){ + CaveDustConfig config = CaveDust.getInstance().getConfig(); + config.load(); + try { + return Registries.PARTICLE_TYPE.getEntry((ParticleType) config.getParticleID()).getIdAsString(); + } catch (NoSuchElementException e){ + CaveDust.LOGGER.error(String.valueOf(e)); + return "null"; + } + } +} diff --git a/src/main/java/net/lizistired/cavedust/utils/CubeCreator.java b/src/main/java/net/lizistired/cavedust/utils/CubeCreator.java new file mode 100644 index 0000000..8cef2f9 --- /dev/null +++ b/src/main/java/net/lizistired/cavedust/utils/CubeCreator.java @@ -0,0 +1,91 @@ +package net.lizistired.cavedust.utils; + +import com.jcraft.jorbis.Block; +import net.minecraft.client.MinecraftClient; +import net.minecraft.particle.ParticleEffect; +import net.minecraft.registry.Registries; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class CubeCreator { + + + // 3 nesting for loops to create a hollow border cube around the player + public void cubeCreator(int steps, int offsetXInitial, int offsetYInitial, int offsetZInitial) { + BlockPos playerPos = MinecraftClient.getInstance().player.getBlockPos(); + + // Loop over the range of steps around the player + for (int x = -steps / 2 + offsetXInitial; x < steps / 2 + offsetXInitial; x++) { + for (int y = -steps / 2 + offsetYInitial; y < steps / 2 + offsetYInitial; y++) { + for (int z = -steps / 2 + offsetZInitial; z < steps / 2 + offsetZInitial; z++) { + + // Check if the particle is on the border of the cube + boolean onBorder = x == -steps / 2 + offsetXInitial || x == steps / 2 + offsetXInitial - 1 + || y == -steps / 2 + offsetYInitial || y == steps / 2 + offsetYInitial - 1 + || z == -steps / 2 + offsetZInitial || z == steps / 2 + offsetZInitial - 1; + + // If it's on the border, spawn the particle + if (onBorder) { + spawnParticleClient(playerPos.getX() + x, playerPos.getY() + y, playerPos.getZ() + z); + } + } + } + } + } + + // Create a hollow sphere around the player + public void sphereCreator(int radius, int offsetXInitial, int offsetYInitial, int offsetZInitial) { + BlockPos playerPos = MinecraftClient.getInstance().player.getBlockPos(); + + // Loop over the range of steps around the player (we are using a cube bounding box to check) + for (int x = -radius; x <= radius; x++) { + for (int y = -radius; y <= radius; y++) { + for (int z = -radius; z <= radius; z++) { + + // Calculate the distance from the center (player position) + double distance = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2)); + + // If the distance is close to the radius, spawn the particle (create the border) + if (Math.abs(distance - radius) < 1.5) { // Threshold for thickness of the border + spawnParticleClient(playerPos.getX() + x + offsetXInitial, + playerPos.getY() + y + offsetYInitial, + playerPos.getZ() + z + offsetZInitial); + } + } + } + } + } + + public void randomSphereCreator(int radius, int offsetXInitial, int offsetYInitial, int offsetZInitial) { + Random random = new Random(); // Random number generator + + // Generate random spherical angles + double theta = Math.acos(2 * random.nextDouble() - 1); // Random polar angle (0 to pi) + double phi = 2 * Math.PI * random.nextDouble(); // Random azimuthal angle (0 to 2*pi) + + // Convert spherical coordinates to Cartesian coordinates + double x = radius * Math.sin(theta) * Math.cos(phi); + double y = radius * Math.sin(theta) * Math.sin(phi); + double z = radius * Math.cos(theta); + + // Offset the generated point to be around the player + BlockPos playerPos = MinecraftClient.getInstance().player.getBlockPos(); + int spawnX = playerPos.getX() + (int) (x + offsetXInitial); + int spawnY = playerPos.getY() + (int) (y + offsetYInitial); + int spawnZ = playerPos.getZ() + (int) (z + offsetZInitial); + + // Spawn a particle at the random position + float randomX = random.nextFloat() + spawnX; + float randomY = random.nextFloat() + spawnY; + float randomZ = random.nextFloat() + spawnZ; + spawnParticleClient(randomX, randomY, randomZ); + } + + private void spawnParticleClient(float x, float y, float z) { + MinecraftClient.getInstance().world.addParticleClient((ParticleEffect) Registries.PARTICLE_TYPE.get(Identifier.of("cavedust", "cave_dust_mote")), x, y, z, 0.0D, 0.0D, 0.0D); + } +} diff --git a/src/main/resources/assets/cavedust/lang/en_us.json b/src/main/resources/assets/cavedust/lang/en_us.json index 5bb13ce..ed4cf17 100644 --- a/src/main/resources/assets/cavedust/lang/en_us.json +++ b/src/main/resources/assets/cavedust/lang/en_us.json @@ -1,5 +1,6 @@ { "menu.cavedust.title": "Cave Dust", + "menu.cavedust.title.advanced": "Cave Dust Advanced Options", "menu.cavedust.global.false": "Cave Dust: Disabled", "menu.cavedust.global.true": "Cave Dust: Enabled", "menu.cavedust.global.tooltip.false": "Enable cave dust particles?", @@ -38,4 +39,5 @@ "debug.cavedust.reload": "(Cave Dust) Reloaded config", "debug.cavedust.particleerror": "(Cave Dust) Error setting particle, skipping to next particle!" + } \ No newline at end of file diff --git a/src/main/resources/assets/cavedust/particles/cave_dust.json b/src/main/resources/assets/cavedust/particles/cave_dust_mote.json similarity index 100% rename from src/main/resources/assets/cavedust/particles/cave_dust.json rename to src/main/resources/assets/cavedust/particles/cave_dust_mote.json diff --git a/src/main/resources/assets/cavedust/particles/cave_dust_plume.json b/src/main/resources/assets/cavedust/particles/cave_dust_plume.json new file mode 100644 index 0000000..a99bffe --- /dev/null +++ b/src/main/resources/assets/cavedust/particles/cave_dust_plume.json @@ -0,0 +1,16 @@ +{ + "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", + "minecraft:big_smoke_7", + "minecraft:big_smoke_8", + "minecraft:big_smoke_9", + "minecraft:big_smoke_10", + "minecraft:big_smoke_11" + ] +} \ No newline at end of file