Skip to content

Commit

Permalink
Adding translations, modify NoteBlockChunkLoader into BlockChunkLoade…
Browse files Browse the repository at this point in the history
…r so you can choose by which block you can load the chunks.
  • Loading branch information
wendavid552 committed Oct 29, 2022
1 parent b0edea1 commit c8ccfb7
Show file tree
Hide file tree
Showing 18 changed files with 164 additions and 108 deletions.
16 changes: 9 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@

### 规则/Rules

`NoteBlockChunkLoader`: 当音符盒被激活时会加载3x3的区块持续15s,无论音符盒是否能够发出声音。

`SuperBow`: 可以让弓同时拥有无限和经验修补附魔。

`zeroTickCactus`: 使计划刻仍可以给予随机刻进行强制催熟仙人掌。
Expand All @@ -33,11 +31,15 @@

`optimizedDragonRespawn`: 大幅度优化了龙战判定代码的性能表现,可能影响原版特性。

### 区块加载控制/Ghost Commands
`blockChunkLoader [block_type]`: 当红石激活特定

### 区块加载控制/Chunk Loading Commands

控制玩家的区块加载,有时候会有比较奇怪的情况,可以挪到附近的区块再回来,可能因为某些未知原因所在区块还会加载。不会移除所在维度的玩家检测,例如主世界出生点区块加载和末地主岛加载。

