ProjectileComponent class

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

Файл: com/hypixel/hytale/server/core/entity/entities/ProjectileComponent.java

implements: Component<EntityStore>

Поля (27)

МодификаторыТипИмя
return
String var1
WorldParticle var10
SpatialResource var11
Vector3d var11
List var12
WorldParticle var3
WorldParticle var3
Holder var4
SpatialResource var4
SpatialResource var4
EntityStore var4
ProjectileComponent var5
List var5
WorldParticle var5
MovementStatesComponent var5
List var5
World var5
MovementStatesComponent var6
SpatialResource var6
ExplosionConfig var6
List var7
Store var7
Entity var8
Ref var8
Ref var9
Damage.ProjectileSource var9

Методы (30)

МодификаторыВозвратСигнатура
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("No projectile config typeName provided")
public void applyBrokenPenaltyvoid applyBrokenPenalty(float var1)
protected void bounceHandlervoid bounceHandler(@Nonnull Vector3d var1, @Nonnull ComponentAccessor<EntityStore> var2)
static void computeStartOffsetvoid computeStartOffset(boolean var0, double var1, double var3, double var5, float var7, float var8, @Nonnull Vector3d var9)
public boolean consumeDeadTimerboolean consumeDeadTimer(float var1)
public String getAppearanceString getAppearance()
public UUID getCreatorUuidUUID getCreatorUuid()
public String getProjectileAssetNameString getProjectileAssetName()
public SimplePhysicsProvider getSimplePhysicsProviderSimplePhysicsProvider getSimplePhysicsProvider()
if if(this.projectile == null)
if if(var3 != null)
if if(var5 != null)
if if(var8 instanceof LivingEntity)
if if(this.deadTimer < 0.0)
if if(this.lastBouncePosition == null)
if if(var3 != null)
if if(var5 != null)
if if(var3 != null)
if if(var6 != null)
if if(var10 != null)
if if(var5 != 0.0)
protected void impactHandlervoid impactHandler(@Nonnull Ref<EntityStore> var1, @Nonnull Vector3d var2, @Nullable Ref<EntityStore> var3, @Nonnull ComponentAccessor<EntityStore> var4)
public boolean initializeboolean initialize()
public void initializePhysicsvoid initializePhysics(@Nonnull BoundingBox var1)
public boolean isOnGroundboolean isOnGround()
public void onProjectileBouncevoid onProjectileBounce(@Nonnull Vector3d var1, @Nonnull ComponentAccessor<EntityStore> var2)
public void onProjectileDeathvoid onProjectileDeath(@Nonnull Ref<EntityStore> var1, @Nonnull Vector3d var2, @Nonnull CommandBuffer<EntityStore> var3)
private void onProjectileHitEventvoid onProjectileHitEvent(@Nonnull Ref<EntityStore> var1, @Nonnull Vector3d var2, @Nonnull Ref<EntityStore> var3, @Nonnull ComponentAccessor<EntityStore> var4)
private void onProjectileMissEventvoid onProjectileMissEvent(@Nonnull Vector3d var1, @Nonnull ComponentAccessor<EntityStore> var2)
public void shootvoid shoot(@Nonnull Holder<EntityStore> var1, @Nonnull UUID var2, double var3, double var5, double var7, float var9, float var10)

Исходный код

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

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.CommandBuffer;
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.Store;
class="kw">import com.hypixel.hytale.component.spatial.SpatialResource;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.protocol.SoundCategory;
class="kw">import com.hypixel.hytale.server.core.asset.type.particle.config.WorldParticle;
class="kw">import com.hypixel.hytale.server.core.asset.type.projectile.config.Projectile;
class="kw">import com.hypixel.hytale.server.core.entity.Entity;
class="kw">import com.hypixel.hytale.server.core.entity.EntityUtils;
class="kw">import com.hypixel.hytale.server.core.entity.ExplosionConfig;
class="kw">import com.hypixel.hytale.server.core.entity.ExplosionUtils;
class="kw">import com.hypixel.hytale.server.core.entity.LivingEntity;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.movement.MovementStatesComponent;
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.BoundingBox;
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.damage.Damage;
class="kw">import com.hypixel.hytale.server.core.modules.entity.damage.DamageCause;
class="kw">import com.hypixel.hytale.server.core.modules.entity.damage.DamageSystems;
class="kw">import com.hypixel.hytale.server.core.modules.entity.tracker.EntityTrackerSystems;
class="kw">import com.hypixel.hytale.server.core.modules.physics.SimplePhysicsProvider;
class="kw">import com.hypixel.hytale.server.core.modules.physics.component.Velocity;
class="kw">import com.hypixel.hytale.server.core.modules.physics.util.PhysicsMath;
class="kw">import com.hypixel.hytale.server.core.modules.time.TimeResource;
class="kw">import com.hypixel.hytale.server.core.universe.world.ParticleUtil;
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.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
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">import org.joml.Vector3d;

