Skip to content

Commit 7966b54

Browse files
authored
Merge pull request #274 from FTBTeam/1.20.1/dev
1.20.1/dev
2 parents 9ac64d8 + a23518c commit 7966b54

15 files changed

+180
-52
lines changed

.github/workflows/build.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: Java CI - Build on Push
22

33
on:
44
push:
5-
branches: [ main, dev, "1.*" ]
5+
branches: [ main, dev, "1.**" ]
66
workflow_dispatch:
77
inputs:
88
skip_maven_publish:

CHANGELOG.md

+14-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,19 @@ 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+
## [2001.2.5]
8+
9+
### Added
10+
* Added `/ftbchunks waypoint add <name> <pos> [<color>]` command, to add waypoints from server-side
11+
* Name can contain spaces if it's quoted
12+
* Pos is a standard blockpos spec, e.g. `~ ~ ~` for the player's current pos
13+
* Color is optional; either a chat color or, if omitted, a random color is picked
14+
15+
### Fixed
16+
* Fixed a couple of claim and force load limit issues
17+
* Max claim/force limits weren't synced to clients when changed in server config
18+
* Team claim/force limits weren't always correctly recalculated when a player joined/left a team
19+
720
## [2001.2.4]
821

922
### Fixed
@@ -16,7 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1629
* Added a team property to control whether PvP is permitted in a team's claims
1730
* If PvP is prevented, then if either the attacking player or the attacked player is in such a claim, PvP damage will be cancelled
1831
* Can be controlled by server admin with the server config "Allow PvP Combat"
19-
* "always" (default) allows PvP everywhere
32+
* "always" (default) allows PvP everywhere
2033
* "never" prevents PvP in all claimed chunks
2134
* "per_team" allows teams to configure PvP for their claims via new team property "Allow PvP Combat"
2235
* Not 100% guaranteed to prevent all forms of PvP damage, but direct or projectile damage is prevented where the damage source can be traced back to a player

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.4-SNAPSHOT" apply false
44
}
55