玩家上下线时会将交互状态重置回加载以避免[MC-157812](https://bugs.mojang.com/browse/MC-157812)

控制玩家的区块加载。玩家上下线时会将交互状态重置回默认状态以避免[MC-157812](https://bugs.mojang.com/browse/MC-157812)
的发生
格式:`/ghost [true/false]`
格式:`/chunkloading [true/false]`

### 相关链接

Expand All @@ -47,7 +49,7 @@
2. `zeroTick`
系列主要功能实现代码来自1.16.4/1.16.5的[OhMyVanillaMinecraf](https://github.com/hit-mc/OhMyVanillaMinecraft)

3. `ghost`交互控制功能实现代码来自1.16.5/1.17.1的[Intricarpet](https://github.com/lntricate1/intricarpet)
3. `chunkloading`交互控制功能实现代码来自1.16.5/1.17.1的[Intricarpet](https://github.com/lntricate1/intricarpet)

### 致谢

Expand Down
11 changes: 5 additions & 6 deletions src/main/java/club/mcams/carpet/AmsServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,33 @@

import carpet.CarpetExtension;
import carpet.CarpetServer;
import club.mcams.carpet.command.GhostCommand;
import club.mcams.carpet.function.Ghost;
import club.mcams.carpet.command.amscarpetCommandRegistry;
import club.mcams.carpet.function.ChunkLoading;
import club.mcams.carpet.logging.amscarpetLoggerRegistry;
import com.mojang.brigadier.CommandDispatcher;
import net.fabricmc.api.ModInitializer;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.server.network.ServerPlayerEntity;

public class AmsServer implements CarpetExtension, ModInitializer {

@Override
public void registerLoggers() {
amscarpetLoggerRegistry.registerLoggers();
}

@Override
public void registerCommands(CommandDispatcher<ServerCommandSource> dispatcher) {
GhostCommand.register(dispatcher);
amscarpetCommandRegistry.register(dispatcher);
}

@Override
public void onPlayerLoggedIn(ServerPlayerEntity player) {
Ghost.onPlayerConnect(player);
ChunkLoading.onPlayerConnect(player);
}

@Override
public void onPlayerLoggedOut(ServerPlayerEntity player) {
Ghost.onPlayerDisconnect(player);
ChunkLoading.onPlayerDisconnect(player);
}

@Override
Expand Down
64 changes: 45 additions & 19 deletions src/main/java/club/mcams/carpet/AmsServerSettings.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
package club.mcams.carpet;

import carpet.settings.ParsedRule;
import carpet.settings.Rule;
import carpet.settings.Validator;
import net.minecraft.server.command.ServerCommandSource;

import java.util.List;

import static carpet.settings.RuleCategory.*;

/**
Expand All @@ -11,63 +17,83 @@ public class AmsServerSettings
public static final String AMS="AMS";

@Rule(
desc ="音符盒被触发时加载附近区块 3x3 15s",
extra = {"noteblock chunk loader"},
category = {AMS,FEATURE}
)
public static boolean NoteBlockChunkLoader = false;

@Rule(
desc = "让弓可以同时拥有无限与经验修补",
category = {AMS,FEATURE}
desc = "Enabling making super bows with both infinite and mending enchants",
category = {AMS, FEATURE}
)
public static boolean SuperBow = false;
public static boolean superBow = false;

@Rule(
desc = "0t仙人掌催熟",
desc = "Make cactus accepts scheduled tick as random tick",
category = {AMS, FEATURE, SURVIVAL}
)
public static boolean zeroTickCactus = false;

@Rule(
desc = "0t竹子催熟",
desc = "Make bamboo accepts scheduled tick as random tick",
category = {AMS, FEATURE, SURVIVAL}
)
public static boolean zeroTickBamboo = false;

@Rule(
desc = "0t紫颂花催熟",
desc = "Make chorus flower accepts scheduled tick as random tick",
category = {AMS, FEATURE, SURVIVAL}
)
public static boolean zeroTickChorusFlower = false;

@Rule(
desc = "0t甘蔗催熟",
desc = "Make sugar cane accepts scheduled tick as random tick",
category = {AMS, FEATURE, SURVIVAL}
)
public static boolean zeroTickSugarCane = false;

@Rule(
desc = "0t海带、缠怨藤、垂泪藤",
desc = "Make stems accepts scheduled tick as random tick",
category = {AMS, FEATURE, SURVIVAL}
)
public static boolean zeroTickStem = false;

@Rule(
desc = "0t催熟总开关",
desc = "Make all plants accepts scheduled tick as random tick",
category = {AMS, FEATURE, SURVIVAL}
)
public static boolean zeroTickAllPlants = false;

@Rule(
desc = "末影龙复活过程检测优化",
desc = "Optimize dragon respawning",
extra = {"May slightly affect the vanilla feature"},
category = {AMS, OPTIMIZATION}
)
public static boolean optimizedDragonRespawn = false;

@Rule(
desc = "玩家区块加载控制",
desc = "Load nearby 3x3 chunks for 15 seconds when a certain block is triggered",
options = {"false", "note_block", "bell_block"},
validate = BlockLoaderValidator.class,
category = {AMS, FEATURE}
)
public static String blockChunkLoader = "false";

private static class BlockLoaderValidator extends Validator<String> {
private static final List<String> OPTIONS = List.of("false", "note_block", "bell_block");

@Override
public String validate(ServerCommandSource source, ParsedRule<String> currentRule, String newValue, String userString) {
if (!OPTIONS.contains(newValue)) {
return null;
}
return newValue;
}

@Override
public String description() {
return "Can be limited to 'ops' only, true/false for everyone/no one, or a custom permission level";
}
}

@Rule(
desc = "Control chunk loading for players at any gamemodes",
category = {AMS, COMMAND}
)
public static String commandGhost = "false";
public static String commandChunkLoading = "false";

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import carpet.utils.Messenger;
import club.mcams.carpet.AmsServerSettings;
import club.mcams.carpet.function.Ghost;
import club.mcams.carpet.function.ChunkLoading;
import club.mcams.carpet.util.CommandHelper;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.BoolArgumentType;
Expand All @@ -13,10 +13,10 @@
import static net.minecraft.server.command.CommandManager.argument;
import static net.minecraft.server.command.CommandManager.literal;

public class GhostCommand {
public class amscarpetCommandRegistry {
public static void register(CommandDispatcher<ServerCommandSource> dispatcher) {
dispatcher.register(literal("ghost")
.requires((player) -> CommandHelper.canUseCommand(player, AmsServerSettings.commandGhost))
dispatcher.register(literal("chunkloading")
.requires((player) -> CommandHelper.canUseCommand(player, AmsServerSettings.commandChunkLoading))
.executes((c) -> listPlayerInteractions(c.getSource(), c.getSource().getName()))
.then(argument("boolean", BoolArgumentType.bool()).
executes((c) -> setPlayerInteraction(c.getSource(), c.getSource().getName(), getBool(c, "boolean")))
Expand All @@ -30,8 +30,8 @@ private static int setPlayerInteraction(ServerCommandSource source, String playe
Messenger.m(source, "r No player specified");
return 0;
}
Ghost.setPlayerInteraction(playerName, !b, true);
Messenger.m(source, "w Set interaction ", "g " + "chunkloading", "w to ", "g " + b);
ChunkLoading.setPlayerInteraction(playerName, b, true);
Messenger.m(source, "w Set interaction ", "g " + "chunk loading", "w to ", "g " + b);
return 1;
}

Expand All @@ -41,10 +41,10 @@ private static int listPlayerInteractions(ServerCommandSource source, String pla
Messenger.m(source, "r No player specified");
return 0;
}
boolean playerInteractions = Ghost.onlinePlayerMap.getOrDefault(playerName, true);
boolean playerInteractions = ChunkLoading.onlinePlayerMap.getOrDefault(playerName, true);

if (playerInteractions) Messenger.m(source, "w " + "chunk loading" + ": ", "g false");
else Messenger.m(source, "w " + "chunk loading" + ": ", "g true");
if (playerInteractions) Messenger.m(source, "w " + "chunk loading" + ": ", "g true");
else Messenger.m(source, "w " + "chunk loading" + ": ", "g false");
return 1;
}
}
24 changes: 24 additions & 0 deletions src/main/java/club/mcams/carpet/function/BlockChunkLoader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@

package club.mcams.carpet.function;

import net.minecraft.server.world.ChunkTicketType;
import net.minecraft.util.math.ChunkPos;
import java.util.Comparator;


public class BlockChunkLoader {
public static final ChunkTicketType<ChunkPos>
NOTE_BLOCK = ChunkTicketType.create
(
"note_block", Comparator.comparingLong(ChunkPos::toLong),
300
);
public static final ChunkTicketType<ChunkPos>
BELL_BLOCK = ChunkTicketType.create
(
"bell_block", Comparator.comparingLong(ChunkPos::toLong),
300
);
}


Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,19 @@
import java.util.HashMap;
import java.util.Map;

public class Ghost {
public class ChunkLoading {
public static Map<String, Boolean> onlinePlayerMap = new HashMap<>();
public static Map<String, Boolean> offlinePlayerMap = new HashMap<>();

public static void setPlayerInteraction(String playerName, boolean b, boolean online) {
if (playerFromName(playerName) == null) return;
if (online) {
onlinePlayerMap.put(playerName, b);
} else {
offlinePlayerMap.put(playerName, b);
}
}

public static void onPlayerConnect(PlayerEntity player) {
String playerName = player.getName().getString();
if (offlinePlayerMap.containsKey(playerName)) {
setPlayerInteraction(playerName, true, true);
offlinePlayerMap.remove(playerName);
}
setPlayerInteraction(playerName, true, true);
}

public static void onPlayerDisconnect(PlayerEntity player) {
Expand Down
18 changes: 0 additions & 18 deletions src/main/java/club/mcams/carpet/function/NoteBlockChunkLoader.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package club.mcams.carpet.logging;

import carpet.logging.Logger;
import carpet.logging.LoggerRegistry;

public class amscarpetLoggerRegistry {
public static boolean __dragonPortalLocation;

public static void registerLoggers() {
LoggerRegistry.registerLogger("dragonPortalLocation", standardLogger("dragonPortalLocation", null, null));
// LoggerRegistry.registerLogger("dragonPortalLocation", standardLogger("dragonPortalLocation", null, null));
}

static Logger standardLogger(String logName, String def, String[] options) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package club.mcams.carpet.mixin.interaction;

import club.mcams.carpet.function.Ghost;
import club.mcams.carpet.function.ChunkLoading;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.server.world.ThreadedAnvilChunkStorage;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
Expand All @@ -14,13 +13,12 @@
@Mixin(ThreadedAnvilChunkStorage.class)
public class ThreadedAnvilChunkStorageMixin {
@Shadow
@Final
ServerWorld world;

@Inject(method = "doesNotGenerateChunks", at = @At("HEAD"), cancellable = true)
private void doesNotGenerateChunks(ServerPlayerEntity player, CallbackInfoReturnable<Boolean> cir) {
String playerName = player.getName().getString();
if (!Ghost.onlinePlayerMap.getOrDefault(playerName, true)) {
if (!ChunkLoading.onlinePlayerMap.getOrDefault(playerName, true)) {
cir.setReturnValue(true);
cir.cancel();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package club.mcams.carpet.mixin.rule.blockChunkLoader;

import club.mcams.carpet.AmsServerSettings;
import club.mcams.carpet.function.BlockChunkLoader;
import net.minecraft.block.BellBlock;
import net.minecraft.entity.Entity;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

import java.util.Objects;

@Mixin(BellBlock.class)
public class BellBlockMixin {
@Inject(
method = "ring(Lnet/minecraft/entity/Entity;Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/math/Direction;)Z",
at = @At("HEAD")
)
private void ringByTriggeredMixin(Entity entity, World world, BlockPos pos, Direction direction, CallbackInfoReturnable<Boolean> cir) {
if (Objects.equals(AmsServerSettings.blockChunkLoader, "bell_block")) {
ChunkPos cp = new ChunkPos(pos.getX() >> 4, pos.getZ() >> 4);
((ServerWorld) world).getChunkManager().addTicket(BlockChunkLoader.BELL_BLOCK, cp, 3, cp);
}
}
}
Loading

0 comments on commit c8ccfb7

Please sign in to comment.