update.
This commit is contained in:
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.*;
|
||||||
import io.ib67.sfcraft.module.chat.ChatPingModule;
|
import io.ib67.sfcraft.module.chat.ChatPingModule;
|
||||||
import io.ib67.sfcraft.module.chat.ChatSendLocModule;
|
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.module.randomevt.LongNightModule;
|
||||||
import io.ib67.sfcraft.registry.chat.SimpleMessageDecorator;
|
import io.ib67.sfcraft.registry.chat.SimpleMessageDecorator;
|
||||||
import io.ib67.sfcraft.registry.event.SFRandomEventRegistry;
|
import io.ib67.sfcraft.registry.event.SFRandomEventRegistry;
|
||||||
@@ -49,6 +50,7 @@ public class SFCraftInitializer extends GuiceModInitializer {
|
|||||||
registerFeature(ChatPingModule.class);
|
registerFeature(ChatPingModule.class);
|
||||||
registerFeature(ChatSendLocModule.class);
|
registerFeature(ChatSendLocModule.class);
|
||||||
registerFeature(LongNightModule.class);
|
registerFeature(LongNightModule.class);
|
||||||
|
registerFeature(ModCompatModule.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
|
|
||||||
@Log4j2
|
@Log4j2
|
||||||
public class SFEntityType {
|
public class SFEntityType {
|
||||||
public final EntityType<SFGuiderEntity> GUIDER = Registry.register(
|
public static final EntityType<SFGuiderEntity> GUIDER = Registry.register(
|
||||||
Registries.ENTITY_TYPE,
|
Registries.ENTITY_TYPE,
|
||||||
Identifier.of("sfcraft", "guider"),
|
Identifier.of("sfcraft", "guider"),
|
||||||
EntityType.Builder.create(SFGuiderEntity::new, SpawnGroup.CREATURE)
|
EntityType.Builder.create(SFGuiderEntity::new, SpawnGroup.CREATURE)
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ import static java.net.http.HttpResponse.BodyHandlers.ofFile;
|
|||||||
@Log4j2
|
@Log4j2
|
||||||
@Singleton
|
@Singleton
|
||||||
public class MaxMindGeoIPService implements Module, GeoIPService {
|
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 Path mmdbPath;
|
||||||
private final DatabaseReader databaseReader;
|
private final DatabaseReader databaseReader;
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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.callback.SFCallbacks;
|
||||||
import net.minecraft.entity.Entity;
|
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
-1
@@ -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.callback.SFCallbacks;
|
||||||
import io.ib67.sfcraft.mixin.server.bridge.EntityBridge;
|
import io.ib67.sfcraft.mixin.server.bridge.EntityBridge;
|
||||||
@@ -1,30 +1,17 @@
|
|||||||
package io.ib67.sfcraft.mixin.server.fixes;
|
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.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.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
public class EndermanEntityMixin {
|
@Mixin(EndermanEntity.class)
|
||||||
@Mixin(targets = "net.minecraft.entity.mob.EndermanEntity$ChasePlayerGoal")
|
public abstract class EndermanEntityMixin extends MobEntityMixin {
|
||||||
public static class ChaseGoalMixin {
|
@Inject(at = @At("HEAD"), method = "cannotDespawn", cancellable = true)
|
||||||
@Shadow
|
private void sf$cannotDespawn(CallbackInfoReturnable<Boolean> cir) {
|
||||||
@Final
|
cir.setReturnValue(super.cannotDespawn());
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -28,22 +28,11 @@ public class ElytraSpeedMeterModule extends ServerModule {
|
|||||||
private static final int BAR_LEN = 20;
|
private static final int BAR_LEN = 20;
|
||||||
private static final int MAX_NORMAL_SPEED = 6;
|
private static final int MAX_NORMAL_SPEED = 6;
|
||||||
private static final int THRESHLD_OF_ELYTRA_FLY = 8;
|
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[] 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 Object2ObjectMap<PlayerEntity, BlockPos> playerFlyMap = new Object2ObjectOpenHashMap<>();
|
||||||
private final Object2FloatMap<PlayerEntity> lastMeasuredSpeed = new Object2FloatOpenHashMap<>();
|
private final Object2FloatMap<PlayerEntity> lastMeasuredSpeed = new Object2FloatOpenHashMap<>();
|
||||||
|
|
||||||
static {
|
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++) {
|
for (int i = 1; i <= 100; i++) {
|
||||||
ELYTRA_DURABILITY[i - 1] = Text.literal("ELYTRA: " + i + "%").withColor(getDamageColor(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) {
|
private void onFlying(PlayerEntity player, long f, boolean b) {
|
||||||
if (f < THRESHLD_OF_ELYTRA_FLY * 20) {
|
if (f < THRESHLD_OF_ELYTRA_FLY * 20) {
|
||||||
if (f > THRESHLD_OF_ELYTRA_FLY * 15) {
|
|
||||||
player.sendMessage(KEEP_FLYING, true);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (b) {
|
if (b) {
|
||||||
if (!lastMeasuredSpeed.containsKey(player)) {
|
|
||||||
((ServerPlayerEntity) player).networkHandler.sendPacket(new TitleFadeS2CPacket(0, 20, 0));
|
|
||||||
}
|
|
||||||
var text = Text.literal("");
|
var text = Text.literal("");
|
||||||
text.append(generateYMeter(f, player));
|
|
||||||
text.append(generateSpeedMeter(f, player));
|
|
||||||
text.append(generateDurabilityMeter(f, player));
|
text.append(generateDurabilityMeter(f, player));
|
||||||
player.sendMessage(text, true);
|
player.sendMessage(text, true);
|
||||||
((ServerPlayerEntity) player).networkHandler.sendPacket(new TitleS2CPacket(Text.empty()));
|
|
||||||
((ServerPlayerEntity) player).networkHandler.sendPacket(buildPitchMeter(player));
|
|
||||||
} else {
|
} else {
|
||||||
clean((ServerPlayerEntity) player);
|
clean((ServerPlayerEntity) player);
|
||||||
((ServerPlayerEntity) player).networkHandler.sendPacket(new TitleFadeS2CPacket(10, 20, 10));
|
|
||||||
if (f > THRESHLD_OF_ELYTRA_FLY * 20) {
|
if (f > THRESHLD_OF_ELYTRA_FLY * 20) {
|
||||||
player.sendMessage(Text.literal("!! LANDED !!").withColor(Colors.GREEN), true);
|
player.sendMessage(Text.literal("!! LANDED !!").withColor(Colors.GREEN), true);
|
||||||
((ServerPlayerEntity) player).networkHandler.sendPacket(new SubtitleS2CPacket(Text.empty()));
|
|
||||||
} else {
|
} else {
|
||||||
player.sendMessage(Text.empty(), true);
|
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) {
|
private Text generateDurabilityMeter(long f, PlayerEntity player) {
|
||||||
var stack = player.getInventory().getArmorStack(PlayerInventory.ARMOR_SLOTS[2]);
|
var stack = player.getInventory().getArmorStack(PlayerInventory.ARMOR_SLOTS[2]);
|
||||||
if (stack.isDamageable() && stack.isDamaged()) {
|
if (stack.isDamageable() && stack.isDamaged()) {
|
||||||
@@ -130,69 +92,4 @@ public class ElytraSpeedMeterModule extends ServerModule {
|
|||||||
}
|
}
|
||||||
return Colors.RED;
|
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.registry.chat.SimpleMessageDecorator;
|
||||||
import io.ib67.sfcraft.util.Helper;
|
import io.ib67.sfcraft.util.Helper;
|
||||||
import io.ib67.sfcraft.util.SFConsts;
|
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.network.message.MessageDecorator;
|
||||||
import net.minecraft.registry.RegistryKey;
|
import net.minecraft.registry.RegistryKey;
|
||||||
import net.minecraft.server.network.ServerPlayerEntity;
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
@@ -35,6 +38,7 @@ public class ChatSendLocModule extends ServerModule implements MessageDecorator
|
|||||||
|
|
||||||
private static Text generateLocText(ServerPlayerEntity sender) {
|
private static Text generateLocText(ServerPlayerEntity sender) {
|
||||||
if (sender == null) return Text.of(" (invalid position) ");
|
if (sender == null) return Text.of(" (invalid position) ");
|
||||||
|
sender.addStatusEffect(new StatusEffectInstance(StatusEffects.GLOWING));
|
||||||
var x = sender.getBlockPos().getX();
|
var x = sender.getBlockPos().getX();
|
||||||
var y = sender.getBlockPos().getY();
|
var y = sender.getBlockPos().getY();
|
||||||
var z = sender.getBlockPos().getZ();
|
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() {
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,10 +9,10 @@
|
|||||||
],
|
],
|
||||||
"server": [
|
"server": [
|
||||||
"server.AbstractFurnaceBlockMixin",
|
"server.AbstractFurnaceBlockMixin",
|
||||||
"server.EntityMixin",
|
"common.EntityMixin",
|
||||||
"server.LegacyQueryHandlerMixin",
|
"server.LegacyQueryHandlerMixin",
|
||||||
"server.MinecraftServerMixin",
|
"server.MinecraftServerMixin",
|
||||||
"server.PlayerEntityMixin",
|
"common.PlayerEntityMixin",
|
||||||
"server.ServerHandshakeNetworkHandlerMixin",
|
"server.ServerHandshakeNetworkHandlerMixin",
|
||||||
"server.ServerLoginNetworkHandlerMixin",
|
"server.ServerLoginNetworkHandlerMixin",
|
||||||
"server.ServerPlayerEntityMixin",
|
"server.ServerPlayerEntityMixin",
|
||||||
@@ -22,7 +22,8 @@
|
|||||||
"server.bridge.EntityBridge",
|
"server.bridge.EntityBridge",
|
||||||
"server.bridge.ServerPlayerBridge",
|
"server.bridge.ServerPlayerBridge",
|
||||||
"server.bridge.ServerWorldBridge",
|
"server.bridge.ServerWorldBridge",
|
||||||
"server.fixes.EndermanEntityMixin$ChaseGoalMixin",
|
"server.fixes.EndermanEntityMixin",
|
||||||
|
"common.MobEntityMixin",
|
||||||
"server.hack.EntitySpawnS2CPacketMixin",
|
"server.hack.EntitySpawnS2CPacketMixin",
|
||||||
"server.hack.RegistryHandlerMixin",
|
"server.hack.RegistryHandlerMixin",
|
||||||
"server.hack.HoverEntityContentMixin"
|
"server.hack.HoverEntityContentMixin"
|
||||||
|
|||||||
Reference in new issue
Block a user