Source ZombieVillagerInfo - Spiderman31807/Mob_Selector_Mod GitHub Wiki

package playasmob;

import net.minecraft.world.item.trading.MerchantOffers;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.npc.VillagerType;
import net.minecraft.world.entity.npc.VillagerProfession;
import net.minecraft.world.entity.npc.VillagerDataHolder;
import net.minecraft.world.entity.npc.VillagerData;
import net.minecraft.world.entity.monster.ZombieVillager;
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.Tag;
import net.minecraft.nbt.NbtOps;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.client.renderer.entity.state.ZombieVillagerRenderState;
import net.minecraft.client.renderer.entity.state.EntityRenderState;
import net.minecraft.client.renderer.entity.ZombieVillagerRenderer;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.Util;

import com.mojang.serialization.Dynamic;
import com.mojang.serialization.DataResult;

public class ZombieVillagerInfo extends CurableZombieInfo implements VillagerDataHolder {
	public static final Synched villagerData = Synched.VillagerData;
	public Tag gossips;
	public MerchantOffers tradeOffers;
	public int villagerXp;

	public ZombieVillagerInfo(Player player, CompoundTag compound) {
		super(EntityType.ZOMBIE_VILLAGER, ZombieVillager.class, player, compound);
	}

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

	public ZombieVillagerInfo() {
		this(null);
	}

	// Custom Code
	@Override
	public void reset() {
		super.reset();
		this.gossips = null;
		this.tradeOffers = null;
		this.villagerXp = 0;
		this.reset(villagerData);
	}
	
	@Override
	public EntityRenderer getRenderer() {
		return new ZombieVillagerRenderer(Utils.getContext());
	}

	@Override
	public EntityRenderState createState() {
		return new ZombieVillagerRenderState();
	}

	@Override
	public void modifyState(EntityRenderState state) {
		super.modifyState(state);
		if (state instanceof ZombieVillagerRenderState zombieState)
			zombieState.villagerData = this.getVillagerData();
	}

	// ZombieVillager.class Code
	@Override
	public CompoundTag saveData() {
		CompoundTag compound = super.saveData();
		VillagerData.CODEC.encodeStart(NbtOps.INSTANCE, this.getVillagerData()).resultOrPartial(logger::error).ifPresent(saveData -> compound.put("VillagerData", saveData));
		if (this.tradeOffers != null)
			compound.put("Offers", MerchantOffers.CODEC.encodeStart(this.registryAccess().createSerializationContext(NbtOps.INSTANCE), this.tradeOffers).getOrThrow());
		if (this.gossips != null)
			compound.put("Gossips", this.gossips);
		compound.putInt("Xp", this.villagerXp);
		return compound;
	}

	@Override
	public void loadData(CompoundTag compound) {
		super.loadData(compound);
		if (compound.contains("VillagerData", 10)) {
			DataResult<VillagerData> dataresult = VillagerData.CODEC.parse(new Dynamic<>(NbtOps.INSTANCE, compound.get("VillagerData")));
			dataresult.resultOrPartial(logger::error).ifPresent(this::setVillagerData);
		}
		if (compound.contains("Offers")) {
			MerchantOffers.CODEC.parse(this.registryAccess().createSerializationContext(NbtOps.INSTANCE), compound.get("Offers")).resultOrPartial(Util.prefix("Failed to load offers: ", logger::warn)).ifPresent(offers -> this.tradeOffers = offers);
		}
		if (compound.contains("Gossips", 9))
			this.gossips = compound.getList("Gossips", 10);
		if (compound.contains("Xp", 3))
			this.villagerXp = compound.getInt("Xp");
	}

	@Override
	public boolean convertsInWater() {
		return false;
	}

	@Override
	public void finishConversion(ServerLevel server) {
		this.changeInfo(EntityType.VILLAGER, true);
	}

	@Override
	public float getVoicePitch(float original) {
		return this.isBaby() ? (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 2.0F : (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F;
	}

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

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

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

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

	@Override
	public ItemStack getSkull() {
		return ItemStack.EMPTY;
	}

	public void setTradeOffers(MerchantOffers offers) {
		this.tradeOffers = offers;
	}

	public void setGossips(Tag gossip) {
		this.gossips = gossip;
	}

	@Override
	public void init() {
		super.init();
		if (this.level() instanceof ServerLevel server)
			this.setVillagerData(this.getVillagerData().setType(VillagerType.byBiome(server.getBiome(this.blockPosition()))));
		BuiltInRegistries.VILLAGER_PROFESSION.getRandom(this.random).ifPresent(work -> this.setVillagerData(this.getVillagerData().setProfession(work.value())));
	}

	@Override
	public void setVillagerData(VillagerData data) {
		this.set(villagerData, data);
	}

	@Override
	public VillagerData getVillagerData() {
		return this.get(villagerData);
	}

	public int getVillagerXp() {
		return this.villagerXp;
	}

	public void setVillagerXp(int xp) {
		this.villagerXp = xp;
	}
}