ItemComponent class

Пакет: com.hypixel.hytale.server.core.modules.entity.item

Файл: com/hypixel/hytale/server/core/modules/entity/item/ItemComponent.java

implements: Component<EntityStore>

Поля (32)

МодификаторыТипИмя
ColorLight var1
var1
var1
boolean var1
TimeResource var10
World var2
ItemEntityConfig var2
Item var2
String var3
ItemEntityConfig var3
ItemEntityConfig var3
BlockType var3
ItemComponent var3
ItemEntityConfig var4
Float var4
float var4
TransformComponent var4
Holder var4
ItemStack var4
CircleIterator var5
Vector3d var5
ItemComponent var5
PickupItemComponent var5
ItemStackTransaction var5
Holder var6
Holder var6
ItemStack var6
Holder var7
PickupItemComponent var7
int var7
ItemComponent var8
float var9

Методы (20)

МодификаторыВозвратСигнатура
public boolean canPickUpboolean canPickUp()
public float computeLifetimeSecondsfloat computeLifetimeSeconds(@Nonnull ComponentAccessor<EntityStore> var1)
public boolean consumeNetworkOutdatedboolean consumeNetworkOutdated()
public float getPickupRadiusfloat getPickupRadius(@Nonnull ComponentAccessor<EntityStore> var1)
if if(var2 instanceof BlockMigrationExtraInfo)
if if(this.pickupRange < 0.0F)
if if(var2 != null)
if if(this.pickupDelay <= 0.0F)
if if(this.pickupThrottle <= 0.0F)
if if(this.mergeDelay <= 0.0F)
if if(var4 == null)
if if(var5 == null)
if if(var4 == null)
public boolean isRemovedByPlayerPickupboolean isRemovedByPlayerPickup()
public boolean pollMergeDelayboolean pollMergeDelay(float var1)
public boolean pollPickupDelayboolean pollPickupDelay(float var1)
public boolean pollPickupThrottleboolean pollPickupThrottle(float var1)
public void setItemStackvoid setItemStack(@Nullable ItemStack var1)
public void setPickupDelayvoid setPickupDelay(float var1)
public void setRemovedByPlayerPickupvoid setRemovedByPlayerPickup(boolean var1)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.modules.entity.item;

class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.component.Component;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.RemoveReason;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.iterator.CircleIterator;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Rotation3fc;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.protocol.ColorLight;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.Item;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.ItemEntityConfig;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.inventory.container.ItemContainer;
class="kw">import com.hypixel.hytale.server.core.inventory.transaction.ItemStackTransaction;
class="kw">import com.hypixel.hytale.server.core.modules.entity.BlockMigrationExtraInfo;
class="kw">import com.hypixel.hytale.server.core.modules.entity.DespawnComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.EntityModule;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.Intangible;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.tracker.NetworkId;
class="kw">import com.hypixel.hytale.server.core.modules.physics.component.PhysicsValues;
class="kw">import com.hypixel.hytale.server.core.modules.physics.component.Velocity;
class="kw">import com.hypixel.hytale.server.core.modules.time.TimeResource;
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.util.List;
class="kw">import java.util.Objects;
class="kw">import java.util.concurrent.ThreadLocalRandom;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;