66
architectury {

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

+27-16
Original file line numberDiff line numberDiff line change
@@ -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

+30
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
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;
@@ -13,6 +14,7 @@
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();

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

+9-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import dev.ftb.mods.ftbchunks.FTBChunks;
1919
import dev.ftb.mods.ftbchunks.FTBChunksWorldConfig;
2020
import dev.ftb.mods.ftbchunks.api.FTBChunksAPI;
21+
import dev.ftb.mods.ftbchunks.api.client.FTBChunksClientAPI;
2122
import dev.ftb.mods.ftbchunks.api.client.event.MapIconEvent;
2223
import dev.ftb.mods.ftbchunks.api.client.icon.MapIcon;
2324
import dev.ftb.mods.ftbchunks.api.client.icon.MapType;
@@ -145,7 +146,7 @@ public enum FTBChunksClient {
145146
private Matrix4f worldMatrix;
146147
private Vec3 cameraPos;
147148

148-
public void init() {
149+
public void init() {
149150
if (Minecraft.getInstance() == null) {
150151
return;
151152
}
@@ -1161,4 +1162,11 @@ public List<Component> getChunkSummary() {
11611162
public int getMinimapTextureId() {
11621163
return minimapTextureId;
11631164
}
1165+
1166+
public static void addWaypoint(Player player, String name, BlockPos position, int color) {
1167+
FTBChunksAPI.clientApi().getWaypointManager(player.level().dimension()).ifPresent(mgr -> {
1168+
Waypoint wp = mgr.addWaypointAt(position, name);
1169+
wp.setColor(color);
1170+
});
1171+
}
11641172
}

common/src/main/java/dev/ftb/mods/ftbchunks/data/ChunkTeamDataImpl.java

+8-3
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,10 @@ public int getMaxForceLoadChunks() {
571571
public void updateLimits() {
572572
updateMemberLimitData(!memberData.isEmpty());
573573

574-
if (!team.isPartyTeam()) {
574+
int prevMaxClaimed = maxClaimChunks;
575+
int prevMaxForced = maxForceLoadChunks;
576+
577+
if (!team.isPartyTeam()) {
575578
TeamMemberData m = getTeamMemberData(getTeam().getId());
576579
maxClaimChunks = m.getMaxClaims();
577580
maxForceLoadChunks = m.getMaxForceLoads();
@@ -602,7 +605,7 @@ public void updateLimits() {
602605
maxClaimChunks += m.getMaxClaims();
603606
maxForceLoadChunks += m.getMaxForceLoads();
604607
});
605-
if (memberData.size() > 0) {
608+
if (!memberData.isEmpty()) {
606609
maxClaimChunks /= memberData.size();
607610
maxForceLoadChunks /= memberData.size();
608611
}
@@ -617,7 +620,9 @@ public void updateLimits() {
617620
maxForceLoadChunks = Math.min(maxForceLoadChunks, FTBChunksWorldConfig.HARD_TEAM_FORCE_LIMIT.get());
618621
}
619622

620-
SendGeneralDataPacket.send(this, getTeam().getOnlineMembers());
623+
if (maxClaimChunks != prevMaxClaimed || maxForceLoadChunks != prevMaxForced) {
624+
SendGeneralDataPacket.send(this, getTeam().getOnlineMembers());
625+
}
621626

622627
markDirty();
623628
}

common/src/main/java/dev/ftb/mods/ftbchunks/data/ClaimedChunkImpl.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import net.minecraft.world.entity.Entity;
2020
import net.minecraft.world.level.ChunkPos;
2121
import net.minecraft.world.level.Level;
22+
import org.jetbrains.annotations.NotNull;
2223

2324
public class ClaimedChunkImpl implements ClaimedChunk {
2425
private ChunkTeamDataImpl teamData;
@@ -41,7 +42,9 @@ public ChunkTeamDataImpl getTeamData() {
4142
return teamData;
4243
}
4344

44-
public void setTeamData(ChunkTeamDataImpl teamData) {
45+
public void setTeamData(@NotNull ChunkTeamDataImpl teamData) {
46+
teamData.clearClaimCaches();
47+
this.teamData.clearClaimCaches();
4548
this.teamData = teamData;
4649
}
4750

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package dev.ftb.mods.ftbchunks.net;
2+
3+
import dev.architectury.networking.NetworkManager;
4+
import dev.architectury.networking.simple.BaseS2CMessage;
5+
import dev.architectury.networking.simple.MessageType;
6+
import dev.ftb.mods.ftbchunks.client.FTBChunksClient;
7+
import net.minecraft.core.BlockPos;
8+
import net.minecraft.network.FriendlyByteBuf;
9+
10+
public class AddWaypointPacket extends BaseS2CMessage {
11+
private final String name;
12+
private final BlockPos position;
13+
private final int color;
14+
15+
public AddWaypointPacket(String name, BlockPos position, int color) {
16+
this.name = name;
17+
this.position = position;
18+
this.color = color;
19+
}
20+
21+
public AddWaypointPacket(FriendlyByteBuf buf) {
22+
name = buf.readUtf();
23+
position = buf.readBlockPos();
24+
color = buf.readInt();
25+
}
26+
27+
@Override
28+
public MessageType getType() {
29+
return FTBChunksNet.ADD_WAYPOINT;
30+
}
31+
32+
@Override
33+
public void write(FriendlyByteBuf buf) {
34+
buf.writeUtf(name);
35+
buf.writeBlockPos(position);
36+
buf.writeInt(color);
37+
}
38+
39+
@Override
40+
public void handle(NetworkManager.PacketContext context) {
41+
FTBChunksClient.addWaypoint(context.getPlayer(), name, position, color);
42+
}
43+
}

common/src/main/java/dev/ftb/mods/ftbchunks/net/FTBChunksNet.java

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public interface FTBChunksNet {
2525
MessageType SERVER_CONFIG_RESPONSE = MAIN.registerS2C("server_config_response", ServerConfigResponsePacket::new);
2626
MessageType CHUNK_CHANGE_RESPONSE = MAIN.registerS2C("chunk_change_response", ChunkChangeResponsePacket::new);
2727
MessageType REQUEST_BLOCK_COLOR = MAIN.registerS2C("request_block_color", RequestBlockColorPacket::new);
28+
MessageType ADD_WAYPOINT = MAIN.registerS2C("add_waypoint", AddWaypointPacket::new);
2829

2930
static void init() {
3031
}

0 commit comments

Comments
 (0)