StartSlumberSystem class
Пакет: com.hypixel.hytale.builtin.beds.sleep.systems.world
Файл: com/hypixel/hytale/builtin/beds/sleep/systems/world/StartSlumberSystem.java
extends: DelayedSystem<EntityStore>
Поля (28)
| Модификаторы | Тип | Имя |
|---|---|---|
|
Instant |
var10 |
|
float |
var11 |
|
World |
var2 |
|
long |
var2 |
|
World |
var2 |
|
PlayerSomnolence |
var2 |
|
PlayerSomnolence |
var2 |
|
Collection |
var3 |
|
LocalDateTime |
var3 |
|
Collection |
var3 |
|
PlayerSleep |
var3 |
|
PlayerSleep |
var3 |
|
SleepConfig |
var4 |
|
int |
var4 |
|
long |
var4 |
|
float |
var5 |
|
float |
var5 |
|
WorldSomnolence |
var6 |
|
Ref |
var6 |
|
LocalDateTime |
var6 |
|
|
var6 |
|
double |
var6 |
|
Ref |
var6 |
|
WorldSleep |
var7 |
|
PlayerRef |
var7 |
|
WorldTimeResource |
var8 |
|
Instant |
var9 |
|
Instant |
var9 |
Методы (14)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
static |
boolean |
canNotifyOthersAboutTryingToSleepboolean canNotifyOthersAboutTryingToSleep(@Nonnull ComponentAccessor<EntityStore> var0, @Nullable Ref<EntityStore> var1) |
private |
void |
checkIfEveryoneIsReadyToSleepvoid checkIfEveryoneIsReadyToSleep(@Nonnull Store<EntityStore> var1) |
static |
float |
computeIrlSecondsfloat computeIrlSeconds(@Nonnull Instant var0, @Nonnull Instant var1) |
private |
Instant |
computeWakeupInstantInstant computeWakeupInstant(@Nonnull Instant var1, float var2) |
|
|
for for(PlayerRef var5 : var3) |
|
|
if if(var7 == WorldSleep.Awake.INSTANCE) |
|
|
if if(var7 != null) |
|
|
if if(var2 == null) |
|
|
if if(var2 == null) |
private |
boolean |
isEveryoneReadyToSleepboolean isEveryoneReadyToSleep(@Nonnull ComponentAccessor<EntityStore> var1) |
static |
boolean |
isReadyToSleepboolean isReadyToSleep(@Nonnull ComponentAccessor<EntityStore> var0, @Nullable Ref<EntityStore> var1) |
abstract |
|
super super(0.3F) |
|
return |
switchreturn switch(var3) |
|
return |
switchreturn switch(var3) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.beds.sleep.systems.world;
class="kw">import com.hypixel.hytale.builtin.beds.sleep.components.PlayerSleep;
class="kw">import com.hypixel.hytale.builtin.beds.sleep.components.PlayerSomnolence;
class="kw">import com.hypixel.hytale.builtin.beds.sleep.resources.WorldSleep;
class="kw">import com.hypixel.hytale.builtin.beds.sleep.resources.WorldSlumber;
class="kw">import com.hypixel.hytale.builtin.beds.sleep.resources.WorldSomnolence;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.ResourceType;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.component.system.DelayedSystem;
class="kw">import com.hypixel.hytale.protocol.SoundCategory;
class="kw">import com.hypixel.hytale.server.core.asset.type.gameplay.sleep.SleepConfig;
class="kw">import com.hypixel.hytale.server.core.modules.time.WorldTimeResource;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.world.SoundUtil;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import java.time.Duration;
class="kw">import java.time.Instant;
class="kw">import java.time.LocalDateTime;
class="kw">import java.time.ZoneOffset;
class="kw">import java.util.Collection;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class StartSlumberSystem class="kw">extends DelayedSystem<EntityStore> {
@Nonnull
class="kw">private class="kw">static class="kw">final Duration NODDING_OFF_DURATION = Duration.ofMillis(3200L);
class="kw">private class="kw">static class="kw">final float SYSTEM_INTERVAL_S = 0.3F;
@Nonnull
class="kw">private class="kw">final ComponentType<EntityStore, PlayerSomnolence> playerSomnolenceComponentType;
@Nonnull
class="kw">private class="kw">final ResourceType<EntityStore, WorldSomnolence> worldSomnolenceResourceType;
@Nonnull
class="kw">private class="kw">final ResourceType<EntityStore, WorldTimeResource> worldTimeResourceType;
class="kw">public StartSlumberSystem(
@Nonnull ComponentType<EntityStore, PlayerSomnolence> var1,
@Nonnull ResourceType<EntityStore, WorldSomnolence> var2,
@Nonnull ResourceType<EntityStore, WorldTimeResource> var3
) {
super(0.3F);
this.playerSomnolenceComponentType = var1;
this.worldSomnolenceResourceType = var2;
this.worldTimeResourceType = var3;
}
@Override
class="kw">public void delayedTick(float var1, int var2, @Nonnull Store<EntityStore> var3) {
this.checkIfEveryoneIsReadyToSleep(var3);
}
class="kw">private void checkIfEveryoneIsReadyToSleep(@Nonnull Store<EntityStore> var1) {
World var2 = var1.getExternalData().getWorld();
Collection var3 = var2.getPlayerRefs();
if (!var3.isEmpty()) {
if (!CanSleepInWorld.check(var2).isNegative()) {
SleepConfig var4 = var2.getGameplayConfig().getWorldConfig().getSleepConfig();
float var5 = var4.getWakeUpHour();
WorldSomnolence var6 = var1.getResource(this.worldSomnolenceResourceType);
WorldSleep var7 = var6.getState();
if (var7 == WorldSleep.Awake.INSTANCE) {
if (this.isEveryoneReadyToSleep(var1)) {
WorldTimeResource var8 = var1.getResource(this.worldTimeResourceType);
Instant var9 = var8.getGameTime();
Instant var10 = this.computeWakeupInstant(var9, var5);
float var11 = computeIrlSeconds(var9, var10);
var6.setState(new WorldSlumber(var9, var10, var11));
var1.forEachEntityParallel(this.playerSomnolenceComponentType, (var3x, var4x, var5x) -> {
Ref var6 = var4x.getReferenceTo(var3x);
var5x.putComponent(var6, this.playerSomnolenceComponentType, PlayerSleep.Slumber.createComponent(var8));
PlayerRef var7 = var4x.getComponent(var3x, PlayerRef.getComponentType());
if (var7 != null) {
SoundUtil.playSoundEvent2dToPlayer(var7, var4.getSounds().getSuccessIndex(), SoundCategory.UI);
}
});
var6.resetNotificationCooldown();
}
}
}
}
}
class="kw">private Instant computeWakeupInstant(@Nonnull Instant var1, float var2) {
LocalDateTime var3 = LocalDateTime.ofInstant(var1, ZoneOffset.UTC);
int var4 = (int)var2;
float var5 = var2 - var4;
LocalDateTime var6 = var3.toLocalDate().atTime(var4, (int)(var5 * 60.0F));
if (!var3.isBefore(var6)) {
var6 = var6.plusDays(1L);
}
class="kw">return var6.toInstant(ZoneOffset.UTC);
}
class="kw">private class="kw">static float computeIrlSeconds(@Nonnull Instant var0, @Nonnull Instant var1) {
long var2 = Duration.between(var0, var1).toMillis();
long var4 = TimeUnit.MILLISECONDS.toHours(var2);
double var6 = Math.max(3.0, var4 / 6.0);
class="kw">return (float)Math.ceil(var6);
}
class="kw">private boolean isEveryoneReadyToSleep(@Nonnull ComponentAccessor<EntityStore> var1) {
World var2 = var1.getExternalData().getWorld();
Collection var3 = var2.getPlayerRefs();
if (var3.isEmpty()) {
class="kw">return false;
}
for (PlayerRef var5 : var3) {
Ref var6 = var5.getReference();
if (var6 != null && var6.isValid() && !isReadyToSleep(var1, var6)) {
class="kw">return false;
}
}
class="kw">return true;
}
class="kw">public class="kw">static boolean isReadyToSleep(@Nonnull ComponentAccessor<EntityStore> var0, @Nullable Ref<EntityStore> var1) {
if (var1 != null && var1.isValid()) {
PlayerSomnolence var2 = var0.getComponent(var1, PlayerSomnolence.getComponentType());
if (var2 == null) {
class="kw">return false;
}
PlayerSleep var3 = var2.getSleepState();
class="kw">return class="kw">switch (var3) {
case PlayerSleep.FullyAwake var6 -> false;
case PlayerSleep.NoddingOff var7 -> {
Instant var9 = var7.realTimeStart().plus(NODDING_OFF_DURATION);
yield Instant.now().isAfter(var9);
}
case PlayerSleep.Slumber var8 -> true;
class="kw">default -> throw new MatchException(null, null);
};
} else {
class="kw">return true;
}
}
class="kw">public class="kw">static boolean canNotifyOthersAboutTryingToSleep(@Nonnull ComponentAccessor<EntityStore> var0, @Nullable Ref<EntityStore> var1) {
if (var1 != null && var1.isValid()) {
PlayerSomnolence var2 = var0.getComponent(var1, PlayerSomnolence.getComponentType());
if (var2 == null) {
class="kw">return false;
}
PlayerSleep var3 = var2.getSleepState();
class="kw">return class="kw">switch (var3) {
case PlayerSleep.FullyAwake var6 -> false;
case PlayerSleep.NoddingOff var7 -> true;
case PlayerSleep.Slumber var8 -> true;
class="kw">default -> throw new MatchException(null, null);
};
} else {
class="kw">return true;
}
}
}