class="kw">public class ItemComponent class="kw">implements Component<EntityStore> {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<ItemComponent> CODEC = BuilderCodec.builder(ItemComponent.class, ItemComponent::new)
      .append(new KeyedCodec<>("Item", ItemStack.CODEC), (var0, var1, var2) -> {
         var0.itemStack = var1;
         if (var2 class="kw">instanceof BlockMigrationExtraInfo) {
            String var3 = ((BlockMigrationExtraInfo)var2).getBlockMigration().apply(var1.getItemId());
            if (!var3.equals(var1.getItemId())) {
               var0.itemStack = new ItemStack(var3, var1.getQuantity(), var1.getMetadata());
            }
         }
      }, (var0, var1) -> var0.itemStack)
      .add()
      .append(new KeyedCodec<>("StackDelay", Codec.FLOAT), (var0, var1) -> var0.mergeDelay = var1, var0 -> var0.mergeDelay)
      .add()
      .append(new KeyedCodec<>("PickupDelay", Codec.FLOAT), (var0, var1) -> var0.pickupDelay = var1, var0 -> var0.pickupDelay)
      .add()
      .append(new KeyedCodec<>("PickupThrottle", Codec.FLOAT), (var0, var1) -> var0.pickupThrottle = var1, var0 -> var0.pickupThrottle)
      .add()
      .append(new KeyedCodec<>("RemovedByPlayerPickup", Codec.BOOLEAN), (var0, var1) -> var0.removedByPlayerPickup = var1, var0 -> var0.removedByPlayerPickup)
      .add()
      .build();
   class="kw">private class="kw">static class="kw">final float DROPPED_ITEM_VERTICAL_BOUNCE_VELOCITY = 3.25F;
   class="kw">private class="kw">static class="kw">final float DROPPED_ITEM_HORIZONTAL_BOUNCE_VELOCITY = 3.0F;
   class="kw">public class="kw">static class="kw">final float DEFAULT_PICKUP_DELAY = 0.5F;
   class="kw">public class="kw">static class="kw">final float PICKUP_DELAY_DROPPED = 1.5F;
   class="kw">public class="kw">static class="kw">final float PICKUP_THROTTLE = 0.25F;
   class="kw">public class="kw">static class="kw">final float DEFAULT_MERGE_DELAY = 1.5F;
   @Nullable
   class="kw">private ItemStack itemStack;
   class="kw">private boolean isNetworkOutdated;
   class="kw">private float mergeDelay = 1.5F;
   class="kw">private float pickupDelay = 0.5F;
   class="kw">private float pickupThrottle;
   class="kw">private boolean removedByPlayerPickup;
   class="kw">private float pickupRange = -1.0F;

   @Nonnull
   class="kw">public class="kw">static ComponentType<EntityStore, ItemComponent> getComponentType() {
      class="kw">return EntityModule.get().getItemComponentType();
   }

   class="kw">public ItemComponent() {
   }

   class="kw">public ItemComponent(@Nullable ItemStack var1) {
      this.itemStack = var1;
   }

   class="kw">public ItemComponent(@Nullable ItemStack var1, float var2, float var3, float var4, boolean var5) {
      this.itemStack = var1;
      this.mergeDelay = var2;
      this.pickupDelay = var3;
      this.pickupThrottle = var4;
      this.removedByPlayerPickup = var5;
   }

   @Nullable
   class="kw">public ItemStack getItemStack() {
      class="kw">return this.itemStack;
   }

   class="kw">public void setItemStack(@Nullable ItemStack var1) {
      this.itemStack = var1;
      this.isNetworkOutdated = true;
      this.pickupRange = -1.0F;
   }

   class="kw">public void setPickupDelay(float var1) {
      this.pickupDelay = var1;
   }

   class="kw">public float getPickupRadius(@Nonnull ComponentAccessor<EntityStore> var1) {
      if (this.pickupRange < 0.0F) {
         World var2 = var1.getExternalData().getWorld();
         ItemEntityConfig var3 = var2.getGameplayConfig().getItemEntityConfig();
         ItemEntityConfig var4 = this.itemStack != null ? this.itemStack.getItem().getItemEntityConfig() : null;
         this.pickupRange = var4 != null && var4.getPickupRadius() != -1.0F ? var4.getPickupRadius() : var3.getPickupRadius();
      }

      class="kw">return this.pickupRange;
   }

   class="kw">public float computeLifetimeSeconds(@Nonnull ComponentAccessor<EntityStore> var1) {
      ItemEntityConfig var2 = this.itemStack != null ? this.itemStack.getItem().getItemEntityConfig() : null;
      ItemEntityConfig var3 = var1.getExternalData().getWorld().getGameplayConfig().getItemEntityConfig();
      Float var4 = var2 != null && var2.getTtl() != null ? var2.getTtl() : var3.getTtl();
      class="kw">return var4 != null ? var4 : 120.0F;
   }

   @Nullable
   class="kw">public ColorLight computeDynamicLight() {
      ColorLight var1 = null;
      Item var2 = this.itemStack != null ? this.itemStack.getItem() : null;
      if (var2 != null) {
         if (var2.hasBlockType()) {
            BlockType var3 = BlockType.getAssetMap().getAsset(this.itemStack.getBlockKey());
            if (var3 != null && var3.getLight() != null) {
               var1 = var3.getLight();
            }
         } else if (var2.getLight() != null) {
            var1 = var2.getLight();
         }
      }

