Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,31 @@

import com.createcivilization.capitol.Capitol;
import com.createcivilization.capitol.client.networking.ClientClaimCache;
import com.createcivilization.capitol.common.data.Team;
import com.createcivilization.capitol.common.networking.packets.C2SChunkRequest;
import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TextColor;
import net.minecraft.world.level.ChunkPos;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent;
import net.neoforged.neoforge.client.event.ClientTickEvent;
import net.neoforged.neoforge.event.level.ChunkEvent;
import net.neoforged.neoforge.network.PacketDistributor;

import java.util.Objects;
import java.util.UUID;

@EventBusSubscriber(modid = Capitol.MOD_ID, value = Dist.CLIENT)
public class ChunkEvents {
private static final int RGB_24_BIT_MASK = 0xFFFFFF;
private static ChunkPos lastPlayerChunk = null;
private static ChunkPos pendingChunkAnnouncement = null;
private static boolean hasLastTerritory = false;
private static UUID lastTerritoryTeamId = null;

/**
* Handles sending packets to server when loading chunks to fetch claims and adding to cache
Expand All @@ -26,6 +40,69 @@ private static void onChunkLoad(ChunkEvent.Load event) {
PacketDistributor.sendToServer(packet);
}

@SubscribeEvent
private static void onClientTick(ClientTickEvent.Post event) {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This whole way of displaying claim entering is not how I personally wanna go about it. Its like how every other claim mod does it. Hard to explain how I would do it but I do have plans for it. I will get to it after my finals.

var player = Minecraft.getInstance().player;
if (player == null) return;

ChunkPos current = player.chunkPosition();
if (current.equals(lastPlayerChunk)) return;
lastPlayerChunk = current;

Team team = ClientClaimCache.getClaim(current);
if (team != null) {
onTerritoryResolved(team);
pendingChunkAnnouncement = null;
return;
}

pendingChunkAnnouncement = current;
PacketDistributor.sendToServer(new C2SChunkRequest(current.toLong()));
}

public static void onClaimInfoUpdated(ChunkPos chunkPos) {
var mc = Minecraft.getInstance();
var player = mc.player;
if (player == null) return;
if (pendingChunkAnnouncement == null || !pendingChunkAnnouncement.equals(chunkPos)) return;
if (!chunkPos.equals(player.chunkPosition())) return;

Team team = ClientClaimCache.getClaim(chunkPos);
onTerritoryResolved(team);
pendingChunkAnnouncement = null;
}

private static void onTerritoryResolved(Team team) {
UUID teamId = (team == null) ? null : team.getId();
boolean changed = !hasLastTerritory || !Objects.equals(lastTerritoryTeamId, teamId);
lastTerritoryTeamId = teamId;
hasLastTerritory = true;

if (!changed) return;

if (team == null) {
showWilderness();
} else {
showTerritory(team);
}
}

private static void showTerritory(Team team) {
var player = Minecraft.getInstance().player;
if (player == null) return;
int rgb = team.getColor().getRGB() & RGB_24_BIT_MASK;
player.displayClientMessage(
Component.literal(team.getName()).withStyle(style -> style.withColor(TextColor.fromRgb(rgb))),
true
);
}

private static void showWilderness() {
var player = Minecraft.getInstance().player;
if (player == null) return;
player.displayClientMessage(Component.translatable("hud.capitol.territory.wilderness").withStyle(ChatFormatting.DARK_GREEN), true);
}

/**
* Removes chunks from client claim cache when they are unloaded
*/
Expand All @@ -42,6 +119,10 @@ private static void onChunkUnload(ChunkEvent.Unload event) {
@SubscribeEvent
private static void onClientDisconnect(ClientPlayerNetworkEvent.LoggingOut event) {
ClientClaimCache.clearClaims();
lastPlayerChunk = null;
pendingChunkAnnouncement = null;
hasLastTerritory = false;
lastTerritoryTeamId = null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,19 @@ public synchronized void setJourneyMapDataPath(File addonDataModPath) {
Path nextClaimsFile = worldDir.resolve("claims").resolve("claims.json");
if (claimsFile != null && claimsFile.equals(nextClaimsFile)) return;

boolean hadExistingFile = claimsFile != null;
if (hadExistingFile) {
flush();
}

claimsFile = nextClaimsFile;
loaded = false;
claims.clear();
dirty = false;
if (hadExistingFile) {
claims.clear();
dirty = false;
} else if (dirty) {
flush();
}
}

public synchronized Map<ChunkPos, Team> snapshot() {
Expand All @@ -70,6 +79,11 @@ public synchronized Map<ChunkPos, Team> snapshot() {
return out;
}

public synchronized int signature() {
ensureLoaded();
return claims.entrySet().hashCode();
}

public synchronized void upsert(ChunkPos pos, Team team) {
Objects.requireNonNull(pos, "pos");
Objects.requireNonNull(team, "team");
Expand All @@ -88,6 +102,7 @@ public synchronized void remove(ChunkPos pos) {

public synchronized void flush() {
if (!dirty) return;
if (claimsFile == null) return;
ensureLoaded();
writeFile();
dirty = false;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.createcivilization.capitol.client.networking;

import com.createcivilization.capitol.client.events.ChunkEvents;
import com.createcivilization.capitol.client.journeymap.ClientJMClaims;
import com.createcivilization.capitol.common.data.Team;
import com.createcivilization.capitol.common.networking.packets.S2CChunkData;
Expand All @@ -15,12 +16,14 @@ public static void chunkDataHandler(final S2CChunkData chunkData, final IPayload
ClientClaimCache.addClaim(chunkPos, team);
ClientJMClaims.instance().upsert(chunkPos, team);
ClientJMClaims.instance().flush();
ChunkEvents.onClaimInfoUpdated(chunkPos);
}

public static void chunkRemoveHandler(final S2CChunkRemove chunkData, final IPayloadContext context) {
ChunkPos chunkPos = new ChunkPos(chunkData.packedChunkPos());
ClientClaimCache.removeClaim(chunkPos);
ClientJMClaims.instance().remove(chunkPos);
ClientJMClaims.instance().flush();
ChunkEvents.onClaimInfoUpdated(chunkPos);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public class CapitolJourneyMapPlugin implements IClientPlugin {

private IClientAPI api;
private int tickCounter;
private int lastSignature;
private int lastSignature = Integer.MIN_VALUE;
private ChunkPos lastPlayerChunk;
private ChunkPos lastAreaCenterChunk;
private PolygonOverlay rangeOverlay;
Expand All @@ -70,6 +70,7 @@ public class CapitolJourneyMapPlugin implements IClientPlugin {
private IThemeButton claimModeButton;
private IThemeButton claimSelectedButton;
private IThemeButton unclaimSelectedButton;
private IThemeButton autoClaimButton;

@Override
public String getModId() {
Expand Down Expand Up @@ -108,6 +109,11 @@ private void onAddonButtonDisplay(FullscreenDisplayEvent.AddonButtonDisplayEvent
unclaimSelected();
});

autoClaimButton = event.getThemeButtonDisplay().addThemeToggleButton("Autoclaim", icon, false, button -> {
button.setToggled(false);
toggleAutoClaim();
});

updateClaimModeUiState();
}

Expand Down Expand Up @@ -276,7 +282,7 @@ private void tick(ClientTickEvent.Post event) {
if (++tickCounter < REFRESH_INTERVAL_TICKS) return;
tickCounter = 0;

int signature = ClientClaimCache.claims.entrySet().hashCode();
int signature = computeClaimsSignature();
if (signature == lastSignature) return;
lastSignature = signature;

Expand All @@ -301,6 +307,13 @@ private void tick(ClientTickEvent.Post event) {
}
}

private int computeClaimsSignature() {
int signature = 1;
signature = 31 * signature + ClientJMClaims.instance().signature();
signature = 31 * signature + ClientClaimCache.claims.entrySet().hashCode();
return signature;
}

// hard reset when claim mode toggles off
// also makes sure we instantly show the purple radius when toggling on
private void updateClaimModeState() {
Expand Down Expand Up @@ -342,6 +355,19 @@ private void updateClaimModeUiState() {
} catch (Throwable ignored) {
}
}
if (autoClaimButton != null) {
try {
autoClaimButton.setEnabled(claimingMode);
} catch (Throwable ignored) {
}
}
}

private void toggleAutoClaim() {
var player = Minecraft.getInstance().player;
if (player == null || player.connection == null) return;

player.connection.sendCommand("capitol claim auto");
}

// this sends a single packet for the whole selection, so chat doesn't get spammed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@ public static void handleChunkRequest(final C2SChunkRequest request, final IPayl
CapitolDatabase database = DatabaseManager.database;
ChunkPos chunkPos = new ChunkPos(request.packedChunkPos());
Team team = database.getChunkOwner(chunkPos, context.player().level());
if(team == null) return;
if (team == null) {
S2CChunkRemove packet = new S2CChunkRemove(request.packedChunkPos());
Comment thread
starpanda24825 marked this conversation as resolved.
PacketDistributor.sendToPlayersTrackingChunk((ServerLevel) context.player().level(), chunkPos, packet);
return;
}
S2CChunkData packet = new S2CChunkData(request.packedChunkPos(), team);
PacketDistributor.sendToPlayersTrackingChunk((ServerLevel) context.player().level(), chunkPos, packet);
}
Expand Down
3 changes: 2 additions & 1 deletion src/main/resources/assets/capitol/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
"gui.journeymap.capitol.claim_chunk": "Claim chunk",
"gui.journeymap.capitol.unclaim_chunk": "Unclaim chunk",

"commands.capitol.not_player": "You must be a player to run this command.",
"hud.capitol.territory.wilderness": "Wilderness",

"commands.capitol.not_in_team_error": "You are not in any team",
"commands.capitol.no_player_found": "There is no player called %s",
"commands.capitol.player_not_in_team": "%s is not a member of %s",
Expand Down