diff --git a/build.gradle b/build.gradle index 5e0c2bb..e2d3db3 100644 --- a/build.gradle +++ b/build.gradle @@ -42,6 +42,9 @@ dependencies { modImplementation "maven.modrinth:valkyrien-skies:1.20.1-fabric-2.3.0-beta.5" modImplementation "maven.modrinth:eureka:1.20.1-fabric-1.5.1-beta.3" + modImplementation "maven.modrinth:vlib:1.20.1-0.0.4-alpha+fabric" + + modImplementation "maven.modrinth:architectury-api:9.2.14+fabric" modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" modImplementation "net.fabricmc:fabric-language-kotlin:${project.fabric_kotlin_version}" diff --git a/src/main/java/ace/actually/pirates/mixin/shipPlacement/ServerWorldMixin.java b/src/main/java/ace/actually/pirates/mixin/shipPlacement/ServerWorldMixin.java deleted file mode 100644 index 88a3842..0000000 --- a/src/main/java/ace/actually/pirates/mixin/shipPlacement/ServerWorldMixin.java +++ /dev/null @@ -1,32 +0,0 @@ -package ace.actually.pirates.mixin.shipPlacement; - -import ace.actually.pirates.structures.ShipStructurePlacementHelper; -import kotlin.Triple; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.structure.StructureTemplate; -import net.minecraft.util.math.BlockPos; -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.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.function.BooleanSupplier; - -import static ace.actually.pirates.structures.ShipStructurePlacementHelper.shipQueue; - -@Mixin(ServerWorld.class) -public abstract class ServerWorldMixin { - - @Shadow public abstract ServerWorld toServerWorld(); - - @Inject(method = "tick", at = @At("HEAD")) - protected void tickMixin(BooleanSupplier shouldKeepTicking, CallbackInfo ci) { - if (!shipQueue.isEmpty()) { - Triple structureData = shipQueue.poll(); - assert structureData != null; - ShipStructurePlacementHelper.createShip(structureData.getFirst(), structureData.getSecond(), structureData.getThird()); - //System.out.println(toServerWorld().getSeaLevel()); - } - } -} diff --git a/src/main/java/ace/actually/pirates/mixin/shipPlacement/StructureTemplateManagerMixin.java b/src/main/java/ace/actually/pirates/mixin/shipPlacement/StructureTemplateManagerMixin.java deleted file mode 100644 index ef0c8af..0000000 --- a/src/main/java/ace/actually/pirates/mixin/shipPlacement/StructureTemplateManagerMixin.java +++ /dev/null @@ -1,58 +0,0 @@ -package ace.actually.pirates.mixin.shipPlacement; - -import ace.actually.pirates.structures.CanRemoveTemplate; -import net.minecraft.structure.StructureTemplate; -import net.minecraft.structure.StructureTemplateManager; -import net.minecraft.util.Identifier; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.Map; -import java.util.Optional; - -@Mixin(value = StructureTemplateManager.class) -public abstract class StructureTemplateManagerMixin implements CanRemoveTemplate { - - @Final - @Shadow - private Map> templates; - - @Shadow - protected abstract Optional loadTemplate(Identifier identifier); - - @Shadow public abstract void unloadTemplate(Identifier id); - - @Inject(method = "getTemplate", at = @At("HEAD"), cancellable = true) - public void getTemplateMixin(Identifier id, CallbackInfoReturnable> cir) { - - Optional template = this.templates.computeIfAbsent(id, this::loadTemplate); - - if (template.isPresent() && !template.get().getAuthor().contains("dirty") && id.getNamespace().equals("pirates")) { - //System.out.println(id); - if(id.getPath().startsWith("ship/")) - { - template.get().setAuthor("pirate-ship"); - } - else if(id.getPath().startsWith("flyingship/")) - { - template.get().setAuthor("flying-pirate-ship"); - } - - } - - cir.setReturnValue(template); - } - - @Override - public boolean pirates$unload(StructureTemplate template) { - Optional key = templates.entrySet().stream() - .filter(entry -> entry.getValue().isPresent() && entry.getValue().get().equals(template)) - .map(Map.Entry::getKey) - .findFirst(); - - key.ifPresent(this::unloadTemplate); - return key.isPresent(); - } -} diff --git a/src/main/java/ace/actually/pirates/mixin/shipPlacement/StructureTemplateMixin.java b/src/main/java/ace/actually/pirates/mixin/shipPlacement/StructureTemplateMixin.java deleted file mode 100644 index 679bcea..0000000 --- a/src/main/java/ace/actually/pirates/mixin/shipPlacement/StructureTemplateMixin.java +++ /dev/null @@ -1,58 +0,0 @@ -package ace.actually.pirates.mixin.shipPlacement; - -import ace.actually.pirates.structures.ShipStructurePlacementHelper; -import net.minecraft.structure.StructurePlacementData; -import net.minecraft.structure.StructureTemplate; -import net.minecraft.util.math.*; -import net.minecraft.util.math.random.Random; -import net.minecraft.world.ServerWorldAccess; -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.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.valkyrienskies.mod.common.VSGameUtilsKt; - - -@Mixin(value = StructureTemplate.class) -public abstract class StructureTemplateMixin { - - @Shadow private String author; - - @Shadow public abstract void setAuthor(String author); - - @Inject(method = "place", at = @At("HEAD"), cancellable = true) - public void placeMixin(ServerWorldAccess world, BlockPos pos, BlockPos pivot, StructurePlacementData placementData, Random random, int flags, CallbackInfoReturnable cir) { - try { - if (VSGameUtilsKt.isBlockInShipyard(world.toServerWorld(), pos)) return; - - if (this.author.contains("pirate-ship")) { - ShipStructurePlacementHelper.placeShipTemplate( - (StructureTemplate) (Object) this, - world.toServerWorld(), - pos); - - if(this.author.contains("flying")) - { - this.setAuthor("dirtyf"); - } - else - { - this.setAuthor("dirty"); - } - - cir.setReturnValue(true); - cir.cancel(); - } else if (this.author.contains("dirty")) { - cir.setReturnValue(false); - cir.cancel(); - } - } - catch (IllegalStateException ignored) - { - - } - - - } -} diff --git a/src/main/java/ace/actually/pirates/structures/CanRemoveTemplate.java b/src/main/java/ace/actually/pirates/structures/CanRemoveTemplate.java deleted file mode 100644 index bd863cc..0000000 --- a/src/main/java/ace/actually/pirates/structures/CanRemoveTemplate.java +++ /dev/null @@ -1,7 +0,0 @@ -package ace.actually.pirates.structures; - -import net.minecraft.structure.StructureTemplate; - -public interface CanRemoveTemplate { - boolean pirates$unload(StructureTemplate template); -} diff --git a/src/main/java/ace/actually/pirates/structures/ShipStructurePlacementHelper.java b/src/main/java/ace/actually/pirates/structures/ShipStructurePlacementHelper.java deleted file mode 100644 index ba700b1..0000000 --- a/src/main/java/ace/actually/pirates/structures/ShipStructurePlacementHelper.java +++ /dev/null @@ -1,91 +0,0 @@ -package ace.actually.pirates.structures; - -import ace.actually.pirates.Pirates; -import kotlin.Triple; - -import net.minecraft.server.world.ServerWorld; -import net.minecraft.structure.StructurePlacementData; -import net.minecraft.structure.StructureTemplate; -import net.minecraft.structure.StructureTemplateManager; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.random.Random; -import org.joml.Vector3i; -import org.valkyrienskies.core.api.ships.ServerShip; -import org.valkyrienskies.mod.common.VSGameUtilsKt; -import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; - -import java.util.*; -import java.util.concurrent.ArrayBlockingQueue; - - -public class ShipStructurePlacementHelper { - - public static final Queue> shipQueue = new ArrayBlockingQueue<>(12,false); - - private static final Set blacklist = new HashSet<>(); - - - - public static void placeShipTemplate(StructureTemplate structureTemplate, ServerWorld world, BlockPos centrePos) { - shipQueue.add(new Triple<>(structureTemplate, world, centrePos)); - Pirates.LOGGER.info("enqueuing template at {}", centrePos.toString()); - } - - public static void createShip (StructureTemplate structureTemplate, ServerWorld world, BlockPos blockPos) { - if (blacklist.contains(blockPos)) - { - System.out.println("Tried to spawn a ship at the same position as another!"); - return; - } - blacklist.add(blockPos); - - ServerShip newShip; - //System.out.println(structureTemplate.getAuthor()); - if(structureTemplate.getAuthor().contains("dirtyf")) - { - newShip = VSGameUtilsKt.getShipObjectWorld(world).createNewShipAtBlock( - VectorConversionsMCKt.toJOML(blockPos.up(structureTemplate.getSize().getY()/7)), - false, - 1.0, - VSGameUtilsKt.getDimensionId(world)); - } - else - { - newShip = VSGameUtilsKt.getShipObjectWorld(world).createNewShipAtBlock( - VectorConversionsMCKt.toJOML(withOceanYLevel(world, blockPos).up(structureTemplate.getSize().getY()/7)), - false, - 1.0, - VSGameUtilsKt.getDimensionId(world)); - } - - newShip.setStatic(true); - - BlockPos centerPos = VectorConversionsMCKt.toBlockPos(newShip.getChunkClaim().getCenterBlockCoordinates(VSGameUtilsKt.getYRange(world), new Vector3i())); - - StructurePlacementData structurePlacementData = new StructurePlacementData(); - structurePlacementData.setPosition(centerPos); - boolean success = structureTemplate.place(world, centerPos, centerPos, structurePlacementData, Random.create(), 2); - - Pirates.LOGGER.info("new ship id: {} mass: {}", newShip.getId(), newShip.getInertiaData().getMass()); - Pirates.LOGGER.info("Template claims to have generated successfully? {}", success); - if (newShip.getInertiaData().getMass() < 0.1 || (!Pirates.shouldEnableFlyingPirates && structureTemplate.getAuthor().contains("dirtyf"))) { - System.out.println("deleting ship"); - VSGameUtilsKt.getShipObjectWorld(world).deleteShip(newShip); - } else { - Pirates.LOGGER.info("ship created successfully."); - StructureTemplateManager manager = Objects.requireNonNull(world.getServer()).getStructureTemplateManager(); - if(((CanRemoveTemplate) manager).pirates$unload(structureTemplate)) { - Pirates.LOGGER.info("templates cleaned."); - } else { - Pirates.LOGGER.info("template cleanup failed."); - } - - - } - - } - - private static BlockPos withOceanYLevel(ServerWorld world, BlockPos source) { - return new BlockPos(source.getX(), world.getSeaLevel(), source.getZ()); - } -} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 850722d..eb3458a 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -43,6 +43,13 @@ versionRange = "*" ordering = "NONE" side = "BOTH" +[[dependencies.pirates]] +modId = "vlib" +mandatory = true +versionRange = "*" +ordering = "NONE" +side = "BOTH" + [[dependencies.pirates]] modId = "valkyrienskies" mandatory = true diff --git a/src/main/resources/data/pirates/structures/flyingship/wreckerideal.nbt b/src/main/resources/data/pirates/structures/flyingship/wreckerideal.nbt deleted file mode 100644 index 9905938..0000000 Binary files a/src/main/resources/data/pirates/structures/flyingship/wreckerideal.nbt and /dev/null differ diff --git a/src/main/resources/data/pirates/worldgen/structure/flyingship.json b/src/main/resources/data/pirates/worldgen/structure/flyingship.json deleted file mode 100644 index a371738..0000000 --- a/src/main/resources/data/pirates/worldgen/structure/flyingship.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "minecraft:jigsaw", - "biomes": "#minecraft:is_overworld", - "spawn_overrides": {}, - "terrain_adaptation": "none", - "start_pool": "pirates:flyingship", - "size": 1, - "step": "surface_structures", - "start_height": { - "absolute": 50 - }, - "project_start_to_heightmap": "WORLD_SURFACE_WG", - "max_distance_from_center": 128, - "use_expansion_hack": false -} \ No newline at end of file diff --git a/src/main/resources/data/pirates/worldgen/structure_set/flyingships.json b/src/main/resources/data/pirates/worldgen/structure_set/flyingships.json deleted file mode 100644 index 4225e6c..0000000 --- a/src/main/resources/data/pirates/worldgen/structure_set/flyingships.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "structures": [ - { - "structure": "pirates:flyingship", - "weight": 1 - } - ], - "placement": { - "type": "random_spread", - "spacing": 26, - "separation": 8, - "salt": 367452547 - } -} \ No newline at end of file diff --git a/src/main/resources/data/pirates/worldgen/template_pool/flyingship.json b/src/main/resources/data/pirates/worldgen/template_pool/flyingship.json deleted file mode 100644 index e718df5..0000000 --- a/src/main/resources/data/pirates/worldgen/template_pool/flyingship.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "pirates:ships", - "fallback": "minecraft:empty", - "elements": [ - { - "weight": 3, - "element": { - "element_type": "minecraft:single_pool_element", - "projection": "rigid", - "location": "pirates:flyingship/wreckerideal", - "processors": "minecraft:empty" - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/vlib/structure-settings/pirates.json b/src/main/resources/data/vlib/structure-settings/pirates.json new file mode 100644 index 0000000..ee7f73e --- /dev/null +++ b/src/main/resources/data/vlib/structure-settings/pirates.json @@ -0,0 +1,5 @@ +{ + "folder": "ship/", + "rename": "false", + "static": "true" +} \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index c2bd20c..dcfbcff 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -32,6 +32,7 @@ "minecraft": "1.20.1", "java": ">=17", "fabric-api": "*", - "valkyrienskies": ">=2.1.3-beta.1+a52f38bd68" + "valkyrienskies": ">=2.1.3-beta.1+a52f38bd68", + "vlib": "*" } } \ No newline at end of file diff --git a/src/main/resources/valkyrienpirates120.mixins.json b/src/main/resources/valkyrienpirates120.mixins.json index c6cddea..07cf8fa 100644 --- a/src/main/resources/valkyrienpirates120.mixins.json +++ b/src/main/resources/valkyrienpirates120.mixins.json @@ -4,10 +4,7 @@ "compatibilityLevel": "JAVA_17", "mixins": [ "compat.FallingBlockEntityMixin", - "bugfixes.SpeedMixin", - "shipPlacement.ServerWorldMixin", - "shipPlacement.StructureTemplateManagerMixin", - "shipPlacement.StructureTemplateMixin" + "bugfixes.SpeedMixin" ], "injectors": { "defaultRequire": 1