add: progressive sleep

add: possibility on LongNightEvent
This commit is contained in:
iceBear67 committed 2024-07-10 13:14:55 +08:00
1 parent 4483a75e33
commit 613bb4fdd1
8 files changed
+107 -6

No files matched your search

@@ -7,7 +7,11 @@ import net.minecraft.world.World;
public class SFRandomEventRegistry extends SimpleRandomEventRegistry { public class SFRandomEventRegistry extends SimpleRandomEventRegistry {
public SFRandomEventRegistry() { public SFRandomEventRegistry() {
registerEvent(LongNightEvent::new, World.OVERWORLD, world -> !LongNightEvent.isRunning() && world.getTimeOfDay() % 18000 == 0); // At midnight registerEvent(LongNightEvent::new, World.OVERWORLD
registerEvent(DawnAfterLongNightEvent::new, World.OVERWORLD, world -> world.getTimeOfDay() % 22200 == 0); // At dawn , world -> !LongNightEvent.isRunning()
&& world.getTimeOfDay() % 24000 == 18000
&& world.getRandom().nextBetween(0,100) < 15); // At midnight
registerEvent(DawnAfterLongNightEvent::new, World.OVERWORLD
, world -> world.getTimeOfDay() % 22200 == 0); // At dawn
} }
} }
@@ -17,7 +17,7 @@ public class DawnAfterLongNightEvent extends RandomEvent {
if (LongNightEvent.justExpirencedLongNight) { if (LongNightEvent.justExpirencedLongNight) {
LongNightEvent.justExpirencedLongNight = false; LongNightEvent.justExpirencedLongNight = false;
world.getServer().getPlayerManager().broadcast( world.getServer().getPlayerManager().broadcast(
Text.literal("珍惜太阳正是永夜的意义。") Text.literal("\"月亮\"离开了。")
.withColor(new Color(235, 91, 0).getRGB()) .withColor(new Color(235, 91, 0).getRGB())
.append(Text.literal("(永夜事件结束)").withColor(Colors.LIGHT_GRAY)) .append(Text.literal("(永夜事件结束)").withColor(Colors.LIGHT_GRAY))
, false); , false);
@@ -3,6 +3,7 @@ package io.ib67.sfcraft.event.longnight;
import io.ib67.sfcraft.SFCraft; import io.ib67.sfcraft.SFCraft;
import io.ib67.sfcraft.event.RandomEvent; import io.ib67.sfcraft.event.RandomEvent;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.Colors; import net.minecraft.util.Colors;
import net.minecraft.world.GameRules; import net.minecraft.world.GameRules;
@@ -18,8 +19,9 @@ public class LongNightEvent extends RandomEvent {
@Override @Override
public int start() { public int start() {
var pm = world.getServer().getPlayerManager();
isAtLongNight = true; isAtLongNight = true;
world.getServer().getPlayerManager().broadcast(Text.literal("月亮停滞在空中...").withColor(Colors.BLUE), false); pm.broadcast(Text.literal("月亮停滞在空中...").withColor(Colors.BLUE), false);
this.doDaylightCycle = world.getGameRules().getBoolean(GameRules.DO_DAYLIGHT_CYCLE); this.doDaylightCycle = world.getGameRules().getBoolean(GameRules.DO_DAYLIGHT_CYCLE);
this.doTraderSpawning = world.getGameRules().getBoolean(GameRules.DO_TRADER_SPAWNING); this.doTraderSpawning = world.getGameRules().getBoolean(GameRules.DO_TRADER_SPAWNING);
world.getGameRules().get(GameRules.DO_DAYLIGHT_CYCLE).set(false, world.getServer()); world.getGameRules().get(GameRules.DO_DAYLIGHT_CYCLE).set(false, world.getServer());
@@ -0,0 +1,43 @@
package io.ib67.sfcraft.mixin.server;
import io.ib67.sfcraft.mixin.server.bridge.ServerWorldBridge;
import net.minecraft.block.AbstractFurnaceBlock;
import net.minecraft.block.BlockState;
import net.minecraft.block.BlockWithEntity;
import net.minecraft.block.entity.AbstractFurnaceBlockEntity;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityTicker;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.GameRules;
import net.minecraft.world.World;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
@Mixin(AbstractFurnaceBlock.class)
public abstract class AbstractFurnaceBlockMixin extends BlockWithEntity {
protected AbstractFurnaceBlockMixin(Settings settings) {
super(settings);
}
/**
* @author icybear
* @reason to replace their ticker
*/
@Overwrite
public static <T extends BlockEntity> @Nullable BlockEntityTicker<T> validateTicker(
World world, BlockEntityType<T> givenType, BlockEntityType<? extends AbstractFurnaceBlockEntity> expectedType
) {
return world.isClient ? null : BlockWithEntity.validateTicker(givenType, expectedType, AbstractFurnaceBlockMixin::tickMultiple);
}
private static void tickMultiple(World world, BlockPos pos, BlockState state, AbstractFurnaceBlockEntity blockEntity) {
AbstractFurnaceBlockEntity.tick(world, pos, state, blockEntity);
int i = world.getGameRules().getInt(GameRules.PLAYERS_SLEEPING_PERCENTAGE);
if (((ServerWorldBridge) world).getSleepManager().canSkipNight(i)) {
AbstractFurnaceBlockEntity.tick(world, pos, state, blockEntity); //todo: config support?
AbstractFurnaceBlockEntity.tick(world, pos, state, blockEntity);
}
}
}
@@ -22,7 +22,9 @@ public class PlayerEntityMixin {
@Inject(method = "trySleep", at = @At("HEAD"), cancellable = true) @Inject(method = "trySleep", at = @At("HEAD"), cancellable = true)
public void onSleep(BlockPos pos, CallbackInfoReturnable<Either<PlayerEntity.SleepFailureReason, Unit>> cir) { public void onSleep(BlockPos pos, CallbackInfoReturnable<Either<PlayerEntity.SleepFailureReason, Unit>> cir) {
if (cir.isCancellable()) var result = SFCraft.getInstance().getListener().onPlayerSleep((ServerPlayerEntity) (Object) this, pos);
cir.setReturnValue(SFCraft.getInstance().getListener().onPlayerSleep((ServerPlayerEntity) (Object) this, pos)); if(result.left().isPresent()){
cir.setReturnValue(result);
}
} }
} }
@@ -0,0 +1,20 @@
package io.ib67.sfcraft.mixin.server;
import io.ib67.sfcraft.mixin.server.bridge.ServerWorldBridge;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.world.GameRules;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.*;
@Mixin(ServerWorld.class)
public abstract class ServerWorldMixin {
@ModifyArg(method = "tickTime", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ServerWorld;setTimeOfDay(J)V"))
public long setTimeOfDay(long timeOfDay) {
int i = ((ServerWorld) (Object) this).getGameRules().getInt(GameRules.PLAYERS_SLEEPING_PERCENTAGE);
if (((ServerWorldBridge) this).getSleepManager().canSkipNight(i)) {
return timeOfDay + 10;
}
return timeOfDay;
}
}
@@ -0,0 +1,27 @@
package io.ib67.sfcraft.mixin.server;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.SleepManager;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.List;
@Mixin(SleepManager.class)
public abstract class SleepManagerMixin {
@Inject(method = "canResetTime", at = @At("HEAD"), cancellable = true)
public void canResetTime(int percentage, List<ServerPlayerEntity> players, CallbackInfoReturnable<Boolean> cir) {
if (players.isEmpty()) {
cir.setReturnValue(false);
return;
}
var world = players.get(0).getServerWorld();
if (world.getTimeOfDay() % 24000 >= 12544) {
if(!world.isRaining()){
cir.setReturnValue(false);
}
}
}
}
+3
View File
@@ -8,6 +8,9 @@
"client": [ "client": [
], ],
"server": [ "server": [
"server.bridge.ServerWorldBridge",
"server.SleepManagerMixin",
"server.ServerWorldMixin",
"server.AbstractFurnaceBlockMixin", "server.AbstractFurnaceBlockMixin",
"server.ServerHandshakeNetworkHandlerMixin", "server.ServerHandshakeNetworkHandlerMixin",
"server.LegacyQueryHandlerMixin", "server.LegacyQueryHandlerMixin",