package playasmob;
import net.minecraft.world.level.levelgen.structure.Structure;
import net.minecraft.world.level.levelgen.structure.BuiltinStructures;
import net.minecraft.world.level.Level;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.monster.WitherSkeleton;
import net.minecraft.world.entity.monster.Creeper;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.effect.MobEffectInstance;
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.resources.ResourceKey;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.client.renderer.entity.WitherSkeletonRenderer;
import net.minecraft.client.renderer.entity.EntityRenderer;
import java.util.List;
public class WitherSkeletonInfo extends AbstractSkeletonInfo {
public WitherSkeletonInfo(Player player, CompoundTag compound) {
super(EntityType.WITHER_SKELETON, WitherSkeleton.class, player, compound);
}
public WitherSkeletonInfo(Player player) {
this(player, null);
}
public WitherSkeletonInfo() {
this(null);
}
// Custom Code
@Override
public EntityRenderer getRenderer() {
return new WitherSkeletonRenderer(Utils.getContext());
}
@Override
public ResourceKey<Level> getRespawnDimension() {
return Level.NETHER;
}
@Override
public List<ResourceKey<Structure>> getRespawnStructures(ResourceKey<Level> dimension) {
return dimension.equals(Level.NETHER) ? List.of(BuiltinStructures.FORTRESS) : super.getRespawnStructures(dimension);
}
// Skeleton.class Code
@Override
public SoundEvent getAmbientSound() {
return SoundEvents.WITHER_SKELETON_AMBIENT;
}
@Override
public SoundEvent getHurtSound(SoundEvent original, DamageSource source) {
return SoundEvents.WITHER_SKELETON_HURT;
}
@Override
public SoundEvent getDeathSound(SoundEvent original) {
return SoundEvents.WITHER_SKELETON_DEATH;
}
@Override
public SoundEvent getStepSound() {
return SoundEvents.WITHER_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.WITHER_SKELETON_SKULL);
} else if (source.getEntity() instanceof InfoHolder holder && holder.getInfo() instanceof CreeperInfo creeper && creeper.canDropMobsSkull()) {
creeper.increaseDroppedSkulls();
this.spawnAtLocation(server, Items.WITHER_SKELETON_SKULL);
}
return true;
}
@Override
public ItemStack spawnedMainHandStack() {
return new ItemStack(Items.STONE_SWORD);
}
@Override
public boolean doHurtTarget(boolean original, ServerLevel server, Entity victim) {
if (!super.doHurtTarget(original, server, victim))
return false;
if (victim instanceof LivingEntity target)
target.addEffect(new MobEffectInstance(MobEffects.WITHER, 200), this.player);
return true;
}
@Override
public void modifyArrow(AbstractArrow arrow, ItemStack projectileStack, ItemStack weaponStack) {
super.modifyArrow(arrow, projectileStack, weaponStack);
arrow.igniteForSeconds(100);
}
@Override
public boolean canBeAffected(boolean original, MobEffectInstance effect) {
return effect.is(MobEffects.WITHER) ? false : super.canBeAffected(original, effect);
}
}