Source SkeletonInfo - Spiderman31807/Mob_Selector_Mod GitHub Wiki

package playasmob;

import net.minecraft.world.item.Items;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.monster.Skeleton;
import net.minecraft.world.entity.monster.Creeper;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.client.renderer.entity.SkeletonRenderer;
import net.minecraft.client.renderer.entity.EntityRenderer;

public class SkeletonInfo extends AbstractSkeletonInfo {
	public static final Synched strayConverting = Synched.StrayConverting;
	public int inPowderSnowTime;
	public int conversionTime;

	public SkeletonInfo(Player player, CompoundTag compound) {
		super(EntityType.SKELETON, Skeleton.class, player, compound);
	}

	public SkeletonInfo(Player player) {
		this(player, null);
	}

	public SkeletonInfo() {
		this(null);
	}

	// Custom Code
	@Override
	public void reset() {
		super.reset();
		this.reset(strayConverting);
		this.inPowderSnowTime = 0;
		this.conversionTime = 0;
	}
	
	@Override
	public EntityRenderer getRenderer() {
		return new SkeletonRenderer(Utils.getContext());
	}

	// Skeleton.class Code
	public boolean isFreezeConverting() {
		return this.get(strayConverting);
	}

	public void setFreezeConverting(boolean converting) {
		this.set(strayConverting, converting);
	}

	@Override
	public boolean isShaking() {
		return this.isFreezeConverting();
	}

	@Override
	public void preTick() {
		if (!this.level().isClientSide && this.isAlive()) {
			if (this.player.isInPowderSnow) {
				if (this.isFreezeConverting()) {
					if (this.conversionTime-- < 0)
						this.doFreezeConversion();
				} else {
					if (this.inPowderSnowTime++ >= 140)
						this.startFreezeConversion(300);
				}
			} else {
				this.inPowderSnowTime = -1;
				this.setFreezeConverting(false);
			}
		}
		super.preTick();
	}

	@Override
	public CompoundTag saveData() {
		CompoundTag compound = super.saveData();
		compound.putInt("StrayConversionTime", this.isFreezeConverting() ? this.conversionTime : -1);
		return compound;
	}

	@Override
	public void loadData(CompoundTag compound) {
		super.loadData(compound);
		if (compound.contains("StrayConversionTime", 99) && compound.getInt("StrayConversionTime") > -1)
			this.startFreezeConversion(compound.getInt("StrayConversionTime"));
	}

	public void startFreezeConversion(int time) {
		this.conversionTime = time;
		this.setFreezeConverting(true);
	}

	public void doFreezeConversion() {
		this.changeInfo(InfoType.Stray, true);
		if (!this.isSilent())
			this.level().levelEvent(null, 1048, this.blockPosition(), 0);
	}

	@Override
	public boolean canFreeze(boolean original) {
		return false;
	}

	@Override
	public SoundEvent getAmbientSound() {
		return SoundEvents.SKELETON_AMBIENT;
	}

	@Override
	public SoundEvent getHurtSound(SoundEvent original, DamageSource source) {
		return SoundEvents.SKELETON_HURT;
	}

	@Override
	public SoundEvent getDeathSound(SoundEvent original) {
		return SoundEvents.SKELETON_DEATH;
	}

	@Override
	public SoundEvent getStepSound() {
		return SoundEvents.SKELETON_STEP;
	}

	@Override
	public boolean dropCustomDeathLoot(Object object, ServerLevel server, DamageSource source, boolean booleanValue) {
		if (!super.dropCustomDeathLoot(null, server, source, booleanValue))
			return false;
		if (source.getEntity() instanceof Creeper creeper && creeper.canDropMobsSkull()) {
			creeper.increaseDroppedSkulls();
			this.spawnAtLocation(server, Items.SKELETON_SKULL);
		} else if (source.getEntity() instanceof InfoHolder holder && holder.getInfo() instanceof CreeperInfo creeper && creeper.canDropMobsSkull()) {
			creeper.increaseDroppedSkulls();
			this.spawnAtLocation(server, Items.SKELETON_SKULL);
		}
		return true;
	}
}