102 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.client.particle;
 | |
| 
 | |
| import com.mojang.blaze3d.vertex.PoseStack;
 | |
| import com.mojang.blaze3d.vertex.VertexConsumer;
 | |
| import net.fabricmc.api.EnvType;
 | |
| import net.fabricmc.api.Environment;
 | |
| import net.minecraft.client.Camera;
 | |
| import net.minecraft.client.multiplayer.ClientLevel;
 | |
| import net.minecraft.client.renderer.MultiBufferSource;
 | |
| import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
 | |
| import net.minecraft.util.Mth;
 | |
| import net.minecraft.world.entity.Entity;
 | |
| import net.minecraft.world.entity.item.ItemEntity;
 | |
| import net.minecraft.world.phys.Vec3;
 | |
| 
 | |
| @Environment(EnvType.CLIENT)
 | |
| public class ItemPickupParticle extends Particle {
 | |
| 	private static final int LIFE_TIME = 3;
 | |
| 	private final Entity itemEntity;
 | |
| 	private final Entity target;
 | |
| 	private int life;
 | |
| 	private final EntityRenderDispatcher entityRenderDispatcher;
 | |
| 	private double targetX;
 | |
| 	private double targetY;
 | |
| 	private double targetZ;
 | |
| 	private double targetXOld;
 | |
| 	private double targetYOld;
 | |
| 	private double targetZOld;
 | |
| 
 | |
| 	public ItemPickupParticle(EntityRenderDispatcher entityRenderDispatcher, ClientLevel level, Entity itemEntity, Entity target) {
 | |
| 		this(entityRenderDispatcher, level, itemEntity, target, itemEntity.getDeltaMovement());
 | |
| 	}
 | |
| 
 | |
| 	private ItemPickupParticle(EntityRenderDispatcher entityRenderDispatcher, ClientLevel level, Entity itemEntity, Entity target, Vec3 speed) {
 | |
| 		super(level, itemEntity.getX(), itemEntity.getY(), itemEntity.getZ(), speed.x, speed.y, speed.z);
 | |
| 		this.itemEntity = this.getSafeCopy(itemEntity);
 | |
| 		this.target = target;
 | |
| 		this.entityRenderDispatcher = entityRenderDispatcher;
 | |
| 		this.updatePosition();
 | |
| 		this.saveOldPosition();
 | |
| 	}
 | |
| 
 | |
| 	private Entity getSafeCopy(Entity entity) {
 | |
| 		return (Entity)(!(entity instanceof ItemEntity) ? entity : ((ItemEntity)entity).copy());
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public ParticleRenderType getRenderType() {
 | |
| 		return ParticleRenderType.CUSTOM;
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public void renderCustom(PoseStack poseStack, MultiBufferSource bufferSource, Camera camera, float partialTick) {
 | |
| 		float f = (this.life + partialTick) / 3.0F;
 | |
| 		f *= f;
 | |
| 		double d = Mth.lerp((double)partialTick, this.targetXOld, this.targetX);
 | |
| 		double e = Mth.lerp((double)partialTick, this.targetYOld, this.targetY);
 | |
| 		double g = Mth.lerp((double)partialTick, this.targetZOld, this.targetZ);
 | |
| 		double h = Mth.lerp((double)f, this.itemEntity.getX(), d);
 | |
| 		double i = Mth.lerp((double)f, this.itemEntity.getY(), e);
 | |
| 		double j = Mth.lerp((double)f, this.itemEntity.getZ(), g);
 | |
| 		Vec3 vec3 = camera.getPosition();
 | |
| 		this.entityRenderDispatcher
 | |
| 			.render(
 | |
| 				this.itemEntity,
 | |
| 				h - vec3.x(),
 | |
| 				i - vec3.y(),
 | |
| 				j - vec3.z(),
 | |
| 				partialTick,
 | |
| 				new PoseStack(),
 | |
| 				bufferSource,
 | |
| 				this.entityRenderDispatcher.getPackedLightCoords(this.itemEntity, partialTick)
 | |
| 			);
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public void render(VertexConsumer buffer, Camera camera, float partialTick) {
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public void tick() {
 | |
| 		this.life++;
 | |
| 		if (this.life == 3) {
 | |
| 			this.remove();
 | |
| 		}
 | |
| 
 | |
| 		this.saveOldPosition();
 | |
| 		this.updatePosition();
 | |
| 	}
 | |
| 
 | |
| 	private void updatePosition() {
 | |
| 		this.targetX = this.target.getX();
 | |
| 		this.targetY = (this.target.getY() + this.target.getEyeY()) / 2.0;
 | |
| 		this.targetZ = this.target.getZ();
 | |
| 	}
 | |
| 
 | |
| 	private void saveOldPosition() {
 | |
| 		this.targetXOld = this.targetX;
 | |
| 		this.targetYOld = this.targetY;
 | |
| 		this.targetZOld = this.targetZ;
 | |
| 	}
 | |
| }
 |