diff --git a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/buildings/IClientBuildingsManager.kt b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/buildings/IClientBuildingsManager.kt new file mode 100644 index 00000000..d7b03a3d --- /dev/null +++ b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/buildings/IClientBuildingsManager.kt @@ -0,0 +1,39 @@ +package net.remmintan.mods.minefortress.core.interfaces.buildings + +import net.minecraft.block.BlockState +import net.minecraft.entity.player.PlayerEntity +import net.minecraft.util.math.BlockPos +import net.remmintan.mods.minefortress.core.dtos.buildings.BuildingHealthRenderInfo +import net.remmintan.mods.minefortress.core.interfaces.blueprints.ProfessionType +import java.util.* + +interface IClientBuildingsManager { + + fun updateBuildings(buildings: List) + + fun getBuildingSelection(pos: BlockPos?): List + + fun isBuildingHovered(): Boolean { + return getHoveredBuilding().isPresent + } + + fun getHoveredBuildingName(): Optional { + return getHoveredBuilding().map { obj: IFortressBuilding -> obj.name } + } + + fun getHoveredBuilding(): Optional + + fun countBuildings(type: ProfessionType, level: Int): Int + + fun getBuildingHealths(): List + + fun openRepairBuildingScreen(pos: BlockPos, blocksToRepair: Map) + + fun hasRequiredBuilding(type: ProfessionType, level: Int, minCount: Int): Boolean + + fun openBuildingScreen(playerEntity: PlayerEntity) { + val hoveredBuilding = getHoveredBuilding().orElseThrow() + playerEntity.openHandledScreen(hoveredBuilding.screenHandlerFactory) + } + +} \ No newline at end of file diff --git a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/buildings/IFortressBuilding.java b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/buildings/IFortressBuilding.java index c4809d53..3d6686e9 100644 --- a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/buildings/IFortressBuilding.java +++ b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/buildings/IFortressBuilding.java @@ -2,6 +2,7 @@ import net.minecraft.block.BlockState; import net.minecraft.entity.mob.HostileEntity; +import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.util.math.BlockBox; import net.minecraft.util.math.BlockPos; import net.minecraft.world.Heightmap; @@ -15,6 +16,14 @@ public interface IFortressBuilding extends IAutomationArea { + default NamedScreenHandlerFactory getScreenHandlerFactory() { + if (this instanceof NamedScreenHandlerFactory nshf) { + return nshf; + } else { + throw new UnsupportedOperationException("This building does not have a screen handler factory"); + } + } + int getHealth(); BlockPos getStart(); diff --git a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/blueprints/buildings/IServerBuildingsManager.java b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/buildings/IServerBuildingsManager.java similarity index 89% rename from src/core/java/net/remmintan/mods/minefortress/core/interfaces/blueprints/buildings/IServerBuildingsManager.java rename to src/core/java/net/remmintan/mods/minefortress/core/interfaces/buildings/IServerBuildingsManager.java index d2b376dd..0bc94309 100644 --- a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/blueprints/buildings/IServerBuildingsManager.java +++ b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/buildings/IServerBuildingsManager.java @@ -1,4 +1,4 @@ -package net.remmintan.mods.minefortress.core.interfaces.blueprints.buildings; +package net.remmintan.mods.minefortress.core.interfaces.buildings; import net.minecraft.block.BlockState; import net.minecraft.entity.mob.HostileEntity; @@ -6,7 +6,6 @@ import net.minecraft.util.math.BlockPos; import net.remmintan.mods.minefortress.core.dtos.buildings.BlueprintMetadata; import net.remmintan.mods.minefortress.core.interfaces.blueprints.ProfessionType; -import net.remmintan.mods.minefortress.core.interfaces.buildings.IFortressBuilding; import net.remmintan.mods.minefortress.core.interfaces.server.IServerManager; import net.remmintan.mods.minefortress.core.interfaces.server.ITickableManager; import net.remmintan.mods.minefortress.core.interfaces.server.IWritableManager; diff --git a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/client/IClientFortressManager.java b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/client/IClientFortressManager.java index cd635667..636b3a7c 100644 --- a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/client/IClientFortressManager.java +++ b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/client/IClientFortressManager.java @@ -1,15 +1,11 @@ package net.remmintan.mods.minefortress.core.interfaces.client; import net.minecraft.block.Block; -import net.minecraft.block.BlockState; import net.minecraft.client.MinecraftClient; import net.minecraft.util.math.BlockPos; import net.remmintan.mods.minefortress.core.FortressGamemode; import net.remmintan.mods.minefortress.core.FortressState; -import net.remmintan.mods.minefortress.core.dtos.buildings.BuildingHealthRenderInfo; import net.remmintan.mods.minefortress.core.interfaces.IFortressManager; -import net.remmintan.mods.minefortress.core.interfaces.blueprints.ProfessionType; -import net.remmintan.mods.minefortress.core.interfaces.buildings.IFortressBuilding; import net.remmintan.mods.minefortress.core.interfaces.combat.IClientFightManager; import net.remmintan.mods.minefortress.core.interfaces.professions.IClientProfessionManager; import net.remmintan.mods.minefortress.core.interfaces.professions.IHireInfo; @@ -17,14 +13,11 @@ import java.util.List; import java.util.Map; -import java.util.Optional; public interface IClientFortressManager extends IFortressManager { void jumpToCampfire(); - void updateBuildings(List buildings); - void setSpecialBlocks(Map> specialBlocks, Map> blueprintSpecialBlocks); void open_HireScreen(MinecraftClient client, String screenName, Map professions, List additionalInfo); @@ -48,18 +41,8 @@ void sync( void setupFortressCenter(BlockPos pos); - List getBuildingSelection(BlockPos pos); - - boolean isBuildingHovered(); - - Optional getHoveredBuilding(); - - Optional getHoveredBuildingName(); - IClientProfessionManager getProfessionManager(); - int countBuildings(ProfessionType type, int level); - boolean gamemodeNeedsInitialization(); boolean isSurvival(); @@ -75,9 +58,5 @@ void sync( FortressState getState(); - List getBuildingHealths(); - - void openRepairBuildingScreen(BlockPos pos, Map blocksToRepair); - IClientResourceManager getResourceManager(); } diff --git a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/client/IClientManagersProvider.java b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/client/IClientManagersProvider.java index b2a7f13c..3805351a 100644 --- a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/client/IClientManagersProvider.java +++ b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/client/IClientManagersProvider.java @@ -1,6 +1,7 @@ package net.remmintan.mods.minefortress.core.interfaces.client; import net.remmintan.mods.minefortress.core.interfaces.blueprints.IClientBlueprintManager; +import net.remmintan.mods.minefortress.core.interfaces.buildings.IClientBuildingsManager; import net.remmintan.mods.minefortress.core.interfaces.combat.IClientPawnsSelectionManager; import net.remmintan.mods.minefortress.core.interfaces.combat.ITargetedSelectionManager; import net.remmintan.mods.minefortress.core.interfaces.selections.ISelectionManager; @@ -12,6 +13,8 @@ public interface IClientManagersProvider { IClientBlueprintManager get_BlueprintManager(); IClientFortressManager get_ClientFortressManager(); IClientPawnsSelectionManager get_PawnsSelectionManager(); + + IClientBuildingsManager get_BuildingsManager(); default ISelectedColonistProvider getSelectedColonistProvider() { final var pawnsSelectionManager = get_PawnsSelectionManager(); if (pawnsSelectionManager instanceof ISelectedColonistProvider) { diff --git a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/server/IServerManagersProvider.java b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/server/IServerManagersProvider.java index 4ffabc9a..13652f34 100644 --- a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/server/IServerManagersProvider.java +++ b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/server/IServerManagersProvider.java @@ -3,7 +3,7 @@ import net.minecraft.entity.LivingEntity; import net.remmintan.mods.minefortress.core.interfaces.automation.server.IServerAutomationAreaManager; import net.remmintan.mods.minefortress.core.interfaces.blueprints.IServerBlueprintManager; -import net.remmintan.mods.minefortress.core.interfaces.blueprints.buildings.IServerBuildingsManager; +import net.remmintan.mods.minefortress.core.interfaces.buildings.IServerBuildingsManager; import net.remmintan.mods.minefortress.core.interfaces.combat.IServerFightManager; import net.remmintan.mods.minefortress.core.interfaces.professions.IServerProfessionsManager; import net.remmintan.mods.minefortress.core.interfaces.resources.IServerResourceManager; diff --git a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/IInstantTask.kt b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/IInstantTask.kt index f049b08a..32b4898b 100644 --- a/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/IInstantTask.kt +++ b/src/core/java/net/remmintan/mods/minefortress/core/interfaces/tasks/IInstantTask.kt @@ -3,7 +3,7 @@ package net.remmintan.mods.minefortress.core.interfaces.tasks import net.minecraft.server.network.ServerPlayerEntity import net.minecraft.server.world.ServerWorld import net.minecraft.util.math.BlockPos -import net.remmintan.mods.minefortress.core.interfaces.blueprints.buildings.IServerBuildingsManager +import net.remmintan.mods.minefortress.core.interfaces.buildings.IServerBuildingsManager interface IInstantTask { diff --git a/src/gui/kotlin/net/remmintan/mods/minefortress/gui/BuildingScreenHandler.kt b/src/gui/kotlin/net/remmintan/mods/minefortress/gui/BuildingScreenHandler.kt index a2e1e672..cebc76ea 100644 --- a/src/gui/kotlin/net/remmintan/mods/minefortress/gui/BuildingScreenHandler.kt +++ b/src/gui/kotlin/net/remmintan/mods/minefortress/gui/BuildingScreenHandler.kt @@ -5,7 +5,7 @@ import net.minecraft.inventory.Inventory import net.minecraft.item.ItemStack import net.minecraft.screen.ScreenHandler -class BuildingScreenHandler(syncId: Int, inventory: Inventory?) : ScreenHandler(BUILDING_SCREEN_HANDLER_TYPE, syncId) { +class BuildingScreenHandler(syncId: Int, _inventory: Inventory?) : ScreenHandler(BUILDING_SCREEN_HANDLER_TYPE, syncId) { override fun quickMove(player: PlayerEntity?, slot: Int): ItemStack { TODO("Not implemented") diff --git a/src/main/java/org/minefortress/controls/MouseEvents.java b/src/main/java/org/minefortress/controls/MouseEvents.java index 0326b7bb..8b4270dc 100644 --- a/src/main/java/org/minefortress/controls/MouseEvents.java +++ b/src/main/java/org/minefortress/controls/MouseEvents.java @@ -38,7 +38,7 @@ private static void firePressEvent(double mouseX, double mouseY) { final var fortressManager = ModUtils.getFortressClientManager(); final var state = fortressManager.getState(); final var correctState = state == FortressState.COMBAT || state == FortressState.BUILD_SELECTION; - final var noBuildingHovered = ModUtils.getFortressClientManager().getHoveredBuilding().isEmpty(); + final var noBuildingHovered = !ModUtils.getBuildingsManager().isBuildingHovered(); final var noScreenOpened = MinecraftClient.getInstance().currentScreen == null; final var hudNotHovered = !ModUtils.getFortressClient().get_FortressHud().isHovered(); diff --git a/src/main/java/org/minefortress/entity/ai/goal/BuildingAttackerTargetGoal.java b/src/main/java/org/minefortress/entity/ai/goal/BuildingAttackerTargetGoal.java index 21c5694c..bd9b08bf 100644 --- a/src/main/java/org/minefortress/entity/ai/goal/BuildingAttackerTargetGoal.java +++ b/src/main/java/org/minefortress/entity/ai/goal/BuildingAttackerTargetGoal.java @@ -2,7 +2,7 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.ai.goal.TrackTargetGoal; -import net.remmintan.mods.minefortress.core.interfaces.blueprints.buildings.IServerBuildingsManager; +import net.remmintan.mods.minefortress.core.interfaces.buildings.IServerBuildingsManager; import net.remmintan.mods.minefortress.core.interfaces.server.IServerManagersProvider; import org.minefortress.entity.Colonist; diff --git a/src/main/java/org/minefortress/entity/ai/goal/SleepOnTheBedGoal.java b/src/main/java/org/minefortress/entity/ai/goal/SleepOnTheBedGoal.java index 8cbd8ec7..aacb244a 100644 --- a/src/main/java/org/minefortress/entity/ai/goal/SleepOnTheBedGoal.java +++ b/src/main/java/org/minefortress/entity/ai/goal/SleepOnTheBedGoal.java @@ -3,7 +3,7 @@ import net.minecraft.block.BedBlock; import net.minecraft.registry.tag.BlockTags; import net.minecraft.util.math.BlockPos; -import net.remmintan.mods.minefortress.core.interfaces.blueprints.buildings.IServerBuildingsManager; +import net.remmintan.mods.minefortress.core.interfaces.buildings.IServerBuildingsManager; import net.remmintan.mods.minefortress.core.interfaces.server.IServerFortressManager; import net.remmintan.mods.minefortress.core.interfaces.server.IServerManagersProvider; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/org/minefortress/fortress/ClientFortressManager.java b/src/main/java/org/minefortress/fortress/ClientFortressManager.java index 5eb5da4d..e61bda12 100644 --- a/src/main/java/org/minefortress/fortress/ClientFortressManager.java +++ b/src/main/java/org/minefortress/fortress/ClientFortressManager.java @@ -1,15 +1,11 @@ package org.minefortress.fortress; import net.minecraft.block.Block; -import net.minecraft.block.BlockState; import net.minecraft.client.MinecraftClient; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; import net.remmintan.mods.minefortress.core.FortressGamemode; import net.remmintan.mods.minefortress.core.FortressState; -import net.remmintan.mods.minefortress.core.dtos.buildings.BuildingHealthRenderInfo; import net.remmintan.mods.minefortress.core.interfaces.blueprints.ProfessionType; -import net.remmintan.mods.minefortress.core.interfaces.buildings.IFortressBuilding; import net.remmintan.mods.minefortress.core.interfaces.client.IClientFortressManager; import net.remmintan.mods.minefortress.core.interfaces.client.IClientManagersProvider; import net.remmintan.mods.minefortress.core.interfaces.client.IHoveredBlockProvider; @@ -22,20 +18,17 @@ import net.remmintan.mods.minefortress.networking.c2s.ServerboundSetGamemodePacket; import net.remmintan.mods.minefortress.networking.helpers.FortressChannelNames; import net.remmintan.mods.minefortress.networking.helpers.FortressClientNetworkHelper; -import org.minefortress.MineFortressMod; import org.minefortress.fight.ClientFightManager; import org.minefortress.fortress.resources.client.ClientResourceManagerImpl; import org.minefortress.professions.ClientProfessionManager; import org.minefortress.professions.hire.ClientHireHandler; -import org.minefortress.renderer.gui.fortress.RepairBuildingScreen; import org.minefortress.renderer.gui.hire.HirePawnScreen; -import org.minefortress.utils.BlockUtils; import org.minefortress.utils.ModUtils; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public final class ClientFortressManager implements IClientFortressManager { @@ -49,9 +42,6 @@ public final class ClientFortressManager implements IClientFortressManager { private int colonistsCount = 0; private int reservedColonistCount = 0; - private IFortressBuilding hoveredBuilding = null; - - private List buildings = new ArrayList<>(); private Map> specialBlocks = new HashMap<>(); private Map> blueprintsSpecialBlocks = new HashMap<>(); @@ -74,10 +64,6 @@ public void jumpToCampfire() { FortressClientNetworkHelper.send(C2SJumpToCampfire.CHANNEL, packet); } - @Override - public void updateBuildings(List buildings) { - this.buildings = buildings; - } @Override public void setSpecialBlocks(Map> specialBlocks, Map> blueprintSpecialBlocks) { @@ -109,23 +95,11 @@ public void sync( @Override public void tick(IHoveredBlockProvider fortressClient) { - final MinecraftClient client = (MinecraftClient) fortressClient; - if( - client.world == null || - client.interactionManager == null || - client.interactionManager.getCurrentGameMode() != MineFortressMod.FORTRESS - ) { - hoveredBuilding = null; - return; - } - if(!initialized) return; + if (!initialized) return; - if (state != FortressState.BUILD_EDITING && state != FortressState.BUILD_SELECTION) { - hoveredBuilding = null; - } resetBuildEditState(); - if(isCenterNotSet()) { + if (isCenterNotSet()) { final var blueprintManager = CoreModUtils.getMineFortressManagersProvider().get_BlueprintManager(); if (!blueprintManager.isSelecting()) { blueprintManager.select("campfire"); @@ -139,7 +113,7 @@ public void tick(IHoveredBlockProvider fortressClient) { } private void resetBuildEditState() { - if(this.state == FortressState.BUILD_EDITING && !CoreModUtils.getMineFortressManagersProvider().get_PawnsSelectionManager().hasSelected()) { + if (this.state == FortressState.BUILD_EDITING && !CoreModUtils.getMineFortressManagersProvider().get_PawnsSelectionManager().hasSelected()) { this.state = FortressState.BUILD_SELECTION; } } @@ -168,44 +142,10 @@ public boolean isCenterNotSet() { @Override public void setupFortressCenter(BlockPos pos) { - if(fortressCenter!=null) throw new IllegalStateException("Fortress center already set"); + if (fortressCenter != null) throw new IllegalStateException("Fortress center already set"); fortressCenter = pos; } - @Override - public List getBuildingSelection(BlockPos pos) { - for (BlockPos buildingPos : buildings) { - final var buildingOpt = getBuilding(buildingPos); - if (buildingOpt.isEmpty()) continue; - final var building = buildingOpt.get(); - final BlockPos start = building.getStart(); - final BlockPos end = building.getEnd(); - if(BlockUtils.isPosBetween(pos, start, end)){ - hoveredBuilding = building; - return StreamSupport - .stream(BlockPos.iterate(start, end).spliterator(), false) - .map(BlockPos::toImmutable) - .collect(Collectors.toList()); - } - } - hoveredBuilding = null; - return Collections.emptyList(); - } - - @Override - public boolean isBuildingHovered() { - return hoveredBuilding != null; - } - - @Override - public Optional getHoveredBuilding() { - return Optional.ofNullable(hoveredBuilding); - } - - @Override - public Optional getHoveredBuildingName() { - return getHoveredBuilding().map(IFortressBuilding::getName); - } @Override public IClientProfessionManager getProfessionManager() { @@ -214,50 +154,13 @@ public IClientProfessionManager getProfessionManager() { @Override public boolean hasRequiredBuilding(ProfessionType type, int level, int minCount) { - final var requiredBuilding = getBuildingsStream() - .filter(b -> b.satisfiesRequirement(type, level)); - if (type == ProfessionType.MINER || - type == ProfessionType.LUMBERJACK || - type == ProfessionType.WARRIOR) { - return requiredBuilding - .mapToLong(it -> it.getBedsCount() * 10L) - .sum() > minCount; - } - final var count = requiredBuilding.count(); - if (type == ProfessionType.ARCHER) - return count * 10 > minCount; - - if (type == ProfessionType.FARMER) - return count * 5 > minCount; - - if (type == ProfessionType.FISHERMAN) - return count * 3 > minCount; - - return count > minCount; + return ModUtils.getBuildingsManager().hasRequiredBuilding(type, level, minCount); } - @Override - public int countBuildings(ProfessionType type, int level) { - return (int) getBuildingsStream() - .filter(b -> b.satisfiesRequirement(type, level)) - .count(); - } - - private Optional getBuilding(BlockPos pos) { - final var blockEntity = MinecraftClient.getInstance().world.getBlockEntity(pos); - return blockEntity instanceof IFortressBuilding b ? Optional.of(b) : Optional.empty(); - } - - private Stream getBuildingsStream() { - return buildings.stream() - .map(this::getBuilding) - .filter(Optional::isPresent) - .map(Optional::get); - } @Override public boolean hasRequiredBlock(Block block, boolean blueprint, int minCount) { - if(blueprint) + if (blueprint) return this.blueprintsSpecialBlocks.getOrDefault(block, Collections.emptyList()).size() > minCount; else return this.specialBlocks.getOrDefault(block, Collections.emptyList()).size() > minCount; @@ -270,8 +173,8 @@ public int getTotalColonistsCount() { @Override public void setGamemode(FortressGamemode gamemode) { - if(gamemode == null) throw new IllegalArgumentException("Gamemode cannot be null"); - if(gamemode == FortressGamemode.NONE) throw new IllegalArgumentException("Gamemode cannot be NONE"); + if (gamemode == null) throw new IllegalArgumentException("Gamemode cannot be null"); + if (gamemode == FortressGamemode.NONE) throw new IllegalArgumentException("Gamemode cannot be NONE"); final ServerboundSetGamemodePacket serverboundSetGamemodePacket = new ServerboundSetGamemodePacket(gamemode); FortressClientNetworkHelper.send(FortressChannelNames.FORTRESS_SET_GAMEMODE, serverboundSetGamemodePacket); } @@ -314,10 +217,10 @@ public void reset() { @Override public void setState(FortressState state) { this.state = state; - if(state == FortressState.AREAS_SELECTION) { + if (state == FortressState.AREAS_SELECTION) { ModUtils.getAreasClientManager().getSavedAreasHolder().setNeedRebuild(true); } - if(state == FortressState.BUILD_SELECTION || state == FortressState.BUILD_EDITING) { + if (state == FortressState.BUILD_SELECTION || state == FortressState.BUILD_EDITING) { CoreModUtils.getClientTasksHolder().ifPresent(it -> it.setNeedRebuild(true)); } } @@ -327,37 +230,5 @@ public FortressState getState() { return this.state; } - @Override - public List getBuildingHealths() { - return switch (this.getState()) { - case COMBAT -> getBuildingsStream() - .filter(it -> it.getHealth() < 100) - .map(this::buildingToHealthRenderInfo) - .toList(); - case BUILD_SELECTION, BUILD_EDITING -> getBuildingsStream() - .filter(it -> it.getHealth() < 33) - .map(this::buildingToHealthRenderInfo) - .toList(); - default -> Collections.emptyList(); - }; - } - - private BuildingHealthRenderInfo buildingToHealthRenderInfo(IFortressBuilding buildingInfo) { - final var start = buildingInfo.getStart(); - final var end = buildingInfo.getEnd(); - - final var maxY = Math.max(start.getY(), end.getY()); - final var centerX = (start.getX() + end.getX()) / 2; - final var centerZ = (start.getZ() + end.getZ()) / 2; - - final var center = new Vec3d(centerX, maxY, centerZ); - final var health = buildingInfo.getHealth(); - return new BuildingHealthRenderInfo(center, health); - } - - @Override - public void openRepairBuildingScreen(BlockPos pos, Map blocksToRepair) { - MinecraftClient.getInstance().setScreen(new RepairBuildingScreen(pos, blocksToRepair, resourceManager)); - } } diff --git a/src/main/java/org/minefortress/fortress/ServerFortressManager.java b/src/main/java/org/minefortress/fortress/ServerFortressManager.java index b30d54f5..41238544 100644 --- a/src/main/java/org/minefortress/fortress/ServerFortressManager.java +++ b/src/main/java/org/minefortress/fortress/ServerFortressManager.java @@ -31,7 +31,7 @@ import net.remmintan.mods.minefortress.core.interfaces.automation.server.IServerAutomationAreaManager; import net.remmintan.mods.minefortress.core.interfaces.blueprints.IServerBlueprintManager; import net.remmintan.mods.minefortress.core.interfaces.blueprints.ProfessionType; -import net.remmintan.mods.minefortress.core.interfaces.blueprints.buildings.IServerBuildingsManager; +import net.remmintan.mods.minefortress.core.interfaces.buildings.IServerBuildingsManager; import net.remmintan.mods.minefortress.core.interfaces.combat.IServerFightManager; import net.remmintan.mods.minefortress.core.interfaces.entities.IPawnNameGenerator; import net.remmintan.mods.minefortress.core.interfaces.entities.pawns.IFortressAwareEntity; diff --git a/src/main/java/org/minefortress/fortress/buildings/ClientBuildingManager.kt b/src/main/java/org/minefortress/fortress/buildings/ClientBuildingManager.kt new file mode 100644 index 00000000..592f4149 --- /dev/null +++ b/src/main/java/org/minefortress/fortress/buildings/ClientBuildingManager.kt @@ -0,0 +1,125 @@ +package org.minefortress.fortress.buildings + +import net.minecraft.block.BlockState +import net.minecraft.client.MinecraftClient +import net.minecraft.util.math.BlockPos +import net.minecraft.util.math.Vec3d +import net.remmintan.mods.minefortress.core.FortressState.* +import net.remmintan.mods.minefortress.core.dtos.buildings.BuildingHealthRenderInfo +import net.remmintan.mods.minefortress.core.interfaces.blueprints.ProfessionType +import net.remmintan.mods.minefortress.core.interfaces.buildings.IClientBuildingsManager +import net.remmintan.mods.minefortress.core.interfaces.buildings.IFortressBuilding +import org.minefortress.renderer.gui.fortress.RepairBuildingScreen +import org.minefortress.utils.BlockUtils +import org.minefortress.utils.ModUtils +import java.util.* +import java.util.stream.Collectors +import java.util.stream.Stream +import java.util.stream.StreamSupport +import kotlin.math.max + +class ClientBuildingManager : IClientBuildingsManager { + + private var buildings: List = emptyList() + private var hoveredBuilding: IFortressBuilding? = null + + override fun updateBuildings(buildings: List) { + this.buildings = buildings + } + + override fun getBuildingSelection(pos: BlockPos?): List { + for (buildingPos in buildings) { + val buildingOpt: Optional = getBuilding(buildingPos) + if (buildingOpt.isEmpty) continue + val building = buildingOpt.get() + val start = building.start + val end = building.end + if (BlockUtils.isPosBetween(pos, start, end)) { + hoveredBuilding = building + return StreamSupport + .stream(BlockPos.iterate(start, end).spliterator(), false) + .map { obj: BlockPos -> obj.toImmutable() } + .collect(Collectors.toList()) + } + } + hoveredBuilding = null + return emptyList() + } + + override fun getHoveredBuilding(): Optional { + return Optional.ofNullable(hoveredBuilding) + } + + override fun countBuildings(type: ProfessionType, level: Int): Int { + return getBuildingsStream() + .filter { it.satisfiesRequirement(type, level) } + .count() + .toInt() + } + + private fun getBuilding(pos: BlockPos): Optional { + val blockEntity = MinecraftClient.getInstance().world?.getBlockEntity(pos) + return if (blockEntity is IFortressBuilding) Optional.of(blockEntity) else Optional.empty() + } + + override fun getBuildingHealths(): List { + + return when (ModUtils.getFortressClientManager().state) { + COMBAT -> getBuildingsStream() + .filter { it.health < 100 } + .map { buildingToHealthRenderInfo(it) } + .toList() + + BUILD_SELECTION, BUILD_EDITING -> getBuildingsStream() + .filter { it.health < 33 } + .map { buildingToHealthRenderInfo(it) } + .toList() + + else -> emptyList() + } + } + + override fun openRepairBuildingScreen(pos: BlockPos, blocksToRepair: Map) { + val resourceManager = ModUtils.getFortressClientManager().resourceManager + MinecraftClient.getInstance().setScreen(RepairBuildingScreen(pos, blocksToRepair, resourceManager)) + } + + override fun hasRequiredBuilding(type: ProfessionType, level: Int, minCount: Int): Boolean { + val requiredBuilding = getBuildingsStream().filter { b -> b.satisfiesRequirement(type, level) } + if (type == ProfessionType.MINER || type == ProfessionType.LUMBERJACK || type == ProfessionType.WARRIOR) { + return requiredBuilding + .mapToLong { it.getBedsCount() * 10L } + .sum() > minCount + } + val count = requiredBuilding.count() + + return when (type) { + ProfessionType.ARCHER -> count * 10 + ProfessionType.FARMER -> count * 5 + ProfessionType.FISHERMAN -> count * 3 + else -> count + } > minCount + } + + private fun buildingToHealthRenderInfo(buildingInfo: IFortressBuilding): BuildingHealthRenderInfo { + val start = buildingInfo.start + val end = buildingInfo.end + + val maxY = max(start.y.toDouble(), end.y.toDouble()).toInt() + val centerX = (start.x + end.x) / 2 + val centerZ = (start.z + end.z) / 2 + + val center = Vec3d(centerX.toDouble(), maxY.toDouble(), centerZ.toDouble()) + val health = buildingInfo.health + + return BuildingHealthRenderInfo(center, health) + } + + private fun getBuildingsStream(): Stream { + return buildings.stream() + .map { getBuilding(it) } + .filter { it.isPresent } + .map { it.get() } + } + +} \ No newline at end of file diff --git a/src/main/java/org/minefortress/fortress/buildings/FortressBuildingManager.java b/src/main/java/org/minefortress/fortress/buildings/FortressBuildingManager.java index a3086947..15256821 100644 --- a/src/main/java/org/minefortress/fortress/buildings/FortressBuildingManager.java +++ b/src/main/java/org/minefortress/fortress/buildings/FortressBuildingManager.java @@ -16,8 +16,8 @@ import net.remmintan.mods.minefortress.core.interfaces.automation.IAutomationAreaProvider; import net.remmintan.mods.minefortress.core.interfaces.automation.area.IAutomationArea; import net.remmintan.mods.minefortress.core.interfaces.blueprints.ProfessionType; -import net.remmintan.mods.minefortress.core.interfaces.blueprints.buildings.IServerBuildingsManager; import net.remmintan.mods.minefortress.core.interfaces.buildings.IFortressBuilding; +import net.remmintan.mods.minefortress.core.interfaces.buildings.IServerBuildingsManager; import net.remmintan.mods.minefortress.core.interfaces.server.IServerFortressManager; import net.remmintan.mods.minefortress.core.interfaces.server.ITickableManager; import net.remmintan.mods.minefortress.core.interfaces.server.IWritableManager; diff --git a/src/main/java/org/minefortress/mixins/FortressMinecraftClientMixin.java b/src/main/java/org/minefortress/mixins/FortressMinecraftClientMixin.java index 95cc269f..62a1bbdf 100644 --- a/src/main/java/org/minefortress/mixins/FortressMinecraftClientMixin.java +++ b/src/main/java/org/minefortress/mixins/FortressMinecraftClientMixin.java @@ -22,6 +22,7 @@ import net.remmintan.mods.minefortress.core.FortressState; import net.remmintan.mods.minefortress.core.interfaces.blueprints.IBlockDataProvider; import net.remmintan.mods.minefortress.core.interfaces.blueprints.world.BlueprintsDimensionUtilsKt; +import net.remmintan.mods.minefortress.core.interfaces.buildings.IClientBuildingsManager; import net.remmintan.mods.minefortress.core.interfaces.client.IClientManagersProvider; import net.remmintan.mods.minefortress.core.interfaces.combat.IClientPawnsSelectionManager; import net.remmintan.mods.minefortress.core.interfaces.selections.ISelectionInfoProvider; @@ -41,6 +42,7 @@ import org.minefortress.fight.ClientPawnsSelectionManager; import org.minefortress.fortress.ClientFortressManager; import org.minefortress.fortress.automation.areas.AreasClientManager; +import org.minefortress.fortress.buildings.ClientBuildingManager; import org.minefortress.interfaces.IFortressMinecraftClient; import org.minefortress.renderer.gui.blueprints.BlueprintsPauseScreen; import org.minefortress.renderer.gui.hud.FortressHud; @@ -82,6 +84,8 @@ public abstract class FortressMinecraftClientMixin extends ReentrantThreadExecut private AreasClientManager areasClientManager; @Unique private final IClientPawnsSelectionManager pawnsSelectionManager = new ClientPawnsSelectionManager(); + @Unique + private final IClientBuildingsManager buildingsManager = new ClientBuildingManager(); @Shadow @Final @@ -277,10 +281,16 @@ public AreasClientManager get_AreasClientManager() { return this.areasClientManager; } + @Override public IClientPawnsSelectionManager get_PawnsSelectionManager() { return pawnsSelectionManager; } + @Override + public IClientBuildingsManager get_BuildingsManager() { + return buildingsManager; + } + @Inject(method = "close", at = @At("HEAD")) public void close(CallbackInfo ci) { this.blueprintRenderer.close(); diff --git a/src/main/java/org/minefortress/mixins/interaction/FortressClientInteractionManagerMixin.java b/src/main/java/org/minefortress/mixins/interaction/FortressClientInteractionManagerMixin.java index a0b878e5..7d4e866f 100644 --- a/src/main/java/org/minefortress/mixins/interaction/FortressClientInteractionManagerMixin.java +++ b/src/main/java/org/minefortress/mixins/interaction/FortressClientInteractionManagerMixin.java @@ -13,7 +13,6 @@ import net.minecraft.util.math.Direction; import net.minecraft.world.GameMode; import net.remmintan.mods.minefortress.core.FortressState; -import net.remmintan.mods.minefortress.core.interfaces.client.IClientFortressManager; import net.remmintan.mods.minefortress.core.interfaces.client.IClientManagersProvider; import org.minefortress.MineFortressMod; import org.minefortress.utils.ModUtils; @@ -67,27 +66,27 @@ public void setGameMode(GameMode gameMode, CallbackInfo ci) { @Inject(method = "attackBlock", at = @At("HEAD"), cancellable = true) public void attackBlock(BlockPos pos, Direction direction, CallbackInfoReturnable cir) { if(!ModUtils.isClientInFortressGamemode()) return; - final var fortressClient = (IClientManagersProvider) this.client; - final var clientBlueprintManager = fortressClient.get_BlueprintManager(); - final var manager = fortressClient.get_ClientFortressManager(); + final var clientBlueprintManager = ModUtils.getBlueprintManager(); + final var fortressManager = ModUtils.getFortressClientManager(); + final var buildingsManager = ModUtils.getBuildingsManager(); - if(manager.isCenterNotSet()) { + if (fortressManager.isCenterNotSet()) { cir.setReturnValue(false); return; } - if(manager.isBuildingHovered()) { - openManageBuildingMenu(manager); + if (buildingsManager.isBuildingHovered()) { + buildingsManager.openBuildingScreen(this.client.player); cir.setReturnValue(false); return; } - if(manager.getState() == FortressState.BUILD_SELECTION) { + if (fortressManager.getState() == FortressState.BUILD_SELECTION) { cir.setReturnValue(false); return; } - if(manager.getState() == FortressState.AREAS_SELECTION) { + if (fortressManager.getState() == FortressState.AREAS_SELECTION) { final var areasClientManager = ModUtils.getAreasClientManager(); areasClientManager.select(client.crosshairTarget); cir.setReturnValue(false); @@ -100,21 +99,10 @@ public void attackBlock(BlockPos pos, Direction direction, CallbackInfoReturnabl return; } - fortressClient.get_SelectionManager().selectBlock(pos); + ModUtils.getSelectionManager().selectBlock(pos); cir.setReturnValue(false); } - @Unique - private static void openManageBuildingMenu(IClientFortressManager fortressManager) { - fortressManager - .getHoveredBuilding() - .ifPresent(it -> { - // TODO: open the new building screen -// final var manageBuildingScreen = new ManageBuildingScreen(it); -// MinecraftClient.getInstance().setScreen(manageBuildingScreen); - }); - } - @Inject(method = "updateBlockBreakingProgress", at = @At("HEAD"), cancellable = true) public void updateBlockBreakingProgress(BlockPos pos, Direction direction, CallbackInfoReturnable cir) { if(ModUtils.isClientInFortressGamemode()) diff --git a/src/main/java/org/minefortress/mixins/renderer/FortressWorldRendererMixin.java b/src/main/java/org/minefortress/mixins/renderer/FortressWorldRendererMixin.java index 6436ef43..2979c5f5 100644 --- a/src/main/java/org/minefortress/mixins/renderer/FortressWorldRendererMixin.java +++ b/src/main/java/org/minefortress/mixins/renderer/FortressWorldRendererMixin.java @@ -15,7 +15,6 @@ import net.minecraft.util.math.Vec3d; import net.remmintan.mods.minefortress.core.FortressState; import net.remmintan.mods.minefortress.core.interfaces.client.IClientManagersProvider; -import net.remmintan.mods.minefortress.core.utils.CoreModUtils; import org.joml.Matrix4f; import org.joml.Vector4f; import org.minefortress.interfaces.IFortressMinecraftClient; @@ -47,7 +46,7 @@ public void init(MinecraftClient client, EntityRenderDispatcher entityRenderDisp this.entityRenderer = new MineFortressLabelsRenderer( client.textRenderer, fortressClient::get_SelectionManager, - () -> fortressClient.get_ClientFortressManager().getBuildingHealths() + () -> ModUtils.getBuildingsManager().getBuildingHealths() ); } @@ -69,18 +68,17 @@ public void renderObjectsOnTerrain(MatrixStack matrices, float tickDelta, long l fortressClient.get_TasksRenderer().render(matrices, cameraPos.x, cameraPos.y, cameraPos.z, projectionMatrix); if(!ModUtils.isClientInFortressGamemode()) return; - - final var provider = CoreModUtils.getMineFortressManagersProvider(); - final var selectionManager = provider.get_SelectionManager(); + + final var selectionManager = ModUtils.getSelectionManager(); final var immediate = this.bufferBuilders.getEntityVertexConsumers(); final var vertexConsumer = immediate.getBuffer(RenderLayer.getLines()); - final var fcm = provider.get_ClientFortressManager(); + final var fcm = ModUtils.getFortressClientManager(); if (!selectionManager.isSelecting() && (fcm.getState() == FortressState.BUILD_EDITING || fcm.getState() == FortressState.BUILD_SELECTION)){ final var target = client.crosshairTarget; if(target instanceof BlockHitResult bhr) { final var pos = bhr.getBlockPos(); if(pos != null && !world.getBlockState(pos).isAir()) { - final var buildingSelection = fcm.getBuildingSelection(pos); + final var buildingSelection = ModUtils.getBuildingsManager().getBuildingSelection(pos); renderBuildingSelection(matrices, camera, buildingSelection, vertexConsumer, cameraPos); } } diff --git a/src/main/java/org/minefortress/professions/hire/ClientHireHandler.java b/src/main/java/org/minefortress/professions/hire/ClientHireHandler.java index 29f61ef7..5ec67e78 100644 --- a/src/main/java/org/minefortress/professions/hire/ClientHireHandler.java +++ b/src/main/java/org/minefortress/professions/hire/ClientHireHandler.java @@ -63,7 +63,7 @@ public int getMaxCount(String professionId) { .getProfession(professionId); final var requirementType = profession.getRequirementType(); final var requirementLevel = profession.getRequirementLevel(); - return ModUtils.getFortressClientManager().countBuildings(requirementType, requirementLevel) * 10; + return ModUtils.getBuildingsManager().countBuildings(requirementType, requirementLevel) * 10; } @Override diff --git a/src/main/java/org/minefortress/registries/events/PlayerBlockEvents.kt b/src/main/java/org/minefortress/registries/events/PlayerBlockEvents.kt index 1566641a..01ca364a 100644 --- a/src/main/java/org/minefortress/registries/events/PlayerBlockEvents.kt +++ b/src/main/java/org/minefortress/registries/events/PlayerBlockEvents.kt @@ -68,8 +68,10 @@ fun registerPlayerBlockEvents() { return@register ActionResult.SUCCESS } - if (fortressManager.isBuildingHovered) { - openManageBuildingMenu(fortressManager) + val buildingManager = ModUtils.getBuildingsManager() + + if (buildingManager.isBuildingHovered()) { + buildingManager.openBuildingScreen(player) return@register ActionResult.SUCCESS } @@ -97,12 +99,6 @@ private fun updateFightSelection(hitResult: BlockHitResult, fortressManager: ICl fightManager.setTarget(hitResult, CoreModUtils.getMineFortressManagersProvider().targetedSelectionManager) } -private fun openManageBuildingMenu(fortressManager: IClientFortressManager) { -// fortressManager -// .hoveredBuilding -// .ifPresent { it: IEssentialBuildingInfo? -> } -} - private fun clickBuild(useOnContext: ItemUsageContext, blockState: BlockState) { var blockPos = useOnContext.blockPos if (!BuildingHelper.canPlaceBlock(useOnContext.world, blockPos)) { diff --git a/src/main/java/org/minefortress/renderer/gui/hud/HoveredEntityHudLayer.java b/src/main/java/org/minefortress/renderer/gui/hud/HoveredEntityHudLayer.java index b0dcff44..6ed0e89b 100644 --- a/src/main/java/org/minefortress/renderer/gui/hud/HoveredEntityHudLayer.java +++ b/src/main/java/org/minefortress/renderer/gui/hud/HoveredEntityHudLayer.java @@ -46,7 +46,8 @@ private static Optional getHoveredEntityName() { final var fortressManager = ModUtils.getFortressClientManager(); if(fortressManager.getState() == FortressState.AREAS_SELECTION) return ModUtils.getAreasClientManager().getHoveredAreaName(); - return fortressManager.getHoveredBuildingName(); + + return ModUtils.getBuildingsManager().getHoveredBuildingName(); } @Override diff --git a/src/main/java/org/minefortress/tasks/InstantPlaceTask.kt b/src/main/java/org/minefortress/tasks/InstantPlaceTask.kt index 788a7b8a..127fc178 100644 --- a/src/main/java/org/minefortress/tasks/InstantPlaceTask.kt +++ b/src/main/java/org/minefortress/tasks/InstantPlaceTask.kt @@ -6,7 +6,7 @@ import net.minecraft.server.world.ServerWorld import net.minecraft.util.math.BlockPos import net.minecraft.world.event.GameEvent import net.remmintan.mods.minefortress.core.dtos.buildings.BlueprintMetadata -import net.remmintan.mods.minefortress.core.interfaces.blueprints.buildings.IServerBuildingsManager +import net.remmintan.mods.minefortress.core.interfaces.buildings.IServerBuildingsManager import net.remmintan.mods.minefortress.core.interfaces.tasks.IInstantTask class InstantPlaceTask( diff --git a/src/main/java/org/minefortress/utils/ModUtils.java b/src/main/java/org/minefortress/utils/ModUtils.java index ae8568f2..6606be62 100644 --- a/src/main/java/org/minefortress/utils/ModUtils.java +++ b/src/main/java/org/minefortress/utils/ModUtils.java @@ -8,6 +8,7 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.annotation.MethodsReturnNonnullByDefault; import net.remmintan.mods.minefortress.core.interfaces.blueprints.IClientBlueprintManager; +import net.remmintan.mods.minefortress.core.interfaces.buildings.IClientBuildingsManager; import net.remmintan.mods.minefortress.core.interfaces.client.IClientFortressManager; import net.remmintan.mods.minefortress.core.interfaces.client.IClientManagersProvider; import net.remmintan.mods.minefortress.core.interfaces.professions.IClientProfessionManager; @@ -80,6 +81,10 @@ public static IClientBlueprintManager getBlueprintManager() { return getClientManagersProvider().get_BlueprintManager(); } + public static IClientBuildingsManager getBuildingsManager() { + return getClientManagersProvider().get_BuildingsManager(); + } + public static ISelectionManager getSelectionManager() { return getClientManagersProvider().get_SelectionManager(); } diff --git a/src/networking/java/net/remmintan/mods/minefortress/networking/s2c/ClientboundSyncBuildingsPacket.java b/src/networking/java/net/remmintan/mods/minefortress/networking/s2c/ClientboundSyncBuildingsPacket.java index 82f85965..c7c0e47c 100644 --- a/src/networking/java/net/remmintan/mods/minefortress/networking/s2c/ClientboundSyncBuildingsPacket.java +++ b/src/networking/java/net/remmintan/mods/minefortress/networking/s2c/ClientboundSyncBuildingsPacket.java @@ -23,8 +23,7 @@ public ClientboundSyncBuildingsPacket(PacketByteBuf buf) { @Override public void handle(MinecraftClient client) { - final var fortressManager = getManagersProvider().get_ClientFortressManager(); - fortressManager.updateBuildings(buildingsPositions); + getManagersProvider().get_BuildingsManager().updateBuildings(buildingsPositions); } @Override diff --git a/src/networking/java/net/remmintan/mods/minefortress/networking/s2c/S2COpenBuildingRepairScreen.java b/src/networking/java/net/remmintan/mods/minefortress/networking/s2c/S2COpenBuildingRepairScreen.java index ab0ff6fd..c97ebb5c 100644 --- a/src/networking/java/net/remmintan/mods/minefortress/networking/s2c/S2COpenBuildingRepairScreen.java +++ b/src/networking/java/net/remmintan/mods/minefortress/networking/s2c/S2COpenBuildingRepairScreen.java @@ -48,8 +48,6 @@ public void write(PacketByteBuf buf) { @Override public void handle(MinecraftClient client) { - final var provider = getManagersProvider(); - final var manager = provider.get_ClientFortressManager(); - manager.openRepairBuildingScreen(pos, blocksToRepair); + getManagersProvider().get_BuildingsManager().openRepairBuildingScreen(pos, blocksToRepair); } } diff --git a/src/panama/java/net/remmintan/panama/model/BuiltCampfire.java b/src/panama/java/net/remmintan/panama/model/BuiltCampfire.java deleted file mode 100644 index 9ffbaf80..00000000 --- a/src/panama/java/net/remmintan/panama/model/BuiltCampfire.java +++ /dev/null @@ -1,102 +0,0 @@ -package net.remmintan.panama.model; - -import net.minecraft.block.BlockState; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gl.VertexBuffer; -import net.minecraft.client.render.*; -import net.minecraft.client.render.block.BlockModelRenderer; -import net.minecraft.client.render.block.BlockRenderManager; -import net.minecraft.client.render.chunk.BlockBufferBuilderStorage; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.BlockPos; -import net.remmintan.panama.RenderHelper; -import net.remmintan.panama.view.CampfireRenderView; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.function.Function; -import java.util.stream.Collectors; - -public class BuiltCampfire implements BuiltModel { - private final Set initializedLayers = new HashSet<>(); - private final Set nonEmptyLayers = new HashSet<>(); - private final CampfireRenderView blueprintData = new CampfireRenderView(); - private final Map builtBuffers = new HashMap<>(); - private final Map vertexBuffers = RenderLayer - .getBlockLayers() - .stream() - .collect(Collectors.toMap(Function.identity(), it -> new VertexBuffer(VertexBuffer.Usage.STATIC))); - private CompletableFuture uploadsFuture; - - public void build(BlockBufferBuilderStorage blockBufferBuilders) { - render(blockBufferBuilders); - uploadBuffers(); - } - - @Override - public boolean hasLayer(RenderLayer layer) { - if(uploadsFuture.isCompletedExceptionally()) - throw new IllegalStateException("Render buffers uploads failed"); - - return uploadsFuture.isDone() && nonEmptyLayers.contains(layer); - } - - @Override - public VertexBuffer getBuffer(RenderLayer layer) { - return vertexBuffers.get(layer); - } - - @Override - public void close() { - vertexBuffers.values().forEach(VertexBuffer::close); - } - - - private void render(BlockBufferBuilderStorage blockBufferBuilders) { - final var world = getClient().world; - if(world == null) throw new IllegalStateException("World is null"); - - BlockPos pos = BlockPos.ORIGIN; - final BlockRenderManager blockRenderManager = getClient().getBlockRenderManager(); - BlockModelRenderer.enableBrightnessCache(); - final BlockState blockState = blueprintData.getBlockState(pos); - final RenderLayer blockLayer = RenderLayers.getBlockLayer(blockState); - final BufferBuilder bufferBuilder = blockBufferBuilders.get(blockLayer); - initLayer(blockLayer, bufferBuilder); - blockRenderManager.renderBlock(blockState, pos, blueprintData, new MatrixStack(), bufferBuilder, false, world.random); - nonEmptyLayers.add(blockLayer); - - builtBuffers.put(blockLayer, bufferBuilder.end()); - - BlockModelRenderer.disableBrightnessCache(); - } - - private void uploadBuffers() { - final var uploadFutures = initializedLayers - .stream() - .map(layer -> { - final var builtBuffer = builtBuffers.get(layer); - final var vertexBuffer = vertexBuffers.get(layer); - - return RenderHelper.scheduleUpload(builtBuffer, vertexBuffer); - }) - .toArray(CompletableFuture[]::new); - - this.uploadsFuture = CompletableFuture.allOf(uploadFutures); - } - - private void initLayer(RenderLayer renderLayer, BufferBuilder bufferBuilder) { - if (initializedLayers.add(renderLayer)) - bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR_TEXTURE_LIGHT_NORMAL); - } - - @NotNull - private MinecraftClient getClient() { - return MinecraftClient.getInstance(); - } - -}