Add Save Events to Server Lifecycle Events ()

* Add Server Begin Save and Server End Save event

* rename events

* add tests

* pass more params through

(cherry picked from commit a67ffb5d0a)
This commit is contained in:
MrNavaStar 2024-02-09 07:05:34 -07:00 committed by modmuss50
parent 6a60afdd2e
commit 1dcf7c2a51
3 changed files with 60 additions and 0 deletions
fabric-lifecycle-events-v1/src
main/java/net/fabricmc/fabric
api/event/lifecycle/v1
mixin/event/lifecycle
testmod/java/net/fabricmc/fabric/test/event/lifecycle

View file

@ -107,6 +107,24 @@ public final class ServerLifecycleEvents {
}
});
/**
* Called before a Minecraft server begins saving data.
*/
public static final Event<BeforeSave> BEFORE_SAVE = EventFactory.createArrayBacked(BeforeSave.class, callbacks -> (server, flush, force) -> {
for (BeforeSave callback : callbacks) {
callback.onBeforeSave(server, flush, force);
}
});
/**
* Called after a Minecraft server finishes saving data.
*/
public static final Event<AfterSave> AFTER_SAVE = EventFactory.createArrayBacked(AfterSave.class, callbacks -> (server, flush, force) -> {
for (AfterSave callback : callbacks) {
callback.onAfterSave(server, flush, force);
}
});
@FunctionalInterface
public interface ServerStarting {
void onServerStarting(MinecraftServer server);
@ -160,4 +178,28 @@ public final class ServerLifecycleEvents {
*/
void endDataPackReload(MinecraftServer server, LifecycledResourceManager resourceManager, boolean success);
}
@FunctionalInterface
public interface BeforeSave {
/**
* Called before a Minecraft server begins saving data.
*
* @param server the server
* @param flush is true when all chunks are being written to disk, server will likely freeze during this time
* @param force whether servers that have save-off set should save
*/
void onBeforeSave(MinecraftServer server, boolean flush, boolean force);
}
@FunctionalInterface
public interface AfterSave {
/**
* Called before a Minecraft server begins saving data.
*
* @param server the server
* @param flush is true when all chunks are being written to disk, server will likely freeze during this time
* @param force whether servers that have save-off set should save
*/
void onAfterSave(MinecraftServer server, boolean flush, boolean force);
}
}

View file

@ -101,4 +101,14 @@ public abstract class MinecraftServerMixin {
return value;
}, (MinecraftServer) (Object) this);
}
@Inject(method = "save", at = @At("HEAD"))
private void startSave(boolean suppressLogs, boolean flush, boolean force, CallbackInfoReturnable<Boolean> cir) {
ServerLifecycleEvents.BEFORE_SAVE.invoker().onBeforeSave((MinecraftServer) (Object) this, flush, force);
}
@Inject(method = "save", at = @At("TAIL"))
private void endSave(boolean suppressLogs, boolean flush, boolean force, CallbackInfoReturnable<Boolean> cir) {
ServerLifecycleEvents.AFTER_SAVE.invoker().onAfterSave((MinecraftServer) (Object) this, flush, force);
}
}

View file

@ -54,5 +54,13 @@ public final class ServerLifecycleTests implements ModInitializer {
ServerLifecycleEvents.SYNC_DATA_PACK_CONTENTS.register((player, joined) -> {
LOGGER.info("SyncDataPackContents received for {}", joined ? "join" : "reload");
});
ServerLifecycleEvents.BEFORE_SAVE.register((server, flush, force) -> {
LOGGER.info("Starting Save with settings: Flush:{} Force:{}", flush, force);
});
ServerLifecycleEvents.AFTER_SAVE.register((server, flush, force) -> {
LOGGER.info("Save Finished with settings: Flush:{} Force:{}", flush, force);
});
}
}