From 1b144c18d2bcf73887e75c4c2a3b79fefc7ed0ce Mon Sep 17 00:00:00 2001 From: Hugman Date: Sun, 8 Dec 2024 14:16:43 +0100 Subject: [PATCH 1/6] Update to 1.21.4 --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 6 +- build.gradle | 4 +- gradle.properties | 12 +- gradle/wrapper/gradle-wrapper.properties | 4 +- .../java/com/hugman/the_towers/TheTowers.java | 4 +- .../the_towers/config/TowersConfig.java | 12 +- .../hugman/the_towers/game/TowersActive.java | 106 ++++++++++-------- .../hugman/the_towers/game/TowersSidebar.java | 12 +- .../hugman/the_towers/game/TowersWaiting.java | 67 ++++++----- .../com/hugman/the_towers/map/Generator.java | 4 +- .../com/hugman/the_towers/map/TeamRegion.java | 4 +- .../com/hugman/the_towers/map/TowersMap.java | 8 +- .../the_towers/map/TowersMapGenerator.java | 4 +- .../the_towers/games/classic/four_teams.json | 42 ------- .../the_towers/games/classic/two_teams.json | 28 ----- .../classic/four_teams.nbt | Bin .../classic/two_teams.nbt | Bin .../plasmid/game/classic/four_teams.json | 44 ++++++++ .../plasmid/game/classic/two_teams.json | 30 +++++ src/main/resources/fabric.mod.json | 6 +- 21 files changed, 208 insertions(+), 191 deletions(-) delete mode 100644 src/main/resources/data/the_towers/games/classic/four_teams.json delete mode 100644 src/main/resources/data/the_towers/games/classic/two_teams.json rename src/main/resources/data/the_towers/{map_templates => map_template}/classic/four_teams.nbt (100%) rename src/main/resources/data/the_towers/{map_templates => map_template}/classic/two_teams.nbt (100%) create mode 100644 src/main/resources/data/the_towers/plasmid/game/classic/four_teams.json create mode 100644 src/main/resources/data/the_towers/plasmid/game/classic/two_teams.json diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7d9e720..bb4902f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,7 +23,7 @@ jobs: - name: Set up JDK uses: actions/setup-java@v1 with: - java-version: 17 + java-version: 21 - name: Grant execute permission for gradlew run: chmod +x gradlew diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2b414ab..9501b4e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,10 +16,10 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v1 with: - java-version: '17' + java-version: '21' - name: Grant execute permission for gradlew run: chmod +x ./gradlew @@ -36,7 +36,7 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} changelog: ${{ github.event.release.body }} - java: 17 + java: 21 modrinth-featured: false diff --git a/build.gradle b/build.gradle index 7989347..9fc4b8c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id "fabric-loom" version "1.3-SNAPSHOT" + id "fabric-loom" version "1.9-SNAPSHOT" id 'maven-publish' } @@ -35,7 +35,7 @@ processResources { tasks.withType(JavaCompile).configureEach { it.options.encoding = "UTF-8" - it.options.release = 17 + it.options.release = 21 } java { diff --git a/gradle.properties b/gradle.properties index 2298aae..8696f17 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,16 +2,16 @@ org.gradle.jvmargs=-Xmx1G # Mod Properties -mod_version=2.1.3 +mod_version=2.2.0 maven_group=com.hugman archives_base_name=the_towers # Fabric Properties # check these on https://fabricmc.net/develop/ -minecraft_version=1.20.1 -yarn_mappings=1.20.1+build.10 -loader_version=0.14.22 -fabric_version=0.87.0+1.20.1 +minecraft_version=1.21.4 +yarn_mappings=1.21.4+build.1 +loader_version=0.16.9 +fabric_version=0.111.0+1.21.4 # check this on https://nucleoid.xyz/use/ -plasmid_version=0.5.101-SNAPSHOT+1.20.1 \ No newline at end of file +plasmid_version=0.6.3-SNAPSHOT+1.21.4 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 59bc51a..92a4779 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ -distributionBase=GRADLE_USER_HOME +wdistributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/com/hugman/the_towers/TheTowers.java b/src/main/java/com/hugman/the_towers/TheTowers.java index 873e142..942452a 100644 --- a/src/main/java/com/hugman/the_towers/TheTowers.java +++ b/src/main/java/com/hugman/the_towers/TheTowers.java @@ -7,14 +7,14 @@ import net.minecraft.util.Identifier; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import xyz.nucleoid.plasmid.game.GameType; +import xyz.nucleoid.plasmid.api.game.GameType; public class TheTowers implements ModInitializer { private static final String MOD_ID = "the_towers"; public static final Logger LOGGER = LogManager.getLogger(MOD_ID); public static Identifier id(String s) { - return new Identifier(MOD_ID, s); + return Identifier.of(MOD_ID, s); } @Override diff --git a/src/main/java/com/hugman/the_towers/config/TowersConfig.java b/src/main/java/com/hugman/the_towers/config/TowersConfig.java index cb1730d..663322b 100644 --- a/src/main/java/com/hugman/the_towers/config/TowersConfig.java +++ b/src/main/java/com/hugman/the_towers/config/TowersConfig.java @@ -1,15 +1,17 @@ package com.hugman.the_towers.config; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.util.Identifier; -import xyz.nucleoid.plasmid.game.common.config.PlayerConfig; -import xyz.nucleoid.plasmid.game.common.team.GameTeamList; +import xyz.nucleoid.plasmid.api.game.common.config.WaitingLobbyConfig; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeamList; -public record TowersConfig(PlayerConfig playerConfig, GameTeamList teamConfig, Identifier mapTemplateId, int maxHealth, +public record TowersConfig(WaitingLobbyConfig playerConfig, GameTeamList teamConfig, Identifier mapTemplateId, + int maxHealth, boolean healthStealth, int respawnCooldown, int refillCooldown) { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - PlayerConfig.CODEC.fieldOf("players").forGetter(TowersConfig::playerConfig), + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + WaitingLobbyConfig.CODEC.fieldOf("players").forGetter(TowersConfig::playerConfig), GameTeamList.CODEC.fieldOf("teams").forGetter(TowersConfig::teamConfig), Identifier.CODEC.fieldOf("map").forGetter(TowersConfig::mapTemplateId), Codec.INT.fieldOf("max_health").forGetter(TowersConfig::maxHealth), diff --git a/src/main/java/com/hugman/the_towers/game/TowersActive.java b/src/main/java/com/hugman/the_towers/game/TowersActive.java index a5f923e..251831d 100644 --- a/src/main/java/com/hugman/the_towers/game/TowersActive.java +++ b/src/main/java/com/hugman/the_towers/game/TowersActive.java @@ -1,12 +1,9 @@ package com.hugman.the_towers.game; import com.hugman.the_towers.config.TowersConfig; -import com.hugman.the_towers.map.TowersMap; import com.hugman.the_towers.map.TeamRegion; +import com.hugman.the_towers.map.TowersMap; import com.hugman.the_towers.util.FormattingUtil; -import eu.pb4.holograms.api.Holograms; -import eu.pb4.holograms.api.holograms.AbstractHologram; -import eu.pb4.holograms.api.holograms.WorldHologram; import it.unimi.dsi.fastutil.objects.Object2ObjectMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.block.BlockState; @@ -40,23 +37,30 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.GameMode; import xyz.nucleoid.map_templates.BlockBounds; -import xyz.nucleoid.plasmid.game.GameActivity; -import xyz.nucleoid.plasmid.game.GameCloseReason; -import xyz.nucleoid.plasmid.game.GameSpace; -import xyz.nucleoid.plasmid.game.common.GlobalWidgets; -import xyz.nucleoid.plasmid.game.common.team.*; -import xyz.nucleoid.plasmid.game.event.GameActivityEvents; -import xyz.nucleoid.plasmid.game.event.GamePlayerEvents; -import xyz.nucleoid.plasmid.game.player.PlayerOffer; -import xyz.nucleoid.plasmid.game.player.PlayerOfferResult; -import xyz.nucleoid.plasmid.game.rule.GameRuleType; -import xyz.nucleoid.plasmid.util.ItemStackBuilder; +import xyz.nucleoid.plasmid.api.game.GameActivity; +import xyz.nucleoid.plasmid.api.game.GameCloseReason; +import xyz.nucleoid.plasmid.api.game.GameSpace; +import xyz.nucleoid.plasmid.api.game.common.GlobalWidgets; +import xyz.nucleoid.plasmid.api.game.common.PlayerLimiter; +import xyz.nucleoid.plasmid.api.game.common.team.*; +import xyz.nucleoid.plasmid.api.game.event.GameActivityEvents; +import xyz.nucleoid.plasmid.api.game.event.GamePlayerEvents; +import xyz.nucleoid.plasmid.api.game.player.JoinAcceptor; +import xyz.nucleoid.plasmid.api.game.player.JoinAcceptorResult; +import xyz.nucleoid.plasmid.api.game.player.JoinOffer; +import xyz.nucleoid.plasmid.api.game.rule.GameRuleType; +import xyz.nucleoid.plasmid.api.util.ItemStackBuilder; +import xyz.nucleoid.plasmid.api.util.PlayerPos; +import xyz.nucleoid.plasmid.api.util.PlayerRef; +import xyz.nucleoid.stimuli.event.EventResult; import xyz.nucleoid.stimuli.event.block.BlockBreakEvent; import xyz.nucleoid.stimuli.event.block.BlockPlaceEvent; import xyz.nucleoid.stimuli.event.block.BlockUseEvent; import xyz.nucleoid.stimuli.event.item.ItemThrowEvent; import xyz.nucleoid.stimuli.event.player.PlayerDeathEvent; +import java.util.Set; + public class TowersActive { private final GameSpace gameSpace; private final GameActivity activity; @@ -110,6 +114,7 @@ private void fillTeams(TeamSelectionLobby teamSelection) { public static void enable(GameSpace gameSpace, ServerWorld world, TowersMap map, TowersConfig config, TeamSelectionLobby teamSelection) { gameSpace.setActivity(activity -> { + PlayerLimiter.addTo(activity, config.playerConfig().playerConfig()); GlobalWidgets widgets = GlobalWidgets.addTo(activity); TowersSidebar sidebar = TowersSidebar.create(widgets, gameSpace); TowersActive active = new TowersActive(gameSpace, activity, world, map, config, sidebar, teamSelection); @@ -126,7 +131,8 @@ public static void enable(GameSpace gameSpace, ServerWorld world, TowersMap map, activity.listen(GameActivityEvents.ENABLE, active::enable); activity.listen(GameActivityEvents.TICK, active::tick); - activity.listen(GamePlayerEvents.OFFER, active::offerPlayer); + activity.listen(GamePlayerEvents.OFFER, JoinOffer::accept); + activity.listen(GamePlayerEvents.ACCEPT, active::accept); activity.listen(PlayerDeathEvent.EVENT, active::killPlayer); activity.listen(ItemThrowEvent.EVENT, active::dropItem); @@ -142,7 +148,7 @@ private void enable() { Text[] GUIDE_LINES = { Text.literal("+--------------------------------------+").formatted(Formatting.DARK_GRAY), - this.gameSpace.getMetadata().sourceConfig().name().copy().formatted(Formatting.BOLD, Formatting.GOLD), + this.gameSpace.getMetadata().sourceConfig().value().name().copy().formatted(Formatting.BOLD, Formatting.GOLD), Text.translatable("text.the_towers.guide.craft_stuff").formatted(Formatting.WHITE), Text.translatable("text.the_towers.guide.jumping_into_pool").formatted(Formatting.WHITE), Text.translatable("text.the_towers.guide.protect_your_pool").formatted(Formatting.WHITE), @@ -161,9 +167,10 @@ private void enable() { this.resetPlayerInventory(player); } }); - WorldHologram hologram = Holograms.create(this.world, map.teamRegions().get(gameTeam.key()).pool().centerTop().add(0.0D, 0.5D, 0.0D), Text.translatable("text.the_towers.pool", gameTeam.config().name()).formatted(gameTeam.config().chatFormatting())); - hologram.setAlignment(AbstractHologram.VerticalAlign.CENTER); - hologram.show(); + //TODO + //WorldHologram hologram = Holograms.create(this.world, map.teamRegions().get(gameTeam.key()).pool().centerTop().add(0.0D, 0.5D, 0.0D), Text.translatable("text.the_towers.pool", gameTeam.config().name()).formatted(gameTeam.config().chatFormatting())); + //hologram.setAlignment(AbstractHologram.VerticalAlign.CENTER); + //hologram.show(); }); } @@ -284,22 +291,25 @@ private void checkWin() { } // GENERAL PLAYER MANAGEMENT - private PlayerOfferResult offerPlayer(PlayerOffer offer) { - ServerPlayerEntity player = offer.player(); - - GameTeamKey gameTeamKey = this.teamManager.teamFor(player); - if (gameTeamKey != null) { - TeamData theTowersTeam = teamMap.get(gameTeamKey); - if (theTowersTeam.health > 0) { - return offer.accept(this.world, this.map.teamRegions().get(gameTeamKey).spawn().center()).and(() -> { + private JoinAcceptorResult accept(JoinAcceptor acceptor) { + return acceptor.teleport(profile -> { + GameTeamKey gameTeamKey = this.teamManager.teamFor(PlayerRef.of(profile)); + if (gameTeamKey instanceof GameTeamKey) { + return new PlayerPos(this.world, this.map.teamRegions().get(gameTeamKey).spawn().center(), 0.0f, 0.0f); + } + return new PlayerPos(this.world, this.map.spawn(), 0.0f, 0.0f); + }).thenRunForEach(player -> { + GameTeamKey gameTeamKey = this.teamManager.teamFor(player); + if (gameTeamKey instanceof GameTeamKey) { + TeamData theTowersTeam = teamMap.get(gameTeamKey); + if (theTowersTeam.health > 0) { player.changeGameMode(GameMode.SURVIVAL); this.resetPlayer(player); this.resetPlayerInventory(player); this.spawnPlayerAtTheirSpawn(player); - }); + return; + } } - } - return offer.accept(this.world, this.map.spawn()).and(() -> { player.changeGameMode(GameMode.SPECTATOR); this.resetPlayer(player); this.spawnPlayerAtCenter(player); @@ -311,7 +321,7 @@ public void resetPlayerInventory(ServerPlayerEntity player) { if (gameTeam != null) { player.equipStack(EquipmentSlot.HEAD, ItemStackBuilder.of(gameTeam.config().applyDye(new ItemStack(Items.LEATHER_HELMET))).setUnbreakable().build()); player.equipStack(EquipmentSlot.CHEST, ItemStackBuilder.of(gameTeam.config().applyDye(new ItemStack(Items.LEATHER_CHESTPLATE))).setUnbreakable().build()); - player.equipStack(EquipmentSlot.LEGS, ItemStackBuilder.of(gameTeam.config().applyDye(new ItemStack(Items.LEATHER_LEGGINGS))).addEnchantment(Enchantments.PROJECTILE_PROTECTION, 2).setUnbreakable().build()); + player.equipStack(EquipmentSlot.LEGS, ItemStackBuilder.of(gameTeam.config().applyDye(new ItemStack(Items.LEATHER_LEGGINGS))).addEnchantment(this.world, Enchantments.PROJECTILE_PROTECTION, 2).setUnbreakable().build()); player.equipStack(EquipmentSlot.FEET, ItemStackBuilder.of(gameTeam.config().applyDye(new ItemStack(Items.LEATHER_BOOTS))).setUnbreakable().build()); player.getInventory().insertStack(ItemStackBuilder.of(Items.WOODEN_SWORD).build()); player.getInventory().insertStack(ItemStackBuilder.of(Items.WOODEN_PICKAXE).build()); @@ -346,23 +356,23 @@ public void spawnPlayerAtTheirSpawn(ServerPlayerEntity player) { } public void spawnPlayerAt(ServerPlayerEntity player, Vec3d pos, float yaw, float pitch) { - player.teleport(this.world, pos.getX(), pos.getY(), pos.getZ(), yaw, pitch); + player.teleport(this.world, pos.getX(), pos.getY(), pos.getZ(), Set.of(), yaw, pitch, false); player.setVelocity(Vec3d.ZERO); player.fallDistance = 0.0f; } // GENERAL LISTENERS - private ActionResult dropItem(PlayerEntity player, int i, ItemStack stack) { + private EventResult dropItem(PlayerEntity player, int i, ItemStack stack) { if (canStackBeDropped(stack)) { - return ActionResult.SUCCESS; + return EventResult.ALLOW; } else { Text msg = FormattingUtil.format(FormattingUtil.GENERAL_SYMBOL, FormattingUtil.WARNING_STYLE, Text.translatable("text.the_towers.cannot_drop_armor")); player.sendMessage(msg, false); - return ActionResult.FAIL; + return EventResult.DENY; } } - private ActionResult killPlayer(ServerPlayerEntity player, DamageSource source) { + private EventResult killPlayer(ServerPlayerEntity player, DamageSource source) { TowersParticipant participant = this.participantMap.get(player); if (participant == null) { this.spawnPlayerAtCenter(player); @@ -380,23 +390,23 @@ private ActionResult killPlayer(ServerPlayerEntity player, DamageSource source) this.resetPlayer(player); - player.teleport(player.getX(), player.getY() + 1000, player.getZ()); - player.networkHandler.sendPacket(new GameStateChangeS2CPacket(new GameStateChangeS2CPacket.Reason(3), 3)); + player.teleport(player.getX(), player.getY() + 1000, player.getZ(), false); + player.networkHandler.sendPacket(new GameStateChangeS2CPacket(GameStateChangeS2CPacket.GAME_MODE_CHANGED, 3)); PlayerAbilities abilities = new PlayerAbilities(); abilities.allowFlying = false; player.networkHandler.sendPacket(new PlayerAbilitiesS2CPacket(abilities)); player.addStatusEffect(new StatusEffectInstance(StatusEffects.BLINDNESS, (this.config.respawnCooldown() + 1) * 20, 1, true, false)); player.addStatusEffect(new StatusEffectInstance(StatusEffects.SLOW_FALLING, (this.config.respawnCooldown() + 1) * 20, 10, true, false)); } - return ActionResult.FAIL; + return EventResult.DENY; } - private ActionResult placeBlock(ServerPlayerEntity playerEntity, ServerWorld world, BlockPos pos, BlockState state, ItemUsageContext itemUsageContext) { + private EventResult placeBlock(ServerPlayerEntity playerEntity, ServerWorld world, BlockPos pos, BlockState state, ItemUsageContext itemUsageContext) { for (BlockBounds bounds : this.map.protectedBounds()) { if (bounds.contains(pos)) { Text msg = FormattingUtil.format(FormattingUtil.GENERAL_SYMBOL, FormattingUtil.WARNING_STYLE, Text.translatable("text.the_towers.cannot_place")); playerEntity.sendMessage(msg, false); - return ActionResult.FAIL; + return EventResult.DENY; } } for (GameTeam team : this.teamMap.keySet()) { @@ -404,11 +414,11 @@ private ActionResult placeBlock(ServerPlayerEntity playerEntity, ServerWorld wor if (this.map.teamRegions().get(team.key()).domains().contains(pos.asLong())) { Text msg = FormattingUtil.format(FormattingUtil.GENERAL_SYMBOL, FormattingUtil.WARNING_STYLE, Text.translatable("text.the_towers.cannot_place")); playerEntity.sendMessage(msg, false); - return ActionResult.FAIL; + return EventResult.DENY; } } } - return ActionResult.PASS; + return EventResult.PASS; } private ActionResult useBlock(ServerPlayerEntity playerEntity, Hand hand, BlockHitResult blockHitResult) { @@ -433,12 +443,12 @@ private ActionResult useBlock(ServerPlayerEntity playerEntity, Hand hand, BlockH return ActionResult.PASS; } - private ActionResult breakBlock(ServerPlayerEntity playerEntity, ServerWorld world, BlockPos pos) { + private EventResult breakBlock(ServerPlayerEntity playerEntity, ServerWorld world, BlockPos pos) { for (BlockBounds bounds : this.map.protectedBounds()) { if (bounds.contains(pos)) { Text msg = FormattingUtil.format(FormattingUtil.GENERAL_SYMBOL, FormattingUtil.WARNING_STYLE, Text.translatable("text.the_towers.cannot_break")); playerEntity.sendMessage(msg, false); - return ActionResult.FAIL; + return EventResult.DENY; } } for (GameTeam team : this.teamMap.keySet()) { @@ -446,12 +456,12 @@ private ActionResult breakBlock(ServerPlayerEntity playerEntity, ServerWorld wor if (this.map.teamRegions().get(team.key()).domains().contains(pos.asLong())) { Text msg = FormattingUtil.format(FormattingUtil.GENERAL_SYMBOL, FormattingUtil.WARNING_STYLE, Text.translatable("text.the_towers.cannot_break")); playerEntity.sendMessage(msg, false); - return ActionResult.FAIL; + return EventResult.DENY; } } } - return ActionResult.PASS; + return EventResult.PASS; } // UTILITY diff --git a/src/main/java/com/hugman/the_towers/game/TowersSidebar.java b/src/main/java/com/hugman/the_towers/game/TowersSidebar.java index 9cba735..9f47c04 100644 --- a/src/main/java/com/hugman/the_towers/game/TowersSidebar.java +++ b/src/main/java/com/hugman/the_towers/game/TowersSidebar.java @@ -6,14 +6,16 @@ import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import xyz.nucleoid.plasmid.game.GameSpace; -import xyz.nucleoid.plasmid.game.common.GlobalWidgets; -import xyz.nucleoid.plasmid.game.common.team.GameTeam; -import xyz.nucleoid.plasmid.game.common.widget.SidebarWidget; +import xyz.nucleoid.plasmid.api.game.GameSpace; +import xyz.nucleoid.plasmid.api.game.common.GlobalWidgets; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeam; +import xyz.nucleoid.plasmid.api.game.common.widget.SidebarWidget; public record TowersSidebar(SidebarWidget sidebarWidget) { public static TowersSidebar create(GlobalWidgets widgets, GameSpace gameSpace) { - return new TowersSidebar(widgets.addSidebar(gameSpace.getMetadata().sourceConfig().name().copy().formatted(Formatting.BOLD, Formatting.GOLD))); + var gameName = gameSpace.getMetadata().sourceConfig().value().name(); + if(gameName == null) gameName = Text.of("The Towers"); + return new TowersSidebar(widgets.addSidebar(gameName.copy().formatted(Formatting.BOLD, Formatting.GOLD))); } /** diff --git a/src/main/java/com/hugman/the_towers/game/TowersWaiting.java b/src/main/java/com/hugman/the_towers/game/TowersWaiting.java index f6243fa..5a860f0 100644 --- a/src/main/java/com/hugman/the_towers/game/TowersWaiting.java +++ b/src/main/java/com/hugman/the_towers/game/TowersWaiting.java @@ -3,35 +3,32 @@ import com.hugman.the_towers.config.TowersConfig; import com.hugman.the_towers.map.TowersMap; import com.hugman.the_towers.map.TowersMapGenerator; -import eu.pb4.holograms.api.Holograms; -import eu.pb4.holograms.api.holograms.AbstractHologram; -import eu.pb4.holograms.api.holograms.WorldHologram; import net.minecraft.entity.damage.DamageSource; import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ChunkTicketType; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.Text; -import net.minecraft.util.ActionResult; import net.minecraft.util.Formatting; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.GameMode; -import xyz.nucleoid.plasmid.game.GameOpenContext; -import xyz.nucleoid.plasmid.game.GameOpenProcedure; -import xyz.nucleoid.plasmid.game.GameResult; -import xyz.nucleoid.plasmid.game.GameSpace; -import xyz.nucleoid.plasmid.game.common.GameWaitingLobby; -import xyz.nucleoid.plasmid.game.common.team.TeamSelectionLobby; -import xyz.nucleoid.plasmid.game.event.GameActivityEvents; -import xyz.nucleoid.plasmid.game.event.GamePlayerEvents; -import xyz.nucleoid.plasmid.game.player.PlayerOffer; -import xyz.nucleoid.plasmid.game.player.PlayerOfferResult; -import xyz.nucleoid.plasmid.game.rule.GameRuleType; +import xyz.nucleoid.plasmid.api.game.GameOpenContext; +import xyz.nucleoid.plasmid.api.game.GameOpenProcedure; +import xyz.nucleoid.plasmid.api.game.GameResult; +import xyz.nucleoid.plasmid.api.game.GameSpace; +import xyz.nucleoid.plasmid.api.game.common.GameWaitingLobby; +import xyz.nucleoid.plasmid.api.game.common.team.TeamSelectionLobby; +import xyz.nucleoid.plasmid.api.game.event.GameActivityEvents; +import xyz.nucleoid.plasmid.api.game.event.GamePlayerEvents; +import xyz.nucleoid.plasmid.api.game.player.JoinAcceptor; +import xyz.nucleoid.plasmid.api.game.player.JoinAcceptorResult; +import xyz.nucleoid.plasmid.api.game.rule.GameRuleType; +import xyz.nucleoid.stimuli.event.EventResult; import xyz.nucleoid.stimuli.event.player.PlayerAttackEntityEvent; import xyz.nucleoid.stimuli.event.player.PlayerDamageEvent; import xyz.nucleoid.stimuli.event.player.PlayerDeathEvent; +import java.util.Set; + public record TowersWaiting(GameSpace gameSpace, ServerWorld world, TowersMap map, TowersConfig config, TeamSelectionLobby teamSelection) { public static GameOpenProcedure open(GameOpenContext context) { @@ -44,23 +41,25 @@ public static GameOpenProcedure open(GameOpenContext context) { TeamSelectionLobby teamSelection = TeamSelectionLobby.addTo(activity, config.teamConfig()); TowersWaiting waiting = new TowersWaiting(activity.getGameSpace(), world, map, context.config(), teamSelection); - activity.setRule(GameRuleType.INTERACTION, ActionResult.FAIL); + activity.setRule(GameRuleType.INTERACTION, EventResult.DENY); activity.listen(GameActivityEvents.ENABLE, waiting::enable); - activity.listen(GamePlayerEvents.OFFER, waiting::offerPlayer); + activity.listen(GamePlayerEvents.ACCEPT, waiting::offerPlayer); activity.listen(GameActivityEvents.REQUEST_START, waiting::requestStart); - activity.listen(PlayerDamageEvent.EVENT, (player, source, amount) -> ActionResult.FAIL); + activity.listen(PlayerDamageEvent.EVENT, (player, source, amount) -> EventResult.DENY); activity.listen(PlayerDeathEvent.EVENT, waiting::killPlayer); - activity.listen(PlayerAttackEntityEvent.EVENT, (attacker, hand, attacked, hitResult) -> ActionResult.FAIL); + activity.listen(PlayerAttackEntityEvent.EVENT, (attacker, hand, attacked, hitResult) -> EventResult.DENY); }); } private void enable() { + var gameName = this.gameSpace.getMetadata().sourceConfig().value().name(); + if(gameName == null) gameName = Text.of("The Towers"); Text[] GUIDE_LINES = { - this.gameSpace.getMetadata().sourceConfig().name().copy().formatted(Formatting.BOLD, Formatting.GOLD), + gameName.copy().formatted(Formatting.BOLD, Formatting.GOLD), Text.translatable("text.the_towers.guide.craft_stuff").formatted(Formatting.YELLOW), Text.translatable("text.the_towers.guide.jumping_into_pool").formatted(Formatting.YELLOW), Text.translatable("text.the_towers.guide.protect_your_pool").formatted(Formatting.YELLOW), @@ -68,9 +67,10 @@ private void enable() { Vec3d pos = this.map.rules(); this.world.getChunk(BlockPos.ofFloored(pos)); - WorldHologram hologram = Holograms.create(this.world, pos, GUIDE_LINES); - hologram.setAlignment(AbstractHologram.VerticalAlign.TOP); - hologram.show(); + //TODO +// WorldHologram hologram = Holograms.create(this.world, pos, GUIDE_LINES); +// hologram.setAlignment(AbstractHologram.VerticalAlign.TOP); +// hologram.show(); } private GameResult requestStart() { @@ -78,23 +78,22 @@ private GameResult requestStart() { return GameResult.ok(); } - private PlayerOfferResult offerPlayer(PlayerOffer offer) { - return offer.accept(this.world, this.map.spawn()).and(() -> { - ServerPlayerEntity player = offer.player(); - player.changeGameMode(GameMode.ADVENTURE); + private JoinAcceptorResult offerPlayer(JoinAcceptor acceptor) { + return acceptor.teleport(this.world, this.map.spawn()).thenRun((players) -> { + players.forEach((player) -> { + player.changeGameMode(GameMode.ADVENTURE); + }); }); } - private ActionResult killPlayer(ServerPlayerEntity player, DamageSource source) { + private EventResult killPlayer(ServerPlayerEntity player, DamageSource source) { player.setHealth(20.0f); this.tpPlayer(player); - return ActionResult.FAIL; + return EventResult.DENY; } private void tpPlayer(ServerPlayerEntity player) { var pos = this.map.spawn(); - ChunkPos chunkPos = new ChunkPos((int) pos.getX() >> 4, (int) pos.getZ() >> 4); - this.world.getChunkManager().addTicket(ChunkTicketType.POST_TELEPORT, chunkPos, 1, player.getId()); - player.teleport(this.world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 0.0F, 0.0F); + player.teleport(this.world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, Set.of(), 0.0F, 0.0F, false); } } diff --git a/src/main/java/com/hugman/the_towers/map/Generator.java b/src/main/java/com/hugman/the_towers/map/Generator.java index c32321d..fe16f59 100644 --- a/src/main/java/com/hugman/the_towers/map/Generator.java +++ b/src/main/java/com/hugman/the_towers/map/Generator.java @@ -11,8 +11,8 @@ import net.minecraft.text.Text; import net.minecraft.util.math.Vec3d; import xyz.nucleoid.map_templates.TemplateRegion; -import xyz.nucleoid.plasmid.game.GameOpenContext; -import xyz.nucleoid.plasmid.game.GameOpenException; +import xyz.nucleoid.plasmid.api.game.GameOpenContext; +import xyz.nucleoid.plasmid.api.game.GameOpenException; public record Generator(GeneratorConfig type, Vec3d pos) { public static final String CONFIG_KEY = "Type"; // we should use something else diff --git a/src/main/java/com/hugman/the_towers/map/TeamRegion.java b/src/main/java/com/hugman/the_towers/map/TeamRegion.java index 5fcd0b3..8c348bb 100644 --- a/src/main/java/com/hugman/the_towers/map/TeamRegion.java +++ b/src/main/java/com/hugman/the_towers/map/TeamRegion.java @@ -6,8 +6,8 @@ import xyz.nucleoid.map_templates.BlockBounds; import xyz.nucleoid.map_templates.MapTemplateMetadata; import xyz.nucleoid.map_templates.TemplateRegion; -import xyz.nucleoid.plasmid.game.GameOpenException; -import xyz.nucleoid.plasmid.game.common.team.GameTeamKey; +import xyz.nucleoid.plasmid.api.game.GameOpenException; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeamKey; import java.util.Objects; diff --git a/src/main/java/com/hugman/the_towers/map/TowersMap.java b/src/main/java/com/hugman/the_towers/map/TowersMap.java index a2c8f57..eb33f01 100644 --- a/src/main/java/com/hugman/the_towers/map/TowersMap.java +++ b/src/main/java/com/hugman/the_towers/map/TowersMap.java @@ -8,10 +8,10 @@ import xyz.nucleoid.map_templates.MapTemplate; import xyz.nucleoid.map_templates.MapTemplateMetadata; import xyz.nucleoid.map_templates.TemplateRegion; -import xyz.nucleoid.plasmid.game.GameOpenContext; -import xyz.nucleoid.plasmid.game.common.team.GameTeam; -import xyz.nucleoid.plasmid.game.common.team.GameTeamKey; -import xyz.nucleoid.plasmid.game.world.generator.TemplateChunkGenerator; +import xyz.nucleoid.plasmid.api.game.GameOpenContext; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeam; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeamKey; +import xyz.nucleoid.plasmid.api.game.world.generator.TemplateChunkGenerator; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/main/java/com/hugman/the_towers/map/TowersMapGenerator.java b/src/main/java/com/hugman/the_towers/map/TowersMapGenerator.java index 6b89e69..cb7ca50 100644 --- a/src/main/java/com/hugman/the_towers/map/TowersMapGenerator.java +++ b/src/main/java/com/hugman/the_towers/map/TowersMapGenerator.java @@ -4,8 +4,8 @@ import net.minecraft.text.Text; import xyz.nucleoid.map_templates.MapTemplate; import xyz.nucleoid.map_templates.MapTemplateSerializer; -import xyz.nucleoid.plasmid.game.GameOpenContext; -import xyz.nucleoid.plasmid.game.GameOpenException; +import xyz.nucleoid.plasmid.api.game.GameOpenContext; +import xyz.nucleoid.plasmid.api.game.GameOpenException; import java.io.IOException; diff --git a/src/main/resources/data/the_towers/games/classic/four_teams.json b/src/main/resources/data/the_towers/games/classic/four_teams.json deleted file mode 100644 index c0ed591..0000000 --- a/src/main/resources/data/the_towers/games/classic/four_teams.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "type": "the_towers:standard", - "translation": "game.the_towers.classic.four_teams", - "map": "the_towers:classic/four_teams", - "players": { - "min": 1, - "threshold": 16, - "max": 32 - }, - "teams": [ - { - "key": "blue", - "name": { - "translate": "color.minecraft.blue" - }, - "color": "blue" - }, - { - "key": "green", - "name": { - "translate": "color.minecraft.green" - }, - "color": "lime" - }, - { - "key": "yellow", - "name": { - "translate": "color.minecraft.yellow" - }, - "color": "yellow" - }, - { - "key": "red", - "name": { - "translate": "color.minecraft.red" - }, - "color": "red" - } - ], - "max_health": 5, - "health_stealth": false -} diff --git a/src/main/resources/data/the_towers/games/classic/two_teams.json b/src/main/resources/data/the_towers/games/classic/two_teams.json deleted file mode 100644 index 0a2acdc..0000000 --- a/src/main/resources/data/the_towers/games/classic/two_teams.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "type": "the_towers:standard", - "translation": "game.the_towers.classic.two_teams", - "map": "the_towers:classic/two_teams", - "players": { - "min": 1, - "threshold": 8, - "max": 16 - }, - "teams": [ - { - "key": "blue", - "name": { - "translate": "color.minecraft.blue" - }, - "color": "blue" - }, - { - "key": "red", - "name": { - "translate": "color.minecraft.red" - }, - "color": "red" - } - ], - "max_health": 10, - "health_stealth": false -} diff --git a/src/main/resources/data/the_towers/map_templates/classic/four_teams.nbt b/src/main/resources/data/the_towers/map_template/classic/four_teams.nbt similarity index 100% rename from src/main/resources/data/the_towers/map_templates/classic/four_teams.nbt rename to src/main/resources/data/the_towers/map_template/classic/four_teams.nbt diff --git a/src/main/resources/data/the_towers/map_templates/classic/two_teams.nbt b/src/main/resources/data/the_towers/map_template/classic/two_teams.nbt similarity index 100% rename from src/main/resources/data/the_towers/map_templates/classic/two_teams.nbt rename to src/main/resources/data/the_towers/map_template/classic/two_teams.nbt diff --git a/src/main/resources/data/the_towers/plasmid/game/classic/four_teams.json b/src/main/resources/data/the_towers/plasmid/game/classic/four_teams.json new file mode 100644 index 0000000..fddcaaf --- /dev/null +++ b/src/main/resources/data/the_towers/plasmid/game/classic/four_teams.json @@ -0,0 +1,44 @@ +{ + "type": "the_towers:standard", + "name": { + "translate": "game.the_towers.classic.four_teams" + }, + "map": "the_towers:classic/four_teams", + "players": { + "min": 1, + "threshold": 16, + "max": 32 + }, + "teams": [ + { + "key": "blue", + "name": { + "translate": "color.minecraft.blue" + }, + "color": "blue" + }, + { + "key": "green", + "name": { + "translate": "color.minecraft.green" + }, + "color": "lime" + }, + { + "key": "yellow", + "name": { + "translate": "color.minecraft.yellow" + }, + "color": "yellow" + }, + { + "key": "red", + "name": { + "translate": "color.minecraft.red" + }, + "color": "red" + } + ], + "max_health": 5, + "health_stealth": false +} diff --git a/src/main/resources/data/the_towers/plasmid/game/classic/two_teams.json b/src/main/resources/data/the_towers/plasmid/game/classic/two_teams.json new file mode 100644 index 0000000..19b43d9 --- /dev/null +++ b/src/main/resources/data/the_towers/plasmid/game/classic/two_teams.json @@ -0,0 +1,30 @@ +{ + "type": "the_towers:standard", + "name": { + "translate": "game.the_towers.classic.two_teams" + }, + "map": "the_towers:classic/two_teams", + "players": { + "min": 1, + "threshold": 8, + "max": 16 + }, + "teams": [ + { + "key": "blue", + "name": { + "translate": "color.minecraft.blue" + }, + "color": "blue" + }, + { + "key": "red", + "name": { + "translate": "color.minecraft.red" + }, + "color": "red" + } + ], + "max_health": 10, + "health_stealth": false +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index c807698..6224ebd 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -16,11 +16,11 @@ ] }, "depends": { - "java": ">=17", - "minecraft": ">=1.20", + "java": ">=21", + "minecraft": ">=1.21", "fabricloader": ">=0.9.1", "fabric-api": ">=0.86.1", - "plasmid": "0.5.x" + "plasmid": "0.6.x" }, "custom": { "mc-publish": { From 8e97e059d354df801b429bd35c1c3c0491f5df84 Mon Sep 17 00:00:00 2001 From: Patbox <39821509+Patbox@users.noreply.github.com> Date: Mon, 9 Dec 2024 23:00:49 +0100 Subject: [PATCH 2/6] Fix build --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bb4902f..e898039 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,7 +31,7 @@ jobs: - name: Build with Gradle run: ./gradlew build - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 with: name: artifacts path: build/libs \ No newline at end of file From 30267d38d174d5d6fa5aea05a7a3a9cbb795b643 Mon Sep 17 00:00:00 2001 From: Hugman Date: Wed, 18 Dec 2024 11:24:23 +0100 Subject: [PATCH 3/6] Fix small issues --- .../com/hugman/the_towers/game/TowersActive.java | 1 + .../com/hugman/the_towers/game/TowersSidebar.java | 4 ++-- .../java/com/hugman/the_towers/map/TeamRegion.java | 3 ++- .../java/com/hugman/the_towers/map/TowersMap.java | 12 +++++++++--- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/hugman/the_towers/game/TowersActive.java b/src/main/java/com/hugman/the_towers/game/TowersActive.java index 251831d..39f05f2 100644 --- a/src/main/java/com/hugman/the_towers/game/TowersActive.java +++ b/src/main/java/com/hugman/the_towers/game/TowersActive.java @@ -1,5 +1,6 @@ package com.hugman.the_towers.game; +import com.hugman.the_towers.TheTowers; import com.hugman.the_towers.config.TowersConfig; import com.hugman.the_towers.map.TeamRegion; import com.hugman.the_towers.map.TowersMap; diff --git a/src/main/java/com/hugman/the_towers/game/TowersSidebar.java b/src/main/java/com/hugman/the_towers/game/TowersSidebar.java index 9f47c04..4d3f5c3 100644 --- a/src/main/java/com/hugman/the_towers/game/TowersSidebar.java +++ b/src/main/java/com/hugman/the_towers/game/TowersSidebar.java @@ -30,12 +30,12 @@ public void update(long time, long nextRefillTick, Object2ObjectMap { MutableText text = Text.literal(""); if (team.health > 0) { - text.append(gameTeam.config().name().copyContentOnly().formatted(Formatting.BOLD)) + text.append(gameTeam.config().name().copy().formatted(Formatting.BOLD)) .append(Text.literal(" " + FormattingUtil.GENERAL_SYMBOL + " ").formatted(Formatting.GRAY)) .append(Text.literal(String.valueOf(team.health)).formatted(Formatting.WHITE)) .append(Text.literal(FormattingUtil.HEALTH_SYMBOL).formatted(Formatting.GREEN)); } else { - text.append(gameTeam.config().name().copyContentOnly().formatted(Formatting.DARK_GRAY, Formatting.BOLD)) + text.append(gameTeam.config().name().copy().formatted(Formatting.DARK_GRAY, Formatting.BOLD)) .append(Text.literal(" " + FormattingUtil.GENERAL_SYMBOL + " ").formatted(Formatting.GRAY)) .append(Text.literal(FormattingUtil.X_SYMBOL).formatted(Formatting.DARK_GRAY)); } diff --git a/src/main/java/com/hugman/the_towers/map/TeamRegion.java b/src/main/java/com/hugman/the_towers/map/TeamRegion.java index 8c348bb..0764832 100644 --- a/src/main/java/com/hugman/the_towers/map/TeamRegion.java +++ b/src/main/java/com/hugman/the_towers/map/TeamRegion.java @@ -1,5 +1,6 @@ package com.hugman.the_towers.map; +import com.hugman.the_towers.TheTowers; import it.unimi.dsi.fastutil.longs.LongArraySet; import it.unimi.dsi.fastutil.longs.LongSet; import net.minecraft.text.Text; @@ -28,7 +29,7 @@ public static TeamRegion fromTemplate(GameTeamKey teamKey, MapTemplateMetadata m BlockBounds pool = Objects.requireNonNull(poolRegion).getBounds(); LongSet domains = new LongArraySet(); - metadata.getRegionBounds(teamKey + "_domain").forEach(blockPos -> blockPos.forEach(pos -> domains.add(pos.asLong()))); + metadata.getRegionBounds(teamKey.id() + "_domain").forEach(blockPos -> blockPos.forEach(pos -> domains.add(pos.asLong()))); return new TeamRegion(spawn, pool, domains, spawnYaw, spawnPitch); } catch (NullPointerException e) { diff --git a/src/main/java/com/hugman/the_towers/map/TowersMap.java b/src/main/java/com/hugman/the_towers/map/TowersMap.java index eb33f01..9290bb2 100644 --- a/src/main/java/com/hugman/the_towers/map/TowersMap.java +++ b/src/main/java/com/hugman/the_towers/map/TowersMap.java @@ -19,9 +19,15 @@ import java.util.Map; import java.util.stream.Collectors; -public record TowersMap(MapTemplate template, Vec3d spawn, Vec3d rules, List protectedBounds, - List generators, Map teamRegions, - RuntimeWorldConfig worldConfig) { +public record TowersMap( + MapTemplate template, + Vec3d spawn, + Vec3d rules, + List protectedBounds, + List generators, + Map teamRegions, + RuntimeWorldConfig worldConfig +) { /** * Creates the map from a map template by reading its metadata. */ From fef8178363b8bce517fc1048b4e460af6d692c0b Mon Sep 17 00:00:00 2001 From: Hugman Date: Wed, 18 Dec 2024 11:26:03 +0100 Subject: [PATCH 4/6] Fix #9 --- src/main/java/com/hugman/the_towers/game/TowersActive.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hugman/the_towers/game/TowersActive.java b/src/main/java/com/hugman/the_towers/game/TowersActive.java index 39f05f2..0894f1f 100644 --- a/src/main/java/com/hugman/the_towers/game/TowersActive.java +++ b/src/main/java/com/hugman/the_towers/game/TowersActive.java @@ -303,7 +303,7 @@ private JoinAcceptorResult accept(JoinAcceptor acceptor) { GameTeamKey gameTeamKey = this.teamManager.teamFor(player); if (gameTeamKey instanceof GameTeamKey) { TeamData theTowersTeam = teamMap.get(gameTeamKey); - if (theTowersTeam.health > 0) { + if (theTowersTeam instanceof TeamData && theTowersTeam.health > 0) { player.changeGameMode(GameMode.SURVIVAL); this.resetPlayer(player); this.resetPlayerInventory(player); From 1ff3d075525a7fb745adaed45316f088fa5b3a10 Mon Sep 17 00:00:00 2001 From: Hugman Date: Wed, 18 Dec 2024 11:28:09 +0100 Subject: [PATCH 5/6] Fix #13 --- src/main/java/com/hugman/the_towers/game/TowersActive.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/hugman/the_towers/game/TowersActive.java b/src/main/java/com/hugman/the_towers/game/TowersActive.java index 0894f1f..addcadc 100644 --- a/src/main/java/com/hugman/the_towers/game/TowersActive.java +++ b/src/main/java/com/hugman/the_towers/game/TowersActive.java @@ -120,6 +120,8 @@ public static void enable(GameSpace gameSpace, ServerWorld world, TowersMap map, TowersSidebar sidebar = TowersSidebar.create(widgets, gameSpace); TowersActive active = new TowersActive(gameSpace, activity, world, map, config, sidebar, teamSelection); + TeamChat.addTo(activity, active.teamManager); + activity.allow(GameRuleType.CRAFTING); activity.deny(GameRuleType.PORTALS); activity.allow(GameRuleType.PVP); From 83a63858d32b27b797ee66719a9eb6a741073fa8 Mon Sep 17 00:00:00 2001 From: Hugman Date: Wed, 18 Dec 2024 15:21:22 +0100 Subject: [PATCH 6/6] Fix #14 and #9 --- .../hugman/the_towers/game/TowersActive.java | 83 +++++++++++-------- .../hugman/the_towers/game/TowersSidebar.java | 11 +-- 2 files changed, 54 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/hugman/the_towers/game/TowersActive.java b/src/main/java/com/hugman/the_towers/game/TowersActive.java index addcadc..2af17b8 100644 --- a/src/main/java/com/hugman/the_towers/game/TowersActive.java +++ b/src/main/java/com/hugman/the_towers/game/TowersActive.java @@ -70,7 +70,7 @@ public class TowersActive { private final TowersMap map; private Object2ObjectMap participantMap; - private Object2ObjectMap teamMap; + private Object2ObjectMap teamMap; private TeamManager teamManager; private final TowersSidebar sidebar; @@ -104,7 +104,7 @@ private void fillTeams(TeamSelectionLobby teamSelection) { .setCollision(AbstractTeam.CollisionRule.PUSH_OTHER_TEAMS) .build()); this.teamManager.addTeam(team); - this.teamMap.put(team, new TeamData(this.config.maxHealth())); + this.teamMap.put(team.key(), new TeamData(this.config.maxHealth())); } teamSelection.allocate(this.gameSpace.getPlayers(), (gameTeam, player) -> { @@ -161,8 +161,8 @@ private void enable() { for (Text text : GUIDE_LINES) { this.gameSpace.getPlayers().sendMessage(text); } - this.teamMap.keySet().forEach(gameTeam -> { - this.teamManager.playersIn(gameTeam.key()).forEach(player -> { + this.teamMap.keySet().forEach(teamKey -> { + this.teamManager.playersIn(teamKey).forEach(player -> { if (player != null) { player.changeGameMode(GameMode.SURVIVAL); this.resetPlayer(player); @@ -189,13 +189,13 @@ private void tick() { if (!hasEnded) { this.map.generators().forEach(generator -> generator.tick(world, this.gameTick)); - this.teamMap.keySet().forEach(team -> { - TeamData teamData = this.teamMap.get(team); - BlockBounds pool = this.map.teamRegions().get(team.key()).pool(); + this.teamMap.keySet().forEach(teamKey -> { + TeamData teamData = this.teamMap.get(teamKey); + BlockBounds pool = this.map.teamRegions().get(teamKey).pool(); if (this.gameTick % 60 == 0) { pool.iterator().forEachRemaining(pos -> world.spawnParticles(ParticleTypes.END_ROD, pos.getX() + 0.5D, pos.getY() + 1.0D, pos.getZ() + 0.5D, 2, 0.25D, 0.0D, 0.25D, 0.0D)); } - this.teamManager.playersIn(team.key()).forEach(player -> { + this.teamManager.playersIn(teamKey).forEach(player -> { TowersParticipant participant = this.participantMap.get(player); if (player != null) { if (participant.ticksUntilRespawn >= 0 && teamData.health > 0) { @@ -214,20 +214,22 @@ private void tick() { } // Check for players in pools. - this.teamMap.keySet().forEach(enemyTeam -> { - TeamData enemyTeamData = this.teamMap.get(enemyTeam); - if (team != enemyTeam && enemyTeamData.health > 0) { - TeamRegion enemyRegion = this.map.teamRegions().get(enemyTeam.key()); + this.teamMap.keySet().forEach(enemyTeamKey -> { + TeamData enemyTeamData = this.teamMap.get(enemyTeamKey); + if (teamKey != enemyTeamKey && enemyTeamData.health > 0) { + TeamRegion enemyRegion = this.map.teamRegions().get(enemyTeamKey); if (enemyRegion.pool().contains(player.getBlockPos()) && player.interactionManager.isSurvivalLike()) { // The player is in an enemy's pool. They make them lose a point and steal them if the configuration allows it. this.spawnPlayerAtTheirSpawn(player); enemyTeamData.health--; if (this.config.healthStealth()) { - Text msg = FormattingUtil.format(FormattingUtil.GENERAL_SYMBOL, FormattingUtil.GENERAL_STYLE, Text.translatable("text.the_towers.health_stole", player.getName(), enemyTeam.config().name())); + var config = this.teamManager.getTeamConfig(teamKey); + Text msg = FormattingUtil.format(FormattingUtil.GENERAL_SYMBOL, FormattingUtil.GENERAL_STYLE, Text.translatable("text.the_towers.health_stole", player.getName(), config.name())); this.gameSpace.getPlayers().sendMessage(msg); teamData.health++; } else { - Text msg = FormattingUtil.format(FormattingUtil.GENERAL_SYMBOL, FormattingUtil.GENERAL_STYLE, Text.translatable("text.the_towers.health_removed", player.getName(), enemyTeam.config().name())); + var config = this.teamManager.getTeamConfig(teamKey); + Text msg = FormattingUtil.format(FormattingUtil.GENERAL_SYMBOL, FormattingUtil.GENERAL_STYLE, Text.translatable("text.the_towers.health_removed", player.getName(), config.name())); this.gameSpace.getPlayers().sendMessage(msg); } this.gameSpace.getPlayers().playSound(SoundEvents.ENTITY_BLAZE_HURT); @@ -239,7 +241,7 @@ private void tick() { }); }); if (this.gameTick % 20 == 0) { - this.sidebar.update(this.gameTick, this.nextRefillTick, this.teamMap); + this.sidebar.update(this.gameTick, this.nextRefillTick, this.teamManager, this.teamMap); } } @@ -257,25 +259,27 @@ private void checkWin() { this.gameSpace.getPlayers().sendMessage(Text.literal("\n").append(msg).append("\n")); this.hasEnded = true; } - this.teamMap.forEach((team, teamData) -> { + this.teamMap.forEach((teamKey, teamData) -> { if (teamData.health == 0) { // The selected team has not enough health to be alive. They are eliminated. teamData.health = -1; - this.teamManager.playersIn(team.key()).forEach(player -> { + this.teamManager.playersIn(teamKey).forEach(player -> { if (player != null) { player.changeGameMode(GameMode.SPECTATOR); this.resetPlayer(player); } }); - Text msg = FormattingUtil.format(FormattingUtil.X_SYMBOL, FormattingUtil.GENERAL_STYLE, Text.translatable("text.the_towers.team_eliminated", team.config().name())); + var config = this.teamManager.getTeamConfig(teamKey); + Text msg = FormattingUtil.format(FormattingUtil.X_SYMBOL, FormattingUtil.GENERAL_STYLE, Text.translatable("text.the_towers.team_eliminated", config.name())); this.gameSpace.getPlayers().sendMessage(Text.literal("\n").append(msg).append("\n")); this.gameSpace.getPlayers().playSound(SoundEvents.ENTITY_FIREWORK_ROCKET_BLAST); } }); - this.teamMap.forEach((gameTeam, team) -> { + this.teamMap.forEach((teamKey, team) -> { if (aliveCount == 1 && team.health > 0) { // The selected team is the only team left that is alive. They win. - Text msg = FormattingUtil.format(FormattingUtil.STAR_SYMBOL, FormattingUtil.GENERAL_STYLE, Text.translatable("text.the_towers.team_won", gameTeam.config().name())); + var config = this.teamManager.getTeamConfig(teamKey); + Text msg = FormattingUtil.format(FormattingUtil.STAR_SYMBOL, FormattingUtil.GENERAL_STYLE, Text.translatable("text.the_towers.team_won", config.name())); this.gameSpace.getPlayers().sendMessage(Text.literal("\n").append(msg).append("\n")); this.gameSpace.getPlayers().playSound(SoundEvents.UI_TOAST_CHALLENGE_COMPLETE); this.hasEnded = true; @@ -286,9 +290,11 @@ private void checkWin() { if (this.hasEnded) { this.gameCloseTick = world.getTime() + 600; this.participantMap.keySet().forEach(player -> { - player.changeGameMode(GameMode.SPECTATOR); - this.resetPlayer(player); - this.sidebar.update(this.gameTick, this.nextRefillTick, this.teamMap); + if(this.gameSpace.getPlayers().contains(player)) { + player.changeGameMode(GameMode.SPECTATOR); + this.resetPlayer(player); + this.sidebar.update(this.gameTick, this.nextRefillTick, this.teamManager, this.teamMap); + } }); } } @@ -304,7 +310,11 @@ private JoinAcceptorResult accept(JoinAcceptor acceptor) { }).thenRunForEach(player -> { GameTeamKey gameTeamKey = this.teamManager.teamFor(player); if (gameTeamKey instanceof GameTeamKey) { - TeamData theTowersTeam = teamMap.get(gameTeamKey); + GameTeam gameTeam = this.config.teamConfig().byKey(this.teamManager.teamFor(player)); + TeamData theTowersTeam = teamMap.get(gameTeam); + TheTowers.LOGGER.info(gameTeam); + TheTowers.LOGGER.info(teamMap); + TheTowers.LOGGER.info(theTowersTeam); if (theTowersTeam instanceof TeamData && theTowersTeam.health > 0) { player.changeGameMode(GameMode.SURVIVAL); this.resetPlayer(player); @@ -377,6 +387,9 @@ private EventResult dropItem(PlayerEntity player, int i, ItemStack stack) { private EventResult killPlayer(ServerPlayerEntity player, DamageSource source) { TowersParticipant participant = this.participantMap.get(player); + if(!this.gameSpace.getPlayers().contains(player)) { + return EventResult.PASS; + } if (participant == null) { this.spawnPlayerAtCenter(player); } else { @@ -412,9 +425,9 @@ private EventResult placeBlock(ServerPlayerEntity playerEntity, ServerWorld worl return EventResult.DENY; } } - for (GameTeam team : this.teamMap.keySet()) { - if (team.key() != teamManager.teamFor(playerEntity)) { - if (this.map.teamRegions().get(team.key()).domains().contains(pos.asLong())) { + for (GameTeamKey teamKey : this.teamMap.keySet()) { + if (teamKey != teamManager.teamFor(playerEntity)) { + if (this.map.teamRegions().get(teamKey).domains().contains(pos.asLong())) { Text msg = FormattingUtil.format(FormattingUtil.GENERAL_SYMBOL, FormattingUtil.WARNING_STYLE, Text.translatable("text.the_towers.cannot_place")); playerEntity.sendMessage(msg, false); return EventResult.DENY; @@ -434,9 +447,9 @@ private ActionResult useBlock(ServerPlayerEntity playerEntity, Hand hand, BlockH return ActionResult.FAIL; } } - for (GameTeam team : this.teamMap.keySet()) { - if (team.key() != teamManager.teamFor(playerEntity)) { - if (this.map.teamRegions().get(team.key()).domains().contains(pos.asLong())) { + for (GameTeamKey teamKey : this.teamMap.keySet()) { + if (teamKey != teamManager.teamFor(playerEntity)) { + if (this.map.teamRegions().get(teamKey).domains().contains(pos.asLong())) { Text msg = FormattingUtil.format(FormattingUtil.GENERAL_SYMBOL, FormattingUtil.WARNING_STYLE, Text.translatable("text.the_towers.cannot_use")); playerEntity.sendMessage(msg, false); return ActionResult.FAIL; @@ -454,9 +467,9 @@ private EventResult breakBlock(ServerPlayerEntity playerEntity, ServerWorld worl return EventResult.DENY; } } - for (GameTeam team : this.teamMap.keySet()) { - if (team.key() != teamManager.teamFor(playerEntity)) { - if (this.map.teamRegions().get(team.key()).domains().contains(pos.asLong())) { + for (GameTeamKey teamKey : this.teamMap.keySet()) { + if (teamKey != teamManager.teamFor(playerEntity)) { + if (this.map.teamRegions().get(teamKey).domains().contains(pos.asLong())) { Text msg = FormattingUtil.format(FormattingUtil.GENERAL_SYMBOL, FormattingUtil.WARNING_STYLE, Text.translatable("text.the_towers.cannot_break")); playerEntity.sendMessage(msg, false); return EventResult.DENY; @@ -477,8 +490,8 @@ private boolean canStackBeDropped(ItemStack stack) { } private void refill() { - for (GameTeam team : this.teamMap.keySet()) { - this.map.teamRegions().get(team.key()).domains().stream().iterator().forEachRemaining(aLong -> { + for (GameTeamKey teamKey : this.teamMap.keySet()) { + this.map.teamRegions().get(teamKey).domains().stream().iterator().forEachRemaining(aLong -> { BlockPos pos = BlockPos.fromLong(aLong); BlockState state = this.map.template().getBlockState(pos); diff --git a/src/main/java/com/hugman/the_towers/game/TowersSidebar.java b/src/main/java/com/hugman/the_towers/game/TowersSidebar.java index 4d3f5c3..023c60a 100644 --- a/src/main/java/com/hugman/the_towers/game/TowersSidebar.java +++ b/src/main/java/com/hugman/the_towers/game/TowersSidebar.java @@ -8,7 +8,8 @@ import net.minecraft.util.Formatting; import xyz.nucleoid.plasmid.api.game.GameSpace; import xyz.nucleoid.plasmid.api.game.common.GlobalWidgets; -import xyz.nucleoid.plasmid.api.game.common.team.GameTeam; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeamKey; +import xyz.nucleoid.plasmid.api.game.common.team.TeamManager; import xyz.nucleoid.plasmid.api.game.common.widget.SidebarWidget; public record TowersSidebar(SidebarWidget sidebarWidget) { @@ -24,18 +25,18 @@ public static TowersSidebar create(GlobalWidgets widgets, GameSpace gameSpace) { * @param time the game's time in ticks * @param teamMap the map of team */ - public void update(long time, long nextRefillTick, Object2ObjectMap teamMap) { + public void update(long time, long nextRefillTick, TeamManager teamManager, Object2ObjectMap teamMap) { sidebarWidget.set(content -> { content.add(Text.literal("")); - teamMap.forEach((gameTeam, team) -> { + teamMap.forEach((teamKey, team) -> { MutableText text = Text.literal(""); if (team.health > 0) { - text.append(gameTeam.config().name().copy().formatted(Formatting.BOLD)) + text.append(teamManager.getTeamConfig(teamKey).name().copy().formatted(Formatting.BOLD)) .append(Text.literal(" " + FormattingUtil.GENERAL_SYMBOL + " ").formatted(Formatting.GRAY)) .append(Text.literal(String.valueOf(team.health)).formatted(Formatting.WHITE)) .append(Text.literal(FormattingUtil.HEALTH_SYMBOL).formatted(Formatting.GREEN)); } else { - text.append(gameTeam.config().name().copy().formatted(Formatting.DARK_GRAY, Formatting.BOLD)) + text.append(teamManager.getTeamConfig(teamKey).name().copy().formatted(Formatting.DARK_GRAY, Formatting.BOLD)) .append(Text.literal(" " + FormattingUtil.GENERAL_SYMBOL + " ").formatted(Formatting.GRAY)) .append(Text.literal(FormattingUtil.X_SYMBOL).formatted(Formatting.DARK_GRAY)); }