hytale-server/com/hypixel/hytale/builtin/beds/sleep/systems/player/EnterBedSystem.java

150 lines
7.4 KiB
Java

package com.hypixel.hytale.builtin.beds.sleep.systems.player;
import com.hypixel.hytale.builtin.beds.sleep.systems.world.CanSleepInWorld;
import com.hypixel.hytale.builtin.mounts.MountedComponent;
import com.hypixel.hytale.component.CommandBuffer;
import com.hypixel.hytale.component.ComponentType;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.component.query.Query;
import com.hypixel.hytale.component.system.RefChangeSystem;
import com.hypixel.hytale.protocol.BlockMountType;
import com.hypixel.hytale.server.core.Message;
import com.hypixel.hytale.server.core.asset.type.gameplay.SleepConfig;
import com.hypixel.hytale.server.core.universe.PlayerRef;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.LocalTime;
import org.checkerframework.checker.nullness.compatqual.NonNullDecl;
import org.checkerframework.checker.nullness.compatqual.NullableDecl;
public class EnterBedSystem extends RefChangeSystem<EntityStore, MountedComponent> {
public static final Query<EntityStore> QUERY = Query.and(MountedComponent.getComponentType(), PlayerRef.getComponentType());
@Override
public ComponentType<EntityStore, MountedComponent> componentType() {
return MountedComponent.getComponentType();
}
@Override
public Query<EntityStore> getQuery() {
return QUERY;
}
public void onComponentAdded(
@NonNullDecl Ref<EntityStore> ref,
@NonNullDecl MountedComponent component,
@NonNullDecl Store<EntityStore> store,
@NonNullDecl CommandBuffer<EntityStore> commandBuffer
) {
this.check(ref, component, store);
}
public void onComponentSet(
@NonNullDecl Ref<EntityStore> ref,
@NullableDecl MountedComponent oldComponent,
@NonNullDecl MountedComponent newComponent,
@NonNullDecl Store<EntityStore> store,
@NonNullDecl CommandBuffer<EntityStore> commandBuffer
) {
this.check(ref, newComponent, store);
}
public void onComponentRemoved(
@NonNullDecl Ref<EntityStore> ref,
@NonNullDecl MountedComponent component,
@NonNullDecl Store<EntityStore> store,
@NonNullDecl CommandBuffer<EntityStore> commandBuffer
) {
}
public void check(Ref<EntityStore> ref, MountedComponent component, Store<EntityStore> store) {
if (component.getBlockMountType() == BlockMountType.Bed) {
this.onEnterBed(ref, store);
}
}
public void onEnterBed(Ref<EntityStore> ref, Store<EntityStore> store) {
World world = store.getExternalData().getWorld();
CanSleepInWorld.Result canSleepResult = CanSleepInWorld.check(world);
if (canSleepResult.isNegative()) {
PlayerRef playerRef = store.getComponent(ref, PlayerRef.getComponentType());
if (canSleepResult instanceof CanSleepInWorld.NotDuringSleepHoursRange(LocalDateTime msg, SleepConfig var14)) {
LocalTime startTime = var14.getSleepStartTime();
Duration untilSleep = var14.computeDurationUntilSleep(msg);
Message msgx = Message.translation("server.interactions.sleep.sleepAtTheseHours")
.param("time", formatTime(startTime))
.param("until", formatDuration(untilSleep));
playerRef.sendMessage(msgx.color("#F2D729"));
} else {
Message msg = this.getMessage(canSleepResult);
playerRef.sendMessage(msg);
}
}
}
private Message getMessage(CanSleepInWorld.Result param1) {
// $VF: Couldn't be decompiled
// Please report this to the Vineflower issue tracker, at https://github.com/Vineflower/vineflower/issues with a copy of the class file (if you have the rights to distribute it!)
// java.lang.IllegalStateException: Invalid switch case set: [[const(0)], [var1_1 instanceof x], [null]] for selector of type Lcom/hypixel/hytale/builtin/beds/sleep/systems/world/CanSleepInWorld$Result;
// at org.jetbrains.java.decompiler.modules.decompiler.exps.SwitchHeadExprent.checkExprTypeBounds(SwitchHeadExprent.java:66)
// at org.jetbrains.java.decompiler.modules.decompiler.vars.VarTypeProcessor.checkTypeExpr(VarTypeProcessor.java:140)
// at org.jetbrains.java.decompiler.modules.decompiler.vars.VarTypeProcessor.checkTypeExprent(VarTypeProcessor.java:126)
// at org.jetbrains.java.decompiler.modules.decompiler.vars.VarTypeProcessor.lambda$processVarTypes$2(VarTypeProcessor.java:114)
// at org.jetbrains.java.decompiler.modules.decompiler.flow.DirectGraph.iterateExprents(DirectGraph.java:107)
// at org.jetbrains.java.decompiler.modules.decompiler.vars.VarTypeProcessor.processVarTypes(VarTypeProcessor.java:114)
// at org.jetbrains.java.decompiler.modules.decompiler.vars.VarTypeProcessor.calculateVarTypes(VarTypeProcessor.java:44)
// at org.jetbrains.java.decompiler.modules.decompiler.vars.VarVersionsProcessor.setVarVersions(VarVersionsProcessor.java:68)
// at org.jetbrains.java.decompiler.modules.decompiler.vars.VarProcessor.setVarVersions(VarProcessor.java:47)
// at org.jetbrains.java.decompiler.main.rels.MethodProcessor.codeToJava(MethodProcessor.java:302)
//
// Bytecode:
// 00: aload 1
// 01: dup
// 02: invokestatic java/util/Objects.requireNonNull (Ljava/lang/Object;)Ljava/lang/Object;
// 05: pop
// 06: astore 3
// 07: bipush 0
// 08: istore 4
// 0a: aload 3
// 0b: iload 4
// 0d: invokedynamic typeSwitch (Ljava/lang/Object;I)I bsm=java/lang/runtime/SwitchBootstraps.typeSwitch (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; args=[ null.invoke Ljava/lang/Enum$EnumDesc;, com/hypixel/hytale/builtin/beds/sleep/systems/world/CanSleepInWorld$NotDuringSleepHoursRange ]
// 12: lookupswitch 42 2 0 26 1 31
// 2c: ldc "server.interactions.sleep.gameTimePaused"
// 2e: goto 3e
// 31: aload 3
// 32: checkcast com/hypixel/hytale/builtin/beds/sleep/systems/world/CanSleepInWorld$NotDuringSleepHoursRange
// 35: astore 5
// 37: ldc "server.interactions.sleep.notWithinHours"
// 39: goto 3e
// 3c: ldc "server.interactions.sleep.disabled"
// 3e: astore 2
// 3f: aload 2
// 40: invokestatic com/hypixel/hytale/server/core/Message.translation (Ljava/lang/String;)Lcom/hypixel/hytale/server/core/Message;
// 43: areturn
}
private static Message formatTime(LocalTime time) {
int hour = time.getHour();
int minute = time.getMinute();
boolean isPM = hour >= 12;
int displayHour = hour % 12;
if (displayHour == 0) {
displayHour = 12;
}
String msgKey = isPM ? "server.interactions.sleep.timePM" : "server.interactions.sleep.timeAM";
return Message.translation(msgKey).param("h", displayHour).param("m", String.format("%02d", minute));
}
private static Message formatDuration(Duration duration) {
long totalMinutes = duration.toMinutes();
long hours = totalMinutes / 60L;
long minutes = totalMinutes % 60L;
String msgKey = hours > 0L ? "server.interactions.sleep.durationHours" : "server.interactions.sleep.durationMins";
return Message.translation(msgKey).param("hours", hours).param("mins", hours == 0L ? String.valueOf(minutes) : String.format("%02d", minutes));
}
}