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