class="kw">public class ProjectileComponent class="kw">implements Component<EntityStore> {
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<ProjectileComponent> CODEC = BuilderCodec.builder(ProjectileComponent.class, ProjectileComponent::new)
      .append(new KeyedCodec<>("ProjectileType", Codec.STRING), (var0, var1) -> var0.projectileAssetName = var1, var0 -> var0.projectileAssetName)
      .add()
      .append(new KeyedCodec<>("BrokenDamageModifier", Codec.FLOAT), (var0, var1) -> var0.brokenDamageModifier = var1, var0 -> var0.brokenDamageModifier)
      .add()
      .append(new KeyedCodec<>("DeadTimer", Codec.DOUBLE), (var0, var1) -> var0.deadTimer = var1, var0 -> var0.deadTimer)
      .add()
      .append(new KeyedCodec<>("CreatorUUID", Codec.UUID_STRING), (var0, var1) -> var0.creatorUuid = var1, var0 -> var0.creatorUuid)
      .add()
      .append(new KeyedCodec<>("HaveHit", Codec.BOOLEAN), (var0, var1) -> var0.haveHit = var1, var0 -> var0.haveHit)
      .add()
      .append(new KeyedCodec<>("LastBouncePosition", Vector3dUtil.CODEC), (var0, var1) -> var0.lastBouncePosition = var1, var0 -> var0.lastBouncePosition)
      .add()
      .append(
         new KeyedCodec<>("SppImpacted", Codec.BOOLEAN),
         (var0, var1) -> var0.simplePhysicsProvider.setImpacted(var1),
         var0 -> var0.simplePhysicsProvider.isImpacted()
      )
      .add()
      .append(
         new KeyedCodec<>("SppResting", Codec.BOOLEAN),
         (var0, var1) -> var0.simplePhysicsProvider.setResting(var1),
         var0 -> var0.simplePhysicsProvider.isResting()
      )
      .add()
      .append(
         new KeyedCodec<>("SppVelocity", Vector3dUtil.CODEC),
         (var0, var1) -> var0.simplePhysicsProvider.setVelocity(var1),
         var0 -> var0.simplePhysicsProvider.getVelocity()
      )
      .add()
      .build();
   class="kw">private class="kw">static class="kw">final double DEFAULT_DESPAWN_SECONDS = 60.0;
   class="kw">private class="kw">transient SimplePhysicsProvider simplePhysicsProvider = new SimplePhysicsProvider(this::bounceHandler, this::impactHandler);
   class="kw">private class="kw">transient String appearance = "Boy";
   @Nullable
   class="kw">private class="kw">transient Projectile projectile;
   class="kw">private String projectileAssetName;
   class="kw">private float brokenDamageModifier = 1.0F;
   class="kw">private double deadTimer = -1.0;
   class="kw">private UUID creatorUuid;
   class="kw">private boolean haveHit;
   class="kw">private Vector3d lastBouncePosition;

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

   class="kw">private ProjectileComponent() {
   }

   class="kw">public ProjectileComponent(@Nonnull String var1) {
      this.projectileAssetName = var1;
   }

   @Nonnull
   class="kw">public class="kw">static Holder<EntityStore> assembleDefaultProjectile(
      @Nonnull TimeResource var0, @Nonnull String var1, @Nonnull Vector3d var2, @Nonnull Rotation3f var3
   ) {
      if (var1.isEmpty()) {
         throw new IllegalArgumentException("No projectile config typeName provided");
      }

      Holder var4 = EntityStore.REGISTRY.newHolder();
      ProjectileComponent var5 = new ProjectileComponent(var1);
      var4.putComponent(getComponentType(), var5);
      var4.ensureComponent(Intangible.getComponentType());
      var4.putComponent(DespawnComponent.getComponentType(), DespawnComponent.despawnInMilliseconds(var0, 60000L));
      var4.putComponent(TransformComponent.getComponentType(), new TransformComponent(new Vector3d(var2), var3));
      var4.ensureComponent(Velocity.getComponentType());
      var4.ensureComponent(UUIDComponent.getComponentType());
      MovementStatesComponent var6 = var4.ensureAndGetComponent(MovementStatesComponent.getComponentType());
      var6.getMovementStates().flying = true;
      var6.getMovementStates().idle = true;
      var4.ensureComponent(EntityTrackerSystems.Visible.getComponentType());
      class="kw">return var4;
   }

