fix: basic functionality are now working.
This commit is contained in:
10 files changed
+32
-13
No files matched your search
@@ -6,6 +6,6 @@ public interface Lifecycle {
|
|||||||
void onStateChange(State state);
|
void onStateChange(State state);
|
||||||
|
|
||||||
enum State {
|
enum State {
|
||||||
ENABLED, DISABLED,ERROR;
|
ENABLED, DISABLED,ERROR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,9 @@ package io.ib67.sfcraft;
|
|||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
import com.google.inject.*;
|
import com.google.inject.*;
|
||||||
|
import io.ib67.sfcraft.module.chat.ChatPingModule;
|
||||||
|
import io.ib67.sfcraft.module.chat.ChatSendLocModule;
|
||||||
|
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;
|
||||||
import io.ib67.sfcraft.init.GuiceModInitializer;
|
import io.ib67.sfcraft.init.GuiceModInitializer;
|
||||||
@@ -43,6 +46,10 @@ public class SFCraftInitializer extends GuiceModInitializer {
|
|||||||
registerFeature(PlayLimitModule.class);
|
registerFeature(PlayLimitModule.class);
|
||||||
registerFeature(BackModule.class);
|
registerFeature(BackModule.class);
|
||||||
registerFeature(ManagementModule.class);
|
registerFeature(ManagementModule.class);
|
||||||
|
|
||||||
|
registerFeature(ChatPingModule.class);
|
||||||
|
registerFeature(ChatSendLocModule.class);
|
||||||
|
registerFeature(LongNightModule.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -52,13 +59,14 @@ public class SFCraftInitializer extends GuiceModInitializer {
|
|||||||
SFCraft.server = minecraftServer;
|
SFCraft.server = minecraftServer;
|
||||||
SFCraft.injector = getInjector();
|
SFCraft.injector = getInjector();
|
||||||
getModuleManager().switchGlobalState(Lifecycle.State.ENABLED);
|
getModuleManager().switchGlobalState(Lifecycle.State.ENABLED);
|
||||||
|
log.info("Load completed! "+getModuleManager().getModules().size()+" modules were loaded.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Injector onInit() {
|
protected Injector onInit() {
|
||||||
return Guice.createInjector(
|
return Guice.createInjector(
|
||||||
this,
|
new SFCraft(),
|
||||||
new SFCraft()
|
this
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -18,7 +18,7 @@ public abstract class ServerModule extends AbstractModule implements Lifecycle {
|
|||||||
}
|
}
|
||||||
this.state = state;
|
this.state = state;
|
||||||
} catch (Exception exception) {
|
} catch (Exception exception) {
|
||||||
log.error("An error occurred when " + getName() + " is changing its state into " + state);
|
log.error("An error occurred when " + getName() + " is changing its state into " + state,exception);
|
||||||
this.state = State.ERROR;
|
this.state = State.ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ class Utility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static <T, A> Optional<A> anyMatch(T[] ts, Function<T, A> function, Predicate<A> failurePredicate) {
|
static <T, A> Optional<A> anyMatch(T[] ts, Function<T, A> function, Predicate<A> failurePredicate) {
|
||||||
A r = null;
|
A r;
|
||||||
for (T handler : ts) {
|
for (T handler : ts) {
|
||||||
r = function.apply(handler);
|
r = function.apply(handler);
|
||||||
if (failurePredicate.test(r)) {
|
if (failurePredicate.test(r)) {
|
||||||
|
|||||||
@@ -27,13 +27,11 @@ import static java.net.http.HttpResponse.BodyHandlers.ofFile;
|
|||||||
@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("http://sfclub.cc/GeoLite2-City.mmdb");
|
||||||
@Inject
|
|
||||||
@ConfigRoot
|
|
||||||
private Path configRoot;
|
|
||||||
private Path mmdbPath;
|
private Path mmdbPath;
|
||||||
private final DatabaseReader databaseReader;
|
private final DatabaseReader databaseReader;
|
||||||
|
|
||||||
public MaxMindGeoIPService() throws InterruptedException {
|
@Inject
|
||||||
|
public MaxMindGeoIPService(@ConfigRoot Path configRoot) throws InterruptedException {
|
||||||
mmdbPath = configRoot.resolve("GeoLite2-City.mmdb");
|
mmdbPath = configRoot.resolve("GeoLite2-City.mmdb");
|
||||||
databaseReader = loadData();
|
databaseReader = loadData();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import io.ib67.sfcraft.module.manager.ModuleManager;
|
|||||||
import io.ib67.sfcraft.module.manager.SimpleModuleManager;
|
import io.ib67.sfcraft.module.manager.SimpleModuleManager;
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import lombok.extern.log4j.Log4j2;
|
||||||
import net.fabricmc.api.ModInitializer;
|
import net.fabricmc.api.ModInitializer;
|
||||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
|
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
|
||||||
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
|
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
|
||||||
@@ -20,6 +21,7 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
|
@Log4j2
|
||||||
public abstract class GuiceModInitializer extends AbstractModule implements ModInitializer {
|
public abstract class GuiceModInitializer extends AbstractModule implements ModInitializer {
|
||||||
public static AtomicBoolean initialized = new AtomicBoolean(false);
|
public static AtomicBoolean initialized = new AtomicBoolean(false);
|
||||||
@Getter(AccessLevel.PROTECTED)
|
@Getter(AccessLevel.PROTECTED)
|
||||||
@@ -33,15 +35,20 @@ public abstract class GuiceModInitializer extends AbstractModule implements ModI
|
|||||||
ServerPlayConnectionEvents.JOIN.register(handler::defend);
|
ServerPlayConnectionEvents.JOIN.register(handler::defend);
|
||||||
ServerLifecycleEvents.SERVER_STARTED.register(this::onServerStarted);
|
ServerLifecycleEvents.SERVER_STARTED.register(this::onServerStarted);
|
||||||
injector = onInit();
|
injector = onInit();
|
||||||
}
|
|
||||||
|
|
||||||
private void onServerStarted(MinecraftServer server) {
|
|
||||||
var map = new HashMap<String, ServerModule>();
|
var map = new HashMap<String, ServerModule>();
|
||||||
for (Class<? extends ServerModule> registeredFeature : registeredFeatures) {
|
for (Class<? extends ServerModule> registeredFeature : registeredFeatures) {
|
||||||
var module = injector.getInstance(registeredFeature);
|
var module = injector.getInstance(registeredFeature);
|
||||||
|
try {
|
||||||
|
module.onInitialize();
|
||||||
map.put(module.getName(), module);
|
map.put(module.getName(), module);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Cannot initialize module " + module.getName(), e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
moduleManager = new SimpleModuleManager(ImmutableMap.copyOf(map));
|
moduleManager = new SimpleModuleManager(ImmutableMap.copyOf(map));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onServerStarted(MinecraftServer server) {
|
||||||
onReady(server);
|
onReady(server);
|
||||||
initialized.set(true);
|
initialized.set(true);
|
||||||
}
|
}
|
||||||
@@ -57,5 +64,6 @@ public abstract class GuiceModInitializer extends AbstractModule implements ModI
|
|||||||
|
|
||||||
protected void registerFeature(Class<? extends ServerModule> featureClass) {
|
protected void registerFeature(Class<? extends ServerModule> featureClass) {
|
||||||
binder().bind(featureClass).in(Singleton.class);
|
binder().bind(featureClass).in(Singleton.class);
|
||||||
|
registeredFeatures.add(featureClass);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -14,6 +14,7 @@ import net.minecraft.world.World;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Overwrite;
|
import org.spongepowered.asm.mixin.Overwrite;
|
||||||
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
|
|
||||||
@Mixin(AbstractFurnaceBlock.class)
|
@Mixin(AbstractFurnaceBlock.class)
|
||||||
public abstract class AbstractFurnaceBlockMixin extends BlockWithEntity {
|
public abstract class AbstractFurnaceBlockMixin extends BlockWithEntity {
|
||||||
@@ -32,6 +33,7 @@ public abstract class AbstractFurnaceBlockMixin extends BlockWithEntity {
|
|||||||
return world.isClient ? null : BlockWithEntity.validateTicker(givenType, expectedType, AbstractFurnaceBlockMixin::tickMultiple);
|
return world.isClient ? null : BlockWithEntity.validateTicker(givenType, expectedType, AbstractFurnaceBlockMixin::tickMultiple);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Unique
|
||||||
private static void tickMultiple(World world, BlockPos pos, BlockState state, AbstractFurnaceBlockEntity blockEntity) {
|
private static void tickMultiple(World world, BlockPos pos, BlockState state, AbstractFurnaceBlockEntity blockEntity) {
|
||||||
AbstractFurnaceBlockEntity.tick(world, pos, state, blockEntity);
|
AbstractFurnaceBlockEntity.tick(world, pos, state, blockEntity);
|
||||||
int i = world.getGameRules().getInt(GameRules.PLAYERS_SLEEPING_PERCENTAGE);
|
int i = world.getGameRules().getInt(GameRules.PLAYERS_SLEEPING_PERCENTAGE);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import io.netty.channel.ChannelHandlerContext;
|
|||||||
import net.minecraft.network.QueryableServer;
|
import net.minecraft.network.QueryableServer;
|
||||||
import net.minecraft.network.handler.LegacyQueryHandler;
|
import net.minecraft.network.handler.LegacyQueryHandler;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
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.Redirect;
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
@@ -16,6 +17,7 @@ import java.util.Locale;
|
|||||||
|
|
||||||
@Mixin(LegacyQueryHandler.class)
|
@Mixin(LegacyQueryHandler.class)
|
||||||
public class LegacyQueryHandlerMixin {
|
public class LegacyQueryHandlerMixin {
|
||||||
|
@Unique
|
||||||
SocketAddress address;
|
SocketAddress address;
|
||||||
|
|
||||||
@Inject(method = "channelRead", at = @At("HEAD"))
|
@Inject(method = "channelRead", at = @At("HEAD"))
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public abstract class SleepManagerMixin {
|
|||||||
cir.setReturnValue(false);
|
cir.setReturnValue(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var world = players.get(0).getServerWorld();
|
var world = players.getFirst().getServerWorld();
|
||||||
if (world.getTimeOfDay() % 24000 >= 12544) {
|
if (world.getTimeOfDay() % 24000 >= 12544) {
|
||||||
if(!world.isRaining()){
|
if(!world.isRaining()){
|
||||||
cir.setReturnValue(false);
|
cir.setReturnValue(false);
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
"client": [
|
"client": [
|
||||||
],
|
],
|
||||||
"server": [
|
"server": [
|
||||||
|
"server.MinecraftServerMixin",
|
||||||
"server.ServerPlayNetworkHandlerMixin",
|
"server.ServerPlayNetworkHandlerMixin",
|
||||||
"server.bridge.ServerWorldBridge",
|
"server.bridge.ServerWorldBridge",
|
||||||
"server.SleepManagerMixin",
|
"server.SleepManagerMixin",
|
||||||
|
|||||||
Reference in new issue
Block a user