      class="kw">return var1;
   }

   class="kw">public boolean pollPickupDelay(float var1) {
      if (this.pickupDelay <= 0.0F) {
         class="kw">return true;
      }

      this.pickupDelay -= var1;
      class="kw">return this.pickupDelay <= 0.0F;
   }

   class="kw">public boolean pollPickupThrottle(float var1) {
      this.pickupThrottle -= var1;
      if (this.pickupThrottle <= 0.0F) {
         this.pickupThrottle = 0.25F;
         class="kw">return true;
      } else {
         class="kw">return false;
      }
   }

   class="kw">public boolean pollMergeDelay(float var1) {
      this.mergeDelay -= var1;
      if (this.mergeDelay <= 0.0F) {
         this.mergeDelay = 1.5F;
         class="kw">return true;
      } else {
         class="kw">return false;
      }
   }

   class="kw">public boolean canPickUp() {
      class="kw">return this.pickupDelay <= 0.0F;
   }

   class="kw">public boolean isRemovedByPlayerPickup() {
      class="kw">return this.removedByPlayerPickup;
   }

   class="kw">public void setRemovedByPlayerPickup(boolean var1) {
      this.removedByPlayerPickup = var1;
   }

   class="kw">public boolean consumeNetworkOutdated() {
      boolean var1 = this.isNetworkOutdated;
      this.isNetworkOutdated = false;
      class="kw">return var1;
   }

   @Nonnull
   class="kw">public ItemComponent clone() {
      class="kw">return new ItemComponent(this.itemStack, this.mergeDelay, this.pickupDelay, this.pickupThrottle, this.removedByPlayerPickup);
   }

   @Nonnull
   class="kw">public class="kw">static Holder<EntityStore>[] generateItemDrops(
      @Nonnull ComponentAccessor<EntityStore> var0, @Nonnull List<ItemStack> var1, @Nonnull Vector3d var2, @Nonnull Rotation3fc var3
   ) {
      if (var1.size() == 1) {
         Holder var6 = generateItemDrop(var0, var1.getFirst(), var2, var3, 0.0F, 3.25F, 0.0F);
         class="kw">return var6 == null ? Holder.emptyArray() : new Holder[]{var6};
      } else {
         float var4 = ThreadLocalRandom.current().nextFloat() * (float) (Math.PI * 2);
         CircleIterator var5 = new CircleIterator(Vector3dUtil.ZERO, 3.0, var1.size(), var4);
         class="kw">return var1.stream().map(var4x -> {
            Vector3d var5 = var5.next();
            class="kw">return generateItemDrop(var0, var4x, var2, var3, (float)var5.x(), 3.25F, (float)var5.z());
         }).filter(Objects::nonNull).toArray(Holder[]::new);
      }
   }

   @Nullable
   class="kw">public class="kw">static Holder<EntityStore> generateItemDrop(
      @Nonnull ComponentAccessor<EntityStore> var0,
      @Nullable ItemStack var1,
      @Nonnull Vector3d var2,
      @Nonnull Rotation3fc var3,
      float var4,
      float var5,
      float var6
   ) {
      if (var1 != null && !var1.isEmpty() && var1.isValid()) {
         Holder var7 = EntityStore.REGISTRY.newHolder();
         ItemComponent var8 = new ItemComponent(var1);
         var7.addComponent(getComponentType(), var8);
         var7.addComponent(TransformComponent.getComponentType(), new TransformComponent(var2, var3));
         var7.ensureAndGetComponent(Velocity.getComponentType()).set(var4, var5, var6);
         var7.ensureComponent(PhysicsValues.getComponentType());
         var7.ensureComponent(UUIDComponent.getComponentType());
         var7.ensureComponent(Intangible.getComponentType());
         float var9 = var8.computeLifetimeSeconds(var0);
         TimeResource var10 = var0.getResource(TimeResource.getResourceType());
         var7.addComponent(DespawnComponent.getComponentType(), DespawnComponent.despawnInSeconds(var10, var9));
         class="kw">return var7;
      } else {
         LOGGER.at(Level.WARNING).log("Attempted to drop invalid item %s at %s", var1, var2);
         class="kw">return null;
      }
   }

