Skip to content

Commit

Permalink
Refactored the way buildings are stored on the client separating clie…
Browse files Browse the repository at this point in the history
…nt manager from everything else
  • Loading branch information
remmintan committed Dec 6, 2024
1 parent 8757246 commit 7af6616
Show file tree
Hide file tree
Showing 26 changed files with 238 additions and 320 deletions.
Original file line number Diff line number Diff line change
@@ -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<BlockPos>)

fun getBuildingSelection(pos: BlockPos?): List<BlockPos>

fun isBuildingHovered(): Boolean {
return getHoveredBuilding().isPresent
}

fun getHoveredBuildingName(): Optional<String> {
return getHoveredBuilding().map { obj: IFortressBuilding -> obj.name }
}

fun getHoveredBuilding(): Optional<IFortressBuilding>

fun countBuildings(type: ProfessionType, level: Int): Int

fun getBuildingHealths(): List<BuildingHealthRenderInfo>

fun openRepairBuildingScreen(pos: BlockPos, blocksToRepair: Map<BlockPos, BlockState>)

fun hasRequiredBuilding(type: ProfessionType, level: Int, minCount: Int): Boolean

fun openBuildingScreen(playerEntity: PlayerEntity) {
val hoveredBuilding = getHoveredBuilding().orElseThrow()
playerEntity.openHandledScreen(hoveredBuilding.screenHandlerFactory)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
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;
import net.minecraft.server.network.ServerPlayerEntity;
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;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,30 +1,23 @@
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;
import net.remmintan.mods.minefortress.core.interfaces.resources.IClientResourceManager;

import java.util.List;
import java.util.Map;
import java.util.Optional;

public interface IClientFortressManager extends IFortressManager {

void jumpToCampfire();

void updateBuildings(List<BlockPos> buildings);

void setSpecialBlocks(Map<Block, List<BlockPos>> specialBlocks, Map<Block, List<BlockPos>> blueprintSpecialBlocks);

void open_HireScreen(MinecraftClient client, String screenName, Map<String, IHireInfo> professions, List<String> additionalInfo);
Expand All @@ -48,18 +41,8 @@ void sync(

void setupFortressCenter(BlockPos pos);

List<BlockPos> getBuildingSelection(BlockPos pos);

boolean isBuildingHovered();

Optional<IFortressBuilding> getHoveredBuilding();

Optional<String> getHoveredBuildingName();

IClientProfessionManager getProfessionManager();

int countBuildings(ProfessionType type, int level);

boolean gamemodeNeedsInitialization();

boolean isSurvival();
Expand All @@ -75,9 +58,5 @@ void sync(

FortressState getState();

List<BuildingHealthRenderInfo> getBuildingHealths();

void openRepairBuildingScreen(BlockPos pos, Map<BlockPos, BlockState> blocksToRepair);

IClientResourceManager getResourceManager();
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/org/minefortress/controls/MouseEvents.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Loading

0 comments on commit 7af6616

Please sign in to comment.