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 java.util.Objects;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class EnterBedSystem extends RefChangeSystem<EntityStore, MountedComponent> {
public static final Query<EntityStore> QUERY = Query.<EntityStore>and(MountedComponent.getComponentType(), PlayerRef.getComponentType());
public EnterBedSystem() {
}
public ComponentType<EntityStore, MountedComponent> componentType() {
return MountedComponent.getComponentType();
}
public Query<EntityStore> getQuery() {
return QUERY;
}
public void onComponentAdded(@Nonnull Ref<EntityStore> ref, @Nonnull MountedComponent component, @Nonnull Store<EntityStore> store, @Nonnull CommandBuffer<EntityStore> commandBuffer) {
this.check(ref, component, store);
}
public void onComponentSet(@Nonnull Ref<EntityStore> ref, @Nullable MountedComponent oldComponent, @Nonnull MountedComponent newComponent, @Nonnull Store<EntityStore> store, @Nonnull CommandBuffer<EntityStore> commandBuffer) {
this.check(ref, newComponent, store);
}
public void onComponentRemoved(@Nonnull Ref<EntityStore> ref, @Nonnull MountedComponent component, @Nonnull Store<EntityStore> store, @Nonnull 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 = ((EntityStore)store.getExternalData()).getWorld();
CanSleepInWorld.Result canSleepResult = CanSleepInWorld.check(world);
if (canSleepResult.isNegative()) {
PlayerRef playerRef = (PlayerRef)store.getComponent(ref, PlayerRef.getComponentType());
assert playerRef != null;
if (canSleepResult instanceof CanSleepInWorld.NotDuringSleepHoursRange) {
CanSleepInWorld.NotDuringSleepHoursRange var6 = (CanSleepInWorld.NotDuringSleepHoursRange)canSleepResult;
CanSleepInWorld.NotDuringSleepHoursRange var10000 = var6;
try {
var17 = var10000.worldTime();
} catch (Throwable var13) {
throw new MatchException(var13.toString(), var13);
}
LocalDateTime var9 = var17;
LocalDateTime worldTime = var9;
var10000 = var6;
try {
var19 = var10000.sleepConfig();
} catch (Throwable var12) {
throw new MatchException(var12.toString(), var12);
}
SleepConfig var14 = var19;
SleepConfig sleepConfig = var14;
LocalTime startTime = var14.getSleepStartTime();
Duration untilSleep = sleepConfig.computeDurationUntilSleep(worldTime);
Message msg = Message.translation("server.interactions.sleep.sleepAtTheseHours").param("time", formatTime(startTime)).param("until", formatDuration(untilSleep));
playerRef.sendMessage(msg.color("#F2D729"));
} else {
Message msg = this.getMessage(canSleepResult);
playerRef.sendMessage(msg);
}
}
}
private Message getMessage(CanSleepInWorld.Result result) {
Objects.requireNonNull(result);
byte var4 = 0;
String var10000;
switch (result.typeSwitch<invokedynamic>(result, var4)) {
case 0:
var10000 = "server.interactions.sleep.gameTimePaused";
break;
case 1:
CanSleepInWorld.NotDuringSleepHoursRange ignored = (CanSleepInWorld.NotDuringSleepHoursRange)result;
var10000 = "server.interactions.sleep.notWithinHours";
break;
default:
var10000 = "server.interactions.sleep.disabled";
}
String msgKey = var10000;
return Message.translation(msgKey);
}
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(@Nonnull 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));
}
}