Source WitherSkeletonInfo - Spiderman31807/Mob_Selector_Mod GitHub Wiki

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);
	}
}
⚠️ **GitHub.com Fallback** ⚠️