Skip to content

Commit b1c8e47

Browse files
authored
Merge pull request #276 from FTBTeam/dev
Dev
2 parents e2d9f8a + 24b9094 commit b1c8e47

34 files changed

+848
-161
lines changed

.gitignore

+3-1
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,6 @@ run
2424
run2
2525
.vscode/
2626
.architectury-transformer/
27-
**/extra-mods-*/
27+
**/extra-mods-*/
28+
29+
.DS_Store

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## [2004.1.2]
8+
9+
### Changed
10+
* Ported to Minecraft 1.20.4. Support for Forge, NeoForge and Fabric.
11+
* A few minor GUI improvements.
12+
713
## [2001.2.3]
814

915
### Added

build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
plugins {
22
id "architectury-plugin" version "3.4-SNAPSHOT"
3-
id "dev.architectury.loom" version "1.2-SNAPSHOT" apply false
3+
id "dev.architectury.loom" version "1.5-SNAPSHOT" apply false
44
}
55

66
architectury {

common/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ dependencies {
99
def ENV = System.getenv()
1010

1111
architectury {
12-
common("forge", "fabric")
12+
common("forge", "fabric", "neoforge")
1313
}
1414

1515
configurations {

common/src/main/java/dev/ftb/mods/ftbchunks/FTBChunks.java

+28-17
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ private boolean ignoreExplosion(Level level, Explosion explosion) {
390390
}
391391

392392
public void explosionDetonate(Level level, Explosion explosion, List<Entity> affectedEntities) {
393-
if (ignoreExplosion(level, explosion)) {
393+
if (FTBChunksWorldConfig.DISABLE_PROTECTION.get() || ignoreExplosion(level, explosion)) {
394394
return;
395395
}
396396

@@ -475,40 +475,49 @@ private void playerLeftParty(PlayerLeftPartyTeamEvent event) {
475475
// return the departing player's original claims to them, if possible
476476
transferClaims(partyData, playerData, partyData.getOriginalClaims(event.getPlayerId()));
477477
}
478-
});
479-
480-
partyData.deleteMemberData(event.getPlayerId());
481478

482-
partyData.updateLimits();
479+
partyData.deleteMemberData(event.getPlayerId());
483480

484-
if (event.getPlayer() != null) {
485-
PlayerVisibilityPacket.syncToLevel(event.getPlayer().level());
486-
partyData.syncChunksToPlayer(event.getPlayer());
487-
}
481+
if (event.getPlayer() != null) {
482+
PlayerVisibilityPacket.syncToLevel(event.getPlayer().level());
483+
}
484+
});
488485
}
489486

