From cbcff4e15755a930fd4552410339780181268971 Mon Sep 17 00:00:00 2001 From: Byte Dice Date: Thu, 14 Nov 2024 19:46:14 +0100 Subject: [PATCH] I got too carried away --- .../bytedice/bde_particles/Bde_particles.kt | 62 ++++++++++++++++++- .../commands/GiveParticleEmitter.kt | 42 +++++++------ .../bde_particles/items/ParticleEmitter.kt | 47 -------------- .../items/ParticleEmitterTool.kt | 48 ++++++++++++++ .../bde_particles/particle/Particle.kt | 26 ++------ .../particle/ParticleEmitterParams.kt | 12 ++++ .../bde_particles/particle/ParticleParams.kt | 27 ++++++++ .../particle/particleIdRegister.kt | 16 +++++ 8 files changed, 193 insertions(+), 87 deletions(-) delete mode 100644 src/main/kotlin/com/bytedice/bde_particles/items/ParticleEmitter.kt create mode 100644 src/main/kotlin/com/bytedice/bde_particles/items/ParticleEmitterTool.kt create mode 100644 src/main/kotlin/com/bytedice/bde_particles/particle/ParticleEmitterParams.kt create mode 100644 src/main/kotlin/com/bytedice/bde_particles/particle/ParticleParams.kt create mode 100644 src/main/kotlin/com/bytedice/bde_particles/particle/particleIdRegister.kt diff --git a/src/main/kotlin/com/bytedice/bde_particles/Bde_particles.kt b/src/main/kotlin/com/bytedice/bde_particles/Bde_particles.kt index b715bf0..1fe50ec 100644 --- a/src/main/kotlin/com/bytedice/bde_particles/Bde_particles.kt +++ b/src/main/kotlin/com/bytedice/bde_particles/Bde_particles.kt @@ -1,10 +1,70 @@ package com.bytedice.bde_particles +import com.bytedice.bde_particles.commands.GiveParticleEmitter +import com.bytedice.bde_particles.items.getToolDetails +import com.bytedice.bde_particles.particle.Particle +import com.bytedice.bde_particles.particle.returnParticleFunction import net.fabricmc.api.ModInitializer +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents +import net.fabricmc.fabric.api.event.player.UseItemCallback +import net.minecraft.entity.player.PlayerEntity +import net.minecraft.item.ItemStack +import net.minecraft.server.MinecraftServer +import net.minecraft.text.Text +import net.minecraft.util.ActionResult +import net.minecraft.util.Hand +import net.minecraft.util.TypedActionResult + + +// const val ALL_PARTICLE_EMITTERS: Array<> // ParticleEmitter + +data class Config( + val cooldown: Int = 1 +) + + +val cfg = Config() + class Bde_particles : ModInitializer { override fun onInitialize() { - + ServerTickEvents.START_SERVER_TICK.register { _ -> + tick() + } + + CommandRegistrationCallback.EVENT.register { dispatcher, registryAccess, _ -> + GiveParticleEmitter.register(dispatcher, registryAccess) + } + + UseItemCallback.EVENT.register(UseItemCallback { player: PlayerEntity, _, hand: Hand -> + onRightClick(player, hand) + }) + + ServerLifecycleEvents.SERVER_STARTED.register(ServerLifecycleEvents.ServerStarted { server: MinecraftServer -> + + server.playerManager.broadcast(Text.of("BDAT - Loaded"), false) + print("BDAT - Loaded") + }) } +} + + +fun tick() { + +} + + +fun onRightClick(player: PlayerEntity, hand: Hand) : TypedActionResult { + val handItem = player.getStackInHand(hand) + val (isEmitterTool, particleId) = getToolDetails(handItem) + + if (isEmitterTool) { + val particleFunction = returnParticleFunction(particleId) + if (particleFunction != null) { /* spawn particle with params */ } + } + + return TypedActionResult(ActionResult.PASS, handItem) } \ No newline at end of file diff --git a/src/main/kotlin/com/bytedice/bde_particles/commands/GiveParticleEmitter.kt b/src/main/kotlin/com/bytedice/bde_particles/commands/GiveParticleEmitter.kt index 8c7ccec..d732666 100644 --- a/src/main/kotlin/com/bytedice/bde_particles/commands/GiveParticleEmitter.kt +++ b/src/main/kotlin/com/bytedice/bde_particles/commands/GiveParticleEmitter.kt @@ -1,12 +1,11 @@ package com.bytedice.bde_particles.commands -import com.bytedice.bde_particles.items.ParticleEmitter +import com.bytedice.bde_particles.items.makeData import com.mojang.brigadier.Command import com.mojang.brigadier.CommandDispatcher import com.mojang.brigadier.arguments.StringArgumentType import net.minecraft.command.CommandRegistryAccess import net.minecraft.command.argument.ItemStackArgumentType -import net.minecraft.item.Items import net.minecraft.server.command.CommandManager import net.minecraft.server.command.ServerCommandSource import net.minecraft.text.Style @@ -16,25 +15,32 @@ import java.awt.Color object GiveParticleEmitter { fun register(dispatcher: CommandDispatcher, registryAccess: CommandRegistryAccess) { + val command = CommandManager.literal("giveParticleEmitter") + .requires { source -> source.hasPermissionLevel(2) } + + val itemNameArg = CommandManager.argument("item name", StringArgumentType.string()) + val itemTypeArg = CommandManager.argument("item type", ItemStackArgumentType.itemStack(registryAccess)) + val particleIdArg = CommandManager.argument("particle id", StringArgumentType.string()) + dispatcher.register( - CommandManager.literal("giveParticleEmitter") - .requires { source -> source.hasPermissionLevel(2) } - .then(CommandManager.argument("item name", StringArgumentType.string())) - .then(CommandManager.argument("item type", ItemStackArgumentType.itemStack(registryAccess))) - .then(CommandManager.argument("particle id", StringArgumentType.string())) + command.then( + itemNameArg.then( + itemTypeArg.then( + particleIdArg.executes { context -> + val name = StringArgumentType.getString(context, "item name") + val item = ItemStackArgumentType.getItemStackArgument(context, "item type") + val particleId = StringArgumentType.getString(context, "particle id") - .executes { context -> - val name = StringArgumentType.getString(context, "item name") - val item = Items.AMETHYST_SHARD // ItemStackArgumentType.getItemStackArgument(context, "item type") - val particleId = StringArgumentType.getString(context, "particle id") + val feedback = Text.literal("BPS - You like fancy particles. Don't you?\nBPS - [gave particle emitter, bound to id: \"${particleId}\"]") + .setStyle(Style.EMPTY.withColor(TextColor.fromRgb(Color(0, 125, 0).rgb)).withItalic(true)) - val feedback = Text.literal("BPS - You like fancy particles. Don't you?\nBPS - [gave particle emitter, bound to id: \"${context}\"]") - .setStyle(Style.EMPTY.withColor(TextColor.fromRgb(Color(0, 125, 0).rgb)).withItalic(true)) - - context.source.player?.inventory?.insertStack(ParticleEmitter().makeData(item, name, particleId)) - context.source.sendFeedback({ feedback }, false) - Command.SINGLE_SUCCESS - } + context.source.player?.inventory?.insertStack(makeData(item.item, name, particleId)) + context.source.sendFeedback({ feedback }, false) + Command.SINGLE_SUCCESS + } + ) + ) + ) ) } } \ No newline at end of file diff --git a/src/main/kotlin/com/bytedice/bde_particles/items/ParticleEmitter.kt b/src/main/kotlin/com/bytedice/bde_particles/items/ParticleEmitter.kt deleted file mode 100644 index 48d549f..0000000 --- a/src/main/kotlin/com/bytedice/bde_particles/items/ParticleEmitter.kt +++ /dev/null @@ -1,47 +0,0 @@ -package com.bytedice.bde_particles.items - -import com.bytedice.bde_particles.math.raycastFromPlayer -import net.minecraft.component.DataComponentTypes -import net.minecraft.component.type.LoreComponent -import net.minecraft.component.type.NbtComponent -import net.minecraft.item.Item -import net.minecraft.item.ItemStack -import net.minecraft.nbt.NbtCompound -import net.minecraft.server.network.ServerPlayerEntity -import net.minecraft.text.Style -import net.minecraft.text.Text -import net.minecraft.text.TextColor -import java.awt.Color - - -class ParticleEmitter { - fun makeData(itemId: Item, name: String, particleId: String): ItemStack { - val i = ItemStack(itemId) - - val nbt = NbtCompound() - nbt.putByte("BPS_particleTool", 1) - nbt.putString("BPS_particleId", particleId) - - val component: NbtComponent = NbtComponent.of(nbt) - - val displayName = Text.literal(name) - .setStyle(Style.EMPTY.withColor(TextColor.fromRgb(Color(0, 125, 0).rgb)).withItalic(true)) - - val loreLines = Text.literal("BPS - Bound to id \"$particleId\"") - .setStyle(Style.EMPTY.withColor(TextColor.fromRgb(Color(0, 125, 0).rgb)).withItalic(true)) - - val lore = LoreComponent(listOf(loreLines)) - - i.set(DataComponentTypes.ITEM_NAME, displayName) - i.set(DataComponentTypes.CUSTOM_DATA, component) - i.set(DataComponentTypes.LORE, lore) - - return i - } - - fun onRightCLick(player: ServerPlayerEntity) { - val hitResult = raycastFromPlayer(player, 4.5) ?: return - - // spawn particle at hitResult - } -} \ No newline at end of file diff --git a/src/main/kotlin/com/bytedice/bde_particles/items/ParticleEmitterTool.kt b/src/main/kotlin/com/bytedice/bde_particles/items/ParticleEmitterTool.kt new file mode 100644 index 0000000..7cc4ef0 --- /dev/null +++ b/src/main/kotlin/com/bytedice/bde_particles/items/ParticleEmitterTool.kt @@ -0,0 +1,48 @@ +package com.bytedice.bde_particles.items + +import net.minecraft.component.DataComponentTypes +import net.minecraft.component.type.LoreComponent +import net.minecraft.component.type.NbtComponent +import net.minecraft.item.Item +import net.minecraft.item.ItemStack +import net.minecraft.nbt.NbtCompound +import net.minecraft.text.Style +import net.minecraft.text.Text +import net.minecraft.text.TextColor +import java.awt.Color + + +fun makeData(itemId: Item, name: String, particleId: String): ItemStack { + val i = ItemStack(itemId) + + val nbt = NbtCompound() + nbt.putByte("BPS_particleTool", 1) + nbt.putString("BPS_particleId", particleId) + + val component: NbtComponent = NbtComponent.of(nbt) + + val displayName = Text.literal(name) + .setStyle(Style.EMPTY.withColor(TextColor.fromRgb(Color(0, 125, 0).rgb)).withItalic(true)) + + val loreLines = Text.literal("BPS - Bound to id \"$particleId\"") + .setStyle(Style.EMPTY.withColor(TextColor.fromRgb(Color(0, 125, 0).rgb)).withItalic(true)) + + val lore = LoreComponent(listOf(loreLines)) + + i.set(DataComponentTypes.ITEM_NAME, displayName) + i.set(DataComponentTypes.CUSTOM_DATA, component) + i.set(DataComponentTypes.LORE, lore) + + return i +} + + +fun getToolDetails(item: ItemStack) : Pair { + val customData = item.get(DataComponentTypes.CUSTOM_DATA) + val isParticleEmitterTool = customData?.nbt?.getByte("BPS_particleTool") == 1.toByte() + val particleId = customData?.nbt?.getString("BPS_particleId") + + if (particleId == null) { return Pair(isParticleEmitterTool, "") } + + else { return Pair(isParticleEmitterTool, particleId) } +} \ No newline at end of file diff --git a/src/main/kotlin/com/bytedice/bde_particles/particle/Particle.kt b/src/main/kotlin/com/bytedice/bde_particles/particle/Particle.kt index cd1939c..da2da7f 100644 --- a/src/main/kotlin/com/bytedice/bde_particles/particle/Particle.kt +++ b/src/main/kotlin/com/bytedice/bde_particles/particle/Particle.kt @@ -4,28 +4,12 @@ import net.minecraft.util.math.Vec3d import org.joml.Vector3f import org.joml.Vector4f -class Particle( - // during init - count: Int = 20, - spawnDur: Int = 20, - lifetime: Int = 20, - offset: Vector3f = Vector3f(-0.5f, -0.5f, -0.5f), - rotation: Vector3f = Vector3f(0.0f, 0.0f, 0.0f), - //shape: Shape, // add later, start with single point - - // during ticking - // transformation - forceFields: Array = arrayOf(Vector4f(0.0f, 0.0f, 0.0f, 0.0f)), // x y z force - rotVel: Vector3f = Vector3f(0.0f, 0.0f, 0.0f), - sizeCurve: Array = arrayOf(Vector3f(1.0f, 1.0f, 1.0f), Vector3f(0.0f, 0.0f, 0.0f)), - // physics - gravity: Vec3d = Vec3d(0.0, -9.0, 0.0), - drag: Float = 0.2f, - minVel: Float = 0.003f, - // rendering - blockCurve: Array = arrayOf("minecraft:black_concrete", "minecraft:green_concrete") - ) { +class Particle(particleParams: ParticleParams) { fun init() { } + + fun registerEmitter(id: String, params: ParticleEmitterParams) { + addToParticleRegister(id, params) + } } \ No newline at end of file diff --git a/src/main/kotlin/com/bytedice/bde_particles/particle/ParticleEmitterParams.kt b/src/main/kotlin/com/bytedice/bde_particles/particle/ParticleEmitterParams.kt new file mode 100644 index 0000000..be31dca --- /dev/null +++ b/src/main/kotlin/com/bytedice/bde_particles/particle/ParticleEmitterParams.kt @@ -0,0 +1,12 @@ +package com.bytedice.bde_particles.particle + +class ParticleEmitterParams { + data class init ( + val maxCount: Int = 20, + val spawnDur: Int = 20, + val particleTypes: Array = emptyArray(), + val loop: Boolean = false, + val loopDelay: Int = 10, + val loopCount: Int = 2, + ) +} \ No newline at end of file diff --git a/src/main/kotlin/com/bytedice/bde_particles/particle/ParticleParams.kt b/src/main/kotlin/com/bytedice/bde_particles/particle/ParticleParams.kt new file mode 100644 index 0000000..fbfe38d --- /dev/null +++ b/src/main/kotlin/com/bytedice/bde_particles/particle/ParticleParams.kt @@ -0,0 +1,27 @@ +package com.bytedice.bde_particles.particle + +import net.minecraft.util.math.Vec3d +import org.joml.Vector3f + +data class ParticleParams ( + //val shape: Shape, // add later, start with single point + val blockCurve: Array = arrayOf("minecraft:black_concrete", "minecraft:green_concrete"), + val rotVelRandom: Pair = Pair(Vector3f(0.0f, 0.0f, 0.0f), Vector3f(360.0f, 360.0f, 360.0f)), + val rotVelCurve: Array = arrayOf(Vector3f(1.0f, 1.0f, 1.0f), Vector3f(0.0f, 0.0f, 0.0f)), + val sizeRandom: Pair = Pair(Vector3f(0.5f, 0.5f, 0.5f), Vector3f(1.0f, 1.0f, 1.0f)), + val sizeCurve: Array = arrayOf(Vector3f(1.0f, 1.0f, 1.0f), Vector3f(0.0f, 0.0f, 0.0f)), + val forceFields: ForceField = ForceField(), + val gravity: Vec3d = Vec3d(0.0, -9.0, 0.0), + val drag: Float = 0.2f, + val minVel: Float = 0.003f +) + + +data class ForceField ( + val x: Float = 0.0f, + val y: Float = 0.0f, + val z: Float = 0.0f, + val minForce: Float = 0.0f, + val maxForce: Float = 0.0f, + val radius: Float = -1.0f, +) \ No newline at end of file diff --git a/src/main/kotlin/com/bytedice/bde_particles/particle/particleIdRegister.kt b/src/main/kotlin/com/bytedice/bde_particles/particle/particleIdRegister.kt new file mode 100644 index 0000000..3ed2d2b --- /dev/null +++ b/src/main/kotlin/com/bytedice/bde_particles/particle/particleIdRegister.kt @@ -0,0 +1,16 @@ +package com.bytedice.bde_particles.particle + +val particleIdRegister: MutableMap = mutableMapOf() + +fun returnParticleFunction(id: String) : ParticleEmitterParams? { + if (particleIdRegister.containsKey(id)) { + return particleIdRegister[id] + } + + return null +} + + +fun addToParticleRegister(id: String, params: ParticleEmitterParams) { + particleIdRegister[id] = params +} \ No newline at end of file