UpdateSleepPacketSystem class

Пакет: com.hypixel.hytale.builtin.beds.sleep.systems.player

Файл: com/hypixel/hytale/builtin/beds/sleep/systems/player/UpdateSleepPacketSystem.java

extends: DelayedEntitySystem<EntityStore>

Поля (24)

МодификаторыТипИмя
final int MAX_SAMPLE_COUNT
yield PACKET_NO_SLEEP_UI
boolean var10
UUID[] var11
boolean var16
Ref var17
boolean var18
World var2
long var20
List var3
World var4
int var4
WorldSomnolence var5
int var5
UpdateSleepState var6
var6
WorldSleep var6
List var6
SleepTracker var7
PlayerSomnolence var7
PlayerRef var8
PlayerSleep var8
SleepClock var9
Ref var9

Методы (6)

МодификаторыВозвратСигнатура
abstract return new SleepMultiplayerreturn new SleepMultiplayer(var4, var5, var11)
for for(PlayerRef var8 : var3)
if if(var6 != null)
if if(var10)
abstract super super(0.25F)
return switchreturn switch(var8)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.beds.sleep.systems.player;

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.components.SleepTracker;
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.builtin.beds.sleep.systems.world.CanSleepInWorld;
class="kw">import com.hypixel.hytale.builtin.beds.sleep.systems.world.StartSlumberSystem;
class="kw">import com.hypixel.hytale.component.ArchetypeChunk;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
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.query.Query;
class="kw">import com.hypixel.hytale.component.system.tick.DelayedEntitySystem;
class="kw">import com.hypixel.hytale.protocol.packets.world.SleepClock;
class="kw">import com.hypixel.hytale.protocol.packets.world.SleepMultiplayer;
class="kw">import com.hypixel.hytale.protocol.packets.world.UpdateSleepState;
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.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.time.Duration;
class="kw">import java.time.Instant;
class="kw">import java.util.Comparator;
class="kw">import java.util.List;
class="kw">import java.util.UUID;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class UpdateSleepPacketSystem class="kw">extends DelayedEntitySystem<EntityStore> {
   class="kw">private class="kw">static class="kw">final int MAX_SAMPLE_COUNT = 5;
   class="kw">private class="kw">static class="kw">final float SYSTEM_INTERVAL_S = 0.25F;
   @Nonnull
   class="kw">private class="kw">static class="kw">final Duration SPAN_BEFORE_BLACK_SCREEN = Duration.ofMillis(1200L);
   @Nonnull
   class="kw">private class="kw">static class="kw">final UUID[] EMPTY_UUIDS = new UUID[0];
   @Nonnull
   class="kw">private class="kw">static class="kw">final UpdateSleepState PACKET_NO_SLEEP_UI = new UpdateSleepState(false, false, null, null);
   @Nonnull
   class="kw">private class="kw">final ComponentType<EntityStore, PlayerRef> playerRefComponentType;
   @Nonnull
   class="kw">private class="kw">final ComponentType<EntityStore, PlayerSomnolence> playerSomnolenceComponentType;
   @Nonnull
   class="kw">private class="kw">final ComponentType<EntityStore, SleepTracker> sleepTrackerComponentType;
   @Nonnull
   class="kw">private class="kw">final ResourceType<EntityStore, WorldSomnolence> worldSomnolenceResourceType;
   @Nonnull
   class="kw">private class="kw">final ResourceType<EntityStore, WorldTimeResource> worldTimeResourceType;
   @Nonnull
   class="kw">private class="kw">final Query<EntityStore> query;

   class="kw">public UpdateSleepPacketSystem(
      @Nonnull ComponentType<EntityStore, PlayerRef> var1,
      @Nonnull ComponentType<EntityStore, PlayerSomnolence> var2,
      @Nonnull ComponentType<EntityStore, SleepTracker> var3,
      @Nonnull ResourceType<EntityStore, WorldSomnolence> var4,
      @Nonnull ResourceType<EntityStore, WorldTimeResource> var5
   ) {
      super(0.25F);
      this.playerRefComponentType = var1;
      this.playerSomnolenceComponentType = var2;
      this.sleepTrackerComponentType = var3;
      this.worldSomnolenceResourceType = var4;
      this.worldTimeResourceType = var5;
      this.query = Query.and(var1, var2, var3);
   }