   class="kw">public boolean initialize() {
      this.projectile = Projectile.getAssetMap().getAsset(this.projectileAssetName);
      if (this.projectile == null) {
         class="kw">return false;
      }

      String var1 = this.projectile.getAppearance();
      if (var1 != null && !var1.isEmpty()) {
         this.appearance = var1;
      }

      class="kw">return true;
   }

   class="kw">public void initializePhysics(@Nonnull BoundingBox var1) {
      this.simplePhysicsProvider.setProvideCharacterCollisions(true);
      this.simplePhysicsProvider.initialize(this.projectile, var1);
   }

   class="kw">public void onProjectileBounce(@Nonnull Vector3d var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      WorldParticle var3 = this.projectile.getBounceParticles();
      if (var3 != null) {
         SpatialResource var4 = var2.getResource(EntityModule.get().getPlayerSpatialResourceType());
         List var5 = SpatialResource.getThreadLocalReferenceList();
         var4.getSpatialStructure().collect(var1, 75.0, var5);
         ParticleUtil.spawnParticleEffect(var3, var1, var5, var2);
      }

      SoundUtil.playSoundEvent3d(this.projectile.getBounceSoundEventIndex(), SoundCategory.SFX, var1, var2);
   }

   class="kw">private void onProjectileHitEvent(
      @Nonnull Ref<EntityStore> var1, @Nonnull Vector3d var2, @Nonnull Ref<EntityStore> var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      WorldParticle var5 = this.projectile.getHitParticles();
      if (var5 != null) {
         SpatialResource var6 = var4.getResource(EntityModule.get().getPlayerSpatialResourceType());
         List var7 = SpatialResource.getThreadLocalReferenceList();
         var6.getSpatialStructure().collect(var2, 75.0, var7);
         ParticleUtil.spawnParticleEffect(var5, var2, var7, var4);
      }

      SoundUtil.playSoundEvent3d(this.projectile.getHitSoundEventIndex(), SoundCategory.SFX, var2, var4);
      Entity var8 = EntityUtils.getEntity(var3, var4);
      if (var8 class="kw">instanceof LivingEntity) {
         Ref var9 = var4.getExternalData().getRefFromUUID(this.creatorUuid);
         DamageSystems.executeDamage(
            var3,
            var4,
            new Damage(
               new Damage.ProjectileSource(var9 != null ? var9 : var1, var1), DamageCause.PROJECTILE, this.projectile.getDamage() * this.brokenDamageModifier
            )
         );
         this.haveHit = true;
      }

      this.deadTimer = this.projectile.getDeadTime();
   }

   class="kw">public boolean consumeDeadTimer(float var1) {
      if (this.deadTimer < 0.0) {
         class="kw">return false;
      }

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

   class="kw">protected void bounceHandler(@Nonnull Vector3d var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      if (this.lastBouncePosition == null) {
         this.lastBouncePosition = new Vector3d(var1);
      } else {
         if (!(this.lastBouncePosition.distanceSquared(var1) >= 0.5)) {
            class="kw">return;
         }

         this.lastBouncePosition.set(var1);
      }

      this.onProjectileBounce(var1, var2);
   }

   class="kw">protected void impactHandler(
      @Nonnull Ref<EntityStore> var1, @Nonnull Vector3d var2, @Nullable Ref<EntityStore> var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      if (var3 != null) {
         this.onProjectileHitEvent(var1, var2, var3, var4);
      } else {
         this.onProjectileMissEvent(var2, var4);
      }

      MovementStatesComponent var5 = var4.getComponent(var1, MovementStatesComponent.getComponentType());
      if (var5 != null) {
         var5.getMovementStates().flying = false;
      }
   }

   class="kw">private void onProjectileMissEvent(@Nonnull Vector3d var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      WorldParticle var3 = this.projectile.getMissParticles();
      if (var3 != null) {
         SpatialResource var4 = var2.getResource(EntityModule.get().getPlayerSpatialResourceType());
         List var5 = SpatialResource.getThreadLocalReferenceList();
         var4.getSpatialStructure().collect(var1, 75.0, var5);
         ParticleUtil.spawnParticleEffect(var3, var1, var5, var2);
      }

      SoundUtil.playSoundEvent3d(this.projectile.getMissSoundEventIndex(), SoundCategory.SFX, var1, var2);
      this.deadTimer = this.projectile.getDeadTimeMiss();
   }

