feat: 拴绳修复与bot在线时长限制
This commit is contained in:
1 parent
abb25c0d48
commit
57d2058a6b
18 files changed
+236
-16
No files matched your search
@@ -36,6 +36,10 @@ public class SLSCarpetSettings {
|
||||
@Rule(categories = {SLSA}, strict = false, options = {"#none"})
|
||||
public static String botPrefix = "#none";
|
||||
|
||||
/** Carpet SLS Addition original **/
|
||||
@Rule(categories = {SLSA})
|
||||
public static long botMaxOnlineTime = -1;
|
||||
|
||||
/** Carpet SLS Addition original **/
|
||||
@Rule(categories = {SLSA, RuleCategory.FEATURE})
|
||||
public static boolean creativeObeyEnchantmentRule = false;
|
||||
@@ -75,4 +79,8 @@ public class SLSCarpetSettings {
|
||||
/** Carpet SLS Addition original **/
|
||||
@Rule(categories = {SLSA, RuleCategory.FEATURE})
|
||||
public static boolean elytraCraftable = false;
|
||||
|
||||
/** Carpet SLS Addition original **/
|
||||
@Rule(categories = {SLSA, RuleCategory.FEATURE})
|
||||
public static boolean spectatorCannotUseLeash = false;
|
||||
}
|
||||
@@ -5,7 +5,6 @@ import carpet.CarpetServer;
|
||||
import com.github.zly2006.carpetslsaddition.command.BotCommand;
|
||||
import com.github.zly2006.carpetslsaddition.command.HatCommand;
|
||||
import com.github.zly2006.carpetslsaddition.command.SitCommand;
|
||||
import com.github.zly2006.carpetslsaddition.network.pca.PcaSyncProtocol;
|
||||
import com.github.zly2006.carpetslsaddition.util.access.SettingsManagerAccessor;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.gson.Gson;
|
||||
@@ -49,7 +48,7 @@ public class ServerMain implements ModInitializer, CarpetExtension {
|
||||
public void onServerLoaded(MinecraftServer server) {
|
||||
ServerMain.server = server;
|
||||
CarpetServer.settingsManager.parseSettingsClass(SLSCarpetSettings.class);
|
||||
((SettingsManagerAccessor) CarpetServer.settingsManager).loadSettings();
|
||||
((SettingsManagerAccessor) CarpetServer.settingsManager).carpet_SLS_Addition$loadSettings();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -8,7 +8,8 @@ import carpet.patches.FakeClientConnection;
|
||||
import carpet.utils.Messenger;
|
||||
import com.github.zly2006.carpetslsaddition.SLSCarpetSettings;
|
||||
import com.github.zly2006.carpetslsaddition.ServerMain;
|
||||
import com.github.zly2006.carpetslsaddition.util.access.PlayerAccess;
|
||||
import com.github.zly2006.carpetslsaddition.util.access.PlayerAccessor;
|
||||
import com.github.zly2006.carpetslsaddition.util.access.SLSBotAccessor;
|
||||
import com.mojang.authlib.GameProfile;
|
||||
import com.mojang.brigadier.Command;
|
||||
import com.mojang.brigadier.CommandDispatcher;
|
||||
@@ -81,6 +82,7 @@ public class BotCommand {
|
||||
.then(argument("slot", IntegerArgumentType.integer(1, 9))
|
||||
.executes(c -> manipulate(c, ap -> ap.setSlot(IntegerArgumentType.getInteger(c, "slot"))))))
|
||||
.then(literal("kill").executes(BotCommand::kill))
|
||||
.then(literal("respawn")).executes(BotCommand::respawn)
|
||||
.then(literal("mount").executes(manipulation(ap -> ap.mount(true)))
|
||||
.then(literal("anything").executes(manipulation(ap -> ap.mount(false)))))
|
||||
.then(literal("dismount").executes(manipulation(EntityPlayerActionPack::dismount)))
|
||||
@@ -244,6 +246,30 @@ public class BotCommand {
|
||||
return 1;
|
||||
}
|
||||
|
||||
private static int respawn(CommandContext<ServerCommandSource> context) {
|
||||
var player = getPlayer(context);
|
||||
if (((SLSBotAccessor)player).carpet_SLS_Addition$isBot()) {
|
||||
((SLSBotAccessor)player).carpet_SLS_Addition$setSpawnTime(System.currentTimeMillis());
|
||||
context.getSource().sendMessage(
|
||||
Text.translatable("carpet.slsa.bot.respawned", player.getNameForScoreboard())
|
||||
.setStyle(
|
||||
Style.EMPTY.withColor(Formatting.GREEN)
|
||||
)
|
||||
);
|
||||
|
||||
return Command.SINGLE_SUCCESS;
|
||||
}
|
||||
|
||||
context.getSource().sendMessage(
|
||||
Text.translatable("carpet.slsa.bot.not_a_bot", player.getNameForScoreboard())
|
||||
.setStyle(
|
||||
Style.EMPTY.withColor(Formatting.RED)
|
||||
)
|
||||
);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
interface SupplierWithCSE<T>
|
||||
{
|
||||
@@ -302,7 +328,7 @@ public class BotCommand {
|
||||
return 0;
|
||||
}
|
||||
|
||||
((PlayerAccess) bot).carpet_SLS_Addition$setDisplayName(Text.empty().append(Text.literal("[%s] ".formatted(source.getName())).setStyle(Style.EMPTY.withColor(Formatting.AQUA))).append(Text.literal(playerName).setStyle(Style.EMPTY)));
|
||||
((PlayerAccessor) bot).carpet_SLS_Addition$setDisplayName(Text.empty().append(Text.literal("[%s] ".formatted(source.getName())).setStyle(Style.EMPTY.withColor(Formatting.AQUA))).append(Text.literal(playerName).setStyle(Style.EMPTY)));
|
||||
|
||||
ServerMain.server.getPlayerManager().broadcast(Text.empty()
|
||||
.append(Text.literal("假人").setStyle(Style.EMPTY.withColor(Formatting.GREEN)))
|
||||
@@ -368,6 +394,9 @@ public class BotCommand {
|
||||
bot.getDataTracker().set(PlayerEntity.PLAYER_MODEL_PARTS, (byte) 0x7f); // show all model layers (incl. capes)
|
||||
bot.getAbilities().flying = false;
|
||||
|
||||
((SLSBotAccessor)bot).carpet_SLS_Addition$setBot(true);
|
||||
((SLSBotAccessor)bot).carpet_SLS_Addition$setSpawnTime(System.currentTimeMillis());
|
||||
|
||||
return bot;
|
||||
}
|
||||
catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
|
||||
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
package com.github.zly2006.carpetslsaddition.mixin.carpet;
|
||||
|
||||
import carpet.patches.EntityPlayerMPFake;
|
||||
import com.github.zly2006.carpetslsaddition.SLSCarpetSettings;
|
||||
import com.github.zly2006.carpetslsaddition.ServerMain;
|
||||
import com.github.zly2006.carpetslsaddition.util.access.SLSBotAccessor;
|
||||
import com.mojang.authlib.GameProfile;
|
||||
import net.minecraft.network.packet.c2s.common.SyncedClientOptions;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
import net.minecraft.server.world.ServerWorld;
|
||||
import net.minecraft.text.Style;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.util.Formatting;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(EntityPlayerMPFake.class)
|
||||
public abstract class MixinEntityPlayerMPFake extends ServerPlayerEntity implements SLSBotAccessor {
|
||||
@Shadow public abstract void kill();
|
||||
|
||||
@Unique
|
||||
private boolean bot = false;
|
||||
@Unique
|
||||
private long spawnTime = -1;
|
||||
|
||||
public MixinEntityPlayerMPFake(MinecraftServer server, ServerWorld world, GameProfile profile, SyncedClientOptions clientOptions) {
|
||||
super(server, world, profile, clientOptions);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean carpet_SLS_Addition$isBot() {
|
||||
return bot;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void carpet_SLS_Addition$setBot(boolean isBot) {
|
||||
this.bot = isBot;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long carpet_SLS_Addition$getSpawnTime() {
|
||||
if (spawnTime == -1) spawnTime = System.currentTimeMillis();
|
||||
return spawnTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void carpet_SLS_Addition$setSpawnTime(long spawnTime) {
|
||||
this.spawnTime = spawnTime;
|
||||
}
|
||||
|
||||
@Inject(method = "tick", at = @At("HEAD"))
|
||||
public void onTick(CallbackInfo ci) {
|
||||
if (!this.bot || SLSCarpetSettings.botMaxOnlineTime < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
long currentTime = System.currentTimeMillis();
|
||||
long liveTime = currentTime - spawnTime;
|
||||
|
||||
if (liveTime > SLSCarpetSettings.botMaxOnlineTime * 1000) {
|
||||
ServerMain.server.getPlayerManager().broadcast(
|
||||
Text.translatable("carpet.slsa.bot.bot_timeout", this.getNameForScoreboard(), getFormattedTime(SLSCarpetSettings.botMaxOnlineTime))
|
||||
.setStyle(
|
||||
Style.EMPTY.withColor(Formatting.RED)
|
||||
),
|
||||
false
|
||||
);
|
||||
|
||||
this.kill();
|
||||
}
|
||||
}
|
||||
|
||||
@Unique
|
||||
private static String getFormattedTime(long time) {
|
||||
if (time > 120 * 60) {
|
||||
return String.format("%02dh%02dm%02ds", time / 3600, (time % 3600) / 60, time % 60);
|
||||
}
|
||||
else if (time > 120) {
|
||||
return String.format("%02dm%02ds", time / 60, time % 60);
|
||||
}
|
||||
else {
|
||||
return String.format("%02ds", time);
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -20,7 +20,7 @@ public abstract class MixinSettingsManager implements SettingsManagerAccessor {
|
||||
@Shadow protected abstract void loadConfigurationFromConf();
|
||||
|
||||
@Override
|
||||
public void loadSettings() {
|
||||
public void carpet_SLS_Addition$loadSettings() {
|
||||
this.loadConfigurationFromConf();
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.github.zly2006.carpetslsaddition.mixin.entity;
|
||||
|
||||
import com.github.zly2006.carpetslsaddition.SLSCarpetSettings;
|
||||
import net.minecraft.entity.Leashable;
|
||||
import net.minecraft.entity.vehicle.BoatEntity;
|
||||
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.CallbackInfo;
|
||||
|
||||
@Mixin(BoatEntity.class)
|
||||
public abstract class MixinBoatEntity implements Leashable {
|
||||
@Inject(method = "tick", at = @At("HEAD"))
|
||||
private void onTick(CallbackInfo ci) {
|
||||
if (!SLSCarpetSettings.spectatorCannotUseLeash ||
|
||||
this.getLeashHolder() == null ||
|
||||
!this.getLeashHolder().isSpectator()
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.detachLeash();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.github.zly2006.carpetslsaddition.mixin.entity;
|
||||
|
||||
import com.github.zly2006.carpetslsaddition.SLSCarpetSettings;
|
||||
import net.minecraft.entity.Leashable;
|
||||
import net.minecraft.entity.mob.MobEntity;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(MobEntity.class)
|
||||
public abstract class MixinMobEntity implements Leashable {
|
||||
@Shadow public abstract void detachLeash();
|
||||
|
||||
@Inject(method = "tick", at = @At("HEAD"))
|
||||
private void onTick(CallbackInfo ci) {
|
||||
if (!SLSCarpetSettings.spectatorCannotUseLeash ||
|
||||
this.getLeashHolder() == null ||
|
||||
!this.getLeashHolder().isSpectator()
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.detachLeash();
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
package com.github.zly2006.carpetslsaddition.mixin.entity;
|
||||
|
||||
import com.github.zly2006.carpetslsaddition.util.access.PlayerAccess;
|
||||
import com.github.zly2006.carpetslsaddition.util.access.PlayerAccessor;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.text.Text;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
@@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
@Mixin(PlayerEntity.class)
|
||||
public abstract class MixinPlayerEntity implements PlayerAccess {
|
||||
public abstract class MixinPlayerEntity implements PlayerAccessor {
|
||||
@Unique
|
||||
private Text displayName = null;
|
||||
|
||||
|
||||
+14
@@ -3,8 +3,11 @@ package com.github.zly2006.carpetslsaddition.mixin.entity;
|
||||
import com.github.zly2006.carpetslsaddition.SLSCarpetSettings;
|
||||
import com.github.zly2006.carpetslsaddition.util.SitEntity;
|
||||
import com.mojang.authlib.GameProfile;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.Leashable;
|
||||
import net.minecraft.entity.decoration.ArmorStandEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.LeadItem;
|
||||
import net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket;
|
||||
import net.minecraft.server.network.ServerPlayNetworkHandler;
|
||||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
@@ -12,12 +15,23 @@ import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mixin(ServerPlayerEntity.class)
|
||||
public abstract class MixinServerPlayerEntity extends PlayerEntity {
|
||||
@Shadow
|
||||
public ServerPlayNetworkHandler networkHandler;
|
||||
|
||||
@Shadow public abstract boolean isSpectator();
|
||||
|
||||
@Unique
|
||||
private int sneakTimes = 0;
|
||||
@Unique
|
||||
private long lastSneakTime = 0;
|
||||
|
||||
public MixinServerPlayerEntity(World world, BlockPos pos, float yaw, GameProfile gameProfile) {
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
package com.github.zly2006.carpetslsaddition.mixin.server;
|
||||
|
||||
import com.github.zly2006.carpetslsaddition.util.access.ServerAccess;
|
||||
import com.github.zly2006.carpetslsaddition.util.access.ServerAccessor;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.server.dedicated.MinecraftDedicatedServer;
|
||||
@@ -11,7 +11,7 @@ import org.spongepowered.asm.mixin.Shadow;
|
||||
|
||||
@Environment(EnvType.SERVER)
|
||||
@Mixin(MinecraftDedicatedServer.class)
|
||||
public class MixinMinecraftDedicatedServer implements ServerAccess {
|
||||
public class MixinMinecraftDedicatedServer implements ServerAccessor {
|
||||
|
||||
@Shadow
|
||||
@Final
|
||||
|
||||
@@ -3,7 +3,7 @@ package com.github.zly2006.carpetslsaddition.mixin.world;
|
||||
import com.github.zly2006.carpetslsaddition.ServerMain;
|
||||
import com.github.zly2006.carpetslsaddition.block.RewriteChainRestrictedNeighborUpdater;
|
||||
import com.github.zly2006.carpetslsaddition.util.NeighborUpdaterChanger;
|
||||
import com.github.zly2006.carpetslsaddition.util.access.ServerAccess;
|
||||
import com.github.zly2006.carpetslsaddition.util.access.ServerAccessor;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import net.minecraft.world.World;
|
||||
@@ -27,7 +27,7 @@ public abstract class MixinWorld implements NeighborUpdaterChanger {
|
||||
int maxDepth;
|
||||
|
||||
if (FabricLoader.getInstance().getEnvironmentType() == EnvType.SERVER) {
|
||||
maxDepth = ((ServerAccess) ServerMain.server).getPropertiesLoader().getPropertiesHandler().maxChainedNeighborUpdates;
|
||||
maxDepth = ((ServerAccessor) ServerMain.server).getPropertiesLoader().getPropertiesHandler().maxChainedNeighborUpdates;
|
||||
}
|
||||
else {
|
||||
maxDepth = 1000000;
|
||||
|
||||
+1
-1
@@ -2,6 +2,6 @@ package com.github.zly2006.carpetslsaddition.util.access;
|
||||
|
||||
import net.minecraft.text.Text;
|
||||
|
||||
public interface PlayerAccess {
|
||||
public interface PlayerAccessor {
|
||||
void carpet_SLS_Addition$setDisplayName(Text name);
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.github.zly2006.carpetslsaddition.util.access;
|
||||
|
||||
public interface SLSBotAccessor {
|
||||
boolean carpet_SLS_Addition$isBot();
|
||||
void carpet_SLS_Addition$setBot(boolean isBot);
|
||||
long carpet_SLS_Addition$getSpawnTime();
|
||||
void carpet_SLS_Addition$setSpawnTime(long spawnTime);
|
||||
}
|
||||
+1
-1
@@ -2,6 +2,6 @@ package com.github.zly2006.carpetslsaddition.util.access;
|
||||
|
||||
import net.minecraft.server.dedicated.ServerPropertiesLoader;
|
||||
|
||||
public interface ServerAccess {
|
||||
public interface ServerAccessor {
|
||||
ServerPropertiesLoader getPropertiesLoader();
|
||||
}
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
package com.github.zly2006.carpetslsaddition.util.access;
|
||||
|
||||
public interface SettingsManagerAccessor {
|
||||
void loadSettings();
|
||||
void carpet_SLS_Addition$loadSettings();
|
||||
}
|
||||
Reference in new issue
Block a user