Skip to content

Commit 98575b5

Browse files
authored
Merge pull request #14 from FTBTeam/dev
Dev
2 parents 7d12a33 + 837b7a7 commit 98575b5

File tree

12 files changed

+191
-12
lines changed

12 files changed

+191
-12
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@ 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+
## [21.1.10]
8+
9+
### Added
10+
* Added automatic chunk claiming for the lobby area, using FTB Chunks
11+
* See the new "autoclaiming" section in `ftbteambases-server.snbt` config file for control of this feature
12+
* FTB Teams 2101.1.7 or later required
13+
714
## [21.1.9]
815

916
### Fixed

build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ repositories {
117117
dependencies {
118118
implementation "dev.ftb.mods:ftb-library-neoforge:${ftb_library_version}"
119119
implementation "dev.ftb.mods:ftb-teams-neoforge:${ftb_teams_version}"
120+
implementation "dev.ftb.mods:ftb-chunks-neoforge:${ftb_chunks_version}"
120121

121122
compileOnly("top.theillusivec4.curios:curios-neoforge:${curios_version}:api")
122123
localRuntime("top.theillusivec4.curios:curios-neoforge:${curios_version}")
@@ -154,6 +155,7 @@ tasks.withType(ProcessResources).configureEach {
154155
mod_loader_range: mod_loader_range.replace("\${mc_base}", mcMinorAndPatch), // Replace the version in the mod loader range
155156
ftblibraryversion: ftb_library_version,
156157
ftbteamsversion: ftb_teams_version,
158+
ftbchunksversion: ftb_chunks_version
157159
]
158160

159161
inputs.properties replaceProperties
@@ -204,6 +206,9 @@ publishMods {
204206
projectId = project.curseforge_id
205207
minecraftVersions.add(project.minecraft_version)
206208
javaVersions.add(JavaVersion.VERSION_21)
209+
requires('ftb-library-forge')
210+
requires('ftb-teams-forge')
211+
optional('ftb-chunks-forge')
207212
}
208213
}
209214

gradle.properties

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ minecraft_version=1.21.1
1010

1111
mod_name=FTB Team Bases
1212
mod_id=ftbteambases
13-
mod_version=9
13+
mod_version=10
1414

1515
pack_format=15
1616

@@ -23,7 +23,8 @@ maven_group=dev.ftb.mods
2323

2424
#Deps
2525
ftb_library_version=2101.1.20
26-
ftb_teams_version=2101.1.4
26+
ftb_teams_version=2101.1.7
27+
ftb_chunks_version=2101.1.13
2728
curios_version=9.5.1+1.21.1
2829

2930
curseforge_id=1197857

src/main/java/dev/ftb/mods/ftbteambases/FTBTeamBases.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import dev.ftb.mods.ftbteambases.data.construction.RelocatorTracker;
1010
import dev.ftb.mods.ftbteambases.data.definition.BaseDefinitionManager;
1111
import dev.ftb.mods.ftbteambases.data.purging.PurgeManager;
12+
import dev.ftb.mods.ftbteambases.integration.FTBChunksIntegration;
1213
import dev.ftb.mods.ftbteambases.net.SyncBaseTemplatesMessage;
1314
import dev.ftb.mods.ftbteambases.net.VoidTeamDimensionMessage;
1415
import dev.ftb.mods.ftbteambases.registry.ModArgumentTypes;
@@ -144,15 +145,18 @@ private static void onLevelLoad(LevelEvent.Load event) {
144145
if (event.getLevel() instanceof ServerLevel serverLevel) {
145146
if (serverLevel.dimension() == OVERWORLD) {
146147
if (LobbyPregen.maybePregenLobby(serverLevel.getServer())) {
148+
FTBChunksIntegration.maybeAutoClaimLobby(serverLevel);
147149
return;
148150
}
149151
}
150152

151153
ServerConfig.lobbyDimension().ifPresent(rl -> {
152154
if (serverLevel.dimension().equals(rl)) {
153155
maybeCreateLobbyFromStructure(serverLevel);
156+
FTBChunksIntegration.maybeAutoClaimLobby(serverLevel);
154157
}
155158
});
159+
156160
}
157161
}
158162

src/main/java/dev/ftb/mods/ftbteambases/block/BasesPortalBlock.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import net.minecraft.core.BlockPos;
1111
import net.minecraft.core.Direction;
1212
import net.minecraft.core.particles.ParticleTypes;
13-
import net.minecraft.network.chat.Component;
1413
import net.minecraft.server.level.ServerLevel;
1514
import net.minecraft.server.level.ServerPlayer;
1615
import net.minecraft.sounds.SoundSource;
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package dev.ftb.mods.ftbteambases.config;
2+
3+
import dev.ftb.mods.ftblibrary.config.NameMap;
4+
import net.minecraft.core.BlockPos;
5+
import net.minecraft.world.level.ChunkPos;
6+
7+
import java.util.function.Consumer;
8+
9+
public enum AutoClaimShape {
10+
SQUARE("square"),
11+
CIRCLE("circle");
12+
13+
public static final NameMap<AutoClaimShape> NAME_MAP = NameMap.of(SQUARE, values()).id(AutoClaimShape::getId).create();
14+
15+
private final String shape;
16+
17+
AutoClaimShape(String id) {
18+
this.shape = id;
19+
}
20+
21+
public String getId() {
22+
return shape;
23+
}
24+
25+
public void forEachChunk(ChunkPos origin, int radius, Consumer<ChunkPos> consumer) {
26+
BlockPos pos0 = origin.getMiddleBlockPosition(0);
27+
int blockRadiusSq = (radius << 4) * (radius << 4);
28+
switch (radius) {
29+
case 0 -> {
30+
}
31+
case 1 -> consumer.accept(origin);
32+
default -> {
33+
int r = radius - 1;
34+
for (int cx = origin.x - r; cx <= origin.x + r; cx++) {
35+
for (int cz = origin.z - r; cz <= origin.z + r; cz++) {
36+
ChunkPos cp = new ChunkPos(cx, cz);
37+
if (this == SQUARE || cp.getMiddleBlockPosition(0).distSqr(pos0) < blockRadiusSq) {
38+
consumer.accept(cp);
39+
}
40+
}
41+
}
42+
}
43+
}
44+
;
45+
}
46+
}

src/main/java/dev/ftb/mods/ftbteambases/config/ServerConfig.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.ftb.mods.ftbteambases.config;
22

33
import dev.ftb.mods.ftblibrary.config.NameMap;
4+
import dev.ftb.mods.ftblibrary.icon.Color4I;
45
import dev.ftb.mods.ftblibrary.snbt.config.*;
56
import dev.ftb.mods.ftbteambases.FTBTeamBases;
67
import dev.ftb.mods.ftbteambases.worldgen.chunkgen.ChunkGenerators;
@@ -10,6 +11,7 @@
1011
import net.minecraft.resources.ResourceKey;
1112
import net.minecraft.resources.ResourceLocation;
1213
import net.minecraft.world.entity.player.Player;
14+
import net.minecraft.world.level.ChunkPos;
1315
import net.minecraft.world.level.GameType;
1416
import net.minecraft.world.level.Level;
1517

@@ -80,6 +82,24 @@ public interface ServerConfig {
8082
IntValue CUSTOM_PORTAL_Y_POS = NETHER.addInt("portal_y_pos", 0)
8183
.comment("See 'use_custom_portal_y'.");
8284

85+
SNBTConfig AUTOCLAIMING = CONFIG.addGroup("autoclaiming")
86+
.comment("Autoclaim lobby areas (FTB Chunks required)");
87+
IntValue LOBBY_RADIUS = AUTOCLAIMING.addInt("lobby_radius", 0, 0, Integer.MAX_VALUE)
88+
.comment("Radius in chunks for the lobby area to autoclaim",
89+
"0 = autoclaiming disabled",
90+
"1 = autoclaim just the chunk containing the lobby origin pos",
91+
"2+ = extend the autoclaim distance out by 1 chunk per amount beyond 1");
92+
EnumValue<AutoClaimShape> LOBBY_SHAPE = AUTOCLAIMING.addEnum("lobby_shape", AutoClaimShape.NAME_MAP)
93+
.comment("Shape to be autoclaimed");
94+
StringValue LOBBY_SERVER_TEAM_NAME = AUTOCLAIMING.addString("server_team_name", "Lobby")
95+
.comment("The display name for the server team which is used to claim the lobby chunks",
96+
"This name shows up on FTB Chunks mapping");
97+
StringValue LOBBY_CLAIM_COLOR = AUTOCLAIMING.addString("lobby_claim_color", "#FF40FF")
98+
.comment("The server team color",
99+
"Many color names work, and hex codes in the form '#RRGGBB' are accepted");
100+
IntArrayValue LOBBY_CLAIM_CENTER = LOBBY.addIntArray("lobby_claim_center", new int[]{ 0, 0 })
101+
.comment("X/Z chunk position for the centre of the claimed area");
102+
83103
static Optional<ResourceLocation> lobbyLocation() {
84104
try {
85105
return Optional.of(ResourceLocation.parse(LOBBY_STRUCTURE_LOCATION.get()));
@@ -112,6 +132,21 @@ static int getNetherPortalYPos(Player player) {
112132
return USE_CUSTOM_PORTAL_Y_POS.get() ? CUSTOM_PORTAL_Y_POS.get() : player.blockPosition().getY();
113133
}
114134

135+
static Color4I getLobbyTeamColor() {
136+
Color4I teamColor = Color4I.fromString(ServerConfig.LOBBY_CLAIM_COLOR.get());
137+
return teamColor.isEmpty() ? Color4I.rgb(0xFF40FF) : teamColor;
138+
}
139+
140+
static ChunkPos getClaimCenter() {
141+
int[] pos = ServerConfig.LOBBY_CLAIM_CENTER.get();
142+
if (pos.length == 2) {
143+
return new ChunkPos(pos[0], pos[1]);
144+
} else {
145+
FTBTeamBases.LOGGER.error("invalid lobby claim centre pos! expected 2 integers, got {}. default to (0, 0)_", pos.length);
146+
return new ChunkPos(0, 0);
147+
}
148+
}
149+
115150
enum FeatureGeneration {
116151
DEFAULT,
117152
NEVER,
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package dev.ftb.mods.ftbteambases.integration;
2+
3+
import com.mojang.brigadier.exceptions.CommandSyntaxException;
4+
import dev.ftb.mods.ftbchunks.api.ChunkTeamData;
5+
import dev.ftb.mods.ftbchunks.api.ClaimResult;
6+
import dev.ftb.mods.ftbchunks.api.ClaimedChunkManager;
7+
import dev.ftb.mods.ftbchunks.api.FTBChunksAPI;
8+
import dev.ftb.mods.ftblibrary.icon.Color4I;
9+
import dev.ftb.mods.ftblibrary.math.ChunkDimPos;
10+
import dev.ftb.mods.ftbteambases.FTBTeamBases;
11+
import dev.ftb.mods.ftbteambases.config.ServerConfig;
12+
import dev.ftb.mods.ftbteams.api.FTBTeamsAPI;
13+
import dev.ftb.mods.ftbteams.api.Team;
14+
import dev.ftb.mods.ftbteams.api.TeamManager;
15+
import dev.ftb.mods.ftbteams.api.property.TeamProperties;
16+
import net.minecraft.commands.CommandSourceStack;
17+
import net.minecraft.server.level.ServerLevel;
18+
import org.apache.commons.lang3.mutable.MutableInt;
19+
20+
import java.util.UUID;
21+
22+
public class AutoClaiming {
23+
private static final UUID LOBBY_SERVER_ID = UUID.fromString("ddc10a3e-b566-4e84-af66-8c315272ab02");
24+
25+
public static void handleLobbyAutoclaiming(ServerLevel serverLevel) {
26+
// at this point, it's safe to assume that FTB Chunks is present
27+
if (ServerConfig.LOBBY_RADIUS.get() == 0 || ServerConfig.lobbyPos().isEmpty()) {
28+
return;
29+
}
30+
31+
String teamName = ServerConfig.LOBBY_SERVER_TEAM_NAME.get();
32+
Color4I lobbyTeamColor = ServerConfig.getLobbyTeamColor();
33+
try {
34+
TeamManager teamMgr = FTBTeamsAPI.api().getManager();
35+
ClaimedChunkManager chunkMgr = FTBChunksAPI.api().getManager();
36+
37+
CommandSourceStack serverCmdSource = serverLevel.getServer().createCommandSourceStack();
38+
Team lobbyTeam = teamMgr.getTeamByID(LOBBY_SERVER_ID)
39+
.orElse(teamMgr.createServerTeam(serverCmdSource, teamName, null, lobbyTeamColor, LOBBY_SERVER_ID));
40+
41+
// in case they've changed in config...
42+
lobbyTeam.setProperty(TeamProperties.DISPLAY_NAME, teamName);
43+
lobbyTeam.setProperty(TeamProperties.COLOR, lobbyTeamColor);
44+
45+
ChunkTeamData chunkTeamData = chunkMgr.getOrCreateData(lobbyTeam);
46+
47+
// unclaim any existing claims; allows config changes to radius or shape to work correctly
48+
chunkTeamData.getClaimedChunks().forEach(cc -> cc.unclaim(serverCmdSource, false));
49+
50+
MutableInt claimed = new MutableInt(0);
51+
ServerConfig.LOBBY_SHAPE.get().forEachChunk(ServerConfig.getClaimCenter(), ServerConfig.LOBBY_RADIUS.get(), cp -> {
52+
ClaimResult claimRes = chunkTeamData.claim(serverCmdSource, new ChunkDimPos(serverLevel.dimension(), cp), false);
53+
if (!claimRes.isSuccess()) {
54+
FTBTeamBases.LOGGER.error("Couldn't autoclaim lobby chunkpos {}: {}", cp, claimRes.getMessage().getString());
55+
} else {
56+
claimed.increment();
57+
}
58+
});
59+
FTBTeamBases.LOGGER.info("autoclaimed {} chunks around lobby pos {} ({}) for server team {}",
60+
claimed.getValue(), ServerConfig.lobbyPos().get(), ServerConfig.LOBBY_SHAPE.get(), lobbyTeam.getShortName());
61+
} catch (CommandSyntaxException e) {
62+
FTBTeamBases.LOGGER.error("can't create server team {}: {}", teamName, e.getMessage());
63+
}
64+
}
65+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package dev.ftb.mods.ftbteambases.integration;
2+
3+
import dev.architectury.platform.Platform;
4+
import net.minecraft.server.level.ServerLevel;
5+
6+
public class FTBChunksIntegration {
7+
public static void maybeAutoClaimLobby(ServerLevel level) {
8+
if (Platform.isModLoaded("ftbchunks")) {
9+
AutoClaiming.handleLobbyAutoclaiming(level);
10+
}
11+
}
12+
}

src/main/java/dev/ftb/mods/ftbteambases/util/NetherPortalPlacement.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,10 @@
1515
import net.minecraft.world.level.Level;
1616
import net.minecraft.world.level.block.Blocks;
1717
import net.minecraft.world.level.border.WorldBorder;
18-
import net.minecraft.world.level.levelgen.SingleThreadedRandomSource;
1918
import net.minecraft.world.level.portal.DimensionTransition;
2019
import net.minecraft.world.phys.Vec3;
2120
import org.jetbrains.annotations.Nullable;
2221

23-
import java.util.Random;
2422
import java.util.UUID;
2523

2624
public class NetherPortalPlacement {

0 commit comments

Comments
 (0)