   @Nonnull
   @Override
   class="kw">public Query<EntityStore> getQuery() {
      class="kw">return this.query;
   }

   @Override
   class="kw">public void tick(float var1, int var2, @Nonnull ArchetypeChunk<EntityStore> var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5) {
      UpdateSleepState var6 = this.createSleepPacket(var4, var2, var3);
      SleepTracker var7 = var3.getComponent(var2, this.sleepTrackerComponentType);
      assert var7 != null;
      var6 = var7.generatePacketToSend(var6);
      if (var6 != null) {
         PlayerRef var8 = var3.getComponent(var2, this.playerRefComponentType);
         assert var8 != null;
         var8.getPacketHandler().write(var6);
      }
   }

   @Nonnull
   class="kw">private UpdateSleepState createSleepPacket(@Nonnull Store<EntityStore> var1, int var2, @Nonnull ArchetypeChunk<EntityStore> var3) {
      World var4 = var1.getExternalData().getWorld();
      WorldSomnolence var5 = var1.getResource(this.worldSomnolenceResourceType);
      WorldSleep var6 = var5.getState();
      PlayerSomnolence var7 = var3.getComponent(var2, this.playerSomnolenceComponentType);
      assert var7 != null;
      PlayerSleep var8 = var7.getSleepState();
      SleepClock var9 = var6 class="kw">instanceof WorldSlumber var10 ? var10.createSleepClock() : null;

      class="kw">return class="kw">switch (var8) {
         case PlayerSleep.FullyAwake var12 -> PACKET_NO_SLEEP_UI;
         case PlayerSleep.NoddingOff var13 -> {
            if (CanSleepInWorld.check(var4).isNegative()) {
               yield PACKET_NO_SLEEP_UI;
            } else {
               long var20 = Duration.between(var13.realTimeStart(), Instant.now()).toMillis();
               boolean var16 = var20 > SPAN_BEFORE_BLACK_SCREEN.toMillis();
               Ref var17 = var3.getReferenceTo(var2);
               boolean var18 = StartSlumberSystem.isReadyToSleep(var1, var17);
               yield new UpdateSleepState(var16, false, var9, var18 ? this.createSleepMultiplayer(var1) : null);
            }
         }
         case PlayerSleep.Slumber var14 -> new UpdateSleepState(true, true, var9, null);
         class="kw">default -> throw new MatchException(null, null);
      };
   }

   @Nullable
   class="kw">private SleepMultiplayer createSleepMultiplayer(@Nonnull Store<EntityStore> var1) {
      World var2 = var1.getExternalData().getWorld();
      List var3 = new ObjectArrayList(var2.getPlayerRefs());
      var3.removeIf(var0 -> var0.getReference() == null);
      if (var3.size() <= 1) {
         class="kw">return null;
      }

      var3.sort(Comparator.comparingLong(var1x -> var1x.getUuid().hashCode() + var2.hashCode()));
      int var4 = 0;
      int var5 = 0;
      List var6 = new ObjectArrayList(var3.size());

      for (PlayerRef var8 : var3) {
         Ref var9 = var8.getReference();
         if (var9 != null && var9.isValid()) {
            boolean var10 = StartSlumberSystem.isReadyToSleep(var1, var9);
            if (var10) {
               var4++;
            } else {
               var5++;
               var6.add(var8.getUuid());
            }
         }
      }

      UUID[] var11 = var6.size() > 5 ? EMPTY_UUIDS : var6.toArray(UUID[]::new);
      class="kw">return new SleepMultiplayer(var4, var5, var11);
   }
}