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);
}
}