From 327b057a8f2dc674edec69c8f6d2d56c83d6c43e Mon Sep 17 00:00:00 2001 From: Patbox Date: Fri, 8 Nov 2024 15:59:24 +0100 Subject: [PATCH] Update to 1.21.3 --- .github/workflows/build.yml | 4 +- .github/workflows/release.yml | 4 +- build.gradle | 10 +- gradle.properties | 10 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../java/eu/pb4/destroythemonument/DTM.java | 15 +- .../destroythemonument/blocks/DtmBlocks.java | 18 ++- .../blocks/FloatingLadderBlock.java | 8 +- .../blocks/WeakGlassBlock.java | 5 +- .../entities/DtmEntities.java | 14 +- .../entities/DtmTntEntity.java | 90 +++++++----- .../game/DtmStatistics.java | 4 +- .../destroythemonument/game/GameConfig.java | 11 +- .../destroythemonument/game/MapRenderer.java | 45 ++++-- .../destroythemonument/game/SpawnLogic.java | 10 +- .../eu/pb4/destroythemonument/game/Teams.java | 8 +- .../destroythemonument/game/WaitingLobby.java | 32 ++--- .../game/data/TeamData.java | 6 +- .../game/logic/BaseGameLogic.java | 128 +++++++++--------- .../game/logic/CaptureGameLogic.java | 17 +-- .../game/logic/DebugGameLogic.java | 8 +- .../game/logic/StandardGameLogic.java | 20 +-- .../destroythemonument/game/map/GameMap.java | 2 +- .../game/map/GeneratedGameMap.java | 2 +- .../game/map/TemplateGameMap.java | 4 +- .../game/map/generator/DtmChunkGenerator.java | 4 +- .../generator/TemplateWithLayerGenerator.java | 6 +- .../game/playerclass/ClassRegistry.java | 12 +- .../game/playerclass/PlayerClass.java | 36 +++-- .../destroythemonument/items/DtmItems.java | 36 ++--- .../destroythemonument/items/DtmMapItem.java | 19 ++- .../destroythemonument/items/DtmTntItem.java | 28 ++-- .../destroythemonument/items/GenericItem.java | 69 ---------- .../items/MultiBlockItem.java | 43 +++--- .../mixin/AttributeContainerMixin.java | 4 +- .../pb4/destroythemonument/other/DtmUtil.java | 9 +- .../ui/BlockSelectorUI.java | 4 +- .../destroythemonument/ui/ClassPreviewUI.java | 8 +- .../ui/ClassSelectorUI.java | 8 +- .../class_dtm/archer.json | 19 ++- .../class_dtm/berserker.json | 6 +- .../class_dtm/constructor.json | 6 +- .../destroy_the_monument/class_dtm/tank.json | 8 +- .../class_dtm/warrior.json | 17 +-- .../{map_templates => map_template}/cubes.nbt | Bin .../cubes2.nbt | Bin .../dimensions.nbt | Bin .../forest4.nbt | Bin .../{map_templates => map_template}/honey.nbt | Bin .../{map_templates => map_template}/kuber.nbt | Bin .../{map_templates => map_template}/kupol.nbt | Bin .../{map_templates => map_template}/mine.nbt | Bin .../{games => plasmid/game}/concrete.json | 6 +- .../{games => plasmid/game}/cubes.json | 0 .../{games => plasmid/game}/dimensions.json | 0 .../{games => plasmid/game}/forest4.json | 0 .../{games => plasmid/game}/honey.json | 0 .../{games => plasmid/game}/kuber.json | 0 .../{games => plasmid/game}/kupol.json | 0 .../{games => plasmid/game}/kupol_duels.json | 0 .../{games => plasmid/game}/mine.json | 0 .../{games => plasmid/game}/x_debug.json | 3 +- .../game}/x_debug_capture.json | 0 .../game}/x_debug_cubes2.json | 0 .../game}/x_forest4debug.json | 0 .../{blocks => block}/building_blocks.json | 0 .../tags/{blocks => block}/spawnable.json | 0 .../tags/{blocks => block}/mineable/axe.json | 0 .../resources/destroythemonument.mixins.json | 2 +- src/main/resources/fabric.mod.json | 2 +- 70 files changed, 418 insertions(+), 414 deletions(-) delete mode 100644 src/main/java/eu/pb4/destroythemonument/items/GenericItem.java rename src/main/resources/data/destroy_the_monument/{map_templates => map_template}/cubes.nbt (100%) rename src/main/resources/data/destroy_the_monument/{map_templates => map_template}/cubes2.nbt (100%) rename src/main/resources/data/destroy_the_monument/{map_templates => map_template}/dimensions.nbt (100%) rename src/main/resources/data/destroy_the_monument/{map_templates => map_template}/forest4.nbt (100%) rename src/main/resources/data/destroy_the_monument/{map_templates => map_template}/honey.nbt (100%) rename src/main/resources/data/destroy_the_monument/{map_templates => map_template}/kuber.nbt (100%) rename src/main/resources/data/destroy_the_monument/{map_templates => map_template}/kupol.nbt (100%) rename src/main/resources/data/destroy_the_monument/{map_templates => map_template}/mine.nbt (100%) rename src/main/resources/data/destroy_the_monument/{games => plasmid/game}/concrete.json (89%) rename src/main/resources/data/destroy_the_monument/{games => plasmid/game}/cubes.json (100%) rename src/main/resources/data/destroy_the_monument/{games => plasmid/game}/dimensions.json (100%) rename src/main/resources/data/destroy_the_monument/{games => plasmid/game}/forest4.json (100%) rename src/main/resources/data/destroy_the_monument/{games => plasmid/game}/honey.json (100%) rename src/main/resources/data/destroy_the_monument/{games => plasmid/game}/kuber.json (100%) rename src/main/resources/data/destroy_the_monument/{games => plasmid/game}/kupol.json (100%) rename src/main/resources/data/destroy_the_monument/{games => plasmid/game}/kupol_duels.json (100%) rename src/main/resources/data/destroy_the_monument/{games => plasmid/game}/mine.json (100%) rename src/main/resources/data/destroy_the_monument/{games => plasmid/game}/x_debug.json (96%) rename src/main/resources/data/destroy_the_monument/{games => plasmid/game}/x_debug_capture.json (100%) rename src/main/resources/data/destroy_the_monument/{games => plasmid/game}/x_debug_cubes2.json (100%) rename src/main/resources/data/destroy_the_monument/{games => plasmid/game}/x_forest4debug.json (100%) rename src/main/resources/data/destroy_the_monument/tags/{blocks => block}/building_blocks.json (100%) rename src/main/resources/data/destroy_the_monument/tags/{blocks => block}/spawnable.json (100%) rename src/main/resources/data/minecraft/tags/{blocks => block}/mineable/axe.json (100%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dc6e263..f3652fe 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,7 +21,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 @@ -29,7 +29,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 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4802a9c..8e1e0e7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.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 @@ -32,7 +32,7 @@ jobs: run: ./gradlew build - name: Upload GitHub release - uses: AButler/upload-release-assets@v2.0 + uses: AButler/upload-release-assets@v3.0 with: files: 'build/libs/*.jar;!build/libs/*-sources.jar;!build/libs/*-dev.jar' repo-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/build.gradle b/build.gradle index 40ef77b..d9e44bc 100644 --- a/build.gradle +++ b/build.gradle @@ -1,10 +1,10 @@ plugins { - id 'fabric-loom' version '1.4.+' + id 'fabric-loom' version '1.7.+' id 'maven-publish' } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +sourceCompatibility = JavaVersion.VERSION_21 +targetCompatibility = JavaVersion.VERSION_21 archivesBaseName = project.archives_base_name version = project.mod_version @@ -28,7 +28,7 @@ dependencies { modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" // Plasmid - modImplementation "xyz.nucleoid:plasmid:0.5.102-SNAPSHOT+1.20.4" + modImplementation "xyz.nucleoid:plasmid:0.6.0-SNAPSHOT+1.21.3" //modImplementation "xyz.nucleoid:substrate:0.1.3" //implementation include('kdotjpg:open-simplex:2.0') } @@ -49,7 +49,7 @@ tasks.withType(JavaCompile).configureEach { it.options.encoding = "UTF-8" // Minecraft 1.17 (21w19a) upwards uses Java 16. - it.options.release = 17 + it.options.release = 21 } diff --git a/gradle.properties b/gradle.properties index 36164a9..141bc28 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,14 +3,14 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://modmuss50.me/fabric.html -minecraft_version=1.20.4 -yarn_mappings=1.20.4+build.1 -loader_version=0.15.2 +minecraft_version=1.21.3 +yarn_mappings=1.21.3+build.1 +loader_version=0.16.9 # Dependencies -fabric_version=0.91.1+1.20.4 +fabric_version=0.106.1+1.21.3 # Mod Properties -mod_version=1.0.5 +mod_version=1.1.0 maven_group=eu.pb4 archives_base_name=destroythemonument diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e411586..19cfad9 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.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/eu/pb4/destroythemonument/DTM.java b/src/main/java/eu/pb4/destroythemonument/DTM.java index 21c46bb..9faaf0f 100644 --- a/src/main/java/eu/pb4/destroythemonument/DTM.java +++ b/src/main/java/eu/pb4/destroythemonument/DTM.java @@ -15,8 +15,9 @@ import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.tag.TagKey; import net.minecraft.util.Util; -import xyz.nucleoid.plasmid.game.GameSpace; -import xyz.nucleoid.plasmid.game.GameType; +import xyz.nucleoid.plasmid.api.game.GameAttachment; +import xyz.nucleoid.plasmid.api.game.GameSpace; +import xyz.nucleoid.plasmid.api.game.GameType; import net.minecraft.util.Identifier; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -27,12 +28,14 @@ import java.util.Set; import java.util.WeakHashMap; +import static eu.pb4.destroythemonument.other.DtmUtil.id; + public class DTM implements ModInitializer { public static final String ID = "destroy_the_monument"; public static final Logger LOGGER = LogManager.getLogger(ID); public static final Random RANDOM = new Random(); - public static final TagKey SPAWNABLE_TAG = TagKey.of(RegistryKeys.BLOCK, DtmUtil.id("spawnable")); - public static final TagKey BUILDING_BLOCKS = TagKey.of(RegistryKeys.BLOCK, DtmUtil.id("building_blocks")); + public static final TagKey SPAWNABLE_TAG = TagKey.of(RegistryKeys.BLOCK, id("spawnable")); + public static final TagKey BUILDING_BLOCKS = TagKey.of(RegistryKeys.BLOCK, id("building_blocks")); private static final Hash.Strategy IDENTITY_HASH = new Hash.Strategy() { @Override @@ -51,12 +54,12 @@ public boolean equals(Object o, Object k1) { public static final GameType TYPE = GameType.register( - new Identifier(ID, ID), + Identifier.of(ID, ID), GameConfig.CODEC, WaitingLobby::open ); - public static final WeakHashMap ACTIVE_GAMES = new WeakHashMap<>(); + public static final GameAttachment GAME_LOGIC = GameAttachment.create(id("game_logic")); @Override public void onInitialize() { diff --git a/src/main/java/eu/pb4/destroythemonument/blocks/DtmBlocks.java b/src/main/java/eu/pb4/destroythemonument/blocks/DtmBlocks.java index 748c17f..41317d2 100644 --- a/src/main/java/eu/pb4/destroythemonument/blocks/DtmBlocks.java +++ b/src/main/java/eu/pb4/destroythemonument/blocks/DtmBlocks.java @@ -6,18 +6,24 @@ import net.minecraft.block.Blocks; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; + +import java.util.function.Function; public class DtmBlocks { - public static final Block WEAK_GLASS = new WeakGlassBlock(AbstractBlock.Settings.copy(Blocks.GLASS).strength(0.2f, 0).dropsNothing()); - public static final Block LADDER = new FloatingLadderBlock(AbstractBlock.Settings.copy(Blocks.LADDER)); + public static final Block WEAK_GLASS = register("weak_glass", AbstractBlock.Settings.copy(Blocks.GLASS).strength(0.2f, 0).dropsNothing(), WeakGlassBlock::new); + public static final Block LADDER = register("ladder", AbstractBlock.Settings.copy(Blocks.LADDER), FloatingLadderBlock::new); public static void register() { - register("weak_glass", WEAK_GLASS); - register("ladder", LADDER); + } - private static void register(String name, Block block) { - Registry.register(Registries.BLOCK, DtmUtil.id(name), block); + private static T register(String name, AbstractBlock.Settings settings, Function func) { + var id = DtmUtil.id(name); + var block = func.apply(settings.registryKey(RegistryKey.of(RegistryKeys.BLOCK, id))); + Registry.register(Registries.BLOCK, id, block); + return block; } } diff --git a/src/main/java/eu/pb4/destroythemonument/blocks/FloatingLadderBlock.java b/src/main/java/eu/pb4/destroythemonument/blocks/FloatingLadderBlock.java index 1856cf7..99bb54e 100644 --- a/src/main/java/eu/pb4/destroythemonument/blocks/FloatingLadderBlock.java +++ b/src/main/java/eu/pb4/destroythemonument/blocks/FloatingLadderBlock.java @@ -6,6 +6,7 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldView; +import xyz.nucleoid.packettweaker.PacketContext; public class FloatingLadderBlock extends LadderBlock implements PolymerBlock { public FloatingLadderBlock(Settings settings) { @@ -18,12 +19,7 @@ public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { } @Override - public Block getPolymerBlock(BlockState state) { - return Blocks.LADDER; - } - - @Override - public BlockState getPolymerBlockState(BlockState state) { + public BlockState getPolymerBlockState(BlockState state, PacketContext context) { return Blocks.LADDER.getDefaultState().with(HorizontalFacingBlock.FACING, state.get(HorizontalFacingBlock.FACING)); } diff --git a/src/main/java/eu/pb4/destroythemonument/blocks/WeakGlassBlock.java b/src/main/java/eu/pb4/destroythemonument/blocks/WeakGlassBlock.java index 16f4dc0..06f2a30 100644 --- a/src/main/java/eu/pb4/destroythemonument/blocks/WeakGlassBlock.java +++ b/src/main/java/eu/pb4/destroythemonument/blocks/WeakGlassBlock.java @@ -13,6 +13,7 @@ import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import xyz.nucleoid.packettweaker.PacketContext; public class WeakGlassBlock extends TransparentBlock implements PolymerBlock { public WeakGlassBlock(Settings settings) { @@ -25,8 +26,8 @@ protected void appendProperties(StateManager.Builder builder) } @Override - public Block getPolymerBlock(BlockState state) { - return Blocks.GLASS; + public BlockState getPolymerBlockState(BlockState state, PacketContext context) { + return Blocks.GLASS.getDefaultState(); } @Override diff --git a/src/main/java/eu/pb4/destroythemonument/entities/DtmEntities.java b/src/main/java/eu/pb4/destroythemonument/entities/DtmEntities.java index 6780f31..0f08f52 100644 --- a/src/main/java/eu/pb4/destroythemonument/entities/DtmEntities.java +++ b/src/main/java/eu/pb4/destroythemonument/entities/DtmEntities.java @@ -2,22 +2,26 @@ import eu.pb4.destroythemonument.other.DtmUtil; import eu.pb4.polymer.core.api.entity.PolymerEntityUtils; -import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; public class DtmEntities { - public static final EntityType TNT = FabricEntityTypeBuilder.create(SpawnGroup.MISC, DtmTntEntity::new).dimensions(EntityType.TNT.getDimensions()).fireImmune().build(); + public static final EntityType TNT = register("tnt", EntityType.Builder.create(DtmTntEntity::new, SpawnGroup.MISC).dimensions(1, 1).makeFireImmune()); public static void register() { - register("tnt", TNT); } - private static void register(String name, EntityType block) { - Registry.register(Registries.ENTITY_TYPE, DtmUtil.id(name), block); + private static EntityType register(String name, EntityType.Builder func) { + var id = DtmUtil.id(name); + var block = func.build(RegistryKey.of(RegistryKeys.ENTITY_TYPE, id)); + Registry.register(Registries.ENTITY_TYPE, id, block); PolymerEntityUtils.registerType(block); + return block; } } diff --git a/src/main/java/eu/pb4/destroythemonument/entities/DtmTntEntity.java b/src/main/java/eu/pb4/destroythemonument/entities/DtmTntEntity.java index 0d84ea1..524924b 100644 --- a/src/main/java/eu/pb4/destroythemonument/entities/DtmTntEntity.java +++ b/src/main/java/eu/pb4/destroythemonument/entities/DtmTntEntity.java @@ -1,39 +1,30 @@ package eu.pb4.destroythemonument.entities; -import com.google.common.collect.Sets; import eu.pb4.destroythemonument.DTM; import eu.pb4.destroythemonument.other.DtmUtil; import eu.pb4.polymer.core.api.entity.PolymerEntity; import net.minecraft.block.BlockState; -import net.minecraft.enchantment.ProtectionEnchantment; import net.minecraft.entity.*; import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.data.DataTracker; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.projectile.ProjectileEntity; import net.minecraft.fluid.FluidState; import net.minecraft.nbt.NbtCompound; -import net.minecraft.network.packet.s2c.play.ExplosionS2CPacket; -import net.minecraft.particle.ParticleTypes; import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.sound.SoundEvents; +import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; -import net.minecraft.world.GameRules; +import net.minecraft.world.BlockView; import net.minecraft.world.World; -import net.minecraft.world.event.GameEvent; import net.minecraft.world.explosion.EntityExplosionBehavior; import net.minecraft.world.explosion.Explosion; -import net.minecraft.world.explosion.ExplosionBehavior; import org.jetbrains.annotations.Nullable; -import xyz.nucleoid.plasmid.game.common.team.GameTeamKey; -import xyz.nucleoid.plasmid.util.PlayerRef; +import xyz.nucleoid.packettweaker.PacketContext; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeamKey; +import xyz.nucleoid.plasmid.api.util.PlayerRef; -import java.util.Iterator; -import java.util.List; import java.util.Optional; -import java.util.Set; public class DtmTntEntity extends Entity implements PolymerEntity { @@ -119,6 +110,11 @@ protected MoveEffect getMoveEffect() { return MoveEffect.NONE; } + @Override + public boolean damage(ServerWorld world, DamageSource source, float amount) { + return false; + } + public boolean canHit() { return !this.isRemoved(); } @@ -134,7 +130,7 @@ protected void writeCustomDataToNbt(NbtCompound nbt) { } @Override - protected void initDataTracker() { + protected void initDataTracker(DataTracker.Builder builder) { } @@ -222,22 +218,7 @@ protected void onBlockHit() { private void explode() { this.discard(); - - var explosion = new CustomExplosion(this.getWorld(), this, this.getWorld().getDamageSources().explosion(this, this.causingEntity), new EntityExplosionBehavior(this), this.getX(), this.getBodyY(0.0625D), this.getZ(), 2.8f, false, Explosion.DestructionType.DESTROY); - explosion.collectBlocksAndDamageEntities(); - explosion.affectWorld(true); - - if (!explosion.shouldDestroy()) { - explosion.clearAffectedBlocks(); - } - - - for (var player : this.getWorld().getPlayers()) { - ServerPlayerEntity serverPlayerEntity = (ServerPlayerEntity)player; - if (serverPlayerEntity.squaredDistanceTo(this.getX(), this.getBodyY(0.0625D), this.getZ()) < 4096.0D) { - serverPlayerEntity.networkHandler.sendPacket(new ExplosionS2CPacket(this.getX(), this.getBodyY(0.0625D), this.getZ(), 3, explosion.getAffectedBlocks(), explosion.getAffectedPlayers().get(serverPlayerEntity), explosion.getDestructionType(), explosion.getEmitterParticle(), explosion.getParticle(), explosion.getSoundEvent())); - } - } + this.getWorld().createExplosion(this, this.getDamageSources().explosion(this, this.causingEntity), new CustomExplosionBehaviour(this), this.getBoundingBox().getCenter(), 2.8f, false, World.ExplosionSourceType.TNT); } protected float getEyeHeight(EntityPose pose, EntityDimensions dimensions) { @@ -245,12 +226,51 @@ protected float getEyeHeight(EntityPose pose, EntityDimensions dimensions) { } @Override - public EntityType getPolymerEntityType(ServerPlayerEntity player) { + public EntityType getPolymerEntityType(PacketContext context) { return EntityType.TNT; } - public static class CustomExplosion extends Explosion { + public static class CustomExplosionBehaviour extends EntityExplosionBehavior { + private final DtmTntEntity entity; + + public CustomExplosionBehaviour(DtmTntEntity entity) { + super(entity); + this.entity = entity; + } + + @Override + public Optional getBlastResistance(Explosion explosion, BlockView world, BlockPos pos, BlockState blockState, FluidState fluidState) { + var out = super.getBlastResistance(explosion, world, pos, blockState, fluidState); + return out.map(x -> blockState.isIn(DTM.BUILDING_BLOCKS) ? 0.8f : Math.max(2.8f, x)); + } + + @Override + public float getKnockbackModifier(Entity entity) { + return 1.4f; + } + + @Override + public float calculateDamage(Explosion explosion, Entity entity, float amount) { + double x = entity.getX() - explosion.getPosition().x; + double y = (entity instanceof DtmTntEntity ? entity.getY() : entity.getEyeY()) - explosion.getPosition().y; + double z = entity.getZ() - explosion.getPosition().z; + double distance = Math.sqrt(x * x + y * y + z * z); + + float doublePower = explosion.getPower() * 2.0F; + double w = Math.sqrt(entity.squaredDistanceTo(explosion.getPosition())) / (double) doublePower; + + if (distance != 0.0D) { + double ac = (1.0D - w) * amount; + return (float) ((int) ((ac * ac + ac) / 2.0D * 3.2D * (double) doublePower + 1.0D) * (this.entity.causingEntity == entity ? 0.25 : 1)); + } + + return 0; + } + } + + + /*public static class CustomExplosion extends Explosion { private final World world; private final Entity entity; private final double z; @@ -365,5 +385,5 @@ public void collectBlocksAndDamageEntities() { } } } - } + }*/ } diff --git a/src/main/java/eu/pb4/destroythemonument/game/DtmStatistics.java b/src/main/java/eu/pb4/destroythemonument/game/DtmStatistics.java index c600521..6822139 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/DtmStatistics.java +++ b/src/main/java/eu/pb4/destroythemonument/game/DtmStatistics.java @@ -1,8 +1,8 @@ package eu.pb4.destroythemonument.game; import eu.pb4.destroythemonument.other.DtmUtil; -import xyz.nucleoid.plasmid.game.stats.StatisticKey; +import xyz.nucleoid.plasmid.api.game.stats.StatisticKey; public class DtmStatistics { - public static final StatisticKey MONUMENTS_DESTROYED = StatisticKey.intKey(DtmUtil.id("monuments_destroyed"), StatisticKey.StorageType.TOTAL); + public static final StatisticKey MONUMENTS_DESTROYED = StatisticKey.intKey(DtmUtil.id("monuments_destroyed")); } diff --git a/src/main/java/eu/pb4/destroythemonument/game/GameConfig.java b/src/main/java/eu/pb4/destroythemonument/game/GameConfig.java index 269d9be..d631485 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/GameConfig.java +++ b/src/main/java/eu/pb4/destroythemonument/game/GameConfig.java @@ -1,26 +1,27 @@ package eu.pb4.destroythemonument.game; 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 eu.pb4.destroythemonument.game.map.MapConfig; -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; import java.util.List; import java.util.Map; import java.util.Optional; -public record GameConfig(String gamemode, PlayerConfig players, +public record GameConfig(String gamemode, WaitingLobbyConfig players, MapConfig map, GameTeamList teams, boolean allowJoiningInGame, int gameTime, List kits, int tickRespawnTime, Optional> monumentRemaps ) { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( Codec.STRING.fieldOf("gamemode").forGetter(GameConfig::gamemode), - PlayerConfig.CODEC.fieldOf("players").forGetter(GameConfig::players), + WaitingLobbyConfig.CODEC.fieldOf("players").forGetter(GameConfig::players), MapConfig.CODEC.fieldOf("map").forGetter(GameConfig::map), GameTeamList.CODEC.fieldOf("teams").forGetter(GameConfig::teams), Codec.BOOL.optionalFieldOf("allowJoiningInGame", false).forGetter(GameConfig::allowJoiningInGame), diff --git a/src/main/java/eu/pb4/destroythemonument/game/MapRenderer.java b/src/main/java/eu/pb4/destroythemonument/game/MapRenderer.java index fbe021f..fb81644 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/MapRenderer.java +++ b/src/main/java/eu/pb4/destroythemonument/game/MapRenderer.java @@ -5,10 +5,15 @@ import eu.pb4.destroythemonument.game.logic.BaseGameLogic; import eu.pb4.destroythemonument.game.map.GameMap; import net.minecraft.block.MapColor; -import net.minecraft.item.map.MapIcon; +import net.minecraft.component.type.MapIdComponent; +import net.minecraft.item.map.MapDecoration; +import net.minecraft.item.map.MapDecorationType; +import net.minecraft.item.map.MapDecorationTypes; import net.minecraft.item.map.MapState; import net.minecraft.network.packet.s2c.play.MapUpdateS2CPacket; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.DyeColor; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkSectionPos; import net.minecraft.util.math.MathHelper; @@ -19,6 +24,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; public class MapRenderer { private final BaseGameLogic logic; @@ -95,7 +101,7 @@ public void renderWorld(int fromX, int fromZ, int toX, int toZ) { } public void updateMap(ServerPlayerEntity player, @Nullable PlayerData playerData) { - List icons = new ArrayList<>(); + List icons = new ArrayList<>(); var bytes = new byte[128 * 128]; int rotationAddX = 0; @@ -197,13 +203,13 @@ public void updateMap(ServerPlayerEntity player, @Nullable PlayerData playerData var isOff = mX >= 128 || mX <= -128 || mZ >= 128 || mZ <= -128; if (monument.isAlive()) { - var type = MapIcon.Type.byId((byte) (monument.teamData.getConfig().blockDyeColor().getId() + 10)); + var type = getDecorationType(monument.teamData.getConfig().blockDyeColor()); var text = isOff ? null : monument.getName(); - icons.add(new MapIcon(type, - (byte) MathHelper.clamp(mX, -127, 127 ), (byte) MathHelper.clamp(mZ, -127, 127 ), (byte) 8, text)); + icons.add(new MapDecoration(type, + (byte) MathHelper.clamp(mX, -127, 127 ), (byte) MathHelper.clamp(mZ, -127, 127 ), (byte) 8, Optional.ofNullable(text))); } else if (!isOff) { - icons.add(new MapIcon(MapIcon.Type.RED_X, (byte) mX, (byte) mZ, (byte) 8,null)); + icons.add(new MapDecoration(MapDecorationTypes.RED_X, (byte) mX, (byte) mZ, (byte) 8,Optional.empty())); } } @@ -227,13 +233,13 @@ public void updateMap(ServerPlayerEntity player, @Nullable PlayerData playerData continue; } - icons.add(new MapIcon(MapIcon.Type.BLUE_MARKER, (byte) mX, (byte) mZ, (byte) Math.round((entity.getYaw() + rotationEntity) / 360 * 16), entity.getDisplayName())); + icons.add(new MapDecoration(MapDecorationTypes.BLUE_MARKER, (byte) mX, (byte) mZ, (byte) Math.round((entity.getYaw() + rotationEntity) / 360 * 16), Optional.ofNullable(entity.getDisplayName()))); } } - icons.add(new MapIcon(MapIcon.Type.PLAYER, (byte) 0, (byte) 0, (byte) Math.round((player.getYaw() + rotationEntity) / 360 * 16), null)); + icons.add(new MapDecoration(MapDecorationTypes.PLAYER, (byte) 0, (byte) 0, (byte) Math.round((player.getYaw() + rotationEntity) / 360 * 16), Optional.empty())); } - player.networkHandler.sendPacket(new MapUpdateS2CPacket(0, (byte) 0, false, icons, new MapState.UpdateData(0, 0, 128, 128, bytes))); + player.networkHandler.sendPacket(new MapUpdateS2CPacket(new MapIdComponent(0), (byte) 0, false, icons, new MapState.UpdateData(0, 0, 128, 128, bytes))); } public void tick() { @@ -254,4 +260,25 @@ public void tick() { this.currentPosZ = this.map.mapBounds.min().getZ(); } } + + private static RegistryEntry getDecorationType(DyeColor color) { + return switch (color) { + case WHITE -> MapDecorationTypes.BANNER_WHITE; + case ORANGE -> MapDecorationTypes.BANNER_ORANGE; + case MAGENTA -> MapDecorationTypes.BANNER_MAGENTA; + case LIGHT_BLUE -> MapDecorationTypes.BANNER_LIGHT_BLUE; + case YELLOW -> MapDecorationTypes.BANNER_YELLOW; + case LIME -> MapDecorationTypes.BANNER_LIME; + case PINK -> MapDecorationTypes.BANNER_PINK; + case GRAY -> MapDecorationTypes.BANNER_GRAY; + case LIGHT_GRAY -> MapDecorationTypes.BANNER_LIGHT_GRAY; + case CYAN -> MapDecorationTypes.BANNER_CYAN; + case PURPLE -> MapDecorationTypes.BANNER_PURPLE; + case BLUE -> MapDecorationTypes.BANNER_BLUE; + case BROWN -> MapDecorationTypes.BANNER_BROWN; + case GREEN -> MapDecorationTypes.BANNER_GREEN; + case RED -> MapDecorationTypes.BANNER_RED; + case BLACK -> MapDecorationTypes.BANNER_BLACK; + }; + } } diff --git a/src/main/java/eu/pb4/destroythemonument/game/SpawnLogic.java b/src/main/java/eu/pb4/destroythemonument/game/SpawnLogic.java index 2613fac..a2e4fb1 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/SpawnLogic.java +++ b/src/main/java/eu/pb4/destroythemonument/game/SpawnLogic.java @@ -9,8 +9,10 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.GameMode; -import xyz.nucleoid.plasmid.game.GameSpace; -import xyz.nucleoid.plasmid.util.PlayerRef; +import xyz.nucleoid.plasmid.api.game.GameSpace; +import xyz.nucleoid.plasmid.api.util.PlayerRef; + +import java.util.Set; public record SpawnLogic(GameSpace gameSpace, GameMap map, Object2ObjectMap participants, @@ -49,13 +51,13 @@ public void spawnPlayer(ServerPlayerEntity entity) { pos = player.teamData.getRandomSpawnPos(); } player.nextSpawnPos = null; - entity.teleport(world, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.teamData.spawnYaw, 0); + entity.teleport(world, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, Set.of(), player.teamData.spawnYaw, 0, false); return; } } BlockPos pos = this.map.getRandomSpawnPos(); - entity.teleport(world, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, entity.getYaw(), entity.getPitch()); + entity.teleport(world, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, Set.of(), entity.getYaw(), entity.getPitch(), false); } } diff --git a/src/main/java/eu/pb4/destroythemonument/game/Teams.java b/src/main/java/eu/pb4/destroythemonument/game/Teams.java index 47336ef..bf932a3 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/Teams.java +++ b/src/main/java/eu/pb4/destroythemonument/game/Teams.java @@ -7,10 +7,10 @@ import net.minecraft.scoreboard.AbstractTeam; import net.minecraft.server.network.ServerPlayerEntity; import org.jetbrains.annotations.NotNull; -import xyz.nucleoid.plasmid.game.GameActivity; -import xyz.nucleoid.plasmid.game.common.team.GameTeamConfig; -import xyz.nucleoid.plasmid.game.common.team.GameTeamKey; -import xyz.nucleoid.plasmid.game.common.team.TeamManager; +import xyz.nucleoid.plasmid.api.game.GameActivity; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeamConfig; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeamKey; +import xyz.nucleoid.plasmid.api.game.common.team.TeamManager; import java.util.Iterator; import java.util.Objects; diff --git a/src/main/java/eu/pb4/destroythemonument/game/WaitingLobby.java b/src/main/java/eu/pb4/destroythemonument/game/WaitingLobby.java index 385b117..2bb579f 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/WaitingLobby.java +++ b/src/main/java/eu/pb4/destroythemonument/game/WaitingLobby.java @@ -22,17 +22,17 @@ import net.minecraft.text.Text; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; -import net.minecraft.util.TypedActionResult; import net.minecraft.world.GameMode; import net.minecraft.world.GameRules; import xyz.nucleoid.fantasy.RuntimeWorldConfig; -import xyz.nucleoid.plasmid.game.*; -import xyz.nucleoid.plasmid.game.common.GameWaitingLobby; -import xyz.nucleoid.plasmid.game.common.team.GameTeamKey; -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.util.PlayerRef; +import xyz.nucleoid.plasmid.api.game.*; +import xyz.nucleoid.plasmid.api.game.common.GameWaitingLobby; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeamKey; +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.util.PlayerRef; +import xyz.nucleoid.stimuli.event.EventResult; import xyz.nucleoid.stimuli.event.item.ItemUseEvent; import xyz.nucleoid.stimuli.event.player.PlayerDamageEvent; import xyz.nucleoid.stimuli.event.player.PlayerDeathEvent; @@ -94,7 +94,7 @@ public static GameOpenProcedure open(GameOpenContext context) { WaitingLobby waiting = new WaitingLobby(game.getGameSpace(), map, context.config(), teamSelection); game.listen(GameActivityEvents.REQUEST_START, waiting::requestStart); - game.listen(GamePlayerEvents.OFFER, offer -> offer.accept(world, map.getRandomSpawnPosAsVec3d())); + game.listen(GamePlayerEvents.ACCEPT, offer -> offer.teleport(world, map.getRandomSpawnPosAsVec3d())); game.listen(GamePlayerEvents.JOIN, waiting::addPlayer); game.listen(GamePlayerEvents.LEAVE, waiting::removePlayer); game.listen(PlayerDeathEvent.EVENT, waiting::onPlayerDeath); @@ -103,27 +103,27 @@ public static GameOpenProcedure open(GameOpenContext context) { }); } - private ActionResult onPlayerDamage(ServerPlayerEntity player, DamageSource damageSource, float v) { + private EventResult onPlayerDamage(ServerPlayerEntity player, DamageSource damageSource, float v) { if (player.getY() < this.map.mapBounds.min().getY()) { this.spawnLogic.spawnPlayer(player); } - return ActionResult.FAIL; + return EventResult.DENY; } - private TypedActionResult onUseItem(ServerPlayerEntity player, Hand hand) { + private ActionResult onUseItem(ServerPlayerEntity player, Hand hand) { PlayerData playerData = this.participants.get(PlayerRef.of(player)); if (playerData != null && player.getInventory().getMainHandStack().getItem() == DtmItems.CLASS_SELECTOR) { ClassSelectorUI.openSelector(player, playerData, this.config.kits()); } - return TypedActionResult.pass(player.getStackInHand(hand)); + return ActionResult.PASS; } private GameResult requestStart() { Multimap playerTeams = HashMultimap.create(); - this.teamSelection.allocate(this.gameSpace.getPlayers(), playerTeams::put); + this.teamSelection.allocate(this.gameSpace.getPlayers().players(), playerTeams::put); switch (this.config.gamemode()) { case "standard": StandardGameLogic.open(this.gameSpace, this.map, this.config, playerTeams, this.participants, this.teams); @@ -154,10 +154,10 @@ private void removePlayer(ServerPlayerEntity player) { this.participants.remove(PlayerRef.of(player)); } - private ActionResult onPlayerDeath(ServerPlayerEntity player, DamageSource source) { + private EventResult onPlayerDeath(ServerPlayerEntity player, DamageSource source) { player.setHealth(20.0f); this.spawnPlayer(player); - return ActionResult.FAIL; + return EventResult.DENY; } private void spawnPlayer(ServerPlayerEntity player) { diff --git a/src/main/java/eu/pb4/destroythemonument/game/data/TeamData.java b/src/main/java/eu/pb4/destroythemonument/game/data/TeamData.java index 86afa5d..c7bb2e3 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/data/TeamData.java +++ b/src/main/java/eu/pb4/destroythemonument/game/data/TeamData.java @@ -11,9 +11,9 @@ import org.jetbrains.annotations.Nullable; import xyz.nucleoid.map_templates.BlockBounds; import xyz.nucleoid.map_templates.TemplateRegion; -import xyz.nucleoid.plasmid.game.common.team.GameTeam; -import xyz.nucleoid.plasmid.game.common.team.GameTeamConfig; -import xyz.nucleoid.plasmid.game.common.team.GameTeamKey; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeam; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeamConfig; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeamKey; import java.util.*; diff --git a/src/main/java/eu/pb4/destroythemonument/game/logic/BaseGameLogic.java b/src/main/java/eu/pb4/destroythemonument/game/logic/BaseGameLogic.java index bca57db..0de74bc 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/logic/BaseGameLogic.java +++ b/src/main/java/eu/pb4/destroythemonument/game/logic/BaseGameLogic.java @@ -49,22 +49,24 @@ import net.minecraft.util.*; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ColorHelper; import net.minecraft.util.math.Direction; import net.minecraft.world.GameMode; import net.minecraft.world.explosion.Explosion; import org.joml.Vector3f; -import xyz.nucleoid.plasmid.game.GameActivity; -import xyz.nucleoid.plasmid.game.GameCloseReason; -import xyz.nucleoid.plasmid.game.GameSpace; -import xyz.nucleoid.plasmid.game.common.team.GameTeamKey; -import xyz.nucleoid.plasmid.game.common.team.TeamChat; -import xyz.nucleoid.plasmid.game.event.GameActivityEvents; -import xyz.nucleoid.plasmid.game.event.GamePlayerEvents; -import xyz.nucleoid.plasmid.game.player.PlayerSet; -import xyz.nucleoid.plasmid.game.rule.GameRuleType; -import xyz.nucleoid.plasmid.game.stats.GameStatisticBundle; -import xyz.nucleoid.plasmid.game.stats.StatisticKeys; -import xyz.nucleoid.plasmid.util.PlayerRef; +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.team.GameTeamKey; +import xyz.nucleoid.plasmid.api.game.common.team.TeamChat; +import xyz.nucleoid.plasmid.api.game.event.GameActivityEvents; +import xyz.nucleoid.plasmid.api.game.event.GamePlayerEvents; +import xyz.nucleoid.plasmid.api.game.player.PlayerSet; +import xyz.nucleoid.plasmid.api.game.rule.GameRuleType; +import xyz.nucleoid.plasmid.api.game.stats.GameStatisticBundle; +import xyz.nucleoid.plasmid.api.game.stats.StatisticKeys; +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.BlockPunchEvent; @@ -78,6 +80,8 @@ import xyz.nucleoid.stimuli.event.world.ExplosionDetonatedEvent; import java.util.ArrayList; +import java.util.List; +import java.util.Set; public abstract class BaseGameLogic { @@ -130,25 +134,24 @@ public BaseGameLogic(GameSpace gameSpace, GameMap map, GameConfig config, Object } } - DTM.ACTIVE_GAMES.put(gameSpace, this); - + gameSpace.setAttachment(DTM.GAME_LOGIC, this); map.onGameStart(this); } public void setupGame(GameActivity game, GameMap map, GameConfig config, Multimap playerTeams) { - game.setRule(GameRuleType.CRAFTING, ActionResult.FAIL); - game.setRule(GameRuleType.PORTALS, ActionResult.FAIL); - game.setRule(GameRuleType.PVP, ActionResult.PASS); - game.setRule(GameRuleType.HUNGER, ActionResult.PASS); - game.setRule(GameRuleType.FALL_DAMAGE, ActionResult.PASS); - game.setRule(GameRuleType.INTERACTION, ActionResult.PASS); - game.setRule(GameRuleType.BLOCK_DROPS, ActionResult.FAIL); - game.setRule(GameRuleType.MODIFY_ARMOR, ActionResult.FAIL); + game.setRule(GameRuleType.CRAFTING, EventResult.DENY); + game.setRule(GameRuleType.PORTALS, EventResult.DENY); + game.setRule(GameRuleType.PVP, EventResult.PASS); + game.setRule(GameRuleType.HUNGER, EventResult.PASS); + game.setRule(GameRuleType.FALL_DAMAGE, EventResult.PASS); + game.setRule(GameRuleType.INTERACTION, EventResult.PASS); + game.setRule(GameRuleType.BLOCK_DROPS, EventResult.DENY); + game.setRule(GameRuleType.MODIFY_ARMOR, EventResult.DENY); game.listen(GameActivityEvents.CREATE, this::onOpen); game.listen(GameActivityEvents.DESTROY, this::onClose); - game.listen(GamePlayerEvents.OFFER, offer -> offer.accept(map.world, map.getRandomSpawnPosAsVec3d())); + game.listen(GamePlayerEvents.ACCEPT, offer -> offer.teleport(map.world, map.getRandomSpawnPosAsVec3d())); game.listen(GamePlayerEvents.ADD, this::addPlayer); game.listen(GamePlayerEvents.LEAVE, this::removePlayer); @@ -180,21 +183,21 @@ public void setupGame(GameActivity game, GameMap map, GameConfig config, Multima TeamChat.addTo(game, this.teams.getManager()); } - protected ActionResult onBlockPunch(ServerPlayerEntity player, Direction direction, BlockPos blockPos) { + protected EventResult onBlockPunch(ServerPlayerEntity player, Direction direction, BlockPos blockPos) { PlayerData data = this.participants.get(PlayerRef.of(player)); if (data != null && player.getWorld().getBlockState(blockPos).calcBlockBreakingDelta(player, player.getWorld(), blockPos) < 0.5) { data.activeClass.updateMainTool(player, player.getWorld().getBlockState(blockPos)); } - return ActionResult.PASS; + return EventResult.PASS; } - protected ActionResult onPlayerDropItem(PlayerEntity player, int i, ItemStack stack) { + protected EventResult onPlayerDropItem(PlayerEntity player, int i, ItemStack stack) { if (this.participants.get(PlayerRef.of(player)) != null && stack != null) { if (stack.getItem() == DtmItems.MULTI_BLOCK) { if (player.isSneaking()) { var playerData = this.participants.get(PlayerRef.of(player)); var list = new ArrayList(); - Registries.BLOCK.getEntryList(DTM.BUILDING_BLOCKS).get().forEach(x -> list.add(x.value())); + Registries.BLOCK.getOrThrow(DTM.BUILDING_BLOCKS).forEach(x -> list.add(x.value())); playerData.selectedBlock = list.get((list.size() + list.indexOf(playerData.selectedBlock) + 1) % list.size()); } else { BlockSelectorUI.openSelector((ServerPlayerEntity) player, this); @@ -204,16 +207,16 @@ protected ActionResult onPlayerDropItem(PlayerEntity player, int i, ItemStack st } } - return ActionResult.FAIL; + return EventResult.DENY; } - protected ActionResult onArrowShoot(ServerPlayerEntity player, ItemStack itemStack, ArrowItem arrowItem, int i, PersistentProjectileEntity projectile) { + protected EventResult onArrowShoot(ServerPlayerEntity player, ItemStack itemStack, ArrowItem arrowItem, int i, PersistentProjectileEntity projectile) { projectile.pickupType = PersistentProjectileEntity.PickupPermission.DISALLOWED; - return ActionResult.PASS; + return EventResult.PASS; } - protected void onExplosion(Explosion explosion, boolean b) { - for (BlockPos blockPos : explosion.getAffectedBlocks()) { + protected EventResult onExplosion(Explosion explosion, List destroyedBlocks) { + for (BlockPos blockPos : destroyedBlocks) { if (!this.gameMap.isUnbreakable(blockPos) && !this.gameMap.isActiveMonument(blockPos)) { var state = this.gameMap.world.getBlockState(blockPos); if (state.isAir()) { @@ -243,20 +246,21 @@ protected void onExplosion(Explosion explosion, boolean b) { } } } - explosion.clearAffectedBlocks(); + destroyedBlocks.clear(); + return EventResult.PASS; } - protected TypedActionResult onUseItem(ServerPlayerEntity player, Hand hand) { + protected ActionResult onUseItem(ServerPlayerEntity player, Hand hand) { PlayerData playerData = this.participants.get(PlayerRef.of(player)); ItemStack stack = player.getStackInHand(hand); if (playerData != null && !stack.isEmpty() && stack.getItem() == DtmItems.CLASS_SELECTOR) { ClassSelectorUI.openSelector(player, this); - return TypedActionResult.success(player.getStackInHand(hand)); + return ActionResult.SUCCESS_SERVER; } - return TypedActionResult.pass(player.getStackInHand(hand)); + return ActionResult.PASS; } protected ActionResult onUseBlock(ServerPlayerEntity player, Hand hand, BlockHitResult hitResult) { @@ -272,28 +276,28 @@ protected ActionResult onUseBlock(ServerPlayerEntity player, Hand hand, BlockHit private volatile boolean skipPacket = false; - protected ActionResult onServerPacket(ServerPlayerEntity player, Packet packet) { + protected EventResult onServerPacket(ServerPlayerEntity player, Packet packet) { if (skipPacket) { - return ActionResult.PASS; + return EventResult.PASS; } var x = transformPacket(player, packet); if (x == packet) { - return ActionResult.PASS; + return EventResult.PASS; } else { if (x != null) { skipPacket = true; player.networkHandler.sendPacket(x); skipPacket = false; } - return ActionResult.FAIL; + return EventResult.DENY; } } protected Packet transformPacket(ServerPlayerEntity player, Packet packet) { if (packet instanceof BundleS2CPacket bundleS2CPacket) { - var list = new ArrayList>(); + var list = new ArrayList>(); boolean needChanging = false; @@ -324,7 +328,7 @@ protected Packet transformPacket(ServerPlayerEntity pl } if (cancel) { - return new EntityEquipmentUpdateS2CPacket(equipmentUpdate.getId(), list); + return new EntityEquipmentUpdateS2CPacket(equipmentUpdate.getEntityId(), list); } } else if (packet instanceof EntityTrackerUpdateS2CPacket trackerUpdateS2CPacket && PolymerEntityUtils.getEntityContext(packet) instanceof ServerPlayerEntity target) { var data = this.participants.get(PlayerRef.of(player)); @@ -360,7 +364,7 @@ protected void onClose(GameCloseReason reason) { protected void addPlayer(ServerPlayerEntity player) { if (!this.participants.containsKey(PlayerRef.of(player))) { - if (this.config.allowJoiningInGame() && this.participants.size() < this.config.players().maxPlayers()) { + if (this.config.allowJoiningInGame() && this.participants.size() < this.config.players().playerConfig().maxPlayers().orElse(99999)) { this.globalSidebar.addPlayer(player); PlayOrSpectateUI.open(player, this); } @@ -398,21 +402,21 @@ protected void removePlayer(ServerPlayerEntity player) { } } - protected ActionResult onPlayerDamage(ServerPlayerEntity player, DamageSource source, float amount) { + protected EventResult onPlayerDamage(ServerPlayerEntity player, DamageSource source, float amount) { PlayerData dtmPlayer = this.participants.get(PlayerRef.of(player)); if (dtmPlayer == null || this.deadPlayers.containsKey(PlayerRef.of(player))) { - return ActionResult.FAIL; + return EventResult.DENY; } if (source.getAttacker() instanceof ServerPlayerEntity attacker) { var attackerData = this.participants.get(PlayerRef.of(attacker)); if (attackerData == null || attacker == player) { - return ActionResult.PASS; + return EventResult.ALLOW; } if (attackerData.teamData == dtmPlayer.teamData) { - return ActionResult.FAIL; + return EventResult.DENY; } dtmPlayer.lastAttackTime = player.getWorld().getTime(); @@ -421,10 +425,10 @@ protected ActionResult onPlayerDamage(ServerPlayerEntity player, DamageSource so this.statistics.forPlayer(player).increment(StatisticKeys.DAMAGE_TAKEN, amount); } - return ActionResult.PASS; + return EventResult.PASS; } - protected ActionResult onPlayerDeath(ServerPlayerEntity player, DamageSource source) { + protected EventResult onPlayerDeath(ServerPlayerEntity player, DamageSource source) { PlayerData dtmPlayer = this.participants.get(PlayerRef.of(player)); if (dtmPlayer != null) { Text deathMes = source.getDeathMessage(player); @@ -450,13 +454,13 @@ protected ActionResult onPlayerDeath(ServerPlayerEntity player, DamageSource sou } else { this.spawnLogic.spawnPlayer(player); } - return ActionResult.FAIL; + return EventResult.DENY; } protected void startRespawningPlayerSequence(ServerPlayerEntity player) { if (this.config.tickRespawnTime() > 0) { this.deadPlayers.put(PlayerRef.of(player), this.config.tickRespawnTime()); - player.teleport(player.getX(), player.getY() + 2000, player.getZ()); + player.teleport(this.gameMap.world, player.getX(), player.getY() + 2000, player.getZ(), Set.of(), 0, 0, false); this.spawnLogic.resetPlayer(player, GameMode.ADVENTURE); player.networkHandler.sendPacket(new GameStateChangeS2CPacket(new GameStateChangeS2CPacket.Reason(3), 3)); PlayerAbilities abilities = new PlayerAbilities(); @@ -528,7 +532,7 @@ protected void spawnSpectator(ServerPlayerEntity player) { this.spawnLogic.spawnPlayer(player); } - protected ActionResult onPlayerPlaceBlock(ServerPlayerEntity player, ServerWorld world, BlockPos blockPos, BlockState state, ItemUsageContext itemUsageContext) { + protected EventResult onPlayerPlaceBlock(ServerPlayerEntity player, ServerWorld world, BlockPos blockPos, BlockState state, ItemUsageContext itemUsageContext) { if (this.gameMap.isUnbreakable(blockPos) || !this.gameMap.mapBounds.contains(blockPos) || itemUsageContext.getStack().getItem() == Items.BEACON) { // Fixes desync int slot; @@ -540,22 +544,22 @@ protected ActionResult onPlayerPlaceBlock(ServerPlayerEntity player, ServerWorld player.networkHandler.sendPacket(new ScreenHandlerSlotUpdateS2CPacket(-2, 0, slot, itemUsageContext.getStack())); - return ActionResult.FAIL; + return EventResult.DENY; } if (itemUsageContext.getStack().getItem() == Items.TNT) { itemUsageContext.getStack().decrement(1); TntEntity tnt = new TntEntity(player.getWorld(), blockPos.getX() + 0.5, blockPos.getY() + 0.5, blockPos.getZ() + 0.5, player); player.getWorld().spawnEntity(tnt); - return ActionResult.FAIL; + return EventResult.DENY; } - return ActionResult.PASS; + return EventResult.PASS; } - protected ActionResult onPlayerBreakBlock(ServerPlayerEntity player, ServerWorld world, BlockPos blockPos) { + protected EventResult onPlayerBreakBlock(ServerPlayerEntity player, ServerWorld world, BlockPos blockPos) { if (this.gameMap.isUnbreakable(blockPos)) { - return ActionResult.FAIL; + return EventResult.DENY; } else if (this.gameMap.isTater(blockPos)) { Entity entity = new LightningEntity(EntityType.LIGHTNING_BOLT, player.getWorld()); entity.updatePosition(player.getX(), player.getY(), player.getZ()); @@ -570,14 +574,14 @@ protected ActionResult onPlayerBreakBlock(ServerPlayerEntity player, ServerWorld PlayerData playerData = this.participants.get(PlayerRef.of(player)); if (playerData == null) { - return ActionResult.PASS; + return EventResult.PASS; } var state = player.getWorld().getBlockState(blockPos); if (state.isIn(DTM.BUILDING_BLOCKS)) { player.giveItemStack(new ItemStack(DtmItems.MULTI_BLOCK)); playerData.brokenPlankBlocks += 1; - return ActionResult.SUCCESS; + return EventResult.ALLOW; } if (state.calcBlockBreakingDelta(player, world, blockPos) < 1) { @@ -588,7 +592,7 @@ protected ActionResult onPlayerBreakBlock(ServerPlayerEntity player, ServerWorld } } - return ActionResult.PASS; + return EventResult.PASS; } protected abstract void maybeEliminate(TeamData regions); @@ -604,7 +608,7 @@ protected void tick() { float green = ((float) (color / 256) % 256) / 256; float red = ((float) color / 65536) / 256; - this.gameSpace.getPlayers().sendPacket(new ParticleS2CPacket(new DustParticleEffect(new Vector3f(red, green, blue), 0.8f), false, monument.pos.getX() + 0.5d, monument.pos.getY() + 0.5d, monument.pos.getZ() + 0.5d, 0.2f, 0.2f, 0.2f, 0.01f, 5)); + this.gameSpace.getPlayers().sendPacket(new ParticleS2CPacket(new DustParticleEffect(ColorHelper.fromFloats(0, red, green, blue), 0.8f), false, monument.pos.getX() + 0.5d, monument.pos.getY() + 0.5d, monument.pos.getZ() + 0.5d, 0.2f, 0.2f, 0.2f, 0.01f, 5)); } } @@ -645,7 +649,7 @@ protected void tick() { if (player.isSpectator()) { this.spawnLogic.spawnPlayer(player); } else { - player.kill(); + player.kill(this.gameMap.world); } } diff --git a/src/main/java/eu/pb4/destroythemonument/game/logic/CaptureGameLogic.java b/src/main/java/eu/pb4/destroythemonument/game/logic/CaptureGameLogic.java index f60e1ff..48bbd20 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/logic/CaptureGameLogic.java +++ b/src/main/java/eu/pb4/destroythemonument/game/logic/CaptureGameLogic.java @@ -28,11 +28,12 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.GameMode; -import xyz.nucleoid.plasmid.game.GameActivity; -import xyz.nucleoid.plasmid.game.GameSpace; -import xyz.nucleoid.plasmid.game.common.team.GameTeamKey; -import xyz.nucleoid.plasmid.util.ColoredBlocks; -import xyz.nucleoid.plasmid.util.PlayerRef; +import xyz.nucleoid.plasmid.api.game.GameActivity; +import xyz.nucleoid.plasmid.api.game.GameSpace; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeamKey; +import xyz.nucleoid.plasmid.api.util.ColoredBlocks; +import xyz.nucleoid.plasmid.api.util.PlayerRef; +import xyz.nucleoid.stimuli.event.EventResult; import java.util.ArrayList; import java.util.List; @@ -79,14 +80,14 @@ protected void maybeEliminate(TeamData teamData) { } @Override - protected ActionResult onPlayerBreakBlock(ServerPlayerEntity player, ServerWorld world, BlockPos blockPos) { + protected EventResult onPlayerBreakBlock(ServerPlayerEntity player, ServerWorld world, BlockPos blockPos) { PlayerData playerData = this.participants.get(PlayerRef.of(player)); var monument = this.gameMap.getActiveMonument(blockPos); if (playerData != null && monument != null) { if (monument.teamData == playerData.teamData) { player.sendMessage(DtmUtil.getText("message", "cant_capture_own").formatted(Formatting.RED), true); - return ActionResult.FAIL; + return EventResult.DENY; } else { var oldTeam = monument.teamData; if (oldTeam != null) { @@ -150,7 +151,7 @@ protected ActionResult onPlayerBreakBlock(ServerPlayerEntity player, ServerWorld playerData.brokenMonuments += 1; playerData.addToTimers(20 * 20); //this.statistics.forPlayer(player).increment(DtmStatistics.MONUMENTS_DESTROYED, 1); - return ActionResult.FAIL; + return EventResult.DENY; } } diff --git a/src/main/java/eu/pb4/destroythemonument/game/logic/DebugGameLogic.java b/src/main/java/eu/pb4/destroythemonument/game/logic/DebugGameLogic.java index a6a4ae9..b868a96 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/logic/DebugGameLogic.java +++ b/src/main/java/eu/pb4/destroythemonument/game/logic/DebugGameLogic.java @@ -9,10 +9,10 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import xyz.nucleoid.plasmid.game.GameSpace; -import xyz.nucleoid.plasmid.game.common.team.GameTeam; -import xyz.nucleoid.plasmid.game.common.team.GameTeamKey; -import xyz.nucleoid.plasmid.util.PlayerRef; +import xyz.nucleoid.plasmid.api.game.GameSpace; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeam; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeamKey; +import xyz.nucleoid.plasmid.api.util.PlayerRef; public class DebugGameLogic extends StandardGameLogic { diff --git a/src/main/java/eu/pb4/destroythemonument/game/logic/StandardGameLogic.java b/src/main/java/eu/pb4/destroythemonument/game/logic/StandardGameLogic.java index 7e29ebe..80245c3 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/logic/StandardGameLogic.java +++ b/src/main/java/eu/pb4/destroythemonument/game/logic/StandardGameLogic.java @@ -26,14 +26,15 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.GameMode; import net.minecraft.world.explosion.Explosion; -import net.minecraft.world.explosion.ExplosionBehavior; -import xyz.nucleoid.plasmid.game.GameActivity; -import xyz.nucleoid.plasmid.game.GameSpace; -import xyz.nucleoid.plasmid.game.common.team.GameTeamKey; -import xyz.nucleoid.plasmid.util.PlayerRef; +import xyz.nucleoid.plasmid.api.game.GameActivity; +import xyz.nucleoid.plasmid.api.game.GameSpace; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeamKey; +import xyz.nucleoid.plasmid.api.util.PlayerRef; +import xyz.nucleoid.stimuli.event.EventResult; import java.util.ArrayList; import java.util.List; +import java.util.Optional; public class StandardGameLogic extends BaseGameLogic { protected TeamData currentSidebarTeam = null; @@ -77,14 +78,14 @@ protected void maybeEliminate(TeamData teamData) { } @Override - protected ActionResult onPlayerBreakBlock(ServerPlayerEntity player, ServerWorld world, BlockPos blockPos) { + protected EventResult onPlayerBreakBlock(ServerPlayerEntity player, ServerWorld world, BlockPos blockPos) { PlayerData playerData = this.participants.get(PlayerRef.of(player)); var monument = this.gameMap.getActiveMonument(blockPos); if (playerData != null && monument != null) { if (monument.teamData == playerData.teamData) { player.sendMessage(DtmUtil.getText("message", "cant_break_own").formatted(Formatting.RED), true); - return ActionResult.FAIL; + return EventResult.DENY; } else { monument.setAlive(false); @@ -98,13 +99,12 @@ protected ActionResult onPlayerBreakBlock(ServerPlayerEntity player, ServerWorld this.gameSpace.getPlayers().sendMessage(text); this.maybeEliminate(monument.teamData); - this.gameSpace.getPlayers().sendPacket(new ExplosionS2CPacket((double) blockPos.getX() + 0.5, (double) blockPos.getY() + 0.5, (double) blockPos.getZ() + 0.5, 1f, new ArrayList<>(), new Vec3d(0.0, 0.0, 0.0), Explosion.DestructionType.DESTROY, ParticleTypes.EXPLOSION, ParticleTypes.EXPLOSION_EMITTER, SoundEvents.ENTITY_GENERIC_EXPLODE)); + this.gameSpace.getPlayers().sendPacket(new ExplosionS2CPacket( Vec3d.ofCenter(blockPos), Optional.empty(), ParticleTypes.EXPLOSION_EMITTER, SoundEvents.ENTITY_GENERIC_EXPLODE)); this.teams.getManager().playersIn(monument.teamData.team).playSound(SoundEvents.ENTITY_WITHER_SPAWN, SoundCategory.MASTER, 0.6f, 1f); playerData.brokenMonuments += 1; playerData.addToTimers(20 * 20); this.statistics.forPlayer(player).increment(DtmStatistics.MONUMENTS_DESTROYED, 1); - return ActionResult.SUCCESS; - + return EventResult.ALLOW; } } diff --git a/src/main/java/eu/pb4/destroythemonument/game/map/GameMap.java b/src/main/java/eu/pb4/destroythemonument/game/map/GameMap.java index 62d0470..db8b319 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/map/GameMap.java +++ b/src/main/java/eu/pb4/destroythemonument/game/map/GameMap.java @@ -12,7 +12,7 @@ import net.minecraft.world.gen.chunk.ChunkGenerator; import org.jetbrains.annotations.Nullable; import xyz.nucleoid.map_templates.BlockBounds; -import xyz.nucleoid.plasmid.game.common.team.GameTeamKey; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeamKey; import java.util.*; diff --git a/src/main/java/eu/pb4/destroythemonument/game/map/GeneratedGameMap.java b/src/main/java/eu/pb4/destroythemonument/game/map/GeneratedGameMap.java index f129d5f..03e7aa0 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/map/GeneratedGameMap.java +++ b/src/main/java/eu/pb4/destroythemonument/game/map/GeneratedGameMap.java @@ -7,7 +7,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.gen.chunk.ChunkGenerator; import xyz.nucleoid.map_templates.BlockBounds; -import xyz.nucleoid.plasmid.game.common.team.GameTeamKey; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeamKey; public final class GeneratedGameMap extends GameMap { private GeneratedGameMap(MapConfig config) { diff --git a/src/main/java/eu/pb4/destroythemonument/game/map/TemplateGameMap.java b/src/main/java/eu/pb4/destroythemonument/game/map/TemplateGameMap.java index fb48a26..63a5980 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/map/TemplateGameMap.java +++ b/src/main/java/eu/pb4/destroythemonument/game/map/TemplateGameMap.java @@ -20,8 +20,8 @@ import xyz.nucleoid.map_templates.MapTemplate; import xyz.nucleoid.map_templates.MapTemplateSerializer; import xyz.nucleoid.map_templates.TemplateRegion; -import xyz.nucleoid.plasmid.game.common.team.GameTeamKey; -import xyz.nucleoid.plasmid.game.world.generator.TemplateChunkGenerator; +import xyz.nucleoid.plasmid.api.game.common.team.GameTeamKey; +import xyz.nucleoid.plasmid.api.game.world.generator.TemplateChunkGenerator; import java.io.IOException; import java.util.ArrayList; diff --git a/src/main/java/eu/pb4/destroythemonument/game/map/generator/DtmChunkGenerator.java b/src/main/java/eu/pb4/destroythemonument/game/map/generator/DtmChunkGenerator.java index e4127fe..179bbae 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/map/generator/DtmChunkGenerator.java +++ b/src/main/java/eu/pb4/destroythemonument/game/map/generator/DtmChunkGenerator.java @@ -31,8 +31,8 @@ import net.minecraft.world.gen.chunk.StructuresConfig; import net.minecraft.world.gen.chunk.VerticalBlockSample; import xyz.nucleoid.map_templates.BlockBounds; -import xyz.nucleoid.plasmid.game.world.generator.GameChunkGenerator; -import xyz.nucleoid.plasmid.game.world.generator.GeneratorBlockSamples; +import xyz.nucleoid.plasmid.api.game.world.generator.GameChunkGenerator; +import xyz.nucleoid.plasmid.api.game.world.generator.GeneratorBlockSamples; import java.util.Collections; import java.util.Optional; diff --git a/src/main/java/eu/pb4/destroythemonument/game/map/generator/TemplateWithLayerGenerator.java b/src/main/java/eu/pb4/destroythemonument/game/map/generator/TemplateWithLayerGenerator.java index 77c7f56..354da88 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/map/generator/TemplateWithLayerGenerator.java +++ b/src/main/java/eu/pb4/destroythemonument/game/map/generator/TemplateWithLayerGenerator.java @@ -8,7 +8,7 @@ import net.minecraft.world.gen.chunk.Blender; import net.minecraft.world.gen.noise.NoiseConfig; import xyz.nucleoid.map_templates.MapTemplate; -import xyz.nucleoid.plasmid.game.world.generator.TemplateChunkGenerator; +import xyz.nucleoid.plasmid.api.game.world.generator.TemplateChunkGenerator; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -25,8 +25,8 @@ public TemplateWithLayerGenerator(MinecraftServer server, MapTemplate template, } @Override - public CompletableFuture populateNoise(Executor executor, Blender blender, NoiseConfig noiseConfig, StructureAccessor structureAccessor, Chunk chunk) { - return super.populateNoise(executor, blender, noiseConfig, structureAccessor, chunk).handleAsync(this::addLayers, executor); + public CompletableFuture populateNoise(Blender blender, NoiseConfig noiseConfig, StructureAccessor structureAccessor, Chunk chunk) { + return super.populateNoise(blender, noiseConfig, structureAccessor, chunk).handle(this::addLayers); } private Chunk addLayers(Chunk chunk, Throwable throwable) { diff --git a/src/main/java/eu/pb4/destroythemonument/game/playerclass/ClassRegistry.java b/src/main/java/eu/pb4/destroythemonument/game/playerclass/ClassRegistry.java index 59aacc4..3f89b31 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/playerclass/ClassRegistry.java +++ b/src/main/java/eu/pb4/destroythemonument/game/playerclass/ClassRegistry.java @@ -16,7 +16,7 @@ import net.minecraft.util.Identifier; import org.jetbrains.annotations.Nullable; import com.mojang.datafixers.util.Pair; -import xyz.nucleoid.plasmid.registry.TinyRegistry; +import xyz.nucleoid.plasmid.api.util.TinyRegistry; import java.io.BufferedReader; import java.io.IOException; @@ -29,17 +29,17 @@ public class ClassRegistry { public static void register() { ResourceManagerHelper serverData = ResourceManagerHelper.get(ResourceType.SERVER_DATA); - serverData.registerReloadListener(new SimpleSynchronousResourceReloadListener() { + serverData.registerReloadListener(Identifier.of(DTM.ID, "class_dtm"), registries -> new SimpleSynchronousResourceReloadListener() { @Override public Identifier getFabricId() { - return new Identifier(DTM.ID, "class_dtm"); + return Identifier.of(DTM.ID, "class_dtm"); } @Override public void reload(ResourceManager manager) { CLASSES.clear(); - + var ops = registries.getOps(JsonOps.INSTANCE); var resources = manager.findResources("class_dtm", path -> path.getPath().endsWith(".json")); for (var path : resources.entrySet()) { @@ -49,7 +49,7 @@ public void reload(ResourceManager manager) { Identifier identifier = identifierFromPath(path.getKey()); - DataResult result = PlayerClass.CODEC.decode(JsonOps.INSTANCE, json).map(Pair::getFirst); + DataResult result = PlayerClass.CODEC.decode(ops, json).map(Pair::getFirst); result.result().ifPresent(game -> CLASSES.register(identifier, game)); @@ -66,7 +66,7 @@ public void reload(ResourceManager manager) { private static Identifier identifierFromPath(Identifier location) { String path = location.getPath(); path = path.substring("class_dtm/".length(), path.length() - ".json".length()); - return new Identifier(location.getNamespace(), path); + return Identifier.of(location.getNamespace(), path); } @Nullable diff --git a/src/main/java/eu/pb4/destroythemonument/game/playerclass/PlayerClass.java b/src/main/java/eu/pb4/destroythemonument/game/playerclass/PlayerClass.java index 450b24b..5bd25df 100644 --- a/src/main/java/eu/pb4/destroythemonument/game/playerclass/PlayerClass.java +++ b/src/main/java/eu/pb4/destroythemonument/game/playerclass/PlayerClass.java @@ -6,18 +6,25 @@ import eu.pb4.destroythemonument.game.data.TeamData; import eu.pb4.destroythemonument.items.DtmItems; import net.minecraft.block.BlockState; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.AttributeModifierSlot; +import net.minecraft.component.type.AttributeModifiersComponent; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.attribute.EntityAttributeModifier; import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.item.AxeItem; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.PickaxeItem; +import net.minecraft.item.equipment.EquipmentType; import net.minecraft.registry.Registries; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.tag.BlockTags; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.Identifier; import xyz.nucleoid.codecs.MoreCodecs; -import xyz.nucleoid.plasmid.util.ItemStackBuilder; +import xyz.nucleoid.plasmid.api.util.ItemStackBuilder; import java.util.List; import java.util.Map; @@ -25,19 +32,18 @@ public record PlayerClass( String name, ItemStack icon, - Map attributes, + Map, Double> attributes, ItemStack pickaxe, ItemStack axe, List armorVisual, List items, List restockableItems, int blocksToPlanks ) { - public static final UUID TOOL_DAMAGE = UUID.fromString("c7e311fa-857a-4354-bbcb-2e589d9e868d"); public static final int TOOL_REPAIR_COST = 9943235; public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.STRING.fieldOf("class_name").forGetter(PlayerClass::name), MoreCodecs.ITEM_STACK.fieldOf("icon").forGetter(PlayerClass::icon), - Codec.unboundedMap(Registries.ATTRIBUTE.getCodec(), Codec.DOUBLE).optionalFieldOf("attributes", Map.of()).forGetter(PlayerClass::attributes), + Codec.unboundedMap(Registries.ATTRIBUTE.getEntryCodec(), Codec.DOUBLE).optionalFieldOf("attributes", Map.of()).forGetter(PlayerClass::attributes), MoreCodecs.ITEM_STACK.fieldOf("pickaxe_tool").forGetter(PlayerClass::pickaxe), MoreCodecs.ITEM_STACK.fieldOf("axe_tool").forGetter(PlayerClass::axe), Codec.list(MoreCodecs.ITEM_STACK).fieldOf("armor").forGetter(PlayerClass::armorVisual), @@ -52,7 +58,7 @@ public void setupPlayer(ServerPlayerEntity player, TeamData team) { } player.getInventory().insertStack(ItemStackBuilder.of(this.pickaxe) - .addModifier(EntityAttributes.GENERIC_ATTACK_DAMAGE, new EntityAttributeModifier(TOOL_DAMAGE, "tool", 0, EntityAttributeModifier.Operation.MULTIPLY_TOTAL), EquipmentSlot.MAINHAND) + .addModifier(EntityAttributes.ATTACK_DAMAGE, new EntityAttributeModifier(Item.BASE_ATTACK_DAMAGE_MODIFIER_ID, 0, EntityAttributeModifier.Operation.ADD_MULTIPLIED_TOTAL), AttributeModifierSlot.MAINHAND) .setUnbreakable() .setRepairCost(TOOL_REPAIR_COST) .build()); @@ -69,17 +75,25 @@ public void setupPlayer(ServerPlayerEntity player, TeamData team) { } } - player.equipStack(EquipmentSlot.HEAD, DtmItems.GENERIC_ITEM.create(this.armorVisual.get(0), team.getConfig().dyeColor().getRgb())); - player.equipStack(EquipmentSlot.CHEST, DtmItems.GENERIC_ITEM.create(this.armorVisual.get(1), team.getConfig().dyeColor().getRgb())); - player.equipStack(EquipmentSlot.LEGS, DtmItems.GENERIC_ITEM.create(this.armorVisual.get(2), team.getConfig().dyeColor().getRgb())); - player.equipStack(EquipmentSlot.FEET, DtmItems.GENERIC_ITEM.create(this.armorVisual.get(3), team.getConfig().dyeColor().getRgb())); + player.equipStack(EquipmentSlot.HEAD, ItemStackBuilder.of(this.armorVisual.get(0)) + .setDyeColor(team.getConfig().dyeColor().getRgb()) + .set(DataComponentTypes.ATTRIBUTE_MODIFIERS, AttributeModifiersComponent.DEFAULT).build()); + player.equipStack(EquipmentSlot.CHEST, ItemStackBuilder.of(this.armorVisual.get(1)) + .setDyeColor(team.getConfig().dyeColor().getRgb()) + .set(DataComponentTypes.ATTRIBUTE_MODIFIERS, AttributeModifiersComponent.DEFAULT).build()); + player.equipStack(EquipmentSlot.LEGS, ItemStackBuilder.of(this.armorVisual.get(2)) + .setDyeColor(team.getConfig().dyeColor().getRgb()) + .set(DataComponentTypes.ATTRIBUTE_MODIFIERS, AttributeModifiersComponent.DEFAULT).build()); + player.equipStack(EquipmentSlot.FEET, ItemStackBuilder.of(this.armorVisual.get(3)) + .setDyeColor(team.getConfig().dyeColor().getRgb()) + .set(DataComponentTypes.ATTRIBUTE_MODIFIERS, AttributeModifiersComponent.DEFAULT).build()); player.equipStack(EquipmentSlot.OFFHAND, new ItemStack(DtmItems.MAP)); } public void updateMainTool(ServerPlayerEntity player, BlockState state) { ItemStack stack = player.getMainHandStack(); - if (stack.getRepairCost() == TOOL_REPAIR_COST) { + if (stack.getOrDefault(DataComponentTypes.REPAIR_COST, 0) == TOOL_REPAIR_COST) { ItemStack base = null; if (state.isIn(BlockTags.AXE_MINEABLE)) { if (!(stack.getItem() instanceof AxeItem)) { @@ -93,7 +107,7 @@ public void updateMainTool(ServerPlayerEntity player, BlockState state) { if (base != null && !base.isEmpty()) { player.getInventory().setStack(player.getInventory().selectedSlot, ItemStackBuilder.of(base) - .addModifier(EntityAttributes.GENERIC_ATTACK_DAMAGE, new EntityAttributeModifier(TOOL_DAMAGE, "tool", 0, EntityAttributeModifier.Operation.MULTIPLY_TOTAL), EquipmentSlot.MAINHAND) + .addModifier(EntityAttributes.ATTACK_DAMAGE, new EntityAttributeModifier(Item.BASE_ATTACK_DAMAGE_MODIFIER_ID, 0, EntityAttributeModifier.Operation.ADD_MULTIPLIED_TOTAL ), AttributeModifierSlot.MAINHAND) .setUnbreakable() .setRepairCost(TOOL_REPAIR_COST) .build()); diff --git a/src/main/java/eu/pb4/destroythemonument/items/DtmItems.java b/src/main/java/eu/pb4/destroythemonument/items/DtmItems.java index 92a27ba..51f9cf7 100644 --- a/src/main/java/eu/pb4/destroythemonument/items/DtmItems.java +++ b/src/main/java/eu/pb4/destroythemonument/items/DtmItems.java @@ -4,17 +4,23 @@ import eu.pb4.destroythemonument.other.DtmUtil; import eu.pb4.polymer.core.api.item.PolymerBlockItem; import eu.pb4.polymer.core.api.item.SimplePolymerItem; +import net.minecraft.block.AbstractBlock; +import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Rarity; +import java.util.function.Function; + public class DtmItems { - public static final Item CLASS_SELECTOR = new SimplePolymerItem(new Item.Settings(), Items.PAPER) { + public static final Item CLASS_SELECTOR = register("class_selector", (settings) -> new SimplePolymerItem(settings, Items.PAPER) { final Text NAME = Text.empty().append("[") .append(Text.translatable("item.destroy_the_monument.class_selector").formatted(Formatting.GOLD, Formatting.BOLD)) .append("]").formatted(Formatting.GRAY); @@ -23,25 +29,21 @@ public class DtmItems { public Text getName(ItemStack stack) { return NAME; } - }; - public static final Item MULTI_BLOCK = new MultiBlockItem(new Item.Settings()); - public static final Item WEAK_GLASS = new PolymerBlockItem(DtmBlocks.WEAK_GLASS, new Item.Settings(), Items.GLASS); - public static final Item LADDER = new PolymerBlockItem(DtmBlocks.LADDER, new Item.Settings(), Items.LADDER); - public static final Item MAP = new DtmMapItem(new Item.Settings()); - public static final GenericItem GENERIC_ITEM = new GenericItem(new Item.Settings()); - public static final Item TNT = new DtmTntItem(new Item.Settings()); + }); + public static final Item MULTI_BLOCK = register("multi_block", MultiBlockItem::new); + public static final Item WEAK_GLASS = register("weak_glass", (settings) -> new PolymerBlockItem(DtmBlocks.WEAK_GLASS, settings.useBlockPrefixedTranslationKey(), Items.GLASS)); + public static final Item LADDER = register("ladder", (settings) -> new PolymerBlockItem(DtmBlocks.LADDER, settings.useBlockPrefixedTranslationKey(), Items.LADDER)); + public static final Item MAP = register("map", DtmMapItem::new); + public static final Item TNT = register("tnt", DtmTntItem::new); public static void registerItems() { - register("class_selector", CLASS_SELECTOR); - register("multi_block", MULTI_BLOCK); - register("weak_glass", WEAK_GLASS); - register("map", MAP); - register("ladder", LADDER); - register("generic", GENERIC_ITEM); - register("tnt", TNT); + } - private static void register(String name, Item item) { - Registry.register(Registries.ITEM, DtmUtil.id(name), item); + private static T register(String name, Function func) { + var id = DtmUtil.id(name); + var block = func.apply(new Item.Settings().registryKey(RegistryKey.of(RegistryKeys.ITEM, id))); + Registry.register(Registries.ITEM, id, block); + return block; } } diff --git a/src/main/java/eu/pb4/destroythemonument/items/DtmMapItem.java b/src/main/java/eu/pb4/destroythemonument/items/DtmMapItem.java index 92e49b1..43c1530 100644 --- a/src/main/java/eu/pb4/destroythemonument/items/DtmMapItem.java +++ b/src/main/java/eu/pb4/destroythemonument/items/DtmMapItem.java @@ -1,12 +1,16 @@ package eu.pb4.destroythemonument.items; import eu.pb4.polymer.core.api.item.PolymerItem; -import net.minecraft.client.item.TooltipContext; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.MapIdComponent; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.Identifier; import org.jetbrains.annotations.Nullable; +import xyz.nucleoid.packettweaker.PacketContext; public class DtmMapItem extends Item implements PolymerItem { public DtmMapItem(Settings settings) { @@ -14,14 +18,17 @@ public DtmMapItem(Settings settings) { } @Override - public Item getPolymerItem(ItemStack stack, @Nullable ServerPlayerEntity player) { + public Item getPolymerItem(ItemStack stack, PacketContext context) { return Items.FILLED_MAP; } @Override - public ItemStack getPolymerItemStack(ItemStack itemStack, TooltipContext context, @Nullable ServerPlayerEntity player) { - ItemStack stack = PolymerItem.super.getPolymerItemStack(itemStack, context, player); - stack.getOrCreateNbt().putInt("map", 0); - return stack; + public @Nullable Identifier getPolymerItemModel(ItemStack stack, PacketContext context) { + return null; + } + + @Override + public void modifyBasePolymerItemStack(ItemStack out, ItemStack stack, PacketContext context) { + out.set(DataComponentTypes.MAP_ID, new MapIdComponent(0)); } } \ No newline at end of file diff --git a/src/main/java/eu/pb4/destroythemonument/items/DtmTntItem.java b/src/main/java/eu/pb4/destroythemonument/items/DtmTntItem.java index a844434..3f5f785 100644 --- a/src/main/java/eu/pb4/destroythemonument/items/DtmTntItem.java +++ b/src/main/java/eu/pb4/destroythemonument/items/DtmTntItem.java @@ -2,18 +2,17 @@ import eu.pb4.destroythemonument.entities.DtmTntEntity; import eu.pb4.polymer.core.api.item.PolymerItem; -import net.minecraft.client.item.TooltipContext; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsageContext; import net.minecraft.item.Items; -import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; -import net.minecraft.util.TypedActionResult; +import net.minecraft.util.Identifier; import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; +import xyz.nucleoid.packettweaker.PacketContext; public class DtmTntItem extends Item implements PolymerItem { public DtmTntItem(Settings settings) { @@ -21,21 +20,21 @@ public DtmTntItem(Settings settings) { } @Override - public TypedActionResult use(World world, PlayerEntity user, Hand hand) { + public ActionResult use(World world, PlayerEntity user, Hand hand) { var stack = user.getStackInHand(hand); - if (!stack.isEmpty() && !user.getItemCooldownManager().isCoolingDown(stack.getItem())) { + if (!stack.isEmpty() && !user.getItemCooldownManager().isCoolingDown(stack)) { stack.decrement(1); - user.getItemCooldownManager().set(stack.getItem(), 20); + user.getItemCooldownManager().set(stack, 20); DtmTntEntity.createThrown(user); - return TypedActionResult.success(stack); + return ActionResult.SUCCESS_SERVER; } return super.use(world, user, hand); } @Override public ActionResult useOnBlock(ItemUsageContext context) { - if (!context.getStack().isEmpty() && !context.getPlayer().getItemCooldownManager().isCoolingDown(context.getStack().getItem())) { - context.getPlayer().getItemCooldownManager().set(context.getStack().getItem(), 20); + if (!context.getStack().isEmpty() && !context.getPlayer().getItemCooldownManager().isCoolingDown(context.getStack())) { + context.getPlayer().getItemCooldownManager().set(context.getStack(), 20); context.getStack().decrement(1); DtmTntEntity.createPlaced(context.getPlayer(), context.getBlockPos().offset(context.getSide())); } @@ -43,15 +42,12 @@ public ActionResult useOnBlock(ItemUsageContext context) { } @Override - public Item getPolymerItem(ItemStack itemStack, @Nullable ServerPlayerEntity player) { - return Items.STICK; + public Item getPolymerItem(ItemStack itemStack, PacketContext context) { + return Items.TNT; } @Override - public ItemStack getPolymerItemStack(ItemStack itemStack, TooltipContext context, @Nullable ServerPlayerEntity player) { - var out = PolymerItem.super.getPolymerItemStack(itemStack, context, player); - var out2 = new ItemStack(Items.TNT, out.getCount()); - out2.setNbt(out.getNbt()); - return out2; + public @Nullable Identifier getPolymerItemModel(ItemStack stack, PacketContext context) { + return null; } } diff --git a/src/main/java/eu/pb4/destroythemonument/items/GenericItem.java b/src/main/java/eu/pb4/destroythemonument/items/GenericItem.java deleted file mode 100644 index 7b662b5..0000000 --- a/src/main/java/eu/pb4/destroythemonument/items/GenericItem.java +++ /dev/null @@ -1,69 +0,0 @@ -package eu.pb4.destroythemonument.items; - -import eu.pb4.polymer.core.api.item.PolymerItem; -import eu.pb4.polymer.core.api.item.PolymerItemUtils; -import eu.pb4.polymer.core.impl.PolymerImplUtils; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.item.DyeableItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.registry.Registries; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.Identifier; -import org.jetbrains.annotations.Nullable; - -public class GenericItem extends Item implements PolymerItem { - public GenericItem(Settings settings) { - super(settings); - } - - @Override - public String getTranslationKey() { - return ""; - } - - @Override - public Item getPolymerItem(ItemStack itemStack, ServerPlayerEntity player) { - if (itemStack.hasNbt() && itemStack.getNbt().contains("DisplayItem", NbtElement.COMPOUND_TYPE)) { - var id = Identifier.tryParse(itemStack.getSubNbt("DisplayItem").getString("id")); - return Registries.ITEM.get(id); - } - - return Items.STONE; - } - - @Override - public ItemStack getPolymerItemStack(ItemStack itemStack, TooltipContext context, ServerPlayerEntity player) { - var out = PolymerItemUtils.createItemStack(itemStack, context, player); - - if (itemStack.hasNbt() && itemStack.getNbt().contains("DisplayItem", NbtElement.COMPOUND_TYPE)) { - var def = itemStack.getSubNbt("DisplayItem"); - - if (def.contains("tag", NbtElement.COMPOUND_TYPE)) { - out.getNbt().copyFrom(def.getCompound("tag")); - } - } - - return out; - } - - public ItemStack create(ItemStack stack) { - var out = new ItemStack(this); - out.getOrCreateNbt().put("DisplayItem", stack.writeNbt(new NbtCompound())); - return out; - } - - public ItemStack create(ItemStack stack, int color) { - var out = create(stack); - out.getOrCreateNbt().putInt("Color", color); - return out; - } - - @Override - public int getPolymerArmorColor(ItemStack itemStack, @Nullable ServerPlayerEntity player) { - return itemStack.hasNbt() && itemStack.getNbt().contains("Color", NbtElement.INT_TYPE) ? PolymerItemUtils.getSafeColor(itemStack.getNbt().getInt("Color")) : -1; - } -} diff --git a/src/main/java/eu/pb4/destroythemonument/items/MultiBlockItem.java b/src/main/java/eu/pb4/destroythemonument/items/MultiBlockItem.java index 8bed893..8fc91d8 100644 --- a/src/main/java/eu/pb4/destroythemonument/items/MultiBlockItem.java +++ b/src/main/java/eu/pb4/destroythemonument/items/MultiBlockItem.java @@ -8,13 +8,15 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; -import net.minecraft.client.item.TooltipContext; import net.minecraft.item.*; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.registry.Registries; import net.minecraft.server.network.ServerPlayerEntity; -import xyz.nucleoid.plasmid.game.GameSpace; -import xyz.nucleoid.plasmid.game.manager.GameSpaceManager; -import xyz.nucleoid.plasmid.util.PlayerRef; +import xyz.nucleoid.packettweaker.PacketContext; +import xyz.nucleoid.plasmid.api.game.GameAttachment; +import xyz.nucleoid.plasmid.api.game.GameSpace; +import xyz.nucleoid.plasmid.api.game.GameSpaceManager; +import xyz.nucleoid.plasmid.api.util.PlayerRef; import java.util.Map; @@ -23,17 +25,12 @@ public MultiBlockItem(Settings settings) { super(Blocks.BIRCH_PLANKS, settings); } - @Override - public String getTranslationKey() { - return this.getOrCreateTranslationKey(); - } - @Override protected BlockState getPlacementState(ItemPlacementContext context) { if (context.getPlayer() != null) { GameSpace gameSpace = GameSpaceManager.get().byPlayer(context.getPlayer()); if (gameSpace != null) { - BaseGameLogic logic = DTM.ACTIVE_GAMES.get(gameSpace); + BaseGameLogic logic = gameSpace.getAttachment(DTM.GAME_LOGIC); if (logic != null) { Block block = logic.participants.get(PlayerRef.of(context.getPlayer())).selectedBlock; @@ -53,16 +50,21 @@ public void appendBlocks(Map map, Item item) { } @Override - public Item getPolymerItem(ItemStack itemStack, ServerPlayerEntity player) { + public Item getPolymerItem(ItemStack itemStack, PacketContext context) { return Items.BIRCH_PLANKS; } @Override - public ItemStack getPolymerItemStack(ItemStack itemStack, TooltipContext context, ServerPlayerEntity player) { + public ItemStack getPolymerItemStack(ItemStack itemStack, TooltipType type, PacketContext context) { + var player = context.getPlayer(); + if (player == null) { + return PolymerItem.super.getPolymerItemStack(itemStack, type, context); + } + Item item = Items.BIRCH_PLANKS; GameSpace gameSpace = GameSpaceManager.get().byPlayer(player); if (gameSpace != null) { - BaseGameLogic logic = DTM.ACTIVE_GAMES.get(gameSpace); + BaseGameLogic logic = gameSpace.getAttachment(DTM.GAME_LOGIC); if (logic != null) { PlayerData data = logic.participants.get(PlayerRef.of(player)); @@ -75,20 +77,13 @@ public ItemStack getPolymerItemStack(ItemStack itemStack, TooltipContext context if (item instanceof PolymerItem virtualItem && item != this) { ItemStack stack = item.getDefaultStack(); stack.setCount(itemStack.getCount()); - ItemStack out = virtualItem.getPolymerItemStack(stack, context, player); - out.getOrCreateNbt().putString(PolymerItemUtils.POLYMER_ITEM_ID, Registries.ITEM.getId(itemStack.getItem()).toString()); + ItemStack out = virtualItem.getPolymerItemStack(stack, type, context); + //out.getOrCreateNbt().putString(PolymerItemUtils.POLYMER_ITEM_ID, Registries.ITEM.getId(itemStack.getItem()).toString()); return out; } - } - - ItemStack out = new ItemStack(item, itemStack.getCount()); - if (itemStack.getNbt() != null) { - out.getOrCreateNbt().put(PolymerItemUtils.REAL_TAG, itemStack.getNbt()); + return new ItemStack(item, itemStack.getCount()); } - - out.getOrCreateNbt().putString(PolymerItemUtils.POLYMER_ITEM_ID, Registries.ITEM.getId(itemStack.getItem()).toString()); - - return out; + return PolymerItem.super.getPolymerItemStack(itemStack, type, context); } } diff --git a/src/main/java/eu/pb4/destroythemonument/mixin/AttributeContainerMixin.java b/src/main/java/eu/pb4/destroythemonument/mixin/AttributeContainerMixin.java index 84d9832..54277ba 100644 --- a/src/main/java/eu/pb4/destroythemonument/mixin/AttributeContainerMixin.java +++ b/src/main/java/eu/pb4/destroythemonument/mixin/AttributeContainerMixin.java @@ -5,6 +5,7 @@ import net.minecraft.entity.attribute.DefaultAttributeContainer; import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.attribute.EntityAttributeInstance; +import net.minecraft.registry.entry.RegistryEntry; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -13,10 +14,11 @@ @Mixin(AttributeContainer.class) public class AttributeContainerMixin implements DtmResetable { - @Shadow @Final private Map custom; @Shadow @Final private DefaultAttributeContainer fallback; + @Shadow @Final private Map, EntityAttributeInstance> custom; + @Override public void dtm$reset() { for (var x : this.custom.entrySet()) { diff --git a/src/main/java/eu/pb4/destroythemonument/other/DtmUtil.java b/src/main/java/eu/pb4/destroythemonument/other/DtmUtil.java index 0fe9a45..ea3b4d7 100644 --- a/src/main/java/eu/pb4/destroythemonument/other/DtmUtil.java +++ b/src/main/java/eu/pb4/destroythemonument/other/DtmUtil.java @@ -8,12 +8,11 @@ import net.minecraft.util.Identifier; import net.minecraft.util.Util; import org.jetbrains.annotations.Nullable; -import xyz.nucleoid.plasmid.game.common.team.GameTeam; -import xyz.nucleoid.plasmid.game.manager.GameSpaceManager; +import xyz.nucleoid.plasmid.api.game.GameSpaceManager; public class DtmUtil { public static MutableText getText(String type, String path, Object... values) { - return Text.translatable(Util.createTranslationKey(type, new Identifier(DTM.ID, path)), values); + return Text.translatable(Util.createTranslationKey(type, Identifier.of(DTM.ID, path)), values); } public static MutableText getTeamText(TeamData team) { @@ -21,7 +20,7 @@ public static MutableText getTeamText(TeamData team) { } public static Identifier id(String path) { - return new Identifier(DTM.ID, path); + return Identifier.of(DTM.ID, path); } @Nullable @@ -29,7 +28,7 @@ public static BaseGameLogic getGame(LivingEntity player) { var game = GameSpaceManager.get().byWorld(player.getWorld()); if (game != null) { - return DTM.ACTIVE_GAMES.get(game); + return game.getAttachment(DTM.GAME_LOGIC); } return null; diff --git a/src/main/java/eu/pb4/destroythemonument/ui/BlockSelectorUI.java b/src/main/java/eu/pb4/destroythemonument/ui/BlockSelectorUI.java index 7803d1f..fcfc24f 100644 --- a/src/main/java/eu/pb4/destroythemonument/ui/BlockSelectorUI.java +++ b/src/main/java/eu/pb4/destroythemonument/ui/BlockSelectorUI.java @@ -10,7 +10,7 @@ import net.minecraft.registry.Registries; import net.minecraft.screen.ScreenHandlerType; import net.minecraft.server.network.ServerPlayerEntity; -import xyz.nucleoid.plasmid.util.PlayerRef; +import xyz.nucleoid.plasmid.api.util.PlayerRef; public class BlockSelectorUI extends SimpleGui { private final PlayerData playerData; @@ -21,7 +21,7 @@ public BlockSelectorUI(ServerPlayerEntity player, PlayerData data, BaseGameLogic this.setTitle(DtmUtil.getText("ui", "select_block")); int pos = 0; - for (var block : Registries.BLOCK.getEntryList(DTM.BUILDING_BLOCKS).get()) { + for (var block : Registries.BLOCK.getOrThrow(DTM.BUILDING_BLOCKS)) { GuiElementBuilder icon = new GuiElementBuilder(block.value().asItem(), 1); icon.setCallback((x, clickType, z) -> { this.playerData.selectedBlock = block.value(); diff --git a/src/main/java/eu/pb4/destroythemonument/ui/ClassPreviewUI.java b/src/main/java/eu/pb4/destroythemonument/ui/ClassPreviewUI.java index e437536..3bfebcf 100644 --- a/src/main/java/eu/pb4/destroythemonument/ui/ClassPreviewUI.java +++ b/src/main/java/eu/pb4/destroythemonument/ui/ClassPreviewUI.java @@ -55,16 +55,16 @@ public ClassPreviewUI(ClassSelectorUI selectorUI, PlayerClass playerClass) { for (var x : playerClass.attributes().entrySet()) { String num; - if (x.getKey() == EntityAttributes.GENERIC_MOVEMENT_SPEED) { + if (x.getKey() == EntityAttributes.MOVEMENT_SPEED) { num = df.format(x.getValue() * 20) + " m/s"; - } else if (x.getKey() == EntityAttributes.GENERIC_ARMOR || x.getKey() == EntityAttributes.GENERIC_MAX_HEALTH) { + } else if (x.getKey() == EntityAttributes.ARMOR || x.getKey() == EntityAttributes.MAX_HEALTH) { num = String.valueOf(x.getValue().intValue()); } else { num = (int) (x.getValue() * 100) + "%"; } b.addLoreLine(Text.empty() - .append(Text.translatable(x.getKey().getTranslationKey()) + .append(Text.translatable(x.getKey().value().getTranslationKey()) .append(Text.literal(": ").formatted(Formatting.GRAY)) .append(Text.literal(num)))); } @@ -73,7 +73,7 @@ public ClassPreviewUI(ClassSelectorUI selectorUI, PlayerClass playerClass) { this.setSlot(this.size - 1, new GuiElementBuilder(Items.BARRIER) .setName(DtmUtil.getText("ui", "return_selector").setStyle(Style.EMPTY.withItalic(false))) .setCallback((x, y, z) -> { - this.player.playSound(SoundEvents.ITEM_BOOK_PAGE_TURN, SoundCategory.MASTER, 0.5f, 1); + this.player.playSoundToPlayer(SoundEvents.ITEM_BOOK_PAGE_TURN, SoundCategory.MASTER, 0.5f, 1); selectorUI.open(); }) ); diff --git a/src/main/java/eu/pb4/destroythemonument/ui/ClassSelectorUI.java b/src/main/java/eu/pb4/destroythemonument/ui/ClassSelectorUI.java index 90b61b8..1cc925e 100644 --- a/src/main/java/eu/pb4/destroythemonument/ui/ClassSelectorUI.java +++ b/src/main/java/eu/pb4/destroythemonument/ui/ClassSelectorUI.java @@ -18,7 +18,7 @@ import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import xyz.nucleoid.map_templates.BlockBounds; -import xyz.nucleoid.plasmid.util.PlayerRef; +import xyz.nucleoid.plasmid.api.util.PlayerRef; import java.util.ArrayList; import java.util.List; @@ -76,7 +76,7 @@ public void updateIcons() { for (PlayerClass kit : this.kits) { GuiElementBuilder icon = GuiElementBuilder.from(kit.icon()); icon.setName(DtmUtil.getText("class", kit.name())); - icon.hideFlags(); + icon.hideDefaultTooltip(); if (kit == this.playerData.selectedClass) { icon.glow(); } @@ -87,10 +87,10 @@ public void updateIcons() { icon.setCallback((x, clickType, z) -> { if (clickType.isLeft) { - this.player.playSound(SoundEvents.UI_BUTTON_CLICK.value(), SoundCategory.MASTER, 0.5f, 1); + this.player.playSoundToPlayer(SoundEvents.UI_BUTTON_CLICK.value(), SoundCategory.MASTER, 0.5f, 1); changeKit(this.game, this.player, this.playerData, kit); } else if (clickType.isRight) { - this.player.playSound(SoundEvents.ITEM_BOOK_PAGE_TURN, SoundCategory.MASTER, 0.5f, 1); + this.player.playSoundToPlayer(SoundEvents.ITEM_BOOK_PAGE_TURN, SoundCategory.MASTER, 0.5f, 1); new ClassPreviewUI(this, kit).open(); } this.updateIcons(); diff --git a/src/main/resources/data/destroy_the_monument/class_dtm/archer.json b/src/main/resources/data/destroy_the_monument/class_dtm/archer.json index 5d287d7..725f289 100644 --- a/src/main/resources/data/destroy_the_monument/class_dtm/archer.json +++ b/src/main/resources/data/destroy_the_monument/class_dtm/archer.json @@ -2,9 +2,9 @@ "class_name": "archer", "icon": "bow", "attributes": { - "generic.max_health": 18, - "generic.movement_speed": 0.13, - "generic.armor": 9 + "max_health": 18, + "movement_speed": 0.13, + "armor": 9 }, "pickaxe_tool": "diamond_pickaxe", "axe_tool": "iron_axe", @@ -17,14 +17,11 @@ "items": [ { "id": "golden_sword", - "Count": 1, - "tag": { - "Enchantments": [ - { - "id": "sharpness", - "lvl": 1 - } - ] + "count": 1, + "components": { + "enchantments": { + "sharpness": 1 + } } }, "bow" diff --git a/src/main/resources/data/destroy_the_monument/class_dtm/berserker.json b/src/main/resources/data/destroy_the_monument/class_dtm/berserker.json index b73724f..bddad20 100644 --- a/src/main/resources/data/destroy_the_monument/class_dtm/berserker.json +++ b/src/main/resources/data/destroy_the_monument/class_dtm/berserker.json @@ -3,9 +3,9 @@ "icon": "iron_axe", "pickaxe_tool": "diamond_pickaxe", "attributes": { - "generic.max_health": 20, - "generic.movement_speed": 0.13, - "generic.armor": 3 + "max_health": 20, + "movement_speed": 0.13, + "armor": 3 }, "axe_tool": "air", "armor": [ diff --git a/src/main/resources/data/destroy_the_monument/class_dtm/constructor.json b/src/main/resources/data/destroy_the_monument/class_dtm/constructor.json index 487968e..2b9f2b2 100644 --- a/src/main/resources/data/destroy_the_monument/class_dtm/constructor.json +++ b/src/main/resources/data/destroy_the_monument/class_dtm/constructor.json @@ -2,8 +2,8 @@ "class_name": "constructor", "icon": "oak_planks", "attributes": { - "generic.armor": 7, - "generic.movement_speed": 0.11 + "armor": 7, + "movement_speed": 0.11 }, "blocks_to_planks": 1, "pickaxe_tool": "diamond_pickaxe", @@ -17,7 +17,7 @@ "items": [ { "id": "stone_sword", - "Count": 1 + "count": 1 } ], "restockable_items": [ diff --git a/src/main/resources/data/destroy_the_monument/class_dtm/tank.json b/src/main/resources/data/destroy_the_monument/class_dtm/tank.json index d17fbeb..80cc761 100644 --- a/src/main/resources/data/destroy_the_monument/class_dtm/tank.json +++ b/src/main/resources/data/destroy_the_monument/class_dtm/tank.json @@ -2,10 +2,10 @@ "class_name": "tank", "icon": "diamond_chestplate", "attributes": { - "generic.max_health": 24, - "generic.movement_speed": 0.105, - "generic.knockback_resistance": 0.12, - "generic.armor": 14 + "max_health": 24, + "movement_speed": 0.105, + "knockback_resistance": 0.12, + "armor": 14 }, "pickaxe_tool": "diamond_pickaxe", "axe_tool": "iron_axe", diff --git a/src/main/resources/data/destroy_the_monument/class_dtm/warrior.json b/src/main/resources/data/destroy_the_monument/class_dtm/warrior.json index ac87f6b..7f45c39 100644 --- a/src/main/resources/data/destroy_the_monument/class_dtm/warrior.json +++ b/src/main/resources/data/destroy_the_monument/class_dtm/warrior.json @@ -2,8 +2,8 @@ "class_name": "warrior", "icon": "diamond_sword", "attributes": { - "generic.armor": 8, - "generic.movement_speed": 0.11 + "armor": 8, + "movement_speed": 0.11 }, "pickaxe_tool": "diamond_pickaxe", "axe_tool": "iron_axe", @@ -16,14 +16,11 @@ "items": [ { "id": "diamond_sword", - "Count": 1, - "tag": { - "Enchantments": [ - { - "id": "sharpness", - "lvl": 1 - } - ] + "count": 1, + "components": { + "enchantments": { + "sharpness": 1 + } } } ], diff --git a/src/main/resources/data/destroy_the_monument/map_templates/cubes.nbt b/src/main/resources/data/destroy_the_monument/map_template/cubes.nbt similarity index 100% rename from src/main/resources/data/destroy_the_monument/map_templates/cubes.nbt rename to src/main/resources/data/destroy_the_monument/map_template/cubes.nbt diff --git a/src/main/resources/data/destroy_the_monument/map_templates/cubes2.nbt b/src/main/resources/data/destroy_the_monument/map_template/cubes2.nbt similarity index 100% rename from src/main/resources/data/destroy_the_monument/map_templates/cubes2.nbt rename to src/main/resources/data/destroy_the_monument/map_template/cubes2.nbt diff --git a/src/main/resources/data/destroy_the_monument/map_templates/dimensions.nbt b/src/main/resources/data/destroy_the_monument/map_template/dimensions.nbt similarity index 100% rename from src/main/resources/data/destroy_the_monument/map_templates/dimensions.nbt rename to src/main/resources/data/destroy_the_monument/map_template/dimensions.nbt diff --git a/src/main/resources/data/destroy_the_monument/map_templates/forest4.nbt b/src/main/resources/data/destroy_the_monument/map_template/forest4.nbt similarity index 100% rename from src/main/resources/data/destroy_the_monument/map_templates/forest4.nbt rename to src/main/resources/data/destroy_the_monument/map_template/forest4.nbt diff --git a/src/main/resources/data/destroy_the_monument/map_templates/honey.nbt b/src/main/resources/data/destroy_the_monument/map_template/honey.nbt similarity index 100% rename from src/main/resources/data/destroy_the_monument/map_templates/honey.nbt rename to src/main/resources/data/destroy_the_monument/map_template/honey.nbt diff --git a/src/main/resources/data/destroy_the_monument/map_templates/kuber.nbt b/src/main/resources/data/destroy_the_monument/map_template/kuber.nbt similarity index 100% rename from src/main/resources/data/destroy_the_monument/map_templates/kuber.nbt rename to src/main/resources/data/destroy_the_monument/map_template/kuber.nbt diff --git a/src/main/resources/data/destroy_the_monument/map_templates/kupol.nbt b/src/main/resources/data/destroy_the_monument/map_template/kupol.nbt similarity index 100% rename from src/main/resources/data/destroy_the_monument/map_templates/kupol.nbt rename to src/main/resources/data/destroy_the_monument/map_template/kupol.nbt diff --git a/src/main/resources/data/destroy_the_monument/map_templates/mine.nbt b/src/main/resources/data/destroy_the_monument/map_template/mine.nbt similarity index 100% rename from src/main/resources/data/destroy_the_monument/map_templates/mine.nbt rename to src/main/resources/data/destroy_the_monument/map_template/mine.nbt diff --git a/src/main/resources/data/destroy_the_monument/games/concrete.json b/src/main/resources/data/destroy_the_monument/plasmid/game/concrete.json similarity index 89% rename from src/main/resources/data/destroy_the_monument/games/concrete.json rename to src/main/resources/data/destroy_the_monument/plasmid/game/concrete.json index 53a41ac..a878154 100644 --- a/src/main/resources/data/destroy_the_monument/games/concrete.json +++ b/src/main/resources/data/destroy_the_monument/plasmid/game/concrete.json @@ -9,9 +9,9 @@ }, "icon": "gray_concrete", "description": [ - "", - "", - "", + "", + "", + "", "", "Patbox'>" ], diff --git a/src/main/resources/data/destroy_the_monument/games/cubes.json b/src/main/resources/data/destroy_the_monument/plasmid/game/cubes.json similarity index 100% rename from src/main/resources/data/destroy_the_monument/games/cubes.json rename to src/main/resources/data/destroy_the_monument/plasmid/game/cubes.json diff --git a/src/main/resources/data/destroy_the_monument/games/dimensions.json b/src/main/resources/data/destroy_the_monument/plasmid/game/dimensions.json similarity index 100% rename from src/main/resources/data/destroy_the_monument/games/dimensions.json rename to src/main/resources/data/destroy_the_monument/plasmid/game/dimensions.json diff --git a/src/main/resources/data/destroy_the_monument/games/forest4.json b/src/main/resources/data/destroy_the_monument/plasmid/game/forest4.json similarity index 100% rename from src/main/resources/data/destroy_the_monument/games/forest4.json rename to src/main/resources/data/destroy_the_monument/plasmid/game/forest4.json diff --git a/src/main/resources/data/destroy_the_monument/games/honey.json b/src/main/resources/data/destroy_the_monument/plasmid/game/honey.json similarity index 100% rename from src/main/resources/data/destroy_the_monument/games/honey.json rename to src/main/resources/data/destroy_the_monument/plasmid/game/honey.json diff --git a/src/main/resources/data/destroy_the_monument/games/kuber.json b/src/main/resources/data/destroy_the_monument/plasmid/game/kuber.json similarity index 100% rename from src/main/resources/data/destroy_the_monument/games/kuber.json rename to src/main/resources/data/destroy_the_monument/plasmid/game/kuber.json diff --git a/src/main/resources/data/destroy_the_monument/games/kupol.json b/src/main/resources/data/destroy_the_monument/plasmid/game/kupol.json similarity index 100% rename from src/main/resources/data/destroy_the_monument/games/kupol.json rename to src/main/resources/data/destroy_the_monument/plasmid/game/kupol.json diff --git a/src/main/resources/data/destroy_the_monument/games/kupol_duels.json b/src/main/resources/data/destroy_the_monument/plasmid/game/kupol_duels.json similarity index 100% rename from src/main/resources/data/destroy_the_monument/games/kupol_duels.json rename to src/main/resources/data/destroy_the_monument/plasmid/game/kupol_duels.json diff --git a/src/main/resources/data/destroy_the_monument/games/mine.json b/src/main/resources/data/destroy_the_monument/plasmid/game/mine.json similarity index 100% rename from src/main/resources/data/destroy_the_monument/games/mine.json rename to src/main/resources/data/destroy_the_monument/plasmid/game/mine.json diff --git a/src/main/resources/data/destroy_the_monument/games/x_debug.json b/src/main/resources/data/destroy_the_monument/plasmid/game/x_debug.json similarity index 96% rename from src/main/resources/data/destroy_the_monument/games/x_debug.json rename to src/main/resources/data/destroy_the_monument/plasmid/game/x_debug.json index fd0b5ed..4500cfa 100644 --- a/src/main/resources/data/destroy_the_monument/games/x_debug.json +++ b/src/main/resources/data/destroy_the_monument/plasmid/game/x_debug.json @@ -31,11 +31,10 @@ "name": "Red", "key": "red", "color": { - "chat": "#ff00ff", "dye": "#ff0000", "block_dye": "green", "firework": "#00ff00", - "formatting": "gold" + "chat": "gold" } }, { diff --git a/src/main/resources/data/destroy_the_monument/games/x_debug_capture.json b/src/main/resources/data/destroy_the_monument/plasmid/game/x_debug_capture.json similarity index 100% rename from src/main/resources/data/destroy_the_monument/games/x_debug_capture.json rename to src/main/resources/data/destroy_the_monument/plasmid/game/x_debug_capture.json diff --git a/src/main/resources/data/destroy_the_monument/games/x_debug_cubes2.json b/src/main/resources/data/destroy_the_monument/plasmid/game/x_debug_cubes2.json similarity index 100% rename from src/main/resources/data/destroy_the_monument/games/x_debug_cubes2.json rename to src/main/resources/data/destroy_the_monument/plasmid/game/x_debug_cubes2.json diff --git a/src/main/resources/data/destroy_the_monument/games/x_forest4debug.json b/src/main/resources/data/destroy_the_monument/plasmid/game/x_forest4debug.json similarity index 100% rename from src/main/resources/data/destroy_the_monument/games/x_forest4debug.json rename to src/main/resources/data/destroy_the_monument/plasmid/game/x_forest4debug.json diff --git a/src/main/resources/data/destroy_the_monument/tags/blocks/building_blocks.json b/src/main/resources/data/destroy_the_monument/tags/block/building_blocks.json similarity index 100% rename from src/main/resources/data/destroy_the_monument/tags/blocks/building_blocks.json rename to src/main/resources/data/destroy_the_monument/tags/block/building_blocks.json diff --git a/src/main/resources/data/destroy_the_monument/tags/blocks/spawnable.json b/src/main/resources/data/destroy_the_monument/tags/block/spawnable.json similarity index 100% rename from src/main/resources/data/destroy_the_monument/tags/blocks/spawnable.json rename to src/main/resources/data/destroy_the_monument/tags/block/spawnable.json diff --git a/src/main/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/main/resources/data/minecraft/tags/block/mineable/axe.json similarity index 100% rename from src/main/resources/data/minecraft/tags/blocks/mineable/axe.json rename to src/main/resources/data/minecraft/tags/block/mineable/axe.json diff --git a/src/main/resources/destroythemonument.mixins.json b/src/main/resources/destroythemonument.mixins.json index 8c529f5..affbb6f 100644 --- a/src/main/resources/destroythemonument.mixins.json +++ b/src/main/resources/destroythemonument.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "eu.pb4.destroythemonument.mixin", - "compatibilityLevel": "JAVA_16", + "compatibilityLevel": "JAVA_21", "mixins": [ "AttributeContainerMixin", "ServerPlayerInteractionManagerMixin" diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 3df2966..eab5696 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -20,6 +20,6 @@ "depends": { "fabricloader": ">=0.9.1", "fabric": "*", - "plasmid": "0.5.x" + "plasmid": "0.6.x" } }