From 52443a1e6bd450d5907d3c80e3021d23d2eeb40c Mon Sep 17 00:00:00 2001 From: StewStrong Date: Tue, 24 Sep 2024 05:08:37 -0700 Subject: [PATCH] Merge from 1.18.x/main --- README.md | 6 - common/build.gradle | 10 + .../mod/mixin/entity/MixinEntity.java | 5 +- .../MixinBlockItem.java | 47 +- .../feature/entity_collision/MixinEntity.java | 5 + .../MixinPersistentEntitySectionManager.java | 76 - .../bluemap/HiresTileModelAccessor.java | 15 + .../mixin/mod_compat/bluemap/MixinBmMap.java | 47 + .../bluemap/MixinHiresModelManager.java | 100 ++ .../mixin/mod_compat/bluemap/MixinWorld.java | 36 + .../accessors/ChuteBlockEntityAccessor.java | 16 + .../create/client/MixinDeployTool.java | 67 + .../create/client/MixinSchematicToolBase.java | 70 + .../client/MixinSchematicTransformation.java | 57 + .../MixinAbstractContraptionEntity.java | 16 +- .../MixinPitchOrientedContraptionEntity.java | 9 + .../MixinBlockEntityInstanceManager.java | 4 +- .../sodium/MixinRenderSectionManager.java | 10 + .../MixinLevelRendererVanilla.java | 21 + .../mixin/server/MinecraftServerAccessor.java | 13 + .../mixin/server/MixinMinecraftServer.java | 28 +- .../mixin/server/world/MixinServerLevel.java | 9 +- .../mixin/world/chunk/MixinLevelChunk.java | 6 +- .../mod_compat/bluemap/WorldDuck.java | 10 + .../org/valkyrienskies/mod/api/VsAPI.kt | 56 + .../mod/api/events/PostRenderShipEvent.kt | 6 + .../mod/api/events/PreRenderShipEvent.kt | 6 + .../mod/api/events/RegisterBlockStateEvent.kt | 25 + .../events/RegisterBlockStateEventImpl.kt | 36 + .../mod/api_impl/events/VSApiImpl.kt | 44 + .../mod/common/BlockStateInfoProvider.kt | 9 - .../common/DefaultBlockStateInfoProvider.kt | 22 +- .../valkyrienskies/mod/common/PlayerUtil.kt | 33 +- .../valkyrienskies/mod/common/VSGameUtils.kt | 25 +- .../mod/common/ValkyrienSkiesMod.kt | 5 +- .../mod/common/assembly/AssemblyUtil.kt | 147 ++ .../common/assembly/SeamlessChunksManager.kt | 15 +- .../mod/common/assembly/ShipAssembler.kt | 115 ++ .../mod/common/assembly/ShipAssembly.kt | 88 +- .../mod/common/command/ShipArgumentParser.kt | 10 +- .../mod/common/config/VSGameConfig.kt | 24 + .../mod/common/config/VSMassDataLoader.kt | 301 ++-- .../mod/common/entity/ShipMountingEntity.kt | 6 +- .../mod/common/entity/VSPhysicsEntity.kt | 5 +- .../common/entity/handling/VSEntityManager.kt | 7 +- .../mod/common/hooks/VSGameEvents.kt | 12 +- .../mod/common/networking/VSGamePackets.kt | 8 +- .../common/util/EntityShipCollisionUtils.kt | 3 +- .../valkyrienskies/mod/compat/LoadedMods.kt | 3 + .../mod/compat/Weather2Compat.kt | 73 + .../mod/compat/clothconfig/VSClothConfig.kt | 8 +- .../org/valkyrienskies/mod/util/McMathUtil.kt | 4 + .../assets/valkyrienskies/lang/ko_kr.json | 25 + .../valkyrienskies/vs_mass/1_18_blocks.json | 220 +-- .../data/valkyrienskies/vs_mass/1_19_blocks | 44 +- .../data/valkyrienskies/vs_mass/1_20_blocks | 48 +- .../valkyrienskies/vs_mass/computercraft.json | 24 +- .../vs_mass/crafting_stations.json | 34 +- .../data/valkyrienskies/vs_mass/ground.json | 94 +- .../data/valkyrienskies/vs_mass/masonry.json | 334 ++-- .../data/valkyrienskies/vs_mass/misc.json | 204 +-- .../data/valkyrienskies/vs_mass/plants.json | 30 +- .../vs_mass/redstone_components.json | 72 +- .../vs_mass/steelarmorblocks.json | 1486 +++++++++++++++++ .../data/valkyrienskies/vs_mass/wood.json | 122 +- .../valkyrienskies-common.mixins.json | 12 +- fabric/build.gradle | 8 + .../cc_restitched/MixinSpeakerPosition.java | 48 - .../cc_restitched/MixinSpeakerSound.java | 64 + .../mixin/compat/cc_restitched/README.MD | 2 +- .../compat/create/MixinChuteBlockEntity.java | 63 + .../create/client/MixinTrackBlockOutline.java | 134 ++ .../MixinPersistentEntitySectionManager.java | 58 + .../fabric/compat/modmenu/ValkyrienModMenu.kt | 7 +- .../valkyrienskies-fabric.mixins.json | 5 +- forge/build.gradle | 11 +- .../cc_tweaked/MixinSpeakerPosition.java | 47 - .../compat/cc_tweaked/MixinSpeakerSound.java | 64 + .../forge/mixin/compat/cc_tweaked/README.MD | 2 +- .../compat/create/MixinChuteBlockEntity.java | 63 + .../create/client/MixinTrackBlockOutline.java | 126 ++ .../mekanism/MixinRadiationManager.java | 31 + .../MixinPersistentEntitySectionManager.java | 58 + .../forge/common/ValkyrienSkiesModForge.kt | 7 +- .../valkyrienskies-forge.mixins.json | 7 +- gradle.properties | 2 +- 86 files changed, 4132 insertions(+), 1203 deletions(-) delete mode 100644 common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java create mode 100644 common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/bluemap/HiresTileModelAccessor.java create mode 100644 common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/bluemap/MixinBmMap.java create mode 100644 common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/bluemap/MixinHiresModelManager.java create mode 100644 common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/bluemap/MixinWorld.java create mode 100644 common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/accessors/ChuteBlockEntityAccessor.java create mode 100644 common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinDeployTool.java create mode 100644 common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinSchematicToolBase.java create mode 100644 common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinSchematicTransformation.java create mode 100644 common/src/main/java/org/valkyrienskies/mod/mixin/server/MinecraftServerAccessor.java create mode 100644 common/src/main/java/org/valkyrienskies/mod/mixinducks/mod_compat/bluemap/WorldDuck.java create mode 100644 common/src/main/kotlin/org/valkyrienskies/mod/api/VsAPI.kt create mode 100644 common/src/main/kotlin/org/valkyrienskies/mod/api/events/PostRenderShipEvent.kt create mode 100644 common/src/main/kotlin/org/valkyrienskies/mod/api/events/PreRenderShipEvent.kt create mode 100644 common/src/main/kotlin/org/valkyrienskies/mod/api/events/RegisterBlockStateEvent.kt create mode 100644 common/src/main/kotlin/org/valkyrienskies/mod/api_impl/events/RegisterBlockStateEventImpl.kt create mode 100644 common/src/main/kotlin/org/valkyrienskies/mod/api_impl/events/VSApiImpl.kt create mode 100644 common/src/main/kotlin/org/valkyrienskies/mod/common/assembly/AssemblyUtil.kt create mode 100644 common/src/main/kotlin/org/valkyrienskies/mod/common/assembly/ShipAssembler.kt create mode 100644 common/src/main/kotlin/org/valkyrienskies/mod/compat/Weather2Compat.kt create mode 100644 common/src/main/resources/assets/valkyrienskies/lang/ko_kr.json create mode 100644 common/src/main/resources/data/valkyrienskies/vs_mass/steelarmorblocks.json delete mode 100644 fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerPosition.java create mode 100644 fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerSound.java create mode 100644 fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/create/MixinChuteBlockEntity.java create mode 100644 fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/create/client/MixinTrackBlockOutline.java create mode 100644 fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java delete mode 100644 forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerPosition.java create mode 100644 forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerSound.java create mode 100644 forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/create/MixinChuteBlockEntity.java create mode 100644 forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/create/client/MixinTrackBlockOutline.java create mode 100644 forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/mekanism/MixinRadiationManager.java create mode 100644 forge/src/main/java/org/valkyrienskies/mod/forge/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java diff --git a/README.md b/README.md index 5592c99ca..f12a0854f 100644 --- a/README.md +++ b/README.md @@ -23,12 +23,6 @@ You can download official releases of Valkyrien Skies from our [website](https:/ ## Development -Valkyrien Skies 2 source code is split between the code in this repository, and -the code in [vs-core](https://github.com/ValkyrienSkies/vs-core). - -The Minecraft version dependent code lives in this repository, and the version -independent code lives in [vs-core](https://github.com/ValkyrienSkies/vs-core). - ### IntelliJ 1. Clone the diff --git a/common/build.gradle b/common/build.gradle index 0964ac38e..5e2948337 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -17,6 +17,8 @@ dependencies { exclude module: "fastutil" } + implementation("org.valkyrienskies.core:api:${rootProject.vs_core_version}") + implementation("org.valkyrienskies.core:api-game:${rootProject.vs_core_version}") implementation("org.valkyrienskies.core:util:${rootProject.vs_core_version}") // FTB Stuffs @@ -24,6 +26,9 @@ dependencies { modCompileOnly("curse.maven:ftb-teams-404468:4229138") modCompileOnly("curse.maven:ftb-chunks-314906:4229120") + // Weather2 1.18 + // modCompileOnly("curse.maven:weather-storms-tornadoes-237746:4426524") + //Common create compat, //We just use a version from a platform and hope the classes exist on both versions and mixins apply correctly modCompileOnly("com.simibubi.create:create-fabric-${minecraft_version}:${create_fabric_version}") @@ -34,6 +39,11 @@ dependencies { //implementation("io.github.fabricators_of_create.Porting-Lib:Porting-Lib:$port_lib_version+$minecraft_version") modCompileOnly("maven.modrinth:create-big-cannons:${createbigcannons_version}") + modCompileOnly("io.github.fabricators_of_create:Porting-Lib:${port_lib_version}+${minecraft_version}") + modCompileOnly("com.rbasamoyai:createbigcannons-fabric-${minecraft_version}:${createbigcannons_version}") + + //Bluemap fabric 1.19 + modCompileOnly("curse.maven:bluemap-406463:4474497") } architectury { diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/entity/MixinEntity.java b/common/src/main/java/org/valkyrienskies/mod/mixin/entity/MixinEntity.java index 94b1c5eb3..7b5178cfc 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/entity/MixinEntity.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/entity/MixinEntity.java @@ -31,7 +31,6 @@ import org.valkyrienskies.core.api.ships.LoadedShip; import org.valkyrienskies.core.api.ships.Ship; import org.valkyrienskies.core.api.ships.properties.ShipTransform; -import org.valkyrienskies.core.impl.game.ships.ShipObjectClient; import org.valkyrienskies.mod.common.entity.ShipMountedToData; import org.valkyrienskies.mod.common.VSGameUtilsKt; import org.valkyrienskies.mod.common.util.EntityDraggingInformation; @@ -112,8 +111,8 @@ private void preGetEyePosition(final float partialTicks, final CallbackInfoRetur final LoadedShip shipMountedTo = shipMountedToData.getShipMountedTo(); final ShipTransform shipTransform; - if (shipMountedTo instanceof ShipObjectClient) { - shipTransform = ((ShipObjectClient) shipMountedTo).getRenderTransform(); + if (shipMountedTo instanceof ClientShip) { + shipTransform = ((ClientShip) shipMountedTo).getRenderTransform(); } else { shipTransform = shipMountedTo.getShipTransform(); } diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/block_placement_orientation/MixinBlockItem.java b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/block_placement_orientation/MixinBlockItem.java index c28c66239..4f5ba2397 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/block_placement_orientation/MixinBlockItem.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/block_placement_orientation/MixinBlockItem.java @@ -1,50 +1,37 @@ package org.valkyrienskies.mod.mixin.feature.block_placement_orientation; -import net.minecraft.world.InteractionResult; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.At.Shift; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import org.valkyrienskies.mod.common.PlayerUtil; @Mixin(BlockItem.class) public abstract class MixinBlockItem { - - @Inject( - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/world/item/BlockItem;getPlacementState(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/level/block/state/BlockState;" - ), - method = "place", - locals = LocalCapture.CAPTURE_FAILHARD - ) - private void transformPlayerWhenPlacing(final BlockPlaceContext ignore, - final CallbackInfoReturnable cir, final BlockPlaceContext context) { - if (context == null || context.getPlayer() == null) { - return; - } - - PlayerUtil.transformPlayerTemporarily(context.getPlayer(), context.getLevel(), context.getClickedPos()); - } - @Inject( + @WrapOperation( at = @At( value = "INVOKE", - target = "Lnet/minecraft/world/item/BlockItem;getPlacementState(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/level/block/state/BlockState;", - shift = Shift.AFTER + target = "Lnet/minecraft/world/item/BlockItem;getPlacementState(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/level/block/state/BlockState;" ), method = "place" ) - private void untransformPlayerAfterPlacing(final BlockPlaceContext context, - final CallbackInfoReturnable cir) { - if (context.getPlayer() == null) { - return; + private BlockState transformPlayerWhenPlacing( + final BlockItem _instance, final BlockPlaceContext _ctx, + final Operation original, final BlockPlaceContext ctx + ) { + if (ctx == null || ctx.getPlayer() == null) { + return null; } - PlayerUtil.untransformPlayer(context.getPlayer()); + return PlayerUtil.transformPlayerTemporarily( + ctx.getPlayer(), + ctx.getLevel(), + ctx.getClickedPos(), + () -> original.call(this, ctx) + ); } } diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/entity_collision/MixinEntity.java b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/entity_collision/MixinEntity.java index f4142f122..f6bbf72f1 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/entity_collision/MixinEntity.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/entity_collision/MixinEntity.java @@ -116,6 +116,8 @@ private void redirectSetVelocity(final MoverType moverType, final Vec3 movement, - collisionResponseHorizontalNormal.z() * parallelHorizontalVelocityComponent ); } + // The rest of the move function (including tryCheckInsideBlocks) is skipped, so calling it here + tryCheckInsideBlocks(); // Cancel the original invocation of Entity.setVelocity(DDD)V to remove vanilla behavior callbackInfo.cancel(); } @@ -224,6 +226,9 @@ private void preSpawnSprintParticle(final CallbackInfo ci) { @Shadow public abstract void setDeltaMovement(double x, double y, double z); + @Shadow + protected abstract void tryCheckInsideBlocks(); + @Shadow protected abstract Vec3 collide(Vec3 vec3d); diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java deleted file mode 100644 index 0f7068745..000000000 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.valkyrienskies.mod.mixin.feature.shipyard_entities; - -import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import it.unimi.dsi.fastutil.longs.LongOpenHashSet; -import it.unimi.dsi.fastutil.longs.LongSet; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.entity.EntitySectionStorage; -import net.minecraft.world.level.entity.PersistentEntitySectionManager; -import net.minecraft.world.level.entity.Visibility; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.valkyrienskies.mod.mixinducks.world.OfLevel; - -@Mixin(PersistentEntitySectionManager.class) -public abstract class MixinPersistentEntitySectionManager implements OfLevel { - @Shadow - @Final - EntitySectionStorage sectionStorage; - - @Unique - private Level level; - - @Override - public Level getLevel() { - return level; - } - - @Override - public void setLevel(final Level level) { - this.level = level; - ((OfLevel) this.sectionStorage).setLevel(level); - } - - @Shadow - @Final - private LongSet chunksToUnload; - - @Shadow - @Final - private Long2ObjectMap chunkVisibility; - - @Shadow - private boolean processChunkUnload(final long l) { - throw new IllegalStateException("This should not be invoked"); - } - - /** - * This fixes this function randomly crashing. I'm not sure why but the removeIf() function is buggy - */ - @Inject( - method = "processUnloads", at = @At(value = "HEAD"), cancellable = true - ) - private void replaceProcessUnloads(final CallbackInfo ci) { - // I don't know why this crashes, try-catch please help me! - try { - final LongSet toRemove = new LongOpenHashSet(); - for (final long key : this.chunksToUnload) { - if (this.chunkVisibility.get(key) != Visibility.HIDDEN) { - toRemove.add(key); - } else if (this.processChunkUnload(key)) { - toRemove.add(key); - } - } - chunksToUnload.removeAll(toRemove); - } catch (final Exception e) { - e.printStackTrace(); - } - ci.cancel(); - } -} diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/bluemap/HiresTileModelAccessor.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/bluemap/HiresTileModelAccessor.java new file mode 100644 index 000000000..f08d39ee1 --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/bluemap/HiresTileModelAccessor.java @@ -0,0 +1,15 @@ +package org.valkyrienskies.mod.mixin.mod_compat.bluemap; + +import de.bluecolored.bluemap.core.map.hires.HiresTileModel; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(HiresTileModel.class) +@Pseudo +public interface HiresTileModelAccessor { + + @Accessor("position") + double[] getPositions(); + +} diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/bluemap/MixinBmMap.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/bluemap/MixinBmMap.java new file mode 100644 index 000000000..6ec653ef7 --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/bluemap/MixinBmMap.java @@ -0,0 +1,47 @@ +package org.valkyrienskies.mod.mixin.mod_compat.bluemap; + +import com.flowpowered.math.vector.Vector2i; +import de.bluecolored.bluemap.core.map.BmMap; +import de.bluecolored.bluemap.core.map.hires.HiresModelManager; +import de.bluecolored.bluemap.core.world.World; +import java.util.function.Predicate; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.valkyrienskies.mod.common.VSGameUtilsKt; +import org.valkyrienskies.mod.mixinducks.mod_compat.bluemap.WorldDuck; + +@Mixin(BmMap.class) +@Pseudo +public class MixinBmMap { + @Shadow + @Final + private World world; + + @Shadow + @Final + private HiresModelManager hiresModelManager; + + @Redirect( + method = "renderTile", + at = @At( + value = "INVOKE", + target = "Ljava/util/function/Predicate;test(Ljava/lang/Object;)Z" + ), + remap = false + ) + boolean skipShipyard(final Predicate predicate, final Object object) { + final Vector2i tilePos = (Vector2i) object; + final var level = ((WorldDuck) world).valkyrienskies$getCorrelatingLevel(); + final var grid = this.hiresModelManager.getTileGrid(); + final var x = grid.getCellMinX(tilePos.getX()) + 1; + final var z = grid.getCellMinY(tilePos.getY()) + 1; + + final var notShipyard = !VSGameUtilsKt.isBlockInShipyard(level, x, 0, z); + + return predicate.test(tilePos) && notShipyard; + } +} diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/bluemap/MixinHiresModelManager.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/bluemap/MixinHiresModelManager.java new file mode 100644 index 000000000..0edc61f5a --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/bluemap/MixinHiresModelManager.java @@ -0,0 +1,100 @@ +package org.valkyrienskies.mod.mixin.mod_compat.bluemap; + +import com.flowpowered.math.vector.Vector3i; +import de.bluecolored.bluemap.core.map.TileMetaConsumer; +import de.bluecolored.bluemap.core.map.hires.HiresModelManager; +import de.bluecolored.bluemap.core.map.hires.HiresModelRenderer; +import de.bluecolored.bluemap.core.map.hires.HiresTileModel; +import de.bluecolored.bluemap.core.world.World; +import org.joml.Matrix4dc; +import org.joml.Vector3d; +import org.joml.Vector3dc; +import org.joml.primitives.AABBd; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSGameUtilsKt; +import org.valkyrienskies.mod.mixinducks.mod_compat.bluemap.WorldDuck; + +@Pseudo +@Mixin(HiresModelManager.class) +public class MixinHiresModelManager { + + @Redirect( + remap = false, + method = "render", + at = @At(value = "INVOKE", target = "Lde/bluecolored/bluemap/core/map/hires/HiresModelRenderer;render(Lde/bluecolored/bluemap/core/world/World;Lcom/flowpowered/math/vector/Vector3i;Lcom/flowpowered/math/vector/Vector3i;Lde/bluecolored/bluemap/core/map/hires/HiresTileModel;Lde/bluecolored/bluemap/core/map/TileMetaConsumer;)V") + ) + void renderModel(final HiresModelRenderer instance, final World world, + final Vector3i min, final Vector3i max, + final HiresTileModel model, final TileMetaConsumer tmc + ) { + final var aabb = new AABBd( + min.getX(), min.getY(), min.getZ(), + max.getX(), max.getY(), max.getZ() + ); + + final var level = ((WorldDuck) world).valkyrienskies$getCorrelatingLevel(); + if (level == null) { + System.out.println("Valkyrien Skies x BlueMap: Could not find correlating level for bluemap world"); + return; + } + + //TODO we are begging the gods to not have race conditions here + final var ships = VSGameUtilsKt.getShipsIntersecting(level, aabb); + + var start = model.size(); + + for (final Ship ship : ships) { + if (!aabb.containsPoint(ship.getTransform().getPositionInWorld())) continue; + final var shipAABB = ship.getShipAABB(); + + assert shipAABB != null; + final var shipMin = new Vector3i(shipAABB.minX() - 1, shipAABB.minY() - 1, shipAABB.minZ() - 1); + final var shipMax = new Vector3i(shipAABB.maxX() + 1, shipAABB.maxY() + 1, shipAABB.maxZ() + 1); + + + // renders the ship with as origin shipMin.x, 0, shipMin.z + instance.render(world, shipMin, shipMax, model, tmc); + + final var preTranslation = new Vector3d( + shipMin.getX(), + 0, + shipMin.getZ() + ); + + final var postTranslation = new Vector3d( + -min.getX(), + 0, + -min.getZ() + ); + + valkyrienskies$transformModel(start, model.size(), model, preTranslation, postTranslation, ship.getTransform().getShipToWorld()); + + start = model.size(); + } + + + instance.render(world, min, max, model, tmc); + } + + @Unique + private void valkyrienskies$transformModel(final int start, final int end, final HiresTileModel model, final Vector3dc preTranslation, final Vector3dc postTranslation, final Matrix4dc transform) { + final var positions = ((HiresTileModelAccessor) model).getPositions(); + + for(int face = start; face < end; ++face) { + for(int i = 0; i < 3; ++i) { + final int index = face * 9 + i * 3; + final double x = positions[index] + preTranslation.x(); + final double y = positions[index + 1] + preTranslation.y(); + final double z = positions[index + 2] + preTranslation.z(); + positions[index] = (x * transform.m00()) + (y * transform.m10()) + (z * transform.m20()) + transform.m30() + postTranslation.x(); + positions[index + 1] = (x * transform.m01()) + (y * transform.m11()) + (z * transform.m21()) + transform.m31() + postTranslation.y(); + positions[index + 2] = (x * transform.m02()) + (y * transform.m12()) + (z * transform.m22()) + transform.m32() + postTranslation.z(); + } + } + } +} diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/bluemap/MixinWorld.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/bluemap/MixinWorld.java new file mode 100644 index 000000000..db7538349 --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/bluemap/MixinWorld.java @@ -0,0 +1,36 @@ +package org.valkyrienskies.mod.mixin.mod_compat.bluemap; + +import de.bluecolored.bluemap.core.mca.MCAWorld; +import java.nio.file.Path; +import java.util.Objects; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.Shadow; +import org.valkyrienskies.mod.common.ValkyrienSkiesMod; +import org.valkyrienskies.mod.mixin.server.MinecraftServerAccessor; +import org.valkyrienskies.mod.mixinducks.mod_compat.bluemap.WorldDuck; + +@Mixin(MCAWorld.class) +@Pseudo +public class MixinWorld implements WorldDuck { + + @Shadow + @Final + private Path worldFolder; + + @Override + public Level valkyrienskies$getCorrelatingLevel() { + for (final var level : Objects.requireNonNull(ValkyrienSkiesMod.getCurrentServer()).getAllLevels()) { + final MinecraftServerAccessor accessor = (MinecraftServerAccessor) ValkyrienSkiesMod.getCurrentServer(); + + final Path path1 = accessor.getStorageSource().getDimensionPath(level.dimension()).toAbsolutePath().normalize(); + final Path path2 = this.worldFolder.toAbsolutePath().normalize(); + if (path1.equals(path2)) + return level; + } + + return null; + } +} diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/accessors/ChuteBlockEntityAccessor.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/accessors/ChuteBlockEntityAccessor.java new file mode 100644 index 000000000..917b5c175 --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/accessors/ChuteBlockEntityAccessor.java @@ -0,0 +1,16 @@ +package org.valkyrienskies.mod.mixin.mod_compat.create.accessors; + +import com.simibubi.create.content.logistics.chute.ChuteBlockEntity; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(ChuteBlockEntity.class) +public interface ChuteBlockEntityAccessor { + @Accessor("bottomPullDistance") + float getBottomPullDistance(); + + @Invoker + boolean callCanAcceptItem(ItemStack item); +} diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinDeployTool.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinDeployTool.java new file mode 100644 index 000000000..f10487ac3 --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinDeployTool.java @@ -0,0 +1,67 @@ +package org.valkyrienskies.mod.mixin.mod_compat.create.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.content.schematics.client.tools.DeployTool; +import com.simibubi.create.content.schematics.client.tools.SchematicToolBase; +import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.minecraft.client.Minecraft; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSClientGameUtils; +import org.valkyrienskies.mod.common.VSGameUtilsKt; + +/** + * DeployTool is responsible for the render transform of the placement bounding box (not the preview) + *

+ * Create applies both the camera and bounding-box position in the same PoseStack operation, + * the latter of which does not respect ship-space. + * This mixin cancels the aforementioned operation and injects the fix in front. + */ +@Mixin(value={DeployTool.class}) +public abstract class MixinDeployTool extends SchematicToolBase { + @Redirect( + method = "renderTool(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/simibubi/create/foundation/render/SuperRenderTypeBuffer;Lnet/minecraft/world/phys/Vec3;)V", + at = @At( + value = "INVOKE", + target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V", + ordinal = 0 + ) + ) + private void redirectTranslate(PoseStack ms, double _x, double _y, double _z) { + } + + @Inject( + method = "renderTool(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/simibubi/create/foundation/render/SuperRenderTypeBuffer;Lnet/minecraft/world/phys/Vec3;)V", + at = @At( + value = "INVOKE", + target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V", + ordinal = 0 + ) + ) + private void mixinRenderTool(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, CallbackInfo ci) { + float pt = AnimationTickHolder.getPartialTicks(); + double x = Mth.lerp(pt, lastChasingSelectedPos.x, chasingSelectedPos.x); + double y = Mth.lerp(pt, lastChasingSelectedPos.y, chasingSelectedPos.y); + double z = Mth.lerp(pt, lastChasingSelectedPos.z, chasingSelectedPos.z); + Ship ship = VSGameUtilsKt.getShipObjectManagingPos(Minecraft.getInstance().level, x, y, z); + + AABB bounds = schematicHandler.getBounds(); + Vec3 center = bounds.getCenter(); + int centerX = (int) center.x; + int centerZ = (int) center.z; + + if (ship != null) { + VSClientGameUtils.transformRenderWithShip(ship.getTransform(), ms, x - centerX, y, z - centerZ, camera.x, camera.y, camera.z); + } else { + ms.translate(x - centerX - camera.x, y - camera.y, z - centerZ - camera.z); + } + } +} diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinSchematicToolBase.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinSchematicToolBase.java new file mode 100644 index 000000000..32a196e4e --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinSchematicToolBase.java @@ -0,0 +1,70 @@ +package org.valkyrienskies.mod.mixin.mod_compat.create.client; + +import static org.valkyrienskies.mod.common.util.VectorConversionsMCKt.toJOML; +import static org.valkyrienskies.mod.common.util.VectorConversionsMCKt.toMinecraft; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.simibubi.create.content.schematics.client.SchematicTransformation; +import com.simibubi.create.content.schematics.client.tools.SchematicToolBase; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSGameUtilsKt; + +/** + * SchematicToolBase is responsible for the placement position of the schematic. + */ +@Mixin(value={SchematicToolBase.class}) +public abstract class MixinSchematicToolBase { + /** + * Create uses HitResult::getLocation to get the schematic placement position, which doesn't respect ship-space. + * This mixin conditionally changes it to BlockHitResult::getBlockPos instead which *does* respect ship-space. + * The original behaviour is otherwise not changed. + */ + @Redirect( + method = "updateTargetPos()V", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/phys/BlockHitResult;getLocation()Lnet/minecraft/world/phys/Vec3;", + ordinal = 0 + ) + ) + public Vec3 redirectGetLocation(BlockHitResult instance) { + BlockPos b = instance.getBlockPos(); + Ship ship = VSGameUtilsKt.getShipObjectManagingPos(Minecraft.getInstance().level, b); + if (ship != null) { + // The return value is used to form a BlockPos, + // so the vec position within a block should not make a difference + return Vec3.atLowerCornerOf(b); + } else { + return instance.getLocation(); + } + } + + /** + * Create chose to... uh... evaluate the player look in the local space of the transform. That means we need to + * mixin toLocalSpace and transform the player position to the ship-space this schematic is on. + * The original behaviour is otherwise not changed. + */ + @WrapOperation( + method = "updateTargetPos", + at = @At( + value = "INVOKE", + target = "Lcom/simibubi/create/content/schematics/client/SchematicTransformation;toLocalSpace(Lnet/minecraft/world/phys/Vec3;)Lnet/minecraft/world/phys/Vec3;" + ) + ) + public Vec3 wrapLocalSpaceToShip(SchematicTransformation transformation, Vec3 vec, Operation original) { + Ship ship = VSGameUtilsKt.getShipObjectManagingPos(Minecraft.getInstance().level, transformation.getAnchor()); + if (ship != null) { + return original.call(transformation, toMinecraft(ship.getWorldToShip().transformPosition(toJOML(vec)))); + } + + return original.call(transformation, vec); + } +} diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinSchematicTransformation.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinSchematicTransformation.java new file mode 100644 index 000000000..5c6d76c84 --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinSchematicTransformation.java @@ -0,0 +1,57 @@ +package org.valkyrienskies.mod.mixin.mod_compat.create.client; + +import com.jozufozu.flywheel.util.transform.TransformStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.content.schematics.client.SchematicTransformation; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSClientGameUtils; +import org.valkyrienskies.mod.common.VSGameUtilsKt; + +/** + * SchematicTransformation is responsible for the render transform of the schematic preview + *

+ * Create applies both the camera and schematic positions in the same operation, the latter of which does not respect ship-space. + * This mixin redirects the operation and fixes it by extracting the position components from the argument. + * I can't think of a better way to get around it. + */ +@Mixin(value = {SchematicTransformation.class}, remap = false) +public abstract class MixinSchematicTransformation { + @Shadow + private BlockPos target; + @Shadow + private Vec3 chasingPos; + @Shadow + private Vec3 prevChasingPos; + + @Redirect( + method = {"applyTransformations(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/world/phys/Vec3;)V"}, + at = @At( + value = "INVOKE", + target = "Lcom/jozufozu/flywheel/util/transform/TransformStack;translate(Lnet/minecraft/world/phys/Vec3;)Ljava/lang/Object;", + ordinal = 0 + ) + ) + private Object redirectTranslate(TransformStack instance, Vec3 orig) { + PoseStack ms = (PoseStack)instance; + Ship ship = VSGameUtilsKt.getShipObjectManagingPos(Minecraft.getInstance().level, target.getX(), target.getY(), target.getZ()); + + if (ship != null) { + float pt = AnimationTickHolder.getPartialTicks(); + Vec3 pos = VecHelper.lerp(pt, prevChasingPos, chasingPos); + Vec3 camera = pos.subtract(orig); + VSClientGameUtils.transformRenderWithShip(ship.getTransform(), ms, pos.x, pos.y, pos.z, camera.x, camera.y, camera.z); + return instance; + } else { + return instance.translate(orig); + } + } +} diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java index 8f1282915..fb9a150e1 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java @@ -28,6 +28,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.joml.Matrix3d; import org.joml.Matrix4d; import org.joml.Matrix4dc; @@ -44,10 +45,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.valkyrienskies.core.api.ships.ContraptionWingProvider; import org.valkyrienskies.core.api.ships.LoadedServerShip; +import org.valkyrienskies.core.api.ships.LoadedShip; import org.valkyrienskies.core.api.ships.Ship; import org.valkyrienskies.core.api.ships.WingManager; import org.valkyrienskies.mod.common.CompatUtil; import org.valkyrienskies.mod.common.VSGameUtilsKt; +import org.valkyrienskies.mod.common.entity.ShipMountedToData; +import org.valkyrienskies.mod.common.entity.ShipMountedToDataProvider; import org.valkyrienskies.mod.common.util.IEntityDraggingInformationProvider; import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; import org.valkyrienskies.mod.compat.CreateConversionsKt; @@ -55,7 +59,7 @@ @Mixin(AbstractContraptionEntity.class) public abstract class MixinAbstractContraptionEntity extends Entity implements MixinAbstractContraptionEntityDuck, - ContraptionWingProvider, IEntityDraggingInformationProvider { + ContraptionWingProvider, IEntityDraggingInformationProvider, ShipMountedToDataProvider { public MixinAbstractContraptionEntity(EntityType entityType, Level level) { super(entityType, level); @@ -89,6 +93,16 @@ public StructureTransform getStructureTransform() { @Shadow public abstract Vec3 getPrevAnchorVec(); + @Nullable + @Override + public ShipMountedToData provideShipMountedToData(@NotNull final Entity passenger, @Nullable final Float partialTicks) { + final LoadedShip shipObjectEntityMountedTo = VSGameUtilsKt.getShipObjectManagingPos(passenger.level, toJOML(this.position())); + if (shipObjectEntityMountedTo == null) return null; + + final Vector3dc mountedPosInShip = toJOML(this.getPassengerPosition(passenger, partialTicks == null ? 1 : partialTicks)); + return new ShipMountedToData(shipObjectEntityMountedTo, mountedPosInShip); + } + //Region start - fix being sent to the ̶s̶h̶a̶d̶o̶w̶r̶e̶a̶l̶m̶ shipyard on ship contraption disassembly @Redirect(method = "moveCollidedEntitiesOnDisassembly", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;setPos(DDD)V")) private void redirectSetPos(Entity instance, double x, double y, double z) { diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create_big_cannons/MixinPitchOrientedContraptionEntity.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create_big_cannons/MixinPitchOrientedContraptionEntity.java index cd97ecbcc..fd88191d2 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create_big_cannons/MixinPitchOrientedContraptionEntity.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create_big_cannons/MixinPitchOrientedContraptionEntity.java @@ -1,5 +1,7 @@ package org.valkyrienskies.mod.mixin.mod_compat.create_big_cannons; +import static org.valkyrienskies.mod.common.util.VectorConversionsMCKt.toJOML; + import com.simibubi.create.content.contraptions.OrientedContraptionEntity; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; @@ -48,4 +50,11 @@ protected void vsProcesssRiderPositionHook( } } } + + @Inject(method="getPassengerPosition", at = @At("RETURN"), cancellable = true, remap = false) + protected void vsGetPassengerPosition(Entity passenger, float partialTicks, CallbackInfoReturnable cir) { + if (VSGameUtilsKt.getShipObjectManagingPos(passenger.level, toJOML(this.position())) != null) { + cir.setReturnValue(cir.getReturnValue().add(0,0.1,0)); + } + } } diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/flywheel/MixinBlockEntityInstanceManager.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/flywheel/MixinBlockEntityInstanceManager.java index 86ad788fa..e3408c46f 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/flywheel/MixinBlockEntityInstanceManager.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/flywheel/MixinBlockEntityInstanceManager.java @@ -48,6 +48,7 @@ public MixinBlockEntityInstanceManager(final MaterialManager materialManager) { cancellable = true ) void preCreateRaw(final BlockEntity blockEntity, final CallbackInfoReturnable cir) { + final Level nullableLevel = blockEntity.getLevel(); if (nullableLevel instanceof final ClientLevel level) { final ClientShip ship = VSGameUtilsKt.getShipObjectManagingPos( @@ -57,7 +58,8 @@ void preCreateRaw(final BlockEntity blockEntity, final CallbackInfoReturnable vs$createMaterialManager()); final Vector3i c = ship.getChunkClaim().getCenterBlockCoordinates(VSGameUtilsKt.getYRange(nullableLevel), new Vector3i()); - ((InstancingEngineAccessor) manager).setOriginCoordinate(new BlockPos(c.x, c.y, c.z)); + if (manager instanceof InstancingEngineAccessor) + ((InstancingEngineAccessor) manager).setOriginCoordinate(new BlockPos(c.x, c.y, c.z)); cir.setReturnValue(InstancedRenderRegistry.createInstance(manager, blockEntity)); } diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/sodium/MixinRenderSectionManager.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/sodium/MixinRenderSectionManager.java index dabb6f95e..2b9362767 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/sodium/MixinRenderSectionManager.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/sodium/MixinRenderSectionManager.java @@ -14,6 +14,8 @@ import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.LevelChunkSection; import org.joml.primitives.AABBd; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -72,7 +74,15 @@ private void afterIterateChunks(final Camera camera, final Frustum frustum, fina final boolean spectator, final CallbackInfo ci) { for (final ClientShip ship : VSGameUtilsKt.getShipObjectWorld(Minecraft.getInstance()).getLoadedShips()) { ship.getActiveChunksSet().forEach((x, z) -> { + final LevelChunk levelChunk = world.getChunk(x, z); for (int y = world.getMinSection(); y < world.getMaxSection(); y++) { + // If the chunk section is empty then skip it + final LevelChunkSection levelChunkSection = levelChunk.getSection(y - world.getMinSection()); + if (levelChunkSection.hasOnlyAir()) { + continue; + } + // TODO: Add occlusion logic here? + final RenderSection section = getRenderSection(x, y, z); if (section == null) { diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/vanilla_renderer/MixinLevelRendererVanilla.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/vanilla_renderer/MixinLevelRendererVanilla.java index 35a6afb25..2d4f7be96 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/vanilla_renderer/MixinLevelRendererVanilla.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/vanilla_renderer/MixinLevelRendererVanilla.java @@ -25,8 +25,11 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.LevelChunkSection; import org.jetbrains.annotations.Nullable; import org.joml.Vector3dc; +import org.joml.primitives.AABBd; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -47,6 +50,7 @@ @Mixin(LevelRenderer.class) public abstract class MixinLevelRendererVanilla { + @Unique private final WeakHashMap> shipRenderChunks = new WeakHashMap<>(); @Shadow private ClientLevel level; @@ -120,11 +124,27 @@ private void addShipVisibleChunks( } shipObject.getActiveChunksSet().forEach((x, z) -> { + final LevelChunk levelChunk = level.getChunk(x, z); for (int y = level.getMinSection(); y < level.getMaxSection(); y++) { tempPos.set(x << 4, y << 4, z << 4); final ChunkRenderDispatcher.RenderChunk renderChunk = chunkStorageAccessor.callGetRenderChunkAt(tempPos); if (renderChunk != null) { + // If the chunk section is empty then skip it + final LevelChunkSection levelChunkSection = levelChunk.getSection(y - level.getMinSection()); + if (levelChunkSection.hasOnlyAir()) { + continue; + } + + // If the chunk isn't in the frustum then skip it + final AABBd b2 = new AABBd((x << 4) - 6e-1, (y << 4) - 6e-1, (z << 4) - 6e-1, + (x << 4) + 15.6, (y << 4) + 15.6, (z << 4) + 15.6) + .transform(shipObject.getRenderTransform().getShipToWorld()); + + if (!frustum.isVisible(VectorConversionsMCKt.toMinecraft(b2))) { + continue; + } + final LevelRenderer.RenderChunkInfo newChunkInfo; if (ValkyrienCommonMixinConfigPlugin.getVSRenderer() == VSRenderer.OPTIFINE) { newChunkInfo = @@ -199,6 +219,7 @@ private ObjectArrayList redirectRenderChunksInFrustum(final Lev return (ObjectArrayList) renderChunksGeneratedByVanilla; } + @Unique private void renderChunkLayer(final RenderType renderType, final PoseStack poseStack, final double d, final double e, final double f, final Matrix4f matrix4f, final ObjectList chunksToRender) { diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/server/MinecraftServerAccessor.java b/common/src/main/java/org/valkyrienskies/mod/mixin/server/MinecraftServerAccessor.java new file mode 100644 index 000000000..3df35bbc3 --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/server/MinecraftServerAccessor.java @@ -0,0 +1,13 @@ +package org.valkyrienskies.mod.mixin.server; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.level.storage.LevelStorageSource; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(MinecraftServer.class) +public interface MinecraftServerAccessor { + + @Accessor("storageSource") + LevelStorageSource.LevelStorageAccess getStorageSource(); +} diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/server/MixinMinecraftServer.java b/common/src/main/java/org/valkyrienskies/mod/mixin/server/MixinMinecraftServer.java index fce1429bb..c5642f5f3 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/server/MixinMinecraftServer.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/server/MixinMinecraftServer.java @@ -62,7 +62,10 @@ import org.valkyrienskies.mod.common.util.VSServerLevel; import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; import org.valkyrienskies.mod.common.world.ChunkManagement; +import org.valkyrienskies.mod.compat.LoadedMods; +import org.valkyrienskies.mod.compat.Weather2Compat; import org.valkyrienskies.mod.util.KrunchSupport; +import org.valkyrienskies.mod.util.McMathUtilKt; @Mixin(MinecraftServer.class) public abstract class MixinMinecraftServer implements IShipObjectWorldServerProvider, GameServer { @@ -124,6 +127,14 @@ public VSPipeline getVsPipeline() { ) ) private void postCreateLevels(final CallbackInfo ci) { + // Register blocks + if (!MassDatapackResolver.INSTANCE.getRegisteredBlocks()) { + final List blockStateList = new ArrayList<>(Block.BLOCK_STATE_REGISTRY.size()); + Block.BLOCK_STATE_REGISTRY.forEach((blockStateList::add)); + MassDatapackResolver.INSTANCE.registerAllBlockStates(blockStateList); + ValkyrienSkiesMod.getVsCore().registerBlockStates(MassDatapackResolver.INSTANCE.getBlockStateData()); + } + // Load ship data from the world storage final ShipSavedData shipSavedData = overworld().getDataStorage() .computeIfAbsent(ShipSavedData::load, ShipSavedData.Companion::createEmpty, ShipSavedData.SAVED_DATA_ID); @@ -140,18 +151,6 @@ private void postCreateLevels(final CallbackInfo ci) { // Create ship world and VS Pipeline vsPipeline = shipSavedData.getPipeline(); - // Register blocks - if (!MassDatapackResolver.INSTANCE.getRegisteredBlocks()) { - final List blockStateList = new ArrayList<>(Block.BLOCK_STATE_REGISTRY.size()); - Block.BLOCK_STATE_REGISTRY.forEach((blockStateList::add)); - MassDatapackResolver.INSTANCE.registerAllBlockStates(blockStateList); - } - vsPipeline.registerBlocks( - MassDatapackResolver.INSTANCE.getSolidBlockStates(), - MassDatapackResolver.INSTANCE.getLiquidBlockStates(), - MassDatapackResolver.INSTANCE.getBlockStateData() - ); - KrunchSupport.INSTANCE.setKrunchSupported(!vsPipeline.isUsingDummyPhysics()); shipWorld = vsPipeline.getShipWorld(); @@ -161,7 +160,8 @@ private void postCreateLevels(final CallbackInfo ci) { getShipObjectWorld().addDimension( VSGameUtilsKt.getDimensionId(overworld()), - VSGameUtilsKt.getYRange(overworld()) + VSGameUtilsKt.getYRange(overworld()), + McMathUtilKt.getDEFAULT_WORLD_GRAVITY() ); } @@ -233,6 +233,8 @@ private void postTick(final CallbackInfo ci) { // Only drag entities after we have updated the ship positions for (final ServerLevel level : getAllLevels()) { EntityDragger.INSTANCE.dragEntitiesWithShips(level.getAllEntities()); + if (LoadedMods.getWeather2()) + Weather2Compat.INSTANCE.tick(level); } handleShipPortals(); diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/server/world/MixinServerLevel.java b/common/src/main/java/org/valkyrienskies/mod/mixin/server/world/MixinServerLevel.java index 985ac3f04..4f707449b 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/server/world/MixinServerLevel.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/server/world/MixinServerLevel.java @@ -57,6 +57,7 @@ import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; import org.valkyrienskies.mod.mixin.accessors.server.level.ChunkMapAccessor; import org.valkyrienskies.mod.mixin.accessors.server.level.DistanceManagerAccessor; +import org.valkyrienskies.mod.util.McMathUtilKt; @Mixin(ServerLevel.class) public abstract class MixinServerLevel implements IShipObjectWorldServerProvider, VSServerLevel { @@ -96,8 +97,11 @@ void onInit(final MinecraftServer minecraftServer, final Executor executor, // This only happens when overworld gets loaded on startup, we have a mixin in MixinMinecraftServer for this specific case if (getShipObjectWorld() != null) { - getShipObjectWorld().addDimension(VSGameUtilsKt.getDimensionId((ServerLevel) (Object) this), - VSGameUtilsKt.getYRange((ServerLevel) (Object) this)); + getShipObjectWorld().addDimension( + VSGameUtilsKt.getDimensionId((ServerLevel) (Object) this), + VSGameUtilsKt.getYRange((ServerLevel) (Object) this), + McMathUtilKt.getDEFAULT_WORLD_GRAVITY() + ); } } @@ -244,6 +248,7 @@ private void postTick(final BooleanSupplier shouldKeepTicking, final CallbackInf VSGameUtilsKt.getDimensionId(self), voxelShapeUpdates ); + } @Override diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/world/chunk/MixinLevelChunk.java b/common/src/main/java/org/valkyrienskies/mod/mixin/world/chunk/MixinLevelChunk.java index ad158569f..c1b6d962c 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/world/chunk/MixinLevelChunk.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/world/chunk/MixinLevelChunk.java @@ -33,6 +33,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.valkyrienskies.core.api.ships.Ship; import org.valkyrienskies.mod.common.BlockStateInfo; +import org.valkyrienskies.mod.common.VSGameUtilsKt; import org.valkyrienskies.mod.common.util.VSLevelChunk; @Mixin(LevelChunk.class) @@ -61,7 +62,10 @@ public MixinLevelChunk(final Ship ship) { public void postSetBlockState(final BlockPos pos, final BlockState state, final boolean moved, final CallbackInfoReturnable cir) { final BlockState prevState = cir.getReturnValue(); - BlockStateInfo.INSTANCE.onSetBlock(level, pos, prevState, state); + // This function is getting invoked by non-game threads for some reason. So use executeOrSchedule() to schedule + // onSetBlock() to be run on the next tick when this function is invoked by a non-game thread. + // See https://github.com/ValkyrienSkies/Valkyrien-Skies-2/issues/913 for more info. + VSGameUtilsKt.executeOrSchedule(level, () -> BlockStateInfo.INSTANCE.onSetBlock(level, pos, prevState, state)); } @Shadow diff --git a/common/src/main/java/org/valkyrienskies/mod/mixinducks/mod_compat/bluemap/WorldDuck.java b/common/src/main/java/org/valkyrienskies/mod/mixinducks/mod_compat/bluemap/WorldDuck.java new file mode 100644 index 000000000..162811d5f --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixinducks/mod_compat/bluemap/WorldDuck.java @@ -0,0 +1,10 @@ +package org.valkyrienskies.mod.mixinducks.mod_compat.bluemap; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; + +public interface WorldDuck { + + Level valkyrienskies$getCorrelatingLevel(); + +} diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/api/VsAPI.kt b/common/src/main/kotlin/org/valkyrienskies/mod/api/VsAPI.kt new file mode 100644 index 000000000..270bf4ebc --- /dev/null +++ b/common/src/main/kotlin/org/valkyrienskies/mod/api/VsAPI.kt @@ -0,0 +1,56 @@ +package org.valkyrienskies.mod.api + +import net.minecraft.client.gui.screens.Screen +import net.minecraft.client.multiplayer.ClientLevel +import net.minecraft.core.BlockPos +import net.minecraft.world.level.ChunkPos +import net.minecraft.world.level.Level +import net.minecraft.server.level.ServerLevel +import net.minecraft.world.entity.Entity + +import org.jetbrains.annotations.ApiStatus.* +import org.valkyrienskies.core.api.VsCoreApi +import org.valkyrienskies.core.api.event.ListenableEvent +import org.valkyrienskies.core.api.ships.* +import org.valkyrienskies.mod.api.events.PostRenderShipEvent +import org.valkyrienskies.mod.api.events.PreRenderShipEvent +import org.valkyrienskies.mod.api.events.RegisterBlockStateEvent + +@NonExtendable +interface VsApi : VsCoreApi { + + /** + * This event gets called when it's time to register physics block states for Minecraft block states. + */ + @get:Experimental + val registerBlockStateEvent: ListenableEvent + + @get:Experimental + val preRenderShipEvent: ListenableEvent + + @get:Experimental + val postRenderShipEvent: ListenableEvent + + fun isShipMountingEntity(entity: Entity): Boolean + + @Deprecated(message = "The legacy VS config system will be replaced soon. " + + "Migrate to another config library, or the new system when it's released. ") + fun createConfigScreenLegacy(parent: Screen, vararg configs: Class<*>): Screen + + /** + * Get the ship with the chunk claim that contains [pos], if it exists. + * + * If either parameter is null, this will return null. + * + * @param level The [Level] to look for the ship in. If [level] is a + * [ServerLevel], this will return a [ServerShip]. If [level] is a + * [ClientLevel], this will return a [ClientShip]. + * + * @param pos A block position in the Shipyard + */ + fun getShipManagingBlock(level: Level?, pos: BlockPos?): Ship? + + fun getShipManagingChunk(level: Level?, pos: ChunkPos?): Ship? + + fun getShipManagingChunk(level: Level?, chunkX: Int, chunkZ: Int): Ship? +} diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/api/events/PostRenderShipEvent.kt b/common/src/main/kotlin/org/valkyrienskies/mod/api/events/PostRenderShipEvent.kt new file mode 100644 index 000000000..33bbd6de3 --- /dev/null +++ b/common/src/main/kotlin/org/valkyrienskies/mod/api/events/PostRenderShipEvent.kt @@ -0,0 +1,6 @@ +package org.valkyrienskies.mod.api.events + +import org.jetbrains.annotations.ApiStatus.Experimental + +@Experimental +interface PostRenderShipEvent diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/api/events/PreRenderShipEvent.kt b/common/src/main/kotlin/org/valkyrienskies/mod/api/events/PreRenderShipEvent.kt new file mode 100644 index 000000000..2d99dbf51 --- /dev/null +++ b/common/src/main/kotlin/org/valkyrienskies/mod/api/events/PreRenderShipEvent.kt @@ -0,0 +1,6 @@ +package org.valkyrienskies.mod.api.events + +import org.jetbrains.annotations.ApiStatus.Experimental + +@Experimental +interface PreRenderShipEvent diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/api/events/RegisterBlockStateEvent.kt b/common/src/main/kotlin/org/valkyrienskies/mod/api/events/RegisterBlockStateEvent.kt new file mode 100644 index 000000000..12800615b --- /dev/null +++ b/common/src/main/kotlin/org/valkyrienskies/mod/api/events/RegisterBlockStateEvent.kt @@ -0,0 +1,25 @@ +package org.valkyrienskies.mod.api.events + +import net.minecraft.world.level.block.state.BlockState +import org.jetbrains.annotations.ApiStatus.Experimental +import org.valkyrienskies.core.api.physics.blockstates.LiquidState +import org.valkyrienskies.core.api.physics.blockstates.SolidState + +@Experimental +interface RegisterBlockStateEvent { + + fun newLiquidStateBuilder(): LiquidState.Builder + fun buildLiquidState(block: LiquidState.Builder.() -> Unit): LiquidState + fun newSolidStateBuilder(): SolidState.Builder + fun buildSolidState(block: SolidState.Builder.() -> Unit): SolidState + + fun register(state: BlockState, solidState: SolidState) + fun register(state: BlockState, liquidState: LiquidState) + + /** + * Registers the Minecraft [state] to be represented by [LiquidState] and [SolidState] in the same block. + * This is useful for e.g., a waterlogged chest, where the [liquidState] would be water and the [solidState] would + * be the chest shape. + */ + fun register(state: BlockState, liquidState: LiquidState, solidState: SolidState) +} diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/api_impl/events/RegisterBlockStateEventImpl.kt b/common/src/main/kotlin/org/valkyrienskies/mod/api_impl/events/RegisterBlockStateEventImpl.kt new file mode 100644 index 000000000..683019ebe --- /dev/null +++ b/common/src/main/kotlin/org/valkyrienskies/mod/api_impl/events/RegisterBlockStateEventImpl.kt @@ -0,0 +1,36 @@ +package org.valkyrienskies.mod.api_impl.events + +import net.minecraft.world.level.block.state.BlockState +import org.valkyrienskies.core.api.physics.blockstates.LiquidState +import org.valkyrienskies.core.api.physics.blockstates.SolidState +import org.valkyrienskies.core.apigame.physics.blockstates.VsBlockState +import org.valkyrienskies.mod.api.events.RegisterBlockStateEvent +import org.valkyrienskies.mod.common.ValkyrienSkiesMod.vsCore + +class RegisterBlockStateEventImpl : RegisterBlockStateEvent { + val toRegister = mutableListOf>() + + override fun newLiquidStateBuilder(): LiquidState.Builder = + vsCore.newLiquidStateBuilder() + + override fun buildLiquidState(block: LiquidState.Builder.() -> Unit): LiquidState = + vsCore.newLiquidStateBuilder().apply(block).build() + + override fun newSolidStateBuilder(): SolidState.Builder = + vsCore.newSolidStateBuilder() + + override fun buildSolidState(block: SolidState.Builder.() -> Unit): SolidState = + vsCore.newSolidStateBuilder().apply(block).build() + + override fun register(state: BlockState, solidState: SolidState) { + toRegister.add(Pair(state, VsBlockState(solidState, null))) + } + + override fun register(state: BlockState, liquidState: LiquidState) { + toRegister.add(Pair(state, VsBlockState(null, liquidState))) + } + + override fun register(state: BlockState, liquidState: LiquidState, solidState: SolidState) { + toRegister.add(Pair(state, VsBlockState(solidState, liquidState))) + } +} diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/api_impl/events/VSApiImpl.kt b/common/src/main/kotlin/org/valkyrienskies/mod/api_impl/events/VSApiImpl.kt new file mode 100644 index 000000000..3749d133e --- /dev/null +++ b/common/src/main/kotlin/org/valkyrienskies/mod/api_impl/events/VSApiImpl.kt @@ -0,0 +1,44 @@ +package org.valkyrienskies.mod.api_impl.events + +import net.minecraft.client.gui.screens.Screen +import net.minecraft.core.BlockPos +import net.minecraft.world.entity.Entity +import net.minecraft.world.level.ChunkPos +import net.minecraft.world.level.Level +import org.valkyrienskies.core.api.ships.Ship +import org.valkyrienskies.core.util.events.EventEmitterImpl +import org.valkyrienskies.mod.api.VsApi +import org.valkyrienskies.mod.api.events.PostRenderShipEvent +import org.valkyrienskies.mod.api.events.PreRenderShipEvent +import org.valkyrienskies.mod.api.events.RegisterBlockStateEvent +import org.valkyrienskies.mod.common.entity.ShipMountingEntity +import org.valkyrienskies.mod.common.getShipManagingPos +import org.valkyrienskies.mod.compat.clothconfig.VSClothConfig + +class VsApiImpl : VsApi { + + override val registerBlockStateEvent = EventEmitterImpl() + override val preRenderShipEvent = EventEmitterImpl() + override val postRenderShipEvent = EventEmitterImpl() + + override fun isShipMountingEntity(entity: Entity): Boolean { + return entity is ShipMountingEntity + } + + override fun createConfigScreenLegacy(parent: Screen, vararg configs: Class<*>): Screen { + return VSClothConfig.createConfigScreenFor(parent, *configs) + } + + + override fun getShipManagingBlock(level: Level?, pos: BlockPos?): Ship? { + return pos?.let { level?.getShipManagingPos(it) } + } + + override fun getShipManagingChunk(level: Level?, pos: ChunkPos?): Ship? { + return pos?.let { level?.getShipManagingPos(it) } + } + + override fun getShipManagingChunk(level: Level?, chunkX: Int, chunkZ: Int): Ship? { + return level?.getShipManagingPos(chunkX, chunkZ) + } +} diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/BlockStateInfoProvider.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/BlockStateInfoProvider.kt index 4a6ce7419..129d47e3a 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/BlockStateInfoProvider.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/BlockStateInfoProvider.kt @@ -17,11 +17,6 @@ import org.valkyrienskies.core.apigame.world.chunks.BlockType import org.valkyrienskies.mod.common.block.WingBlock import org.valkyrienskies.mod.common.config.MassDatapackResolver import org.valkyrienskies.mod.common.hooks.VSGameEvents -import org.valkyrienskies.physics_api.Lod1BlockStateId -import org.valkyrienskies.physics_api.Lod1LiquidBlockStateId -import org.valkyrienskies.physics_api.Lod1SolidBlockStateId -import org.valkyrienskies.physics_api.voxel.Lod1LiquidBlockState -import org.valkyrienskies.physics_api.voxel.Lod1SolidBlockState import java.util.function.IntFunction // Other mods can then provide weights and types based on their added content @@ -35,10 +30,6 @@ interface BlockStateInfoProvider { // Get the id of the block state fun getBlockStateType(blockState: BlockState): BlockType? - - val solidBlockStates: List - val liquidBlockStates: List - val blockStateData: List> } object BlockStateInfo { diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/DefaultBlockStateInfoProvider.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/DefaultBlockStateInfoProvider.kt index 373b4254c..fc8ebaf03 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/DefaultBlockStateInfoProvider.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/DefaultBlockStateInfoProvider.kt @@ -1,23 +1,13 @@ package org.valkyrienskies.mod.common +import net.minecraft.world.level.block.Blocks +import net.minecraft.world.level.block.LiquidBlock import net.minecraft.world.level.block.state.BlockState -import net.minecraft.world.level.material.Material import org.valkyrienskies.core.apigame.world.chunks.BlockType -import org.valkyrienskies.physics_api.Lod1BlockStateId -import org.valkyrienskies.physics_api.Lod1LiquidBlockStateId -import org.valkyrienskies.physics_api.Lod1SolidBlockStateId -import org.valkyrienskies.physics_api.voxel.Lod1LiquidBlockState -import org.valkyrienskies.physics_api.voxel.Lod1SolidBlockState object DefaultBlockStateInfoProvider : BlockStateInfoProvider { override val priority: Int get() = Int.MIN_VALUE - override val solidBlockStates: List - get() = TODO() - override val liquidBlockStates: List - get() = TODO() - override val blockStateData: List> - get() = TODO() override fun getBlockStateMass(blockState: BlockState): Double { if (blockState.isAir) return 0.0 @@ -28,9 +18,9 @@ object DefaultBlockStateInfoProvider : BlockStateInfoProvider { override fun getBlockStateType(blockState: BlockState): BlockType { if (blockState.isAir) return vsCore.blockTypes.air - val blockMaterial = blockState.material - if (blockMaterial.isLiquid) - return if (blockMaterial == Material.LAVA) vsCore.blockTypes.lava else vsCore.blockTypes.water - return if (blockMaterial.isSolid) vsCore.blockTypes.solid else vsCore.blockTypes.air + val block = blockState.block + if (block is LiquidBlock) + return if (block == Blocks.LAVA) vsCore.blockTypes.lava else vsCore.blockTypes.water + return if (blockState.material.isSolid) vsCore.blockTypes.solid else vsCore.blockTypes.air } } diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/PlayerUtil.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/PlayerUtil.kt index ce0890a0b..a246a2bb7 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/PlayerUtil.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/PlayerUtil.kt @@ -25,28 +25,23 @@ object PlayerUtil { @JvmStatic fun transformPlayerTemporarily(player: Player, ship: LoadedShip?) { - if (player.level.isBlockInShipyard(player.x, player.y, player.z)) { - // player is already in shipyard - return - } + if (ship == null) return + // player is already in shipyard + if (player.level.isBlockInShipyard(player.x, player.y, player.z)) return prevPosInfo[player] = TempPlayerPosInfo(player.yRot, player.yHeadRot, player.xRot, player.position()) - if (ship != null) { - val shipMatrix = ship.worldToShip - val direction = shipMatrix.transformDirection( - player.lookAngle.toJOML() - ) - val position = shipMatrix.transformPosition( - player.position().toJOML() - ) - val yaw = -atan2(direction.x, direction.z) - val pitch = -atan2(direction.y, sqrt((direction.x * direction.x) + (direction.z * direction.z))) - player.yRot = (yaw * (180 / Math.PI)).toFloat() - player.yHeadRot = player.yRot - player.xRot = (pitch * (180 / Math.PI)).toFloat() - (player as EntityAccessor).setPosNoUpdates(position.toMinecraft()) - } + val shipMatrix = ship.worldToShip + + val direction = shipMatrix.transformDirection(player.lookAngle.toJOML()) + val position = shipMatrix.transformPosition(player.position().toJOML()) + val yaw = -atan2(direction.x, direction.z) + val pitch = -atan2(direction.y, sqrt((direction.x * direction.x) + (direction.z * direction.z))) + + player.yRot = (yaw * (180 / Math.PI)).toFloat() + player.yHeadRot = player.yRot + player.xRot = (pitch * (180 / Math.PI)).toFloat() + (player as EntityAccessor).setPosNoUpdates(position.toMinecraft()) } @JvmStatic diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt index 9368ad3fd..8c4160db7 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt @@ -10,6 +10,7 @@ import net.minecraft.resources.ResourceLocation import net.minecraft.server.MinecraftServer import net.minecraft.server.level.ServerChunkCache import net.minecraft.server.level.ServerLevel +import net.minecraft.util.thread.BlockableEventLoop import net.minecraft.world.entity.Entity import net.minecraft.world.entity.player.Player import net.minecraft.world.level.ChunkPos @@ -208,7 +209,7 @@ inline fun Level?.transformToNearbyShipsAndWorld( cb(posInWorld.x(), posInWorld.y(), posInWorld.z()) } - for (nearbyShip in shipObjectWorld.allShips.getIntersecting(aabb)) { + for (nearbyShip in shipObjectWorld.allShips.getIntersecting(aabb, this!!.dimensionId)) { if (nearbyShip == currentShip) continue val posInShip = nearbyShip.worldToShip.transformPosition(posInWorld, temp0) cb(posInShip.x(), posInShip.y(), posInShip.z()) @@ -393,8 +394,7 @@ fun Level?.getWorldCoordinates(blockPos: BlockPos, pos: Vector3d): Vector3d { } fun Level.getShipsIntersecting(aabb: AABB): Iterable = getShipsIntersecting(aabb.toJOML()) -fun Level.getShipsIntersecting(aabb: AABBdc): Iterable = allShips.getIntersecting(aabb).filter { it.chunkClaimDimension == dimensionId } - +fun Level.getShipsIntersecting(aabb: AABBdc): Iterable = allShips.getIntersecting(aabb, dimensionId) fun Level?.transformAabbToWorld(aabb: AABB): AABB = transformAabbToWorld(aabb.toJOML()).toMinecraft() fun Level?.transformAabbToWorld(aabb: AABBd) = this?.transformAabbToWorld(aabb, aabb) ?: aabb fun Level.transformAabbToWorld(aabb: AABBdc, dest: AABBd): AABBd { @@ -409,6 +409,25 @@ fun Level.transformAabbToWorld(aabb: AABBdc, dest: AABBd): AABBd { return dest.set(aabb) } +/** + * Execute [runnable] immediately iff the thread invoking this is the same as the game thread. + * Otherwise, schedule [runnable] to run on the next tick. + */ +fun Level.executeOrSchedule(runnable: Runnable) { + val blockableEventLoop: BlockableEventLoop = if (!this.isClientSide) { + this.server!! as BlockableEventLoop + } else { + Minecraft.getInstance() + } + if (blockableEventLoop.isSameThread) { + // For some reason MinecraftServer wants to schedule even when it's the same thread, so we need to add our own + // logic + runnable.run() + } else { + blockableEventLoop.execute(runnable) + } +} + fun getShipMountedToData(passenger: Entity, partialTicks: Float? = null): ShipMountedToData? { val vehicle = passenger.vehicle ?: return null if (vehicle is ShipMountedToDataProvider) { diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/ValkyrienSkiesMod.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/ValkyrienSkiesMod.kt index 6dac43e54..f5f20b0b7 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/ValkyrienSkiesMod.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/ValkyrienSkiesMod.kt @@ -8,8 +8,6 @@ import net.minecraft.world.level.block.entity.BlockEntityType import org.valkyrienskies.core.api.ships.setAttachment import org.valkyrienskies.core.apigame.VSCore import org.valkyrienskies.core.apigame.VSCoreClient -import org.valkyrienskies.core.impl.config.VSConfigClass -import org.valkyrienskies.core.impl.config.VSCoreConfig import org.valkyrienskies.core.impl.hooks.VSEvents import org.valkyrienskies.mod.common.blockentity.TestHingeBlockEntity import org.valkyrienskies.mod.common.config.VSGameConfig @@ -50,8 +48,7 @@ object ValkyrienSkiesMod { VSGamePackets.register() VSGamePackets.registerHandlers() - VSConfigClass.registerConfig("vs_core", VSCoreConfig::class.java) - VSConfigClass.registerConfig("vs", VSGameConfig::class.java) + core.registerConfigLegacy("vs", VSGameConfig::class.java) VSEvents.ShipLoadEvent.on { event -> event.ship.setAttachment(GameTickForceApplier()) } diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/assembly/AssemblyUtil.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/assembly/AssemblyUtil.kt new file mode 100644 index 000000000..78199a624 --- /dev/null +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/assembly/AssemblyUtil.kt @@ -0,0 +1,147 @@ +package org.valkyrienskies.mod.common.assembly + +import net.minecraft.core.BlockPos +import net.minecraft.core.Direction +import net.minecraft.nbt.CompoundTag +import net.minecraft.util.Mth +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.Blocks +import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.level.chunk.LevelChunk +import net.minecraft.world.ticks.ScheduledTick +import org.joml.Vector3d +import org.joml.Vector3i + +private val AIR = Blocks.AIR.defaultBlockState() +object AssemblyUtil { + + fun setBlock(level: Level, pos: BlockPos, state: BlockState?) { + val chunk = level.getChunk(pos) as LevelChunk + val section = chunk.getSection(chunk.getSectionIndex(pos.y)) + val oldState = level.getBlockState(pos) + section.setBlockState(pos.x and 15, pos.y and 15, pos.z and 15, state) + ShipAssembler.triggerBlockChange(level, pos, oldState, state) + } + + fun removeBlock(level: Level, pos: BlockPos) { + level.removeBlockEntity(pos) + setBlock(level, pos, Blocks.AIR.defaultBlockState()) + } + + fun copyBlock(level: Level, from: BlockPos?, to: BlockPos) { + val state = level.getBlockState(from) + val blockentity = level.getBlockEntity(from) + setBlock(level, to, state) + + // Transfer pending schedule-ticks + if (level.blockTicks.hasScheduledTick(from, state.block)) { + level.blockTicks.schedule(ScheduledTick(state.block, to, 0, 0)) + } + + // Transfer block-entity data + if (state.hasBlockEntity() && blockentity != null) { + val data: CompoundTag = blockentity.saveWithId() + level.setBlockEntity(blockentity) + val newBlockentity = level.getBlockEntity(to) + newBlockentity?.load(data) + } + } + + fun updateBlock(level: Level, fromPos: BlockPos, toPos: BlockPos, toState: BlockState) { + + // 75 = flag 1 (block update) & flag 2 (send to clients) + flag 8 (force rerenders) + val flags = 11 + + //updateNeighbourShapes recurses through nearby blocks, recursionLeft is the limit + val recursionLeft = 511 + + level.setBlocksDirty(fromPos, toState, AIR) + level.sendBlockUpdated(fromPos, toState, AIR, flags) + level.blockUpdated(fromPos, AIR.block) + // This handles the update for neighboring blocks in worldspace + AIR.updateIndirectNeighbourShapes(level, fromPos, flags, recursionLeft - 1) + AIR.updateNeighbourShapes(level, fromPos, flags, recursionLeft) + AIR.updateIndirectNeighbourShapes(level, fromPos, flags, recursionLeft) + //This updates lighting for blocks in worldspace + level.chunkSource.lightEngine.checkBlock(fromPos) + + level.setBlocksDirty(toPos, AIR, toState) + level.sendBlockUpdated(toPos, AIR, toState, flags) + level.blockUpdated(toPos, toState.block) + if (!level.isClientSide && toState.hasAnalogOutputSignal()) { + level.updateNeighbourForOutputSignal(toPos, toState.block) + } + //This updates lighting for blocks in shipspace + level.chunkSource.lightEngine.checkBlock(toPos) + } + + fun toBlockPos(x: Double, y: Double, z: Double): BlockPos { + return BlockPos(Mth.floor(x), Math.floor(y).toInt(), Math.floor(z).toInt()) + } + + fun toBlockPos(vec: Vector3d): BlockPos { + return toBlockPos(vec.x, vec.y, vec.z) + } + + fun getVecDirection(v: Vector3i): Direction { + var axis = Direction.Axis.X + if (v.y() != 0) axis = Direction.Axis.Y + if (v.z() != 0) axis = Direction.Axis.Z + val direction = if (v.x + v.y + v.z > 0) Direction.AxisDirection.POSITIVE else Direction.AxisDirection.NEGATIVE + return Direction.fromAxisAndDirection(axis, direction) + } + + fun getMinCorner(pos1: BlockPos, pos2: BlockPos): BlockPos { + return BlockPos( + Math.min(pos1.x, pos2.x), + Math.min(pos1.y, pos2.y), + Math.min(pos1.z, pos2.z) + ) + } + + fun getMaxCorner(pos1: BlockPos, pos2: BlockPos): BlockPos { + return BlockPos( + Math.max(pos1.x, pos2.x), + Math.max(pos1.y, pos2.y), + Math.max(pos1.z, pos2.z) + ) + } + + fun getMiddle(pos1: BlockPos, pos2: BlockPos): Vector3i { + val middleX = Math.min(pos1.x, pos2.x).toDouble() + (Math.max(pos1.x, pos2.x) - Math.min( + pos1.x, + pos2.x + ) + 1) / 2 + val middleY = Math.min(pos1.y, pos2.y).toDouble() + (Math.max(pos1.y, pos2.y) - Math.min( + pos1.y, + pos2.y + ) + 1) / 2 + val middleZ = Math.min(pos1.z, pos2.z).toDouble() + (Math.max(pos1.z, pos2.z) - Math.min( + pos1.z, + pos2.z + ) + 1) / 2 + return Vector3i(middleX.toInt(), middleY.toInt(), middleZ.toInt()) + } + + fun getMiddle(pos1: Vector3d, pos2: Vector3d): Vector3d { + val middleX = Math.min(pos1.x, pos2.x) + (Math.max(pos1.x, pos2.x) - Math.min( + pos1.x, + pos2.x + )) / 2.0 + val middleY = Math.min(pos1.y, pos2.y) + (Math.max(pos1.y, pos2.y) - Math.min( + pos1.y, + pos2.y + )) / 2.0 + val middleZ = Math.min(pos1.z, pos2.z) + (Math.max(pos1.z, pos2.z) - Math.min( + pos1.z, + pos2.z + )) / 2.0 + return Vector3d(middleX, middleY, middleZ) + } + + + + + +} diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/assembly/SeamlessChunksManager.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/assembly/SeamlessChunksManager.kt index bb8aac7ab..f79def783 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/assembly/SeamlessChunksManager.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/assembly/SeamlessChunksManager.kt @@ -12,7 +12,6 @@ import net.minecraft.world.level.ChunkPos import org.valkyrienskies.core.api.ships.ClientShip import org.valkyrienskies.core.api.ships.properties.ChunkClaim import org.valkyrienskies.core.impl.hooks.VSEvents.ShipLoadEventClient -import org.valkyrienskies.core.impl.networking.simple.registerClientHandler import org.valkyrienskies.core.util.pollUntilEmpty import org.valkyrienskies.mod.common.getShipManagingPos import org.valkyrienskies.mod.common.isChunkInShipyard @@ -44,12 +43,14 @@ class SeamlessChunksManager(private val listener: ClientPacketListener) { private val stalledChunks = LongOpenHashSet() init { - PacketStopChunkUpdates::class.registerClientHandler { (chunks) -> - chunks.forEach { stalledChunks.add(it.toMinecraft().toLong()) } - } - PacketRestartChunkUpdates::class.registerClientHandler { packet -> - Minecraft.getInstance().execute { - onRestartUpdates(packet) + with(vsCore.simplePacketNetworking) { + PacketStopChunkUpdates::class.registerClientHandler { (chunks) -> + chunks.forEach { stalledChunks.add(it.toMinecraft().toLong()) } + } + PacketRestartChunkUpdates::class.registerClientHandler { packet -> + Minecraft.getInstance().execute { + onRestartUpdates(packet) + } } } diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/assembly/ShipAssembler.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/assembly/ShipAssembler.kt new file mode 100644 index 000000000..7ee1c79b1 --- /dev/null +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/assembly/ShipAssembler.kt @@ -0,0 +1,115 @@ +package org.valkyrienskies.mod.common.assembly + +import net.minecraft.core.BlockPos +import net.minecraft.server.level.ServerLevel +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.Blocks +import net.minecraft.world.level.block.state.BlockState +import org.joml.Vector3d +import org.joml.Vector3i +import org.joml.Vector3ic +import org.valkyrienskies.core.api.ships.ServerShip +import org.valkyrienskies.core.api.ships.Ship +import org.valkyrienskies.core.impl.game.ShipTeleportDataImpl +import org.valkyrienskies.mod.common.BlockStateInfo.onSetBlock +import org.valkyrienskies.mod.common.dimensionId +import org.valkyrienskies.mod.common.getShipObjectManagingPos +import org.valkyrienskies.mod.common.shipObjectWorld + +object ShipAssembler { + + fun triggerBlockChange(level: Level?, pos: BlockPos?, prevState: BlockState?, newState: BlockState?) { + onSetBlock(level!!, pos!!, prevState!!, newState!!) + } + + fun isValidShipBlock(state: BlockState?): Boolean { + if (state != null) { + //return !state.tags.anyMatch { it== VsShipAssemblerTags.FORBIDDEN_ASSEMBLE } + return !state.isAir + } + return true + } + + + fun assembleToShip(level: Level, blocks: List, removeOriginal: Boolean, scale: Double): ServerShip { + assert(level is ServerLevel) { "Can't manage contraptions on client side!" } + val sLevel: ServerLevel = level as ServerLevel + if (blocks.isEmpty()) { + throw IllegalArgumentException() + } + + val existingShip = sLevel.getShipObjectManagingPos(blocks.find { !sLevel.getBlockState(it).isAir } ?: throw IllegalArgumentException()) + + var structureCornerMin: BlockPos = blocks[0] + var structureCornerMax: BlockPos = blocks[0] + var hasSolids = false + + // Calculate bounds of the area containing all blocks adn check for solids and invalid blocks + for (itPos in blocks) { + if (isValidShipBlock(level.getBlockState(itPos))) { + structureCornerMin = AssemblyUtil.getMinCorner(structureCornerMin, itPos) + structureCornerMax = AssemblyUtil.getMaxCorner(structureCornerMax, itPos) + hasSolids = true + } + } + if (!hasSolids) throw IllegalArgumentException("No solid blocks found in the structure") + val contraptionOGPos: Vector3ic = AssemblyUtil.getMiddle(structureCornerMin, structureCornerMax) + // Create new contraption at center of bounds + val contraptionWorldPos: Vector3i = if (existingShip != null) { + val doubleVer = existingShip.shipToWorld.transformPosition(Vector3d(contraptionOGPos)).floor() + Vector3i(doubleVer.x.toInt(), doubleVer.y.toInt(), doubleVer.z.toInt()) + } else { + Vector3i(contraptionOGPos) + } + //val contraptionPosition = ContraptionPosition(Quaterniond(Vec3d(0.0, 1.0, 1.0), 0.0), contraptionWorldPos, null) + + val newShip: Ship = (level as ServerLevel).server.shipObjectWorld + .createNewShipAtBlock(contraptionWorldPos, false, scale, level.dimensionId) + + // Stone for safety reasons + + val contraptionShipPos = newShip.worldToShip.transformPosition(Vector3d(contraptionWorldPos.x.toDouble(),contraptionWorldPos.y.toDouble(),contraptionWorldPos.z.toDouble())) + val contraptionBlockPos = BlockPos(contraptionShipPos.x.toInt(),contraptionShipPos.y.toInt(),contraptionShipPos.z.toInt()) + + + // Copy blocks and check if the center block got replaced (is default a stone block) + var centerBlockReplaced = false + for (itPos in blocks) { + if (isValidShipBlock(level.getBlockState(itPos))) { + val relative: BlockPos = itPos.subtract( BlockPos(contraptionOGPos.x(),contraptionOGPos.y(),contraptionOGPos.z())) + val shipPos: BlockPos = contraptionBlockPos.offset(relative) + AssemblyUtil.copyBlock(level, itPos, shipPos) + if (relative == BlockPos.ZERO) centerBlockReplaced = true + } + } + + // If center block got not replaced, remove the stone block + if (!centerBlockReplaced) { + level.setBlock(contraptionBlockPos, Blocks.AIR.defaultBlockState(), 3) + } + + // Remove original blocks + if (removeOriginal) { + for (itPos in blocks) { + if (isValidShipBlock(level.getBlockState(itPos))) { + AssemblyUtil.removeBlock(level, itPos) + } + } + } + + // Trigger updates on both contraptions + for (itPos in blocks) { + val relative: BlockPos = itPos.subtract(BlockPos(contraptionOGPos.x(),contraptionOGPos.y(),contraptionOGPos.z())) + val shipPos: BlockPos = contraptionBlockPos.offset(relative) + AssemblyUtil.updateBlock(level,itPos,shipPos,level.getBlockState(shipPos)) + } + + + sLevel.server.shipObjectWorld + .teleportShip(newShip as ServerShip, ShipTeleportDataImpl(Vector3d(contraptionWorldPos.x.toDouble(),contraptionWorldPos.y.toDouble(),contraptionWorldPos.z.toDouble()))) + + return newShip as ServerShip + } + + +} diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/assembly/ShipAssembly.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/assembly/ShipAssembly.kt index 8df8aea74..b3ea1c640 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/assembly/ShipAssembly.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/assembly/ShipAssembly.kt @@ -5,10 +5,9 @@ import net.minecraft.server.level.ServerLevel import net.minecraft.world.level.ChunkPos import org.joml.Vector3d import org.valkyrienskies.core.api.ships.ServerShip -import org.valkyrienskies.core.util.datastructures.DenseBlockPosSet import org.valkyrienskies.core.impl.game.ships.ShipData import org.valkyrienskies.core.impl.game.ships.ShipTransformImpl -import org.valkyrienskies.core.impl.networking.simple.sendToClient +import org.valkyrienskies.core.util.datastructures.DenseBlockPosSet import org.valkyrienskies.mod.common.dimensionId import org.valkyrienskies.mod.common.executeIf import org.valkyrienskies.mod.common.isTickingChunk @@ -16,93 +15,20 @@ import org.valkyrienskies.mod.common.networking.PacketRestartChunkUpdates import org.valkyrienskies.mod.common.networking.PacketStopChunkUpdates import org.valkyrienskies.mod.common.playerWrapper import org.valkyrienskies.mod.common.shipObjectWorld +import org.valkyrienskies.mod.common.util.toBlockPos import org.valkyrienskies.mod.common.util.toJOML +import org.valkyrienskies.mod.common.vsCore import org.valkyrienskies.mod.util.relocateBlock import org.valkyrienskies.mod.util.updateBlock +@Deprecated("Use ShipAssembler.assembleToShip instead") fun createNewShipWithBlocks( centerBlock: BlockPos, blocks: DenseBlockPosSet, level: ServerLevel ): ServerShip { if (blocks.isEmpty()) throw IllegalArgumentException() - val ship = level.shipObjectWorld.createNewShipAtBlock(centerBlock.toJOML(), false, 1.0, level.dimensionId) - - val shipChunkX = ship.chunkClaim.xMiddle - val shipChunkZ = ship.chunkClaim.zMiddle - - val worldChunkX = centerBlock.x shr 4 - val worldChunkZ = centerBlock.z shr 4 - - val deltaX = worldChunkX - shipChunkX - val deltaZ = worldChunkZ - shipChunkZ - - val chunksToBeUpdated = mutableMapOf>() - blocks.forEachChunk { x, _, z, _ -> - val sourcePos = ChunkPos(x, z) - val destPos = ChunkPos(x - deltaX, z - deltaZ) - chunksToBeUpdated[sourcePos] = Pair(sourcePos, destPos) - } - val chunkPairs = chunksToBeUpdated.values.toList() - val chunkPoses = chunkPairs.flatMap { it.toList() } - val chunkPosesJOML = chunkPoses.map { it.toJOML() } - - // Send a list of all the chunks that we plan on updating to players, so that they - // defer all updates until assembly is finished - level.players().forEach { player -> - PacketStopChunkUpdates(chunkPosesJOML).sendToClient(player.playerWrapper) - } - - // Use relocateBlock to copy all the blocks into the ship - blocks.forEachChunk { chunkX, chunkY, chunkZ, chunk -> - val sourceChunk = level.getChunk(chunkX, chunkZ) - val destChunk = level.getChunk(chunkX - deltaX, chunkZ - deltaZ) - - chunk.forEach { x, y, z -> - val fromPos = BlockPos((sourceChunk.pos.x shl 4) + x, (chunkY shl 4) + y, (sourceChunk.pos.z shl 4) + z) - val toPos = BlockPos((destChunk.pos.x shl 4) + x, (chunkY shl 4) + y, (destChunk.pos.z shl 4) + z) - - relocateBlock(sourceChunk, fromPos, destChunk, toPos, false, ship) - } - } - - // Use updateBlock to update blocks after copying - blocks.forEachChunk { chunkX, chunkY, chunkZ, chunk -> - val sourceChunk = level.getChunk(chunkX, chunkZ) - val destChunk = level.getChunk(chunkX - deltaX, chunkZ - deltaZ) - - chunk.forEach { x, y, z -> - val fromPos = BlockPos((sourceChunk.pos.x shl 4) + x, (chunkY shl 4) + y, (sourceChunk.pos.z shl 4) + z) - val toPos = BlockPos((destChunk.pos.x shl 4) + x, (chunkY shl 4) + y, (destChunk.pos.z shl 4) + z) - - updateBlock(destChunk.level, fromPos, toPos, destChunk.getBlockState(toPos)) - } - } - - // Calculate the position of the block that the player clicked after it has been assembled - val centerInShip = Vector3d( - ((shipChunkX shl 4) + (centerBlock.x and 15)).toDouble(), - centerBlock.y.toDouble(), - ((shipChunkZ shl 4) + (centerBlock.z and 15)).toDouble() - ) - - // The ship's position has shifted from the center block since we assembled the ship, compensate for that - val centerBlockPosInWorld = ship.inertiaData.centerOfMassInShip.sub(centerInShip, Vector3d()) - .add(ship.transform.positionInWorld) - - // Put the ship into the compensated position, so that all the assembled blocks stay in the same place - // TODO: AAAAAAAAA THIS IS HORRIBLE how can the API support this? - (ship as ShipData).transform = (ship.transform as ShipTransformImpl).copy(positionInWorld = centerBlockPosInWorld) - - level.server.executeIf( - // This condition will return true if all modified chunks have been both loaded AND - // chunk update packets were sent to players - { chunkPoses.all(level::isTickingChunk) } - ) { - // Once all the chunk updates are sent to players, we can tell them to restart chunk updates - level.players().forEach { player -> - PacketRestartChunkUpdates(chunkPosesJOML).sendToClient(player.playerWrapper) - } - } + val blockList: MutableList = mutableListOf() - return ship + blocks.toList().forEach { blockList.add(it.toBlockPos()) } + return ShipAssembler.assembleToShip(level, blockList, true, 1.0) } diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/command/ShipArgumentParser.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/command/ShipArgumentParser.kt index 00adb0621..857d01523 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/command/ShipArgumentParser.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/command/ShipArgumentParser.kt @@ -138,8 +138,14 @@ class ShipArgumentParser(private val source: VSCommandSource?, private var selec .filter { it.startsWith(builder.remaining) } .forEach { builder.suggest(it) } } - "limit" -> {} + "id" -> + suggest { builder, source -> + source.shipWorld.allShips + .map { it.id.toString() } + .filter { it.startsWith(builder.remaining) } + .forEach { builder.suggest(it) } + } else -> throw ERROR_UNKNOWN_OPTION.create(option) } @@ -155,7 +161,7 @@ class ShipArgumentParser(private val source: VSCommandSource?, private var selec this.slug = slug } - + "id" -> id = reader.readLong() "limit" -> limit = reader.readInt() else -> throw ERROR_UNKNOWN_OPTION.create(option) } diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/config/VSGameConfig.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/config/VSGameConfig.kt index fe225d812..ebf47e73d 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/config/VSGameConfig.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/config/VSGameConfig.kt @@ -72,6 +72,30 @@ object VSGameConfig { var canTurtlesLeaveScaledShips = false } + val Weather2 = WEATHER2() + + class WEATHER2 { + @JsonSchema( + description = "How much Weather 2's wind affects VS ships" + ) + var windMultiplier = 0.0001f + + @JsonSchema( + description = "The maximum velocity a VS ship can travel because of wind" + ) + var windMaxVel = 20.0f + + @JsonSchema( + description = "In what range storms affect VS ships" + ) + var stormRange = 150.0 + + @JsonSchema( + description = "Storm effect dampening on VS ships" + ) + var stormDampening = 0.0f + } + @JsonSchema( description = "By default, the vanilla server prevents block interacts past a certain distance " + "to prevent cheat clients from breaking blocks halfway across the map. " + diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/config/VSMassDataLoader.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/config/VSMassDataLoader.kt index a40f37daf..6ec62527c 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/config/VSMassDataLoader.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/config/VSMassDataLoader.kt @@ -17,32 +17,25 @@ import net.minecraft.world.level.block.entity.BlockEntity import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.material.FluidState import net.minecraft.world.level.material.Fluids -import net.minecraft.world.level.material.Material import net.minecraft.world.phys.shapes.VoxelShape -import org.joml.Vector3f -import org.joml.Vector3i +import org.joml.Vector3d +import org.joml.primitives.AABBi +import org.joml.primitives.AABBic +import org.valkyrienskies.core.api.physics.blockstates.BoxesBlockShape +import org.valkyrienskies.core.api.physics.blockstates.CollisionPoint +import org.valkyrienskies.core.api.physics.blockstates.LiquidState +import org.valkyrienskies.core.api.physics.blockstates.SolidBlockShape +import org.valkyrienskies.core.apigame.physics.blockstates.VsBlockState import org.valkyrienskies.core.apigame.world.chunks.BlockType import org.valkyrienskies.core.game.VSBlockType -import org.valkyrienskies.core.impl.collision.Lod1SolidShapeUtils -import org.valkyrienskies.core.impl.game.BlockTypeImpl import org.valkyrienskies.mod.common.BlockStateInfoProvider +import org.valkyrienskies.mod.common.ValkyrienSkiesMod import org.valkyrienskies.mod.common.hooks.VSGameEvents import org.valkyrienskies.mod.common.vsCore import org.valkyrienskies.mod.mixin.accessors.world.level.block.SlabBlockAccessor import org.valkyrienskies.mod.mixin.accessors.world.level.block.StairBlockAccessor import org.valkyrienskies.mod.util.logger -import org.valkyrienskies.physics_api.Lod1BlockStateId -import org.valkyrienskies.physics_api.Lod1LiquidBlockStateId -import org.valkyrienskies.physics_api.Lod1SolidBlockStateId -import org.valkyrienskies.physics_api.voxel.CollisionPoint -import org.valkyrienskies.physics_api.voxel.Lod1LiquidBlockState -import org.valkyrienskies.physics_api.voxel.Lod1SolidBlockState -import org.valkyrienskies.physics_api.voxel.Lod1SolidBoxesCollisionShape -import org.valkyrienskies.physics_api.voxel.Lod1SolidCollisionShape -import org.valkyrienskies.physics_api.voxel.LodBlockBoundingBox import java.util.Optional -import kotlin.math.max -import kotlin.math.min import kotlin.math.roundToInt private data class VSBlockStateInfo( @@ -56,10 +49,9 @@ private data class VSBlockStateInfo( object MassDatapackResolver : BlockStateInfoProvider { private val map = hashMapOf() - private val _solidBlockStates: MutableList = ArrayList() - private val _liquidBlockStates: MutableList = ArrayList() - private val _blockStateData: MutableList> = ArrayList() - private val blockStateToId: MutableMap = HashMap() + private val mcBlockStateToVs: MutableMap = HashMap() + + val blockStateData: Collection = mcBlockStateToVs.values val loader get() = VSMassDataLoader() @@ -74,19 +66,14 @@ object MassDatapackResolver : BlockStateInfoProvider { override fun getBlockStateMass(blockState: BlockState): Double? = map[Registry.BLOCK.getKey(blockState.block)]?.mass - override fun getBlockStateType(blockState: BlockState): VSBlockType? = - blockStateToId[blockState]!! + override fun getBlockStateType(blockState: BlockState): BlockType? { + val vsState = mcBlockStateToVs[blockState] ?: return null + return vsCore.blockTypes.getType(vsState) + } var registeredBlocks = false private set - override val solidBlockStates: List - get() = _solidBlockStates - override val liquidBlockStates: List - get() = _liquidBlockStates - override val blockStateData: List> - get() = _blockStateData - class VSMassDataLoader : SimpleJsonResourceReloadListener(Gson(), "vs_mass") { private val tags = mutableListOf() @@ -160,7 +147,7 @@ object MassDatapackResolver : BlockStateInfoProvider { val friction = element.asJsonObject["friction"]?.asDouble ?: DEFAULT_FRICTION val elasticity = element.asJsonObject["elasticity"]?.asDouble ?: DEFAULT_ELASTICITY - val priority = element.asJsonObject["priority"]?.asInt ?: 100 + val priority = element.asJsonObject["priority"]?.asInt ?: decideDefaultPriority(origin) if (tag != null) { addToBeAddedTags(VSBlockStateInfo(ResourceLocation(tag), priority, weight, friction, elasticity, null)) @@ -173,38 +160,45 @@ object MassDatapackResolver : BlockStateInfoProvider { } } - private fun generateStairCollisionShapes(stairShapes: Array): Map { + fun decideDefaultPriority(resourceLocation: ResourceLocation) = when { + resourceLocation.namespace.equals(ValkyrienSkiesMod.MOD_ID) -> 1000 + resourceLocation.namespace.equals("custom") -> 50 + else -> 100 + } + + + private fun generateStairCollisionShapes(stairShapes: Array): Map { val testPoints = listOf( - CollisionPoint(Vector3f(.25f, .25f, .25f), .25f), - CollisionPoint(Vector3f(.25f, .25f, .75f), .25f), - CollisionPoint(Vector3f(.25f, .75f, .25f), .25f), - CollisionPoint(Vector3f(.25f, .75f, .75f), .25f), - CollisionPoint(Vector3f(.75f, .25f, .25f), .25f), - CollisionPoint(Vector3f(.75f, .25f, .75f), .25f), - CollisionPoint(Vector3f(.75f, .75f, .25f), .25f), - CollisionPoint(Vector3f(.75f, .75f, .75f), .25f), + CollisionPoint(.25f, .25f, .25f, .25f), + CollisionPoint(.25f, .25f, .75f, .25f), + CollisionPoint(.25f, .75f, .25f, .25f), + CollisionPoint(.25f, .75f, .75f, .25f), + CollisionPoint(.75f, .25f, .25f, .25f), + CollisionPoint(.75f, .25f, .75f, .25f), + CollisionPoint(.75f, .75f, .25f, .25f), + CollisionPoint(.75f, .75f, .75f, .25f), ) val testBoxes = listOf( - LodBlockBoundingBox.createVSBoundingBox(0, 0, 0, 7, 7, 7), - LodBlockBoundingBox.createVSBoundingBox(0, 0, 8, 7, 7, 15), - LodBlockBoundingBox.createVSBoundingBox(0, 8, 0, 7, 15, 7), - LodBlockBoundingBox.createVSBoundingBox(0, 8, 8, 7, 15, 15), - LodBlockBoundingBox.createVSBoundingBox(8, 0, 0, 15, 7, 7), - LodBlockBoundingBox.createVSBoundingBox(8, 0, 8, 15, 7, 15), - LodBlockBoundingBox.createVSBoundingBox(8, 8, 0, 15, 15, 7), - LodBlockBoundingBox.createVSBoundingBox(8, 8, 8, 15, 15, 15), + AABBi(0, 0, 0, 7, 7, 7), + AABBi(0, 0, 8, 7, 7, 15), + AABBi(0, 8, 0, 7, 15, 7), + AABBi(0, 8, 8, 7, 15, 15), + AABBi(8, 0, 0, 15, 7, 7), + AABBi(8, 0, 8, 15, 7, 15), + AABBi(8, 8, 0, 15, 15, 7), + AABBi(8, 8, 8, 15, 15, 15), ) - val map: MutableMap = HashMap() + val map: MutableMap = HashMap() stairShapes.forEach { stairShape -> val points: MutableList = ArrayList() - val positiveBoxes: MutableList = ArrayList() - val negativeBoxes: MutableList = ArrayList() + val positiveBoxes: MutableList = ArrayList() + val negativeBoxes: MutableList = ArrayList() testPoints.forEachIndexed { index, testPoint -> var added = false stairShape.forAllBoxes { minX, minY, minZ, maxX, maxY, maxZ -> - if (testPoint.pos.x() in minX .. maxX && testPoint.pos.y() in minY .. maxY && testPoint.pos.z() in minZ .. maxZ) { + if (testPoint.x in minX .. maxX && testPoint.y in minY .. maxY && testPoint.z in minZ .. maxZ) { points.add(testPoint) added = true return@forAllBoxes @@ -216,52 +210,39 @@ object MassDatapackResolver : BlockStateInfoProvider { negativeBoxes.add(testBoxes[index]) } } - val minTotalAABB = Vector3i(positiveBoxes[0].minX.toInt(), positiveBoxes[0].minY.toInt(), positiveBoxes[0].minZ.toInt()) - val maxTotalAABB = Vector3i(positiveBoxes[0].maxX.toInt(), positiveBoxes[0].maxY.toInt(), positiveBoxes[0].maxZ.toInt()) - for (i in 1 until positiveBoxes.size) { - minTotalAABB.x = min(minTotalAABB.x, positiveBoxes[i].minX.toInt()) - minTotalAABB.y = min(minTotalAABB.y, positiveBoxes[i].minY.toInt()) - minTotalAABB.z = min(minTotalAABB.z, positiveBoxes[i].minZ.toInt()) - maxTotalAABB.x = max(maxTotalAABB.x, positiveBoxes[i].maxX.toInt()) - maxTotalAABB.y = max(maxTotalAABB.y, positiveBoxes[i].maxY.toInt()) - maxTotalAABB.z = max(maxTotalAABB.z, positiveBoxes[i].maxZ.toInt()) - } - val overallBox = LodBlockBoundingBox.createVSBoundingBox( - minTotalAABB.x.toByte(), minTotalAABB.y.toByte(), minTotalAABB.z.toByte(), maxTotalAABB.x.toByte(), - maxTotalAABB.y.toByte(), maxTotalAABB.z.toByte() - ) - val collisionShape = Lod1SolidBoxesCollisionShape( - overallBoundingBox = overallBox, - collisionPoints = points, - solidBoxes = Lod1SolidShapeUtils.mergeBoxes(positiveBoxes), - negativeBoxes = Lod1SolidShapeUtils.mergeBoxes(negativeBoxes), - ) + + val collisionShape = vsCore.newSolidStateBoxesShapeBuilder() + .addCollisionPoints(points) + .addPositiveBoxes(vsCore.solidShapeUtils.mergeBoxes(positiveBoxes)) + .addNegativeBoxes(vsCore.solidShapeUtils.mergeBoxes(negativeBoxes)) + .build() + map[stairShape] = collisionShape } return map } - private fun generateShapeFromVoxel(voxelShape: VoxelShape): Lod1SolidBoxesCollisionShape? { - val posBoxes = ArrayList() + private fun generateShapeFromVoxel(voxelShape: VoxelShape): BoxesBlockShape? { + val posBoxes = ArrayList() var failed = false var maxBoxesToTest = 20 voxelShape.forAllBoxes { minX, minY, minZ, maxX, maxY, maxZ -> if (failed) { return@forAllBoxes } - val lodMinX = (minX * 16).roundToInt().toByte() - val lodMinY = (minY * 16).roundToInt().toByte() - val lodMinZ = (minZ * 16).roundToInt().toByte() - val lodMaxX = ((maxX * 16).roundToInt() - 1).toByte() - val lodMaxY = ((maxY * 16).roundToInt() - 1).toByte() - val lodMaxZ = ((maxZ * 16).roundToInt() - 1).toByte() + val lodMinX = (minX * 16).roundToInt() + val lodMinY = (minY * 16).roundToInt() + val lodMinZ = (minZ * 16).roundToInt() + val lodMaxX = ((maxX * 16).roundToInt() - 1) + val lodMaxY = ((maxY * 16).roundToInt() - 1) + val lodMaxZ = ((maxZ * 16).roundToInt() - 1) if (lodMinX !in 0..15 || lodMinY !in 0..15 || lodMinZ !in 0..15 || lodMaxX !in 0..15 || lodMaxY !in 0..15 || lodMaxZ !in 0..15) { // Out of range failed = true return@forAllBoxes } else { posBoxes.add( - LodBlockBoundingBox.createVSBoundingBox(lodMinX, lodMinY, lodMinZ, lodMaxX, lodMaxY, lodMaxZ) + AABBi(lodMinX, lodMinY, lodMinZ, lodMaxX, lodMaxY, lodMaxZ) ) } if (maxBoxesToTest == 0) { @@ -271,68 +252,33 @@ object MassDatapackResolver : BlockStateInfoProvider { } } return if (!failed) { - Lod1SolidShapeUtils.generateShapeFromBoxes(posBoxes) + try { + vsCore.solidShapeUtils.generateShapeFromBoxes(posBoxes) + } catch (ex: IllegalArgumentException) { + println("WTF ERROR WHILE PROCESSING $voxelShape") + null + } } else { null } } fun registerAllBlockStates(blockStates: Iterable) { - val fullLodBoundingBox = LodBlockBoundingBox.createVSBoundingBox(0, 0, 0, 15, 15, 15) + val fullLodBoundingBox = AABBi(0, 0, 0, 15, 15, 15) val fullBlockCollisionPoints = listOf( - CollisionPoint(Vector3f(.25f, .25f, .25f), .25f), - CollisionPoint(Vector3f(.25f, .25f, .75f), .25f), - CollisionPoint(Vector3f(.25f, .75f, .25f), .25f), - CollisionPoint(Vector3f(.25f, .75f, .75f), .25f), - CollisionPoint(Vector3f(.75f, .25f, .25f), .25f), - CollisionPoint(Vector3f(.75f, .25f, .75f), .25f), - CollisionPoint(Vector3f(.75f, .75f, .25f), .25f), - CollisionPoint(Vector3f(.75f, .75f, .75f), .25f), - ) - val fullBlockCollisionShape = Lod1SolidBoxesCollisionShape( - overallBoundingBox = fullLodBoundingBox, - collisionPoints = fullBlockCollisionPoints, - solidBoxes = listOf(fullLodBoundingBox), - negativeBoxes = listOf(), + CollisionPoint(.25f, .25f, .25f, .25f), + CollisionPoint(.25f, .25f, .75f, .25f), + CollisionPoint(.25f, .75f, .25f, .25f), + CollisionPoint(.25f, .75f, .75f, .25f), + CollisionPoint(.75f, .25f, .25f, .25f), + CollisionPoint(.75f, .25f, .75f, .25f), + CollisionPoint(.75f, .75f, .25f, .25f), + CollisionPoint(.75f, .75f, .75f, .25f), ) - - // Add default block states - run { - // region Add default solid block state - val solidBlockState = Lod1SolidBlockState( - collisionShape = fullBlockCollisionShape, - elasticity = DEFAULT_ELASTICITY.toFloat(), - friction = DEFAULT_FRICTION.toFloat(), - hardness = DEFAULT_HARDNESS.toFloat(), - lod1SolidBlockStateId = BlockTypeImpl.SOLID.toInt(), - ) - _solidBlockStates.add(solidBlockState) - _blockStateData.add(Triple(BlockTypeImpl.SOLID.toInt(), BlockTypeImpl.AIR.toInt(), BlockTypeImpl.SOLID.toInt())) - // endregion - - // region Add default water/lava liquid block states - val waterBlockState = Lod1LiquidBlockState( - boundingBox = fullLodBoundingBox, - density = 1000.0f, - dragCoefficient = 0.3f, - fluidVel = Vector3f(), - lod1LiquidBlockStateId = BlockTypeImpl.WATER.toInt(), - ) - - val lavaBlockState = Lod1LiquidBlockState( - boundingBox = fullLodBoundingBox, - density = 10000.0f, - dragCoefficient = 1.0f, - fluidVel = Vector3f(), - lod1LiquidBlockStateId = BlockTypeImpl.LAVA.toInt(), - ) - - _liquidBlockStates.add(waterBlockState) - _liquidBlockStates.add(lavaBlockState) - _blockStateData.add(Triple(BlockTypeImpl.AIR.toInt(), BlockTypeImpl.WATER.toInt(), BlockTypeImpl.WATER.toInt())) - _blockStateData.add(Triple(BlockTypeImpl.AIR.toInt(), BlockTypeImpl.LAVA.toInt(), BlockTypeImpl.LAVA.toInt())) - // endregion - } + val fullBlockCollisionShape = vsCore.newSolidStateBoxesShapeBuilder() + .addCollisionPoints(fullBlockCollisionPoints) + .addPositiveBox(fullLodBoundingBox) + .build() // A dummy world used to get the VoxelShape for each block state val dummyBlockGetter = object: BlockGetter { @@ -352,55 +298,46 @@ object MassDatapackResolver : BlockStateInfoProvider { StairBlockAccessor.getTopShapes() + StairBlockAccessor.getBottomShapes() + SlabBlockAccessor.getBottomAABB() + SlabBlockAccessor.getTopAABB() ) - // Setup initial conditions for future ids - var nextSolidId = 2 - var nextFluidId = 4 - var nextVoxelStateId = 4 + val generatedCollisionShapesMap = HashMap() + val liquidMaterialToDensityMap = mapOf(Fluids.WATER to Pair(1000.0, 0.3), Fluids.LAVA to Pair(10000.0, 1.0), Fluids.FLOWING_WATER to Pair(1000.0, 0.3), Fluids.FLOWING_LAVA to Pair(10000.0, 1.0)) - val generatedCollisionShapesMap = HashMap() - val liquidMaterialToDensityMap = mapOf(Fluids.WATER to Pair(1000.0f, 0.3f), Fluids.LAVA to Pair(10000.0f, 1.0f), Fluids.FLOWING_WATER to Pair(1000.0f, 0.3f), Fluids.FLOWING_LAVA to Pair(10000.0f, 1.0f)) - - val fluidStateToBlockTypeMap = HashMap>() + val fluidStateToBlockTypeMap = HashMap() // Get the id of the fluid state/create a new fluid state if necessary - fun getFluidState(fluidState: FluidState): Pair { + // Get the id of the fluid state/create a new fluid state if necessary + fun getFluidState(fluidState: FluidState): LiquidState { val cached = fluidStateToBlockTypeMap[fluidState] if (cached != null) return cached - val maxY = ((fluidState.ownHeight * 16.0).roundToInt() - 1).coerceIn(0, 15).toByte() - val fluidBox = LodBlockBoundingBox.createVSBoundingBox(0, 0, 0, 15, maxY, 15) - if (fluidState.type in liquidMaterialToDensityMap) { + val maxY = ((fluidState.ownHeight * 16.0).roundToInt() - 1).coerceIn(0, 15) + val fluidBox = AABBi(0, 0, 0, 15, maxY, 15) + return if (fluidState.type in liquidMaterialToDensityMap) { val (density, dragCoefficient) = liquidMaterialToDensityMap[fluidState.type]!! - val newFluidBlockState = Lod1LiquidBlockState( - boundingBox = fluidBox, - density = density, - dragCoefficient = dragCoefficient, - fluidVel = Vector3f(), - lod1LiquidBlockStateId = nextFluidId++, - ) - val stateId = nextVoxelStateId++ - _liquidBlockStates.add(newFluidBlockState) - _blockStateData.add(Triple(BlockTypeImpl.AIR.toInt(), newFluidBlockState.lod1LiquidBlockStateId, stateId)) - val blockTypeNew = BlockTypeImpl(stateId) - fluidStateToBlockTypeMap[fluidState] = newFluidBlockState.lod1LiquidBlockStateId to blockTypeNew - return newFluidBlockState.lod1LiquidBlockStateId to blockTypeNew + val newFluidBlockState = vsCore.newLiquidStateBuilder() + .boxShape(fluidBox) + .density(density) + .dragCoefficient(dragCoefficient) + .velocity(Vector3d()) + .build() + + newFluidBlockState } else { // Default - return BlockTypeImpl.WATER.toInt() to BlockTypeImpl.WATER + vsCore.blockTypes.waterState.liquidState!! } } blockStates.forEach { blockState: BlockState -> - val blockType: BlockType + val vsBlockState: VsBlockState if (blockState.isAir) { - blockType = vsCore.blockTypes.air + vsBlockState = vsCore.blockTypes.airState } else { val blockMaterial = blockState.material - blockType = if (blockMaterial.isLiquid) { - getFluidState(blockState.fluidState).second + vsBlockState = if (blockMaterial.isLiquid) { + VsBlockState(null, getFluidState(blockState.fluidState)) } else if (blockMaterial.isSolid) { val voxelShape = blockState.getShape(dummyBlockGetter, BlockPos.ZERO) - val collisionShape: Lod1SolidCollisionShape = if (voxelShapeToCollisionShapeMap.contains(voxelShape)) { + val collisionShape: SolidBlockShape = if (voxelShapeToCollisionShapeMap.contains(voxelShape)) { voxelShapeToCollisionShapeMap[voxelShape]!! } else if (generatedCollisionShapesMap.contains(voxelShape)) { if (generatedCollisionShapesMap[voxelShape] != null) { @@ -417,31 +354,25 @@ object MassDatapackResolver : BlockStateInfoProvider { val vsBlockStateInfo = map[Registry.BLOCK.getKey(blockState.block)] // Create new solid block state - val solidStateId = nextSolidId++ - val newSolidBlockState = Lod1SolidBlockState( - collisionShape = collisionShape, - elasticity = vsBlockStateInfo?.elasticity?.toFloat() ?: DEFAULT_ELASTICITY.toFloat(), - friction = vsBlockStateInfo?.friction?.toFloat() ?: DEFAULT_FRICTION.toFloat(), - hardness = DEFAULT_HARDNESS.toFloat(), - lod1SolidBlockStateId = solidStateId, - ) - _solidBlockStates.add(newSolidBlockState) - - // Create new voxel state - val blockStateId = nextVoxelStateId++ - - var fluidId = BlockTypeImpl.AIR.toInt() - if (!blockState.fluidState.isEmpty) { - fluidId = getFluidState(blockState.fluidState).first + val solidState = vsCore.newSolidStateBuilder() + .shape(collisionShape) + .elasticity(vsBlockStateInfo?.elasticity ?: DEFAULT_ELASTICITY) + .friction(vsBlockStateInfo?.friction ?: DEFAULT_FRICTION) + .hardness(DEFAULT_HARDNESS) + .build() + + val fluidState = if (!blockState.fluidState.isEmpty) { + getFluidState(blockState.fluidState) + } else { + null } - _blockStateData.add(Triple(solidStateId, fluidId, blockStateId)) - BlockTypeImpl(blockStateId) + VsBlockState(solidState, fluidState) } else { - vsCore.blockTypes.air + vsCore.blockTypes.airState } } - blockStateToId[blockState] = blockType + mcBlockStateToVs[blockState] = vsBlockState } registeredBlocks = true diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/ShipMountingEntity.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/ShipMountingEntity.kt index fb62268ca..34da4e64b 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/ShipMountingEntity.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/ShipMountingEntity.kt @@ -12,13 +12,13 @@ import net.minecraft.world.phys.Vec3 import org.joml.Vector3f import org.valkyrienskies.core.api.ships.LoadedServerShip import org.valkyrienskies.core.api.ships.setAttachment -import org.valkyrienskies.core.impl.networking.simple.sendToServer import org.valkyrienskies.mod.api.SeatedControllingPlayer import org.valkyrienskies.mod.common.config.VSKeyBindings import org.valkyrienskies.mod.common.getShipManagingPos import org.valkyrienskies.mod.common.getShipObjectManagingPos import org.valkyrienskies.mod.common.isBlockInShipyard import org.valkyrienskies.mod.common.networking.PacketPlayerDriving +import org.valkyrienskies.mod.common.vsCore open class ShipMountingEntity(type: EntityType, level: Level) : Entity(type, level) { // Decides if this entity controls the ship it is in. @@ -96,7 +96,9 @@ open class ShipMountingEntity(type: EntityType, level: Level impulse.x = if (left == right) 0.0f else if (left) 1.0f else -1.0f impulse.y = if (up == down) 0.0f else if (up) 1.0f else -1.0f - PacketPlayerDriving(impulse, sprint, cruise).sendToServer() + with(vsCore.simplePacketNetworking) { + PacketPlayerDriving(impulse, sprint, cruise).sendToServer() + } } override fun getControllingPassenger(): Entity? { diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/VSPhysicsEntity.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/VSPhysicsEntity.kt index b636d67ff..9adbc52d4 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/VSPhysicsEntity.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/VSPhysicsEntity.kt @@ -26,7 +26,6 @@ import org.valkyrienskies.core.apigame.world.ServerShipWorldCore import org.valkyrienskies.core.impl.game.ShipTeleportDataImpl import org.valkyrienskies.core.impl.game.ships.ShipInertiaDataImpl import org.valkyrienskies.core.impl.game.ships.ShipObjectClientWorld -import org.valkyrienskies.core.impl.game.ships.ShipObjectServerWorld import org.valkyrienskies.core.impl.game.ships.ShipTransformImpl import org.valkyrienskies.core.impl.util.serialization.VSJacksonUtil import org.valkyrienskies.mod.common.dimensionId @@ -141,7 +140,7 @@ open class VSPhysicsEntity(type: EntityType, level: Level) : En } val physicsEntityDataAsBytes: ByteArray = compoundTag.getByteArray(PHYS_DATA_NBT_KEY) val oldPhysicsEntityData = getMapper().readValue(physicsEntityDataAsBytes) - val newShipId = (level.shipObjectWorld as ShipObjectServerWorld).allocateShipId(level.dimensionId) + val newShipId = (level.shipObjectWorld as ServerShipWorldCore).allocateShipId(level.dimensionId) val newPhysicsEntityData = oldPhysicsEntityData.copyPhysicsEntityDataWithNewId(newShipId) // Change the shipId to be something new setPhysicsEntityData(newPhysicsEntityData) @@ -198,7 +197,7 @@ open class VSPhysicsEntity(type: EntityType, level: Level) : En if (physicsEntityServerCopy != null) { val newPos = Vector3d(d, e, f) val teleportData = ShipTeleportDataImpl(newPos = newPos) - (this.level.shipObjectWorld as ShipObjectServerWorld).teleportPhysicsEntity(this.physicsEntityServer!!, teleportData) + (this.level.shipObjectWorld as ServerShipWorldCore).teleportPhysicsEntity(this.physicsEntityServer!!, teleportData) } else { physicsEntityData!!.transform = ShipTransformImpl.create( Vector3d(d, e, f), diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/handling/VSEntityManager.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/handling/VSEntityManager.kt index 8a45a3a62..f7ac714cc 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/handling/VSEntityManager.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/handling/VSEntityManager.kt @@ -5,10 +5,10 @@ import net.minecraft.core.Registry import net.minecraft.resources.ResourceLocation import net.minecraft.world.entity.Entity import net.minecraft.world.entity.EntityType -import org.valkyrienskies.core.impl.networking.simple.sendToClient import org.valkyrienskies.mod.common.ValkyrienSkiesMod import org.valkyrienskies.mod.common.networking.PacketSyncVSEntityTypes import org.valkyrienskies.mod.common.util.MinecraftPlayer +import org.valkyrienskies.mod.common.vsCore import org.valkyrienskies.mod.compat.CreateCompat import java.time.Duration import kotlin.text.RegexOption.IGNORE_CASE @@ -98,7 +98,8 @@ object VSEntityManager { i to namedEntityHandlers[handler].toString() } .toMap() - - PacketSyncVSEntityTypes(entityTypes).sendToClient(player) + with (vsCore.simplePacketNetworking) { + PacketSyncVSEntityTypes(entityTypes).sendToClient(player) + } } } diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/hooks/VSGameEvents.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/hooks/VSGameEvents.kt index fd3a1ccaf..6a5608cc3 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/hooks/VSGameEvents.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/hooks/VSGameEvents.kt @@ -7,7 +7,9 @@ import net.minecraft.client.renderer.LevelRenderer import net.minecraft.client.renderer.LevelRenderer.RenderChunkInfo import net.minecraft.client.renderer.RenderType import org.valkyrienskies.core.api.ships.ClientShip -import org.valkyrienskies.core.impl.util.events.EventEmitterImpl +import org.valkyrienskies.core.api.ships.properties.ShipId +import org.valkyrienskies.core.util.events.EventEmitterImpl +import org.valkyrienskies.core.util.datastructures.DenseBlockPosSet object VSGameEvents { @@ -18,6 +20,8 @@ object VSGameEvents { val postRenderShip = EventEmitterImpl() val shipsStartRendering = EventEmitterImpl() + val shipSplit = EventEmitterImpl() + data class ShipStartRenderEvent( val renderer: LevelRenderer, val renderType: RenderType, @@ -35,5 +39,11 @@ object VSGameEvents { val ship: ClientShip, val chunks: ObjectList ) + + data class ShipSplitEvent( + val ship: ShipId, + val newShip: ShipId, + val blocks: DenseBlockPosSet + ) } diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/networking/VSGamePackets.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/networking/VSGamePackets.kt index 7c1efeb1b..4be65f6eb 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/networking/VSGamePackets.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/networking/VSGamePackets.kt @@ -6,25 +6,23 @@ import net.minecraft.server.level.ServerPlayer import org.valkyrienskies.core.api.ships.LoadedServerShip import org.valkyrienskies.core.api.ships.getAttachment import org.valkyrienskies.core.api.ships.setAttachment -import org.valkyrienskies.core.impl.networking.simple.register -import org.valkyrienskies.core.impl.networking.simple.registerClientHandler -import org.valkyrienskies.core.impl.networking.simple.registerServerHandler import org.valkyrienskies.mod.api.SeatedControllingPlayer import org.valkyrienskies.mod.common.entity.ShipMountingEntity import org.valkyrienskies.mod.common.entity.handling.VSEntityManager import org.valkyrienskies.mod.common.getShipObjectManagingPos import org.valkyrienskies.mod.common.util.MinecraftPlayer +import org.valkyrienskies.mod.common.vsCore object VSGamePackets { - fun register() { + fun register() = with(vsCore.simplePacketNetworking) { PacketPlayerDriving::class.register() PacketStopChunkUpdates::class.register() PacketRestartChunkUpdates::class.register() PacketSyncVSEntityTypes::class.register() } - fun registerHandlers() { + fun registerHandlers() = with(vsCore.simplePacketNetworking) { PacketPlayerDriving::class.registerServerHandler { driving, iPlayer -> val player = (iPlayer as MinecraftPlayer).player as ServerPlayer val seat = player.vehicle as? ShipMountingEntity diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityShipCollisionUtils.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityShipCollisionUtils.kt index 89b3128f8..4b4109ae1 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityShipCollisionUtils.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityShipCollisionUtils.kt @@ -13,7 +13,6 @@ import org.joml.primitives.AABBd import org.joml.primitives.AABBdc import org.valkyrienskies.core.api.ships.Ship import org.valkyrienskies.core.apigame.collision.ConvexPolygonc -import org.valkyrienskies.core.impl.collision.k.createPolygonFromAABB import org.valkyrienskies.core.util.extend import org.valkyrienskies.mod.common.getShipsIntersecting import org.valkyrienskies.mod.common.shipObjectWorld @@ -125,7 +124,7 @@ object EntityShipCollisionUtils { world.getBlockCollisions(entity, entityBoundingBoxInShipCoordinates.toMinecraft()) shipBlockCollisionStream.forEach { voxelShape: VoxelShape -> voxelShape.forAllBoxes { minX, minY, minZ, maxX, maxY, maxZ -> - val shipPolygon: ConvexPolygonc = createPolygonFromAABB( + val shipPolygon: ConvexPolygonc = vsCore.entityPolygonCollider.createPolygonFromAABB( AABBd(minX, minY, minZ, maxX, maxY, maxZ), shipTransform.shipToWorld, shipObject.id diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/compat/LoadedMods.kt b/common/src/main/kotlin/org/valkyrienskies/mod/compat/LoadedMods.kt index 6d3e0cd9c..995539262 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/compat/LoadedMods.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/compat/LoadedMods.kt @@ -8,6 +8,9 @@ object LoadedMods { @JvmStatic val iris by CompatInfo("net.coderbot.iris.Iris") + @JvmStatic + val weather2 by CompatInfo("weather2.Weather") + class CompatInfo(private val className: String) : ReadOnlyProperty { private var isLoaded: Boolean? = null diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/compat/Weather2Compat.kt b/common/src/main/kotlin/org/valkyrienskies/mod/compat/Weather2Compat.kt new file mode 100644 index 000000000..975b461e8 --- /dev/null +++ b/common/src/main/kotlin/org/valkyrienskies/mod/compat/Weather2Compat.kt @@ -0,0 +1,73 @@ +package org.valkyrienskies.mod.compat + +import net.minecraft.server.level.ServerLevel +import org.joml.Vector3d +import org.valkyrienskies.core.api.ships.getAttachment +import org.valkyrienskies.mod.common.config.VSGameConfig +import org.valkyrienskies.mod.common.shipObjectWorld +import org.valkyrienskies.mod.common.util.GameTickForceApplier +import org.valkyrienskies.mod.common.util.toMinecraft +import weather2.ServerTickHandler +import weather2.weathersystem.storm.StormObject + +object Weather2Compat { + fun tick(level: ServerLevel) { + val mgr = ServerTickHandler + .getWeatherManagerFor(level.dimension()) + + val windMult = VSGameConfig.SERVER.Weather2.windMultiplier + val windMax = VSGameConfig.SERVER.Weather2.windMaxVel + val stormDampen = 1.0f - VSGameConfig.SERVER.Weather2.stormDampening + val stormRange = VSGameConfig.SERVER.Weather2.stormRange + + val vec = Vector3d() + level.shipObjectWorld.loadedShips.forEach { ship -> + val forces = ship.getAttachment()!! + + val com = ship.inertiaData.centerOfMassInShip + + ship.shipToWorld.transformPosition(com, vec) + val pos = vec.toMinecraft() + + val motion = ship.velocity.toMinecraft() + + val mass = ship.inertiaData.mass + + var forcePlusMotion = mgr.windManager.applyWindForceImpl( + pos, + motion, + mass.toFloat(), + windMult, + windMax + ) + + fun applyForcePlusMotion() { + vec.x = forcePlusMotion.x + vec.y = forcePlusMotion.y + vec.z = forcePlusMotion.z + + vec.sub(ship.velocity) + vec.mul(mass) + + forces.applyInvariantForceToPos(vec, com) + } + + applyForcePlusMotion() + + mgr.getStormsAround(pos, stormRange).forEach { + if (it is StormObject) { + runCatching { // prevent Cannot read field "listLayers" because "this.tornadoFunnelSimple" is null at weather2.weathersystem.storm.StormObject.spinObject(StormObject.java:2503) + forcePlusMotion = it.spinObject( + pos, + forcePlusMotion, + false, + stormDampen + ) + + applyForcePlusMotion() + } + } + } + } + } +} diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/compat/clothconfig/VSClothConfig.kt b/common/src/main/kotlin/org/valkyrienskies/mod/compat/clothconfig/VSClothConfig.kt index 8081551a7..64fe9da9b 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/compat/clothconfig/VSClothConfig.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/compat/clothconfig/VSClothConfig.kt @@ -16,14 +16,16 @@ import net.minecraft.client.gui.screens.Screen import net.minecraft.network.chat.Component import org.apache.commons.lang3.StringUtils import org.valkyrienskies.core.impl.config.SidedVSConfigClass -import org.valkyrienskies.core.impl.config.VSConfigClass import org.valkyrienskies.core.impl.util.serialization.VSJacksonUtil +import org.valkyrienskies.mod.common.vsCore import java.util.Optional object VSClothConfig { @JvmStatic - fun createConfigScreenFor(parent: Screen, vararg configClasses: VSConfigClass): Screen { + fun createConfigScreenFor(parent: Screen, vararg configClassesJ: Class<*>): Screen { + val configClasses = configClassesJ.map(vsCore::getRegisteredConfigLegacy) + return ConfigBuilder.create().apply { parentScreen = parent @@ -240,7 +242,7 @@ object VSClothConfig { val newValue = try { mapper.readTree(str) } catch (ex: JsonProcessingException) { - return@setErrorSupplier Optional.of(Component.literal(ex.message)) + return@setErrorSupplier Optional.of(Component.literal(ex.message ?: "")) } getValidationMessageComponent(newValue) diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/util/McMathUtil.kt b/common/src/main/kotlin/org/valkyrienskies/mod/util/McMathUtil.kt index 507aea658..43968e4f7 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/util/McMathUtil.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/util/McMathUtil.kt @@ -1,6 +1,8 @@ package org.valkyrienskies.mod.util import net.minecraft.world.phys.AABB +import org.joml.Vector3d +import org.joml.Vector3dc fun AABB.scale(scale: Double): AABB { val sizeX = (this.xsize * scale) / 2 @@ -15,3 +17,5 @@ fun AABB.scale(scale: Double): AABB { this.center.z + sizeZ ) } + +val DEFAULT_WORLD_GRAVITY: Vector3dc = Vector3d(0.0, -10.0, 0.0) diff --git a/common/src/main/resources/assets/valkyrienskies/lang/ko_kr.json b/common/src/main/resources/assets/valkyrienskies/lang/ko_kr.json new file mode 100644 index 000000000..d391ddadc --- /dev/null +++ b/common/src/main/resources/assets/valkyrienskies/lang/ko_kr.json @@ -0,0 +1,25 @@ +{ + "key.valkyrienskies.ship_cruise": "크루즈", + "key.valkyrienskies.ship_down": "하강", + "category.valkyrienskies.driving": "운전", + "block.valkyrienskies.test_chair": "디버그 의자", + "block.valkyrienskies.test_hinge": "디버그 힌지", + "block.valkyrienskies.test_flap": "디버그 플랩", + "block.valkyrienskies.test_wing": "디버그 날개", + "item.valkyrienskies.ship_creator": "선박 생성기", + "item.valkyrienskies.ship_creator_smaller": "소형 선박 생성기", + "item.valkyrienskies.physics_entity_creator": "물리 엔티티 생성기", + "argument.valkyrienskies.ship.no_found": "선박을 찾을 수 없음", + "argument.valkyrienskies.ship.multiple_found": "여러 선박을 찾음", + "command.valkyrienskies.delete.success": "%d척의 선박을 삭제했습니다!", + "command.valkyrienskies.set_static.success": "%d척의 선박을 is-static=%s로 설정했습니다!", + "command.valkyrienskies.teleport.success": "%d척의 선박을 %s(으)로 이동했습니다!", + "command.valkyrienskies.teleport.multiple_ship_success": "%d척의 선박을 이동했습니다!", + "command.valkyrienskies.mc_teleport.can_only_teleport_to_one_ship": "정확히 1척의 선박으로만 이동할 수 있습니다", + "command.valkyrienskies.get_ship.success": "슬러그가 %s인 선박을 찾았습니다", + "command.valkyrienskies.get_ship.fail": "선박을 찾을 수 없습니다", + "command.valkyrienskies.get_ship.only_usable_by_entities": "/vs get-ship은 엔티티에 의해서만 실행될 수 있습니다!", + "tooltip.valkyrienskies.mass": "질량", + "command.valkyrienskies.scale.success": "%d척의 선박을 크기를 조절했습니다!", + "itemGroup.valkyrienSkies": "Valkyrien Skies" +} diff --git a/common/src/main/resources/data/valkyrienskies/vs_mass/1_18_blocks.json b/common/src/main/resources/data/valkyrienskies/vs_mass/1_18_blocks.json index 023e8219b..0f5308bb4 100644 --- a/common/src/main/resources/data/valkyrienskies/vs_mass/1_18_blocks.json +++ b/common/src/main/resources/data/valkyrienskies/vs_mass/1_18_blocks.json @@ -5,548 +5,548 @@ }, { "block": "minecraft:rooted_dirt", - "mass": 1100.0, + "mass": 110.0, "friction": 0.7 }, { "block": "minecraft:calcite", - "mass": 2700.0, + "mass": 270.0, "friction": 0.5 }, { "block": "minecraft:dripstone_block", - "mass": 2700.0, + "mass": 270.0, "friction": 0.5 }, { "block": "minecraft:pointed_dripstone", - "mass": 1900.0, + "mass": 190.0, "friction": 0.5 }, { "block": "minecraft:tuff", - "mass": 1800.0, + "mass": 180.0, "friction": 0.7 }, { "block": "minecraft:budding_amethyst", - "mass": 2650.0, + "mass": 265.0, "friction": 1.0 }, { "block": "minecraft:amethyst_block", - "mass": 2650.0, + "mass": 265.0, "friction": 1.0 }, { "block": "minecraft:small_amethyst_bud", - "mass": 100.0, + "mass": 10.0, "friction": 0.7 }, { "block": "minecraft:medium_amethyst_bud", - "mass": 300.0, + "mass": 30.0, "friction": 0.8 }, { "block": "minecraft:large_amethyst_bud", - "mass": 600.0, + "mass": 60.0, "friction": 0.9 }, { "block": "minecraft:azalea", - "mass": 120.0, + "mass": 12.0, "elasticity": 0.1 }, { "block": "minecraft:flowering_azalea", - "mass": 120.0, + "mass": 12.0, "elasticity": 0.1 }, { "block": "minecraft:hanging_roots", - "mass": 4.0 + "mass": 0.40 }, { "block": "minecraft:big_dripleaf", - "mass": 8.0, + "mass": 0.80, "friction": 0.3, "elasticity": 0.3 }, { "block": "minecraft:big_dripleaf_stem", - "mass": 4.0 + "mass": 0.40 }, { "block": "minecraft:small_dripleaf", - "mass": 3.0 + "mass": 0.30 }, { "block": "minecraft:glow_lichen", - "mass": 1.0 + "mass": 0.10 }, { "block": "minecraft:cave_vines", - "mass": 20.0 + "mass": 2.0 }, { "block": "minecraft:cave_vines_plant", - "mass": 20.0 + "mass": 2.0 }, { "block": "minecraft:spore_blossom", - "mass": 12.0 + "mass": 1.20 }, { "block": "minecraft:moss_block", - "mass": 250.0, + "mass": 25.0, "friction": 0.5, "elasticity": 0.05 }, { "block": "minecraft:moss_carpet", - "mass": 15.0, + "mass": 1.5, "friction": 0.5 }, { "block": "minecraft:lightning_rod", - "mass": 1800.0, + "mass": 180.0, "friction": 0.2 }, { "block": "minecraft:copper_block", - "mass": 8960.0, + "mass": 900.0, "friction": 0.2 }, { "block": "minecraft:exposed_copper", - "mass": 8960.0, + "mass": 900.0, "friction": 0.25 }, { "block": "minecraft:weathered_copper", - "mass": 8960.0, + "mass": 900.0, "friction": 0.3 }, { "block": "minecraft:oxidized_copper", - "mass": 8960.0, + "mass": 900.0, "friction": 0.35 }, { "block": "minecraft:waxed_copper_block", - "mass": 8960.0, + "mass": 900.0, "friction": 0.15 }, { "block": "minecraft:waxed_exposed_copper", - "mass": 8960.0, + "mass": 900.0, "friction": 0.2 }, { "block": "minecraft:waxed_weathered_copper", - "mass": 8960.0, + "mass": 900.0, "friction": 0.25 }, { "block": "minecraft:waxed_oxidized_copper", - "mass": 8960.0, + "mass": 900.0, "friction": 0.3 }, { "block": "minecraft:cut_copper", - "mass": 2240.0, + "mass": 225.0, "friction": 0.2 }, { "block": "minecraft:exposed_cut_copper", - "mass": 2240.0, + "mass": 225.0, "friction": 0.25 }, { "block": "minecraft:weathered_cut_copper", - "mass": 2240.0, + "mass": 225.0, "friction": 0.3 }, { "block": "minecraft:oxidized_cut_copper", - "mass": 2240.0, + "mass": 225.0, "friction": 0.35 }, { "block": "minecraft:waxed_cut_copper", - "mass": 2240.0, + "mass": 225.0, "friction": 0.15 }, { "block": "minecraft:waxed_exposed_cut_copper", - "mass": 2240.0, + "mass": 225.0, "friction": 0.2 }, { "block": "minecraft:waxed_weathered_cut_copper", - "mass": 2240.0, + "mass": 225.0, "friction": 0.25 }, { "block": "minecraft:waxed_oxidized_cut_copper", - "mass": 2240.0, + "mass": 225.0, "friction": 0.3 }, { "block": "minecraft:cut_copper_slab", - "mass": 1120.0, + "mass": 112.5, "friction": 0.2 }, { "block": "minecraft:exposed_cut_copper_slab", - "mass": 1120.0, + "mass": 112.5, "friction": 0.25 }, { "block": "minecraft:weathered_cut_copper_slab", - "mass": 1120.0, + "mass": 112.5, "friction": 0.3 }, { "block": "minecraft:oxidized_cut_copper_slab", - "mass": 1120.0, + "mass": 112.5, "friction": 0.35 }, { "block": "minecraft:waxed_cut_copper_slab", - "mass": 1120.0, + "mass": 112.5, "friction": 0.15 }, { "block": "minecraft:waxed_exposed_cut_copper_slab", - "mass": 1120.0, + "mass": 112.5, "friction": 0.2 }, { "block": "minecraft:waxed_weathered_cut_copper_slab", - "mass": 1120.0, + "mass": 112.5, "friction": 0.25 }, { "block": "minecraft:waxed_oxidized_cut_copper_slab", - "mass": 1120.0, + "mass": 112.5, "friction": 0.3 }, { "block": "minecraft:cut_copper_stairs", - "mass": 1680.0, + "mass": 168.75, "friction": 0.2 }, { "block": "minecraft:exposed_cut_copper_stairs", - "mass": 1680.0, + "mass": 168.75, "friction": 0.25 }, { "block": "minecraft:weathered_cut_copper_stairs", - "mass": 1680.0, + "mass": 168.75, "friction": 0.3 }, { "block": "minecraft:oxidized_cut_copper_stairs", - "mass": 1680.0, + "mass": 168.75, "friction": 0.35 }, { "block": "minecraft:waxed_cut_copper_stairs", - "mass": 1680.0, + "mass": 168.75, "friction": 0.15 }, { "block": "minecraft:waxed_exposed_cut_copper_stairs", - "mass": 1680.0, + "mass": 168.75, "friction": 0.2 }, { "block": "minecraft:waxed_weathered_cut_copper_stairs", - "mass": 1680.0, + "mass": 168.75, "friction": 0.25 }, { "block": "minecraft:waxed_oxidized_cut_copper_stairs", - "mass": 1680.0, + "mass": 168.75, "friction": 0.3 }, { "block": "minecraft:raw_copper_block", - "mass": 8960.0, + "mass": 900.0, "friction": 0.8 }, { "block": "minecraft:raw_iron_block", - "mass": 7840.0, + "mass": 785.0, "friction": 0.8 }, { "block": "minecraft:raw_gold_block", - "mass": 19280.0, + "mass": 1930.0, "friction": 0.8 }, { "block": "minecraft:candle", - "mass": 2.0, + "mass": 0.2, "friction": 0.1 }, { "block": "minecraft:white_candle", - "mass": 2.0, + "mass": 0.2, "friction": 0.1 }, { "block": "minecraft:orange_candle", - "mass": 2.0, + "mass": 0.2, "friction": 0.1 }, { "block": "minecraft:magenta_candle", - "mass": 2.0, + "mass": 0.2, "friction": 0.1 }, { "block": "minecraft:light_blue_candle", - "mass": 2.0, + "mass": 0.2, "friction": 0.1 }, { "block": "minecraft:yellow_candle", - "mass": 2.0, + "mass": 0.2, "friction": 0.1 }, { "block": "minecraft:lime_candle", - "mass": 2.0, + "mass": 0.2, "friction": 0.1 }, { "block": "minecraft:pink_candle", - "mass": 2.0, + "mass": 0.2, "friction": 0.1 }, { "block": "minecraft:gray_candle", - "mass": 2.0, + "mass": 0.2, "friction": 0.1 }, { "block": "minecraft:light_gray_candle", - "mass": 2.0, + "mass": 0.2, "friction": 0.1 }, { "block": "minecraft:cyan_candle", - "mass": 2.0, + "mass": 0.2, "friction": 0.1 }, { "block": "minecraft:purple_candle", - "mass": 2.0, + "mass": 0.2, "friction": 0.1 }, { "block": "minecraft:blue_candle", - "mass": 2.0, + "mass": 0.2, "friction": 0.1 }, { "block": "minecraft:brown_candle", - "mass": 2.0, + "mass": 0.2, "friction": 0.1 }, { "block": "minecraft:green_candle", - "mass": 2.0, + "mass": 0.2, "friction": 0.1 }, { "block": "minecraft:red_candle", - "mass": 2.0, + "mass": 0.2, "friction": 0.1 }, { "block": "minecraft:black_candle", - "mass": 2.0, + "mass": 0.2, "friction": 0.1 }, { "block": "minecraft:deepslate", - "mass": 2900.0, + "mass": 290.0, "friction": 0.5 }, { "block": "minecraft:infested_deepslate", - "mass": 2900.0, + "mass": 290.0, "friction": 0.5 }, { "block": "minecraft:cobbled_deepslate", - "mass": 2720.0, + "mass": 275.0, "friction": 0.8 }, { "block": "minecraft:chiseled_deepslate", - "mass": 2720.0, + "mass": 275.0, "friction": 0.6 }, { "block": "minecraft:polished_deepslate", - "mass": 2720.0, + "mass": 275.0, "friction": 0.35 }, { "block": "minecraft:deepslate_bricks", - "mass": 2720.0, + "mass": 275.0, "friction": 0.5 }, { "block": "minecraft:cracked_deepslate_bricks", - "mass": 2720.0, + "mass": 275.0, "friction": 0.6 }, { "block": "minecraft:deepslate_tiles", - "mass": 2720.0, + "mass": 275.0, "friction": 0.6 }, { "block": "minecraft:cracked_deepslate_tiles", - "mass": 2720.0, + "mass": 275.0, "friction": 0.7 }, { "block": "minecraft:cobbled_deepslate_slab", - "mass": 1360.0, + "mass": 137.5, "friction": 0.8 }, { "block": "minecraft:polished_deepslate_slab", - "mass": 1360.0, + "mass": 137.5, "friction": 0.35 }, { "block": "minecraft:deepslate_brick_slab", - "mass": 1360.0, + "mass": 137.5, "friction": 0.5 }, { "block": "minecraft:deepslate_tile_slab", - "mass": 1360.0, + "mass": 137.5, "friction": 0.6 }, { "block": "minecraft:cobbled_deepslate_stairs", - "mass": 2040.0, + "mass": 206.25, "friction": 0.8 }, { "block": "minecraft:polished_deepslate_stairs", - "mass": 2040.0, + "mass": 206.25, "friction": 0.35 }, { "block": "minecraft:deepslate_brick_stairs", - "mass": 2040.0, + "mass": 206.25, "friction": 0.5 }, { "block": "minecraft:deepslate_tile_stairs", - "mass": 2040.0, + "mass": 206.25, "friction": 0.6 }, { "block": "minecraft:cobbled_deepslate_wall", - "mass": 1360.0, + "mass": 135.0, "friction": 0.8 }, { "block": "minecraft:polished_deepslate_wall", - "mass": 1360.0, + "mass": 135.0, "friction": 0.45 }, { "block": "minecraft:deepslate_brick_wall", - "mass": 1360.0, + "mass": 135.0, "friction": 0.5 }, { "block": "minecraft:deepslate_tile_wall", - "mass": 1360.0, + "mass": 135.0, "friction": 0.6 }, { "block": "minecraft:copper_ore", - "mass": 3260.0, + "mass": 325.0, "friction": 0.6 }, { "block": "minecraft:deepslate_copper_ore", - "mass": 3510.0, + "mass": 355.0, "friction": 0.5 }, { "block": "minecraft:deepslate_coal_ore", - "mass": 2715.0, + "mass": 271.5, "friction": 0.5 }, { "block": "minecraft:deepslate_lapis_ore", - "mass": 2950.0, + "mass": 295.0, "friction": 0.5 }, { "block": "minecraft:deepslate_iron_ore", - "mass": 3430.0, + "mass": 345.0, "friction": 0.5 }, { "block": "minecraft:deepslate_gold_ore", - "mass": 4700.0, + "mass": 470.0, "friction": 0.5 }, { "block": "minecraft:deepslate_redstone_ore", - "mass": 2225.0, + "mass": 222.5, "friction": 0.5 }, { "block": "minecraft:deepslate_diamond_ore", - "mass": 2950.0, + "mass": 295.0, "friction": 0.5 }, { "block": "minecraft:deepslate_emerald_ore", - "mass": 2855.0, + "mass": 285.5, "friction": 0.5 }, { "block": "minecraft:powder_snow", - "mass": 120.0, + "mass": 12.0, "friction": 0.3 }, { "block": "minecraft:sculk_sensor", - "mass": 200.0, + "mass": 25.0, "friction": 0.2, "elasticity": 0.3 }, { "block": "minecraft:smooth_basalt", - "mass": 3010.0, + "mass": 300.0, "friction": 0.35 }, { "block": "minecraft:tinted_glass", - "mass": 2200.0, + "mass": 220.0, "friction": 0.2 }, { "tag": "minecraft:candle_cakes", - "mass": 702.0, + "mass": 70.0, "friction": 0.1 } ] diff --git a/common/src/main/resources/data/valkyrienskies/vs_mass/1_19_blocks b/common/src/main/resources/data/valkyrienskies/vs_mass/1_19_blocks index cee29a304..987e68011 100644 --- a/common/src/main/resources/data/valkyrienskies/vs_mass/1_19_blocks +++ b/common/src/main/resources/data/valkyrienskies/vs_mass/1_19_blocks @@ -1,19 +1,19 @@ [ { "block": "minecraft:pearlescent_froglight", - "mass": 3200.0, + "mass": 320.0, "friction": 0.07, "elasticity": 0.8 }, { "block": "minecraft:verdant_froglight", - "mass": 3200.0, + "mass": 320.0, "friction": 0.07, "elasticity": 0.8 }, { "block": "minecraft:ochre_froglight", - "mass": 3200.0, + "mass": 320.0, "friction": 0.07, "elasticity": 0.8 }, @@ -24,37 +24,37 @@ }, { "block": "minecraft:mangrove_log", - "mass": 900.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:stripped_mangrove_log", - "mass": 900.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:mangrove_wood", - "mass": 900.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:stripped_mangrove_wood", - "mass": 900.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:mangrove_planks", - "mass": 600.0, + "mass": 100.0, "friction": 0.5 }, { "block": "minecraft:mangrove_slab", - "mass": 300.0, + "mass": 50.0, "friction": 0.5 }, { "block": "minecraft:mangrove_stairs", - "mass": 450.0, + "mass": 75.0, "friction": 0.5 }, { @@ -68,64 +68,64 @@ }, { "block": "minecraft:muddy_mangrove_roots", - "mass": 1800.0, + "mass": 150.0, "friction": 0.8 }, { "block": "minecraft:mud", - "mass": 1800.0, + "mass": 100.0, "friction": 0.9 }, { "block": "minecraft:packed_mud", - "mass": 1450.0, + "mass": 150.0, "friction": 0.7 }, { "block": "minecraft:mud_bricks", - "mass": 1450.0, + "mass": 150.0, "friction": 0.7 }, { "block": "minecraft:mud_brick_wall", - "mass": 725.0, + "mass": 125.0, "friction": 0.7 }, { "block": "minecraft:mud_brick_slab", - "mass": 725.0, + "mass": 75.0, "friction": 0.7 }, { "block": "minecraft:mud_brick_stairs", - "mass": 1035.0, + "mass": 112.5, "friction": 0.7 }, { "block": "minecraft:reinforced_deepslate", - "mass": 3400.0, + "mass": 400.0, "friction": 0.7 }, { "block": "minecraft:sculk", - "mass": 400.0, + "mass": 25.0, "friction": 0.2, "elasticity": 0.3 }, { "block": "minecraft:sculk_catalyst", - "mass": 600.0, + "mass": 50.0, "friction": 0.2 }, { "block": "minecraft:sculk_shrieker", - "mass": 200.0, + "mass": 50.0, "friction": 0.2, "elasticity": 0.3 }, { "block": "minecraft:sculk_vein", - "mass": 8.0, + "mass": 5.0, "friction": 0.2, "elasticity": 0.03 } diff --git a/common/src/main/resources/data/valkyrienskies/vs_mass/1_20_blocks b/common/src/main/resources/data/valkyrienskies/vs_mass/1_20_blocks index 4a443127c..44b4d056f 100644 --- a/common/src/main/resources/data/valkyrienskies/vs_mass/1_20_blocks +++ b/common/src/main/resources/data/valkyrienskies/vs_mass/1_20_blocks @@ -6,120 +6,120 @@ }, { "block": "minecraft:bamboo_block", - "mass": 150.0, + "mass": 200.0, "friction": 0.6 }, { "block": "minecraft:stripped_bamboo_block", - "mass": 150.0, + "mass": 200.0, "friction": 0.4 }, { "block": "minecraft:bamboo_planks", - "mass": 100.0, + "mass": 50.0, "friction": 0.5 }, { "block": "minecraft:bamboo_mosaic", - "mass": 100.0, + "mass": 50.0, "friction": 0.5 }, { "block": "minecraft:bamboo_mosaic_slab", - "mass": 50.0, + "mass": 25.0, "friction": 0.5 }, { "block": "minecraft:bamboo_slab", - "mass": 50.0, + "mass": 25.0, "friction": 0.5 }, { "block": "minecraft:bamboo_stairs", - "mass": 75.0, + "mass": 37.5, "friction": 0.5 }, { "block": "minecraft:bamboo_mosaic_stairs", - "mass": 75.0, + "mass": 37.5, "friction": 0.5 }, { "block": "minecraft:calibrated_sculk_sensor", - "mass": 230.0, + "mass": 25.0, "friction": 0.9, "elasticity": 0.3 }, { "block": "minecraft:cherry_wood", - "mass": 640.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:cherry_log", - "mass": 640.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:stripped_cherry_wood", - "mass": 640.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:stripped_cherry_log", - "mass": 640.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:cherry_planks", - "mass": 425.0, + "mass": 100.0, "friction": 0.5 }, { "block": "minecraft:cherry_slab", - "mass": 210.0, + "mass": 50.0, "friction": 0.5 }, { "block": "minecraft:cherry_stairs", - "mass": 315.0, + "mass": 75.0, "friction": 0.5 }, { "block": "minecraft:chiseled_bookshelf", - "mass": 650.0, + "mass": 150.0, "friction": 0.5 }, { "block": "minecraft:decorated_pot", - "mass": 250.0, + "mass": 25.0, "friction": 0.35 }, { "block": "minecraft:piglin_head", - "mass": 5.0 + "mass": 0.5 }, { "block": "minecraft:piglin_wall_head", - "mass": 5.0 + "mass": 0.5 }, { "block": "minecraft:pink_petals", - "mass": 1.0 + "mass": 0.1 }, { "block": "minecraft:sniffer_egg", - "mass": 980.0, + "mass": 95.0, "friction": 0.1 }, { "block": "minecraft:suspicious_sand", - "mass": 1565.0, + "mass": 150.0, "friction": 0.4 }, { "block": "minecraft:suspicious_gravel", - "mass": 1685.0, + "mass": 150.0, "friction": 0.7 }, { diff --git a/common/src/main/resources/data/valkyrienskies/vs_mass/computercraft.json b/common/src/main/resources/data/valkyrienskies/vs_mass/computercraft.json index 6a794f7b3..673dc0955 100644 --- a/common/src/main/resources/data/valkyrienskies/vs_mass/computercraft.json +++ b/common/src/main/resources/data/valkyrienskies/vs_mass/computercraft.json @@ -1,50 +1,50 @@ [ { "block": "computercraft:computer_advanced", - "mass": 15395.0 + "mass": 1535.0 }, { "block": "computercraft:turtle_advanced", - "mass": 15795.0 + "mass": 1575.0 }, { "block": "computercraft:monitor_advanced", - "mass": 15245.0 + "mass": 1525.0 }, { "block": "computercraft:wireless_modem_advanced", - "mass": 15250.0 + "mass": 1525.0 }, { "block": "computercraft:computer_normal", - "mass": 3150 + "mass": 315.0 }, { "block": "computercraft:turtle_normal", - "mass": 3600.0 + "mass": 360.0 }, { "block": "computercraft:monitor_normal", - "mass": 3200.0 + "mass": 320.0 }, { "block": "computercraft:wired_modem_full", - "mass": 3300.0 + "mass": 330.0 }, { "block": "computercraft:cable", - "mass": 160.0 + "mass": 15.0 }, { "block": "computercraft:printer", - "mass": 3150.0 + "mass": 315.0 }, { "block": "computercraft:speaker", - "mass": 4350.0 + "mass": 435.0 }, { "block": "computercraft:disk_drive", - "mass": 3300.0 + "mass": 330.0 } ] diff --git a/common/src/main/resources/data/valkyrienskies/vs_mass/crafting_stations.json b/common/src/main/resources/data/valkyrienskies/vs_mass/crafting_stations.json index a3c014bf8..5d17a2f47 100644 --- a/common/src/main/resources/data/valkyrienskies/vs_mass/crafting_stations.json +++ b/common/src/main/resources/data/valkyrienskies/vs_mass/crafting_stations.json @@ -1,83 +1,83 @@ [ { "block": "minecraft:crafting_table", - "mass": 800.0, + "mass": 80.0, "friction": 0.6 }, { "block": "minecraft:furnace", - "mass": 2800.0, + "mass": 280.0, "friction": 0.5 }, { "block": "minecraft:blast_furnace", - "mass": 3000.0, + "mass": 300.0, "friction": 0.5 }, { "block": "minecraft:smoker", - "mass": 2800.0, + "mass": 280.0, "friction": 0.5 }, { "block": "minecraft:stonecutter", - "mass": 2000.0, + "mass": 200.0, "friction": 0.5 }, { "tag": "minecraft:campfires", - "mass": 600.0 + "mass": 60.0 }, { "block": "minecraft:enchanting_table", - "mass": 1600.0 + "mass": 160.0 }, { "tag": "minecraft:anvil", - "mass": 7000.0, + "mass": 700.0, "friction": 0.2 }, { "block": "minecraft:cauldron", - "mass": 5400.0, + "mass": 540.0, "friction": 0.2 }, { "block": "minecraft:water_cauldron", - "mass": 5900.0, + "mass": 590.0, "friction": 0.2 }, { "block": "minecraft:brewing_stand", - "mass": 800.0 + "mass": 80.0 }, { "block": "minecraft:grindstone", - "mass": 1500.0, + "mass": 150.0, "friction": 0.2 }, { "block": "minecraft:fletching_table", - "mass": 900.0, + "mass": 90.0, "friction": 0.6 }, { "block": "minecraft:smithing_table", - "mass": 1800.0, + "mass": 180.0, "friction": 0.6 }, { "block": "minecraft:loom", - "mass": 400.0 + "mass": 40.0 }, { "block": "minecraft:cartography_table", - "mass": 800.0, + "mass": 80.0, "friction": 0.5 }, { "block": "minecraft:composter", - "mass": 700.0, + "mass": 70.0, "friction": 0.5 } ] diff --git a/common/src/main/resources/data/valkyrienskies/vs_mass/ground.json b/common/src/main/resources/data/valkyrienskies/vs_mass/ground.json index 139a148a2..5212bc2f1 100644 --- a/common/src/main/resources/data/valkyrienskies/vs_mass/ground.json +++ b/common/src/main/resources/data/valkyrienskies/vs_mass/ground.json @@ -1,237 +1,237 @@ [ { "block": "minecraft:dirt", - "mass": 1220.0, + "mass": 125.0, "friction": 0.6 }, { "block": "minecraft:coarse_dirt", - "mass": 1500.0, + "mass": 150.0, "friction": 0.7 }, { "block": "minecraft:dirt_path", - "mass": 1200.0, + "mass": 100.0, "friction": 0.5 }, { "block": "minecraft:farmland", - "mass": 1220.0, + "mass": 125.0, "friction": 0.6 }, { "block": "minecraft:grass", - "mass": 1300.0, + "mass": 125.0, "friction": 0.5 }, { "block": "minecraft:clay", - "mass": 1700.0, + "mass": 150.0, "friction": 0.4 }, { "block": "minecraft:gravel", - "mass": 1680.0, + "mass": 150.0, "friction": 0.7 }, { "block": "minecraft:mycelium", - "mass": 1300.0, + "mass": 125.0, "friction": 0.5 }, { "tag": "minecraft:nylium", - "mass": 1180.0, + "mass": 125.0, "friction": 0.5 }, { "block": "minecraft:podzol", - "mass": 1300.0, + "mass": 125.0, "friction": 0.6 }, { "tag": "minecraft:sand", - "mass": 1560.0, + "mass": 150.0, "friction": 0.4 }, { "block": "minecraft:soul_sand", - "mass": 1000.0, + "mass": 100.0, "friction": 0.9 }, { "block": "minecraft:soul_soil", - "mass": 900.0, + "mass": 100.0, "friction": 0.8 }, { "block": "minecraft:andesite", - "mass": 2770.0, + "mass": 275.0, "friction": 0.6 }, { "block": "minecraft:basalt", - "mass": 3010.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:smooth_basalt", - "mass": 3010.0, + "mass": 300.0, "friction": 0.5 }, { "block": "minecraft:blackstone", - "mass": 3400.0, + "mass": 350.0, "friction": 0.7 }, { "block": "minecraft:cobblestone", - "mass": 2480.0, + "mass": 250.0, "friction": 0.8 }, { "block": "minecraft:mossy_cobblestone", - "mass": 2600.0, + "mass": 250.0, "friction": 0.8 }, { "block": "minecraft:diorite", - "mass": 2900.0, + "mass": 250.0, "friction": 0.6 }, { "block": "minecraft:end_stone", - "mass": 2800.0, + "mass": 100.0, "friction": 0.6 }, { "block": "minecraft:glowstone", - "mass": 1000.0, + "mass": 100.0, "friction": 0.7 }, { "block": "minecraft:granite", - "mass": 2700.0, + "mass": 250.0, "friction": 0.6 }, { "block": "minecraft:magma_block", - "mass": 3200.0, + "mass": 300.0, "friction": 0.4 }, { "block": "minecraft:netherrack", - "mass": 1100.0, + "mass": 100.0, "friction": 0.4 }, { "block": "minecraft:obsidian", - "mass": 2350.0, + "mass": 500.0, "friction": 0.8 }, { "block": "minecraft:crying_obsidian", - "mass": 2350.0, + "mass": 500.0, "friction": 0.8 }, { "block": "minecraft:sandstone", - "mass": 2300.0, + "mass": 250.0, "friction": 0.6 }, { "block": "minecraft:red_sandstone", - "mass": 2300.0, + "mass": 250.0, "friction": 0.6 }, { "block": "minecraft:stone", - "mass": 2600.0, + "mass": 250.0, "friction": 0.6 }, { "block": "minecraft:terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.6 }, { "block": "minecraft:white_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.6 }, { "block": "minecraft:orange_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.6 }, { "block": "minecraft:magenta_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.6 }, { "block": "minecraft:light_blue_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.6 }, { "block": "minecraft:yellow_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.6 }, { "block": "minecraft:lime_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.6 }, { "block": "minecraft:pink_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.6 }, { "block": "minecraft:gray_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.6 }, { "block": "minecraft:light_gray_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.6 }, { "block": "minecraft:cyan_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.6 }, { "block": "minecraft:purple_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.6 }, { "block": "minecraft:blue_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.6 }, { "block": "minecraft:brown_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.6 }, { "block": "minecraft:green_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.6 }, { "block": "minecraft:red_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.6 }, { "block": "minecraft:black_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.6 } ] diff --git a/common/src/main/resources/data/valkyrienskies/vs_mass/masonry.json b/common/src/main/resources/data/valkyrienskies/vs_mass/masonry.json index a2a151ed6..5ed1d1585 100644 --- a/common/src/main/resources/data/valkyrienskies/vs_mass/masonry.json +++ b/common/src/main/resources/data/valkyrienskies/vs_mass/masonry.json @@ -1,837 +1,837 @@ [ { "block": "minecraft:stone_slab", - "mass": 1300.0, + "mass": 125.0, "friction": 0.6 }, { "block": "minecraft:cut_red_sandstone", - "mass": 2300.0, + "mass": 250.0, "friction": 0.6 }, { "block": "minecraft:cut_sandstone", - "mass": 2300.0, + "mass": 250.0, "friction": 0.6 }, { "block": "minecraft:smooth_stone_slab", - "mass": 1300.0, + "mass": 125.0, "friction": 0.4 }, { "block": "minecraft:granite_slab", - "mass": 1350.0, + "mass": 125.0, "friction": 0.6 }, { "block": "minecraft:polished_granite_slab", - "mass": 1350.0, + "mass": 125.0, "friction": 0.4 }, { "block": "minecraft:diorite_slab", - "mass": 1450.0, + "mass": 125.0, "friction": 0.6 }, { "block": "minecraft:polished_diorite_slab", - "mass": 1450.0, + "mass": 125.0, "friction": 0.4 }, { "block": "minecraft:andesite_slab", - "mass": 1385.0, + "mass": 125.0, "friction": 0.6 }, { "block": "minecraft:polished_andesite_slab", - "mass": 1385.0, + "mass": 125.0, "friction": 0.4 }, { "block": "minecraft:cobblestone_slab", - "mass": 1240.0, + "mass": 125.0, "friction": 0.8 }, { "block": "minecraft:mossy_cobblestone_slab", - "mass": 1300.0, + "mass": 125.0, "friction": 0.8 }, { "block": "minecraft:stone_brick_slab", - "mass": 1300.0, + "mass": 125.0, "friction": 0.5 }, { "block": "minecraft:mossy_stone_brick_slab", - "mass": 1300.0, + "mass": 125.0, "friction": 0.3 }, { "block": "minecraft:brick_slab", - "mass": 950.0, + "mass": 125.0, "friction": 0.6 }, { "block": "minecraft:end_stone_brick_slab", - "mass": 1400.0, + "mass": 50.0, "friction": 0.5 }, { "block": "minecraft:nether_brick_slab", - "mass": 950.0, + "mass": 50.0, "friction": 0.6 }, { "block": "minecraft:red_nether_brick_slab", - "mass": 950.0, + "mass": 50.0, "friction": 0.6 }, { "block": "minecraft:sandstone_slab", - "mass": 1150.0, + "mass": 125.0, "friction": 0.6 }, { "block": "minecraft:cut_sandstone_slab", - "mass": 1150.0, + "mass": 125.0, "friction": 0.6 }, { "block": "minecraft:smooth_sandstone_slab", - "mass": 1150.0, + "mass": 125.0, "friction": 0.5 }, { "block": "minecraft:red_sandstone_slab", - "mass": 1150.0, + "mass": 125.0, "friction": 0.6 }, { "block": "minecraft:cut_red_sandstone_slab", - "mass": 1150.0, + "mass": 125.0, "friction": 0.6 }, { "block": "minecraft:smooth_red_sandstone_slab", - "mass": 1150.0, + "mass": 125.0, "friction": 0.5 }, { "block": "minecraft:quartz_slab", - "mass": 1160.0, + "mass": 150.0, "friction": 0.5 }, { "block": "minecraft:smooth_quartz_slab", - "mass": 1160.0, + "mass": 150.0, "friction": 0.3 }, { "block": "minecraft:purpur_slab", - "mass": 60.0, + "mass": 50.0, "friction": 0.6 }, { "block": "minecraft:prismarine_slab", - "mass": 1000.0, + "mass": 150.0, "friction": 0.8 }, { "block": "minecraft:prismarine_brick_slab", - "mass": 1600.0, + "mass": 150.0, "friction": 0.5 }, { "block": "minecraft:dark_prismarine_slab", - "mass": 1600.0, + "mass": 150.0, "friction": 0.6 }, { "block": "minecraft:blackstone_slab", - "mass": 1700.0, + "mass": 175.0, "friction": 0.7 }, { "block": "minecraft:polished_blackstone_slab", - "mass": 1700.0, + "mass": 175.0, "friction": 0.5 }, { "block": "minecraft:polished_blackstone_brick_slab", - "mass": 1700.0, + "mass": 175.0, "friction": 0.5 }, { "block": "minecraft:stone_stairs", - "mass": 1950.0, + "mass": 187.5, "friction": 0.6 }, { "block": "minecraft:granite_stairs", - "mass": 2025.0, + "mass": 187.5, "friction": 0.6 }, { "block": "minecraft:polished_granite_stairs", - "mass": 2025.0, + "mass": 187.5, "friction": 0.5 }, { "block": "minecraft:diorite_stairs", - "mass": 2175.0, + "mass": 187.5, "friction": 0.6 }, { "block": "minecraft:polished_diorite_stairs", - "mass": 2175.0, + "mass": 187.5, "friction": 0.5 }, { "block": "minecraft:andesite_stairs", - "mass": 2080.0, + "mass": 187.5, "friction": 0.6 }, { "block": "minecraft:polished_andesite_stairs", - "mass": 2080.0, + "mass": 187.5, "friction": 0.5 }, { "block": "minecraft:cobblestone_stairs", - "mass": 1860.0, + "mass": 187.5, "friction": 0.8 }, { "block": "minecraft:mossy_cobblestone_stairs", - "mass": 1950.0, + "mass": 187.5, "friction": 0.8 }, { "block": "minecraft:stone_brick_stairs", - "mass": 1950.0, + "mass": 187.5, "friction": 0.5 }, { "block": "minecraft:mossy_stone_brick_stairs", - "mass": 1950.0, + "mass": 187.5, "friction": 0.3 }, { "block": "minecraft:brick_stairs", - "mass": 1425.0, + "mass": 187.5, "friction": 0.6 }, { "block": "minecraft:end_stone_brick_stairs", - "mass": 2100.0, + "mass": 75.0, "friction": 0.5 }, { "block": "minecraft:nether_brick_stairs", - "mass": 1425.0, + "mass": 75.0, "friction": 0.6 }, { "block": "minecraft:red_nether_brick_stairs", - "mass": 1425.0, + "mass": 75.0, "friction": 0.6 }, { "block": "minecraft:sandstone_stairs", - "mass": 1725.0, + "mass": 187.5, "friction": 0.6 }, { "block": "minecraft:smooth_sandstone_stairs", - "mass": 1725.0, + "mass": 187.5, "friction": 0.5 }, { "block": "minecraft:red_sandstone_stairs", - "mass": 1725.0, + "mass": 187.5, "friction": 0.6 }, { "block": "minecraft:smooth_red_sandstone_stairs", - "mass": 1725.0, + "mass": 187.5, "friction": 0.5 }, { "block": "minecraft:quartz_stairs", - "mass": 1740.0, + "mass": 225.0, "friction": 0.5 }, { "block": "minecraft:smooth_quartz_stairs", - "mass": 1740.0, + "mass": 225.0, "friction": 0.3 }, { "block": "minecraft:purpur_stairs", - "mass": 90.0, + "mass": 75.0, "friction": 0.6 }, { "block": "minecraft:prismarine_stairs", - "mass": 1500.0, + "mass": 225.0, "friction": 0.8 }, { "block": "minecraft:prismarine_brick_stairs", - "mass": 2400.0, + "mass": 225.0, "friction": 0.5 }, { "block": "minecraft:dark_prismarine_stairs", - "mass": 2400.0, + "mass": 225.0, "friction": 0.6 }, { "block": "minecraft:blackstone_stairs", - "mass": 2550.0, + "mass": 262.5, "friction": 0.7 }, { "block": "minecraft:polished_blackstone_stairs", - "mass": 2550.0, + "mass": 262.5, "friction": 0.5 }, { "block": "minecraft:polished_blackstone_brick_stairs", - "mass": 2550.0, + "mass": 262.5, "friction": 0.4 }, { "block": "minecraft:granite_wall", - "mass": 1350.0, + "mass": 125.0, "friction": 0.6 }, { "block": "minecraft:diorite_wall", - "mass": 1450.0, + "mass": 125.0, "friction": 0.6 }, { "block": "minecraft:andesite_wall", - "mass": 1385.0, + "mass": 125.0, "friction": 0.6 }, { "block": "minecraft:cobblestone_wall", - "mass": 1240.0, + "mass": 125.0, "friction": 0.8 }, { "block": "minecraft:mossy_cobblestone_wall", - "mass": 1300.0, + "mass": 125.0, "friction": 0.8 }, { "block": "minecraft:stone_brick_wall", - "mass": 1300.0, + "mass": 125.0, "friction": 0.5 }, { "block": "minecraft:mossy_stone_brick_wall", - "mass": 1300.0, + "mass": 125.0, "friction": 0.3 }, { "block": "minecraft:brick_wall", - "mass": 950.0, + "mass": 125.0, "friction": 0.6 }, { "block": "minecraft:end_stone_brick_wall", - "mass": 1400.0, + "mass": 75.0, "friction": 0.5 }, { "block": "minecraft:nether_brick_wall", - "mass": 950.0, + "mass": 75.0, "friction": 0.6 }, { "block": "minecraft:red_nether_brick_wall", - "mass": 950.0, + "mass": 75.0, "friction": 0.6 }, { "block": "minecraft:sandstone_wall", - "mass": 1150.0, + "mass": 125.0, "friction": 0.6 }, { "block": "minecraft:red_sandstone_wall", - "mass": 1150.0, + "mass": 125.0, "friction": 0.6 }, { "block": "minecraft:prismarine_wall", - "mass": 1000.0, + "mass": 100.0, "friction": 0.8 }, { "block": "minecraft:blackstone_wall", - "mass": 1700.0, + "mass": 125.0, "friction": 0.7 }, { "block": "minecraft:polished_blackstone_wall", - "mass": 1700.0, + "mass": 125.0, "friction": 0.5 }, { "block": "minecraft:polished_blackstone_brick_wall", - "mass": 1700.0, + "mass": 125.0, "friction": 0.4 }, { "block": "minecraft:polished_granite", - "mass": 2700.0, + "mass": 250.0, "friction": 0.4 }, { "block": "minecraft:polished_diorite", - "mass": 2900.0, + "mass": 250.0, "friction": 0.4 }, { "block": "minecraft:polished_andesite", - "mass": 2770.0, + "mass": 250.0, "friction": 0.4 }, { "block": "minecraft:polished_basalt", - "mass": 3010.0, + "mass": 250.0, "friction": 0.4 }, { "block": "minecraft:polished_blackstone", - "mass": 3400.0, + "mass": 250.0, "friction": 0.5 }, { "block": "minecraft:polished_blackstone_bricks", - "mass": 3400.0, + "mass": 250.0, "friction": 0.4 }, { "block": "minecraft:smooth_quartz", - "mass": 2320.0, + "mass": 300.0, "friction": 0.3 }, { "block": "minecraft:smooth_sandstone", - "mass": 2300.0, + "mass": 250.0, "friction": 0.5 }, { "block": "minecraft:smooth_red_sandstone", - "mass": 2300.0, + "mass": 250.0, "friction": 0.4 }, { "block": "minecraft:smooth_stone", - "mass": 2600.0, + "mass": 250.0, "friction": 0.4 }, { "block": "minecraft:cracked_stone_bricks", - "mass": 2600.0, + "mass": 250.0, "friction": 0.7 }, { "block": "minecraft:cracked_nether_bricks", - "mass": 1900.0, + "mass": 100.0, "friction": 0.7 }, { "block": "minecraft:cracked_polished_blackstone_bricks", - "mass": 3400.0, + "mass": 250.0, "friction": 0.6 }, { "block": "minecraft:chiseled_sandstone", - "mass": 2300.0, + "mass": 250.0, "friction": 0.6 }, { "block": "minecraft:chiseled_stone_bricks", - "mass": 2600.0, + "mass": 250.0, "friction": 0.6 }, { "block": "minecraft:chiseled_nether_bricks", - "mass": 1900.0, + "mass": 100.0, "friction": 0.6 }, { "block": "minecraft:chiseled_quartz_block", - "mass": 2320.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:chiseled_red_sandstone", - "mass": 2300.0, + "mass": 250.0, "friction": 0.6 }, { "block": "minecraft:chiseled_polished_blackstone", - "mass": 3400.0, + "mass": 250.0, "friction": 0.6 }, { "block": "minecraft:quartz_pillar", - "mass": 2320.0, + "mass": 300.0, "friction": 0.5 }, { "block": "minecraft:purpur_pillar", - "mass": 120.0, + "mass": 100.0, "friction": 0.6 }, { "block": "minecraft:purpur_block", - "mass": 120.0, + "mass": 100.0, "friction": 0.6 }, { "block": "minecraft:quartz_block", - "mass": 2320.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:mossy_stone_bricks", - "mass": 2600.0, + "mass": 250.0, "friction": 0.3 }, { "block": "minecraft:gilded_blackstone", - "mass": 3800.0, + "mass": 300.0, "friction": 0.7 }, { "block": "minecraft:nether_brick_fence", - "mass": 380.0, + "mass": 50.0, "friction": 0.6 }, { "block": "minecraft:bricks", - "mass": 1900.0, + "mass": 250.0, "friction": 0.6 }, { "block": "minecraft:stone_bricks", - "mass": 2600.0, + "mass": 250.0, "friction": 0.5 }, { "block": "minecraft:nether_bricks", - "mass": 1900.0, + "mass": 100.0, "friction": 0.5 }, { "block": "minecraft:red_nether_bricks", - "mass": 1900.0, + "mass": 100.0, "friction": 0.5 }, { "block": "minecraft:end_stone_bricks", - "mass": 2800.0, + "mass": 100.0, "friction": 0.5 }, { "block": "minecraft:quartz_bricks", - "mass": 2320.0, + "mass": 300.0, "friction": 0.5 }, { "block": "minecraft:prismarine", - "mass": 2000.0, + "mass": 300.0, "friction": 0.8 }, { "block": "minecraft:prismarine_bricks", - "mass": 3200.0, + "mass": 300.0, "friction": 0.5 }, { "block": "minecraft:dark_prismarine", - "mass": 3200.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:white_glazed_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:orange_glazed_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:magenta_glazed_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:light_blue_glazed_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:yellow_glazed_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:lime_glazed_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:pink_glazed_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:gray_glazed_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:light_gray_glazed_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:cyan_glazed_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:purple_glazed_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:blue_glazed_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:brown_glazed_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:green_glazed_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:red_glazed_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:black_glazed_terracotta", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:white_concrete_powder", - "mass": 2360.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:orange_concrete_powder", - "mass": 2360.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:magenta_concrete_powder", - "mass": 2360.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:light_blue_concrete_powder", - "mass": 2360.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:yellow_concrete_powder", - "mass": 2360.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:lime_concrete_powder", - "mass": 2360.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:pink_concrete_powder", - "mass": 2360.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:gray_concrete_powder", - "mass": 2360.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:light_gray_concrete_powder", - "mass": 2360.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:cyan_concrete_powder", - "mass": 2360.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:purple_concrete_powder", - "mass": 2360.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:blue_concrete_powder", - "mass": 2360.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:brown_concrete_powder", - "mass": 2360.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:green_concrete_powder", - "mass": 2360.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:red_concrete_powder", - "mass": 2360.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:black_concrete_powder", - "mass": 2360.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:white_concrete", - "mass": 2360.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:orange_concrete", - "mass": 2360.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:magenta_concrete", - "mass": 2360.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:light_blue_concrete", - "mass": 2360.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:yellow_concrete", - "mass": 2360.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:lime_concrete", - "mass": 2360.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:pink_concrete", - "mass": 2360.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:gray_concrete", - "mass": 2360.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:light_gray_concrete", - "mass": 2360.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:cyan_concrete", - "mass": 2360.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:purple_concrete", - "mass": 2360.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:blue_concrete", - "mass": 2360.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:brown_concrete", - "mass": 2360.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:green_concrete", - "mass": 2360.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:red_concrete", - "mass": 2360.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:black_concrete", - "mass": 2360.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:infested_stone", - "mass": 2600.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:infested_cobblestone", - "mass": 2600.0, + "mass": 300.0, "friction": 0.8 }, { "block": "minecraft:infested_stone_bricks", - "mass": 2600.0, + "mass": 300.0, "friction": 0.5 }, { "block": "minecraft:infested_cracked_stone_bricks", - "mass": 2600.0, + "mass": 300.0, "friction": 0.6 }, { "block": "minecraft:infested_mossy_stone_bricks", - "mass": 2600.0, + "mass": 300.0, "friction": 0.3 }, { "block": "minecraft:infested_chiseled_stone_bricks", - "mass": 2600.0, + "mass": 300.0, "friction": 0.6 } ] diff --git a/common/src/main/resources/data/valkyrienskies/vs_mass/misc.json b/common/src/main/resources/data/valkyrienskies/vs_mass/misc.json index c964b8257..7c91c380f 100644 --- a/common/src/main/resources/data/valkyrienskies/vs_mass/misc.json +++ b/common/src/main/resources/data/valkyrienskies/vs_mass/misc.json @@ -34,92 +34,92 @@ }, { "block": "minecraft:gold_block", - "mass": 19280.0, + "mass": 1930.0, "friction": 0.2 }, { "block": "minecraft:iron_block", - "mass": 7840.0, + "mass": 785.0, "friction": 0.2 }, { "block": "minecraft:diamond_block", - "mass": 3520.0, + "mass": 300.0, "friction": 0.1 }, { "block": "minecraft:emerald_block", - "mass": 2670.0, + "mass": 250.0, "friction": 0.1 }, { "block": "minecraft:coal_block", - "mass": 1400.0, + "mass": 150.0, "friction": 0.7 }, { "block": "minecraft:netherite_block", - "mass": 89680.0, + "mass": 8968.0, "friction": 0.2 }, { "block": "minecraft:lapis_block", - "mass": 2750.0, + "mass": 275.0, "friction": 0.5 }, { "block": "minecraft:coal_ore", - "mass": 2465.0, + "mass": 245.0, "friction": 0.6 }, { "block": "minecraft:diamond_ore", - "mass": 2700.0, + "mass": 270.0, "friction": 0.6 }, { "block": "minecraft:emerald_ore", - "mass": 2605.0, + "mass": 260.0, "friction": 0.6 }, { "block": "minecraft:ancient_debris", - "mass": 3140.0, + "mass": 315.0, "friction": 0.8 }, { "block": "minecraft:iron_ore", - "mass": 3180.0, + "mass": 315.0, "friction": 0.6 }, { "block": "minecraft:gold_ore", - "mass": 4450.0, + "mass": 445.0, "friction": 0.6 }, { "block": "minecraft:lapis_ore", - "mass": 2700.0, + "mass": 270.0, "friction": 0.6 }, { "block": "minecraft:redstone_ore", - "mass": 1975.0, + "mass": 195.0, "friction": 0.6 }, { "block": "minecraft:nether_quartz_ore", - "mass": 1405.0, + "mass": 150.0, "friction": 0.4 }, { "block": "minecraft:nether_gold_ore", - "mass": 2210.0, + "mass": 225.0, "friction": 0.4 }, { "block": "minecraft:bone_block", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { @@ -129,23 +129,23 @@ }, { "block": "minecraft:hay_block", - "mass": 200.0, + "mass": 20.0, "friction": 0.6, "elasticity": 0.3 }, { "block": "minecraft:carved_pumpkin", - "mass": 100.0, + "mass": 10.0, "friction": 0.3 }, { "block": "minecraft:jack_o_lantern", - "mass": 105.0, + "mass": 10.0, "friction": 0.3 }, { "block": "minecraft:beacon", - "mass": 930.0, + "mass": 400.0, "friction": 0.2 }, { @@ -154,39 +154,39 @@ }, { "block": "minecraft:sponge", - "mass": 170.0, + "mass": 175.0, "friction": 0.6, "elasticity": 0.2 }, { "block": "minecraft:wet_sponge", - "mass": 1050.0, + "mass": 200.0, "friction": 0.3, "elasticity": 0.6 }, { "block": "minecraft:torch", - "mass": 5.0 + "mass": 0.5 }, { "block": "minecraft:wall_torch", - "mass": 5.0 + "mass": 0.5 }, { "block": "minecraft:soul_torch", - "mass": 5.0 + "mass": 0.5 }, { "block": "minecraft:soul_wall_torch", - "mass": 5.0 + "mass": 0.5 }, { "block": "minecraft:lantern", - "mass": 25.0 + "mass": 2.5 }, { "block": "minecraft:soul_lantern", - "mass": 25.0 + "mass": 2.5 }, { "block": "minecraft:end_rod", @@ -195,210 +195,210 @@ }, { "block": "minecraft:sea_lantern", - "mass": 2500.0, + "mass": 250.0, "friction": 0.2 }, { "block": "minecraft:glass", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:white_stained_glass", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:orange_stained_glass", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:magenta_stained_glass", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:light_blue_stained_glass", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:yellow_stained_glass", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:lime_stained_glass", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:pink_stained_glass", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:gray_stained_glass", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:light_gray_stained_glass", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:cyan_stained_glass", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:purple_stained_glass", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:blue_stained_glass", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:brown_stained_glass", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:green_stained_glass", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:red_stained_glass", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:black_stained_glass", - "mass": 2000.0, + "mass": 200.0, "friction": 0.2 }, { "block": "minecraft:glass_pane", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:white_stained_glass_pane", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:orange_stained_glass_pane", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:magenta_stained_glass_pane", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:light_blue_stained_glass_pane", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:yellow_stained_glass_pane", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:lime_stained_glass_pane", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:pink_stained_glass_pane", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:gray_stained_glass_pane", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:light_gray_stained_glass_pane", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:cyan_stained_glass_pane", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:purple_stained_glass_pane", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:blue_stained_glass_pane", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:brown_stained_glass_pane", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:green_stained_glass_pane", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:red_stained_glass_pane", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:black_stained_glass_pane", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "tag": "minecraft:beds", - "mass": 125.0, + "mass": 25.0, "friction": 0.6, "elasticity": 0.5 }, { "tag": "minecraft:carpets", - "mass": 20.0, + "mass": 2.0, "friction": 0.6, "elasticity": 0.05 }, { "tag": "minecraft:wool", - "mass": 450.0, + "mass": 50.0, "friction": 0.6, "elasticity": 0.5 }, { "block": "minecraft:bookshelf", - "mass": 650.0, + "mass": 150.0, "friction": 0.5 }, { "block": "minecraft:chest", - "mass": 400.0, + "mass": 100.0, "friction": 0.4 }, { "block": "minecraft:barrel", - "mass": 375.0, + "mass": 125.0, "friction": 0.4 }, { @@ -407,87 +407,87 @@ }, { "tag": "minecraft:fences", - "mass": 40.0 + "mass": 50.0 }, { "block": "minecraft:snow", - "mass": 25.0, + "mass": 2.5, "friction": 0.2 }, { "block": "minecraft:snow_block", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:ice", - "mass": 830.0, + "mass": 125.0, "friction": 0.05 }, { "block": "minecraft:packed_ice", - "mass": 875.0, + "mass": 250.0, "friction": 0.02 }, { "block": "minecraft:blue_ice", - "mass": 920.0, + "mass": 400.0, "friction": 0.0 }, { "block": "minecraft:jukebox", - "mass": 800.0, + "mass": 80.0, "friction": 0.6 }, { "block": "minecraft:iron_bars", - "mass": 250.0, + "mass": 25.0, "friction": 0.2 }, { "block": "minecraft:chain", - "mass": 50.0, + "mass": 5.0, "friction": 0.7 }, { "block": "minecraft:dragon_egg", - "mass": 1400.0, + "mass": 500.0, "friction": 0.8 }, { "block": "minecraft:end_portal_frame", - "mass": 3000.0, + "mass": 300.0, "friction": 0.4 }, { "block": "minecraft:ender_chest", - "mass": 800.0, + "mass": 100.0, "friction": 0.4 }, { "block": "minecraft:slime_block", - "mass": 1100.0, + "mass": 200.0, "friction": 1.0, "elasticity": 1.0 }, { "block": "minecraft:honey_block", - "mass": 1400.0, + "mass": 200.0, "friction": 1.0 }, { "block": "minecraft:honeycomb_block", - "mass": 900.0, + "mass": 150.0, "friction": 0.8 }, { "block": "minecraft:bee_nest", - "mass": 400.0, + "mass": 150.0, "friction": 0.5 }, { "block": "minecraft:beehive", - "mass": 450.0, + "mass": 150.0, "friction": 0.4 }, { @@ -500,31 +500,31 @@ }, { "block": "minecraft:dried_kelp_block", - "mass": 1000.0, + "mass": 100.0, "friction": 0.6, "elasticity": 0.3 }, { "tag": "minecraft:signs", - "mass": 10.0 + "mass": 5.0 }, { "tag": "minecraft:flower_pots", - "mass": 30.0 + "mass": 5.0 }, { "block": "minecraft:cake", - "mass": 700.0, + "mass": 5.0, "friction": 0.1 }, { "block": "minecraft:skeleton_skull", - "mass": 2.0, + "mass": 2.5, "friction": 0.2 }, { "block": "minecraft:wither_skeleton_skull", - "mass": 2.0, + "mass": 2.5, "friction": 0.2 }, { @@ -541,16 +541,16 @@ }, { "block": "minecraft:dragon_head", - "mass": 40.0 + "mass": 7.5 }, { "block": "minecraft:skeleton_wall_skull", - "mass": 2.0, + "mass": 2.5, "friction": 0.2 }, { "block": "minecraft:wither_skeleton_wall_skull", - "mass": 2.0, + "mass": 2.5, "friction": 0.2 }, { @@ -567,25 +567,25 @@ }, { "block": "minecraft:dragon_wall_head", - "mass": 40.0 + "mass": 7.5 }, { "block": "minecraft:lodestone", - "mass": 4450.0, + "mass": 445.0, "friction": 0.5 }, { "block": "minecraft:bell", - "mass": 1000.0, + "mass": 100.0, "friction": 0.2 }, { "block": "minecraft:respawn_anchor", - "mass": 2000.0, + "mass": 200.0, "friction": 0.7 }, { "tag": "minecraft:banners", - "mass": 30.0 + "mass": 3.0 } ] diff --git a/common/src/main/resources/data/valkyrienskies/vs_mass/plants.json b/common/src/main/resources/data/valkyrienskies/vs_mass/plants.json index 9ae1a5cf2..820e6a091 100644 --- a/common/src/main/resources/data/valkyrienskies/vs_mass/plants.json +++ b/common/src/main/resources/data/valkyrienskies/vs_mass/plants.json @@ -5,7 +5,7 @@ }, { "tag": "minecraft:leaves", - "mass": 200.0, + "mass": 20.0, "elasticity": 0.15 }, { @@ -95,32 +95,32 @@ }, { "tag": "minecraft:coral_blocks", - "mass": 1500.0, + "mass": 15.0, "friction": 0.7 }, { "block": "minecraft:dead_tube_coral_block", - "mass": 1500.0, + "mass": 15.0, "friction": 0.7 }, { "block": "minecraft:dead_brain_coral_block", - "mass": 1500.0, + "mass": 15.0, "friction": 0.7 }, { "block": "minecraft:dead_bubble_coral_block", - "mass": 1500.0, + "mass": 15.0, "friction": 0.7 }, { "block": "minecraft:dead_fire_coral_block", - "mass": 1500.0, + "mass": 15.0, "friction": 0.7 }, { "block": "minecraft:dead_horn_coral_block", - "mass": 1500.0, + "mass": 15.0, "friction": 0.7 }, { @@ -209,7 +209,7 @@ }, { "block": "minecraft:cactus", - "mass": 600.0 + "mass": 60.0 }, { "block": "minecraft:melon_stem", @@ -221,7 +221,7 @@ }, { "block": "minecraft:melon", - "mass": 600.0, + "mass": 100.0, "friction": 0.2 }, { @@ -234,7 +234,7 @@ }, { "block": "minecraft:pumpkin", - "mass": 600.0, + "mass": 100.0, "friction": 0.3 }, { @@ -279,12 +279,12 @@ }, { "tag": "minecraft:wart_blocks", - "mass": 600.0, + "mass": 60.0, "elasticity": 0.1 }, { "block": "minecraft:shroomlight", - "mass": 800.0 + "mass": 80.0 }, { "block": "minecraft:chorus_plant", @@ -298,19 +298,19 @@ }, { "block": "minecraft:brown_mushroom_block", - "mass": 400.0, + "mass": 40.0, "friction": 0.2, "elasticity": 0.1 }, { "block": "minecraft:red_mushroom_block", - "mass": 400.0, + "mass": 40.0, "friction": 0.2, "elasticity": 0.1 }, { "block": "minecraft:mushroom_stem", - "mass": 600.0, + "mass": 60.0, "friction": 0.2, "elasticity": 0.1 }, diff --git a/common/src/main/resources/data/valkyrienskies/vs_mass/redstone_components.json b/common/src/main/resources/data/valkyrienskies/vs_mass/redstone_components.json index 65540b04b..e44ff1b7a 100644 --- a/common/src/main/resources/data/valkyrienskies/vs_mass/redstone_components.json +++ b/common/src/main/resources/data/valkyrienskies/vs_mass/redstone_components.json @@ -1,51 +1,51 @@ [ { "block": "minecraft:redstone_wire", - "mass": 5.0 + "mass": 0.5 }, { "block": "minecraft:dispenser", - "mass": 2800.0, + "mass": 250.0, "friction": 0.5 }, { "block": "minecraft:dropper", - "mass": 2800.0, + "mass": 250.0, "friction": 0.5 }, { "block": "minecraft:note_block", - "mass": 1200.0, + "mass": 100.0, "friction": 0.6 }, { "block": "minecraft:detector_rail", - "mass": 380.0, + "mass": 100.0, "friction": 0.7 }, { "block": "minecraft:powered_rail", - "mass": 800.0, + "mass": 150.0, "friction": 0.7 }, { "block": "minecraft:rail", - "mass": 330.0, + "mass": 100.0, "friction": 0.7 }, { "block": "minecraft:activator_rail", - "mass": 330.0, + "mass": 100.0, "friction": 0.7 }, { "block": "minecraft:piston", - "mass": 2800.0, + "mass": 250.0, "friction": 0.5 }, { "block": "minecraft:sticky_piston", - "mass": 2800.0, + "mass": 250.0, "friction": 0.5 }, { @@ -60,51 +60,51 @@ }, { "block": "minecraft:tnt", - "mass": 1200.0 + "mass": 125.0 }, { "block": "minecraft:lever", - "mass": 10.0 + "mass": 5.0 }, { "tag": "minecraft:wooden_pressure_plates", - "mass": 10.0 + "mass": 5.0 }, { "block": "minecraft:stone_pressure_plate", - "mass": 130.0 + "mass": 10.0 }, { "block": "minecraft:polished_blackstone_pressure_plate", - "mass": 170.0 + "mass": 10.0 }, { "block": "minecraft:light_weighted_pressure_plate", - "mass": 800.0 + "mass": 50.0 }, { "block": "minecraft:heavy_weighted_pressure_plate", - "mass": 350.0 + "mass": 100.0 }, { "block": "minecraft:redstone_torch", - "mass": 5.0 + "mass": 0.5 }, { "tag": "minecraft:wooden_buttons", - "mass": 2.0 + "mass": 0.25 }, { "block": "minecraft:stone_button", - "mass": 26.0 + "mass": 0.5 }, { "block": "minecraft:polished_blackstone_button", - "mass": 34.0 + "mass": 0.5 }, { "block": "minecraft:tripwire_hook", - "mass": 80.0 + "mass": 0.5 }, { "block": "minecraft:tripwire", @@ -112,22 +112,22 @@ }, { "block": "minecraft:daylight_detector", - "mass": 1200.0, + "mass": 125.0, "friction": 0.2 }, { "block": "minecraft:redstone_block", - "mass": 1350.0, + "mass": 250.0, "friction": 0.4 }, { "block": "minecraft:observer", - "mass": 2800.0, + "mass": 250.0, "friction": 0.5 }, { "block": "minecraft:target", - "mass": 200.0, + "mass": 100.0, "elasticity": 0.3 }, { @@ -136,36 +136,36 @@ }, { "block": "minecraft:trapped_chest", - "mass": 480.0 + "mass": 150.0 }, { "block": "minecraft:redstone_lamp", - "mass": 1200.0, + "mass": 100.0, "friction": 0.2 }, { "block": "minecraft:comparator", - "mass": 250.0, + "mass": 25.0, "friction": 0.3 }, { "block": "minecraft:repeater", - "mass": 250.0, + "mass": 25.0, "friction": 0.3 }, { "block": "minecraft:hopper", - "mass": 3800.0, + "mass": 100.0, "friction": 0.3 }, { "tag": "minecraft:shulker_boxes", - "mass": 800.0, + "mass": 50.0, "friction": 0.1 }, { "tag": "minecraft:fence_gates", - "mass": 20.0 + "mass": 5.0 }, { "tag": "minecraft:wooden_doors", @@ -173,16 +173,16 @@ }, { "block": "minecraft:iron_door", - "mass": 1000.0, + "mass": 75.0, "friction": 0.35 }, { "tag": "minecraft:wooden_trapdoors", - "mass": 25.0 + "mass": 50.0 }, { "block": "minecraft:iron_trapdoor", - "mass": 1000.0, + "mass": 100.0, "friction": 0.35 } ] diff --git a/common/src/main/resources/data/valkyrienskies/vs_mass/steelarmorblocks.json b/common/src/main/resources/data/valkyrienskies/vs_mass/steelarmorblocks.json new file mode 100644 index 000000000..d1b599284 --- /dev/null +++ b/common/src/main/resources/data/valkyrienskies/vs_mass/steelarmorblocks.json @@ -0,0 +1,1486 @@ +[ + { + "block": "s_a_b:doublesteelblock", + "mass": 2744.0 + }, + { + "block": "s_a_b:steelblock", + "mass": 1176.0 + }, + { + "block": "s_a_b:hardsteelblock", + "mass": 4312.0 + }, + { + "block": "s_a_b:lightsteelblock", + "mass": 392.0 + }, + { + "block": "s_a_b:lightsteelvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:steelvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:lightsteelslab", + "mass": 196.0 + }, + { + "block": "s_a_b:steelslab", + "mass": 588.0 + }, + { + "block": "s_a_b:lightsteelstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:steelarmorstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:steelwl", + "mass": 1176.0 + }, + { + "block": "s_a_b:armorwl", + "mass": 4312.0 + }, + { + "block": "s_a_b:sandbag", + "mass": 624.0 + }, + { + "block": "s_a_b:blacksteelblock", + "mass": 1176.0 + }, + { + "block": "s_a_b:redsteelblock", + "mass": 1176.0 + }, + { + "block": "s_a_b:greensteelblock", + "mass": 1176.0 + }, + { + "block": "s_a_b:bluesteelblock", + "mass": 1176.0 + }, + { + "block": "s_a_b:cyansteelblock", + "mass": 1176.0 + }, + { + "block": "s_a_b:brownsteelblock", + "mass": 1176.0 + }, + { + "block": "s_a_b:graysteelblock", + "mass": 1176.0 + }, + { + "block": "s_a_b:whitesteelblock", + "mass": 1176.0 + }, + { + "block": "s_a_b:lightgraysteelblock", + "mass": 1176.0 + }, + { + "block": "s_a_b:lightbluesteelblock", + "mass": 1176.0 + }, + { + "block": "s_a_b:magentasteelblock", + "mass": 1176.0 + }, + { + "block": "s_a_b:yellowsteelblock", + "mass": 1176.0 + }, + { + "block": "s_a_b:pinksteelblock", + "mass": 1176.0 + }, + { + "block": "s_a_b:purplesteelblock", + "mass": 1176.0 + }, + { + "block": "s_a_b:orangesteelblock", + "mass": 1176.0 + }, + { + "block": "s_a_b:limesteelblock", + "mass": 1176.0 + }, + { + "block": "s_a_b:blackhardsteelblock", + "mass": 4312.0 + }, + { + "block": "s_a_b:redhardsteelblock", + "mass": 4312.0 + }, + { + "block": "s_a_b:greenhardsteelblock", + "mass": 4312.0 + }, + { + "block": "s_a_b:bluehardsteelblock", + "mass": 4312.0 + }, + { + "block": "s_a_b:cyanhardsteelblock", + "mass": 4312.0 + }, + { + "block": "s_a_b:brownhardsteelblock", + "mass": 4312.0 + }, + { + "block": "s_a_b:grayhardsteelblock", + "mass": 4312.0 + }, + { + "block": "s_a_b:lightgrayhardsteelblock", + "mass": 4312.0 + }, + { + "block": "s_a_b:lightbluehardsteelblock", + "mass": 4312.0 + }, + { + "block": "s_a_b:magentahardsteelblock", + "mass": 4312.0 + }, + { + "block": "s_a_b:yellowhardsteelblock", + "mass": 4312.0 + }, + { + "block": "s_a_b:pinkhardsteelblock", + "mass": 4312.0 + }, + { + "block": "s_a_b:purplehardsteelblock", + "mass": 4312.0 + }, + { + "block": "s_a_b:orangehardsteelblock", + "mass": 4312.0 + }, + { + "block": "s_a_b:limehardsteelblock", + "mass": 4312.0 + }, + { + "block": "s_a_b:whitehardsteelblock", + "mass": 4312.0 + }, + { + "block": "s_a_b:blacklightsteelblock", + "mass": 392.0 + }, + { + "block": "s_a_b:redlightsteelblock", + "mass": 392.0 + }, + { + "block": "s_a_b:greenlightsteelblock", + "mass": 392.0 + }, + { + "block": "s_a_b:bluelightsteelblock", + "mass": 392.0 + }, + { + "block": "s_a_b:cyanlightsteelblock", + "mass": 392.0 + }, + { + "block": "s_a_b:brownlightsteelblock", + "mass": 392.0 + }, + { + "block": "s_a_b:graylightsteelblock", + "mass": 392.0 + }, + { + "block": "s_a_b:lightgraylightsteelblock", + "mass": 392.0 + }, + { + "block": "s_a_b:lightbluelightsteelblock", + "mass": 392.0 + }, + { + "block": "s_a_b:magentalightsteelblock", + "mass": 392.0 + }, + { + "block": "s_a_b:yellowlightsteelblock", + "mass": 392.0 + }, + { + "block": "s_a_b:pinklightsteelblock", + "mass": 392.0 + }, + { + "block": "s_a_b:purplelightsteelblock", + "mass": 392.0 + }, + { + "block": "s_a_b:orangelightsteelblock", + "mass": 392.0 + }, + { + "block": "s_a_b:limelightsteelblock", + "mass": 392.0 + }, + { + "block": "s_a_b:whitelightsteelblock", + "mass": 392.0 + }, + { + "block": "s_a_b:blackdoublesteelblock", + "mass": 2744.0 + }, + { + "block": "s_a_b:reddoublesteelblock", + "mass": 2744.0 + }, + { + "block": "s_a_b:greendoublesteelblock", + "mass": 2744.0 + }, + { + "block": "s_a_b:bluedoublesteelblock", + "mass": 2744.0 + }, + { + "block": "s_a_b:cyandoublesteelblock", + "mass": 2744.0 + }, + { + "block": "s_a_b:browndoublesteelblock", + "mass": 2744.0 + }, + { + "block": "s_a_b:graydoublesteelblock", + "mass": 2744.0 + }, + { + "block": "s_a_b:lightgraydoublesteelblock", + "mass": 2744.0 + }, + { + "block": "s_a_b:lightbluedoublesteelblock", + "mass": 2744.0 + }, + { + "block": "s_a_b:magentadoublesteelblock", + "mass": 2744.0 + }, + { + "block": "s_a_b:yellowdoublesteelblock", + "mass": 2744.0 + }, + { + "block": "s_a_b:pinkdoublesteelblock", + "mass": 2744.0 + }, + { + "block": "s_a_b:purpledoublesteelblock", + "mass": 2744.0 + }, + { + "block": "s_a_b:orangedoublesteelblock", + "mass": 2744.0 + }, + { + "block": "s_a_b:limedoublesteelblock", + "mass": 2744.0 + }, + { + "block": "s_a_b:whitedoublesteelblock", + "mass": 2744.0 + }, + { + "block": "s_a_b:blacklightsteelvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:redlightsteelvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:greenlightsteelvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:bluelightsteelvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:cyanlightsteelvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:brownlightsteelvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:graylightsteelvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:lightgraylightsteelvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:lightbluelightsteelvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:magentalightsteelvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:yellowlightsteelvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:pinklightsteelvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:purplelightsteelvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:orangelightsteelvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:limelightsteelvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:whitelightsteelvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:blacksteelvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:redsteelvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:greensteelvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:bluesteelvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:cyansteelvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:brownsteelvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:graysteelvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:lightgraysteelvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:lightbluesteelvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:magentasteelvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:yellowsteelvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:pinksteelvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:purplesteelvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:orangesteelvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:limesteelvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:whitesteelvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:blacklightsteelslab", + "mass": 196.0 + }, + { + "block": "s_a_b:redlightsteelslab", + "mass": 196.0 + }, + { + "block": "s_a_b:greenlightsteelslab", + "mass": 196.0 + }, + { + "block": "s_a_b:bluelightsteelslab", + "mass": 196.0 + }, + { + "block": "s_a_b:cyanlightsteelslab", + "mass": 196.0 + }, + { + "block": "s_a_b:brownlightsteelslab", + "mass": 196.0 + }, + { + "block": "s_a_b:graylightsteelslab", + "mass": 196.0 + }, + { + "block": "s_a_b:lightgraylightsteelslab", + "mass": 196.0 + }, + { + "block": "s_a_b:lightbluelightsteelslab", + "mass": 196.0 + }, + { + "block": "s_a_b:magentalightsteelslab", + "mass": 196.0 + }, + { + "block": "s_a_b:yellowlightsteelslab", + "mass": 196.0 + }, + { + "block": "s_a_b:pinklightsteelslab", + "mass": 196.0 + }, + { + "block": "s_a_b:purplelightsteelslab", + "mass": 196.0 + }, + { + "block": "s_a_b:orangelightsteelslab", + "mass": 196.0 + }, + { + "block": "s_a_b:limelightsteelslab", + "mass": 196.0 + }, + { + "block": "s_a_b:whitelightsteelslab", + "mass": 196.0 + }, + { + "block": "s_a_b:blacksteelslab", + "mass": 588.0 + }, + { + "block": "s_a_b:redsteelslab", + "mass": 588.0 + }, + { + "block": "s_a_b:greensteelslab", + "mass": 588.0 + }, + { + "block": "s_a_b:bluesteelslab", + "mass": 588.0 + }, + { + "block": "s_a_b:cyansteelslab", + "mass": 588.0 + }, + { + "block": "s_a_b:brownsteelslab", + "mass": 588.0 + }, + { + "block": "s_a_b:graysteelslab", + "mass": 588.0 + }, + { + "block": "s_a_b:lightgraysteelslab", + "mass": 588.0 + }, + { + "block": "s_a_b:lightbluesteelslab", + "mass": 588.0 + }, + { + "block": "s_a_b:magentasteelslab", + "mass": 588.0 + }, + { + "block": "s_a_b:yellowsteelslab", + "mass": 588.0 + }, + { + "block": "s_a_b:pinksteelslab", + "mass": 588.0 + }, + { + "block": "s_a_b:purplesteelslab", + "mass": 588.0 + }, + { + "block": "s_a_b:orangesteelslab", + "mass": 588.0 + }, + { + "block": "s_a_b:limesteelslab", + "mass": 588.0 + }, + { + "block": "s_a_b:whitesteelslab", + "mass": 588.0 + }, + { + "block": "s_a_b:blacklightsteelstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:redlightsteelstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:greenlightsteelstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:bluelightsteelstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:cyanlightsteelstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:brownlightsteelstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:graylightsteelstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:lightgraylightsteelstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:lightbluelightsteelstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:magentalightsteelstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:yellowlightsteelstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:pinklightsteelstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:purplelightsteelstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:orangelightsteelstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:limelightsteelstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:whitelightsteelstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:blacksteelstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:redsteelstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:greensteelstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:bluesteelstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:cyansteelstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:brownsteelstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:graysteelstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:lightgraysteelstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:lightbluesteelstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:magentasteelstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:yellowsteelstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:pinksteelstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:purplesteelstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:orangesteelstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:limesteelstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:whitesteelstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:steelblockcolored_29", + "mass": 1176.0 + }, + { + "block": "s_a_b:steelblockcolored_31", + "mass": 1176.0 + }, + { + "block": "s_a_b:steelblockcolored_32", + "mass": 1176.0 + }, + { + "block": "s_a_b:steelblockcolored_33", + "mass": 1176.0 + }, + { + "block": "s_a_b:steelblockcoloredparade", + "mass": 1176.0 + }, + { + "block": "s_a_b:doublesteelblockcolored_29", + "mass": 2744.0 + }, + { + "block": "s_a_b:doublesteelblockcolored_31", + "mass": 2744.0 + }, + { + "block": "s_a_b:doublesteelblockcolored_32", + "mass": 2744.0 + }, + { + "block": "s_a_b:doublesteelblockcolored_33", + "mass": 2744.0 + }, + { + "block": "s_a_b:doublesteelblockcoloredparade", + "mass": 2744.0 + }, + { + "block": "s_a_b:lightsteelblockcolored_29", + "mass": 392.0 + }, + { + "block": "s_a_b:lightsteelblockcolored_31", + "mass": 392.0 + }, + { + "block": "s_a_b:lightsteelblockcolored_32", + "mass": 392.0 + }, + { + "block": "s_a_b:lightsteelblockcolored_33", + "mass": 392.0 + }, + { + "block": "s_a_b:lightsteelblockcoloredparade", + "mass": 392.0 + }, + { + "block": "s_a_b:hardsteelblockcolored_29", + "mass": 4312.0 + }, + { + "block": "s_a_b:hardsteelblockcolored_31", + "mass": 4312.0 + }, + { + "block": "s_a_b:hardsteelblockcolored_32", + "mass": 4312.0 + }, + { + "block": "s_a_b:hardsteelblockcolored_33", + "mass": 4312.0 + }, + { + "block": "s_a_b:hardsteelblockcoloredparade", + "mass": 4312.0 + }, + { + "block": "s_a_b:steelvslabcolored_29", + "mass": 588.0 + }, + { + "block": "s_a_b:steelvslabcolored_31", + "mass": 588.0 + }, + { + "block": "s_a_b:steelvslabcolored_32", + "mass": 588.0 + }, + { + "block": "s_a_b:steelvslabcolored_33", + "mass": 588.0 + }, + { + "block": "s_a_b:steelvslabcoloredparade", + "mass": 588.0 + }, + { + "block": "s_a_b:lightsteelvslabcolored_29", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelvslabcolored_31", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelvslabcolored_32", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelvslabcolored_33", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelvslabcoloredparade", + "mass": 196.0 + }, + { + "block": "s_a_b:steelslabcolored_29", + "mass": 588.0 + }, + { + "block": "s_a_b:steelslabcolored_31", + "mass": 588.0 + }, + { + "block": "s_a_b:steelslabcolored_32", + "mass": 588.0 + }, + { + "block": "s_a_b:steelslabcolored_33", + "mass": 588.0 + }, + { + "block": "s_a_b:steelslabcoloredparade", + "mass": 588.0 + }, + { + "block": "s_a_b:lightsteelslabcolored_29", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelslabcolored_31", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelslabcolored_32", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelslabcolored_33", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelslabcoloredparade", + "mass": 196.0 + }, + { + "block": "s_a_b:steelstairscolored_29", + "mass": 882.0 + }, + { + "block": "s_a_b:steelstairscolored_31", + "mass": 882.0 + }, + { + "block": "s_a_b:steelstairscolored_32", + "mass": 882.0 + }, + { + "block": "s_a_b:steelstairscolored_33", + "mass": 882.0 + }, + { + "block": "s_a_b:steelstairscoloredparade", + "mass": 882.0 + }, + { + "block": "s_a_b:lightsteelstairscolored_29", + "mass": 294.0 + }, + { + "block": "s_a_b:lghtsteelstairscolored_31", + "mass": 294.0 + }, + { + "block": "s_a_b:lghtsteelstairscolored_32", + "mass": 294.0 + }, + { + "block": "s_a_b:lghtsteelstairscolored_33", + "mass": 294.0 + }, + { + "block": "s_a_b:lghtsteelstairscoloredparade", + "mass": 3234.0 + }, + { + "block": "s_a_b:doublesteelblockshipbottom", + "mass": 2744.0 + }, + { + "block": "s_a_b:steelblockshipbottom", + "mass": 1176.0 + }, + { + "block": "s_a_b:hardsteelblockshipbottom", + "mass": 4312.0 + }, + { + "block": "s_a_b:lightsteelblockshipbottom", + "mass": 392.0 + }, + { + "block": "s_a_b:doublesteelblock_4bo", + "mass": 2744.0 + }, + { + "block": "s_a_b:steelblock_4bo", + "mass": 1176.0 + }, + { + "block": "s_a_b:hardsteelblock_4bo", + "mass": 4312.0 + }, + { + "block": "s_a_b:lightsteelblock_4bo", + "mass": 392.0 + }, + { + "block": "s_a_b:doublesteelblockgelb", + "mass": 2744.0 + }, + { + "block": "s_a_b:steelblockgelb", + "mass": 1176.0 + }, + { + "block": "s_a_b:hardsteelblockgelb", + "mass": 4312.0 + }, + { + "block": "s_a_b:lightsteelblockgelb", + "mass": 392.0 + }, + { + "block": "s_a_b:doublesteelblockpanzergrau", + "mass": 2744.0 + }, + { + "block": "s_a_b:steelblockpanzergrau", + "mass": 1176.0 + }, + { + "block": "s_a_b:hardsteelblockpanzergrau", + "mass": 4312.0 + }, + { + "block": "s_a_b:lightsteelblockpanzergrau", + "mass": 392.0 + }, + { + "block": "s_a_b:doublesteelblockrotbraun", + "mass": 2744.0 + }, + { + "block": "s_a_b:steelblockrotbraun", + "mass": 1176.0 + }, + { + "block": "s_a_b:hardsteelblockrotbraun", + "mass": 4312.0 + }, + { + "block": "s_a_b:lightsteelblockrotbraun", + "mass": 392.0 + }, + { + "block": "s_a_b:steelslabshipbottom", + "mass": 588.0 + }, + { + "block": "s_a_b:steelvslabshipbottom", + "mass": 588.0 + }, + { + "block": "s_a_b:steelstairsshipbottom", + "mass": 882.0 + }, + { + "block": "s_a_b:lightsteelslabshipbottom", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelvslabshipbottom", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelstairsshipbottom", + "mass": 294.0 + }, + { + "block": "s_a_b:steelslab_4bo", + "mass": 588.0 + }, + { + "block": "s_a_b:steelvslab_4bo", + "mass": 588.0 + }, + { + "block": "s_a_b:steelstairs_4bo", + "mass": 882.0 + }, + { + "block": "s_a_b:lightsteelslab_4bo", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelvslab_4bo", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelstairs_4bo", + "mass": 294.0 + }, + { + "block": "s_a_b:steelslabgelb", + "mass": 588.0 + }, + { + "block": "s_a_b:steelvslabgelb", + "mass": 588.0 + }, + { + "block": "s_a_b:steelstairsgelb", + "mass": 882.0 + }, + { + "block": "s_a_b:lightsteelslabgelb", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelvslabgelb", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelstairsgelb", + "mass": 294.0 + }, + { + "block": "s_a_b:steelslabpanzergrau", + "mass": 588.0 + }, + { + "block": "s_a_b:steelvslabpanzergrau", + "mass": 588.0 + }, + { + "block": "s_a_b:steelstairspanzergrau", + "mass": 882.0 + }, + { + "block": "s_a_b:lightsteelslabpanzergrau", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelvslabpanzergrau", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelstairspanzergrau", + "mass": 294.0 + }, + { + "block": "s_a_b:steelslabrotbraun", + "mass": 588.0 + }, + { + "block": "s_a_b:steelvslabrotbraun", + "mass": 588.0 + }, + { + "block": "s_a_b:steelstairsrotbraun", + "mass": 882.0 + }, + { + "block": "s_a_b:lightsteelslabrotbraun", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelvslabrotbraun", + "mass": 196.0 + }, + { + "block": "s_a_b:lightsteelstairsrotbraun", + "mass": 294.0 + }, + { + "block": "s_a_b:steelwl_29", + "mass": 1176.0 + }, + { + "block": "s_a_b:steelwl_31", + "mass": 1176.0 + }, + { + "block": "s_a_b:steelwl_32", + "mass": 1176.0 + }, + { + "block": "s_a_b:steelwl_33", + "mass": 1176.0 + }, + { + "block": "s_a_b:steelwlblack", + "mass": 1176.0 + }, + { + "block": "s_a_b:steelwlgray", + "mass": 1176.0 + }, + { + "block": "s_a_b:lightwl_29", + "mass": 392.0 + }, + { + "block": "s_a_b:lightwl_31", + "mass": 392.0 + }, + { + "block": "s_a_b:lightwl_32", + "mass": 392.0 + }, + { + "block": "s_a_b:lightwl_33", + "mass": 392.0 + }, + { + "block": "s_a_b:lightwlblack", + "mass": 392.0 + }, + { + "block": "s_a_b:lightwlgray", + "mass": 392.0 + }, + { + "block": "s_a_b:armorwl_29", + "mass": 4312.0 + }, + { + "block": "s_a_b:armorwl_31", + "mass": 4312.0 + }, + { + "block": "s_a_b:armorwl_32", + "mass": 4312.0 + }, + { + "block": "s_a_b:armorwl_33", + "mass": 4312.0 + }, + { + "block": "s_a_b:armorwlblack", + "mass": 4312.0 + }, + { + "block": "s_a_b:armorwlgray", + "mass": 4312.0 + }, + { + "block": "s_a_b:lightsteelblockcamoplains", + "mass": 392.0 + }, + { + "block": "s_a_b:lightsteelcamoforest", + "mass": 392.0 + }, + { + "block": "s_a_b:lightsteelcamosnow", + "mass": 392.0 + }, + { + "block": "s_a_b:lightsteelcamodesert", + "mass": 392.0 + }, + { + "block": "s_a_b:lightsteelcamomesa", + "mass": 392.0 + }, + { + "block": "s_a_b:lightsteelcamoswamp", + "mass": 392.0 + }, + { + "block": "s_a_b:lightsteelcamojungle", + "mass": 392.0 + }, + { + "block": "s_a_b:lightsteelcamotaiga", + "mass": 392.0 + }, + { + "block": "s_a_b:steelblockcamoplains", + "mass": 1176.0 + }, + { + "block": "s_a_b:steelblockcamoforest", + "mass": 1176.0 + }, + { + "block": "s_a_b:steelblockcamosnow", + "mass": 1176.0 + }, + { + "block": "s_a_b:steelblockcamodesert", + "mass": 1176.0 + }, + { + "block": "s_a_b:steelblockcamomesa", + "mass": 1176.0 + }, + { + "block": "s_a_b:steelblockcamoswamp", + "mass": 1176.0 + }, + { + "block": "s_a_b:steelblockcamojungle", + "mass": 1176.0 + }, + { + "block": "s_a_b:steelblockcamotaiga", + "mass": 1176.0 + }, + { + "block": "s_a_b:doublesteelblockcamoplains", + "mass": 2744.0 + }, + { + "block": "s_a_b:doublesteelblockcamoforest", + "mass": 2744.0 + }, + { + "block": "s_a_b:doublesteelblockcamosnow", + "mass": 2744.0 + }, + { + "block": "s_a_b:doublesteelblockcamodesert", + "mass": 2744.0 + }, + { + "block": "s_a_b:doublesteelblockcamomesa", + "mass": 2744.0 + }, + { + "block": "s_a_b:doublesteelblockcamoswamp", + "mass": 2744.0 + }, + { + "block": "s_a_b:doublesteelblockcamojungle", + "mass": 2744.0 + }, + { + "block": "s_a_b:doublesteelblockcamotaiga", + "mass": 2744.0 + }, + { + "block": "s_a_b:hardsteelblockcamoplains", + "mass": 4312.0 + }, + { + "block": "s_a_b:hardsteelblockcamoforest", + "mass": 4312.0 + }, + { + "block": "s_a_b:hardsteelblockcamosnow", + "mass": 4312.0 + }, + { + "block": "s_a_b:hardsteelblockcamodesert", + "mass": 4312.0 + }, + { + "block": "s_a_b:hardsteelblockcamomesa", + "mass": 4312.0 + }, + { + "block": "s_a_b:hardsteelblockcamoswamp", + "mass": 4312.0 + }, + { + "block": "s_a_b:hardsteelblockcamojungle", + "mass": 4312.0 + }, + { + "block": "s_a_b:hardsteelblockcamotaiga", + "mass": 4312.0 + }, + { + "block": "s_a_b:iightsteelcamoplainsslab", + "mass": 196.0 + }, + { + "block": "s_a_b:iightsteelcamoplainsvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:iightsteelcamoplainsstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:iightsteelcamoforestslab", + "mass": 196.0 + }, + { + "block": "s_a_b:iightsteelcamoforestvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:iightsteelcamoforeststairs", + "mass": 294.0 + }, + { + "block": "s_a_b:iightsteelcamosnowslab", + "mass": 196.0 + }, + { + "block": "s_a_b:iightsteelcamosnowvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:iightsteelcamosnowstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:iightsteelcamodesertslab", + "mass": 196.0 + }, + { + "block": "s_a_b:iightsteelcamodesertvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:iightsteelcamodesertstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:iightsteelcamomesaslab", + "mass": 196.0 + }, + { + "block": "s_a_b:iightsteelcamomesavslab", + "mass": 196.0 + }, + { + "block": "s_a_b:iightsteelcamomesastairs", + "mass": 294.0 + }, + { + "block": "s_a_b:iightsteelcamoswampslab", + "mass": 196.0 + }, + { + "block": "s_a_b:iightsteelcamoswampvslab", + "mass": 196.0 + }, + { + "block": "s_a_b:iightsteelcamoswampstairs", + "mass": 294.0 + }, + { + "block": "s_a_b:iightsteelcamojungleslab", + "mass": 196.0 + }, + { + "block": "s_a_b:iightsteelcamojunglevslab", + "mass": 196.0 + }, + { + "block": "s_a_b:iightsteelcamojunglestairs", + "mass": 294.0 + }, + { + "block": "s_a_b:iightsteelcamotaigaslab", + "mass": 196.0 + }, + { + "block": "s_a_b:iightsteelcamotaigavslab", + "mass": 196.0 + }, + { + "block": "s_a_b:iightsteelcamotaigastairs", + "mass": 294.0 + }, + { + "block": "s_a_b:steelcamoplainsslab", + "mass": 588.0 + }, + { + "block": "s_a_b:steelcamoplainsvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:steelcamoplainsstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:steelcamoforestslab", + "mass": 588.0 + }, + { + "block": "s_a_b:steelcamoforestvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:steelcamoforeststairs", + "mass": 882.0 + }, + { + "block": "s_a_b:steelcamosnowslab", + "mass": 588.0 + }, + { + "block": "s_a_b:steelcamosnowvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:steelcamosnowstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:steelcamodesertslab", + "mass": 588.0 + }, + { + "block": "s_a_b:steelcamodesertvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:steelcamodesertstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:steelcamomesaslab", + "mass": 588.0 + }, + { + "block": "s_a_b:steelcamomesavslab", + "mass": 588.0 + }, + { + "block": "s_a_b:steelcamomesastairs", + "mass": 882.0 + }, + { + "block": "s_a_b:steelcamoswampslab", + "mass": 588.0 + }, + { + "block": "s_a_b:steelcamoswampvslab", + "mass": 588.0 + }, + { + "block": "s_a_b:steelcamoswampstairs", + "mass": 882.0 + }, + { + "block": "s_a_b:steelcamojungleslab", + "mass": 588.0 + }, + { + "block": "s_a_b:steelcamojunglevslab", + "mass": 588.0 + }, + { + "block": "s_a_b:steelcamojunglestairs", + "mass": 882.0 + }, + { + "block": "s_a_b:steelcamotaigaslab", + "mass": 588.0 + }, + { + "block": "s_a_b:steelcamotaigavslab", + "mass": 588.0 + }, + { + "block": "s_a_b:steelcamotaigastairs", + "mass": 882.0 + } +] diff --git a/common/src/main/resources/data/valkyrienskies/vs_mass/wood.json b/common/src/main/resources/data/valkyrienskies/vs_mass/wood.json index f1f037988..2c859b451 100644 --- a/common/src/main/resources/data/valkyrienskies/vs_mass/wood.json +++ b/common/src/main/resources/data/valkyrienskies/vs_mass/wood.json @@ -1,302 +1,302 @@ [ { "block": "minecraft:oak_wood", - "mass": 900.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:oak_log", - "mass": 900.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:stripped_oak_wood", - "mass": 900.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:stripped_oak_log", - "mass": 900.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:oak_planks", - "mass": 600.0, + "mass": 100.0, "friction": 0.5 }, { "block": "minecraft:oak_slab", - "mass": 300.0, + "mass": 50.0, "friction": 0.5 }, { - "block": "minecraft:oak_slab", - "mass": 450.0, + "block": "minecraft:oak_stairs", + "mass": 75.0, "friction": 0.5 }, { "block": "minecraft:spruce_wood", - "mass": 780.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:spruce_log", - "mass": 780.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:stripped_spruce_wood", - "mass": 780.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:stripped_spruce_log", - "mass": 780.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:spruce_planks", - "mass": 480.0, + "mass": 100.0, "friction": 0.5 }, { "block": "minecraft:spruce_slab", - "mass": 240.0, + "mass": 50.0, "friction": 0.5 }, { "block": "minecraft:spruce_stairs", - "mass": 360.0, + "mass": 75.0, "friction": 0.5 }, { "block": "minecraft:birch_wood", - "mass": 770.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:birch_log", - "mass": 770.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:stripped_birch_wood", - "mass": 770.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:stripped_birch_log", - "mass": 770.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:birch_planks", - "mass": 510.0, + "mass": 100.0, "friction": 0.5 }, { "block": "minecraft:birch_slab", - "mass": 255.0, + "mass": 50.0, "friction": 0.5 }, { "block": "minecraft:birch_stairs", - "mass": 380.0, + "mass": 75.0, "friction": 0.5 }, { "block": "minecraft:jungle_wood", - "mass": 850.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:jungle_log", - "mass": 850.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:stripped_jungle_wood", - "mass": 850.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:stripped_jungle_log", - "mass": 850.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:jungle_planks", - "mass": 500.0, + "mass": 100.0, "friction": 0.5 }, { "block": "minecraft:jungle_slab", - "mass": 250.0, + "mass": 50.0, "friction": 0.5 }, { "block": "minecraft:jungle_stairs", - "mass": 375.0, + "mass": 75.0, "friction": 0.5 }, { "block": "minecraft:acacia_wood", - "mass": 770.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:acacia_log", - "mass": 770.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:stripped_acacia_wood", - "mass": 770.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:stripped_acacia_log", - "mass": 770.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:acacia_planks", - "mass": 550.0, + "mass": 100.0, "friction": 0.5 }, { "block": "minecraft:acacia_slab", - "mass": 275.0, + "mass": 50.0, "friction": 0.5 }, { "block": "minecraft:acacia_stairs", - "mass": 410.0, + "mass": 75.0, "friction": 0.5 }, { "block": "minecraft:dark_oak_wood", - "mass": 800.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:dark_oak_log", - "mass": 800.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:stripped_dark_oak_wood", - "mass": 800.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:stripped_dark_oak_log", - "mass": 800.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:dark_oak_planks", - "mass": 650.0, + "mass": 100.0, "friction": 0.5 }, { "block": "minecraft:dark_oak_slab", - "mass": 325.0, + "mass": 50.0, "friction": 0.5 }, { "block": "minecraft:dark_oak_stairs", - "mass": 485.0, + "mass": 75.0, "friction": 0.5 }, { "block": "minecraft:warped_hyphae", - "mass": 980.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:warped_stem", - "mass": 980.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:stripped_warped_hyphae", - "mass": 980.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:stripped_warped_stem", - "mass": 980.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:warped_planks", - "mass": 910.0, + "mass": 100.0, "friction": 0.5 }, { "block": "minecraft:warped_slab", - "mass": 455.0, + "mass": 50.0, "friction": 0.5 }, { "block": "minecraft:warped_stairs", - "mass": 680.0, + "mass": 75.0, "friction": 0.5 }, { "block": "minecraft:crimson_hyphae", - "mass": 980.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:crimson_stem", - "mass": 980.0, + "mass": 400.0, "friction": 0.6 }, { "block": "minecraft:stripped_crimson_hyphae", - "mass": 980.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:stripped_crimson_stem", - "mass": 980.0, + "mass": 400.0, "friction": 0.4 }, { "block": "minecraft:crimson_planks", - "mass": 910.0, + "mass": 100.0, "friction": 0.5 }, { "block": "minecraft:crimson_slab", - "mass": 455.0, + "mass": 50.0, "friction": 0.5 }, { "block": "minecraft:crimson_stairs", - "mass": 680.0, + "mass": 750.0, "friction": 0.5 }, { "tag": "minecraft:logs", - "mass": 800.0, + "mass": 400.0, "friction": 0.6 }, { "tag": "minecraft:planks", - "mass": 700.0, + "mass": 100.0, "friction": 0.5 }, { "tag": "minecraft:wooden_stairs", - "mass": 525.0, + "mass": 75.0, "friction": 0.5 }, { "tag": "minecraft:wooden_slabs", - "mass": 350.0, + "mass": 50.0, "friction": 0.5 } ] diff --git a/common/src/main/resources/valkyrienskies-common.mixins.json b/common/src/main/resources/valkyrienskies-common.mixins.json index f6a391bc7..2b0fc4659 100644 --- a/common/src/main/resources/valkyrienskies-common.mixins.json +++ b/common/src/main/resources/valkyrienskies-common.mixins.json @@ -44,13 +44,16 @@ "feature.shipyard_entities.MixinEntity", "feature.shipyard_entities.MixinEntitySection", "feature.shipyard_entities.MixinEntitySectionStorage", - "feature.shipyard_entities.MixinPersistentEntitySectionManager", "feature.shipyard_entities.MixinServerLevel", "feature.shipyard_entities.MixinTransientEntitySectionManager", "feature.spawn_player_on_ship.MixinServerGamePacketListenerImpl", "feature.tick_ship_chunks.MixinChunkMap", "feature.world_border.MixinLevel", "feature.world_border.MixinWorldBorder", + "mod_compat.bluemap.HiresTileModelAccessor", + "mod_compat.bluemap.MixinBmMap", + "mod_compat.bluemap.MixinHiresModelManager", + "mod_compat.bluemap.MixinWorld", "mod_compat.create.IMixinDeployerHandler", "mod_compat.create.IMixinDeployerMovementBehaviour", "mod_compat.create.MixinAirCurrent", @@ -61,6 +64,7 @@ "mod_compat.create.MixinEntityLauncher", "mod_compat.create.MixinRedstoneLinkNetworkHandler", "mod_compat.create.MixinSharedDepotBlockMethods", + "mod_compat.create.accessors.ChuteBlockEntityAccessor", "mod_compat.create.accessors.Matrix3dAccessor", "mod_compat.create.accessors.OutlineParamsAccessor", "mod_compat.create.behaviour.MixinBlockBreakingMovementBehaviour", @@ -89,6 +93,7 @@ "mod_compat.create_big_cannons.MixinPitchOrientedContraptionEntity", "mod_compat.ftb_chunks.MixinClaimedChunkManager", "mod_compat.reachentityattributes.MixinReachEntityAttributes", + "server.MinecraftServerAccessor", "server.MixinMinecraftServer", "server.MixinPlayerList", "server.command.MixinCommands", @@ -159,9 +164,12 @@ "mod_compat.create.client.MixinSoundScapes", "mod_compat.create.client.MixinTileEntityRenderHelper", "mod_compat.create.client.MixinTrainRelocator", + "mod_compat.create.client.MixinDeployTool", + "mod_compat.create.client.MixinSchematicToolBase", + "mod_compat.create.client.MixinSchematicTransformation", + "mod_compat.create.client.MixinValueBox", "mod_compat.create.client.trackOutlines.MixinBigOutlines", "mod_compat.create.client.trackOutlines.MixinTrackBlockOutline", - "mod_compat.create.client.MixinValueBox", "mod_compat.flywheel.InstancingEngineAccessor", "mod_compat.flywheel.MixinBlockEntityInstanceManager", "mod_compat.flywheel.MixinInstanceManager", diff --git a/fabric/build.gradle b/fabric/build.gradle index ff5d98e89..28c9639ae 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -59,8 +59,16 @@ dependencies { exclude module: "fastutil" exclude module: "kotlin-stdlib-jdk8" // Don't shade kotlin-stdlib-jdk8, even though vs-core depends on it exclude module: "jsonschema.module.addon" + + exclude group: "com.google.guava" } + def jacksonVersion = '2.14.0' + + + include("com.fasterxml:classmate:1.5.1") + implementation("com.fasterxml:classmate:1.5.1") + // CC Restitchedget modImplementation("maven.modrinth:cc-restitched:${cc_restitched_version}") diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerPosition.java b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerPosition.java deleted file mode 100644 index f58bb2ae4..000000000 --- a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerPosition.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.valkyrienskies.mod.fabric.mixin.compat.cc_restitched; - -import dan200.computercraft.shared.peripheral.speaker.SpeakerPosition; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.Vec3; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Pseudo; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.valkyrienskies.core.api.ships.LoadedShip; -import org.valkyrienskies.core.api.ships.Ship; -import org.valkyrienskies.mod.common.VSGameUtilsKt; - -@Pseudo -@Mixin(SpeakerPosition.class) -public abstract class MixinSpeakerPosition { - @Shadow - public abstract Level level(); - - @Inject(method = "position", at = @At("RETURN"), remap = false, cancellable = true) - public void ValkyrienSkies2$position(final CallbackInfoReturnable cir) { - final Vec3 pos = cir.getReturnValue(); - final LoadedShip ship = VSGameUtilsKt.getShipObjectManagingPos(level(), pos.x, pos.y, pos.z); - if (ship != null) { - cir.setReturnValue(VSGameUtilsKt.toWorldCoordinates(level(), pos)); - } - } - - @Redirect( - method = "withinDistance", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/world/phys/Vec3;distanceToSqr(Lnet/minecraft/world/phys/Vec3;)D" - ) - ) - public double ValkyrienSkies$distanceToSqr(final Vec3 instance, final Vec3 d) { - final Ship ship = VSGameUtilsKt.getShipManagingPos(level(), instance); - if (ship != null) { - return VSGameUtilsKt.squaredDistanceBetweenInclShips(level(), instance.x, instance.y, instance.z, d.x, d.y, - d.z); - } - - return instance.distanceToSqr(d); - } -} diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerSound.java b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerSound.java new file mode 100644 index 000000000..1244e4b49 --- /dev/null +++ b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerSound.java @@ -0,0 +1,64 @@ +package org.valkyrienskies.mod.fabric.mixin.compat.cc_restitched; + +import dan200.computercraft.client.sound.SpeakerSound; +import dan200.computercraft.shared.peripheral.speaker.SpeakerPosition; +import net.minecraft.client.resources.sounds.AbstractSoundInstance; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import org.joml.Vector3d; +import org.joml.Vector3dc; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.client.audio.VelocityTickableSoundInstance; +import org.valkyrienskies.mod.common.VSGameUtilsKt; + +@Mixin(SpeakerSound.class) +public abstract class MixinSpeakerSound extends AbstractSoundInstance implements VelocityTickableSoundInstance { + @Unique private SpeakerPosition speakerPosition; + @Unique private Ship ship; + + protected MixinSpeakerSound(ResourceLocation arg, SoundSource arg2) { + super(arg, arg2); + } + + @Inject( + method = "setPosition", + at = @At("RETURN"), + remap = false + ) + private void isOnShip(SpeakerPosition position, CallbackInfo ci) { + this.speakerPosition = position; + this.ship = VSGameUtilsKt.getShipManagingPos(position.level(), position.position()); + if (this.ship != null) { + Vec3 worldPos = VSGameUtilsKt.toWorldCoordinates(speakerPosition.level(), speakerPosition.position()); + x = worldPos.x; + y = worldPos.y; + z = worldPos.z; + } + } + + @Inject( + method = "tick", + at = @At("HEAD") + ) + private void updateWorldPos(CallbackInfo ci) { + if (this.ship != null) { + Vec3 worldPos = VSGameUtilsKt.toWorldCoordinates(speakerPosition.level(), speakerPosition.position()); + x = worldPos.x; + y = worldPos.y; + z = worldPos.z; + } + } + + @NotNull + @Override + public Vector3dc getVelocity() { + return ship != null ? ship.getVelocity() : new Vector3d(); + } +} diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/README.MD b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/README.MD index 04360e4e0..86cfc1995 100644 --- a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/README.MD +++ b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/README.MD @@ -1,6 +1,6 @@ Minimal ComputerCraft Compatibility Mixins -- MixinSpeakerPosition +- MixinSpeakerSound - Fixes Speakers on Ships not playing sounds in worldspace but in Shipyard - MixinTurtleBrain - Fails Movement if the turtle is in worldspace and the target position is a diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/create/MixinChuteBlockEntity.java b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/create/MixinChuteBlockEntity.java new file mode 100644 index 000000000..75dc5f991 --- /dev/null +++ b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/create/MixinChuteBlockEntity.java @@ -0,0 +1,63 @@ +package org.valkyrienskies.mod.fabric.mixin.compat.create; + +import com.llamalad7.mixinextras.sugar.Local; +import com.simibubi.create.content.logistics.chute.ChuteBlockEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import org.joml.Vector3d; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.valkyrienskies.core.api.ships.ServerShip; +import org.valkyrienskies.mod.common.VSGameUtilsKt; +import org.valkyrienskies.mod.mixin.mod_compat.create.accessors.ChuteBlockEntityAccessor; + +@Mixin(value = ChuteBlockEntity.class, remap = false) +public class MixinChuteBlockEntity { + + @Inject(method = "findEntities", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/phys/AABB;(Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/Vec3;)V", shift = Shift.AFTER), cancellable = true) + private void preFindEntities(float itemSpeed, CallbackInfo ci, @Local Vec3 center) { + ChuteBlockEntity be = ChuteBlockEntity.class.cast(this); + + if (be.getLevel() != null) { + + final ChuteBlockEntityAccessor bea = (ChuteBlockEntityAccessor) be; + Level level = be.getLevel(); + + BlockPos pos = be.getBlockPos(); + + AABB searchArea = new AABB(center.add(0, -bea.getBottomPullDistance() - 0.5, 0), center.add(0, -0.5, 0)).inflate(.45f); + + if (VSGameUtilsKt.getShipObjectManagingPos(level, pos) instanceof ServerShip ship) { + Vector3d searchAreaMin = new Vector3d(searchArea.minX, searchArea.minY, searchArea.minZ); + Vector3d searchAreaMax = new Vector3d(searchArea.maxX, searchArea.maxY, searchArea.maxZ); + + Vector3d searchAreaReturnMin = new Vector3d(); + Vector3d searchAreaReturnMax = new Vector3d(); + + ship.getTransform().getShipToWorld().transformAab(searchAreaMin, searchAreaMax, searchAreaReturnMin, searchAreaReturnMax); + + searchArea = new AABB(searchAreaReturnMin.x, searchAreaReturnMin.y, searchAreaReturnMin.z, searchAreaReturnMax.x, searchAreaReturnMax.y, searchAreaReturnMax.z); + + for (ItemEntity itemEntity : level.getEntitiesOfClass(ItemEntity.class, searchArea)) { + if (!itemEntity.isAlive()) + continue; + ItemStack entityItem = itemEntity.getItem(); + if (!bea.callCanAcceptItem(entityItem)) + continue; + be.setItem(entityItem.copy(), (float) (itemEntity.getBoundingBox() + .getCenter().y - be.getBlockPos().getY())); + itemEntity.discard(); + break; + } + ci.cancel(); + } + } + } +} diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/create/client/MixinTrackBlockOutline.java b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/create/client/MixinTrackBlockOutline.java new file mode 100644 index 000000000..535f54ba1 --- /dev/null +++ b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/create/client/MixinTrackBlockOutline.java @@ -0,0 +1,134 @@ +package org.valkyrienskies.mod.fabric.mixin.compat.create.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.simibubi.create.content.trains.track.TrackBlockOutline; +import com.simibubi.create.content.trains.track.TrackBlockOutline.BezierPointSelection; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import org.joml.Quaterniond; +import org.joml.Vector3d; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import org.valkyrienskies.core.api.ships.ClientShip; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSClientGameUtils; +import org.valkyrienskies.mod.common.VSGameUtilsKt; +import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; + +@Mixin(TrackBlockOutline.class) +public class MixinTrackBlockOutline { + @Unique + private static Vec3 valkyrienskies$cameraVec3; + @Unique + private static Vec3 valkyrienskies$vec; + @Unique + private static Vec3 valkyrienskies$angles; + + @Inject(method = "drawCurveSelection", + at = @At(value = "INVOKE", + target = "Lcom/simibubi/create/content/trains/track/TrackBlockOutline$BezierPointSelection;angles()Lnet/minecraft/world/phys/Vec3;"), + locals = LocalCapture.CAPTURE_FAILHARD) + private static void harvestDrawCurveSelection(final PoseStack ms, final MultiBufferSource buffer, final Vec3 camera, + final CallbackInfo ci, final Minecraft mc, + final BezierPointSelection result, final VertexConsumer vb, final Vec3 vec) { + valkyrienskies$cameraVec3 = camera; + valkyrienskies$vec = result.vec(); + valkyrienskies$angles = result.angles(); + } + @ModifyArg(method = "drawCurveSelection", + at = @At(value = "INVOKE", + target = "Lcom/simibubi/create/content/trains/track/TrackBlockOutline;renderShape(Lnet/minecraft/world/phys/shapes/VoxelShape;Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;Ljava/lang/Boolean;)V"), + index = 1) + private static PoseStack redirectTransformStackTranslate(final PoseStack ms) { + + final Level level = Minecraft.getInstance().level; + if (level != null && valkyrienskies$vec != null) { + final ClientShip ship; + if ((ship = (ClientShip) VSGameUtilsKt.getShipManagingPos(level, valkyrienskies$vec)) != null) { + final Quaterniond rotation = new Quaterniond().identity(); + final Quaterniond yawQuat = new Quaterniond().rotateY(valkyrienskies$angles.y); + final Quaterniond pitchQuat = new Quaterniond().rotateX(valkyrienskies$angles.x); + + yawQuat.mul(pitchQuat, rotation); + ship.getRenderTransform().getShipToWorldRotation().mul(rotation, rotation); + + final Vector3d worldVec = ship.getRenderTransform().getShipToWorld() + .transformPosition( + new Vector3d(valkyrienskies$vec.x, valkyrienskies$vec.y + .125, valkyrienskies$vec.z), + new Vector3d()); + + ms.popPose(); + ms.pushPose(); + ms.translate(worldVec.x - valkyrienskies$cameraVec3.x, + worldVec.y - valkyrienskies$cameraVec3.y, + worldVec.z - valkyrienskies$cameraVec3.z); + ms.mulPose(VectorConversionsMCKt.toMinecraft(rotation)); + ms.translate(-.5, -.125f, -.5); + } + } + return ms; + } + + @Unique + private static Camera valkyrienskies$info; + @Unique + private static BlockHitResult valkyrienskies$hitResult; + + @ModifyArg(method = "drawCustomBlockSelection", at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/level/border/WorldBorder;isWithinBounds(Lnet/minecraft/core/BlockPos;)Z")) + private static BlockPos modIsWithinBounds(final BlockPos blockPos) { + final Level level = Minecraft.getInstance().level; + if (level != null) { + final Ship ship; + if ((ship = VSGameUtilsKt.getShipManagingPos(level, blockPos)) != null) { + return new BlockPos(VectorConversionsMCKt.toMinecraft(ship.getShipToWorld() + .transformPosition(VectorConversionsMCKt.toJOMLD(blockPos)))); + } + } + return blockPos; + } + + @Inject(method = "drawCustomBlockSelection", + at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V")) + private static void harvest(final LevelRenderer context, final Camera info, final HitResult hitResult, + final float partialTicks, + final PoseStack ms, final MultiBufferSource buffers, final CallbackInfoReturnable cir) { + valkyrienskies$info = info; + valkyrienskies$hitResult = (BlockHitResult) hitResult; + } + + @Redirect(method = "drawCustomBlockSelection", + at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V")) + private static void redirectTranslate(final PoseStack instance, final double d, final double e, final double f) { + final Level level = Minecraft.getInstance().level; + if (level != null) { + final ClientShip ship; + if ((ship = (ClientShip) VSGameUtilsKt.getShipManagingPos(level, + valkyrienskies$hitResult.getBlockPos())) != null) { + final Vec3 camPos = valkyrienskies$info.getPosition(); + VSClientGameUtils.transformRenderWithShip(ship.getRenderTransform(), instance, + valkyrienskies$hitResult.getBlockPos(), + camPos.x, camPos.y, camPos.z); + } else { + instance.translate(d, e, f); + } + } else { + instance.translate(d, e, f); + } + } +} diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java new file mode 100644 index 000000000..3a98256bb --- /dev/null +++ b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java @@ -0,0 +1,58 @@ +package org.valkyrienskies.mod.fabric.mixin.feature.shipyard_entities; + +import java.util.function.LongPredicate; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.entity.EntitySectionStorage; +import net.minecraft.world.level.entity.PersistentEntitySectionManager; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.valkyrienskies.mod.mixinducks.world.OfLevel; + +@Mixin(PersistentEntitySectionManager.class) +public abstract class MixinPersistentEntitySectionManager implements OfLevel { + @Shadow + @Final + EntitySectionStorage sectionStorage; + + @Unique + private Level valkyrienskies$level; + + @Override + public Level getLevel() { + return valkyrienskies$level; + } + + @Override + public void setLevel(final Level level) { + this.valkyrienskies$level = level; + ((OfLevel) this.sectionStorage).setLevel(level); + } + + /** + * This fixes this function randomly crashing. I'm not sure why but the removeIf() function is buggy + */ + @ModifyArg( + method = "processUnloads", + at = @At( + target = "Lit/unimi/dsi/fastutil/longs/LongSet;removeIf(Ljava/uti l/function/LongPredicate;)Z", + value = "INVOKE" + ) + ) + private LongPredicate processUnloads_catchException( + final LongPredicate par1 + ) { + return (l) -> { + try { + return par1.test(l); + } catch (final Exception e) { + e.printStackTrace(); + return false; + } + }; + } +} diff --git a/fabric/src/main/kotlin/org/valkyrienskies/mod/fabric/compat/modmenu/ValkyrienModMenu.kt b/fabric/src/main/kotlin/org/valkyrienskies/mod/fabric/compat/modmenu/ValkyrienModMenu.kt index bdd81fbdf..9c31462e1 100644 --- a/fabric/src/main/kotlin/org/valkyrienskies/mod/fabric/compat/modmenu/ValkyrienModMenu.kt +++ b/fabric/src/main/kotlin/org/valkyrienskies/mod/fabric/compat/modmenu/ValkyrienModMenu.kt @@ -2,8 +2,7 @@ package org.valkyrienskies.mod.fabric.compat.modmenu import com.terraformersmc.modmenu.api.ConfigScreenFactory import com.terraformersmc.modmenu.api.ModMenuApi -import org.valkyrienskies.core.impl.config.VSConfigClass.Companion.getRegisteredConfig -import org.valkyrienskies.core.impl.config.VSCoreConfig +import org.valkyrienskies.core.impl.config_impl.VSCoreConfig import org.valkyrienskies.mod.common.config.VSGameConfig import org.valkyrienskies.mod.compat.clothconfig.VSClothConfig @@ -12,8 +11,8 @@ class ValkyrienModMenu : ModMenuApi { return ConfigScreenFactory { parent -> VSClothConfig.createConfigScreenFor( parent, - getRegisteredConfig(VSCoreConfig::class.java), - getRegisteredConfig(VSGameConfig::class.java) + VSCoreConfig::class.java, + VSGameConfig::class.java ) } } diff --git a/fabric/src/main/resources/valkyrienskies-fabric.mixins.json b/fabric/src/main/resources/valkyrienskies-fabric.mixins.json index c646cb2f7..de0571ea6 100644 --- a/fabric/src/main/resources/valkyrienskies-fabric.mixins.json +++ b/fabric/src/main/resources/valkyrienskies-fabric.mixins.json @@ -3,20 +3,23 @@ "package": "org.valkyrienskies.mod.fabric.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ - "compat.cc_restitched.MixinSpeakerPosition", "compat.cc_restitched.MixinTurtleBrain", "compat.cc_restitched.MixinTurtleMoveCommand", "compat.cc_restitched.MixinWirelessNetwork", "compat.create.MixinBlockBreakingKineticTileEntity", "compat.create.MixinBlocks", + "compat.create.MixinChuteBlockEntity", "compat.create.MixinControlledContraptionEntity", + "compat.create.client.MixinTrackBlockOutline", "compat.sodium.MixinRenderSectionManager", "feature.explosions.ClipContextMixin", + "feature.shipyard_entities.MixinPersistentEntitySectionManager", "world.level.block.FireMixin", "server.network.MixinServerPlayerGameMode", "server.network.MixinServerGamePacketListenerImpl" ], "client": [ + "compat.cc_restitched.MixinSpeakerSound", "compat.create.client.MixinContraptionHandlerClient", "compat.create.client.MixinContraptionRenderInfo", "compat.create.client.MixinCullingBlockEntityIterator", diff --git a/forge/build.gradle b/forge/build.gradle index c533cc67f..80d4ee261 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -51,8 +51,8 @@ configurations { } dependencies { - implementation(annotationProcessor("io.github.llamalad7:mixinextras-common:0.2.0")) - implementation(include("io.github.llamalad7:mixinextras-forge:0.2.0")) + implementation(annotationProcessor("io.github.llamalad7:mixinextras-common:0.3.5")) + implementation(include("io.github.llamalad7:mixinextras-forge:0.3.5")) forge "net.minecraftforge:forge:${rootProject.forge_version}" @@ -72,6 +72,10 @@ dependencies { modImplementation("com.jozufozu.flywheel:flywheel-forge-${minecraft_version}:${flywheel_version}") modImplementation("com.tterrag.registrate:Registrate:${registrate_version}") + // Weather2 1.18 + // modImplementation("curse.maven:weather-storms-tornadoes-237746:4426524") + modImplementation("curse.maven:coroutil-237749:5010129") + // CC Tweaked modCompileOnly("maven.modrinth:cc-tweaked:${cc_tweaked_version}") @@ -81,6 +85,9 @@ dependencies { // Modular Routers modCompileOnly("curse.maven:mr-250294:4695682") + // Mekanism + modCompileOnly ("curse.maven:mekanism-268560:4644795") + // Add Kotlin for Forge (3.12.0) forgeRuntimeLibrary("maven.modrinth:kotlin-for-forge:${kotlin_version}") diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerPosition.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerPosition.java deleted file mode 100644 index fa6304a8a..000000000 --- a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerPosition.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.valkyrienskies.mod.forge.mixin.compat.cc_tweaked; - -import dan200.computercraft.shared.peripheral.speaker.SpeakerPosition; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.Vec3; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Pseudo; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.valkyrienskies.core.api.ships.Ship; -import org.valkyrienskies.mod.common.VSGameUtilsKt; - -@Pseudo -@Mixin(SpeakerPosition.class) -public abstract class MixinSpeakerPosition { - @Shadow - public abstract Level level(); - - @Inject(method = "position", at = @At("RETURN"), remap = false, cancellable = true) - public void ValkyrienSkies2$position(final CallbackInfoReturnable cir) { - final Vec3 pos = cir.getReturnValue(); - final Ship ship = VSGameUtilsKt.getShipObjectManagingPos(level(), pos.x, pos.y, pos.z); - if (ship != null) { - cir.setReturnValue(VSGameUtilsKt.toWorldCoordinates(level(), pos)); - } - } - - @Redirect( - method = "withinDistance", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/world/phys/Vec3;distanceToSqr(Lnet/minecraft/world/phys/Vec3;)D" - ) - ) - public double ValkyrienSkies$distanceToSqr(final Vec3 instance, final Vec3 d) { - final Ship ship = VSGameUtilsKt.getShipManagingPos(level(), instance); - if (ship != null) { - return VSGameUtilsKt.squaredDistanceBetweenInclShips(level(), instance.x, instance.y, instance.z, d.x, d.y, - d.z); - } - - return instance.distanceToSqr(d); - } -} diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerSound.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerSound.java new file mode 100644 index 000000000..3a3fa4244 --- /dev/null +++ b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerSound.java @@ -0,0 +1,64 @@ +package org.valkyrienskies.mod.forge.mixin.compat.cc_tweaked; + +import dan200.computercraft.client.sound.SpeakerSound; +import dan200.computercraft.shared.peripheral.speaker.SpeakerPosition; +import net.minecraft.client.resources.sounds.AbstractSoundInstance; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import org.joml.Vector3d; +import org.joml.Vector3dc; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.client.audio.VelocityTickableSoundInstance; +import org.valkyrienskies.mod.common.VSGameUtilsKt; + +@Mixin(SpeakerSound.class) +public abstract class MixinSpeakerSound extends AbstractSoundInstance implements VelocityTickableSoundInstance { + @Unique private SpeakerPosition speakerPosition; + @Unique private Ship ship; + + protected MixinSpeakerSound(ResourceLocation arg, SoundSource arg2) { + super(arg, arg2); + } + + @Inject( + method = "setPosition", + at = @At("RETURN"), + remap = false + ) + private void isOnShip(SpeakerPosition position, CallbackInfo ci) { + this.speakerPosition = position; + this.ship = VSGameUtilsKt.getShipManagingPos(position.level(), position.position()); + if (this.ship != null) { + Vec3 worldPos = VSGameUtilsKt.toWorldCoordinates(speakerPosition.level(), speakerPosition.position()); + x = worldPos.x; + y = worldPos.y; + z = worldPos.z; + } + } + + @Inject( + method = "tick", + at = @At("HEAD") + ) + private void updateWorldPos(CallbackInfo ci) { + if (this.ship != null) { + Vec3 worldPos = VSGameUtilsKt.toWorldCoordinates(speakerPosition.level(), speakerPosition.position()); + x = worldPos.x; + y = worldPos.y; + z = worldPos.z; + } + } + + @NotNull + @Override + public Vector3dc getVelocity() { + return ship != null ? ship.getVelocity() : new Vector3d(); + } +} diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/README.MD b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/README.MD index 04360e4e0..86cfc1995 100644 --- a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/README.MD +++ b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/README.MD @@ -1,6 +1,6 @@ Minimal ComputerCraft Compatibility Mixins -- MixinSpeakerPosition +- MixinSpeakerSound - Fixes Speakers on Ships not playing sounds in worldspace but in Shipyard - MixinTurtleBrain - Fails Movement if the turtle is in worldspace and the target position is a diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/create/MixinChuteBlockEntity.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/create/MixinChuteBlockEntity.java new file mode 100644 index 000000000..21e60e3ca --- /dev/null +++ b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/create/MixinChuteBlockEntity.java @@ -0,0 +1,63 @@ +package org.valkyrienskies.mod.forge.mixin.compat.create; + +import com.llamalad7.mixinextras.sugar.Local; +import com.simibubi.create.content.logistics.chute.ChuteBlockEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import org.joml.Vector3d; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.valkyrienskies.core.api.ships.ServerShip; +import org.valkyrienskies.mod.common.VSGameUtilsKt; +import org.valkyrienskies.mod.mixin.mod_compat.create.accessors.ChuteBlockEntityAccessor; + +@Mixin(value = ChuteBlockEntity.class, remap = false) +public class MixinChuteBlockEntity { + + @Inject(method = "findEntities", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/phys/AABB;(Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/Vec3;)V", shift = Shift.AFTER), cancellable = true) + private void preFindEntities(float itemSpeed, CallbackInfo ci, @Local Vec3 center) { + ChuteBlockEntity be = ChuteBlockEntity.class.cast(this); + + if (be.getLevel() != null) { + + final ChuteBlockEntityAccessor bea = (ChuteBlockEntityAccessor) be; + Level level = be.getLevel(); + + BlockPos pos = be.getBlockPos(); + + AABB searchArea = new AABB(center.add(0, -bea.getBottomPullDistance() - 0.5, 0), center.add(0, -0.5, 0)).inflate(.45f); + + if (VSGameUtilsKt.getShipObjectManagingPos(level, pos) instanceof ServerShip ship) { + Vector3d searchAreaMin = new Vector3d(searchArea.minX, searchArea.minY, searchArea.minZ); + Vector3d searchAreaMax = new Vector3d(searchArea.maxX, searchArea.maxY, searchArea.maxZ); + + Vector3d searchAreaReturnMin = new Vector3d(); + Vector3d searchAreaReturnMax = new Vector3d(); + + ship.getTransform().getShipToWorld().transformAab(searchAreaMin, searchAreaMax, searchAreaReturnMin, searchAreaReturnMax); + + searchArea = new AABB(searchAreaReturnMin.x, searchAreaReturnMin.y, searchAreaReturnMin.z, searchAreaReturnMax.x, searchAreaReturnMax.y, searchAreaReturnMax.z); + + for (ItemEntity itemEntity : level.getEntitiesOfClass(ItemEntity.class, searchArea)) { + if (!itemEntity.isAlive()) + continue; + ItemStack entityItem = itemEntity.getItem(); + if (!bea.callCanAcceptItem(entityItem)) + continue; + be.setItem(entityItem.copy(), (float) (itemEntity.getBoundingBox() + .getCenter().y - be.getBlockPos().getY())); + itemEntity.discard(); + break; + } + ci.cancel(); + } + } + } +} diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/create/client/MixinTrackBlockOutline.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/create/client/MixinTrackBlockOutline.java new file mode 100644 index 000000000..599b00336 --- /dev/null +++ b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/create/client/MixinTrackBlockOutline.java @@ -0,0 +1,126 @@ +package org.valkyrienskies.mod.forge.mixin.compat.create.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.simibubi.create.content.trains.track.TrackBlockOutline; +import com.simibubi.create.content.trains.track.TrackBlockOutline.BezierPointSelection; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.client.event.DrawSelectionEvent; +import org.joml.Quaterniond; +import org.joml.Vector3d; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import org.valkyrienskies.core.api.ships.ClientShip; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSClientGameUtils; +import org.valkyrienskies.mod.common.VSGameUtilsKt; +import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; + +@Mixin(value = TrackBlockOutline.class, remap = false) +public class MixinTrackBlockOutline { + @Unique + private static Vec3 valkyrienskies$cameraVec3; + @Unique + private static Vec3 valkyrienskies$vec; + @Unique + private static Vec3 valkyrienskies$angles; + + @Inject(method = "drawCurveSelection", at = @At(value = "INVOKE", target = "Lcom/simibubi/create/content/trains/track/TrackBlockOutline$BezierPointSelection;angles()Lnet/minecraft/world/phys/Vec3;"), locals = LocalCapture.CAPTURE_FAILHARD) + private static void harvestDrawCurveSelection(final PoseStack ms, final MultiBufferSource buffer, final Vec3 camera, + final CallbackInfo ci, final Minecraft mc, + final BezierPointSelection result, final VertexConsumer vb, final Vec3 vec) { + valkyrienskies$cameraVec3 = camera; + valkyrienskies$vec = result.vec(); + valkyrienskies$angles = result.angles(); + } + @ModifyArg(method = "drawCurveSelection", + at = @At(value = "INVOKE", + target = "Lcom/simibubi/create/content/trains/track/TrackBlockOutline;renderShape(Lnet/minecraft/world/phys/shapes/VoxelShape;Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;Ljava/lang/Boolean;)V"), + index = 1) + private static PoseStack redirectTransformStackTranslate(final PoseStack ms) { + + final Level level = Minecraft.getInstance().level; + if (level != null && valkyrienskies$vec != null) { + final ClientShip ship; + if ((ship = (ClientShip) VSGameUtilsKt.getShipManagingPos(level, valkyrienskies$vec)) != null) { + final Quaterniond rotation = new Quaterniond().identity(); + final Quaterniond yawQuat = new Quaterniond().rotateY(valkyrienskies$angles.y); + final Quaterniond pitchQuat = new Quaterniond().rotateX(valkyrienskies$angles.x); + + yawQuat.mul(pitchQuat, rotation); + ship.getRenderTransform().getShipToWorldRotation().mul(rotation, rotation); + + final Vector3d worldVec = ship.getRenderTransform().getShipToWorld() + .transformPosition( + new Vector3d(valkyrienskies$vec.x, valkyrienskies$vec.y + .125, valkyrienskies$vec.z), + new Vector3d()); + + ms.popPose(); + ms.pushPose(); + ms.translate(worldVec.x - valkyrienskies$cameraVec3.x, + worldVec.y - valkyrienskies$cameraVec3.y, + worldVec.z - valkyrienskies$cameraVec3.z); + ms.mulPose(VectorConversionsMCKt.toMinecraft(rotation)); + ms.translate(-.5, -.125f, -.5); + } + } + return ms; + } + + @Unique + private static Camera valkyrienskies$info; + @Unique + private static BlockHitResult valkyrienskies$hitResult; + + @ModifyArg(method = "drawCustomBlockSelection", at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/level/border/WorldBorder;isWithinBounds(Lnet/minecraft/core/BlockPos;)Z")) + private static BlockPos modIsWithinBounds(final BlockPos blockPos) { + final Level level = Minecraft.getInstance().level; + if (level != null) { + final Ship ship; + if ((ship = VSGameUtilsKt.getShipManagingPos(level, blockPos)) != null) { + return new BlockPos(VectorConversionsMCKt.toMinecraft(ship.getShipToWorld() + .transformPosition(VectorConversionsMCKt.toJOMLD(blockPos)))); + } + } + return blockPos; + } + + @Inject(method = "drawCustomBlockSelection", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V")) + private static void harvest(DrawSelectionEvent.HighlightBlock event, CallbackInfo ci) { + valkyrienskies$info = event.getCamera(); + valkyrienskies$hitResult = (BlockHitResult) event.getTarget(); + } + + @Redirect(method = "drawCustomBlockSelection", + at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V")) + private static void redirectTranslate(final PoseStack instance, final double d, final double e, final double f) { + final Level level = Minecraft.getInstance().level; + if (level != null) { + final ClientShip ship; + if ((ship = (ClientShip) VSGameUtilsKt.getShipManagingPos(level, + valkyrienskies$hitResult.getBlockPos())) != null) { + final Vec3 camPos = valkyrienskies$info.getPosition(); + VSClientGameUtils.transformRenderWithShip(ship.getRenderTransform(), instance, + valkyrienskies$hitResult.getBlockPos(), + camPos.x, camPos.y, camPos.z); + } else { + instance.translate(d, e, f); + } + } else { + instance.translate(d, e, f); + } + } +} diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/mekanism/MixinRadiationManager.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/mekanism/MixinRadiationManager.java new file mode 100644 index 000000000..229a7d65f --- /dev/null +++ b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/mekanism/MixinRadiationManager.java @@ -0,0 +1,31 @@ +package org.valkyrienskies.mod.forge.mixin.compat.mekanism; + +import java.util.Objects; +import mekanism.api.Coord4D; +import mekanism.common.lib.radiation.RadiationManager; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSGameUtilsKt; +import org.valkyrienskies.mod.common.ValkyrienSkiesMod; +import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; + +@Mixin(RadiationManager.class) +public class MixinRadiationManager { + @ModifyVariable(remap = false, ordinal = 0, method = "radiate(Lmekanism/api/Coord4D;D)V", at = @At("HEAD"), argsOnly = true) + private Coord4D MixinDumpRadiation(final Coord4D coord4D) { + final ResourceKey resourceKey = coord4D.dimension; + final Level level = Objects.requireNonNull(ValkyrienSkiesMod.getCurrentServer()).getLevel(resourceKey); + final Ship ship = VSGameUtilsKt.getShipManagingPos(level, coord4D.getPos()); + if (ship == null){ + return coord4D; + }else{ + return new Coord4D(new BlockPos( + VectorConversionsMCKt.toMinecraft(VSGameUtilsKt.toWorldCoordinates(ship, coord4D.getPos()))), coord4D.dimension); + } + } +} diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java new file mode 100644 index 000000000..bda6225c3 --- /dev/null +++ b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java @@ -0,0 +1,58 @@ +package org.valkyrienskies.mod.forge.mixin.feature.shipyard_entities; + +import it.unimi.dsi.fastutil.longs.LongPredicate; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.entity.EntitySectionStorage; +import net.minecraft.world.level.entity.PersistentEntitySectionManager; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.valkyrienskies.mod.mixinducks.world.OfLevel; + +@Mixin(PersistentEntitySectionManager.class) +public abstract class MixinPersistentEntitySectionManager implements OfLevel { + @Shadow + @Final + EntitySectionStorage sectionStorage; + + @Unique + private Level valkyrienskies$level; + + @Override + public Level getLevel() { + return valkyrienskies$level; + } + + @Override + public void setLevel(final Level level) { + this.valkyrienskies$level = level; + ((OfLevel) this.sectionStorage).setLevel(level); + } + + /** + * This fixes this function randomly crashing. I'm not sure why but the removeIf() function is buggy + */ + @ModifyArg( + method = "processUnloads", + at = @At( + target = "Lit/unimi/dsi/fastutil/longs/LongSet;removeIf(Lit/unimi/dsi/fastutil/longs/LongPredicate;)Z", + value = "INVOKE" + ) + ) + private LongPredicate processUnloads_catchException( + final LongPredicate par1 + ) { + return (l) -> { + try { + return par1.test(l); + } catch (final Exception e) { + e.printStackTrace(); + return false; + } + }; + } +} diff --git a/forge/src/main/kotlin/org/valkyrienskies/mod/forge/common/ValkyrienSkiesModForge.kt b/forge/src/main/kotlin/org/valkyrienskies/mod/forge/common/ValkyrienSkiesModForge.kt index 921640ec3..0903f3d7e 100644 --- a/forge/src/main/kotlin/org/valkyrienskies/mod/forge/common/ValkyrienSkiesModForge.kt +++ b/forge/src/main/kotlin/org/valkyrienskies/mod/forge/common/ValkyrienSkiesModForge.kt @@ -26,8 +26,7 @@ import net.minecraftforge.registries.DeferredRegister import net.minecraftforge.registries.ForgeRegistries import net.minecraftforge.registries.RegistryObject import org.valkyrienskies.core.apigame.VSCoreFactory -import org.valkyrienskies.core.impl.config.VSConfigClass -import org.valkyrienskies.core.impl.config.VSCoreConfig +import org.valkyrienskies.core.impl.config_impl.VSCoreConfig import org.valkyrienskies.mod.client.EmptyRenderer import org.valkyrienskies.mod.client.VSPhysicsEntityRenderer import org.valkyrienskies.mod.common.ValkyrienSkiesMod @@ -104,8 +103,8 @@ class ValkyrienSkiesModForge { ConfigScreenHandler.ConfigScreenFactory { _, parent -> VSClothConfig.createConfigScreenFor( parent, - VSConfigClass.getRegisteredConfig(VSCoreConfig::class.java), - VSConfigClass.getRegisteredConfig(VSGameConfig::class.java) + VSCoreConfig::class.java, + VSGameConfig::class.java ) } } diff --git a/forge/src/main/resources/valkyrienskies-forge.mixins.json b/forge/src/main/resources/valkyrienskies-forge.mixins.json index de7ebfc2e..9c4d726a9 100644 --- a/forge/src/main/resources/valkyrienskies-forge.mixins.json +++ b/forge/src/main/resources/valkyrienskies-forge.mixins.json @@ -3,28 +3,33 @@ "package": "org.valkyrienskies.mod.forge.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ - "compat.cc_tweaked.MixinSpeakerPosition", "compat.cc_tweaked.MixinTurtleBrain", "compat.cc_tweaked.MixinTurtleMoveCommand", "compat.cc_tweaked.MixinWirelessNetwork", "compat.create.MixinBlockBreakingKineticTileEntity", "compat.create.MixinBlocks", + "compat.create.MixinChuteBlockEntity", "compat.create.MixinControlledContraptionEntity", "compat.immersivengineering.MixinBlockEntityInventory", + "compat.mekanism.MixinRadiationManager", + "compat.modular_routers.MixinContainerModularRouter", "compat.tfc.MixinTFCChunkGenerator", "compat.thermalexpansion.MixinTileCoFH", "compat.tis3d.MixinInfraredPacketEntity", "compat.modular_routers.MixinRouterMenu", "feature.forge_interact.MixinIForgePlayer", "feature.water_in_ships_entity.MixinEntity", + "feature.shipyard_entities.MixinPersistentEntitySectionManager", "world.level.block.FireMixin" ], "client": [ "client.render.MixinLevelRenderer", + "compat.cc_tweaked.MixinSpeakerSound", "compat.create.client.MixinContraptionHandlerClient", "compat.create.client.MixinContraptionRenderInfo", "compat.create.client.MixinFlwContraption", "compat.create.client.MixinSuperGlueSelectionHandler", + "compat.create.client.MixinTrackBlockOutline", "compat.sodium.MixinRenderSectionManager", "compat.tis3d.MixinCasingTileEntityRender", "compat.tis3d.MixinRenderContextImpl" diff --git a/gradle.properties b/gradle.properties index b34061fed..688ed12a2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,7 +26,7 @@ flywheel_version_fabric=0.6.9-6 # https://modrinth.com/mod/create-big-cannons/version/ createbigcannons_version= 0.5.2.a -vs_core_version=1.1.0+b19b27c4a4 +vs_core_version=1.1.0+cf7b0d3c5b # Prevent kotlin from autoincluding stdlib as a dependency, which breaks # gradle's composite builds (includeBuild) for some reason. We'll add it manually kotlin.stdlib.default.dependency=false