This commit is contained in:
iceBear67 committed 2024-08-10 10:47:49 +08:00
1 parent 06db791ed2
commit 4dbc691d93
11 files changed
+51 -130

No files matched your search

@@ -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
@@ -19,7 +19,7 @@ import java.util.concurrent.ConcurrentHashMap;
@Log4j2
public class SFEntityType {
public final EntityType<SFGuiderEntity> GUIDER = Registry.register(
public static final EntityType<SFGuiderEntity> GUIDER = Registry.register(
Registries.ENTITY_TYPE,
Identifier.of("sfcraft", "guider"),
EntityType.Builder.create(SFGuiderEntity::new, SpawnGroup.CREATURE)
@@ -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;
@@ -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;
@@ -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();
}
}
@@ -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;
@@ -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<Boolean> 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<Boolean> cir) {
cir.setReturnValue(super.cannotDespawn());
}
}
@@ -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<PlayerEntity, BlockPos> playerFlyMap = new Object2ObjectOpenHashMap<>();
private final Object2FloatMap<PlayerEntity> 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;
}
}
@@ -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();
@@ -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() {
}
}
+4 -3
View File
@@ -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"