diff --git a/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java b/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java index 9c8ce6e..ec6a26c 100644 --- a/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java +++ b/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java @@ -6,6 +6,7 @@ import com.google.inject.*; import io.ib67.sfcraft.module.*; import io.ib67.sfcraft.module.chat.ChatPingModule; import io.ib67.sfcraft.module.chat.ChatSendLocModule; +import io.ib67.sfcraft.module.compat.ModCompatModule; import io.ib67.sfcraft.module.randomevt.LongNightModule; import io.ib67.sfcraft.registry.chat.SimpleMessageDecorator; import io.ib67.sfcraft.registry.event.SFRandomEventRegistry; @@ -49,6 +50,7 @@ public class SFCraftInitializer extends GuiceModInitializer { registerFeature(ChatPingModule.class); registerFeature(ChatSendLocModule.class); registerFeature(LongNightModule.class); + registerFeature(ModCompatModule.class); } @Override diff --git a/src/main/java/io/ib67/sfcraft/SFEntityType.java b/src/main/java/io/ib67/sfcraft/SFEntityType.java index 1844615..d3c7b9d 100644 --- a/src/main/java/io/ib67/sfcraft/SFEntityType.java +++ b/src/main/java/io/ib67/sfcraft/SFEntityType.java @@ -19,7 +19,7 @@ import java.util.concurrent.ConcurrentHashMap; @Log4j2 public class SFEntityType { - public final EntityType GUIDER = Registry.register( + public static final EntityType GUIDER = Registry.register( Registries.ENTITY_TYPE, Identifier.of("sfcraft", "guider"), EntityType.Builder.create(SFGuiderEntity::new, SpawnGroup.CREATURE) diff --git a/src/main/java/io/ib67/sfcraft/geoip/MaxMindGeoIPService.java b/src/main/java/io/ib67/sfcraft/geoip/MaxMindGeoIPService.java index 5a5f134..04f14b9 100644 --- a/src/main/java/io/ib67/sfcraft/geoip/MaxMindGeoIPService.java +++ b/src/main/java/io/ib67/sfcraft/geoip/MaxMindGeoIPService.java @@ -27,7 +27,7 @@ import static java.net.http.HttpResponse.BodyHandlers.ofFile; @Log4j2 @Singleton public class MaxMindGeoIPService implements Module, GeoIPService { - private static final URI GEOIP_DOWNLOAD_URL = URI.create("http://sfclub.cc/GeoLite2-City.mmdb"); + private static final URI GEOIP_DOWNLOAD_URL = URI.create("https://sfclub.cc/GeoLite2-City.mmdb"); private Path mmdbPath; private final DatabaseReader databaseReader; diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/EntityMixin.java b/src/main/java/io/ib67/sfcraft/mixin/common/EntityMixin.java similarity index 95% rename from src/main/java/io/ib67/sfcraft/mixin/server/EntityMixin.java rename to src/main/java/io/ib67/sfcraft/mixin/common/EntityMixin.java index f65750c..da41e24 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/EntityMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/common/EntityMixin.java @@ -1,4 +1,4 @@ -package io.ib67.sfcraft.mixin.server; +package io.ib67.sfcraft.mixin.common; import io.ib67.sfcraft.callback.SFCallbacks; import net.minecraft.entity.Entity; diff --git a/src/main/java/io/ib67/sfcraft/mixin/common/MobEntityMixin.java b/src/main/java/io/ib67/sfcraft/mixin/common/MobEntityMixin.java new file mode 100644 index 0000000..0fa4e58 --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/mixin/common/MobEntityMixin.java @@ -0,0 +1,13 @@ +package io.ib67.sfcraft.mixin.common; + +import net.minecraft.entity.mob.MobEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(MobEntity.class) +public abstract class MobEntityMixin { + @Shadow + public boolean cannotDespawn() { + throw new AssertionError(); + } +} diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/PlayerEntityMixin.java b/src/main/java/io/ib67/sfcraft/mixin/common/PlayerEntityMixin.java similarity index 96% rename from src/main/java/io/ib67/sfcraft/mixin/server/PlayerEntityMixin.java rename to src/main/java/io/ib67/sfcraft/mixin/common/PlayerEntityMixin.java index 492f93f..6b5ed9a 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/PlayerEntityMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/common/PlayerEntityMixin.java @@ -1,4 +1,4 @@ -package io.ib67.sfcraft.mixin.server; +package io.ib67.sfcraft.mixin.common; import io.ib67.sfcraft.callback.SFCallbacks; import io.ib67.sfcraft.mixin.server.bridge.EntityBridge; diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/fixes/EndermanEntityMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/fixes/EndermanEntityMixin.java index 29a14ce..3b18ba4 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/fixes/EndermanEntityMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/server/fixes/EndermanEntityMixin.java @@ -1,30 +1,17 @@ package io.ib67.sfcraft.mixin.server.fixes; -import net.minecraft.entity.LivingEntity; +import io.ib67.sfcraft.mixin.common.MobEntityMixin; import net.minecraft.entity.mob.EndermanEntity; -import net.minecraft.entity.player.PlayerEntity; -import org.jetbrains.annotations.Nullable; -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; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -public class EndermanEntityMixin { - @Mixin(targets = "net.minecraft.entity.mob.EndermanEntity$ChasePlayerGoal") - public static class ChaseGoalMixin { - @Shadow - @Final - private EndermanEntity enderman; - - @Inject(method = "canStart", at = @At("HEAD"), cancellable = true) - public void fixCrossDimTeleport(CallbackInfoReturnable cir) { - var target = enderman.getTarget(); - if (target!=null && enderman.getWorld() != target.getWorld()) { - cir.setReturnValue(false); - } - } - +@Mixin(EndermanEntity.class) +public abstract class EndermanEntityMixin extends MobEntityMixin { + @Inject(at = @At("HEAD"), method = "cannotDespawn", cancellable = true) + private void sf$cannotDespawn(CallbackInfoReturnable cir) { + cir.setReturnValue(super.cannotDespawn()); } + } diff --git a/src/main/java/io/ib67/sfcraft/module/ElytraSpeedMeterModule.java b/src/main/java/io/ib67/sfcraft/module/ElytraSpeedMeterModule.java index e6cd7d1..7695115 100644 --- a/src/main/java/io/ib67/sfcraft/module/ElytraSpeedMeterModule.java +++ b/src/main/java/io/ib67/sfcraft/module/ElytraSpeedMeterModule.java @@ -28,22 +28,11 @@ public class ElytraSpeedMeterModule extends ServerModule { private static final int BAR_LEN = 20; private static final int MAX_NORMAL_SPEED = 6; private static final int THRESHLD_OF_ELYTRA_FLY = 8; - private static final Color BAR_LEFT = new Color(85, 85, 255); - private static final Color BAR_RIGHT = new Color(255, 87, 51); - private static final Text KEEP_FLYING = Text.literal("... 保持飞行以启动仪表盘 ...").withColor(Colors.LIGHT_GRAY); private static final Text[] ELYTRA_DURABILITY = new Text[100]; - private static final Text[] PROGRESS_BARS = new Text[BAR_LEN]; - private static final Text[] Y_METER = new Text[256]; private final Object2ObjectMap playerFlyMap = new Object2ObjectOpenHashMap<>(); private final Object2FloatMap lastMeasuredSpeed = new Object2FloatOpenHashMap<>(); static { - for (int i = 1; i <= BAR_LEN; i++) { - PROGRESS_BARS[i - 1] = buildProgressBar(i); - } - for (int i = 1; i <= 256; i++) { - Y_METER[i - 1] = makeYMeter(i); - } for (int i = 1; i <= 100; i++) { ELYTRA_DURABILITY[i - 1] = Text.literal("ELYTRA: " + i + "%").withColor(getDamageColor(i)); } @@ -66,28 +55,16 @@ public class ElytraSpeedMeterModule extends ServerModule { private void onFlying(PlayerEntity player, long f, boolean b) { if (f < THRESHLD_OF_ELYTRA_FLY * 20) { - if (f > THRESHLD_OF_ELYTRA_FLY * 15) { - player.sendMessage(KEEP_FLYING, true); - } return; } if (b) { - if (!lastMeasuredSpeed.containsKey(player)) { - ((ServerPlayerEntity) player).networkHandler.sendPacket(new TitleFadeS2CPacket(0, 20, 0)); - } var text = Text.literal(""); - text.append(generateYMeter(f, player)); - text.append(generateSpeedMeter(f, player)); text.append(generateDurabilityMeter(f, player)); player.sendMessage(text, true); - ((ServerPlayerEntity) player).networkHandler.sendPacket(new TitleS2CPacket(Text.empty())); - ((ServerPlayerEntity) player).networkHandler.sendPacket(buildPitchMeter(player)); } else { clean((ServerPlayerEntity) player); - ((ServerPlayerEntity) player).networkHandler.sendPacket(new TitleFadeS2CPacket(10, 20, 10)); if (f > THRESHLD_OF_ELYTRA_FLY * 20) { player.sendMessage(Text.literal("!! LANDED !!").withColor(Colors.GREEN), true); - ((ServerPlayerEntity) player).networkHandler.sendPacket(new SubtitleS2CPacket(Text.empty())); } else { player.sendMessage(Text.empty(), true); @@ -95,21 +72,6 @@ public class ElytraSpeedMeterModule extends ServerModule { } } - private Packet buildPitchMeter(PlayerEntity player) { - var pitch = player.getPitch(); - MutableText text; - var display = (Math.ceil(Math.abs(pitch) * 100) / 100); - if (pitch < 0) { // 朝上 - text = Text.literal("🡹 " + display + "°"); - } else { - text = Text.literal("🡻 " + display + "°"); - } - if (pitch > 75) { - text.withColor(Colors.LIGHT_RED); - } - return new SubtitleS2CPacket(text); - } - private Text generateDurabilityMeter(long f, PlayerEntity player) { var stack = player.getInventory().getArmorStack(PlayerInventory.ARMOR_SLOTS[2]); if (stack.isDamageable() && stack.isDamaged()) { @@ -130,69 +92,4 @@ public class ElytraSpeedMeterModule extends ServerModule { } return Colors.RED; } - - private Text generateYMeter(long f, PlayerEntity player) { - var y = player.getBlockY(); - if (y <= 256 && y > 0) { - return Y_METER[y - 1]; - } else { - return makeYMeter(y); - } - } - - private static Text makeYMeter(int y) { - return Text.literal("Y: " + y + " | ").withColor(getYColor(y)); - } - - private static int getYColor(int y) { - if (y < 120) { - return Colors.YELLOW; - } else if (y <= 180) { - return Colors.GREEN; - } else { - return Colors.BLUE; - } - } - - private Text generateSpeedMeter(long flyTime, PlayerEntity player) { - final var MEASURE_TIME = 5; - if (!playerFlyMap.containsKey(player)) { - playerFlyMap.put(player, player.getBlockPos()); - return Text.empty(); - } - float speed; - if (flyTime % MEASURE_TIME == 0) { - var pos = playerFlyMap.get(player); - var distance = player.squaredDistanceTo(pos.getX(), pos.getY(), pos.getZ()); - speed = (float) (Math.abs(Math.round(distance / Math.pow(MEASURE_TIME, 2) * 100) * 0.01)); - lastMeasuredSpeed.put(player, speed); - playerFlyMap.put(player, player.getBlockPos()); - } else { - speed = lastMeasuredSpeed.getFloat(player); - } - var percentToSix = speed / MAX_NORMAL_SPEED; - var result = Text.literal("SPD: ["); - - - int steps = (int) Math.ceil(percentToSix * BAR_LEN); - if (steps > BAR_LEN - 1) { - steps = BAR_LEN - 1; - } - result.append(PROGRESS_BARS[steps]); - result.append("] " + Math.ceil(speed * 100) / 100 + "/s | "); - if (speed > MAX_NORMAL_SPEED) { - result.withColor(Colors.LIGHT_RED); - } - return result; - } - - private static Text buildProgressBar(int steps) { - var result = Text.literal(""); - for (int i = 0; i < steps; i++) { - var color = ColorHelper.interpolate(ColorHelper.GradientType.HSV, BAR_LEFT, BAR_RIGHT, (float) ((double) i / BAR_LEN)); - result.append(Text.literal("|").withColor(color.getRGB())); - } - result.append(Text.literal("|".repeat(BAR_LEN - steps)).withColor(Colors.LIGHT_GRAY)); - return result; - } } diff --git a/src/main/java/io/ib67/sfcraft/module/chat/ChatSendLocModule.java b/src/main/java/io/ib67/sfcraft/module/chat/ChatSendLocModule.java index 9983ebc..2c796b7 100644 --- a/src/main/java/io/ib67/sfcraft/module/chat/ChatSendLocModule.java +++ b/src/main/java/io/ib67/sfcraft/module/chat/ChatSendLocModule.java @@ -5,6 +5,9 @@ import io.ib67.sfcraft.ServerModule; import io.ib67.sfcraft.registry.chat.SimpleMessageDecorator; import io.ib67.sfcraft.util.Helper; import io.ib67.sfcraft.util.SFConsts; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffectUtil; +import net.minecraft.entity.effect.StatusEffects; import net.minecraft.network.message.MessageDecorator; import net.minecraft.registry.RegistryKey; import net.minecraft.server.network.ServerPlayerEntity; @@ -35,6 +38,7 @@ public class ChatSendLocModule extends ServerModule implements MessageDecorator private static Text generateLocText(ServerPlayerEntity sender) { if (sender == null) return Text.of(" (invalid position) "); + sender.addStatusEffect(new StatusEffectInstance(StatusEffects.GLOWING)); var x = sender.getBlockPos().getX(); var y = sender.getBlockPos().getY(); var z = sender.getBlockPos().getZ(); diff --git a/src/main/java/io/ib67/sfcraft/module/compat/ModCompatModule.java b/src/main/java/io/ib67/sfcraft/module/compat/ModCompatModule.java new file mode 100644 index 0000000..f962990 --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/module/compat/ModCompatModule.java @@ -0,0 +1,17 @@ +package io.ib67.sfcraft.module.compat; + +import io.ib67.sfcraft.SFEntityType; +import io.ib67.sfcraft.ServerModule; +import io.ib67.sfcraft.entity.SFGuiderEntity; +import net.fabricmc.fabric.api.entity.event.v1.ServerPlayerEvents; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; +import net.minecraft.entity.Entity; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.world.ServerWorld; + +public class ModCompatModule extends ServerModule { + @Override + public void onInitialize() { + } +} diff --git a/src/main/resources/sfcraft.mixins.json b/src/main/resources/sfcraft.mixins.json index ee36b78..b5a95a5 100644 --- a/src/main/resources/sfcraft.mixins.json +++ b/src/main/resources/sfcraft.mixins.json @@ -9,10 +9,10 @@ ], "server": [ "server.AbstractFurnaceBlockMixin", - "server.EntityMixin", + "common.EntityMixin", "server.LegacyQueryHandlerMixin", "server.MinecraftServerMixin", - "server.PlayerEntityMixin", + "common.PlayerEntityMixin", "server.ServerHandshakeNetworkHandlerMixin", "server.ServerLoginNetworkHandlerMixin", "server.ServerPlayerEntityMixin", @@ -22,7 +22,8 @@ "server.bridge.EntityBridge", "server.bridge.ServerPlayerBridge", "server.bridge.ServerWorldBridge", - "server.fixes.EndermanEntityMixin$ChaseGoalMixin", + "server.fixes.EndermanEntityMixin", + "common.MobEntityMixin", "server.hack.EntitySpawnS2CPacketMixin", "server.hack.RegistryHandlerMixin", "server.hack.HoverEntityContentMixin"