Skip to content

Commit

Permalink
WIP. Rewrote buildings system to rely on block entities. Each buildin…
Browse files Browse the repository at this point in the history
…g has one hidden block entity representing it. This will make the whole building system more reliable. Still fixes required to be done.
  • Loading branch information
remmintan committed Nov 29, 2024
1 parent a0c31ab commit 3cb81b7
Show file tree
Hide file tree
Showing 33 changed files with 291 additions and 674 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import java.time.LocalDateTime
import java.util.*

class BuildingAutomationAreaProvider(
private val id: UUID,
private val start: BlockPos,
private val end: BlockPos,
private val requirement: IBlueprintRequirement
Expand All @@ -19,7 +18,7 @@ class BuildingAutomationAreaProvider(
private var updated: LocalDateTime = LocalDateTime.MIN
private var currentIterator: Iterator<IAutomationBlockInfo>? = null

override fun getId(): UUID = id
override fun getId(): UUID = error("Not id supported")

override fun iterator(world: World?): Iterator<IAutomationBlockInfo> {
if (currentIterator?.hasNext() != true) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ class FortressBuildingBlockEntity(pos: BlockPos?, state: BlockState?) :
NamedScreenHandlerFactory,
IFortressBuilding {

private var buildingId: UUID? = null
private var blueprintMetadata: BlueprintMetadata? = null
private var start: BlockPos? = null
private var end: BlockPos? = null
Expand All @@ -43,19 +42,16 @@ class FortressBuildingBlockEntity(pos: BlockPos?, state: BlockState?) :
private var beds = listOf<BlockPos>()

fun init(
id: UUID,
metadata: BlueprintMetadata,
start: BlockPos,
end: BlockPos,
blockData: Map<BlockPos, BlockState>,
floorLevel: Int
) {
buildingId = id
blueprintMetadata = metadata
this.start = start
this.end = end
this.blockData = FortressBuildingBlockData(blockData, floorLevel)
this.automationArea = BuildingAutomationAreaProvider(id, start, end, metadata.requirement)
this.blockData = FortressBuildingBlockData(blockData, metadata.floorLevel)
this.automationArea = BuildingAutomationAreaProvider(start, end, metadata.requirement)
}

fun tick(world: World?) {
Expand All @@ -78,26 +74,30 @@ class FortressBuildingBlockEntity(pos: BlockPos?, state: BlockState?) :
return Text.of(nameStr)
}

override fun destroy() {
TODO("Not yet implemented")
}

override fun getName(): String = blueprintMetadata?.name ?: "Building"

override fun readNbt(nbt: NbtCompound) {
super.readNbt(nbt)
buildingId = nbt.getUuid("buildingId")
blueprintMetadata = BlueprintMetadata(nbt.getCompound("blueprintMetadata"))
start = BlockPos.fromLong(nbt.getLong("start"))
end = BlockPos.fromLong(nbt.getLong("end"))
blockData = FortressBuildingBlockData.fromNbt(nbt.getCompound("blockData"))
automationArea = BuildingAutomationAreaProvider(buildingId!!, start!!, end!!, blueprintMetadata!!.requirement)
automationArea = BuildingAutomationAreaProvider(start!!, end!!, blueprintMetadata!!.requirement)
}

override fun writeNbt(nbt: NbtCompound) {
super.writeNbt(nbt)
buildingId?.let { nbt.putUuid("buildingId", it) }
blueprintMetadata?.toNbt()?.let { nbt.put("blueprintMetadata", it) }
start?.let { nbt.putLong("start", it.asLong()) }
end?.let { nbt.putLong("end", it.asLong()) }
blockData?.toNbt()?.let { nbt.put("blockData", it) }
}

override fun getId(): UUID = buildingId ?: error("Building ID is not set")
override fun getId(): UUID = UUID.fromString("00000000-0000-0000-0000-000000000000")

override fun getHealth(): Int = blockData?.health ?: 0

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,4 @@ class BlueprintRequirement(blueprintId: String) : IBlueprintRequirement {
this.upgrades = upgrades
}

val icon = type?.icon

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,17 @@
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.BlockRotation;
import net.minecraft.util.math.BlockPos;
import net.remmintan.mods.minefortress.core.dtos.buildings.BlueprintMetadata;
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;
import net.remmintan.mods.minefortress.core.interfaces.tasks.IInstantTask;
import net.remmintan.mods.minefortress.core.interfaces.tasks.ITask;

import java.util.UUID;

public interface IServerBlueprintManager {
public interface IServerBlueprintManager extends IServerManager, ITickableManager, IWritableManager {
BlueprintMetadata get(String blueprintId);
void tick(ServerPlayerEntity player);

void update(String blueprintId, String blueprintName, BlueprintGroup group, NbtCompound updatedStructure, int newFloorLevel);
Expand All @@ -24,7 +29,5 @@ public interface IServerBlueprintManager {

IInstantTask createInstantPlaceTask(String blueprintId, BlockPos start, BlockRotation rotation);

NbtCompound write();

void read(NbtCompound nbt);
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,34 @@
package net.remmintan.mods.minefortress.core.interfaces.blueprints.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;

import java.util.Map;
import java.util.Optional;
import java.util.UUID;

public interface IServerBuildingsManager extends IServerManager {
public interface IServerBuildingsManager extends IServerManager, IWritableManager, ITickableManager {
void addBuilding(BlueprintMetadata metadata, BlockPos start, BlockPos end, Map<BlockPos, BlockState> mergedBlockData);

void destroyBuilding(BlockPos pos);

Optional<IFortressBuilding> getBuilding(BlockPos pos);

long getTotalBedsCount();
void destroyBuilding(UUID id);
void doRepairConfirmation(UUID id, ServerPlayerEntity player);
Optional<IFortressBuilding> findNearest(BlockPos pos);

void doRepairConfirmation(BlockPos pos, ServerPlayerEntity player);
Optional<IFortressBuilding> findNearest(BlockPos pos);
Optional<IFortressBuilding> findNearest(BlockPos pos, ProfessionType requirement);
void addBuilding(IFortressBuilding building);

Optional<HostileEntity> getRandomBuildingAttacker();
Optional<BlockPos> getFreeBed();
boolean isPartOfAnyBuilding(BlockPos pos);

boolean hasRequiredBuilding(ProfessionType type, int level, int minCount);
Optional<IFortressBuilding> getBuildingById(UUID id);

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;

public interface IFortressBuilding extends IAutomationArea {

Expand All @@ -22,6 +21,10 @@ public interface IFortressBuilding extends IAutomationArea {

BlockPos getEnd();

void destroy();

String getName();

default BlockPos getCenter() {
final var start = getStart();
final var end = getEnd();
Expand Down Expand Up @@ -49,8 +52,6 @@ default boolean isPartOfTheBuilding(BlockPos pos) {

boolean satisfiesRequirement(ProfessionType type, int level);

UUID getId();

void attack(HostileEntity attacker);

Set<HostileEntity> getAttackers();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
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.IEssentialBuildingInfo;
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;
Expand All @@ -18,13 +18,12 @@
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;

public interface IClientFortressManager extends IFortressManager {

void jumpToCampfire();

void updateBuildings(List<IEssentialBuildingInfo> buildings);
void updateBuildings(List<BlockPos> buildings);

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

Expand Down Expand Up @@ -53,7 +52,7 @@ void sync(

boolean isBuildingHovered();

Optional<IEssentialBuildingInfo> getHoveredBuilding();
Optional<IFortressBuilding> getHoveredBuilding();

Optional<String> getHoveredBuildingName();

Expand All @@ -78,7 +77,7 @@ void sync(

List<BuildingHealthRenderInfo> getBuildingHealths();

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

IClientResourceManager getResourceManager();
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package net.remmintan.mods.minefortress.core.interfaces.entities.player;

import net.minecraft.util.math.Vec3d;
import net.remmintan.mods.minefortress.core.interfaces.blueprints.IServerBlueprintManager;
import org.jetbrains.annotations.Nullable;

public interface FortressServerPlayerEntity {

IServerBlueprintManager get_ServerBlueprintManager();
boolean was_InBlueprintWorldWhenLoggedOut();
void set_WasInBlueprintWorldWhenLoggedOut(boolean wasInBlueprintWorldWhenLoggedOut);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public interface IServerFortressManager {

void jumpToCampfire(ServerPlayerEntity player);

void repairBuilding(ServerPlayerEntity player, UUID taskId, UUID buildingId, List<Integer> selectedPawns);
void repairBuilding(ServerPlayerEntity player, UUID taskId, BlockPos pos, List<Integer> selectedPawns);

boolean isSurvival();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,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.combat.IServerFightManager;
import net.remmintan.mods.minefortress.core.interfaces.professions.IServerProfessionsManager;
Expand Down Expand Up @@ -37,6 +38,10 @@ default IServerFightManager getFightManager() {
return getManager(IServerFightManager.class);
}

default IServerBlueprintManager getBlueprintManager() {
return getManager(IServerBlueprintManager.class);
}

<T> T getManager(Class<T> managerClass);

}
2 changes: 0 additions & 2 deletions src/main/java/org/minefortress/NetworkReaders.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import net.remmintan.mods.minefortress.networking.registries.NetworkingReadersRegistry;
import org.minefortress.fortress.automation.areas.AutomationAreaInfoReader;
import org.minefortress.fortress.buildings.EssentialBuildingInfoReader;
import org.minefortress.fortress.resources.ItemInfoReader;
import org.minefortress.professions.ProfessionsEssentialInfoReader;

Expand All @@ -11,7 +10,6 @@ public class NetworkReaders {
public static void register() {
NetworkingReadersRegistry.addReader(new AutomationAreaInfoReader());
NetworkingReadersRegistry.addReader(new ProfessionsEssentialInfoReader());
NetworkingReadersRegistry.addReader(new EssentialBuildingInfoReader());
NetworkingReadersRegistry.addReader(new ItemInfoReader());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ private static BlockPos getEndPos(BlockPos startPos, Vec3i size) {
return startPos.add(new Vec3i(size.getX() - 1, size.getY() - 1, size.getZ() - 1));
}

@Override
public BlueprintMetadata get(String blueprintId) {
return blueprints.get(blueprintId);
}

@Override
public void tick(ServerPlayerEntity player) {
if (!initialized) {
Expand Down Expand Up @@ -160,7 +165,7 @@ public void update(String blueprintId, String blueprintName, BlueprintGroup grou
}

@Override
public NbtCompound write() {
public void write(NbtCompound tag) {
final var wholeManager = new NbtCompound();

final var serializedBlueprints = new NbtCompound();
Expand All @@ -172,11 +177,13 @@ public NbtCompound write() {

wholeManager.put("blueprints", serializedBlueprints);

return wholeManager;
tag.put("blueprintsManager", wholeManager);
}

@Override
public void read(NbtCompound wholeManager) {
public void read(NbtCompound tag) {
final var wholeManager = tag.getCompound("blueprintsManager");

scheduledSyncs.clear();
blueprints.clear();
initialized = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import net.minecraft.util.math.Vec3i
import net.remmintan.mods.minefortress.blueprints.*
import net.remmintan.mods.minefortress.core.interfaces.blueprints.BlueprintGroup
import net.remmintan.mods.minefortress.core.interfaces.blueprints.world.IBlueprintWorld
import net.remmintan.mods.minefortress.core.interfaces.entities.player.FortressServerPlayerEntity
import net.remmintan.mods.minefortress.core.interfaces.server.IFortressServer

class BlueprintWorldWrapper(server: MinecraftServer) : IBlueprintWorld {

Expand Down Expand Up @@ -94,14 +94,17 @@ class BlueprintWorldWrapper(server: MinecraftServer) : IBlueprintWorld {
size.add(NbtInt.of(maxY - minY + 1))
size.add(NbtInt.of(maxZ - minZ + 1))
updatedStructure.put("size", size)
if (player is FortressServerPlayerEntity) {
player._ServerBlueprintManager.update(
id,
blueprintName,
metadata.group,
updatedStructure,
DEFAULT_FLOOR_LEVEL - blueprintMinY
)
if (server is IFortressServer) {
server._FortressModServerManager
.getManagersProvider(player)
.blueprintManager
.update(
id,
blueprintName,
metadata.group,
updatedStructure,
DEFAULT_FLOOR_LEVEL - blueprintMinY
)
}
}

Expand Down
Loading

0 comments on commit 3cb81b7

Please sign in to comment.