490487
private void transferClaims(ChunkTeamDataImpl transferFrom, ChunkTeamDataImpl transferTo, Collection<ClaimedChunkImpl> chunksToTransfer) {
491488
CommandSourceStack sourceStack = ClaimedChunkManagerImpl.getInstance().getMinecraftServer().createCommandSourceStack();
492489

490+
String fromName = transferFrom.getTeam().getShortName();
491+
String toName = transferTo.getTeam().getShortName();
492+
493+
transferFrom.clearClaimCaches();
494+
transferTo.clearClaimCaches();
495+
496+
int nChunks = transferTo.getClaimedChunks().size();
497+
493498
Map<ResourceKey<Level>, List<SendChunkPacket.SingleChunk>> chunksToSend = new HashMap<>();
494499
Map<ResourceKey<Level>, List<SendChunkPacket.SingleChunk>> chunksToUnclaim = new HashMap<>();
495-
int chunks = 0;
500+
int transferred = 0;
501+
int unclaimed = 0;
496502
long now = System.currentTimeMillis();
497503
int total = transferTo.getClaimedChunks().size();
498504

505+
FTBChunks.LOGGER.info("attempting to transfer {} chunks from {} to {}", chunksToTransfer.size(), fromName, toName);
506+
499507
for (ClaimedChunkImpl chunk : chunksToTransfer) {
500508
ChunkDimPos cdp = chunk.getPos();
501509
if (total >= transferTo.getMaxClaimChunks()) {
502510
chunk.unclaim(sourceStack, false);
503511
chunksToUnclaim.computeIfAbsent(cdp.dimension(), s -> new ArrayList<>()).add(new SendChunkPacket.SingleChunk(now, cdp.x(), cdp.z(), null));
512+
unclaimed++;
504513
} else {
505514
chunk.setTeamData(transferTo);
506515
chunksToSend.computeIfAbsent(cdp.dimension(), s -> new ArrayList<>()).add(new SendChunkPacket.SingleChunk(now, cdp.x(), cdp.z(), chunk));
507-
chunks++;
516+
transferred++;
508517
}
509518

510519
if (chunk.isForceLoaded()) {
511-
// also transfer any claim tickets for the old team's ID, since it's no longer valid
520+
// also transfer any force-load tickets for the old team's ID, since it's no longer valid
512521
ServerLevel level = ClaimedChunkManagerImpl.getInstance().getMinecraftServer().getLevel(cdp.dimension());
513522
if (level != null) {
514523
FTBChunksExpected.addChunkToForceLoaded(level, FTBChunks.MOD_ID, transferFrom.getTeamId(), cdp.x(), cdp.z(), false);
@@ -521,10 +530,10 @@ private void transferClaims(ChunkTeamDataImpl transferFrom, ChunkTeamDataImpl tr
521530
total++;
522531
}
523532

524-
transferFrom.markDirty();
525-
transferTo.markDirty();
533+
transferFrom.updateLimits();
534+
transferTo.updateLimits();
526535

527-
if (chunks > 0) {
536+
if (transferred > 0 || unclaimed > 0) {
528537
chunksToSend.forEach((dimension, chunkPackets) -> {
529538
if (!chunkPackets.isEmpty()) {
530539
ChunkSendingUtils.sendManyChunksToAll(sourceStack.getServer(), transferTo, new SendManyChunksPacket(dimension, transferTo.getTeamId(), chunkPackets));
@@ -536,9 +545,11 @@ private void transferClaims(ChunkTeamDataImpl transferFrom, ChunkTeamDataImpl tr
536545
new SendManyChunksPacket(dimension, Util.NIL_UUID, chunkPackets).sendToAll(sourceStack.getServer());
537546
}
538547
});
539-
540-
FTBChunks.LOGGER.info("Transferred " + chunks + "/" + total + " chunks from " + transferFrom + " to " + transferTo);
541548
}
549+
550+
FTBChunks.LOGGER.info("Transferred {} chunks from {} ({}) to {} ({})", transferred, transferFrom, fromName, transferTo, toName);
551+
FTBChunks.LOGGER.info("Unclaimed {} chunks for {} ({}) due to claim limits", unclaimed, transferFrom, fromName);
552+
FTBChunks.LOGGER.info("Team {} had {} claimed chunks, now has {}", toName, nChunks, nChunks + transferred);
542553
}
543554

544555
private void teamOwnershipTransferred(PlayerTransferredTeamOwnershipEvent event) {

common/src/main/java/dev/ftb/mods/ftbchunks/FTBChunksCommands.java

+32-2
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@
22

33
import com.mojang.brigadier.CommandDispatcher;
44
import com.mojang.brigadier.arguments.IntegerArgumentType;
5+
import com.mojang.brigadier.arguments.StringArgumentType;
56
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
67
import com.mojang.brigadier.context.CommandContext;
78
import com.mojang.brigadier.exceptions.CommandSyntaxException;
89
import com.mojang.brigadier.tree.LiteralCommandNode;
9-
import com.mojang.util.UUIDTypeAdapter;
10+
import com.mojang.util.UndashedUuid;
1011
import dev.ftb.mods.ftbchunks.api.ChunkTeamData;
1112
import dev.ftb.mods.ftbchunks.api.ClaimResult;
1213
import dev.ftb.mods.ftbchunks.api.ClaimedChunk;
1314
import dev.ftb.mods.ftbchunks.data.ChunkTeamDataImpl;
1415
import dev.ftb.mods.ftbchunks.data.ClaimedChunkImpl;
1516
import dev.ftb.mods.ftbchunks.data.ClaimedChunkManagerImpl;
17+
import dev.ftb.mods.ftbchunks.net.AddWaypointPacket;
1618
import dev.ftb.mods.ftbchunks.net.LoadedChunkViewPacket;
1719
import dev.ftb.mods.ftbchunks.net.RequestBlockColorPacket;
1820
import dev.ftb.mods.ftbchunks.net.SendGeneralDataPacket;
@@ -24,11 +26,14 @@
2426
import dev.ftb.mods.ftbteams.data.TeamArgumentProvider;
2527
import it.unimi.dsi.fastutil.longs.Long2IntMaps;
2628
import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap;
29+
import net.minecraft.ChatFormatting;
2730
import net.minecraft.commands.CommandBuildContext;
2831
import net.minecraft.commands.CommandSourceStack;
2932
import net.minecraft.commands.Commands;
33+
import net.minecraft.commands.arguments.ColorArgument;
3034
import net.minecraft.commands.arguments.DimensionArgument;
3135
import net.minecraft.commands.arguments.EntityArgument;
36+
import net.minecraft.commands.arguments.coordinates.BlockPosArgument;
3237
import net.minecraft.commands.arguments.coordinates.ColumnPosArgument;
3338
import net.minecraft.commands.arguments.coordinates.Coordinates;
3439
import net.minecraft.core.BlockPos;
@@ -179,11 +184,36 @@ public static void registerCommands(CommandDispatcher<CommandSourceStack> dispat
179184
return 1;
180185
})
181186
)
187+
.then(Commands.literal("waypoint")
188+
.then(Commands.literal("add")
189+
.then(Commands.argument("name", StringArgumentType.string())
190+
.then(Commands.argument("position", BlockPosArgument.blockPos())
191+
.executes(context -> addWaypoint(context.getSource(), StringArgumentType.getString(context, "name"), BlockPosArgument.getLoadedBlockPos(context, "position")))
192+
.then(Commands.argument("color", ColorArgument.color())
193+
.executes(context -> addWaypoint(context.getSource(), StringArgumentType.getString(context, "name"), BlockPosArgument.getLoadedBlockPos(context, "position"), ColorArgument.getColor(context, "color")))
194+
)
195+
)
196+
)
197+
)
198+
)
182199
);
183200

184201
dispatcher.register(Commands.literal("chunks").redirect(command));
185202
}
186203

204+
private static int addWaypoint(CommandSourceStack source, String name, BlockPos position, ChatFormatting color) throws CommandSyntaxException {
205+
if (color.getColor() != null) {
206+
ServerPlayer player = source.getPlayerOrException();
207+
new AddWaypointPacket(name, position, color.getColor()).sendTo(player);
208+
}
209+
return 1;
210+
}
211+
212+
private static int addWaypoint(CommandSourceStack source, String name, BlockPos position) throws CommandSyntaxException {
213+
int idx = source.getPlayerOrException().getRandom().nextInt(ChatFormatting.values().length);
214+
return addWaypoint(source, name, position, ChatFormatting.values()[idx]);
215+
}
216+
187217
private static int bypassProtection(CommandSourceStack source) throws CommandSyntaxException {
188218
ServerPlayer player = source.getPlayerOrException();
189219
ClaimedChunkManagerImpl manager = claimManager();
@@ -327,7 +357,7 @@ private static int info(CommandSourceStack source, ChunkDimPos pos) {
327357
return 0;
328358
}
329359

330-
source.sendSuccess(() -> Component.literal("Owner: ").append(chunk.getTeamData().getTeam().getColoredName()).append(" / " + UUIDTypeAdapter.fromUUID(chunk.getTeamData().getTeam().getId())), true);
360+
source.sendSuccess(() -> Component.literal("Owner: ").append(chunk.getTeamData().getTeam().getColoredName()).append(" / " + UndashedUuid.toString(chunk.getTeamData().getTeam().getId())), true);
331361

332362
if (source.hasPermission(2)) {
333363
source.sendSuccess(() -> Component.literal("Force Loaded: " + chunk.isForceLoaded()), true);

common/src/main/java/dev/ftb/mods/ftbchunks/client/FTBChunksClient.java

+57-15
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import dev.ftb.mods.ftbchunks.api.client.icon.MapType;
2424
import dev.ftb.mods.ftbchunks.api.client.icon.WaypointIcon;
2525
import dev.ftb.mods.ftbchunks.api.client.waypoint.Waypoint;
26+
import dev.ftb.mods.ftbchunks.client.gui.AddWaypointOverlay;
2627
import dev.ftb.mods.ftbchunks.client.gui.ChunkScreen;
2728
import dev.ftb.mods.ftbchunks.client.gui.LargeMapScreen;
2829
import dev.ftb.mods.ftbchunks.client.gui.WaypointEditorScreen;
@@ -31,16 +32,18 @@
3132
import dev.ftb.mods.ftbchunks.client.mapicon.*;
3233
import dev.ftb.mods.ftbchunks.net.PartialPackets;
3334
import dev.ftb.mods.ftbchunks.net.SendGeneralDataPacket.GeneralChunkData;
35+
import dev.ftb.mods.ftblibrary.config.ColorConfig;
3436
import dev.ftb.mods.ftblibrary.config.StringConfig;
35-
import dev.ftb.mods.ftblibrary.config.ui.EditConfigFromStringScreen;
3637
import dev.ftb.mods.ftblibrary.icon.Color4I;
3738
import dev.ftb.mods.ftblibrary.icon.FaceIcon;
3839
import dev.ftb.mods.ftblibrary.icon.Icon;
3940
import dev.ftb.mods.ftblibrary.math.MathUtils;
4041
import dev.ftb.mods.ftblibrary.math.XZ;
4142
import dev.ftb.mods.ftblibrary.snbt.SNBTCompoundTag;
43+
import dev.ftb.mods.ftblibrary.ui.BaseScreen;
4244
import dev.ftb.mods.ftblibrary.ui.CustomClickEvent;
4345
import dev.ftb.mods.ftblibrary.ui.GuiHelper;
46+
import dev.ftb.mods.ftblibrary.ui.Theme;
4447
import dev.ftb.mods.ftblibrary.ui.input.Key;
4548
import dev.ftb.mods.ftblibrary.util.StringUtils;
4649
import dev.ftb.mods.ftblibrary.util.client.ClientUtils;
@@ -145,7 +148,7 @@ public enum FTBChunksClient {
145148
private Matrix4f worldMatrix;
146149
private Vec3 cameraPos;
147150

148-
public void init() {
151+
public void init() {
149152
if (Minecraft.getInstance() == null) {
150153
return;
151154
}
@@ -362,7 +365,7 @@ public EventResult keyPressed(Minecraft client, int keyCode, int scanCode, int a
362365
public EventResult keyPressed(Minecraft client, Screen screen, int keyCode, int scanCode, int modifiers) {
363366
if (doesKeybindMatch(openMapKey, keyCode, scanCode, modifiers)) {
364367
LargeMapScreen gui = ClientUtils.getCurrentGuiAs(LargeMapScreen.class);
365-
if (gui != null) {
368+
if (gui != null && !gui.anyModalPanelOpen()) {
366369
gui.closeGui(false);
367370
return EventResult.interruptTrue();
368371
}
@@ -377,16 +380,9 @@ private EventResult addQuickWaypoint() {
377380
if (player == null) return EventResult.pass();
378381

379382
return MapManager.getInstance().map(manager -> {
380-
new EditConfigFromStringScreen<>(name, set -> {
381-
if (set && !name.getValue().isEmpty()) {
382-
MapDimension mapDimension = manager.getDimension(player.level().dimension());
383-
WaypointImpl waypoint = new WaypointImpl(WaypointType.DEFAULT, mapDimension, player.blockPosition())
384-
.setName(name.getValue())
385-
.setColor(Color4I.hsb(MathUtils.RAND.nextFloat(), 1F, 1F).rgba());
386-
mapDimension.getWaypointManager().add(waypoint);
387-
}
388-
openGui();
389-
}).openGuiLater(); // later needed to prevent keypress being passed into gui
383+
BaseScreen screen = new WaypointAddScreen(name, player);
384+
screen.openGuiLater();
385+
// later needed to prevent keypress being passed into gui
390386
return EventResult.interruptTrue();
391387
}).orElse(EventResult.pass());
392388
}
@@ -506,14 +502,14 @@ public void renderHud(GuiGraphics graphics, float tickDelta) {
506502
currentPlayerChunkZ = cz;
507503
}
508504

509-
if (mc.options.renderDebug || !FTBChunksClientConfig.MINIMAP_ENABLED.get() || FTBChunksClientConfig.MINIMAP_VISIBILITY.get() == 0 || !FTBChunksWorldConfig.shouldShowMinimap(mc.player)) {
505+
if (mc.getDebugOverlay().showDebugScreen() || !FTBChunksClientConfig.MINIMAP_ENABLED.get() || FTBChunksClientConfig.MINIMAP_VISIBILITY.get() == 0 || !FTBChunksWorldConfig.shouldShowMinimap(mc.player)) {
510506
return;
511507
}
512508

513509
float scale;
514510
if (FTBChunksClientConfig.MINIMAP_PROPORTIONAL.get()) {
515511
scale = (float) (4D / guiScale);
516-
scale *= (scaledWidth / 10f) / (scale * 64D) * FTBChunksClientConfig.MINIMAP_SCALE.get();
512+
scale *= (scaledWidth / 10f) / (scale * 64f) * FTBChunksClientConfig.MINIMAP_SCALE.get().floatValue();
517513
} else {
518514
scale = (float) (FTBChunksClientConfig.MINIMAP_SCALE.get() * 4D / guiScale);
519515
}
@@ -1161,4 +1157,50 @@ public List<Component> getChunkSummary() {
11611157
public int getMinimapTextureId() {
11621158
return minimapTextureId;
11631159
}
1160+
1161+
public static Waypoint addWaypoint(Player player, String name, BlockPos position, int color) {
1162+
return FTBChunksAPI.clientApi().getWaypointManager(player.level().dimension()).map(mgr -> {
1163+
Waypoint wp = mgr.addWaypointAt(position, name);
1164+
wp.setColor(color);
1165+
return wp;
1166+
}).orElse(null);
1167+
}
1168+
1169+
private static class WaypointAddScreen extends BaseScreen {
1170+
private final StringConfig name;
1171+
private final Player player;
1172+
1173+
public WaypointAddScreen(StringConfig name, Player player) {
1174+
super();
1175+
this.name = name;
1176+
this.player = player;
1177+
this.setHeight(35);
1178+
}
1179+
1180+
@Override
1181+
public void drawBackground(GuiGraphics graphics, Theme theme, int x, int y, int w, int h) {
1182+
}
1183+
1184+
@Override
1185+
public void addWidgets() {
1186+
ColorConfig col = new ColorConfig();
1187+
col.setValue(Color4I.hsb(MathUtils.RAND.nextFloat(), 1F, 1F));
1188+
AddWaypointOverlay overlay = new AddWaypointOverlay(this, name, col, set -> {
1189+
if (set && !name.getValue().isEmpty()) {
1190+
Waypoint wp = addWaypoint(player, name.getValue(), player.blockPosition(), col.getValue().rgba());
1191+
Minecraft.getInstance().player.displayClientMessage(
1192+
Component.translatable("ftbchunks.waypoint_added",
1193+
Component.literal(wp.getName()).withStyle(ChatFormatting.YELLOW)
1194+
), true);
1195+
}
1196+
}) {
1197+
@Override
1198+
public void onClosed() {
1199+
closeGui();
1200+
}
1201+
};
1202+
overlay.setWidth(this.width);
1203+
pushModalPanel(overlay);
1204+
}
1205+
}
11641206
}

0 commit comments

Comments
 (0)