   @Nullable
   class="kw">public class="kw">static Holder<EntityStore> generatePickedUpItem(
      @Nonnull Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1, @Nonnull Ref<EntityStore> var2, @Nonnull Vector3d var3
   ) {
      if (!var0.isValid()) {
         LOGGER.at(Level.WARNING).log("Attempted to generate picked up item from invalid entity reference %s", var0.getIndex());
         class="kw">return null;
      } else {
         TransformComponent var4 = var1.getComponent(var0, TransformComponent.getComponentType());
         if (var4 == null) {
            LOGGER.at(Level.WARNING).log("Attempted to generate picked up item from entity %s without a TransformComponent", var0.getIndex());
            class="kw">return null;
         } else {
            ItemComponent var5 = var1.getComponent(var0, getComponentType());
            if (var5 == null) {
               LOGGER.at(Level.WARNING).log("Attempted to generate picked up item from entity %s without an ItemComponent", var0.getIndex());
               class="kw">return null;
            } else {
               Holder var6 = EntityStore.REGISTRY.newHolder();
               PickupItemComponent var7 = new PickupItemComponent(var2, new Vector3d(var3));
               var6.addComponent(PickupItemComponent.getComponentType(), var7);
               var6.addComponent(getComponentType(), var5.clone());
               var6.addComponent(TransformComponent.getComponentType(), var4.clone());
               var6.ensureComponent(PreventItemMerging.getComponentType());
               var6.ensureComponent(Intangible.getComponentType());
               var6.addComponent(NetworkId.getComponentType(), new NetworkId(var0.getStore().getExternalData().takeNextNetworkId()));
               var6.ensureComponent(EntityStore.REGISTRY.getNonSerializedComponentType());
               class="kw">return var6;
            }
         }
      }
   }

   @Nonnull
   class="kw">public class="kw">static Holder<EntityStore> generatePickedUpItem(
      @Nonnull ItemStack var0, @Nonnull Vector3d var1, @Nonnull ComponentAccessor<EntityStore> var2, @Nonnull Ref<EntityStore> var3
   ) {
      Holder var4 = EntityStore.REGISTRY.newHolder();
      PickupItemComponent var5 = new PickupItemComponent(var3, new Vector3d(var1));
      var4.addComponent(PickupItemComponent.getComponentType(), var5);
      var4.addComponent(getComponentType(), new ItemComponent(new ItemStack(var0.getItemId())));
      var4.addComponent(TransformComponent.getComponentType(), new TransformComponent(new Vector3d(var1), new Rotation3f(Rotation3f.IDENTITY)));
      var4.ensureComponent(PreventItemMerging.getComponentType());
      var4.ensureComponent(Intangible.getComponentType());
      var4.addComponent(NetworkId.getComponentType(), new NetworkId(var2.getExternalData().takeNextNetworkId()));
      var4.ensureComponent(EntityStore.REGISTRY.getNonSerializedComponentType());
      class="kw">return var4;
   }

   @Nullable
   class="kw">public class="kw">static ItemStack addToItemContainer(@Nonnull Store<EntityStore> var0, @Nonnull Ref<EntityStore> var1, @Nonnull ItemContainer var2) {
      if (!var1.isValid()) {
         class="kw">return null;
      }

      ItemComponent var3 = var0.getComponent(var1, getComponentType());
      if (var3 != null && !(var3.pickupDelay > 0.0F)) {
         ItemStack var4 = var3.getItemStack();
         if (var4 == null) {
            class="kw">return null;
         } else {
            ItemStackTransaction var5 = var2.addItemStack(var4);
            ItemStack var6 = var5.getRemainder();
            if (var6 != null && !var6.isEmpty()) {
               var3.setPickupDelay(0.25F);
               var3.setItemStack(var6);
               int var7 = var4.getQuantity() - var6.getQuantity();
               class="kw">return var7 <= 0 ? null : var4.withQuantity(var7);
            } else {
               var0.removeEntity(var1, RemoveReason.REMOVE);
               class="kw">return var4;
            }
         }
      } else {
         class="kw">return null;
      }
   }
}