   class="kw">public void onProjectileDeath(@Nonnull Ref<EntityStore> var1, @Nonnull Vector3d var2, @Nonnull CommandBuffer<EntityStore> var3) {
      EntityStore var4 = var3.getExternalData();
      World var5 = var4.getWorld();
      ExplosionConfig var6 = this.projectile.getExplosionConfig();
      if (var6 != null) {
         Store var7 = var5.getChunkStore().getStore();
         Ref var8 = var4.getRefFromUUID(this.creatorUuid);
         Damage.ProjectileSource var9 = new Damage.ProjectileSource(var8 != null ? var8 : var1, var1);
         ExplosionUtils.performExplosion(var9, var2, new Rotation3f(0.0F, 0.0F, 0.0F), var6, var1, var3, var7);
      }

      if (!this.haveHit || this.projectile.isDeathEffectsOnHit()) {
         WorldParticle var10 = this.projectile.getDeathParticles();
         if (var10 != null) {
            SpatialResource var11 = var3.getResource(EntityModule.get().getPlayerSpatialResourceType());
            List var12 = SpatialResource.getThreadLocalReferenceList();
            var11.getSpatialStructure().collect(var2, 75.0, var12);
            ParticleUtil.spawnParticleEffect(var10, var2, var12, var3);
         }

         SoundUtil.playSoundEvent3d(this.projectile.getDeathSoundEventIndex(), SoundCategory.SFX, var2, var3);
      }
   }

   class="kw">public void shoot(@Nonnull Holder<EntityStore> var1, @Nonnull UUID var2, double var3, double var5, double var7, float var9, float var10) {
      this.creatorUuid = var2;
      this.simplePhysicsProvider.setCreatorId(var2);
      Vector3d var11 = new Vector3d();
      computeStartOffset(
         this.projectile.isPitchAdjustShot(),
         this.projectile.getVerticalCenterShot(),
         this.projectile.getHorizontalCenterShot(),
         this.projectile.getDepthShot(),
         var9,
         var10,
         var11
      );
      var3 += var11.x;
      var5 += var11.y;
      var7 += var11.z;
      var1.ensureAndGetComponent(TransformComponent.getComponentType()).setPosition(new Vector3d(var3, var5, var7));
      PhysicsMath.vectorFromAngles(var9, var10, var11);
      var11.normalize(this.projectile.getMuzzleVelocity());
      this.simplePhysicsProvider.setVelocity(var11);
   }

   class="kw">public class="kw">static void computeStartOffset(boolean var0, double var1, double var3, double var5, float var7, float var8, @Nonnull Vector3d var9) {
      var9.set(0.0, 0.0, 0.0);
      if (var5 != 0.0) {
         PhysicsMath.vectorFromAngles(var7, var0 ? var8 : 0.0F, var9);
         var9.normalize(var5);
      }

      var9.add(var3 * -PhysicsMath.headingZ(var7), -var1, var3 * PhysicsMath.headingX(var7));
   }

   class="kw">public boolean isOnGround() {
      class="kw">return this.simplePhysicsProvider.isOnGround();
   }

   @Nullable
   class="kw">public Projectile getProjectile() {
      class="kw">return this.projectile;
   }

   class="kw">public String getAppearance() {
      class="kw">return this.appearance;
   }

   class="kw">public String getProjectileAssetName() {
      class="kw">return this.projectileAssetName;
   }

   class="kw">public SimplePhysicsProvider getSimplePhysicsProvider() {
      class="kw">return this.simplePhysicsProvider;
   }

   class="kw">public void applyBrokenPenalty(float var1) {
      this.brokenDamageModifier = 1.0F - var1;
   }

   class="kw">public UUID getCreatorUuid() {
      class="kw">return this.creatorUuid;
   }

   class="kw">public ProjectileComponent(@Nonnull ProjectileComponent var1) {
      this.simplePhysicsProvider = var1.simplePhysicsProvider;
      this.projectileAssetName = var1.projectileAssetName;
      this.projectile = var1.projectile;
      this.appearance = var1.appearance;
      this.deadTimer = var1.deadTimer;
      this.creatorUuid = var1.creatorUuid;
      this.haveHit = var1.haveHit;
      this.brokenDamageModifier = var1.brokenDamageModifier;
      this.lastBouncePosition = var1.lastBouncePosition;
   }

   @Nonnull
   @Override
   class="kw">public Component<EntityStore> clone() {
      class="kw">return new ProjectileComponent(this);
   }
}