diff --git a/README.md b/README.md index bd627c7f..404deeb5 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ repositories { } dependencies { - include(modImplementation("net.casual-championships:arcade:0.3.1-alpha.45+1.21.3")!!) + include(modImplementation("net.casual-championships:arcade:0.3.1-alpha.47+1.21.4")!!) } ``` diff --git a/arcade-datagen/src/main/kotlin/net/casual/arcade/datagen/utils/SpacingUtils.kt b/arcade-datagen/src/main/kotlin/net/casual/arcade/datagen/utils/SpacingUtils.kt index b9cc43d0..fa2bce70 100644 --- a/arcade-datagen/src/main/kotlin/net/casual/arcade/datagen/utils/SpacingUtils.kt +++ b/arcade-datagen/src/main/kotlin/net/casual/arcade/datagen/utils/SpacingUtils.kt @@ -2,7 +2,6 @@ package net.casual.arcade.datagen.utils import net.casual.arcade.resources.font.spacing.SpacingFontResources import net.casual.arcade.resources.lang.LanguageEntry -import net.casual.arcade.utils.ComponentUtils import net.casual.arcade.utils.ComponentUtils.getTranslationKeyOf import net.minecraft.client.gui.Font import net.minecraft.network.chat.Component diff --git a/arcade-dimensions/src/main/java/net/casual/arcade/dimensions/mixins/level/CommonPlayerSpawnInfoMixin.java b/arcade-dimensions/src/main/java/net/casual/arcade/dimensions/mixins/level/CommonPlayerSpawnInfoMixin.java index 26295ecd..836036aa 100644 --- a/arcade-dimensions/src/main/java/net/casual/arcade/dimensions/mixins/level/CommonPlayerSpawnInfoMixin.java +++ b/arcade-dimensions/src/main/java/net/casual/arcade/dimensions/mixins/level/CommonPlayerSpawnInfoMixin.java @@ -9,9 +9,7 @@ import net.minecraft.network.protocol.game.CommonPlayerSpawnInfo; import net.minecraft.world.level.dimension.BuiltinDimensionTypes; import net.minecraft.world.level.dimension.DimensionType; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @Mixin(CommonPlayerSpawnInfo.class) diff --git a/arcade-dimensions/src/main/java/net/casual/arcade/dimensions/mixins/level/ServerLevelMixin.java b/arcade-dimensions/src/main/java/net/casual/arcade/dimensions/mixins/level/ServerLevelMixin.java index c4a5f202..1d0fb254 100644 --- a/arcade-dimensions/src/main/java/net/casual/arcade/dimensions/mixins/level/ServerLevelMixin.java +++ b/arcade-dimensions/src/main/java/net/casual/arcade/dimensions/mixins/level/ServerLevelMixin.java @@ -11,7 +11,6 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.players.PlayerList; -import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.world.level.Level; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.levelgen.WorldOptions; @@ -23,8 +22,6 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -import java.util.function.Supplier; - @Mixin(ServerLevel.class) public abstract class ServerLevelMixin extends Level { @Shadow @Final private ServerLevelData serverLevelData; diff --git a/arcade-dimensions/src/main/java/net/casual/arcade/dimensions/mixins/vanilla/ServerLevelMixin.java b/arcade-dimensions/src/main/java/net/casual/arcade/dimensions/mixins/vanilla/ServerLevelMixin.java index b544f0a9..49af7025 100644 --- a/arcade-dimensions/src/main/java/net/casual/arcade/dimensions/mixins/vanilla/ServerLevelMixin.java +++ b/arcade-dimensions/src/main/java/net/casual/arcade/dimensions/mixins/vanilla/ServerLevelMixin.java @@ -10,7 +10,6 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.world.level.Level; import net.minecraft.world.level.dimension.BuiltinDimensionTypes; import net.minecraft.world.level.dimension.DimensionType; @@ -23,8 +22,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.function.Supplier; - @Mixin(ServerLevel.class) public abstract class ServerLevelMixin extends Level { @Shadow @Nullable private EndDragonFight dragonFight; diff --git a/arcade-dimensions/src/main/kotlin/net/casual/arcade/dimensions/utils/impl/VoidChunkGenerator.kt b/arcade-dimensions/src/main/kotlin/net/casual/arcade/dimensions/utils/impl/VoidChunkGenerator.kt index 82aa0925..4ecf37ea 100644 --- a/arcade-dimensions/src/main/kotlin/net/casual/arcade/dimensions/utils/impl/VoidChunkGenerator.kt +++ b/arcade-dimensions/src/main/kotlin/net/casual/arcade/dimensions/utils/impl/VoidChunkGenerator.kt @@ -11,15 +11,11 @@ import net.minecraft.server.level.ServerLevel import net.minecraft.server.level.WorldGenRegion import net.minecraft.util.random.WeightedRandomList import net.minecraft.world.entity.MobCategory -import net.minecraft.world.level.LevelHeightAccessor -import net.minecraft.world.level.NoiseColumn -import net.minecraft.world.level.StructureManager -import net.minecraft.world.level.WorldGenLevel +import net.minecraft.world.level.* import net.minecraft.world.level.biome.* import net.minecraft.world.level.chunk.ChunkAccess import net.minecraft.world.level.chunk.ChunkGenerator import net.minecraft.world.level.chunk.ChunkGeneratorStructureState -import net.minecraft.world.level.levelgen.GenerationStep import net.minecraft.world.level.levelgen.Heightmap import net.minecraft.world.level.levelgen.RandomState import net.minecraft.world.level.levelgen.blending.Blender @@ -90,8 +86,8 @@ public class VoidChunkGenerator(biome: BiomeSource): ChunkGenerator(biome) { return WeightedRandomList.create() } - override fun createStructures(registryAccess: RegistryAccess, structureState: ChunkGeneratorStructureState, structureManager: StructureManager, chunk: ChunkAccess, structureTemplateManager: StructureTemplateManager) { - + override fun createStructures(registryAccess: RegistryAccess, structureState: ChunkGeneratorStructureState, structureManager: StructureManager, chunk: ChunkAccess, structureTemplateManager: StructureTemplateManager, dimension: ResourceKey) { + super.createStructures(registryAccess, structureState, structureManager, chunk, structureTemplateManager, dimension) } override fun createReferences(level: WorldGenLevel, structureManager: StructureManager, chunk: ChunkAccess) { diff --git a/arcade-events/src/main/java/net/casual/arcade/events/mixins/BaseCommandBlockMixin.java b/arcade-events/src/main/java/net/casual/arcade/events/mixins/BaseCommandBlockMixin.java new file mode 100644 index 00000000..c110d7c2 --- /dev/null +++ b/arcade-events/src/main/java/net/casual/arcade/events/mixins/BaseCommandBlockMixin.java @@ -0,0 +1,31 @@ +package net.casual.arcade.events.mixins; + +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import net.casual.arcade.events.GlobalEventHandler; +import net.casual.arcade.events.block.CommandBlockExecuteEvent; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.world.level.BaseCommandBlock; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(BaseCommandBlock.class) +public class BaseCommandBlockMixin { + @WrapWithCondition( + method = "performCommand", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/commands/Commands;performPrefixedCommand(Lnet/minecraft/commands/CommandSourceStack;Ljava/lang/String;)V" + ) + ) + private boolean onPerformCommand(Commands instance, CommandSourceStack source, String command) { + CommandBlockExecuteEvent event = new CommandBlockExecuteEvent( + source.getLevel(), + (BaseCommandBlock) (Object) this, + source, + command + ); + GlobalEventHandler.broadcast(event); + return !event.isCancelled(); + } +} diff --git a/arcade-events/src/main/java/net/casual/arcade/events/mixins/FlowingFluidMixin.java b/arcade-events/src/main/java/net/casual/arcade/events/mixins/FlowingFluidMixin.java index 80aefe90..a8933ee7 100644 --- a/arcade-events/src/main/java/net/casual/arcade/events/mixins/FlowingFluidMixin.java +++ b/arcade-events/src/main/java/net/casual/arcade/events/mixins/FlowingFluidMixin.java @@ -9,7 +9,6 @@ import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FlowingFluid; -import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.FluidState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/arcade-events/src/main/java/net/casual/arcade/events/mixins/PlayerMixin.java b/arcade-events/src/main/java/net/casual/arcade/events/mixins/PlayerMixin.java index b9f70214..a3aec7f0 100644 --- a/arcade-events/src/main/java/net/casual/arcade/events/mixins/PlayerMixin.java +++ b/arcade-events/src/main/java/net/casual/arcade/events/mixins/PlayerMixin.java @@ -22,7 +22,6 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; diff --git a/arcade-events/src/main/java/net/casual/arcade/events/mixins/RegistryDataLoaderMixin.java b/arcade-events/src/main/java/net/casual/arcade/events/mixins/RegistryDataLoaderMixin.java index a6d611d9..fef3afcf 100644 --- a/arcade-events/src/main/java/net/casual/arcade/events/mixins/RegistryDataLoaderMixin.java +++ b/arcade-events/src/main/java/net/casual/arcade/events/mixins/RegistryDataLoaderMixin.java @@ -1,23 +1,15 @@ package net.casual.arcade.events.mixins; import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.serialization.Decoder; import net.casual.arcade.events.GlobalEventHandler; import net.casual.arcade.events.registry.RegistryEventHandler; import net.casual.arcade.events.registry.RegistryLoadedFromResourcesEvent; -import net.minecraft.core.RegistryAccess; import net.minecraft.core.WritableRegistry; import net.minecraft.resources.RegistryDataLoader; -import net.minecraft.resources.RegistryOps; -import net.minecraft.resources.ResourceKey; -import net.minecraft.server.packs.resources.ResourceManager; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.Map; @Mixin(RegistryDataLoader.class) public class RegistryDataLoaderMixin { diff --git a/arcade-events/src/main/java/net/casual/arcade/events/mixins/ServerCommonPacketListenerImplMixin.java b/arcade-events/src/main/java/net/casual/arcade/events/mixins/ServerCommonPacketListenerImplMixin.java index efe13247..9965fef7 100644 --- a/arcade-events/src/main/java/net/casual/arcade/events/mixins/ServerCommonPacketListenerImplMixin.java +++ b/arcade-events/src/main/java/net/casual/arcade/events/mixins/ServerCommonPacketListenerImplMixin.java @@ -3,7 +3,6 @@ import com.llamalad7.mixinextras.sugar.Cancellable; import com.mojang.authlib.GameProfile; import net.casual.arcade.events.GlobalEventHandler; -import net.casual.arcade.events.core.CancellableEvent; import net.casual.arcade.events.network.ClientboundPacketEvent; import net.casual.arcade.events.network.PlayerDisconnectEvent; import net.casual.arcade.events.player.PlayerClientboundPacketEvent; diff --git a/arcade-events/src/main/java/net/casual/arcade/events/mixins/ServerPlayerMixin.java b/arcade-events/src/main/java/net/casual/arcade/events/mixins/ServerPlayerMixin.java index 7d73ea05..e0ac3f93 100644 --- a/arcade-events/src/main/java/net/casual/arcade/events/mixins/ServerPlayerMixin.java +++ b/arcade-events/src/main/java/net/casual/arcade/events/mixins/ServerPlayerMixin.java @@ -72,14 +72,14 @@ private void onChangeDimension( } @Inject( - method = "doCheckFallDamage", + method = "checkFallDamage", at = @At( value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;checkFallDamage(DZLnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;)V" ) ) - private void onFall(double movementX, double movementY, double movementZ, boolean onGround, CallbackInfo ci) { - PlayerFallEvent event = new PlayerFallEvent((ServerPlayer) (Object) this, movementY, onGround); + private void onFall(double y, boolean onGround, BlockState state, BlockPos pos, CallbackInfo ci) { + PlayerFallEvent event = new PlayerFallEvent((ServerPlayer) (Object) this, y, onGround); GlobalEventHandler.broadcast(event); } diff --git a/arcade-events/src/main/kotlin/net/casual/arcade/events/GlobalEventHandler.kt b/arcade-events/src/main/kotlin/net/casual/arcade/events/GlobalEventHandler.kt index c5af9546..f0098713 100644 --- a/arcade-events/src/main/kotlin/net/casual/arcade/events/GlobalEventHandler.kt +++ b/arcade-events/src/main/kotlin/net/casual/arcade/events/GlobalEventHandler.kt @@ -238,12 +238,6 @@ public object GlobalEventHandler { this.recursion = true } - internal fun suppressNextEvent(type: Class) { - if (!this.suppressed.add(type)) { - this.logger.warn("Adding suppressed event (type: {}) twice", type) - } - } - private fun checkRecursive(type: Class): Boolean { val count = this.stack.getInt(type) if (count >= MAX_RECURSIONS) { diff --git a/arcade-events/src/main/kotlin/net/casual/arcade/events/block/CommandBlockExecuteEvent.kt b/arcade-events/src/main/kotlin/net/casual/arcade/events/block/CommandBlockExecuteEvent.kt new file mode 100644 index 00000000..7720034d --- /dev/null +++ b/arcade-events/src/main/kotlin/net/casual/arcade/events/block/CommandBlockExecuteEvent.kt @@ -0,0 +1,18 @@ +package net.casual.arcade.events.block + +import net.casual.arcade.events.core.CancellableEvent +import net.casual.arcade.events.level.LocatedLevelEvent +import net.minecraft.commands.CommandSourceStack +import net.minecraft.core.BlockPos +import net.minecraft.server.level.ServerLevel +import net.minecraft.world.level.BaseCommandBlock + +public data class CommandBlockExecuteEvent( + override val level: ServerLevel, + val commandBlock: BaseCommandBlock, + val source: CommandSourceStack, + val command: String +): CancellableEvent.Default(), LocatedLevelEvent { + override val pos: BlockPos + get() = BlockPos.containing(this.commandBlock.position) +} \ No newline at end of file diff --git a/arcade-events/src/main/kotlin/net/casual/arcade/events/level/LevelFluidTrySpreadEvent.kt b/arcade-events/src/main/kotlin/net/casual/arcade/events/level/LevelFluidTrySpreadEvent.kt index 958f9c94..a2075a8a 100644 --- a/arcade-events/src/main/kotlin/net/casual/arcade/events/level/LevelFluidTrySpreadEvent.kt +++ b/arcade-events/src/main/kotlin/net/casual/arcade/events/level/LevelFluidTrySpreadEvent.kt @@ -4,7 +4,6 @@ import net.minecraft.core.BlockPos import net.minecraft.core.Direction import net.minecraft.server.level.ServerLevel import net.minecraft.world.level.block.state.BlockState -import net.minecraft.world.level.material.Fluid import net.minecraft.world.level.material.FluidState public class LevelFluidTrySpreadEvent( diff --git a/arcade-events/src/main/kotlin/net/casual/arcade/events/player/PlayerRequestLoginEvent.kt b/arcade-events/src/main/kotlin/net/casual/arcade/events/player/PlayerRequestLoginEvent.kt index 71401211..4dd398ff 100644 --- a/arcade-events/src/main/kotlin/net/casual/arcade/events/player/PlayerRequestLoginEvent.kt +++ b/arcade-events/src/main/kotlin/net/casual/arcade/events/player/PlayerRequestLoginEvent.kt @@ -1,7 +1,6 @@ package net.casual.arcade.events.player import com.mojang.authlib.GameProfile -import net.casual.arcade.events.core.CancellableEvent import net.casual.arcade.events.core.Event import net.minecraft.network.chat.Component import net.minecraft.server.MinecraftServer diff --git a/arcade-events/src/main/kotlin/net/casual/arcade/events/registry/RegistryEventHandler.kt b/arcade-events/src/main/kotlin/net/casual/arcade/events/registry/RegistryEventHandler.kt index 07a45fc2..8ef4fa6f 100644 --- a/arcade-events/src/main/kotlin/net/casual/arcade/events/registry/RegistryEventHandler.kt +++ b/arcade-events/src/main/kotlin/net/casual/arcade/events/registry/RegistryEventHandler.kt @@ -1,7 +1,6 @@ package net.casual.arcade.events.registry import com.google.common.collect.HashMultimap -import net.casual.arcade.events.BuiltInEventPhases.DEFAULT import net.casual.arcade.events.EventListener import net.casual.arcade.events.GlobalEventHandler import net.casual.arcade.events.ListenerProvider @@ -9,7 +8,6 @@ import net.casual.arcade.events.core.Event import net.minecraft.core.Registry import net.minecraft.resources.ResourceKey import org.jetbrains.annotations.ApiStatus.Internal -import java.util.function.Consumer public object RegistryEventHandler: EventListener>, ListenerProvider { private val listeners = HashMultimap.create, EventListener<*>>() diff --git a/arcade-events/src/main/resources/arcade-events.mixins.json b/arcade-events/src/main/resources/arcade-events.mixins.json index 86d93e07..2073f579 100644 --- a/arcade-events/src/main/resources/arcade-events.mixins.json +++ b/arcade-events/src/main/resources/arcade-events.mixins.json @@ -4,6 +4,7 @@ "package": "net.casual.arcade.events.mixins", "compatibilityLevel": "JAVA_17", "mixins": [ + "BaseCommandBlockMixin", "BlockItemMixin", "BrewingStandBlockEntityAccessor", "BrewingStandBlockEntityMixin", diff --git a/arcade-minigames/src/main/java/net/casual/arcade/minigame/mixins/ServerGamePacketListenerImplMixin.java b/arcade-minigames/src/main/java/net/casual/arcade/minigame/mixins/ServerGamePacketListenerImplMixin.java index bb8fcc0b..a1cb7b9d 100644 --- a/arcade-minigames/src/main/java/net/casual/arcade/minigame/mixins/ServerGamePacketListenerImplMixin.java +++ b/arcade-minigames/src/main/java/net/casual/arcade/minigame/mixins/ServerGamePacketListenerImplMixin.java @@ -143,7 +143,7 @@ private void onHandleVehicleMovement(ServerboundMoveVehiclePacket packet, Callba ci.cancel(); Entity entity = this.player.getRootVehicle(); if (entity != this.player && entity.getControllingPassenger() == this.player && entity == this.lastVehicle) { - this.send(new ClientboundMoveVehiclePacket(entity)); + this.send(ClientboundMoveVehiclePacket.fromEntity(entity)); } } } diff --git a/arcade-minigames/src/main/java/net/casual/arcade/minigame/mixins/bugfixes/LeashableMixin.java b/arcade-minigames/src/main/java/net/casual/arcade/minigame/mixins/bugfixes/LeashableMixin.java index d136d9f9..5c896303 100644 --- a/arcade-minigames/src/main/java/net/casual/arcade/minigame/mixins/bugfixes/LeashableMixin.java +++ b/arcade-minigames/src/main/java/net/casual/arcade/minigame/mixins/bugfixes/LeashableMixin.java @@ -1,5 +1,7 @@ package net.casual.arcade.minigame.mixins.bugfixes; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.datafixers.util.Either; import net.minecraft.core.BlockPos; @@ -12,27 +14,27 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.Optional; @Mixin(Leashable.class) public interface LeashableMixin { - @Inject( + @WrapOperation( method = "readLeashData", - at = @At("HEAD"), - cancellable = true + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/entity/Leashable;readLeashDataInternal(Lnet/minecraft/nbt/CompoundTag;)Lnet/minecraft/world/entity/Leashable$LeashData;" + ) ) - private void onReadLeashData(CompoundTag compound, CallbackInfoReturnable cir) { + private Leashable.LeashData onReadLeashData(CompoundTag compound, Operation original) { if (this instanceof Entity entity && compound.contains("LeashRelative", CompoundTag.TAG_INT_ARRAY)) { Optional optional = NbtUtils.readBlockPos(compound, "LeashRelative"); - if (optional.isEmpty()) { - return; + if (optional.isPresent()) { + BlockPos position = entity.blockPosition().offset(optional.get()); + return LeashDataInvoker.construct(Either.right(position)); } - - BlockPos position = entity.blockPosition().offset(optional.get()); - cir.setReturnValue(LeashDataInvoker.construct(Either.right(position))); } + return original.call(compound); } @Inject( diff --git a/arcade-minigames/src/main/java/net/casual/arcade/minigame/mixins/gamemode/ServerPlayerMixin.java b/arcade-minigames/src/main/java/net/casual/arcade/minigame/mixins/gamemode/ServerPlayerMixin.java index 1b9b75d4..e0d8ff5c 100644 --- a/arcade-minigames/src/main/java/net/casual/arcade/minigame/mixins/gamemode/ServerPlayerMixin.java +++ b/arcade-minigames/src/main/java/net/casual/arcade/minigame/mixins/gamemode/ServerPlayerMixin.java @@ -3,8 +3,10 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import net.casual.arcade.minigame.gamemode.ExtendedGameMode; +import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.GameType; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -30,11 +32,11 @@ private void shouldBroadcastTo(ServerPlayer player, CallbackInfoReturnable()) { @@ -282,6 +280,12 @@ public open class LobbyMinigame( } } } + literal("countdown") { + executes(::startCountdown) + } + literal("start") { + executes(::startNextMinigame) + } } } @@ -331,6 +335,12 @@ public open class LobbyMinigame( return context.source.success("Successfully started the countdown") } + private fun startNextMinigame(context: CommandContext): Int { + this.next ?: return context.source.fail("Cannot move to next minigame, it has not been set!") + this.moveToNextMinigame() + return context.source.success("Successfully moving to next minigame") + } + private fun readyPlayers(context: CommandContext): Int { this.next ?: return context.source.fail("Cannot ready for next minigame, it has not been set!") this.setPhase(LobbyPhase.Readying) @@ -353,6 +363,13 @@ public open class LobbyMinigame( return context.source.success(Component.literal("Currently awaiting: ").append(awaiting.join())) } + private fun completeReady(context: CommandContext): Int { + if (this.ui.readier.complete()) { + return context.source.success("Successfully completed ready check") + } + return context.source.fail("There was no ready check that needed to be completed") + } + private fun setTime(context: CommandContext): Int { val time = IntegerArgumentType.getInteger(context, "time") val unit = EnumArgument.getEnumeration(context, "unit", MinecraftTimeUnit::class.java) diff --git a/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/managers/MinigameCommandManager.kt b/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/managers/MinigameCommandManager.kt index da190fdf..5bab8f51 100644 --- a/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/managers/MinigameCommandManager.kt +++ b/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/managers/MinigameCommandManager.kt @@ -2,28 +2,16 @@ package net.casual.arcade.minigame.managers import com.mojang.brigadier.CommandDispatcher import com.mojang.brigadier.builder.LiteralArgumentBuilder -import com.mojang.brigadier.exceptions.CommandSyntaxException import com.mojang.brigadier.tree.CommandNode import net.casual.arcade.commands.ducks.DeletableCommand -import net.casual.arcade.commands.fail +import net.casual.arcade.events.block.CommandBlockExecuteEvent import net.casual.arcade.events.player.PlayerCommandEvent import net.casual.arcade.events.player.PlayerCommandSuggestionsEvent import net.casual.arcade.events.player.PlayerSendCommandsEvent import net.casual.arcade.minigame.Minigame import net.casual.arcade.minigame.events.* -import net.casual.arcade.utils.ArcadeUtils -import net.casual.arcade.utils.ComponentUtils.command -import net.casual.arcade.utils.ComponentUtils.grey -import net.casual.arcade.utils.ComponentUtils.hover -import net.casual.arcade.utils.ComponentUtils.italicise -import net.casual.arcade.utils.ComponentUtils.literal -import net.casual.arcade.utils.ComponentUtils.red -import net.casual.arcade.utils.ComponentUtils.underline import net.minecraft.commands.CommandSourceStack import net.minecraft.commands.Commands -import net.minecraft.network.chat.CommonComponents -import net.minecraft.network.chat.Component -import net.minecraft.network.chat.ComponentUtils import net.minecraft.server.level.ServerPlayer import java.util.* @@ -46,12 +34,9 @@ public class MinigameCommandManager( this.minigame.events.register { it.addCustomCommandNode(this.dispatcher.root) } - this.minigame.events.register { - this.onCommand(it) - } - this.minigame.events.register { - this.onCommandSuggestions(it) - } + this.minigame.events.register(this::onPlayerCommand) + this.minigame.events.register(this::onBlockCommand) + this.minigame.events.register(this::onCommandSuggestions) this.minigame.events.register { this.unregisterAll() } @@ -142,11 +127,9 @@ public class MinigameCommandManager( private fun getGlobalMinigameCommand(): CommandNode? { return null - // FIXME: - // return this.minigame.server.commands.dispatcher.root.getChild("minigame")?.getChild("command") } - private fun onCommand(event: PlayerCommandEvent) { + private fun onPlayerCommand(event: PlayerCommandEvent) { val source = event.player.createCommandSourceStack() val result = this.dispatcher.parse(event.command, source) if (!result.reader.canRead()) { @@ -155,6 +138,14 @@ public class MinigameCommandManager( } } + private fun onBlockCommand(event: CommandBlockExecuteEvent) { + val result = this.dispatcher.parse(event.command, event.source) + if (!result.reader.canRead()) { + event.source.server.commands.performCommand(result, event.command) + event.cancel() + } + } + private fun onCommandSuggestions(event: PlayerCommandSuggestionsEvent) { val result = this.dispatcher.parse(event.createCommandReader(), event.player.createCommandSourceStack()) event.addSuggestions(this.dispatcher.getCompletionSuggestions(result)) diff --git a/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/managers/MinigameMusicManager.kt b/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/managers/MinigameMusicManager.kt index 6012ef20..51707675 100644 --- a/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/managers/MinigameMusicManager.kt +++ b/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/managers/MinigameMusicManager.kt @@ -151,8 +151,18 @@ public class MinigameMusicManager( val biomes = level.chunkSource.generator.biomeSource.possibleBiomes() val packets = ArrayList() for (biome in biomes) { - val key = biome.value().backgroundMusic.flatMap { it.event.unwrapKey() }?.getOrNull() ?: continue - packets.add(ClientboundStopSoundPacket(key.location(), SoundSource.MUSIC)) + val entries = biome.value().backgroundMusic.getOrNull()?.unwrap() + if (entries.isNullOrEmpty()) { + continue + } + for (entry in entries) { + val music = entry.data() + val key = music.event.unwrapKey() + if (key.isEmpty) { + continue + } + packets.add(ClientboundStopSoundPacket(key.get().location(), SoundSource.MUSIC)) + } } packets } diff --git a/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/managers/MinigameUIManager.kt b/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/managers/MinigameUIManager.kt index 86586e37..5b052bc4 100644 --- a/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/managers/MinigameUIManager.kt +++ b/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/managers/MinigameUIManager.kt @@ -16,7 +16,6 @@ import net.casual.arcade.visuals.core.TickableUI import net.casual.arcade.visuals.countdown.Countdown import net.casual.arcade.visuals.countdown.TitledCountdown import net.casual.arcade.visuals.nametag.PlayerNameTag -import net.casual.arcade.visuals.sidebar.FixedSidebar import net.casual.arcade.visuals.sidebar.Sidebar import net.casual.arcade.visuals.tab.PlayerListDisplay import net.minecraft.network.protocol.Packet diff --git a/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/ready/ReadyChecker.kt b/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/ready/ReadyChecker.kt index 6ad19920..2a2d16bb 100644 --- a/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/ready/ReadyChecker.kt +++ b/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/ready/ReadyChecker.kt @@ -16,7 +16,7 @@ public class ReadyChecker( private val players = Object2ObjectOpenHashMap() private val teams = Object2ObjectOpenHashMap() - private var current: Completable? = null + private var current: Completable.Impl? = null private var readyId = 0 public fun isRunning(): Boolean { @@ -24,6 +24,14 @@ public class ReadyChecker( return !current.complete } + public fun complete(): Boolean { + if (this.isRunning()) { + this.current!!.complete() + return true + } + return false + } + public fun getUnreadyPlayers(server: MinecraftServer): List { return this.players.mapNotNull { (uuid, state) -> if (state != ReadyState.Ready) server.player(uuid) else null diff --git a/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/settings/MinigameSettings.kt b/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/settings/MinigameSettings.kt index 234a42a8..7b613db9 100644 --- a/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/settings/MinigameSettings.kt +++ b/arcade-minigames/src/main/kotlin/net/casual/arcade/minigame/settings/MinigameSettings.kt @@ -6,7 +6,6 @@ import net.casual.arcade.minigame.settings.display.DisplayableSettings import net.casual.arcade.minigame.settings.display.DisplayableSettingsDefaults import net.casual.arcade.minigame.settings.display.MenuGameSettingBuilder.Companion.bool import net.casual.arcade.minigame.settings.display.MenuGameSettingBuilder.Companion.int32 -import net.casual.arcade.utils.ComponentUtils.literal import net.casual.arcade.utils.ItemUtils import net.casual.arcade.utils.ItemUtils.named import net.casual.arcade.utils.ItemUtils.styledLore diff --git a/arcade-resource-pack/src/main/kotlin/net/casual/arcade/resources/ArcadeResourcePacks.kt b/arcade-resource-pack/src/main/kotlin/net/casual/arcade/resources/ArcadeResourcePacks.kt index bd501566..366ffc78 100644 --- a/arcade-resource-pack/src/main/kotlin/net/casual/arcade/resources/ArcadeResourcePacks.kt +++ b/arcade-resource-pack/src/main/kotlin/net/casual/arcade/resources/ArcadeResourcePacks.kt @@ -62,13 +62,6 @@ public object ArcadeResourcePacks: ModInitializer { } } - public val NO_SHADOW_PACK: NamedResourcePackCreator by lazy { - NamedResourcePackCreator.named("no_shadow") { - addAssetSource(path("packs/NoShadow")) - packDescription = Component.literal("Utilities for removing text shadows") - } - } - public val PLAYER_HEADS_PACK: NamedResourcePackCreator by lazy { NamedResourcePackCreator.named("player_heads") { val location = path("packs/PlayerHeads") diff --git a/arcade-resource-pack/src/main/kotlin/net/casual/arcade/resources/font/padding/PaddingFontResources.kt b/arcade-resource-pack/src/main/kotlin/net/casual/arcade/resources/font/padding/PaddingFontResources.kt index 36982282..8672c213 100644 --- a/arcade-resource-pack/src/main/kotlin/net/casual/arcade/resources/font/padding/PaddingFontResources.kt +++ b/arcade-resource-pack/src/main/kotlin/net/casual/arcade/resources/font/padding/PaddingFontResources.kt @@ -3,7 +3,6 @@ package net.casual.arcade.resources.font.padding import net.casual.arcade.resources.font.IndexedFontResources import net.casual.arcade.utils.ResourceUtils import net.minecraft.network.chat.Component -import net.minecraft.network.chat.MutableComponent private val SPLIT_TEXTURE = ResourceUtils.arcade("font/split.png") private val NO_SPLIT_TEXTURE = ResourceUtils.arcade("font/no_split.png") diff --git a/arcade-resource-pack/src/main/kotlin/net/casual/arcade/resources/utils/ResourcePackUtils.kt b/arcade-resource-pack/src/main/kotlin/net/casual/arcade/resources/utils/ResourcePackUtils.kt index 23687d5a..e9b4e3f9 100644 --- a/arcade-resource-pack/src/main/kotlin/net/casual/arcade/resources/utils/ResourcePackUtils.kt +++ b/arcade-resource-pack/src/main/kotlin/net/casual/arcade/resources/utils/ResourcePackUtils.kt @@ -210,7 +210,6 @@ public object ResourcePackUtils { } @JvmStatic - @OptIn(ExperimentalPathApi::class) private fun ResourcePackCreator.addMissingItemModelsInternal(namespace: String, assets: Path) { val itemTextures = assets.resolve(namespace).resolve("textures").resolve("item") val itemModels = assets.resolve(namespace).resolve("models") diff --git a/arcade-scheduler/src/main/kotlin/net/casual/arcade/scheduler/task/Task.kt b/arcade-scheduler/src/main/kotlin/net/casual/arcade/scheduler/task/Task.kt index 891fc22d..9cf28f79 100644 --- a/arcade-scheduler/src/main/kotlin/net/casual/arcade/scheduler/task/Task.kt +++ b/arcade-scheduler/src/main/kotlin/net/casual/arcade/scheduler/task/Task.kt @@ -2,7 +2,6 @@ package net.casual.arcade.scheduler.task import net.casual.arcade.scheduler.TickedScheduler import net.casual.arcade.scheduler.task.impl.CancellableTask -import java.io.Serializable /** * This interface represents a [Task] used in the diff --git a/arcade-scheduler/src/main/kotlin/net/casual/arcade/scheduler/task/serialization/TaskCreationContext.kt b/arcade-scheduler/src/main/kotlin/net/casual/arcade/scheduler/task/serialization/TaskCreationContext.kt index 5207139a..fa1a90d1 100644 --- a/arcade-scheduler/src/main/kotlin/net/casual/arcade/scheduler/task/serialization/TaskCreationContext.kt +++ b/arcade-scheduler/src/main/kotlin/net/casual/arcade/scheduler/task/serialization/TaskCreationContext.kt @@ -8,7 +8,7 @@ import net.casual.arcade.scheduler.task.Task * when creating a task using a [TaskFactory]. * * It provides any custom data written by the task, - * see [getCustomData]. + * see [data]. * * It also provides the ability to create subtasks using the * [createTask] method. diff --git a/arcade-scheduler/src/main/kotlin/net/casual/arcade/scheduler/task/utils/TaskRegistries.kt b/arcade-scheduler/src/main/kotlin/net/casual/arcade/scheduler/task/utils/TaskRegistries.kt index 4905232b..e38f3ada 100644 --- a/arcade-scheduler/src/main/kotlin/net/casual/arcade/scheduler/task/utils/TaskRegistries.kt +++ b/arcade-scheduler/src/main/kotlin/net/casual/arcade/scheduler/task/utils/TaskRegistries.kt @@ -1,6 +1,5 @@ package net.casual.arcade.scheduler.task.utils -import com.mojang.serialization.MapCodec import net.casual.arcade.scheduler.task.serialization.TaskFactory import net.casual.arcade.utils.ArcadeUtils import net.casual.arcade.utils.registries.RegistryKeySupplier diff --git a/arcade-utils/src/main/kotlin/net/casual/arcade/utils/ComponentUtils.kt b/arcade-utils/src/main/kotlin/net/casual/arcade/utils/ComponentUtils.kt index 4f6e66cf..245d33fe 100644 --- a/arcade-utils/src/main/kotlin/net/casual/arcade/utils/ComponentUtils.kt +++ b/arcade-utils/src/main/kotlin/net/casual/arcade/utils/ComponentUtils.kt @@ -10,6 +10,7 @@ import net.minecraft.network.chat.HoverEvent.EntityTooltipInfo import net.minecraft.network.chat.HoverEvent.ItemStackInfo import net.minecraft.network.chat.contents.TranslatableContents import net.minecraft.resources.ResourceLocation +import net.minecraft.util.ARGB import net.minecraft.world.entity.Entity import net.minecraft.world.item.ItemStack import java.util.* @@ -245,17 +246,13 @@ public object ComponentUtils { } @JvmStatic - @Deprecated( - "Use this.color instead", - ReplaceWith("this.color(colour)") - ) - public fun MutableComponent.colour(colour: Int): MutableComponent { - return this.color(colour) + public fun MutableComponent.color(color: Int): MutableComponent { + return this.withStyle { it.withColor(color) } } @JvmStatic - public fun MutableComponent.color(color: Int): MutableComponent { - return this.withStyle { it.withColor(color) } + public fun MutableComponent.shadow(color: Int): MutableComponent { + return this.withStyle { it.withShadowColor(color) } } @JvmStatic @@ -372,7 +369,7 @@ public object ComponentUtils { } public fun MutableComponent.shadowless(): MutableComponent { - return this.color(0x4E5C24) + return this.shadow(0) } public fun MutableComponent.mini(): MutableComponent { diff --git a/arcade-utils/src/main/kotlin/net/casual/arcade/utils/PlayerUtils.kt b/arcade-utils/src/main/kotlin/net/casual/arcade/utils/PlayerUtils.kt index b0a9c365..8596d9f4 100644 --- a/arcade-utils/src/main/kotlin/net/casual/arcade/utils/PlayerUtils.kt +++ b/arcade-utils/src/main/kotlin/net/casual/arcade/utils/PlayerUtils.kt @@ -481,10 +481,11 @@ public object PlayerUtils { zDist: Float = 0.0F, speed: Float = 0.0F, count: Int = 1, - alwaysRender: Boolean = false + alwaysRender: Boolean = false, + overrideLimiter: Boolean = false ) { this.connection.send(ClientboundLevelParticlesPacket( - options, alwaysRender, position.x, position.y, position.z, xDist, yDist, zDist, speed, count + options, overrideLimiter, alwaysRender, position.x, position.y, position.z, xDist, yDist, zDist, speed, count )) } } \ No newline at end of file diff --git a/arcade-utils/src/main/kotlin/net/casual/arcade/utils/ResourceUtils.kt b/arcade-utils/src/main/kotlin/net/casual/arcade/utils/ResourceUtils.kt index 23d471b5..5bb63196 100644 --- a/arcade-utils/src/main/kotlin/net/casual/arcade/utils/ResourceUtils.kt +++ b/arcade-utils/src/main/kotlin/net/casual/arcade/utils/ResourceUtils.kt @@ -1,7 +1,6 @@ package net.casual.arcade.utils import net.minecraft.resources.ResourceLocation -import org.apache.commons.lang3.RandomStringUtils import java.util.* public object ResourceUtils { diff --git a/arcade-utils/src/main/kotlin/net/casual/arcade/utils/StructureUtils.kt b/arcade-utils/src/main/kotlin/net/casual/arcade/utils/StructureUtils.kt index 02585fea..01287b18 100644 --- a/arcade-utils/src/main/kotlin/net/casual/arcade/utils/StructureUtils.kt +++ b/arcade-utils/src/main/kotlin/net/casual/arcade/utils/StructureUtils.kt @@ -1,7 +1,6 @@ package net.casual.arcade.utils import com.mojang.serialization.Codec -import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.NbtAccounter import net.minecraft.nbt.NbtIo import net.minecraft.server.MinecraftServer diff --git a/arcade-utils/src/main/kotlin/net/casual/arcade/utils/registries/RegistrySupplier.kt b/arcade-utils/src/main/kotlin/net/casual/arcade/utils/registries/RegistrySupplier.kt index f937d96c..320fb648 100644 --- a/arcade-utils/src/main/kotlin/net/casual/arcade/utils/registries/RegistrySupplier.kt +++ b/arcade-utils/src/main/kotlin/net/casual/arcade/utils/registries/RegistrySupplier.kt @@ -1,7 +1,6 @@ package net.casual.arcade.utils.registries import com.mojang.serialization.Lifecycle -import net.minecraft.core.DefaultedMappedRegistry import net.minecraft.core.MappedRegistry import net.minecraft.core.Registry import net.minecraft.resources.ResourceKey diff --git a/arcade-visuals/src/main/kotlin/net/casual/arcade/visuals/tab/PlayerListDisplay.kt b/arcade-visuals/src/main/kotlin/net/casual/arcade/visuals/tab/PlayerListDisplay.kt index e4b3c226..d474709a 100644 --- a/arcade-visuals/src/main/kotlin/net/casual/arcade/visuals/tab/PlayerListDisplay.kt +++ b/arcade-visuals/src/main/kotlin/net/casual/arcade/visuals/tab/PlayerListDisplay.kt @@ -161,6 +161,7 @@ public class PlayerListDisplay( entry.latency, GameType.SURVIVAL, entry.display, + entry.showHat, -index, // For some reason, Mojang does this in reverse null )) @@ -171,7 +172,7 @@ public class PlayerListDisplay( private fun hidingClientboundEntry(player: ServerPlayer, hidden: Boolean): ClientboundPlayerInfoUpdatePacket.Entry { return ClientboundPlayerInfoUpdatePacket.Entry( - player.uuid, null, !hidden, 0, GameType.SURVIVAL, null, 0, null + player.uuid, null, !hidden, 0, GameType.SURVIVAL, null, true, 0, null ) } @@ -185,6 +186,7 @@ public class PlayerListDisplay( entry.latency, GameType.SURVIVAL, entry.display, + entry.showHat, -index, null ) diff --git a/arcade-visuals/src/main/kotlin/net/casual/arcade/visuals/tab/PlayerListEntries.kt b/arcade-visuals/src/main/kotlin/net/casual/arcade/visuals/tab/PlayerListEntries.kt index 966be830..5d300dd8 100644 --- a/arcade-visuals/src/main/kotlin/net/casual/arcade/visuals/tab/PlayerListEntries.kt +++ b/arcade-visuals/src/main/kotlin/net/casual/arcade/visuals/tab/PlayerListEntries.kt @@ -24,7 +24,8 @@ public interface PlayerListEntries { public data class Entry( val display: Component, val textures: Texture = Texture.DEFAULT, - val latency: Int = 0 + val latency: Int = 0, + val showHat: Boolean = true ) { public companion object { private val HIDDEN_PADDING = PaddingNoSplitFontResources.padding(-8) diff --git a/arcade-world-border/src/main/kotlin/net/casual/arcade/border/state/MovingBorderState.kt b/arcade-world-border/src/main/kotlin/net/casual/arcade/border/state/MovingBorderState.kt index 7ff2b231..9c82e77a 100644 --- a/arcade-world-border/src/main/kotlin/net/casual/arcade/border/state/MovingBorderState.kt +++ b/arcade-world-border/src/main/kotlin/net/casual/arcade/border/state/MovingBorderState.kt @@ -1,7 +1,6 @@ package net.casual.arcade.border.state import net.casual.arcade.border.CustomBorder -import net.casual.arcade.border.state.BorderState import net.casual.arcade.utils.ServerUtils import net.casual.arcade.utils.calculateTPS import net.minecraft.util.Mth diff --git a/arcade-world-border/src/main/kotlin/net/casual/arcade/border/state/StillBorderState.kt b/arcade-world-border/src/main/kotlin/net/casual/arcade/border/state/StillBorderState.kt index c2e84602..cd156027 100644 --- a/arcade-world-border/src/main/kotlin/net/casual/arcade/border/state/StillBorderState.kt +++ b/arcade-world-border/src/main/kotlin/net/casual/arcade/border/state/StillBorderState.kt @@ -1,7 +1,6 @@ package net.casual.arcade.border.state import net.casual.arcade.border.CustomBorder -import net.casual.arcade.border.state.BorderState import net.minecraft.util.Mth import net.minecraft.world.level.border.BorderStatus import net.minecraft.world.phys.shapes.BooleanOp diff --git a/build.gradle.kts b/build.gradle.kts index 2daf8c9e..809d3a48 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,7 +10,7 @@ plugins { java } -val modVersion = "0.3.1-alpha.46" +val modVersion = "0.3.1-alpha.47" allprojects { apply(plugin = "fabric-loom") diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e1adfb49..e48eca57 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/libs.versions.toml b/libs.versions.toml index 24282fb3..4c99caa9 100644 --- a/libs.versions.toml +++ b/libs.versions.toml @@ -1,16 +1,16 @@ [versions] -fabric-loom = "1.8-SNAPSHOT" -minecraft = "1.21.3" -fabric-loader = "0.16.7" +fabric-loom = "1.9-SNAPSHOT" +minecraft = "1.21.4" +fabric-loader = "0.16.9" parchment = "1.21:2024.11.10" -fabric-api = "0.106.1+1.21.3" -fabric-kotlin = "1.11.0+kotlin.2.0.0" -polymer = "0.10.2+1.21.3" -sgui = "1.7.2+1.21.2" -permissions = "0.3.2" +fabric-api = "0.110.5+1.21.4" +fabric-kotlin = "1.13.0+kotlin.2.1.0" +polymer = "0.11.0+1.21.4-rc1" +sgui = "1.8.1+1.21.4" +permissions = "0.3.3" server-translations = "2.4.0+1.21.2-rc1" -custom-nametags = "0.3.0+1.21.3" -server-replay = "1.2.3+1.21.3" +custom-nametags = "0.3.1+1.21.4" +server-replay = "1.2.6+1.21.4" [libraries] minecraft = { module = "com.mojang:minecraft" , version.ref = "minecraft" } diff --git a/src/testmod/kotlin/net/casual/arcade/test/ArcadeTest.kt b/src/testmod/kotlin/net/casual/arcade/test/ArcadeTest.kt index 07c38a94..bf218420 100644 --- a/src/testmod/kotlin/net/casual/arcade/test/ArcadeTest.kt +++ b/src/testmod/kotlin/net/casual/arcade/test/ArcadeTest.kt @@ -4,10 +4,15 @@ import com.mojang.brigadier.Command import net.casual.arcade.commands.argument import net.casual.arcade.commands.registerLiteral import net.casual.arcade.events.GlobalEventHandler +import net.casual.arcade.events.player.PlayerJoinEvent import net.casual.arcade.events.server.ServerLoadedEvent import net.casual.arcade.events.server.ServerRegisterCommandEvent +import net.casual.arcade.host.PackHost import net.casual.arcade.minigame.utils.MinigameRegistries import net.casual.arcade.resources.ArcadeResourcePacks +import net.casual.arcade.resources.utils.ResourcePackUtils.addPack +import net.casual.arcade.resources.utils.ResourcePackUtils.sendResourcePack +import net.casual.arcade.resources.utils.ResourcePackUtils.toPackInfo import net.casual.arcade.visuals.screen.PlayerInventoryViewGui import net.fabricmc.api.ModInitializer import net.fabricmc.loader.api.FabricLoader @@ -35,6 +40,20 @@ object ArcadeTest: ModInitializer { TestMinigame.ID, TestMinigame.codec() ) + + val host = PackHost(null) + val spacing by host.addPack( + FabricLoader.getInstance().configDir.resolve("arcade-testing-packs"), + ArcadeResourcePacks.SPACING_FONT_PACK + ) + + GlobalEventHandler.register { it.player.sendResourcePack(spacing.toPackInfo()) } + + host.start() + + Runtime.getRuntime().addShutdownHook(Thread { + host.stop() + }) } } diff --git a/src/testmod/kotlin/net/casual/arcade/test/TestMinigame.kt b/src/testmod/kotlin/net/casual/arcade/test/TestMinigame.kt index 4370472e..faa51bd0 100644 --- a/src/testmod/kotlin/net/casual/arcade/test/TestMinigame.kt +++ b/src/testmod/kotlin/net/casual/arcade/test/TestMinigame.kt @@ -9,12 +9,19 @@ import net.casual.arcade.minigame.serialization.MinigameCreationContext import net.casual.arcade.minigame.serialization.MinigameFactory import net.casual.arcade.resources.font.spacing.SpacingFontResources import net.casual.arcade.utils.ComponentUtils.blue +import net.casual.arcade.utils.ComponentUtils.bold +import net.casual.arcade.utils.ComponentUtils.italicise +import net.casual.arcade.utils.ComponentUtils.shadowless +import net.casual.arcade.utils.ComponentUtils.white import net.casual.arcade.utils.ResourceUtils import net.casual.arcade.utils.recipe.CraftingRecipeBuilder import net.casual.arcade.visuals.elements.ComponentElements import net.casual.arcade.visuals.elements.SidebarElements import net.casual.arcade.visuals.sidebar.FixedSidebar import net.casual.arcade.visuals.sidebar.SidebarComponent +import net.casual.arcade.visuals.tab.PlayerListDisplay +import net.casual.arcade.visuals.tab.PlayerListEntries +import net.casual.arcade.visuals.tab.VanillaPlayerListEntries import net.minecraft.network.chat.Component import net.minecraft.resources.ResourceLocation import net.minecraft.server.MinecraftServer @@ -65,6 +72,13 @@ open class TestMinigame( sidebar.addRow(SidebarElements.withNoScore(SpacingFontResources.spaced(120))) this.ui.setSidebar(sidebar) + val display = PlayerListDisplay(VanillaPlayerListEntries()) + display.setDisplay( + { player -> Component.literal("Testing Minigame\n").blue() + .append(Component.literal("shadowless").shadowless().italicise().bold().white()) }, + { player -> Component.empty() } + ) + this.ui.setPlayerListDisplay(display) // val bossbar = SuppliedBossbar() // bossbar.setTitle { player -> // val delta = (player.server.tickCount % 200 / 2.0F) - 50F