Jump to content

Recommended Posts

Posted
  On 5/10/2015 at 8:27 PM, NovaViper said:

I know about the UUID, I was asking what to do with it since it clearly won't work for String.  But wouldn't using a differenent player conflinct since its not saving the actual owner?

That's just flat out wrong. Did you not look at EntityTameable's code at all? It shows EXACTLY how to convert the UUID to String format so you can place it in DataWatcher or read/write as NBT.

 

The second question is a result of not understanding basic principles: the whole point of UUID is that it is UNIQUE, and the UUID for each player can always be used to retrieve that player instance from the world (if they are in the game).

  • Replies 98
  • Created
  • Last Reply

Top Posters In This Topic

Posted

That didn't work, I get this error when entering the game

 

[15:51:27] [server thread/ERROR] [FML]: An Entity type common.zeroquest.entity.zertum.EntityZertum has thrown an exception trying to write state. It will not persist. Report this to the mod author
net.minecraft.util.ReportedException: Saving entity NBT
at net.minecraft.entity.Entity.writeToNBT(Entity.java:1637) ~[Entity.class:?]
at net.minecraft.entity.Entity.writeToNBTOptional(Entity.java:1563) ~[Entity.class:?]
at net.minecraft.world.chunk.storage.AnvilChunkLoader.writeChunkToNBT(AnvilChunkLoader.java:385) [AnvilChunkLoader.class:?]
at net.minecraft.world.chunk.storage.AnvilChunkLoader.saveChunk(AnvilChunkLoader.java:193) [AnvilChunkLoader.class:?]
at net.minecraft.world.gen.ChunkProviderServer.saveChunkData(ChunkProviderServer.java:266) [ChunkProviderServer.class:?]
at net.minecraft.world.gen.ChunkProviderServer.saveChunks(ChunkProviderServer.java:332) [ChunkProviderServer.class:?]
at net.minecraft.world.WorldServer.saveAllChunks(WorldServer.java:976) [WorldServer.class:?]
at net.minecraft.server.MinecraftServer.saveAllWorlds(MinecraftServer.java:419) [MinecraftServer.class:?]
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:147) [integratedServer.class:?]
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:540) [MinecraftServer.class:?]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_25]
Caused by: java.lang.NullPointerException
at common.zeroquest.entity.zertum.EntityZertumEntity.writeEntityToNBT(EntityZertumEntity.java:305) ~[EntityZertumEntity.class:?]
at net.minecraft.entity.Entity.writeToNBT(Entity.java:1620) ~[Entity.class:?]
... 10 more

Main Developer and Owner of Zero Quest

Visit the Wiki for more information

If I helped anyone, please give me a applaud and a thank you!

Posted

Uhm guys, you know that UUID works only on server right?

Putting UUID into DataWatcher is simply wrong.

 

What is needed to be understood is the fact that both SERVER and CLIENT might NOT have the EntityPlayer owner constructed.

That is when you use virtual (fake) links like UUID or even direct names.

 

There are many ways of handling this, depending on what data about owneryou need, how fast and where (client or server), you might even need more than two fields. I will try to describe design:

EntityPlayer owner; // Which will be direct reference to owner on both server and client.
String ownerUUID; // Which is used when link between owner and tamed entity can't be found - e.g owner is offline (there is no EntityPlayer owner).
String ownerName; // This exists for client display purposes.

 

Now what should be saved?

NBT is server sided, inside saveNBT you need to save UUID of owner and ownerName field, why you will learn later.

There are few scenarios:

Both owner and tamed entity can be loaded by world, so ideally in that case you can get UUID directly from owner.getUUID()

Say that owner is logged out, but entity was loaded by world - well, then - you have your ownerUUID field, you save that.

In any case - you always save this ownerName field.

 

Inside loadNBT, you will be loading ownerName and the UUID.

Now what happens, as ststed before - entity might be loaded with owner online or not.

When owner is in world:

- You load UUID, read world#getPlayerEntityByUUID(uuid) and set EntityPlayer owner field.

- You also want to keep UUID loaded - you set ownerUUID field to one loaded.

- Now, since you have direct link to player, you can do owner.getDisplayName() and set ownerName field to it.

When owner is not in world - you can't load entity that is NOT there:

- In that case, you load both UUID and ownerName.

- Now, you don't have EntityPlayer, but you still was able to get the name of player (last name that he logged in on server, which might have changed since, that's why I noted that this is for display purposes).

 

What should be shared between client and server?

As stated before - UUID are ONLY server side, on client - they won't work. Ideally you need to send owner.getEntityId() and then on client, load that uwing world#getEntityFromId() (might be different name). Those IDs are shared between server and client and are only link between entities that you can make.

Now the problem is that, while the SERVER might have owner's entity constructed, CLIENT might not (out of visible range).

That is why you also want to be sharing ownerName field. So in the end you will always have owners name on all clients, even if that owner is logged out or out of range. Note that this name is ONLY for DISPLAYING purposes - e.g a TAG above head, or value in GUI.

 

Few last words:

This design is somewhat caching technique, whenever you can - you use EntityPlayer, when you can't you use UUID, when there is no Entity with present UUID, you reference the name directly.

 

Obviously, you might not need EntityPlayer owner, you can always get him directly (on server) from UUID, but I am optimalization-hype guy, why would you want to search by UUID if you can do that much faster :D (in my case I am using owner per-tick, so that was understandable).

 

Ideally - this system does not use DataWatchers, but direct dynamic packet-updates based on EntityTracker and StartTrackingEvent, if you would use DataWatchers then you totally don't need EntityPlayer field as it is stored as entityId inside watcher (but, is slower).

 

This is not by any means "you have to do it" but rather different angle at coding styles, understand the system and you will be able to code anything.

 

EDIT

And yeah - go read Tameable code, you might be also interested in EntityThrowable which uses direct naming (like in design above).

  Quote

1.7.10 is no longer supported by forge, you are on your own.

Posted

@Ernio EntityTameable stores the Yggdrasil converted UUID in DataWatcher which should then be usable just fine to retrieve the owner Entity whether on the client or the server. Otherwise, why would they bother storing it in DataWatcher if it only worked on the server?

 

It is sound to cache the owner entity once you have retrieved it, though, and you will need to store both the UUID and nickname, which we have discussed to death already in this thread.

Posted
  On 5/10/2015 at 10:52 PM, NovaViper said:

EntityTameable already stores the UUID though, what about the owner name?

That was what I had been telling you...

You should store the 'owner nickname' field with the UUID. You should also put that into the DataWatcher.

Also when the player logs in, you should reset the nickname from the player, since the nickname can be changed.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Posted
  On 5/11/2015 at 1:27 AM, NovaViper said:

I know but I don't know HOW do to it

You should be able to store the nickname field,

so I assume that you don't know how to reset the nickname when the player logs in.

.. and I just realized doing that in Entity#onUpdate will be better.

In the onUpdate, check if the player with the saved UUID exists in the world, and set the name field with the player's nickname.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Posted

In my mind operating on UUIDs was alway near to String stuff, which as you might know are not very efficient to be don in tick-time and per-entity.

 

That is the reason I suggested storing direct link to owner entity.

 

As to better ways:

Assuming that your entity is COMMON (somewhere around squids number) you could use PlayerLoggedInEvent to fire update check on all loaded entities that are instance of YourEntity. Just saying - saves a lot of UUID ops.

 

Post what you got (entity).

  Quote

1.7.10 is no longer supported by forge, you are on your own.

Posted
  On 5/11/2015 at 2:40 AM, Ernio said:

In my mind operating on UUIDs was alway near to String stuff, which as you might know are not very efficient to be don in tick-time and per-entity.

 

That is the reason I suggested storing direct link to owner entity.

 

As to better ways:

Assuming that your entity is COMMON (somewhere around squids number) you could use PlayerLoggedInEvent to fire update check on all loaded entities that are instance of YourEntity. Just saying - saves a lot of UUID ops.

 

Post what you got (entity).

Oh I didn't know doing it on PlayerLoggedInEvent would be more efficient.

  (I assumed that his entity is extremely rare, and I realized that it wouldn't now)

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Posted

Here is my entity code, and also, my entity is not rare, it spawns alot in a custom dimension I created.

 

package common.zeroquest.entity.zertum;

import java.util.HashMap;
import java.util.Map;

import net.minecraft.block.*;
import net.minecraft.block.material.*;
import net.minecraft.entity.*;
import net.minecraft.entity.ai.EntityAIAttackOnCollide;
import net.minecraft.entity.ai.EntityAIHurtByTarget;
import net.minecraft.entity.ai.EntityAILeapAtTarget;
import net.minecraft.entity.ai.EntityAILookIdle;
import net.minecraft.entity.ai.EntityAIMate;
import net.minecraft.entity.ai.EntityAISwimming;
import net.minecraft.entity.ai.EntityAIWander;
import net.minecraft.entity.ai.EntityAIWatchClosest;
import net.minecraft.entity.monster.*;
import net.minecraft.entity.passive.*;
import net.minecraft.entity.player.*;
import net.minecraft.entity.projectile.*;
import net.minecraft.init.*;
import net.minecraft.item.*;
import net.minecraft.nbt.*;
import net.minecraft.pathfinding.*;
import net.minecraft.potion.*;
import net.minecraft.util.*;
import net.minecraft.world.*;
import net.minecraftforge.fml.relauncher.*;
import common.zeroquest.*;
import common.zeroquest.core.helper.ChatHelper;
import common.zeroquest.entity.EntityCustomTameable;
import common.zeroquest.entity.ai.*;
import common.zeroquest.entity.util.*;
import common.zeroquest.inventory.*;
import common.zeroquest.lib.*;

public abstract class EntityZertumEntity extends EntityCustomTameable {
private float timeDogBegging;
private float prevTimeDogBegging;
public float headRotationCourse;
public float headRotationCourseOld;
public boolean isWet;
public boolean isShaking;
public float timeWolfIsShaking;
public float prevTimeWolfIsShaking;
private int hungerTick;
private int prevHungerTick;
private int healingTick;
private int prevHealingTick;
private int regenerationTick;
private int prevRegenerationTick;
public TalentUtil talents;
public LevelUtil levels;
public ModeUtil mode;
public CoordUtil coords;
public Map<String, Object> objects;
private boolean hasToy;
private float timeWolfIsHappy;
private float prevTimeWolfIsHappy;
private boolean isWolfHappy;
public boolean hiyaMaster;
private float mouthOpenness;
private float prevMouthOpenness;
private int openMouthCounter;

protected EntityAILeapAtTarget aiLeap = new EntityAILeapAtTarget(this, 0.4F);
public EntityAIWatchClosest aiStareAtPlayer = new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F);
public EntityAIWatchClosest aiGlareAtCreeper = new EntityAIWatchClosest(this, EntityCreeper.class, this.talents.getLevel("creeperspotter") * 6);
public EntityAIFetchBone aiFetchBone;

// data value IDs
/** DO NOT CHANGE! **/
public static final int INDEX_TAME = 16;
public static final int INDEX_COLLAR = 19;
public static final int INDEX_SADDLE = 20;
public static final int INDEX_EVOLVE = 25;
public static final int INDEX_MOUTH = 29;
public static final int INDEX_BEG = 30;

public EntityZertumEntity(World worldIn) {
	super(worldIn);
	this.objects = new HashMap<String, Object>();
	this.setSize(0.6F, 1.5F);
	((PathNavigateGround) this.getNavigator()).func_179690_a(true);
	this.tasks.addTask(1, new EntityAISwimming(this));
	this.tasks.addTask(2, this.aiSit);
	this.tasks.addTask(3, this.aiLeap);
	this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true));
	this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F));
	this.tasks.addTask(6, this.aiFetchBone = new EntityAIFetchBone(this, 1.0D, 0.5F, 20.0F));
	this.tasks.addTask(7, new EntityAIMate(this, 1.0D));
	this.tasks.addTask(8, new EntityAIWander(this, 1.0D));
	this.tasks.addTask(9, new EntityCustomAIBeg(this, 8.0F));
	this.tasks.addTask(10, aiStareAtPlayer);
	this.tasks.addTask(10, new EntityAILookIdle(this));
	this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this));
	this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this));
	this.targetTasks.addTask(3, new EntityAIModeAttackTarget(this));
	this.targetTasks.addTask(4, new EntityAIHurtByTarget(this, true));
	this.setTamed(false);
	this.setEvolved(false);
	this.inventory = new InventoryPack(this);
	this.targetTasks.addTask(6, new EntityAIRoundUp(this, EntityAnimal.class, 0, false));
	TalentHelper.onClassCreation(this);
}

@Override
public void applyEntityAttributes() {
	super.applyEntityAttributes();
	this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.30000001192092896);
	this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.wildHealth());
	this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.wildDamage());
	this.updateEntityAttributes();
}

public void updateEntityAttributes() {
	if (this.isTamed()) {
		if (!this.isChild() && !this.hasEvolved()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.tamedHealth() + this.effectiveLevel());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.tamedDamage());
		}
		else if (!this.isChild() && this.hasEvolved()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.evoHealth() + this.effectiveLevel());
		}
		else {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
		}
	}
	else {
		if (this.isChild()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
		}
	}
}

@Override
public void setTamed(boolean p_70903_1_) {
	super.setTamed(p_70903_1_);
	if (p_70903_1_) {
		if (!this.isChild() && !this.hasEvolved()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.tamedHealth() + this.effectiveLevel());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.tamedDamage());
		}
		else if (!this.isChild() && this.hasEvolved()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.evoHealth());
		}
		else {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
		}
	}
	else {
		if (this.isChild()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
		}
	}
}

public double tamedHealth() { // TODO
	if (this instanceof EntityZertum || this instanceof EntityRedZertum) {
		return 35;
	}
	else if (this instanceof EntityMetalZertum || this instanceof EntityIceZertum || this instanceof EntityForisZertum || this instanceof EntityDestroZertum || this instanceof EntityDarkZertum) {
		return 40;
	}
	return 0;
}

public double tamedDamage() {
	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityMetalZertum || this instanceof EntityIceZertum || this instanceof EntityForisZertum) {
		return 8;
	}
	else if (this instanceof EntityDestroZertum) {
		return 10;
	}
	else if (this instanceof EntityDarkZertum) {
		return 12;
	}
	return 0;
}

public double evoHealth() {
	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityIceZertum) {
		return 45;
	}
	else if (this instanceof EntityMetalZertum || this instanceof EntityForisZertum || this instanceof EntityDestroZertum) {
		return 50;
	}
	else if (this instanceof EntityDarkZertum) {
		return 60;
	}
	return 0;
}

public double wildHealth() {
	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityForisZertum) {
		return 25;
	}
	else if (this instanceof EntityMetalZertum || this instanceof EntityDestroZertum || this instanceof EntityDarkZertum) {
		return 30;
	}
	else if (this instanceof EntityIceZertum) {
		return 35;
	}
	return 0;
}

public double wildDamage() {
	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityMetalZertum || this instanceof EntityIceZertum || this instanceof EntityForisZertum) {
		return 6;
	}
	else if (this instanceof EntityDestroZertum) {
		return 8;
	}
	else if (this instanceof EntityDarkZertum) {
		return 10;
	}
	return 0;
}

public double babyHealth() {
	return 11;
}

public double babyDamage() {
	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityMetalZertum) {
		return 2;
	}
	else if (this instanceof EntityIceZertum || this instanceof EntityForisZertum || this instanceof EntityDarkZertum) {
		return 4;
	}
	else if (this instanceof EntityDestroZertum) {
		return 3;
	}
	return 0;
}

/**
 * Sets the active target the Task system uses for tracking
 */
@Override
public void setAttackTarget(EntityLivingBase p_70624_1_) {
	super.setAttackTarget(p_70624_1_);
	if (p_70624_1_ == null) {
		this.setAngry(false);
	}
	else if (!this.isTamed()) {
		this.setAngry(true);
	}
}

@Override
public String getName() {
	String name = this.getZertumName();
	if (name != "" && this.isTamed()) {
		return name;
	}
	else {
		return super.getName();
	}
}

@Override
@SideOnly(Side.CLIENT)
public boolean getAlwaysRenderNameTagForRender() {
	return true;
}

@Override
protected void entityInit() { // TODO
	super.entityInit();
	this.talents = new TalentUtil(this);
	this.levels = new LevelUtil(this);
	this.mode = new ModeUtil(this);
	this.coords = new CoordUtil(this);

	this.dataWatcher.addObject(INDEX_COLLAR, new Byte((byte) EnumDyeColor.RED.getMetadata())); // Collar
	this.dataWatcher.addObject(INDEX_SADDLE, Byte.valueOf((byte) 0)); // Saddle
	this.dataWatcher.addObject(21, new String("")); // Dog Name
	this.dataWatcher.addObject(22, new String("")); // Talent Data
	this.dataWatcher.addObject(23, new Integer(Constants.hungerTicks)); // Dog
																		// Hunger
	this.dataWatcher.addObject(24, new String("0:0")); // Level Data
	this.dataWatcher.addObject(INDEX_EVOLVE, Byte.valueOf((byte) 0)); // Evolution
	this.dataWatcher.addObject(26, new Integer(0)); // Obey Others
	this.dataWatcher.addObject(27, new Integer(0)); // Dog Mode
	this.dataWatcher.addObject(28, "-1:-1:-1:-1:-1:-1"); // Dog Coordination
	this.dataWatcher.addObject(INDEX_MOUTH, Integer.valueOf(0)); // Mouth
	this.dataWatcher.addObject(INDEX_BEG, new Byte((byte) 0)); // Begging
}

@Override
public void writeEntityToNBT(NBTTagCompound tagCompound) {
	super.writeEntityToNBT(tagCompound);
	tagCompound.setBoolean("Angry", this.isAngry());
	tagCompound.setByte("CollarColor", (byte) this.getCollarColor().getDyeDamage());
	tagCompound.setBoolean("Saddle", this.isSaddled());
	tagCompound.setBoolean("Evolve", this.hasEvolved());

	tagCompound.setString("version", Constants.version);
	tagCompound.setString("dogName", this.getZertumName());
	tagCompound.setInteger("dogHunger", this.getDogHunger());
	tagCompound.setBoolean("willObey", this.willObeyOthers());
	tagCompound.setBoolean("dogBeg", this.isBegging());

	this.talents.writeTalentsToNBT(tagCompound);
	this.levels.writeTalentsToNBT(tagCompound);
	this.mode.writeToNBT(tagCompound);
	this.coords.writeToNBT(tagCompound);
	TalentHelper.writeToNBT(this, tagCompound);
}

@Override
public void readEntityFromNBT(NBTTagCompound tagCompound) {
	super.readEntityFromNBT(tagCompound);
	this.setAngry(tagCompound.getBoolean("Angry"));
	this.setSaddled(tagCompound.getBoolean("Saddle"));
	this.setEvolved(tagCompound.getBoolean("Evolve"));

	if (tagCompound.hasKey("CollarColor", 99)) {
		this.setCollarColor(EnumDyeColor.byDyeDamage(tagCompound.getByte("CollarColor")));
	}

	String lastVersion = tagCompound.getString("version");
	this.setZertumName(tagCompound.getString("dogName"));
	this.setDogHunger(tagCompound.getInteger("dogHunger"));
	this.setWillObeyOthers(tagCompound.getBoolean("willObey"));
	this.setBegging(tagCompound.getBoolean("dogBeg"));

	this.talents.readTalentsFromNBT(tagCompound);
	this.levels.readTalentsFromNBT(tagCompound);
	this.mode.readFromNBT(tagCompound);
	this.coords.readFromNBT(tagCompound);
	TalentHelper.readFromNBT(this, tagCompound);
}

@Override
protected void playStepSound(BlockPos p_180429_1_, Block p_180429_2_) {
	this.playSound("mob.wolf.step", 0.15F, 1.0F);
}

/**
 * Returns the sound this mob makes while it's alive.
 */
@Override
protected String getLivingSound() {
	this.openMouth();
	String sound = TalentHelper.getLivingSound(this);
	if (!"".equals(sound)) {
		return sound;
	}

	return this.isAngry() ? "mob.wolf.growl" : this.wantToHowl ? Sound.ZertumHowl
			: (this.rand.nextInt(3) == 0 ? (this.isTamed() && this.getHealth() <= 10.0F
					? "mob.wolf.whine" : "mob.wolf.panting") : "mob.wolf.bark");
}

/**
 * Returns the sound this mob makes when it is hurt.
 */
@Override
protected String getHurtSound() {
	this.openMouth();
	return "mob.wolf.hurt";
}

/**
 * Returns the sound this mob makes on death.
 */
@Override
protected String getDeathSound() {
	this.openMouth();
	return "mob.wolf.death";
}

/**
 * Returns the volume for the sounds this mob makes.
 */
@Override
public float getSoundVolume() {
	return 1F;
}

/**
 * Get number of ticks, at least during which the living entity will be
 * silent.
 */
@Override
public int getTalkInterval() {
	if ((Boolean) this.objects.get("canseecreeper") == true) {
		return 40;
	}
	else if (this.wantToHowl) {
		return 150;
	}
	else if (this.getHealth() <= 10) {
		return 20;
	}
	else {
		return 200;
	}
}

/**
 * Returns the item ID for the item the mob drops on death.
 */
@Override
protected void dropFewItems(boolean par1, int par2) {
	rare = rand.nextInt(20);
	{
		if (this.isBurning()) {
			this.dropItem(ModItems.zertumMeatCooked, 1);
		}
		else if (rare <= 12) {
			this.dropItem(ModItems.zertumMeatRaw, 1);
		}
		if (rare <= 6 && !this.isTamed() && !(this instanceof EntityDarkZertum)) {
			this.dropItem(ModItems.nileGrain, 1);
		}
		if (rare <= 6 && !this.isTamed() && (this instanceof EntityDarkZertum)) {
			this.dropItem(ModItems.darkGrain, 1);
		}
		if (this.isSaddled()) {
			this.dropItem(Items.saddle, 1);
		}
		else {

		}

	}
}

/**
 * Called frequently so the entity can update its state every tick as
 * required. For example, zombies and skeletons use this to react to
 * sunlight and start to burn.
 */
@Override
public void onLivingUpdate() // TODO
{
	super.onLivingUpdate();
	if (isServer() && this.isWet && !this.isShaking && !this.hasPath() && this.onGround) {
		this.isShaking = true;
		this.timeWolfIsShaking = 0.0F;
		this.prevTimeWolfIsShaking = 0.0F;
		this.worldObj.setEntityState(this, (byte) ;
	}

	if (Constants.IS_HUNGER_ON) {
		this.prevHungerTick = this.hungerTick;

		if (this.riddenByEntity == null && !this.isSitting()) {
			this.hungerTick += 1;
		}

		this.hungerTick += TalentHelper.onHungerTick(this, this.hungerTick - this.prevHungerTick);

		if (this.hungerTick > 400) {
			this.setDogHunger(this.getDogHunger() - 1);
			this.hungerTick -= 400;
		}
	}

	if (Constants.DEF_HEALING == true && !this.isChild() && this.getHealth() <= 10 && this.isTamed()) {
		this.addPotionEffect(new PotionEffect(Potion.regeneration.id, 200));
	}

	if (this.getHealth() != 1) {
		this.prevHealingTick = this.healingTick;
		this.healingTick += this.nourishment();

		if (this.healingTick >= 6000) {
			if (this.getHealth() < this.getMaxHealth()) {
				this.setHealth(this.getHealth() + 1);
			}

			this.healingTick = 0;
		}
	}

	if (this.getDogHunger() == 0 && this.worldObj.getWorldInfo().getWorldTime() % 100L == 0L && this.getHealth() > 1) {
		this.attackEntityFrom(DamageSource.generic, 1);
	}

	if (isServer() && this.getAttackTarget() == null && this.isAngry()) {
		this.setAngry(false);
	}

	if (Constants.DEF_HOWL == true) {
		if (this.isServer()) {
			if (this.worldObj.isDaytime() && this.isChild()) // TODO
			{
				wantToHowl = false;
			}
			else if (!this.isChild()) {
				wantToHowl = true;
			}
		}
	}
	TalentHelper.onLivingUpdate(this);
}

/**
 * Called to update the entity's position/logic.
 */
@Override
public void onUpdate() {
	super.onUpdate();
	this.prevTimeDogBegging = this.timeDogBegging;

	if (this.isBegging()) {
		this.timeDogBegging += (1.0F - this.timeDogBegging) * 0.4F;
	}
	else {
		this.timeDogBegging += (0.0F - this.timeDogBegging) * 0.4F;
	}

	if (this.openMouthCounter > 0 && ++this.openMouthCounter > 30) {
		this.openMouthCounter = 0;
		this.setHorseWatchableBoolean(128, false);
	}

	this.prevMouthOpenness = this.mouthOpenness;

	if (this.getHorseWatchableBoolean(128)) {
		this.mouthOpenness += (1.0F - this.mouthOpenness) * 0.7F + 0.05F;

		if (this.mouthOpenness > 1.0F) {
			this.mouthOpenness = 1.0F;
		}
	}
	else {
		this.mouthOpenness += (0.0F - this.mouthOpenness) * 0.7F - 0.05F;

		if (this.mouthOpenness < 0.0F) {
			this.mouthOpenness = 0.0F;
		}
	}
	this.headRotationCourseOld = this.headRotationCourse;

	if (this.func_70922_bv()) {
		this.headRotationCourse += (1.0F - this.headRotationCourse) * 0.4F;
	}
	else {
		this.headRotationCourse += (0.0F - this.headRotationCourse) * 0.4F;
	}

	if (this.isWet()) {
		this.isWet = true;
		this.isShaking = false;
		this.timeWolfIsShaking = 0.0F;
		this.prevTimeWolfIsShaking = 0.0F;
	}
	else if ((this.isWet || this.isShaking) && this.isShaking) {
		if (this.timeWolfIsShaking == 0.0F) {
			this.playSound("mob.wolf.shake", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
		}

		this.prevTimeWolfIsShaking = this.timeWolfIsShaking;
		this.timeWolfIsShaking += 0.05F;

		if (this.prevTimeWolfIsShaking >= 2.0F) {
			if (this.rand.nextInt(15) < this.talents.getLevel("fishing") * 2) {
				if (this.rand.nextInt(15) < this.talents.getLevel("flamingelemental") * 2 && this instanceof EntityRedZertum) {
					if (isServer()) {
						dropItem(Items.cooked_fish, 1);
					}
				}
				else {
					if (isServer()) {
						dropItem(Items.fish, 1);
					}
				}
			}
			this.isWet = false;
			this.isShaking = false;
			this.prevTimeWolfIsShaking = 0.0F;
			this.timeWolfIsShaking = 0.0F;
		}

		if (this.timeWolfIsShaking > 0.4F) {
			float f = (float) this.getEntityBoundingBox().minY;
			int i = (int) (MathHelper.sin((this.timeWolfIsShaking - 0.4F) * (float) Math.PI) * 7.0F);

			for (int j = 0; j < i; ++j) {
				float f1 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F;
				float f2 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F;
				this.worldObj.spawnParticle(EnumParticleTypes.WATER_SPLASH, this.posX + f1, f + 0.8F, this.posZ + f2, this.motionX, this.motionY, this.motionZ, new int[0]);
			}
		}
	}

	if (this.rand.nextInt(200) == 0 && this.hasEvolved()) {
		this.hiyaMaster = true;
	}

	if (((this.isBegging()) || (this.hiyaMaster)) && (!this.isWolfHappy) && this.hasEvolved()) {
		this.isWolfHappy = true;
		this.timeWolfIsHappy = 0.0F;
		this.prevTimeWolfIsHappy = 0.0F;
	}
	else {
		hiyaMaster = false;
	}
	if (this.isWolfHappy) {
		if (this.timeWolfIsHappy % 1.0F == 0.0F) {
			if (!(this instanceof EntityMetalZertum)) {
				this.openMouth();
				this.worldObj.playSoundAtEntity(this, "mob.wolf.panting", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
			}
			else if (this instanceof EntityMetalZertum) {
				this.openMouth();
				this.worldObj.playSoundAtEntity(this, Sound.MetalZertumPant, this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
			}
		}
		this.prevTimeWolfIsHappy = this.timeWolfIsHappy;
		this.timeWolfIsHappy += 0.05F;
		if (this.prevTimeWolfIsHappy >= 8.0F) {
			this.isWolfHappy = false;
			this.prevTimeWolfIsHappy = 0.0F;
			this.timeWolfIsHappy = 0.0F;
		}
	}

	if (this.isTamed()) {
		EntityPlayer player = (EntityPlayer) this.getOwner();

		if (player != null) {
			float distanceToOwner = player.getDistanceToEntity(this);

			if (distanceToOwner <= 2F && this.hasToy()) {
				if (isServer()) {
					this.entityDropItem(new ItemStack(ModItems.toy, 1, 1), 0.0F);
				}
				this.setHasToy(false);
			}
		}
	}
	TalentHelper.onUpdate(this);
}

public float getWagAngle(float f, float f1) {
	float f2 = (this.prevTimeWolfIsHappy + (this.timeWolfIsHappy - this.prevTimeWolfIsHappy) * f + f1) / 2.0F;
	if (f2 < 0.0F) {
		f2 = 0.0F;
	}
	else if (f2 > 2.0F) {
		f2 %= 2.0F;
	}
	return MathHelper.sin(f2 * (float) Math.PI * 11.0F) * 0.3F * (float) Math.PI;
}

@Override
public void moveEntityWithHeading(float strafe, float forward) {
	if (this.riddenByEntity instanceof EntityPlayer) {
		this.prevRotationYaw = this.rotationYaw = this.riddenByEntity.rotationYaw;
		this.rotationPitch = this.riddenByEntity.rotationPitch * 0.5F;
		this.setRotation(this.rotationYaw, this.rotationPitch);
		this.rotationYawHead = this.renderYawOffset = this.rotationYaw;
		strafe = ((EntityPlayer) this.riddenByEntity).moveStrafing * 0.5F;
		forward = ((EntityPlayer) this.riddenByEntity).moveForward;

		if (forward <= 0.0F) {
			forward *= 0.25F;
		}

		if (this.onGround) {
			if (forward > 0.0F) {
				float f2 = MathHelper.sin(this.rotationYaw * (float) Math.PI / 180.0F);
				float f3 = MathHelper.cos(this.rotationYaw * (float) Math.PI / 180.0F);
				this.motionX += -0.4F * f2 * 0.15F; // May change
				this.motionZ += 0.4F * f3 * 0.15F;
			}
		}

		this.stepHeight = 1.0F;
		this.jumpMovementFactor = this.getAIMoveSpeed() * 0.2F;

		if (isServer()) {
			this.setAIMoveSpeed((float) this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue() / 4);
			super.moveEntityWithHeading(strafe, forward);
		}

		if (this.onGround) {
			// this.jumpPower = 0.0F;
			// this.setHorseJumping(false);
		}

		this.prevLimbSwingAmount = this.limbSwingAmount;
		double d0 = this.posX - this.prevPosX;
		double d1 = this.posZ - this.prevPosZ;
		float f4 = MathHelper.sqrt_double(d0 * d0 + d1 * d1) * 4.0F;

		if (f4 > 1.0F) {
			f4 = 1.0F;
		}

		this.limbSwingAmount += (f4 - this.limbSwingAmount) * 0.4F;
		this.limbSwing += this.limbSwingAmount;
	}
	else {
		this.stepHeight = 0.5F;
		this.jumpMovementFactor = 0.02F;
		super.moveEntityWithHeading(strafe, forward);
	}
}

@Override
public float getAIMoveSpeed() { // TODO
	double speed = this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue();
	speed += TalentHelper.addToMoveSpeed(this);

	if ((!(this.getAttackTarget() instanceof EntityZertumEntity) && !(this.getAttackTarget() instanceof EntityPlayer)) || this.riddenByEntity instanceof EntityPlayer) {
		if (this.levels.getLevel() == Constants.maxLevel && this.hasEvolved()) {
			speed += 0.4D;
		}
		else if (this.hasEvolved() && this.levels.getLevel() != Constants.maxLevel) {
			speed += 0.4D;
		}
	}

	if (this.riddenByEntity instanceof EntityPlayer) {
		speed /= 4;
	}

	return (float) speed;
}

public float getAIAttackDamage() {
	double damage = this.getEntityAttribute(SharedMonsterAttributes.attackDamage).getAttributeValue();
	damage += TalentHelper.addToAttackDamage(this);

	if ((!(this.getAttackTarget() instanceof EntityZertumEntity) && !(this.getAttackTarget() instanceof EntityPlayer))) {
		if (this.levels.getLevel() == Constants.maxLevel && this.hasEvolved()) {
			damage += 2.0D;
		}
		else if (this.hasEvolved() && this.levels.getLevel() != Constants.maxLevel) {
			damage += 2.0D;
		}
	}
	return (float) damage;
}

@Override
public void fall(float distance, float damageMultiplier) {
	if (distance > 1.0F) {
		this.playSound("game.neutral.hurt.fall.small", 0.4F, 1.0F);
	}

	int i = MathHelper.ceiling_float_int(((distance * 0.5F - 3.0F) - TalentHelper.fallProtection(this)) * damageMultiplier);

	if (i > 0 && !TalentHelper.isImmuneToFalls(this)) {
		this.attackEntityFrom(DamageSource.fall, i);

		if (this.riddenByEntity != null) {
			this.riddenByEntity.attackEntityFrom(DamageSource.fall, i);
		}

		Block block = this.worldObj.getBlockState(new BlockPos(this.posX, this.posY - 0.2D - this.prevRotationYaw, this.posZ)).getBlock();

		if (block.getMaterial() != Material.air && !this.isSilent()) {
			Block.SoundType soundtype = block.stepSound;
			this.worldObj.playSoundAtEntity(this, soundtype.getStepSound(), soundtype.getVolume() * 0.5F, soundtype.getFrequency() * 0.75F);
		}
	}
}

@SideOnly(Side.CLIENT)
public boolean isWolfWet() {
	return this.isWet;
}

@SideOnly(Side.CLIENT)
public float getShadingWhileWet(float p_70915_1_) {
	return 0.75F + (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70915_1_) / 2.0F * 0.25F;
}

@SideOnly(Side.CLIENT)
public float getShakeAngle(float p_70923_1_, float p_70923_2_) {
	float f2 = (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70923_1_ + p_70923_2_) / 1.8F;

	if (f2 < 0.0F) {
		f2 = 0.0F;
	}
	else if (f2 > 1.0F) {
		f2 = 1.0F;
	}

	return MathHelper.sin(f2 * (float) Math.PI) * MathHelper.sin(f2 * (float) Math.PI * 11.0F) * 0.15F * (float) Math.PI;
}

@SideOnly(Side.CLIENT)
public float getInterestedAngle(float partialTickTime) {
	return (this.prevTimeDogBegging + (this.timeDogBegging - this.prevTimeDogBegging) * partialTickTime) * 0.15F * (float) Math.PI;
}

@Override
public float getEyeHeight() {
	return this.height * 0.8F;
}

@Override
public int getVerticalFaceSpeed() {
	return this.isSitting() ? 20 : super.getVerticalFaceSpeed();
}

@Override
public boolean attackEntityFrom(DamageSource damageSource, float damage) {
	if (this.isEntityInvulnerable(damageSource)) {
		return false;
	}
	else {
		if (!TalentHelper.attackEntityFrom(this, damageSource, damage)) {
			return false;
		}

		Entity entity = damageSource.getEntity();
		this.aiSit.setSitting(false);

		if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow)) {
			damage = (damage + 1.0F) / 2.0F;
		}

		return super.attackEntityFrom(damageSource, damage);
	}
}

@Override
public boolean attackEntityAsMob(Entity entity) { // TODO
	if (!TalentHelper.shouldDamageMob(this, entity)) {
		return false;
	}

	int damage = (int) (4 + (this.getEntityAttribute(SharedMonsterAttributes.attackDamage).getBaseValue()) / 2);
	damage = TalentHelper.attackEntityAsMob(this, entity, damage);

	if (entity instanceof EntityZombie) {
		((EntityZombie) entity).setAttackTarget(this);
	}

	return entity.attackEntityFrom(DamageSource.causeMobDamage(this), damage);
}

/**
 * Called when the mob's health reaches 0.
 */
@Override
public void onDeath(DamageSource par1DamageSource) {
	super.onDeath(par1DamageSource);

	if (par1DamageSource.getEntity() instanceof EntityPlayer) {
		EntityPlayer entityplayer = (EntityPlayer) par1DamageSource.getEntity();
		{
			entityplayer.triggerAchievement(ModAchievements.ZertKill);
			this.dropChestItems();

		}
	}
}

@Override
protected boolean isMovementBlocked() {
	return this.isPlayerSleeping() || this.ridingEntity != null || this.riddenByEntity instanceof EntityPlayer || super.isMovementBlocked();
}

@Override
public double getYOffset() {
	return this.ridingEntity instanceof EntityPlayer ? 0.5D : 0.0D;
}

@Override
public boolean isPotionApplicable(PotionEffect potionEffect) {
	if (this.getHealth() <= 1) {
		return false;
	}

	if (!TalentHelper.isPostionApplicable(this, potionEffect)) {
		return false;
	}

	return true;
}

@Override
public void setFire(int amount) {
	if (TalentHelper.setFire(this, amount)) {
		super.setFire(amount);
	}
}

public int foodValue(ItemStack stack) {
	if (stack == null || stack.getItem() == null) {
		return 0;
	}

	int foodValue = 0;

	Item item = stack.getItem();

	if (stack.getItem() != Items.rotten_flesh && item instanceof ItemFood) {
		ItemFood itemfood = (ItemFood) item;

		if (itemfood.isWolfsFavoriteMeat()) {
			foodValue = 40;
		}
	}

	foodValue = TalentHelper.changeFoodValue(this, stack, foodValue);

	return foodValue;
}

public int masterOrder() { // TODO
	int order = 0;
	EntityPlayer player = (EntityPlayer) this.getOwner();

	if (player != null) {

		float distanceAway = player.getDistanceToEntity(this);
		ItemStack itemstack = player.inventory.getCurrentItem();

		if (itemstack != null && (itemstack.getItem() instanceof ItemTool) && distanceAway <= 20F) {
			order = 1;
		}

		if (itemstack != null && ((itemstack.getItem() instanceof ItemSword) || (itemstack.getItem() instanceof ItemBow))) {
			order = 2;
		}

		if (itemstack != null && itemstack.getItem() == Items.wheat) {
			order = 3;
		}

		if (itemstack != null && itemstack.getItem() == Items.bone) {
			order = 4;
		}
	}

	return order;
}

@Override
public boolean canBreatheUnderwater() {
	return TalentHelper.canBreatheUnderwater(this);
}

@Override
public boolean canInteract(EntityPlayer player) {
	return this.isOwner(player) || this.willObeyOthers();
}

public int nourishment() {
	int amount = 0;

	if (this.getDogHunger() > 0) {
		amount = 40 + 4 * (this.effectiveLevel() + 1);

		if (isSitting() && this.talents.getLevel("rapidregen") == 5) {
			amount += 20 + 2 * (this.effectiveLevel() + 1);
		}

		if (!this.isSitting()) {
			amount *= 5 + this.talents.getLevel("rapidregen");
			amount /= 10;
		}
	}

	return amount;
}

public int effectiveLevel() { // TODO
	return (this.levels.getLevel()) / 10;
}

public String getZertumName() {
	return this.dataWatcher.getWatchableObjectString(21);
}

public void setZertumName(String var1) {
	this.dataWatcher.updateObject(21, var1);
}

public void setWillObeyOthers(boolean flag) {
	this.dataWatcher.updateObject(26, flag ? 1 : 0);
}

public boolean willObeyOthers() {
	return this.dataWatcher.getWatchableObjectInt(26) != 0;
}

public int points() {
	return this.levels.getLevel() + (this.getGrowingAge() < 0 ? 0 : 20);
}

public int spendablePoints() {
	return this.points() - this.usedPoints();
}

public int usedPoints() {
	return TalentHelper.getUsedPoints(this);
}

public int deductive(int level) {
	byte byte0 = 0;
	switch (level) {
		case 1:
			return 1;
		case 2:
			return 3;
		case 3:
			return 5;
		case 4:
			return 7;
		case 5:
			return 9;
		default:
			return 0;
	}
}

public int getDogHunger() {
	return this.dataWatcher.getWatchableObjectInt(23);
}

public void setDogHunger(int par1) {
	this.dataWatcher.updateObject(23, MathHelper.clamp_int(par1, 0, Constants.hungerTicks));
}

@Override
public boolean func_142018_a(EntityLivingBase entityToAttack, EntityLivingBase owner) {
	if (TalentHelper.canAttackEntity(this, entityToAttack)) {
		return true;
	}

	if (!(entityToAttack instanceof EntityCreeper) && !(entityToAttack instanceof EntityGhast)) {
		if (entityToAttack instanceof EntityZertumEntity) {
			EntityZertumEntity entityZertum = (EntityZertumEntity) entityToAttack;

			if (entityZertum.isTamed() && entityZertum.getOwner() == owner) {
				return false;
			}
		}

		return entityToAttack instanceof EntityPlayer && owner instanceof EntityPlayer && !((EntityPlayer) owner).canAttackPlayer((EntityPlayer) entityToAttack)
				? false
				: !(entityToAttack instanceof EntityHorse) || !((EntityHorse) entityToAttack).isTame();
	}
	else {
		return false;
	}
}

@Override
public boolean canAttackClass(Class p_70686_1_) {
	if (TalentHelper.canAttackClass(this, p_70686_1_)) {
		return true;
	}

	return super.canAttackClass(p_70686_1_);
}

public void setHasToy(boolean hasBone) {
	this.hasToy = hasBone;
}

public boolean hasToy() {
	return this.hasToy;
}

/**
 * Gets the pitch of living sounds in living entities.
 */
@Override
public float getPitch() {
	if (!this.isChild()) {
		return super.getSoundPitch();
	}
	else {
		return super.getSoundPitch() * 1;
	}
}

@Override
@SideOnly(Side.CLIENT)
public void handleHealthUpdate(byte p_70103_1_) {
	if (p_70103_1_ ==  {
		this.isShaking = true;
		this.timeWolfIsShaking = 0.0F;
		this.prevTimeWolfIsShaking = 0.0F;
	}
	else {
		super.handleHealthUpdate(p_70103_1_);
	}
}

/**
 * Checks if the parameter is an item which this animal can be fed to breed
 * it (wheat, carrots or seeds depending on the animal type)
 */
@Override
public boolean isBreedingItem(ItemStack itemstack) {
	return itemstack == null ? false : itemstack.getItem() == ModItems.dogTreat;
}

@Override
public int getMaxSpawnedInChunk() {
	return 8;
}

public boolean isAngry() {
	return (this.dataWatcher.getWatchableObjectByte(INDEX_TAME) & 2) != 0;
}

public void setAngry(boolean p_70916_1_) {
	byte b0 = this.dataWatcher.getWatchableObjectByte(INDEX_TAME);

	if (p_70916_1_) {
		this.dataWatcher.updateObject(INDEX_TAME, Byte.valueOf((byte) (b0 | 2)));
	}
	else {
		this.dataWatcher.updateObject(INDEX_TAME, Byte.valueOf((byte) (b0 & -3)));
	}
}

public EnumDyeColor getCollarColor() {
	return EnumDyeColor.byDyeDamage(this.dataWatcher.getWatchableObjectByte(INDEX_COLLAR) & 15);
}

public void setCollarColor(EnumDyeColor collarcolor) {
	this.dataWatcher.updateObject(INDEX_COLLAR, Byte.valueOf((byte) (collarcolor.getDyeDamage() & 15)));
}

public boolean isSaddled() {
	return (this.dataWatcher.getWatchableObjectByte(INDEX_SADDLE) & 1) != 0;
}

public void setSaddled(boolean p_70900_1_) {
	if (p_70900_1_) {
		this.dataWatcher.updateObject(INDEX_SADDLE, Byte.valueOf((byte) 1));
	}
	else {
		this.dataWatcher.updateObject(INDEX_SADDLE, Byte.valueOf((byte) 0));
	}
}

private boolean getHorseWatchableBoolean(int p_110233_1_) {
	return (this.dataWatcher.getWatchableObjectInt(INDEX_MOUTH) & p_110233_1_) != 0;
}

private void setHorseWatchableBoolean(int p_110208_1_, boolean p_110208_2_) {
	int j = this.dataWatcher.getWatchableObjectInt(INDEX_MOUTH);

	if (p_110208_2_) {
		this.dataWatcher.updateObject(INDEX_MOUTH, Integer.valueOf(j | p_110208_1_));
	}
	else {
		this.dataWatcher.updateObject(INDEX_MOUTH, Integer.valueOf(j & ~p_110208_1_));
	}
}

@SideOnly(Side.CLIENT)
public float func_110201_q(float p_110201_1_) {
	return this.prevMouthOpenness + (this.mouthOpenness - this.prevMouthOpenness) * p_110201_1_;
}

public void openMouth() {
	if (isServer()) {
		this.openMouthCounter = 1;
		this.setHorseWatchableBoolean(128, true);
	}
}

/**
 * Determines if an entity can be despawned, used on idle far away entities
 */
@Override
protected boolean canDespawn() {
	return !this.isTamed() && this.ticksExisted > 2400;
}

@Override
public boolean allowLeashing() {
	return !this.isAngry() && super.allowLeashing();
}

public void setBegging(boolean flag) {
	this.dataWatcher.updateObject(INDEX_BEG, Byte.valueOf((byte) (flag ? 1 : 0)));
}

public boolean isBegging() {
	return this.dataWatcher.getWatchableObjectByte(INDEX_BEG) == 1;
}

public boolean hasEvolved() // TODO
{
	return (this.dataWatcher.getWatchableObjectByte(INDEX_EVOLVE) & 1) != 0;
}

public void evolveBoolean(boolean p_70900_1_) {
	if (p_70900_1_) {
		this.dataWatcher.updateObject(INDEX_EVOLVE, Byte.valueOf((byte) 1));
	}
	else {
		this.dataWatcher.updateObject(INDEX_EVOLVE, Byte.valueOf((byte) 0));
	}
}

public void setEvolved(boolean p_70900_1_) {
	this.evolveBoolean(p_70900_1_);
	if (p_70900_1_) {
		if (!this.isChild() && !this.hasEvolved()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.tamedHealth() + this.effectiveLevel());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.tamedDamage());
		}
		else if (!this.isChild() && this.hasEvolved()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.evoHealth());
		}
		else {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
		}
	}
	else {
		if (this.isChild()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
		}
	}
}

public void evolveOnClient(EntityPlayer player) {
	this.setEvolved(true);
	this.worldObj.playBroadcastSound(1013, new BlockPos(this), 0);
	player.addChatMessage(ChatHelper.getChatComponent(EnumChatFormatting.GREEN + this.getZertumName() + " has been evolved!"));
}

public void evolveOnServer(EntityZertumEntity entity, EntityPlayer player) {
	entity.setEvolved(true);
	entity.worldObj.playBroadcastSound(1013, new BlockPos(entity), 0);
	player.addChatMessage(ChatHelper.getChatComponent(EnumChatFormatting.GREEN + entity.getZertumName() + " has been evolved!"));
}
}

Main Developer and Owner of Zero Quest

Visit the Wiki for more information

If I helped anyone, please give me a applaud and a thank you!

Posted
  On 5/11/2015 at 9:29 PM, NovaViper said:

Here is my entity code, and also, my entity is not rare, it spawns alot in a custom dimension I created.

 

package common.zeroquest.entity.zertum;

import java.util.HashMap;
import java.util.Map;

import net.minecraft.block.*;
import net.minecraft.block.material.*;
import net.minecraft.entity.*;
import net.minecraft.entity.ai.EntityAIAttackOnCollide;
import net.minecraft.entity.ai.EntityAIHurtByTarget;
import net.minecraft.entity.ai.EntityAILeapAtTarget;
import net.minecraft.entity.ai.EntityAILookIdle;
import net.minecraft.entity.ai.EntityAIMate;
import net.minecraft.entity.ai.EntityAISwimming;
import net.minecraft.entity.ai.EntityAIWander;
import net.minecraft.entity.ai.EntityAIWatchClosest;
import net.minecraft.entity.monster.*;
import net.minecraft.entity.passive.*;
import net.minecraft.entity.player.*;
import net.minecraft.entity.projectile.*;
import net.minecraft.init.*;
import net.minecraft.item.*;
import net.minecraft.nbt.*;
import net.minecraft.pathfinding.*;
import net.minecraft.potion.*;
import net.minecraft.util.*;
import net.minecraft.world.*;
import net.minecraftforge.fml.relauncher.*;
import common.zeroquest.*;
import common.zeroquest.core.helper.ChatHelper;
import common.zeroquest.entity.EntityCustomTameable;
import common.zeroquest.entity.ai.*;
import common.zeroquest.entity.util.*;
import common.zeroquest.inventory.*;
import common.zeroquest.lib.*;

public abstract class EntityZertumEntity extends EntityCustomTameable {
private float timeDogBegging;
private float prevTimeDogBegging;
public float headRotationCourse;
public float headRotationCourseOld;
public boolean isWet;
public boolean isShaking;
public float timeWolfIsShaking;
public float prevTimeWolfIsShaking;
private int hungerTick;
private int prevHungerTick;
private int healingTick;
private int prevHealingTick;
private int regenerationTick;
private int prevRegenerationTick;
public TalentUtil talents;
public LevelUtil levels;
public ModeUtil mode;
public CoordUtil coords;
public Map<String, Object> objects;
private boolean hasToy;
private float timeWolfIsHappy;
private float prevTimeWolfIsHappy;
private boolean isWolfHappy;
public boolean hiyaMaster;
private float mouthOpenness;
private float prevMouthOpenness;
private int openMouthCounter;

protected EntityAILeapAtTarget aiLeap = new EntityAILeapAtTarget(this, 0.4F);
public EntityAIWatchClosest aiStareAtPlayer = new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F);
public EntityAIWatchClosest aiGlareAtCreeper = new EntityAIWatchClosest(this, EntityCreeper.class, this.talents.getLevel("creeperspotter") * 6);
public EntityAIFetchBone aiFetchBone;

// data value IDs
/** DO NOT CHANGE! **/
public static final int INDEX_TAME = 16;
public static final int INDEX_COLLAR = 19;
public static final int INDEX_SADDLE = 20;
public static final int INDEX_EVOLVE = 25;
public static final int INDEX_MOUTH = 29;
public static final int INDEX_BEG = 30;

public EntityZertumEntity(World worldIn) {
	super(worldIn);
	this.objects = new HashMap<String, Object>();
	this.setSize(0.6F, 1.5F);
	((PathNavigateGround) this.getNavigator()).func_179690_a(true);
	this.tasks.addTask(1, new EntityAISwimming(this));
	this.tasks.addTask(2, this.aiSit);
	this.tasks.addTask(3, this.aiLeap);
	this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true));
	this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F));
	this.tasks.addTask(6, this.aiFetchBone = new EntityAIFetchBone(this, 1.0D, 0.5F, 20.0F));
	this.tasks.addTask(7, new EntityAIMate(this, 1.0D));
	this.tasks.addTask(8, new EntityAIWander(this, 1.0D));
	this.tasks.addTask(9, new EntityCustomAIBeg(this, 8.0F));
	this.tasks.addTask(10, aiStareAtPlayer);
	this.tasks.addTask(10, new EntityAILookIdle(this));
	this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this));
	this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this));
	this.targetTasks.addTask(3, new EntityAIModeAttackTarget(this));
	this.targetTasks.addTask(4, new EntityAIHurtByTarget(this, true));
	this.setTamed(false);
	this.setEvolved(false);
	this.inventory = new InventoryPack(this);
	this.targetTasks.addTask(6, new EntityAIRoundUp(this, EntityAnimal.class, 0, false));
	TalentHelper.onClassCreation(this);
}

@Override
public void applyEntityAttributes() {
	super.applyEntityAttributes();
	this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.30000001192092896);
	this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.wildHealth());
	this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.wildDamage());
	this.updateEntityAttributes();
}

public void updateEntityAttributes() {
	if (this.isTamed()) {
		if (!this.isChild() && !this.hasEvolved()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.tamedHealth() + this.effectiveLevel());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.tamedDamage());
		}
		else if (!this.isChild() && this.hasEvolved()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.evoHealth() + this.effectiveLevel());
		}
		else {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
		}
	}
	else {
		if (this.isChild()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
		}
	}
}

@Override
public void setTamed(boolean p_70903_1_) {
	super.setTamed(p_70903_1_);
	if (p_70903_1_) {
		if (!this.isChild() && !this.hasEvolved()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.tamedHealth() + this.effectiveLevel());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.tamedDamage());
		}
		else if (!this.isChild() && this.hasEvolved()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.evoHealth());
		}
		else {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
		}
	}
	else {
		if (this.isChild()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
		}
	}
}

public double tamedHealth() { // TODO
	if (this instanceof EntityZertum || this instanceof EntityRedZertum) {
		return 35;
	}
	else if (this instanceof EntityMetalZertum || this instanceof EntityIceZertum || this instanceof EntityForisZertum || this instanceof EntityDestroZertum || this instanceof EntityDarkZertum) {
		return 40;
	}
	return 0;
}

public double tamedDamage() {
	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityMetalZertum || this instanceof EntityIceZertum || this instanceof EntityForisZertum) {
		return 8;
	}
	else if (this instanceof EntityDestroZertum) {
		return 10;
	}
	else if (this instanceof EntityDarkZertum) {
		return 12;
	}
	return 0;
}

public double evoHealth() {
	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityIceZertum) {
		return 45;
	}
	else if (this instanceof EntityMetalZertum || this instanceof EntityForisZertum || this instanceof EntityDestroZertum) {
		return 50;
	}
	else if (this instanceof EntityDarkZertum) {
		return 60;
	}
	return 0;
}

public double wildHealth() {
	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityForisZertum) {
		return 25;
	}
	else if (this instanceof EntityMetalZertum || this instanceof EntityDestroZertum || this instanceof EntityDarkZertum) {
		return 30;
	}
	else if (this instanceof EntityIceZertum) {
		return 35;
	}
	return 0;
}

public double wildDamage() {
	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityMetalZertum || this instanceof EntityIceZertum || this instanceof EntityForisZertum) {
		return 6;
	}
	else if (this instanceof EntityDestroZertum) {
		return 8;
	}
	else if (this instanceof EntityDarkZertum) {
		return 10;
	}
	return 0;
}

public double babyHealth() {
	return 11;
}

public double babyDamage() {
	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityMetalZertum) {
		return 2;
	}
	else if (this instanceof EntityIceZertum || this instanceof EntityForisZertum || this instanceof EntityDarkZertum) {
		return 4;
	}
	else if (this instanceof EntityDestroZertum) {
		return 3;
	}
	return 0;
}

/**
 * Sets the active target the Task system uses for tracking
 */
@Override
public void setAttackTarget(EntityLivingBase p_70624_1_) {
	super.setAttackTarget(p_70624_1_);
	if (p_70624_1_ == null) {
		this.setAngry(false);
	}
	else if (!this.isTamed()) {
		this.setAngry(true);
	}
}

@Override
public String getName() {
	String name = this.getZertumName();
	if (name != "" && this.isTamed()) {
		return name;
	}
	else {
		return super.getName();
	}
}

@Override
@SideOnly(Side.CLIENT)
public boolean getAlwaysRenderNameTagForRender() {
	return true;
}

@Override
protected void entityInit() { // TODO
	super.entityInit();
	this.talents = new TalentUtil(this);
	this.levels = new LevelUtil(this);
	this.mode = new ModeUtil(this);
	this.coords = new CoordUtil(this);

	this.dataWatcher.addObject(INDEX_COLLAR, new Byte((byte) EnumDyeColor.RED.getMetadata())); // Collar
	this.dataWatcher.addObject(INDEX_SADDLE, Byte.valueOf((byte) 0)); // Saddle
	this.dataWatcher.addObject(21, new String("")); // Dog Name
	this.dataWatcher.addObject(22, new String("")); // Talent Data
	this.dataWatcher.addObject(23, new Integer(Constants.hungerTicks)); // Dog
																		// Hunger
	this.dataWatcher.addObject(24, new String("0:0")); // Level Data
	this.dataWatcher.addObject(INDEX_EVOLVE, Byte.valueOf((byte) 0)); // Evolution
	this.dataWatcher.addObject(26, new Integer(0)); // Obey Others
	this.dataWatcher.addObject(27, new Integer(0)); // Dog Mode
	this.dataWatcher.addObject(28, "-1:-1:-1:-1:-1:-1"); // Dog Coordination
	this.dataWatcher.addObject(INDEX_MOUTH, Integer.valueOf(0)); // Mouth
	this.dataWatcher.addObject(INDEX_BEG, new Byte((byte) 0)); // Begging
}

@Override
public void writeEntityToNBT(NBTTagCompound tagCompound) {
	super.writeEntityToNBT(tagCompound);
	tagCompound.setBoolean("Angry", this.isAngry());
	tagCompound.setByte("CollarColor", (byte) this.getCollarColor().getDyeDamage());
	tagCompound.setBoolean("Saddle", this.isSaddled());
	tagCompound.setBoolean("Evolve", this.hasEvolved());

	tagCompound.setString("version", Constants.version);
	tagCompound.setString("dogName", this.getZertumName());
	tagCompound.setInteger("dogHunger", this.getDogHunger());
	tagCompound.setBoolean("willObey", this.willObeyOthers());
	tagCompound.setBoolean("dogBeg", this.isBegging());

	this.talents.writeTalentsToNBT(tagCompound);
	this.levels.writeTalentsToNBT(tagCompound);
	this.mode.writeToNBT(tagCompound);
	this.coords.writeToNBT(tagCompound);
	TalentHelper.writeToNBT(this, tagCompound);
}

@Override
public void readEntityFromNBT(NBTTagCompound tagCompound) {
	super.readEntityFromNBT(tagCompound);
	this.setAngry(tagCompound.getBoolean("Angry"));
	this.setSaddled(tagCompound.getBoolean("Saddle"));
	this.setEvolved(tagCompound.getBoolean("Evolve"));

	if (tagCompound.hasKey("CollarColor", 99)) {
		this.setCollarColor(EnumDyeColor.byDyeDamage(tagCompound.getByte("CollarColor")));
	}

	String lastVersion = tagCompound.getString("version");
	this.setZertumName(tagCompound.getString("dogName"));
	this.setDogHunger(tagCompound.getInteger("dogHunger"));
	this.setWillObeyOthers(tagCompound.getBoolean("willObey"));
	this.setBegging(tagCompound.getBoolean("dogBeg"));

	this.talents.readTalentsFromNBT(tagCompound);
	this.levels.readTalentsFromNBT(tagCompound);
	this.mode.readFromNBT(tagCompound);
	this.coords.readFromNBT(tagCompound);
	TalentHelper.readFromNBT(this, tagCompound);
}

@Override
protected void playStepSound(BlockPos p_180429_1_, Block p_180429_2_) {
	this.playSound("mob.wolf.step", 0.15F, 1.0F);
}

/**
 * Returns the sound this mob makes while it's alive.
 */
@Override
protected String getLivingSound() {
	this.openMouth();
	String sound = TalentHelper.getLivingSound(this);
	if (!"".equals(sound)) {
		return sound;
	}

	return this.isAngry() ? "mob.wolf.growl" : this.wantToHowl ? Sound.ZertumHowl
			: (this.rand.nextInt(3) == 0 ? (this.isTamed() && this.getHealth() <= 10.0F
					? "mob.wolf.whine" : "mob.wolf.panting") : "mob.wolf.bark");
}

/**
 * Returns the sound this mob makes when it is hurt.
 */
@Override
protected String getHurtSound() {
	this.openMouth();
	return "mob.wolf.hurt";
}

/**
 * Returns the sound this mob makes on death.
 */
@Override
protected String getDeathSound() {
	this.openMouth();
	return "mob.wolf.death";
}

/**
 * Returns the volume for the sounds this mob makes.
 */
@Override
public float getSoundVolume() {
	return 1F;
}

/**
 * Get number of ticks, at least during which the living entity will be
 * silent.
 */
@Override
public int getTalkInterval() {
	if ((Boolean) this.objects.get("canseecreeper") == true) {
		return 40;
	}
	else if (this.wantToHowl) {
		return 150;
	}
	else if (this.getHealth() <= 10) {
		return 20;
	}
	else {
		return 200;
	}
}

/**
 * Returns the item ID for the item the mob drops on death.
 */
@Override
protected void dropFewItems(boolean par1, int par2) {
	rare = rand.nextInt(20);
	{
		if (this.isBurning()) {
			this.dropItem(ModItems.zertumMeatCooked, 1);
		}
		else if (rare <= 12) {
			this.dropItem(ModItems.zertumMeatRaw, 1);
		}
		if (rare <= 6 && !this.isTamed() && !(this instanceof EntityDarkZertum)) {
			this.dropItem(ModItems.nileGrain, 1);
		}
		if (rare <= 6 && !this.isTamed() && (this instanceof EntityDarkZertum)) {
			this.dropItem(ModItems.darkGrain, 1);
		}
		if (this.isSaddled()) {
			this.dropItem(Items.saddle, 1);
		}
		else {

		}

	}
}

/**
 * Called frequently so the entity can update its state every tick as
 * required. For example, zombies and skeletons use this to react to
 * sunlight and start to burn.
 */
@Override
public void onLivingUpdate() // TODO
{
	super.onLivingUpdate();
	if (isServer() && this.isWet && !this.isShaking && !this.hasPath() && this.onGround) {
		this.isShaking = true;
		this.timeWolfIsShaking = 0.0F;
		this.prevTimeWolfIsShaking = 0.0F;
		this.worldObj.setEntityState(this, (byte) ;
	}

	if (Constants.IS_HUNGER_ON) {
		this.prevHungerTick = this.hungerTick;

		if (this.riddenByEntity == null && !this.isSitting()) {
			this.hungerTick += 1;
		}

		this.hungerTick += TalentHelper.onHungerTick(this, this.hungerTick - this.prevHungerTick);

		if (this.hungerTick > 400) {
			this.setDogHunger(this.getDogHunger() - 1);
			this.hungerTick -= 400;
		}
	}

	if (Constants.DEF_HEALING == true && !this.isChild() && this.getHealth() <= 10 && this.isTamed()) {
		this.addPotionEffect(new PotionEffect(Potion.regeneration.id, 200));
	}

	if (this.getHealth() != 1) {
		this.prevHealingTick = this.healingTick;
		this.healingTick += this.nourishment();

		if (this.healingTick >= 6000) {
			if (this.getHealth() < this.getMaxHealth()) {
				this.setHealth(this.getHealth() + 1);
			}

			this.healingTick = 0;
		}
	}

	if (this.getDogHunger() == 0 && this.worldObj.getWorldInfo().getWorldTime() % 100L == 0L && this.getHealth() > 1) {
		this.attackEntityFrom(DamageSource.generic, 1);
	}

	if (isServer() && this.getAttackTarget() == null && this.isAngry()) {
		this.setAngry(false);
	}

	if (Constants.DEF_HOWL == true) {
		if (this.isServer()) {
			if (this.worldObj.isDaytime() && this.isChild()) // TODO
			{
				wantToHowl = false;
			}
			else if (!this.isChild()) {
				wantToHowl = true;
			}
		}
	}
	TalentHelper.onLivingUpdate(this);
}

/**
 * Called to update the entity's position/logic.
 */
@Override
public void onUpdate() {
	super.onUpdate();
	this.prevTimeDogBegging = this.timeDogBegging;

	if (this.isBegging()) {
		this.timeDogBegging += (1.0F - this.timeDogBegging) * 0.4F;
	}
	else {
		this.timeDogBegging += (0.0F - this.timeDogBegging) * 0.4F;
	}

	if (this.openMouthCounter > 0 && ++this.openMouthCounter > 30) {
		this.openMouthCounter = 0;
		this.setHorseWatchableBoolean(128, false);
	}

	this.prevMouthOpenness = this.mouthOpenness;

	if (this.getHorseWatchableBoolean(128)) {
		this.mouthOpenness += (1.0F - this.mouthOpenness) * 0.7F + 0.05F;

		if (this.mouthOpenness > 1.0F) {
			this.mouthOpenness = 1.0F;
		}
	}
	else {
		this.mouthOpenness += (0.0F - this.mouthOpenness) * 0.7F - 0.05F;

		if (this.mouthOpenness < 0.0F) {
			this.mouthOpenness = 0.0F;
		}
	}
	this.headRotationCourseOld = this.headRotationCourse;

	if (this.func_70922_bv()) {
		this.headRotationCourse += (1.0F - this.headRotationCourse) * 0.4F;
	}
	else {
		this.headRotationCourse += (0.0F - this.headRotationCourse) * 0.4F;
	}

	if (this.isWet()) {
		this.isWet = true;
		this.isShaking = false;
		this.timeWolfIsShaking = 0.0F;
		this.prevTimeWolfIsShaking = 0.0F;
	}
	else if ((this.isWet || this.isShaking) && this.isShaking) {
		if (this.timeWolfIsShaking == 0.0F) {
			this.playSound("mob.wolf.shake", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
		}

		this.prevTimeWolfIsShaking = this.timeWolfIsShaking;
		this.timeWolfIsShaking += 0.05F;

		if (this.prevTimeWolfIsShaking >= 2.0F) {
			if (this.rand.nextInt(15) < this.talents.getLevel("fishing") * 2) {
				if (this.rand.nextInt(15) < this.talents.getLevel("flamingelemental") * 2 && this instanceof EntityRedZertum) {
					if (isServer()) {
						dropItem(Items.cooked_fish, 1);
					}
				}
				else {
					if (isServer()) {
						dropItem(Items.fish, 1);
					}
				}
			}
			this.isWet = false;
			this.isShaking = false;
			this.prevTimeWolfIsShaking = 0.0F;
			this.timeWolfIsShaking = 0.0F;
		}

		if (this.timeWolfIsShaking > 0.4F) {
			float f = (float) this.getEntityBoundingBox().minY;
			int i = (int) (MathHelper.sin((this.timeWolfIsShaking - 0.4F) * (float) Math.PI) * 7.0F);

			for (int j = 0; j < i; ++j) {
				float f1 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F;
				float f2 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F;
				this.worldObj.spawnParticle(EnumParticleTypes.WATER_SPLASH, this.posX + f1, f + 0.8F, this.posZ + f2, this.motionX, this.motionY, this.motionZ, new int[0]);
			}
		}
	}

	if (this.rand.nextInt(200) == 0 && this.hasEvolved()) {
		this.hiyaMaster = true;
	}

	if (((this.isBegging()) || (this.hiyaMaster)) && (!this.isWolfHappy) && this.hasEvolved()) {
		this.isWolfHappy = true;
		this.timeWolfIsHappy = 0.0F;
		this.prevTimeWolfIsHappy = 0.0F;
	}
	else {
		hiyaMaster = false;
	}
	if (this.isWolfHappy) {
		if (this.timeWolfIsHappy % 1.0F == 0.0F) {
			if (!(this instanceof EntityMetalZertum)) {
				this.openMouth();
				this.worldObj.playSoundAtEntity(this, "mob.wolf.panting", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
			}
			else if (this instanceof EntityMetalZertum) {
				this.openMouth();
				this.worldObj.playSoundAtEntity(this, Sound.MetalZertumPant, this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
			}
		}
		this.prevTimeWolfIsHappy = this.timeWolfIsHappy;
		this.timeWolfIsHappy += 0.05F;
		if (this.prevTimeWolfIsHappy >= 8.0F) {
			this.isWolfHappy = false;
			this.prevTimeWolfIsHappy = 0.0F;
			this.timeWolfIsHappy = 0.0F;
		}
	}

	if (this.isTamed()) {
		EntityPlayer player = (EntityPlayer) this.getOwner();

		if (player != null) {
			float distanceToOwner = player.getDistanceToEntity(this);

			if (distanceToOwner <= 2F && this.hasToy()) {
				if (isServer()) {
					this.entityDropItem(new ItemStack(ModItems.toy, 1, 1), 0.0F);
				}
				this.setHasToy(false);
			}
		}
	}
	TalentHelper.onUpdate(this);
}

public float getWagAngle(float f, float f1) {
	float f2 = (this.prevTimeWolfIsHappy + (this.timeWolfIsHappy - this.prevTimeWolfIsHappy) * f + f1) / 2.0F;
	if (f2 < 0.0F) {
		f2 = 0.0F;
	}
	else if (f2 > 2.0F) {
		f2 %= 2.0F;
	}
	return MathHelper.sin(f2 * (float) Math.PI * 11.0F) * 0.3F * (float) Math.PI;
}

@Override
public void moveEntityWithHeading(float strafe, float forward) {
	if (this.riddenByEntity instanceof EntityPlayer) {
		this.prevRotationYaw = this.rotationYaw = this.riddenByEntity.rotationYaw;
		this.rotationPitch = this.riddenByEntity.rotationPitch * 0.5F;
		this.setRotation(this.rotationYaw, this.rotationPitch);
		this.rotationYawHead = this.renderYawOffset = this.rotationYaw;
		strafe = ((EntityPlayer) this.riddenByEntity).moveStrafing * 0.5F;
		forward = ((EntityPlayer) this.riddenByEntity).moveForward;

		if (forward <= 0.0F) {
			forward *= 0.25F;
		}

		if (this.onGround) {
			if (forward > 0.0F) {
				float f2 = MathHelper.sin(this.rotationYaw * (float) Math.PI / 180.0F);
				float f3 = MathHelper.cos(this.rotationYaw * (float) Math.PI / 180.0F);
				this.motionX += -0.4F * f2 * 0.15F; // May change
				this.motionZ += 0.4F * f3 * 0.15F;
			}
		}

		this.stepHeight = 1.0F;
		this.jumpMovementFactor = this.getAIMoveSpeed() * 0.2F;

		if (isServer()) {
			this.setAIMoveSpeed((float) this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue() / 4);
			super.moveEntityWithHeading(strafe, forward);
		}

		if (this.onGround) {
			// this.jumpPower = 0.0F;
			// this.setHorseJumping(false);
		}

		this.prevLimbSwingAmount = this.limbSwingAmount;
		double d0 = this.posX - this.prevPosX;
		double d1 = this.posZ - this.prevPosZ;
		float f4 = MathHelper.sqrt_double(d0 * d0 + d1 * d1) * 4.0F;

		if (f4 > 1.0F) {
			f4 = 1.0F;
		}

		this.limbSwingAmount += (f4 - this.limbSwingAmount) * 0.4F;
		this.limbSwing += this.limbSwingAmount;
	}
	else {
		this.stepHeight = 0.5F;
		this.jumpMovementFactor = 0.02F;
		super.moveEntityWithHeading(strafe, forward);
	}
}

@Override
public float getAIMoveSpeed() { // TODO
	double speed = this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue();
	speed += TalentHelper.addToMoveSpeed(this);

	if ((!(this.getAttackTarget() instanceof EntityZertumEntity) && !(this.getAttackTarget() instanceof EntityPlayer)) || this.riddenByEntity instanceof EntityPlayer) {
		if (this.levels.getLevel() == Constants.maxLevel && this.hasEvolved()) {
			speed += 0.4D;
		}
		else if (this.hasEvolved() && this.levels.getLevel() != Constants.maxLevel) {
			speed += 0.4D;
		}
	}

	if (this.riddenByEntity instanceof EntityPlayer) {
		speed /= 4;
	}

	return (float) speed;
}

public float getAIAttackDamage() {
	double damage = this.getEntityAttribute(SharedMonsterAttributes.attackDamage).getAttributeValue();
	damage += TalentHelper.addToAttackDamage(this);

	if ((!(this.getAttackTarget() instanceof EntityZertumEntity) && !(this.getAttackTarget() instanceof EntityPlayer))) {
		if (this.levels.getLevel() == Constants.maxLevel && this.hasEvolved()) {
			damage += 2.0D;
		}
		else if (this.hasEvolved() && this.levels.getLevel() != Constants.maxLevel) {
			damage += 2.0D;
		}
	}
	return (float) damage;
}

@Override
public void fall(float distance, float damageMultiplier) {
	if (distance > 1.0F) {
		this.playSound("game.neutral.hurt.fall.small", 0.4F, 1.0F);
	}

	int i = MathHelper.ceiling_float_int(((distance * 0.5F - 3.0F) - TalentHelper.fallProtection(this)) * damageMultiplier);

	if (i > 0 && !TalentHelper.isImmuneToFalls(this)) {
		this.attackEntityFrom(DamageSource.fall, i);

		if (this.riddenByEntity != null) {
			this.riddenByEntity.attackEntityFrom(DamageSource.fall, i);
		}

		Block block = this.worldObj.getBlockState(new BlockPos(this.posX, this.posY - 0.2D - this.prevRotationYaw, this.posZ)).getBlock();

		if (block.getMaterial() != Material.air && !this.isSilent()) {
			Block.SoundType soundtype = block.stepSound;
			this.worldObj.playSoundAtEntity(this, soundtype.getStepSound(), soundtype.getVolume() * 0.5F, soundtype.getFrequency() * 0.75F);
		}
	}
}

@SideOnly(Side.CLIENT)
public boolean isWolfWet() {
	return this.isWet;
}

@SideOnly(Side.CLIENT)
public float getShadingWhileWet(float p_70915_1_) {
	return 0.75F + (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70915_1_) / 2.0F * 0.25F;
}

@SideOnly(Side.CLIENT)
public float getShakeAngle(float p_70923_1_, float p_70923_2_) {
	float f2 = (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70923_1_ + p_70923_2_) / 1.8F;

	if (f2 < 0.0F) {
		f2 = 0.0F;
	}
	else if (f2 > 1.0F) {
		f2 = 1.0F;
	}

	return MathHelper.sin(f2 * (float) Math.PI) * MathHelper.sin(f2 * (float) Math.PI * 11.0F) * 0.15F * (float) Math.PI;
}

@SideOnly(Side.CLIENT)
public float getInterestedAngle(float partialTickTime) {
	return (this.prevTimeDogBegging + (this.timeDogBegging - this.prevTimeDogBegging) * partialTickTime) * 0.15F * (float) Math.PI;
}

@Override
public float getEyeHeight() {
	return this.height * 0.8F;
}

@Override
public int getVerticalFaceSpeed() {
	return this.isSitting() ? 20 : super.getVerticalFaceSpeed();
}

@Override
public boolean attackEntityFrom(DamageSource damageSource, float damage) {
	if (this.isEntityInvulnerable(damageSource)) {
		return false;
	}
	else {
		if (!TalentHelper.attackEntityFrom(this, damageSource, damage)) {
			return false;
		}

		Entity entity = damageSource.getEntity();
		this.aiSit.setSitting(false);

		if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow)) {
			damage = (damage + 1.0F) / 2.0F;
		}

		return super.attackEntityFrom(damageSource, damage);
	}
}

@Override
public boolean attackEntityAsMob(Entity entity) { // TODO
	if (!TalentHelper.shouldDamageMob(this, entity)) {
		return false;
	}

	int damage = (int) (4 + (this.getEntityAttribute(SharedMonsterAttributes.attackDamage).getBaseValue()) / 2);
	damage = TalentHelper.attackEntityAsMob(this, entity, damage);

	if (entity instanceof EntityZombie) {
		((EntityZombie) entity).setAttackTarget(this);
	}

	return entity.attackEntityFrom(DamageSource.causeMobDamage(this), damage);
}

/**
 * Called when the mob's health reaches 0.
 */
@Override
public void onDeath(DamageSource par1DamageSource) {
	super.onDeath(par1DamageSource);

	if (par1DamageSource.getEntity() instanceof EntityPlayer) {
		EntityPlayer entityplayer = (EntityPlayer) par1DamageSource.getEntity();
		{
			entityplayer.triggerAchievement(ModAchievements.ZertKill);
			this.dropChestItems();

		}
	}
}

@Override
protected boolean isMovementBlocked() {
	return this.isPlayerSleeping() || this.ridingEntity != null || this.riddenByEntity instanceof EntityPlayer || super.isMovementBlocked();
}

@Override
public double getYOffset() {
	return this.ridingEntity instanceof EntityPlayer ? 0.5D : 0.0D;
}

@Override
public boolean isPotionApplicable(PotionEffect potionEffect) {
	if (this.getHealth() <= 1) {
		return false;
	}

	if (!TalentHelper.isPostionApplicable(this, potionEffect)) {
		return false;
	}

	return true;
}

@Override
public void setFire(int amount) {
	if (TalentHelper.setFire(this, amount)) {
		super.setFire(amount);
	}
}

public int foodValue(ItemStack stack) {
	if (stack == null || stack.getItem() == null) {
		return 0;
	}

	int foodValue = 0;

	Item item = stack.getItem();

	if (stack.getItem() != Items.rotten_flesh && item instanceof ItemFood) {
		ItemFood itemfood = (ItemFood) item;

		if (itemfood.isWolfsFavoriteMeat()) {
			foodValue = 40;
		}
	}

	foodValue = TalentHelper.changeFoodValue(this, stack, foodValue);

	return foodValue;
}

public int masterOrder() { // TODO
	int order = 0;
	EntityPlayer player = (EntityPlayer) this.getOwner();

	if (player != null) {

		float distanceAway = player.getDistanceToEntity(this);
		ItemStack itemstack = player.inventory.getCurrentItem();

		if (itemstack != null && (itemstack.getItem() instanceof ItemTool) && distanceAway <= 20F) {
			order = 1;
		}

		if (itemstack != null && ((itemstack.getItem() instanceof ItemSword) || (itemstack.getItem() instanceof ItemBow))) {
			order = 2;
		}

		if (itemstack != null && itemstack.getItem() == Items.wheat) {
			order = 3;
		}

		if (itemstack != null && itemstack.getItem() == Items.bone) {
			order = 4;
		}
	}

	return order;
}

@Override
public boolean canBreatheUnderwater() {
	return TalentHelper.canBreatheUnderwater(this);
}

@Override
public boolean canInteract(EntityPlayer player) {
	return this.isOwner(player) || this.willObeyOthers();
}

public int nourishment() {
	int amount = 0;

	if (this.getDogHunger() > 0) {
		amount = 40 + 4 * (this.effectiveLevel() + 1);

		if (isSitting() && this.talents.getLevel("rapidregen") == 5) {
			amount += 20 + 2 * (this.effectiveLevel() + 1);
		}

		if (!this.isSitting()) {
			amount *= 5 + this.talents.getLevel("rapidregen");
			amount /= 10;
		}
	}

	return amount;
}

public int effectiveLevel() { // TODO
	return (this.levels.getLevel()) / 10;
}

public String getZertumName() {
	return this.dataWatcher.getWatchableObjectString(21);
}

public void setZertumName(String var1) {
	this.dataWatcher.updateObject(21, var1);
}

public void setWillObeyOthers(boolean flag) {
	this.dataWatcher.updateObject(26, flag ? 1 : 0);
}

public boolean willObeyOthers() {
	return this.dataWatcher.getWatchableObjectInt(26) != 0;
}

public int points() {
	return this.levels.getLevel() + (this.getGrowingAge() < 0 ? 0 : 20);
}

public int spendablePoints() {
	return this.points() - this.usedPoints();
}

public int usedPoints() {
	return TalentHelper.getUsedPoints(this);
}

public int deductive(int level) {
	byte byte0 = 0;
	switch (level) {
		case 1:
			return 1;
		case 2:
			return 3;
		case 3:
			return 5;
		case 4:
			return 7;
		case 5:
			return 9;
		default:
			return 0;
	}
}

public int getDogHunger() {
	return this.dataWatcher.getWatchableObjectInt(23);
}

public void setDogHunger(int par1) {
	this.dataWatcher.updateObject(23, MathHelper.clamp_int(par1, 0, Constants.hungerTicks));
}

@Override
public boolean func_142018_a(EntityLivingBase entityToAttack, EntityLivingBase owner) {
	if (TalentHelper.canAttackEntity(this, entityToAttack)) {
		return true;
	}

	if (!(entityToAttack instanceof EntityCreeper) && !(entityToAttack instanceof EntityGhast)) {
		if (entityToAttack instanceof EntityZertumEntity) {
			EntityZertumEntity entityZertum = (EntityZertumEntity) entityToAttack;

			if (entityZertum.isTamed() && entityZertum.getOwner() == owner) {
				return false;
			}
		}

		return entityToAttack instanceof EntityPlayer && owner instanceof EntityPlayer && !((EntityPlayer) owner).canAttackPlayer((EntityPlayer) entityToAttack)
				? false
				: !(entityToAttack instanceof EntityHorse) || !((EntityHorse) entityToAttack).isTame();
	}
	else {
		return false;
	}
}

@Override
public boolean canAttackClass(Class p_70686_1_) {
	if (TalentHelper.canAttackClass(this, p_70686_1_)) {
		return true;
	}

	return super.canAttackClass(p_70686_1_);
}

public void setHasToy(boolean hasBone) {
	this.hasToy = hasBone;
}

public boolean hasToy() {
	return this.hasToy;
}

/**
 * Gets the pitch of living sounds in living entities.
 */
@Override
public float getPitch() {
	if (!this.isChild()) {
		return super.getSoundPitch();
	}
	else {
		return super.getSoundPitch() * 1;
	}
}

@Override
@SideOnly(Side.CLIENT)
public void handleHealthUpdate(byte p_70103_1_) {
	if (p_70103_1_ ==  {
		this.isShaking = true;
		this.timeWolfIsShaking = 0.0F;
		this.prevTimeWolfIsShaking = 0.0F;
	}
	else {
		super.handleHealthUpdate(p_70103_1_);
	}
}

/**
 * Checks if the parameter is an item which this animal can be fed to breed
 * it (wheat, carrots or seeds depending on the animal type)
 */
@Override
public boolean isBreedingItem(ItemStack itemstack) {
	return itemstack == null ? false : itemstack.getItem() == ModItems.dogTreat;
}

@Override
public int getMaxSpawnedInChunk() {
	return 8;
}

public boolean isAngry() {
	return (this.dataWatcher.getWatchableObjectByte(INDEX_TAME) & 2) != 0;
}

public void setAngry(boolean p_70916_1_) {
	byte b0 = this.dataWatcher.getWatchableObjectByte(INDEX_TAME);

	if (p_70916_1_) {
		this.dataWatcher.updateObject(INDEX_TAME, Byte.valueOf((byte) (b0 | 2)));
	}
	else {
		this.dataWatcher.updateObject(INDEX_TAME, Byte.valueOf((byte) (b0 & -3)));
	}
}

public EnumDyeColor getCollarColor() {
	return EnumDyeColor.byDyeDamage(this.dataWatcher.getWatchableObjectByte(INDEX_COLLAR) & 15);
}

public void setCollarColor(EnumDyeColor collarcolor) {
	this.dataWatcher.updateObject(INDEX_COLLAR, Byte.valueOf((byte) (collarcolor.getDyeDamage() & 15)));
}

public boolean isSaddled() {
	return (this.dataWatcher.getWatchableObjectByte(INDEX_SADDLE) & 1) != 0;
}

public void setSaddled(boolean p_70900_1_) {
	if (p_70900_1_) {
		this.dataWatcher.updateObject(INDEX_SADDLE, Byte.valueOf((byte) 1));
	}
	else {
		this.dataWatcher.updateObject(INDEX_SADDLE, Byte.valueOf((byte) 0));
	}
}

private boolean getHorseWatchableBoolean(int p_110233_1_) {
	return (this.dataWatcher.getWatchableObjectInt(INDEX_MOUTH) & p_110233_1_) != 0;
}

private void setHorseWatchableBoolean(int p_110208_1_, boolean p_110208_2_) {
	int j = this.dataWatcher.getWatchableObjectInt(INDEX_MOUTH);

	if (p_110208_2_) {
		this.dataWatcher.updateObject(INDEX_MOUTH, Integer.valueOf(j | p_110208_1_));
	}
	else {
		this.dataWatcher.updateObject(INDEX_MOUTH, Integer.valueOf(j & ~p_110208_1_));
	}
}

@SideOnly(Side.CLIENT)
public float func_110201_q(float p_110201_1_) {
	return this.prevMouthOpenness + (this.mouthOpenness - this.prevMouthOpenness) * p_110201_1_;
}

public void openMouth() {
	if (isServer()) {
		this.openMouthCounter = 1;
		this.setHorseWatchableBoolean(128, true);
	}
}

/**
 * Determines if an entity can be despawned, used on idle far away entities
 */
@Override
protected boolean canDespawn() {
	return !this.isTamed() && this.ticksExisted > 2400;
}

@Override
public boolean allowLeashing() {
	return !this.isAngry() && super.allowLeashing();
}

public void setBegging(boolean flag) {
	this.dataWatcher.updateObject(INDEX_BEG, Byte.valueOf((byte) (flag ? 1 : 0)));
}

public boolean isBegging() {
	return this.dataWatcher.getWatchableObjectByte(INDEX_BEG) == 1;
}

public boolean hasEvolved() // TODO
{
	return (this.dataWatcher.getWatchableObjectByte(INDEX_EVOLVE) & 1) != 0;
}

public void evolveBoolean(boolean p_70900_1_) {
	if (p_70900_1_) {
		this.dataWatcher.updateObject(INDEX_EVOLVE, Byte.valueOf((byte) 1));
	}
	else {
		this.dataWatcher.updateObject(INDEX_EVOLVE, Byte.valueOf((byte) 0));
	}
}

public void setEvolved(boolean p_70900_1_) {
	this.evolveBoolean(p_70900_1_);
	if (p_70900_1_) {
		if (!this.isChild() && !this.hasEvolved()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.tamedHealth() + this.effectiveLevel());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.tamedDamage());
		}
		else if (!this.isChild() && this.hasEvolved()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.evoHealth());
		}
		else {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
		}
	}
	else {
		if (this.isChild()) {
			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
		}
	}
}

public void evolveOnClient(EntityPlayer player) {
	this.setEvolved(true);
	this.worldObj.playBroadcastSound(1013, new BlockPos(this), 0);
	player.addChatMessage(ChatHelper.getChatComponent(EnumChatFormatting.GREEN + this.getZertumName() + " has been evolved!"));
}

public void evolveOnServer(EntityZertumEntity entity, EntityPlayer player) {
	entity.setEvolved(true);
	entity.worldObj.playBroadcastSound(1013, new BlockPos(entity), 0);
	player.addChatMessage(ChatHelper.getChatComponent(EnumChatFormatting.GREEN + entity.getZertumName() + " has been evolved!"));
}
}

First, you should make the entity save and load the UUID of the owner.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Posted

How do I do so exactly? There's already something that Minecraft has that relates with the UUID

Main Developer and Owner of Zero Quest

Visit the Wiki for more information

If I helped anyone, please give me a applaud and a thank you!

Posted
  On 5/11/2015 at 11:34 PM, NovaViper said:

How do I do so exactly? There's already something that Minecraft has that relates with the UUID

Ernio already told you how to do that..

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Posted
  On 5/12/2015 at 1:12 AM, NovaViper said:

I'm talking about saving and loading the UUID

We've already explained that several times... please read every response again. Everything you need has been explained, both here and in the vanilla code.

 

And why are you still fixated on the UUID? That's taken care of by EntityTameable, aren't you trying to save / load a String for the nickname?

Posted

I DID read them all.. I'm still confused on how to actually do it without screwing with the vanilla coding

Main Developer and Owner of Zero Quest

Visit the Wiki for more information

If I helped anyone, please give me a applaud and a thank you!

Posted
  On 5/12/2015 at 1:27 AM, NovaViper said:

I DID read them all.. I'm still confused on how to actually do it without screwing with the vanilla coding

What? How could you possibly screw with the vanilla coding? It's super simple:

 

1. EntityTameable already handles the owner for you, so you don't need to do anything there.

2. Player's username is a STRING

3. NBT natively supports reading and writing Strings: nbt.writeString("nickname", player's username);

4. Want it on the client for rendering? DataWatcher ALSO supports String by default, just add it and be done.

 

Sorry, but this topic has gone on way too long for something so blatantly simple.

 

It looks like there is a lot of other stuff going on in your Entity, so perhaps you'd be better off by creating a SIMPLE entity that does nothing but handle the nickname stuff. Then you can get just that working without worrying about anything else, figure out exactly what you need, and go from there.

Posted

*Facepalm* I can't believe I didn't think it all the way through.. but I have actually gotten close to the solution, I did exactly what you guys said and got it save (I think) the id and name of the owner, then leave and come back as a new player, open the gui (with no crashes, yay) but now the gui says "()" instead of the previous owner name.

 

IDs

	public static final int ownerName = 13;
public static final int ownerID = 14;

 

EntityInt

		this.dataWatcher.addObject(DataValues.ownerName, new String("")); //Owner Name
	this.dataWatcher.addObject(DataValues.ownerID, new String("")); //Owner Id

 

writeEntityToNBT

		tagCompound.setString("ownerId", this.getOwnerID());
	tagCompound.setString("ownerName", this.getOwnerName());

 

readEntityFromNBT

		if (tagCompound.hasKey("ownerName", ) {
		this.saveOwnerName(tagCompound.getString("ownerName"));
	}

	if (tagCompound.hasKey("ownerId", ) {
		this.saveOwnerID(tagCompound.getString("ownerId"));
	}

 

Methods

	public String getOwnerName() {
	return this.dataWatcher.getWatchableObjectString(DataValues.ownerName);
}

public void saveOwnerName(String name) {
	this.dataWatcher.updateObject(DataValues.ownerName, name);
}

public String getOwnerID() {
	return this.dataWatcher.getWatchableObjectString(DataValues.ownerID);
}

public void saveOwnerID(String id) {
	this.dataWatcher.updateObject(DataValues.ownerID, id);
}

Main Developer and Owner of Zero Quest

Visit the Wiki for more information

If I helped anyone, please give me a applaud and a thank you!

Posted

Here ya go

 

package common.zeroquest.client.gui;

import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.StatCollector;

import org.apache.commons.lang3.StringUtils;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;

import common.zeroquest.api.interfaces.ITalent;
import common.zeroquest.api.registry.TalentRegistry;
import common.zeroquest.entity.util.ModeUtil.EnumMode;
import common.zeroquest.entity.zertum.EntityZertumEntity;
import common.zeroquest.lib.Constants;
import common.zeroquest.network.PacketHandler;
import common.zeroquest.network.imessage.ZertumMode;
import common.zeroquest.network.imessage.ZertumName;
import common.zeroquest.network.imessage.ZertumObey;
import common.zeroquest.network.imessage.ZertumTalents;

/**
* @author ProPercivalalb
*/
public class GuiDogInfo extends GuiScreen {

public EntityZertumEntity dog;
public EntityPlayer player;
private ScaledResolution resolution;
private final List<GuiTextField> textfieldList = new ArrayList<GuiTextField>();
private GuiTextField nameTextField;
private int currentPage = 0;
private int maxPages = 1;
public int btnPerPages = 0;
private final DecimalFormat dfShort = new DecimalFormat("0.00");

public GuiDogInfo(EntityZertumEntity dog, EntityPlayer player) {
	this.dog = dog;
	this.player = player;
}

@Override
public void initGui() {
	super.initGui();
	this.buttonList.clear();
	this.labelList.clear();
	this.textfieldList.clear();
	this.resolution = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight);
	Keyboard.enableRepeatEvents(true);
	int topX = this.width / 2;
	int topY = this.height / 2;
	GuiTextField nameTextField = new GuiTextField(0, this.fontRendererObj, topX - 100, topY + 50, 200, 20) {
		@Override
		public boolean textboxKeyTyped(char character, int keyId) {
			boolean typed = super.textboxKeyTyped(character, keyId);
			if (typed) {
				PacketHandler.sendToServer(new ZertumName(dog.getEntityId(), this.getText()));
			}
			return typed;
		}
	};
	nameTextField.setFocused(false);
	nameTextField.setMaxStringLength(32);
	nameTextField.setText(this.dog.getPetName());
	this.nameTextField = nameTextField;

	this.textfieldList.add(nameTextField);

	int size = TalentRegistry.getTalents().size();

	int temp = 0;
	while ((temp + 2) * 21 + 10 < this.resolution.getScaledHeight()) {
		temp += 1;
	}

	this.btnPerPages = temp;

	if (temp < size) {
		this.buttonList.add(new GuiButton(-1, 25, temp * 21 + 10, 20, 20, "<"));
		this.buttonList.add(new GuiButton(-2, 48, temp * 21 + 10, 20, 20, ">"));
	}

	if (this.btnPerPages < 1) {
		this.btnPerPages = 1;
	}

	this.maxPages = (int) Math.ceil((double) TalentRegistry.getTalents().size() / (double) this.btnPerPages);

	if (this.currentPage >= this.maxPages) {
		this.currentPage = 0;
	}

	for (int i = 0; i < this.btnPerPages; ++i) {
		if ((this.currentPage * this.btnPerPages + i) >= TalentRegistry.getTalents().size()) {
			continue;
		}
		this.buttonList.add(new GuiButton(1 + this.currentPage * this.btnPerPages + i, 25, 10 + i * 21, 20, 20, "+"));
	}
	if (this.dog.isOwner(this.player)) {
		this.buttonList.add(new GuiButton(-5, this.width - 64, topY + 65, 42, 20, String.valueOf(this.dog.willObeyOthers())));
	}

	this.buttonList.add(new GuiButton(-6, topX + 40, topY + 25, 60, 20, this.dog.mode.getMode().modeName()));
}

@Override
public void drawScreen(int xMouse, int yMouse, float partialTickTime) {
	this.drawDefaultBackground();
	// Background
	int topX = this.width / 2;
	int topY = this.height / 2;
	String health = dfShort.format(this.dog.getHealth());
	String healthMax = dfShort.format(this.dog.getMaxHealth());
	String healthRel = dfShort.format(this.dog.getHealthRelative() * 100);
	String healthState = health + "/" + healthMax + "(" + healthRel + "%)";
	String damageValue = dfShort.format(this.dog.getAIAttackDamage());
	String damageState = damageValue;
	String speedValue = dfShort.format(this.dog.getAIMoveSpeed());
	String speedState = speedValue;

	String tamedString = null;
	if (this.dog.isTamed()) {
		if (this.dog.getOwnerName() == this.player.getName()) {
			tamedString = "Yes (You)";
		}
		else {
			tamedString = "Yes (" + StringUtils.abbreviate(this.dog.getOwnerName(), 22) + ")";
		}
	}

	String evoString = null;
	if (!this.dog.hasEvolved() && !this.dog.isChild() && this.dog.levels.getLevel() < Constants.maxLevel) {
		evoString = "Not at Alpha Level!";
	}
	else if (!this.dog.hasEvolved() && this.dog.isChild() && this.dog.levels.getLevel() < Constants.maxLevel) {
		evoString = "Too Young!";
	}
	else if (!this.dog.hasEvolved() && !this.dog.isChild() && this.dog.levels.getLevel() >= Constants.maxLevel) {
		evoString = "Ready!";
	}
	else if (this.dog.hasEvolved() && !this.dog.isChild()) {
		evoString = "Already Evolved!";
	}

	this.fontRendererObj.drawString("New name:", topX - 100, topY + 38, 4210752);
	this.fontRendererObj.drawString("Level: " + this.dog.levels.getLevel(), topX - 75, topY + 75, 0xFF10F9);
	this.fontRendererObj.drawString("Points Left: " + this.dog.spendablePoints(), topX, topY + 75, 0xFFFFFF);
	this.fontRendererObj.drawString("Health: " + healthState, topX + 190, topY - 170, 0xFFFFFF);
	this.fontRendererObj.drawString("Damage: " + damageState, topX + 190, topY - 160, 0xFFFFFF);
	this.fontRendererObj.drawString("Speed: " + speedState, topX + 190, topY - 150, 0xFFFFFF);
	this.fontRendererObj.drawString("Tamed: " + tamedString, topX + 190, topY - 140, 0xFFFFFF);
	this.fontRendererObj.drawString("State: " + evoString, topX + 190, topY - 130, 0xFFFFFF);
	if (this.dog.isOwner(this.player)) {
		this.fontRendererObj.drawString("Obey Others?", this.width - 76, topY + 55, 0xFFFFFF);
	}

	for (int i = 0; i < this.btnPerPages; ++i) {
		if ((this.currentPage * this.btnPerPages + i) >= TalentRegistry.getTalents().size()) {
			continue;
		}
		this.fontRendererObj.drawString(TalentRegistry.getTalent(this.currentPage * this.btnPerPages + i).getLocalisedName(), 50, 17 + i * 21, 0xFFFFFF);
	}

	for (GuiTextField field : this.textfieldList) {
		field.drawTextBox();
	}
	GL11.glDisable(GL12.GL_RESCALE_NORMAL);
	RenderHelper.disableStandardItemLighting();
	GL11.glDisable(GL11.GL_LIGHTING);
	GL11.glDisable(GL11.GL_DEPTH_TEST);
	super.drawScreen(xMouse, yMouse, partialTickTime);
	RenderHelper.enableGUIStandardItemLighting();

	// Foreground

	GL11.glPushMatrix();
	GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
	for (int k = 0; k < this.buttonList.size(); ++k) {
		GuiButton button = (GuiButton) this.buttonList.get(k);
		if (button.mousePressed(this.mc, xMouse, yMouse)) {
			List list = new ArrayList();
			if (button.id >= 1 && button.id <= TalentRegistry.getTalents().size()) {
				ITalent talent = TalentRegistry.getTalent(button.id - 1);

				list.add(EnumChatFormatting.GREEN + talent.getLocalisedName());
				list.add("Level: " + this.dog.talents.getLevel(talent));
				list.add(EnumChatFormatting.GRAY + "--------------------------------");
				list.addAll(this.splitInto(talent.getLocalisedInfo(), 200, this.mc.fontRendererObj));
			}
			else if (button.id == -1) {
				list.add(EnumChatFormatting.ITALIC + "Previous Page");
			}
			else if (button.id == -2) {
				list.add(EnumChatFormatting.ITALIC + "Next Page");
			}
			else if (button.id == -6) {
				String str = StatCollector.translateToLocal("modeinfo." + button.displayString.toLowerCase());
				list.addAll(splitInto(str, 150, this.mc.fontRendererObj));
			}

			this.drawHoveringText(list, xMouse, yMouse, this.mc.fontRendererObj);
		}
	}
	GL11.glPopMatrix();
}

@Override
protected void actionPerformed(GuiButton button) {

	if (button.id >= 1 && button.id <= TalentRegistry.getTalents().size()) {
		ITalent talent = TalentRegistry.getTalent(button.id - 1);
		int level = this.dog.talents.getLevel(talent);

		if (level < talent.getHighestLevel(this.dog) && this.dog.spendablePoints() >= talent.getCost(this.dog, level + 1)) {
			PacketHandler.sendToServer(new ZertumTalents(this.dog.getEntityId(), TalentRegistry.getTalent(button.id - 1).getKey()));
		}

	}
	else if (button.id == -1) {
		if (this.currentPage > 0) {
			this.currentPage -= 1;
			this.initGui();
		}
	}
	else if (button.id == -2) {
		if (this.currentPage + 1 < this.maxPages) {
			this.currentPage += 1;
			this.initGui();
		}
	}
	if (button.id == -5) {
		if (!this.dog.willObeyOthers()) {
			button.displayString = "true";
			PacketHandler.sendToServer(new ZertumObey(this.dog.getEntityId(), true));

		}
		else {
			button.displayString = "false";
			PacketHandler.sendToServer(new ZertumObey(this.dog.getEntityId(), false));
		}
	}

	if (button.id == -6) {
		int newMode = (dog.mode.getMode().ordinal() + 1) % EnumMode.values().length;
		EnumMode mode = EnumMode.values()[newMode];
		button.displayString = mode.modeName();
		PacketHandler.sendToServer(new ZertumMode(this.dog.getEntityId(), newMode));
	}
}

@Override
public void updateScreen() {
	for (GuiTextField field : this.textfieldList) {
		field.updateCursorCounter();
	}
}

@Override
public void mouseClicked(int xMouse, int yMouse, int mouseButton) throws IOException {
	super.mouseClicked(xMouse, yMouse, mouseButton);
	for (GuiTextField field : this.textfieldList) {
		field.mouseClicked(xMouse, yMouse, mouseButton);
	}
}

@Override
public void keyTyped(char character, int keyId) {
	for (GuiTextField field : this.textfieldList) {
		field.textboxKeyTyped(character, keyId);
	}

	if (keyId == Keyboard.KEY_ESCAPE) {
		this.mc.thePlayer.closeScreen();
	}
}

@Override
public void onGuiClosed() {
	Keyboard.enableRepeatEvents(false);
}

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

public List splitInto(String text, int maxLength, FontRenderer font) {
	List list = new ArrayList();

	String temp = "";
	String[] split = text.split(" ");

	for (int i = 0; i < split.length; ++i) {
		String str = split[i];
		int length = font.getStringWidth(temp + str);

		if (length > maxLength) {
			list.add(temp);
			temp = "";
		}

		temp += str + " ";

		if (i == split.length - 1) {
			list.add(temp);
		}
	}

	return list;
}
}

Main Developer and Owner of Zero Quest

Visit the Wiki for more information

If I helped anyone, please give me a applaud and a thank you!

Posted

Hm. Well, first step is to debug by printing out the values of the owner name and ID when loaded from NBT.

 

Also, you should be aware that using '==' operator to compare Strings is not generally a good idea, as it compares identity, not content. You should use 'equals' method instead:

if (this.dog.getOwnerName().equals(this.player.getName())) {
// player viewing GUI has the same name as the owner of the dog
}

Furthermore, shouldn't you be using player.getDisplayNameString() instead of getName() ? That's the method that returns the nickname, if I'm not mistaken. Though it looks like getName() returns the GameProfile name... Dunno.

Posted

I fixed it, I was using a command I created and it didn't have the save methods for the Zertums. And it all works! Thanks for all of your help guys!

Main Developer and Owner of Zero Quest

Visit the Wiki for more information

If I helped anyone, please give me a applaud and a thank you!

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements




  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Please help, we are running a kinda big minecraft RP server with tons of mods and a mod we made ourselves, currently the server runs for 5 to 30min and then it crashes, I'm not a programer or anything I'm just trying to help the staff figure out what to do.   ---- Minecraft Crash Report ---- // But it works on my machine. Time: 2025-07-27 05:29:42 Description: Exception in server tick loop java.util.ConcurrentModificationException: null     at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013) ~[?:?] {}     at java.util.ArrayList$Itr.next(ArrayList.java:967) ~[?:?] {}     at com.google.common.collect.Iterators$1.next(Iterators.java:146) ~[guava-31.1-jre.jar%2374!/:?] {}     at java.util.Iterator.forEachRemaining(Iterator.java:133) ~[?:?] {re:mixin}     at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845) ~[?:?] {}     at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[?:?] {}     at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[?:?] {}     at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[?:?] {}     at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[?:?] {}     at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?] {}     at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[?:?] {}     at net.minecraft.world.level.entity.PersistentEntitySectionManager.m_157543_(PersistentEntitySectionManager.java:175) ~[server-1.20.1-20230612.114412-srg.jar%23607!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B}     at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[?:?] {}     at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) ~[?:?] {}     at java.util.stream.LongPipeline$1$1.accept(LongPipeline.java:177) ~[?:?] {}     at java.util.PrimitiveIterator$OfLong.forEachRemaining(PrimitiveIterator.java:183) ~[?:?] {}     at java.util.Spliterators$LongIteratorSpliterator.forEachRemaining(Spliterators.java:2046) ~[?:?] {}     at java.util.Spliterator$OfLong.forEachRemaining(Spliterator.java:775) ~[?:?] {}     at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[?:?] {}     at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[?:?] {}     at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[?:?] {}     at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[?:?] {}     at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?] {}     at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[?:?] {}     at net.minecraft.world.level.entity.PersistentEntitySectionManager.m_157527_(PersistentEntitySectionManager.java:160) ~[server-1.20.1-20230612.114412-srg.jar%23607!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B}     at net.minecraft.world.level.entity.PersistentEntitySectionManager.m_287207_(PersistentEntitySectionManager.java:146) ~[server-1.20.1-20230612.114412-srg.jar%23607!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B}     at net.minecraft.server.level.ChunkMap.m_287285_(ChunkMap.java:1307) ~[server-1.20.1-20230612.114412-srg.jar%23607!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:pehkui.mixins.json:compat1201minus.compat116plus.ThreadedAnvilChunkStorageMixin,pl:mixin:APP:emotecraft.mixins.json:ChunkMapAccessor,pl:mixin:APP:securitycraft.mixins.json:camera.ChunkMapMixin,pl:mixin:A}     at net.minecraft.server.level.ChunkHolder.m_287189_(ChunkHolder.java:346) ~[server-1.20.1-20230612.114412-srg.jar%23607!/:?] {re:mixin,re:classloading,pl:mixin:APP:pehkui.mixins.json:compat1201minus.compat116plus.ChunkHolderAccessor,pl:mixin:APP:chunksending.mixins.json:ChunkHolderMixin,pl:mixin:A}     at net.minecraft.server.level.ChunkHolder.m_143003_(ChunkHolder.java:416) ~[server-1.20.1-20230612.114412-srg.jar%23607!/:?] {re:mixin,re:classloading,pl:mixin:APP:pehkui.mixins.json:compat1201minus.compat116plus.ChunkHolderAccessor,pl:mixin:APP:chunksending.mixins.json:ChunkHolderMixin,pl:mixin:A}     at net.minecraft.server.level.DistanceManager.m_183906_(DistanceManager.java:120) ~[server-1.20.1-20230612.114412-srg.jar%23607!/:?] {re:classloading,pl:accesstransformer:B}     at java.lang.Iterable.forEach(Iterable.java:75) ~[?:?] {re:mixin}     at net.minecraft.server.level.DistanceManager.m_140805_(DistanceManager.java:119) ~[server-1.20.1-20230612.114412-srg.jar%23607!/:?] {re:classloading,pl:accesstransformer:B}     at net.minecraft.server.level.ServerChunkCache.m_8489_(ServerChunkCache.java:273) ~[server-1.20.1-20230612.114412-srg.jar%23607!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:cupboard.mixins.json:ChunkLoadDebug,pl:mixin:APP:immersive_melodies.mixin.json:ServerChunkManagerMixin,pl:mixin:APP:pehkui.mixins.json:compat1201minus.compat117plus.ServerChunkManagerMixin,pl:mixin:A}     at net.minecraft.server.level.ServerChunkCache$MainThreadExecutor.m_7245_(ServerChunkCache.java:545) ~[server-1.20.1-20230612.114412-srg.jar%23607!/:?] {re:classloading}     at net.minecraft.server.level.ServerChunkCache.m_8466_(ServerChunkCache.java:269) ~[server-1.20.1-20230612.114412-srg.jar%23607!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:cupboard.mixins.json:ChunkLoadDebug,pl:mixin:APP:immersive_melodies.mixin.json:ServerChunkManagerMixin,pl:mixin:APP:pehkui.mixins.json:compat1201minus.compat117plus.ServerChunkManagerMixin,pl:mixin:A}     at net.minecraft.server.MinecraftServer.m_129961_(MinecraftServer.java:758) ~[server-1.20.1-20230612.114412-srg.jar%23607!/:?] {re:mixin,pl:accesstransformer:B,re:computing_frames,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:saturn.mixins.json:allocations.server_directory.MinecraftServerMixin,pl:mixin:APP:balm.mixins.json:MinecraftServerMixin,pl:mixin:APP:deltaboxlib.mixins.json:event.MinecraftServerMixin,pl:mixin:APP:immersive_optimization.mixins.json:MinecraftServerMixin,pl:mixin:APP:crafttweaker.mixins.json:common.access.server.AccessMinecraftServer,pl:mixin:APP:vanishmod.mixins.json:gui.MinecraftServerMixin,pl:mixin:APP:citadel.mixins.json:MinecraftServerMixin,pl:mixin:APP:blueprint.mixins.json:MinecraftServerMixin,pl:mixin:APP:ru.mixin.json:MinecraftServerMixin,pl:mixin:APP:waterframes.mixin.json:MinecraftServerMixin,pl:mixin:A}     at net.minecraft.server.MinecraftServer.m_7245_(MinecraftServer.java:747) ~[server-1.20.1-20230612.114412-srg.jar%23607!/:?] {re:mixin,pl:accesstransformer:B,re:computing_frames,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:saturn.mixins.json:allocations.server_directory.MinecraftServerMixin,pl:mixin:APP:balm.mixins.json:MinecraftServerMixin,pl:mixin:APP:deltaboxlib.mixins.json:event.MinecraftServerMixin,pl:mixin:APP:immersive_optimization.mixins.json:MinecraftServerMixin,pl:mixin:APP:crafttweaker.mixins.json:common.access.server.AccessMinecraftServer,pl:mixin:APP:vanishmod.mixins.json:gui.MinecraftServerMixin,pl:mixin:APP:citadel.mixins.json:MinecraftServerMixin,pl:mixin:APP:blueprint.mixins.json:MinecraftServerMixin,pl:mixin:APP:ru.mixin.json:MinecraftServerMixin,pl:mixin:APP:waterframes.mixin.json:MinecraftServerMixin,pl:mixin:A}     at net.minecraft.util.thread.BlockableEventLoop.m_18699_(BlockableEventLoop.java:115) ~[server-1.20.1-20230612.114412-srg.jar%23607!/:?] {re:computing_frames,pl:accesstransformer:B,re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B}     at net.minecraft.server.MinecraftServer.m_130012_(MinecraftServer.java:732) ~[server-1.20.1-20230612.114412-srg.jar%23607!/:?] {re:mixin,pl:accesstransformer:B,re:computing_frames,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:saturn.mixins.json:allocations.server_directory.MinecraftServerMixin,pl:mixin:APP:balm.mixins.json:MinecraftServerMixin,pl:mixin:APP:deltaboxlib.mixins.json:event.MinecraftServerMixin,pl:mixin:APP:immersive_optimization.mixins.json:MinecraftServerMixin,pl:mixin:APP:crafttweaker.mixins.json:common.access.server.AccessMinecraftServer,pl:mixin:APP:vanishmod.mixins.json:gui.MinecraftServerMixin,pl:mixin:APP:citadel.mixins.json:MinecraftServerMixin,pl:mixin:APP:blueprint.mixins.json:MinecraftServerMixin,pl:mixin:APP:ru.mixin.json:MinecraftServerMixin,pl:mixin:APP:waterframes.mixin.json:MinecraftServerMixin,pl:mixin:A}     at net.minecraft.server.MinecraftServer.m_130011_(MinecraftServer.java:665) ~[server-1.20.1-20230612.114412-srg.jar%23607!/:?] {re:mixin,pl:accesstransformer:B,re:computing_frames,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:saturn.mixins.json:allocations.server_directory.MinecraftServerMixin,pl:mixin:APP:balm.mixins.json:MinecraftServerMixin,pl:mixin:APP:deltaboxlib.mixins.json:event.MinecraftServerMixin,pl:mixin:APP:immersive_optimization.mixins.json:MinecraftServerMixin,pl:mixin:APP:crafttweaker.mixins.json:common.access.server.AccessMinecraftServer,pl:mixin:APP:vanishmod.mixins.json:gui.MinecraftServerMixin,pl:mixin:APP:citadel.mixins.json:MinecraftServerMixin,pl:mixin:APP:blueprint.mixins.json:MinecraftServerMixin,pl:mixin:APP:ru.mixin.json:MinecraftServerMixin,pl:mixin:APP:waterframes.mixin.json:MinecraftServerMixin,pl:mixin:A}     at net.minecraft.server.MinecraftServer.m_206580_(MinecraftServer.java:251) ~[server-1.20.1-20230612.114412-srg.jar%23607!/:?] {re:mixin,pl:accesstransformer:B,re:computing_frames,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:saturn.mixins.json:allocations.server_directory.MinecraftServerMixin,pl:mixin:APP:balm.mixins.json:MinecraftServerMixin,pl:mixin:APP:deltaboxlib.mixins.json:event.MinecraftServerMixin,pl:mixin:APP:immersive_optimization.mixins.json:MinecraftServerMixin,pl:mixin:APP:crafttweaker.mixins.json:common.access.server.AccessMinecraftServer,pl:mixin:APP:vanishmod.mixins.json:gui.MinecraftServerMixin,pl:mixin:APP:citadel.mixins.json:MinecraftServerMixin,pl:mixin:APP:blueprint.mixins.json:MinecraftServerMixin,pl:mixin:APP:ru.mixin.json:MinecraftServerMixin,pl:mixin:APP:waterframes.mixin.json:MinecraftServerMixin,pl:mixin:A}     at java.lang.Thread.run(Thread.java:840) ~[?:?] {re:mixin} A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- System Details -- Details:     Minecraft Version: 1.20.1     Minecraft Version ID: 1.20.1     Operating System: Linux (amd64) version 6.8.0-60-generic     Java Version: 17.0.15, Eclipse Adoptium     Java VM Version: OpenJDK 64-Bit Server VM (mixed mode, sharing), Eclipse Adoptium     Memory: 4531786544 bytes (4321 MiB) / 15384707072 bytes (14672 MiB) up to 25769803776 bytes (24576 MiB)     CPUs: 14     Processor Vendor: AuthenticAMD     Processor Name: AMD Ryzen 9 9950X 16-Core Processor     Identifier: AuthenticAMD Family 26 Model 68 Stepping 0     Microarchitecture: unknown     Frequency (GHz): -0.00     Number of physical packages: 1     Number of physical CPUs: 16     Number of logical CPUs: 32     Graphics card #0 name: unknown     Graphics card #0 vendor: unknown     Graphics card #0 VRAM (MB): 0.00     Graphics card #0 deviceId: unknown     Graphics card #0 versionInfo: unknown     Virtual memory max (MB): 103598.98     Virtual memory used (MB): 136057.86     Swap memory total (MB): 8192.00     Swap memory used (MB): 3591.28     JVM Flags: 2 total; -Xms128M -Xmx24576M     Server Running: true     Player Count: 14 / 80; [ServerPlayer['NSQ20'/230, l='ServerLevel[Dark_Continent]', x=4679.43, y=93.00, z=-4052.56], ServerPlayer['almeidaab_'/232, l='ServerLevel[Dark_Continent]', x=-90.43, y=88.00, z=-362.28], ServerPlayer['TNPC5'/342, l='ServerLevel[Dark_Continent]', x=-88.41, y=88.00, z=-362.20], ServerPlayer['_Intro_'/382, l='ServerLevel[Dark_Continent]', x=-7054.50, y=103.00, z=-10902.22], ServerPlayer['OiVela'/390, l='ServerLevel[Dark_Continent]', x=-3211.94, y=73.00, z=-3916.08], ServerPlayer['Tiranosaurahjkkk'/885, l='ServerLevel[Dark_Continent]', x=4678.20, y=93.00, z=-4076.11], ServerPlayer['iFooqss'/926, l='ServerLevel[Dark_Continent]', x=-225.04, y=78.00, z=-224.44], ServerPlayer['charlieboob'/1099, l='ServerLevel[Dark_Continent]', x=9328.39, y=160.00, z=12133.77], ServerPlayer['GreeOnix'/1162, l='ServerLevel[Dark_Continent]', x=-2397.61, y=117.06, z=13448.06], ServerPlayer['niccnamee'/1198, l='ServerLevel[Dark_Continent]', x=3070.30, y=19.63, z=18540.64], ServerPlayer['Maxyaa'/1263, l='ServerLevel[Dark_Continent]', x=10219.50, y=-17.82, z=-1980.99], ServerPlayer['AzulTCyan'/1477, l='ServerLevel[Dark_Continent]', x=-222.53, y=82.00, z=-221.51], ServerPlayer['voidmaw'/1783, l='ServerLevel[Dark_Continent]', x=-4082.30, y=67.00, z=-7086.15], ServerPlayer['SmolLuh'/2971, l='ServerLevel[Dark_Continent]', x=10226.64, y=-19.00, z=-1980.58]]     Data Packs: vanilla, mod:betterdungeons, mod:almanac, mod:easyanvils, mod:playeranimator (incompatible), mod:braziliandelight (incompatible), mod:mcwwindows, mod:yungsapi, mod:fakename (incompatible), mod:balm, mod:dynview (incompatible), mod:videoplayer (incompatible), mod:spelunkery (incompatible), mod:paraglider (incompatible), mod:cloth_config (incompatible), mod:iter_rpg, mod:athena, mod:lmft (incompatible), mod:corpse, mod:torchmaster, mod:handcrafted (incompatible), mod:supermartijn642corelib, mod:resourcefulconfig (incompatible), mod:spark (incompatible), mod:curios (incompatible), mod:yungsextras, mod:framedblocks, mod:attributeslib (incompatible), mod:mushroomquest, mod:worldedit (incompatible), mod:constructionwand, mod:toms_storage (incompatible), mod:fastleafdecay, mod:bettermineshafts, mod:playerrevive, mod:sliceanddice (incompatible), mod:darkpaintings (incompatible), mod:betterjungletemples, mod:timecontrol, mod:mowziesmobs, mod:harvest_with_ease (incompatible), mod:deltaboxlib (incompatible), mod:pehkui (incompatible), mod:goblintraders (incompatible), mod:caelus (incompatible), mod:realmrpg_skeletons, mod:fastasyncworldsave (incompatible), mod:dungeonnowloading (incompatible), mod:integrated_api, mod:naturescompass, mod:create_wizardry, mod:additional_lights, mod:memoryleakfix (incompatible), mod:crafttweaker (incompatible), mod:luckperms (incompatible), mod:puzzlesaccessapi, mod:forge, mod:logbegone (incompatible), mod:mcwpaths, mod:idas, mod:dungeons_arise, mod:tectonic (incompatible), mod:voicechat (incompatible), mod:terrablender, mod:biomesoplenty (incompatible), mod:moresnifferflowers (incompatible), mod:knightquest, mod:createutilities (incompatible), mod:spectrelib (incompatible), mod:antiportals (incompatible), mod:garnished, mod:kotlinforforge (incompatible), mod:truly_custom_horse_tack, mod:traveloptics, mod:farmersrespite, mod:flywheel, mod:ecologics, mod:decoration_delight, mod:localizedchat, mod:polymorph (incompatible), mod:securitycraft, mod:zeta (incompatible), mod:cagedmobs, mod:lootr, mod:connectedglass, mod:puzzleslib, mod:immersive_melodies (incompatible), mod:cosmeticarmorreworked, mod:vmod (incompatible), mod:aquamirae (incompatible), mod:hexerei (incompatible), mod:easy_npc, mod:kuma_api (incompatible), mod:create_things_and_misc, mod:betterwitchhuts, mod:beautify (incompatible), mod:incontrol, mod:betteroceanmonuments, mod:sophisticatedcore (incompatible), mod:structureessentials (incompatible), mod:placebo (incompatible), mod:citadel (incompatible), mod:alexsmobs (incompatible), mod:mixinextras (incompatible), mod:cobweb (incompatible), mod:bookshelf, mod:sophisticatedbackpacks (incompatible), mod:konkrete (incompatible), mod:undergardendelight, mod:create_connected, mod:chipped (incompatible), mod:farmersdelight, mod:chefsdelight (incompatible), mod:culturaldelights, mod:garnishedstoneautomation, mod:getittogetherdrops, mod:chunky (incompatible), mod:born_in_chaos_v1, mod:samurai_dynasty (incompatible), mod:lionfishapi (incompatible), mod:leaky (incompatible), mod:cataclysm (incompatible), mod:collective, mod:cerbons_api, mod:horse_colors, mod:xercapaint, mod:elevatorid, mod:betterstrongholds, mod:resourcefullib (incompatible), mod:architectury (incompatible), mod:doapi (incompatible), mod:vinery (incompatible), mod:herbalbrews, mod:ftblibrary (incompatible), mod:furniture (incompatible), mod:farm_and_charm (incompatible), mod:bakery (incompatible), mod:ftbteams (incompatible), mod:ftbquests (incompatible), mod:brewery (incompatible), mod:meadow, mod:aiimprovements, mod:cupboard (incompatible), mod:refurbished_furniture, mod:undergarden, mod:monolib (incompatible), mod:more_bows_and_arrows (incompatible), mod:biomancy, mod:jei, mod:geckolib, mod:framework, mod:letmedespawn, mod:quarkdelight, mod:caupona, mod:amendments (incompatible), mod:sophisticatedstorage (incompatible), mod:limitedchunks (incompatible), mod:copycats (incompatible), mod:additionallanterns (incompatible), mod:realmrpg_demons, mod:obscure_api (incompatible), mod:create, mod:createcasing (incompatible), mod:create_central_kitchen (incompatible), mod:create_mechanical_extruder, mod:waystones, mod:fabledweaponry, mod:clumps (incompatible), mod:journeymap (incompatible), mod:comforts (incompatible), mod:artifacts, mod:cpm (incompatible), mod:mmode (incompatible), mod:moa_decor_science, mod:mr_lukis_grandcapitals, mod:create_confectionery, mod:betterdeserttemples, mod:explorerscompass, mod:bosses_of_mass_destruction, mod:terralith, mod:azurelib, mod:travelerstitles, mod:nyfsspiders (incompatible), mod:alexscaves, mod:moonlight (incompatible), mod:endermanoverhaul (incompatible), mod:regions_unexplored (incompatible), mod:dramaticdoors, mod:nightlights, mod:mixinsquared (incompatible), mod:obscure_tooltips (incompatible), mod:creativecore, mod:yawp, mod:quark (incompatible), mod:supplementaries, mod:create_sa, mod:malum (incompatible), mod:legendary_monsters, mod:irons_spellbooks, mod:creeperoverhaul, mod:alexsdelight, mod:ferritecore (incompatible), mod:kawaiidishes (incompatible), mod:justzoom (incompatible), mod:lodestone, mod:expandability (incompatible), mod:create_enchantment_industry (incompatible), Spelunkery Generated Pack, Supplementaries Generated Pack, create_central_kitchen:farmersdelight (incompatible), green_stove, optifine_support, tectonic/terratonic, mod:connectivity (incompatible), mod:logprot (incompatible), mod:trade_cycling, mod:redeco (incompatible), mod:relics, mod:tenebris, mod:crashutilities (incompatible), mod:dawnoftimebuilder (incompatible), mod:octolib, mod:abyssal_decor, mod:blueprint, mod:decorative_storage, mod:legendarycreatures, mod:questsadditions, mod:ftbqoptimizer (incompatible), mod:candlelight (incompatible), mod:displaydelight, mod:saturn (incompatible), mod:smoothboot, mod:supermartijn642configlib (incompatible), mod:grieflogger, file/supplementaries_blacklist, mod:ringsofascension (incompatible), mod:selfexpression_slim, mod:not_enough_gamerules (incompatible), mod:selfexpression, mod:necronomicon, mod:item_obliterator, mod:waterframes, mod:crittersandcompanions (incompatible), mod:ohthetreesyoullgrow, mod:corgilib, mod:camerapture (incompatible), mod:biomeswevegone, mod:alltheleaks, mod:bocchium (incompatible), mod:advancedbook, mod:attributefix (incompatible), mod:enlightened_end, mod:emojiful (incompatible), mod:craterlib (incompatible), mod:ftbessentials (incompatible), mod:ponder (incompatible), mod:dynamiclights (incompatible), mod:createdeco (incompatible), mod:create_henry, mod:yet_another_config_lib_v3 (incompatible), mod:rarcompat, create:dynamic_data, mod:create_aquatic_ambitions, mod:dummmmmmy (incompatible), mod:tempban (incompatible), mod:simplelogin (incompatible), mod:chunksending (incompatible), mod:immersive_optimization (incompatible), bushy_leaves, mod:emotecraft (incompatible), mod:badmobs (incompatible), mod:nanny (incompatible), better_leaves     Enabled Feature Flags: minecraft:vanilla     World Generation: Stable     Is Modded: Definitely; Server brand changed to 'forge'     Type: Dedicated Server (map_server.txt)     ModLauncher: 10.0.9+10.0.9+main.dcd20f30     ModLauncher launch target: forgeserver     ModLauncher naming: srg     ModLauncher services:          mixin-0.8.5.jar mixin PLUGINSERVICE          eventbus-6.0.5.jar eventbus PLUGINSERVICE          fmlloader-1.20.1-47.3.11.jar slf4jfixer PLUGINSERVICE          fmlloader-1.20.1-47.3.11.jar object_holder_definalize PLUGINSERVICE          fmlloader-1.20.1-47.3.11.jar runtime_enum_extender PLUGINSERVICE          fmlloader-1.20.1-47.3.11.jar capability_token_subclass PLUGINSERVICE          accesstransformers-8.0.4.jar accesstransformer PLUGINSERVICE          fmlloader-1.20.1-47.3.11.jar runtimedistcleaner PLUGINSERVICE          modlauncher-10.0.9.jar mixin TRANSFORMATIONSERVICE          modlauncher-10.0.9.jar fml TRANSFORMATIONSERVICE      FML Language Providers:          minecraft@1.0         kotlinforforge@4.11.0         javafml@null         lowcodefml@null     Mod List:          saturn-mc1.20.1-0.1.3.jar                         |Saturn                        |saturn                        |0.1.3               |DONE      |Manifest: NOSIGNATURE         YungsBetterDungeons-1.20-Forge-4.0.3.jar          |YUNG's Better Dungeons        |betterdungeons                |1.20-Forge-4.0.3    |DONE      |Manifest: NOSIGNATURE         almanac-1.20.x-forge-1.0.2.jar                    |Almanac                       |almanac                       |1.0.2               |DONE      |Manifest: NOSIGNATURE         EasyAnvils-v8.0.2-1.20.1-Forge.jar                |Easy Anvils                   |easyanvils                    |8.0.2               |DONE      |Manifest: 9a:09:85:98:65:c4:8c:11:c5:49:f6:d6:33:23:39:df:8d:b4:ff:92:84:b8:bd:a5:83:9f:ac:7f:2a:d1:4b:6a         supermartijn642configlib-1.1.8-forge-mc1.20.jar   |SuperMartijn642's Config Libra|supermartijn642configlib      |1.1.8               |DONE      |Manifest: NOSIGNATURE         player-animation-lib-forge-1.0.2-rc1+1.20.jar     |Player Animator               |playeranimator                |1.0.2-rc1+1.20      |DONE      |Manifest: NOSIGNATURE         braziliandelight-1.1.0-all.jar                    |Brazilian Delight             |braziliandelight              |1.1.0               |DONE      |Manifest: NOSIGNATURE         mcw-windows-2.3.0-mc1.20.1forge.jar               |Macaw's Windows               |mcwwindows                    |2.3.0               |DONE      |Manifest: NOSIGNATURE         NaNny-1.0.1 (1).jar                               |NaNny                         |nanny                         |1.0.1               |DONE      |Manifest: NOSIGNATURE         YungsApi-1.20-Forge-4.0.2.jar                     |YUNG's API                    |yungsapi                      |1.20-Forge-4.0.2    |DONE      |Manifest: NOSIGNATURE         fakename-1.20.1-1.3.1.jar                         |Fakename                      |fakename                      |1.3.1               |DONE      |Manifest: NOSIGNATURE         balm-forge-1.20.1-7.3.9-all.jar                   |Balm                          |balm                          |7.3.9               |DONE      |Manifest: NOSIGNATURE         dynview-1.20.1-4.0.jar                            |Dynamic view distance         |dynview                       |2.3                 |DONE      |Manifest: NOSIGNATURE         VideoPlayer-2.6.2-FORGE-1.20.X.jar                |VideoPlayer                   |videoplayer                   |2.6.2               |DONE      |Manifest: NOSIGNATURE         spelunkery-1.20.1-0.3.13-forge.jar                |Spelunkery                    |spelunkery                    |1.20.1-0.3.13       |DONE      |Manifest: NOSIGNATURE         Paraglider-forge-20.1.3.jar                       |Paraglider                    |paraglider                    |20.1.3              |DONE      |Manifest: NOSIGNATURE         cloth-config-11.1.118-forge.jar                   |Cloth Config v10 API          |cloth_config                  |11.1.118            |DONE      |Manifest: NOSIGNATURE         iter_rpg-0.7.2-forge-1.20.1.jar                   |Iter RPG                      |iter_rpg                      |0.7.1               |DONE      |Manifest: NOSIGNATURE         Emojiful-Forge-1.20.1-4.2.0.jar                   |Emojiful                      |emojiful                      |4.2.0               |DONE      |Manifest: NOSIGNATURE         athena-forge-1.20.1-3.1.2.jar                     |Athena                        |athena                        |3.1.2               |DONE      |Manifest: NOSIGNATURE         lmft-1.0.4+1.20.1-forge.jar                       |Load My F***ing Tags          |lmft                          |1.0.4+1.20.1        |DONE      |Manifest: NOSIGNATURE         corpse-forge-1.20.1-1.0.14.jar                    |Corpse                        |corpse                        |1.20.1-1.0.14       |DONE      |Manifest: NOSIGNATURE         torchmaster-20.1.6.jar                            |Torchmaster                   |torchmaster                   |20.1.6              |DONE      |Manifest: NOSIGNATURE         handcrafted-forge-1.20.1-3.0.6.jar                |Handcrafted                   |handcrafted                   |3.0.6               |DONE      |Manifest: NOSIGNATURE         supermartijn642corelib-1.1.17a-forge-mc1.20.1.jar |SuperMartijn642's Core Lib    |supermartijn642corelib        |1.1.17+a            |DONE      |Manifest: NOSIGNATURE         resourcefulconfig-forge-1.20.1-2.1.2.jar          |Resourcefulconfig             |resourcefulconfig             |2.1.2               |DONE      |Manifest: NOSIGNATURE         spark-1.10.53-forge.jar                           |spark                         |spark                         |1.10.53             |DONE      |Manifest: NOSIGNATURE         curios-forge-5.14.1+1.20.1.jar                    |Curios API                    |curios                        |5.14.1+1.20.1       |DONE      |Manifest: NOSIGNATURE         YungsExtras-1.20-Forge-4.0.3.jar                  |YUNG's Extras                 |yungsextras                   |1.20-Forge-4.0.3    |DONE      |Manifest: NOSIGNATURE         ApothicAttributes-1.20.1-1.3.7.jar                |Apothic Attributes            |attributeslib                 |1.3.7               |DONE      |Manifest: NOSIGNATURE         MushroomQuest-1.20.1-v4.1.2.jar                   |Mushroom Quest                |mushroomquest                 |4.0.0               |DONE      |Manifest: NOSIGNATURE         worldedit-mod-7.2.15.jar                          |WorldEdit                     |worldedit                     |7.2.15+6463-5ca4dff |DONE      |Manifest: NOSIGNATURE         constructionwand-1.20.1-2.11.jar                  |Construction Wand             |constructionwand              |1.20.1-2.11         |DONE      |Manifest: NOSIGNATURE         toms_storage-1.20-1.6.8.jar                       |Tom's Simple Storage Mod      |toms_storage                  |1.6.8               |DONE      |Manifest: NOSIGNATURE         FastLeafDecay-32.jar                              |Fast Leaf Decay               |fastleafdecay                 |32                  |DONE      |Manifest: NOSIGNATURE         YungsBetterMineshafts-1.20-Forge-4.0.4.jar        |YUNG's Better Mineshafts      |bettermineshafts              |1.20-Forge-4.0.4    |DONE      |Manifest: NOSIGNATURE         PlayerRevive_FORGE_v2.0.27_mc1.20.1.jar           |PlayerRevive                  |playerrevive                  |2.0.27              |DONE      |Manifest: NOSIGNATURE         sliceanddice-forge-3.4.0.jar                      |Create Slice & Dice           |sliceanddice                  |3.4.0               |DONE      |Manifest: NOSIGNATURE         DarkPaintings-Forge-1.20.1-17.0.4.jar             |DarkPaintings                 |darkpaintings                 |17.0.4              |DONE      |Manifest: eb:c4:b1:67:8b:f9:0c:db:dc:4f:01:b1:8e:61:64:39:4c:10:85:0b:a6:c4:c7:48:f0:fa:95:f2:cb:08:3a:e5         YungsBetterJungleTemples-1.20-Forge-2.0.5.jar     |YUNG's Better Jungle Temples  |betterjungletemples           |1.20-Forge-2.0.5    |DONE      |Manifest: NOSIGNATURE         timecontrol-1.20.1-1.6.0.jar                      |TimeControl                   |timecontrol                   |1.6.0               |DONE      |Manifest: NOSIGNATURE         mowziesmobs-1.6.5.jar                             |Mowzie's Mobs                 |mowziesmobs                   |1.6.4               |DONE      |Manifest: NOSIGNATURE         harvest-with-ease-forge-1.20.1-9.0.1.jar          |Harvest with ease             |harvest_with_ease             |9.0.1               |DONE      |Manifest: NOSIGNATURE         deltaboxlib-1.1.2.jar                             |Deltabox Lib                  |deltaboxlib                   |1.1.2               |DONE      |Manifest: NOSIGNATURE         AttributeFix-Forge-1.20.1-21.0.4.jar              |AttributeFix                  |attributefix                  |21.0.4              |DONE      |Manifest: eb:c4:b1:67:8b:f9:0c:db:dc:4f:01:b1:8e:61:64:39:4c:10:85:0b:a6:c4:c7:48:f0:fa:95:f2:cb:08:3a:e5         Pehkui-3.8.2+1.20.1-forge.jar                     |Pehkui                        |pehkui                        |3.8.2+1.20.1-forge  |DONE      |Manifest: NOSIGNATURE         goblintraders-forge-1.20.1-1.9.3.jar              |Goblin Traders                |goblintraders                 |1.9.3               |DONE      |Manifest: 0d:78:5f:44:c0:47:0c:8c:e2:63:a3:04:43:d4:12:7d:b0:7c:35:37:dc:40:b1:c1:98:ec:51:eb:3b:3c:45:99         caelus-forge-3.2.0+1.20.1.jar                     |Caelus API                    |caelus                        |3.2.0+1.20.1        |DONE      |Manifest: NOSIGNATURE         RingsOfAscension-1.20.1-2.0.2.jar                 |Rings of Ascension            |ringsofascension              |2.0.0               |DONE      |Manifest: NOSIGNATURE         selfexpression_slim-1.5-forge-1.20.1.jar          |Selfexpression: Slim          |selfexpression_slim           |1.5                 |DONE      |Manifest: NOSIGNATURE         realmrpg_fallen_adventurers_1.0.3_forge_1.20.1.jar|Realm RPG: Fallen Adventurers |realmrpg_skeletons            |1.0.3               |DONE      |Manifest: NOSIGNATURE         fastasyncworldsave-1.20.1-2.3.jar                 |fastasyncworldsave mod        |fastasyncworldsave            |1.20.1-2.3          |DONE      |Manifest: NOSIGNATURE         Dungeon Now Loading-forge-1.20.1-1.5.jar          |Dungeon Now Loading           |dungeonnowloading             |1.5                 |DONE      |Manifest: NOSIGNATURE         integrated_api-1.5.1+1.20.1-forge.jar             |Integrated API                |integrated_api                |1.5.1+1.20.1-forge  |DONE      |Manifest: NOSIGNATURE         immersive_optimization-forge-1.20.1-0.0.2.jar     |Immersive Optimization        |immersive_optimization        |0.0.2               |DONE      |Manifest: NOSIGNATURE         NaturesCompass-1.20.1-1.11.2-forge.jar            |Nature's Compass              |naturescompass                |1.20.1-1.11.2-forge |DONE      |Manifest: NOSIGNATURE         create_wizardry-0.2.3-forge-1.20.1.jar            |Create: Wizardry              |create_wizardry               |0.2.3               |DONE      |Manifest: NOSIGNATURE         CraterLib-Forge-1.20-2.1.5.jar                    |CraterLib                     |craterlib                     |2.1.5               |DONE      |Manifest: NOSIGNATURE         additional_lights-1.20.1-2.1.7.jar                |Additional Lights             |additional_lights             |2.1.7               |DONE      |Manifest: NOSIGNATURE         questsadditions-1.4.7.jar                         |Quests Additions              |questsadditions               |1.4.7               |DONE      |Manifest: NOSIGNATURE         memoryleakfix-forge-1.17+-1.1.5.jar               |Memory Leak Fix               |memoryleakfix                 |1.1.5               |DONE      |Manifest: NOSIGNATURE         CraftTweaker-forge-1.20.1-14.0.43.jar             |CraftTweaker                  |crafttweaker                  |14.0.43             |DONE      |Manifest: NOSIGNATURE         LuckPerms-Forge-5.4.102.jar                       |LuckPerms                     |luckperms                     |5.4.102             |DONE      |Manifest: NOSIGNATURE         ftb-essentials-forge-2001.2.2.jar                 |FTB Essentials                |ftbessentials                 |2001.2.2            |DONE      |Manifest: NOSIGNATURE         puzzlesaccessapi-forge-8.0.7.jar                  |Puzzles Access Api            |puzzlesaccessapi              |8.0.7               |DONE      |Manifest: 9a:09:85:98:65:c4:8c:11:c5:49:f6:d6:33:23:39:df:8d:b4:ff:92:84:b8:bd:a5:83:9f:ac:7f:2a:d1:4b:6a         forge-1.20.1-47.3.11-universal.jar                |Forge                         |forge                         |47.3.11             |DONE      |Manifest: 84:ce:76:e8:45:35:e4:0e:63:86:df:47:59:80:0f:67:6c:c1:5f:6e:5f:4d:b3:54:47:1a:9f:7f:ed:5e:f2:90         Log-Begone-Forge-1.20.1-1.0.8.jar                 |Log Begone                    |logbegone                     |1.0.8               |DONE      |Manifest: NOSIGNATURE         mcw-paths-1.0.5-1.20.1forge.jar                   |Macaw's Paths and Pavings     |mcwpaths                      |1.0.5               |DONE      |Manifest: NOSIGNATURE         idas_forge-1.11.1+1.20.1.jar                      |Integrated Dungeons and Struct|idas                          |1.11.1+1.20.1       |DONE      |Manifest: NOSIGNATURE         emotecraft-for-MC1.20.1-2.2.7-b.build.50-forge.jar|Emotecraft                    |emotecraft                    |2.2.7-b.build.50    |DONE      |Manifest: NOSIGNATURE         DungeonsArise-1.20.x-2.1.58-release.jar           |When Dungeons Arise           |dungeons_arise                |2.1.58-1.20.x       |DONE      |Manifest: NOSIGNATURE         tectonic-forge-1.20.1-2.4.1.jar                   |Tectonic                      |tectonic                      |2.4.1               |DONE      |Manifest: NOSIGNATURE         server-1.20.1-20230612.114412-srg.jar             |Minecraft                     |minecraft                     |1.20.1              |DONE      |Manifest: NOSIGNATURE         logprot-1.20.1-3.4.jar                            |Logprot                       |logprot                       |1.4                 |DONE      |Manifest: NOSIGNATURE         voicechat-forge-1.20.1-2.5.22.jar                 |Simple Voice Chat             |voicechat                     |1.20.1-2.5.22       |DONE      |Manifest: NOSIGNATURE         trade-cycling-forge-1.20.1-1.0.15.jar             |Trade Cycling                 |trade_cycling                 |1.20.1-1.0.15       |DONE      |Manifest: NOSIGNATURE         TerraBlender-forge-1.20.1-3.0.1.7.jar             |TerraBlender                  |terrablender                  |3.0.1.7             |DONE      |Manifest: NOSIGNATURE         BiomesOPlenty-1.20.1-18.0.0.598.jar               |Biomes O' Plenty              |biomesoplenty                 |18.0.0.598          |DONE      |Manifest: NOSIGNATURE         Necronomicon-Forge-1.6.0+1.20.1.jar               |Necronomicon                  |necronomicon                  |1.6.0               |DONE      |Manifest: NOSIGNATURE         MoreSnifferFlowers-1.20.1-forge-1.4.5.2.jar       |More Sniffer Flowers          |moresnifferflowers            |1.4.5.2             |DONE      |Manifest: NOSIGNATURE         knightquest-1.6.1-forge.jar                       |Knight Quest                  |knightquest                   |1.6.1-forge         |DONE      |Manifest: NOSIGNATURE         Oh-The-Trees-Youll-Grow-forge-1.20.1-1.3.4.jar    |Oh The Trees You'll Grow      |ohthetreesyoullgrow           |1.20.1-1.3.4        |DONE      |Manifest: NOSIGNATURE         alltheleaks-0.1.0-beta+1.20.1-forge.jar           |All The Leaks                 |alltheleaks                   |0.1.0-beta+1.20.1-fo|DONE      |Manifest: NOSIGNATURE         createutilities-0.3.1+1.20.1.jar                  |Create Utilities              |createutilities               |0.3.1+1.20.1        |DONE      |Manifest: NOSIGNATURE         spectrelib-forge-0.13.15+1.20.1.jar               |SpectreLib                    |spectrelib                    |0.13.15+1.20.1      |DONE      |Manifest: NOSIGNATURE         Corgilib-Forge-1.20.1-4.0.3.3.jar                 |CorgiLib                      |corgilib                      |4.0.3.3             |DONE      |Manifest: NOSIGNATURE         antiportals-mc1.20.1-1.3.jar                      |AntiPortals                   |antiportals                   |1.3                 |DONE      |Manifest: NOSIGNATURE         garnished-2.1.2+1.20.1-neoforged.jar              |Create: Garnished             |garnished                     |2.1.2               |DONE      |Manifest: NOSIGNATURE         SimpleLogin-1.20.1-1.0.2-all.jar                  |Simple Login                  |simplelogin                   |1.0.1               |DONE      |Manifest: NOSIGNATURE         create_aquatic_ambitions_forge-1.20.1-1.1.3.jar   |Create: Aquatic Ambitions     |create_aquatic_ambitions      |1.20.1-1.1.1        |DONE      |Manifest: NOSIGNATURE         kffmod-4.11.0.jar                                 |Kotlin For Forge              |kotlinforforge                |4.11.0              |DONE      |Manifest: NOSIGNATURE         truly_custom_horse_tack-1.20.1-1.6.0.jar          |Truly Custom Horse Tack       |truly_custom_horse_tack       |1.6.0               |DONE      |Manifest: NOSIGNATURE         traveloptics-4.4.0-1.20.1.jar                     |T.O Magic 'n Extras           |traveloptics                  |4.4.0-1.20.1        |DONE      |Manifest: NOSIGNATURE         farmersrespite-1.20.1-2.1.2.jar                   |Farmer's Respite              |farmersrespite                |1.20.1-2.1          |DONE      |Manifest: NOSIGNATURE         flywheel-forge-1.20.1-1.0.2.jar                   |Flywheel                      |flywheel                      |1.0.2               |DONE      |Manifest: NOSIGNATURE         Ponder-Forge-1.20.1-1.0.52.jar                    |Ponder                        |ponder                        |1.0.52              |DONE      |Manifest: NOSIGNATURE         ecologics-forge-1.20.1-2.2.0.jar                  |Ecologics                     |ecologics                     |2.2.0               |DONE      |Manifest: NOSIGNATURE         decoration-delight-1.20.1.jar                     |Decoration Delight            |decoration_delight            |1.0.0               |DONE      |Manifest: NOSIGNATURE         bocchium-1.20.1-0.0.3.jar                         |Bocchium                      |bocchium                      |1.20.1-0.0.3        |DONE      |Manifest: NOSIGNATURE         LocalizedChat-forge-1.20.1-5.1.2.jar              |Localized Chat                |localizedchat                 |5.1.2               |DONE      |Manifest: NOSIGNATURE         polymorph-forge-0.49.5+1.20.1.jar                 |Polymorph                     |polymorph                     |0.49.5+1.20.1       |DONE      |Manifest: NOSIGNATURE         [1.20.1] SecurityCraft v1.9.10.jar                |SecurityCraft                 |securitycraft                 |1.9.10              |DONE      |Manifest: NOSIGNATURE         Zeta-1.0-24.jar                                   |Zeta                          |zeta                          |1.0-24              |DONE      |Manifest: NOSIGNATURE         cagedmobs-1.20.1-forge-2.0.5.jar                  |Caged Mobs                    |cagedmobs                     |1.20.1-2.0.5        |DONE      |Manifest: NOSIGNATURE         NEG-FORGE-1.20.1-r1.5.3.jar                       |Not Enough Gamerules          |not_enough_gamerules          |1.20.1-r1.5.3       |DONE      |Manifest: NOSIGNATURE         lootr-forge-1.20-0.7.34.89.jar                    |Lootr                         |lootr                         |0.7.34.87           |DONE      |Manifest: NOSIGNATURE         connectedglass-1.1.12-forge-mc1.20.1.jar          |Connected Glass               |connectedglass                |1.1.12              |DONE      |Manifest: NOSIGNATURE         PuzzlesLib-v8.1.22-1.20.1-Forge.jar               |Puzzles Lib                   |puzzleslib                    |8.1.22              |DONE      |Manifest: 9a:09:85:98:65:c4:8c:11:c5:49:f6:d6:33:23:39:df:8d:b4:ff:92:84:b8:bd:a5:83:9f:ac:7f:2a:d1:4b:6a         immersive_melodies-0.3.0+1.20.1-forge.jar         |Immersive Melodies            |immersive_melodies            |0.3.0+1.20.1        |DONE      |Manifest: NOSIGNATURE         cosmeticarmorreworked-1.20.1-v1a.jar              |CosmeticArmorReworked         |cosmeticarmorreworked         |1.20.1-v1a          |DONE      |Manifest: 5e:ed:25:99:e4:44:14:c0:dd:89:c1:a9:4c:10:b5:0d:e4:b1:52:50:45:82:13:d8:d0:32:89:67:56:57:01:53         chunksending-1.20.1-2.8.jar                       |chunksending mod              |chunksending                  |1.20.1-2.8          |DONE      |Manifest: NOSIGNATURE         Vanishmod-1.20.1-1.1.17.1.jar                     |Vanishmod                     |vmod                          |1.1.17.1            |DONE      |Manifest: NOSIGNATURE         aquamirae-6.API15.jar                             |Aquamirae                     |aquamirae                     |6.API15             |DONE      |Manifest: NOSIGNATURE         hexerei-0.4.2.1.jar                               |Hexerei                       |hexerei                       |1.20.1-0.4.2        |DONE      |Manifest: NOSIGNATURE         easy_npc-forge-1.20.1-5.9.0.jar                   |Easy NPC                      |easy_npc                      |5.9.0               |DONE      |Manifest: NOSIGNATURE         kuma-api-forge-20.1.8+1.20.1.jar                  |KumaAPI                       |kuma_api                      |20.1.8              |DONE      |Manifest: NOSIGNATURE         create_misc_and_things_ 1.20.1_4.0A.jar           |create: things and misc       |create_things_and_misc        |1.0.0               |DONE      |Manifest: NOSIGNATURE         YungsBetterWitchHuts-1.20-Forge-3.0.3.jar         |YUNG's Better Witch Huts      |betterwitchhuts               |1.20-Forge-3.0.3    |DONE      |Manifest: NOSIGNATURE         beautify-2.0.2.jar                                |Beautify                      |beautify                      |2.0.2               |DONE      |Manifest: NOSIGNATURE         incontrol-1.20-9.2.8.jar                          |InControl                     |incontrol                     |1.20-9.2.8          |DONE      |Manifest: NOSIGNATURE         YungsBetterOceanMonuments-1.20-Forge-3.0.4.jar    |YUNG's Better Ocean Monuments |betteroceanmonuments          |1.20-Forge-3.0.4    |DONE      |Manifest: NOSIGNATURE         connectivity-1.20.1-7.1.jar                       |Connectivity Mod              |connectivity                  |1.20.1-7.1          |DONE      |Manifest: NOSIGNATURE         dynamiclights-1.20.1.2.jar                        |Dynamic Lights                |dynamiclights                 |1.20.1.2            |DONE      |Manifest: NOSIGNATURE         sophisticatedcore-1.20.1-1.2.9.867.jar            |Sophisticated Core            |sophisticatedcore             |1.2.9.867           |DONE      |Manifest: NOSIGNATURE         structureessentials-1.20.1-3.4.jar                |Structure Essentials mod      |structureessentials           |1.20.1-3.4          |DONE      |Manifest: NOSIGNATURE         Placebo-1.20.1-8.6.2.jar                          |Placebo                       |placebo                       |8.6.2               |DONE      |Manifest: NOSIGNATURE         citadel-2.6.0-1.20.1.jar                          |Citadel                       |citadel                       |2.6.0               |DONE      |Manifest: NOSIGNATURE         alexsmobs-1.22.9.jar                              |Alex's Mobs                   |alexsmobs                     |1.22.9              |DONE      |Manifest: NOSIGNATURE         mixinextras-forge-0.2.0.jar                       |MixinExtras                   |mixinextras                   |0.2.0               |DONE      |Manifest: NOSIGNATURE         Item-Obliterator-NeoForge-MC1.20.1-2.3.1.jar      |Item Obliterator              |item_obliterator              |2.3.0               |DONE      |Manifest: NOSIGNATURE         cobweb-forge-1.20.1-1.0.0.jar                     |Cobweb                        |cobweb                        |1.0.0               |DONE      |Manifest: NOSIGNATURE         Bookshelf-Forge-1.20.1-20.2.13.jar                |Bookshelf                     |bookshelf                     |20.2.13             |DONE      |Manifest: eb:c4:b1:67:8b:f9:0c:db:dc:4f:01:b1:8e:61:64:39:4c:10:85:0b:a6:c4:c7:48:f0:fa:95:f2:cb:08:3a:e5         redeco-1.13-1.20.jar                              |Re:Deco                       |redeco                        |1.13                |DONE      |Manifest: NOSIGNATURE         sophisticatedbackpacks-1.20.1-3.23.4.1196.jar     |Sophisticated Backpacks       |sophisticatedbackpacks        |3.23.4.1196         |DONE      |Manifest: NOSIGNATURE         relics-1.20.1-0.8.0.7.jar                         |Relics                        |relics                        |0.8.0.7             |DONE      |Manifest: NOSIGNATURE         tenebris-2.0.0.10-1.20.1.jar                      |Tenebris                      |tenebris                      |2.0.0.10-1.20.1     |DONE      |Manifest: NOSIGNATURE         dummmmmmy-1.20-2.0.7.jar                          |MmmMmmMmmmmm                  |dummmmmmy                     |1.20-2.0.7          |DONE      |Manifest: NOSIGNATURE         konkrete_forge_1.8.0_MC_1.20-1.20.1.jar           |Konkrete                      |konkrete                      |1.8.0               |DONE      |Manifest: NOSIGNATURE         undergarden_delight_1.0.0_forge_1.20.1.jar        |Undergarden Delight           |undergardendelight            |1.0.0               |DONE      |Manifest: NOSIGNATURE         create_connected-1.0.1-mc1.20.1-all.jar           |Create: Connected             |create_connected              |1.0.1-mc1.20.1      |DONE      |Manifest: NOSIGNATURE         chipped-forge-1.20.1-3.0.7.jar                    |Chipped                       |chipped                       |3.0.7               |DONE      |Manifest: NOSIGNATURE         FarmersDelight-1.20.1-1.2.4.jar                   |Farmer's Delight              |farmersdelight                |1.20.1-1.2.4        |DONE      |Manifest: NOSIGNATURE         chefs-delight-1.0.3-forge-1.20.1.jar              |Chefs Delight                 |chefsdelight                  |1.0.3-forge-1.20.1  |DONE      |Manifest: NOSIGNATURE         culturaldelights-0.16.1.jar                       |Cultural Delights             |culturaldelights              |0.16.1              |DONE      |Manifest: NOSIGNATURE         crashutilities-8.1.4.jar                          |Crash Utilities               |crashutilities                |8.1.4               |DONE      |Manifest: NOSIGNATURE         garnishedstoneautomation-0.1.2+1.20.1-neoforged.ja|Garnished Stone Automation    |garnishedstoneautomation      |0.1.2               |DONE      |Manifest: NOSIGNATURE         getittogetherdrops-forge-1.20-1.3.jar             |Get It Together, Drops!       |getittogetherdrops            |1.3                 |DONE      |Manifest: NOSIGNATURE         advancedbook-1.0.4.jar                            |Advanced Book                 |advancedbook                  |1.0.4               |DONE      |Manifest: NOSIGNATURE         Chunky-1.3.146.jar                                |Chunky                        |chunky                        |1.3.146             |DONE      |Manifest: NOSIGNATURE         born_in_chaos_[Forge]1.20.1_1.5.2.jar             |Born in Chaos                 |born_in_chaos_v1              |1.5.2               |DONE      |Manifest: NOSIGNATURE         samurai_dynasty-0.0.48-1.20.1-neo.jar             |Samurai Dynasty               |samurai_dynasty               |0.0.48-1.20.1-neo   |DONE      |Manifest: NOSIGNATURE         lionfishapi-2.4-Fix.jar                           |LionfishAPI                   |lionfishapi                   |2.4-Fix             |DONE      |Manifest: NOSIGNATURE         leaky-1.20.1-2.1.jar                              |leaky mod                     |leaky                         |1.20.1-2.1          |DONE      |Manifest: NOSIGNATURE         L_Enders_Cataclysm-2.64.jar                       |cataclysm                     |cataclysm                     |2.64                |DONE      |Manifest: NOSIGNATURE         Tempban-forge-1.20-1.0.3.jar                      |Tempban                       |tempban                       |1.0                 |DONE      |Manifest: NOSIGNATURE         collective-1.20.1-7.84.jar                        |Collective                    |collective                    |7.84                |DONE      |Manifest: NOSIGNATURE         CerbonsAPI-Forge-1.20.1-1.1.0.jar                 |Cerbons API                   |cerbons_api                   |1.1.0               |DONE      |Manifest: NOSIGNATURE         realistic_horse_genetics-1.20.1-13.5.jar          |Realistic Horse Genetics      |horse_colors                  |1.20.1-13.5         |DONE      |Manifest: NOSIGNATURE         xercapaint-1.20.1-1.0.1.jar                       |Joy of Painting               |xercapaint                    |1.20.1-1.0.1        |DONE      |Manifest: NOSIGNATURE         elevatorid-1.20.1-lex-1.9.jar                     |Elevator Mod                  |elevatorid                    |1.20.1-lex-1.9      |DONE      |Manifest: NOSIGNATURE         DawnOfTimeBuilder-forge-1.20.1-1.5.9.jar          |DawnOfTimeBuilder             |dawnoftimebuilder             |1.5.9               |DONE      |Manifest: NOSIGNATURE         YungsBetterStrongholds-1.20-Forge-4.0.3.jar       |YUNG's Better Strongholds     |betterstrongholds             |1.20-Forge-4.0.3    |DONE      |Manifest: NOSIGNATURE         resourcefullib-forge-1.20.1-2.1.29.jar            |Resourceful Lib               |resourcefullib                |2.1.29              |DONE      |Manifest: NOSIGNATURE         architectury-9.2.14-forge.jar                     |Architectury                  |architectury                  |9.2.14              |DONE      |Manifest: NOSIGNATURE         letsdo-API-forge-1.2.15-forge.jar                 |[Let's Do] API                |doapi                         |1.2.15              |DONE      |Manifest: NOSIGNATURE         letsdo-vinery-forge-1.4.28.jar                    |[Let's Do] Vinery             |vinery                        |1.4.28              |DONE      |Manifest: NOSIGNATURE         letsdo-herbalbrews-forge-1.0.8.jar                |[Let's Do] HerbalBrews        |herbalbrews                   |1.0.8               |DONE      |Manifest: NOSIGNATURE         ftb-library-forge-2001.2.4.jar                    |FTB Library                   |ftblibrary                    |2001.2.4            |DONE      |Manifest: NOSIGNATURE         letsdo-furniture-forge-1.0.2.jar                  |[Let's Do] Furniture          |furniture                     |1.0.2               |DONE      |Manifest: NOSIGNATURE         letsdo-farm_and_charm-forge-1.0.3.jar             |[Let's Do] Farm & Charm       |farm_and_charm                |1.0.3               |DONE      |Manifest: NOSIGNATURE         grieflogger-1.2.2-1.20.1-forge.jar                |GriefLogger                   |grieflogger                   |1.2.2-1.20.1        |DONE      |Manifest: NOSIGNATURE         letsdo-candlelight-forge-2.0.2.jar                |[Let's Do] Candlelight        |candlelight                   |2.0.2               |DONE      |Manifest: NOSIGNATURE         letsdo-bakery-forge-2.0.2.jar                     |[Let's Do] Bakery             |bakery                        |2.0.2               |DONE      |Manifest: NOSIGNATURE         ftb-teams-forge-2001.3.0.jar                      |FTB Teams                     |ftbteams                      |2001.3.0            |DONE      |Manifest: NOSIGNATURE         ftb-quests-forge-2001.4.8.jar                     |FTB Quests                    |ftbquests                     |2001.4.8            |DONE      |Manifest: NOSIGNATURE         FTBQuestsOptimizer-forge-2.0.4-1.20.1.jar         |FTBQuestsOptimizer            |ftbqoptimizer                 |2.0.4-1.20.1        |DONE      |Manifest: NOSIGNATURE         letsdo-brewery-forge-2.0.3.jar                    |[Let's Do] Brewery            |brewery                       |2.0.3               |DONE      |Manifest: NOSIGNATURE         letsdo-meadow-forge-1.3.19.jar                    |[Let's Do] Meadow             |meadow                        |1.3.19              |DONE      |Manifest: NOSIGNATURE         AI-Improvements-1.20-0.5.2.jar                    |AI-Improvements               |aiimprovements                |0.5.2               |DONE      |Manifest: NOSIGNATURE         cupboard-1.20.1-2.7.jar                           |Cupboard utilities            |cupboard                      |1.20.1-2.7          |DONE      |Manifest: NOSIGNATURE         refurbished_furniture-forge-1.20.1-1.0.6.jar      |MrCrayfish's Furniture Mod: Re|refurbished_furniture         |1.0.6               |DONE      |Manifest: 0d:78:5f:44:c0:47:0c:8c:e2:63:a3:04:43:d4:12:7d:b0:7c:35:37:dc:40:b1:c1:98:ec:51:eb:3b:3c:45:99         The_Undergarden-1.20.1-0.8.14.jar                 |The Undergarden               |undergarden                   |0.8.14              |DONE      |Manifest: NOSIGNATURE         monolib-forge-1.20.1-1.3.0.jar                    |MonoLib                       |monolib                       |1.3.0               |DONE      |Manifest: NOSIGNATURE         more_bows_and_arrows-merged-1.20.1-3.2.0.jar      |More Bows and Arrows          |more_bows_and_arrows          |3.2.0               |DONE      |Manifest: NOSIGNATURE         biomancy-forge-1.20.1-2.8.19.0.jar                |Biomancy 2                    |biomancy                      |2.8.19.0            |DONE      |Manifest: NOSIGNATURE         jei-1.20.1-forge-15.20.0.104.jar                  |Just Enough Items             |jei                           |15.20.0.104         |DONE      |Manifest: NOSIGNATURE         geckolib-forge-1.20.1-4.4.9.jar                   |GeckoLib 4                    |geckolib                      |4.4.9               |DONE      |Manifest: NOSIGNATURE         crittersandcompanions-forge-2.2.2.jar             |Critters and Companions       |crittersandcompanions         |2.2.2               |DONE      |Manifest: NOSIGNATURE         framework-forge-1.20.1-0.7.7.jar                  |Framework                     |framework                     |0.7.7               |DONE      |Manifest: 0d:78:5f:44:c0:47:0c:8c:e2:63:a3:04:43:d4:12:7d:b0:7c:35:37:dc:40:b1:c1:98:ec:51:eb:3b:3c:45:99         Camerapture-1.9.1+mc1.20.1-forge.jar              |Camerapture                   |camerapture                   |1.9.1               |DONE      |Manifest: NOSIGNATURE         letmedespawn-1.20.x-forge-1.4.4.jar               |Let Me Despawn                |letmedespawn                  |1.4.4               |DONE      |Manifest: NOSIGNATURE         quark_delight_1.0.0_forge_1.20.1.jar              |Quark Delight                 |quarkdelight                  |1.0.0               |DONE      |Manifest: NOSIGNATURE         caupona-1.20.1-0.4.9.jar                          |Caupona                       |caupona                       |1.20.1-0.4.9        |DONE      |Manifest: NOSIGNATURE         amendments-1.20-1.2.8.jar                         |Amendments                    |amendments                    |1.20-1.2.8          |DONE      |Manifest: NOSIGNATURE         sophisticatedstorage-1.20.1-1.3.5.1068.jar        |Sophisticated Storage         |sophisticatedstorage          |1.3.5.1068          |DONE      |Manifest: NOSIGNATURE         limitedchunks-1.20.1-4.1.jar                      |Limited Chunkloading          |limitedchunks                 |1.8                 |DONE      |Manifest: NOSIGNATURE         OctoLib-FORGE-0.4.2+1.20.1.jar                    |OctoLib                       |octolib                       |0.4.2               |DONE      |Manifest: NOSIGNATURE         copycats-3.0.0+mc.1.20.1-forge.jar                |Create: Copycats+             |copycats                      |3.0.0+mc.1.20.1-forg|DONE      |Manifest: NOSIGNATURE         additionallanterns-1.1.1a-forge-mc1.20.jar        |Additional Lanterns           |additionallanterns            |1.1.1a              |DONE      |Manifest: NOSIGNATURE         realmrpg_imps_and_demons_0.9.0_forge_1.20.1.jar   |Realm RPG: Imps & Demons      |realmrpg_demons               |0.9.0               |DONE      |Manifest: NOSIGNATURE         Oh-The-Biomes-Weve-Gone-Forge-1.5.7.jar           |Oh The Biomes We've Gone      |biomeswevegone                |1.5.7               |DONE      |Manifest: NOSIGNATURE         abyssal_decor_1.20.1_0.1.7.jar                    |Abyssal Decor                 |abyssal_decor                 |1.0.0               |DONE      |Manifest: NOSIGNATURE         obscure_api-15.jar                                |Obscure API                   |obscure_api                   |15                  |DONE      |Manifest: NOSIGNATURE         enlightend-5.0.14-1.20.1.jar                      |Enlightend                    |enlightened_end               |5.0.14              |DONE      |Manifest: NOSIGNATURE         create-1.20.1-6.0.4.jar                           |Create                        |create                        |6.0.4               |DONE      |Manifest: NOSIGNATURE         createdeco-2.0.3-1.20.1-forge.jar                 |Create Deco                   |createdeco                    |2.0.3-1.20.1-forge  |DONE      |Manifest: NOSIGNATURE         Create Encased-1.20.1-1.7.1-fix1.jar              |Create Encased                |createcasing                  |1.7.1-fix1          |DONE      |Manifest: NOSIGNATURE         FramedBlocks-9.4.2.jar                            |FramedBlocks                  |framedblocks                  |9.4.2               |DONE      |Manifest: NOSIGNATURE         create_central_kitchen-1.20.1-for-create-6.0.4-1.4|Create: Central Kitchen       |create_central_kitchen        |1.4.0.c             |DONE      |Manifest: NOSIGNATURE         create_mechanical_extruder-1.20.1-1.6.6-6.0.2.jar |Create Mechanical Extruder    |create_mechanical_extruder    |1.20.1-1.6.5-6.0.2  |DONE      |Manifest: NOSIGNATURE         Create-Henry-1.20.1-0.0.1-6.0.jar                 |Create: Henry                 |create_henry                  |0.0.1-6.0           |DONE      |Manifest: NOSIGNATURE         waystones-forge-1.20-14.1.5.jar                   |Waystones                     |waystones                     |14.1.5              |DONE      |Manifest: NOSIGNATURE         fabledweaponry-1.20.1-1.0.7.5.jar                 |Fabled Weaponry               |fabledweaponry                |1.20.1-1.0.7.5      |DONE      |Manifest: NOSIGNATURE         Clumps-forge-1.20.1-12.0.0.4.jar                  |Clumps                        |clumps                        |12.0.0.4            |DONE      |Manifest: NOSIGNATURE         journeymap-1.20.1-5.10.2-forge.jar                |Journeymap                    |journeymap                    |5.10.2              |DONE      |Manifest: NOSIGNATURE         comforts-forge-6.4.0+1.20.1.jar                   |Comforts                      |comforts                      |6.4.0+1.20.1        |DONE      |Manifest: NOSIGNATURE         artifacts-forge-9.5.13.jar                        |Artifacts                     |artifacts                     |9.5.13              |DONE      |Manifest: NOSIGNATURE         CustomPlayerModels-1.20-0.6.19a.jar               |Customizable Player Models    |cpm                           |0.6.19a             |DONE      |Manifest: NOSIGNATURE         MaintenanceMode-Universal-1.3.1.jar               |Maintenance Mode              |mmode                         |1.3.1               |DONE      |Manifest: NOSIGNATURE         MOAdecor SCIENCE 1.20.1.jar                       |MOA DECOR: SCIENCE            |moa_decor_science             |1.20.1              |DONE      |Manifest: NOSIGNATURE         lukis-grand-capitals-1.0.jar                      |Luki's Grand Capitals         |mr_lukis_grandcapitals        |1.0                 |DONE      |Manifest: NOSIGNATURE         BadMobs-1.20.1-19.0.4.jar                         |BadMobs                       |badmobs                       |19.0.4              |DONE      |Manifest: NOSIGNATURE         create-confectionery1.20.1_v1.1.0.jar             |Create Confectionery          |create_confectionery          |1.1.0               |DONE      |Manifest: NOSIGNATURE         YungsBetterDesertTemples-1.20-Forge-3.0.3.jar     |YUNG's Better Desert Temples  |betterdeserttemples           |1.20-Forge-3.0.3    |DONE      |Manifest: NOSIGNATURE         ExplorersCompass-1.20.1-1.3.3-forge.jar           |Explorer's Compass            |explorerscompass              |1.20.1-1.3.3-forge  |DONE      |Manifest: NOSIGNATURE         BOMD-Forge-1.20.1-1.1.2.jar                       |Bosses of Mass Destruction    |bosses_of_mass_destruction    |1.1.2               |DONE      |Manifest: NOSIGNATURE         Terralith_1.20.x_v2.5.4.jar                       |Terralith                     |terralith                     |2.5.4               |DONE      |Manifest: NOSIGNATURE         blueprint-1.20.1-7.1.0.jar                        |Blueprint                     |blueprint                     |7.1.0               |DONE      |Manifest: NOSIGNATURE         azurelib-neo-1.20.1-2.0.39.jar                    |AzureLib                      |azurelib                      |2.0.39              |DONE      |Manifest: NOSIGNATURE         TravelersTitles-1.20-Forge-4.0.2.jar              |Traveler's Titles             |travelerstitles               |1.20-Forge-4.0.2    |DONE      |Manifest: NOSIGNATURE         selfexpression-2.20.3-forge-1.20.1.jar            |Selfexpression                |selfexpression                |2.20.3              |DONE      |Manifest: NOSIGNATURE         nyfsspiders-forge-1.20.1-2.1.1.jar                |Nyf's Spiders                 |nyfsspiders                   |2.1.1               |DONE      |Manifest: NOSIGNATURE         alexscaves-2.0.2.jar                              |Alex's Caves                  |alexscaves                    |2.0.2               |DONE      |Manifest: NOSIGNATURE         moonlight-1.20-2.14.11-forge.jar                  |Moonlight Library             |moonlight                     |1.20-2.14.11        |DONE      |Manifest: NOSIGNATURE         endermanoverhaul-forge-1.20.1-1.0.4.jar           |Enderman Overhaul             |endermanoverhaul              |1.0.4               |DONE      |Manifest: NOSIGNATURE         RegionsUnexploredForge-0.5.6+1.20.1.jar           |Regions Unexplored            |regions_unexplored            |0.5.6               |DONE      |Manifest: NOSIGNATURE         DramaticDoors-QuiFabrge-1.20.1-3.3.0.jar          |Dramatic Doors                |dramaticdoors                 |1.20.1-3.3.0        |DONE      |Manifest: NOSIGNATURE         nightlights-1.20.1-1.1.jar                        |Night Lights                  |nightlights                   |1.1                 |DONE      |Manifest: NOSIGNATURE         mixinsquared-forge-0.2.0.jar                      |MixinSquared                  |mixinsquared                  |0.2.0               |DONE      |Manifest: NOSIGNATURE         Obscure-Tooltips-2.2.jar                          |Obscure Tooltips              |obscure_tooltips              |2.2                 |DONE      |Manifest: NOSIGNATURE         displaydelight-1.2.0.jar                          |Display Delight               |displaydelight                |1.2.0               |DONE      |Manifest: NOSIGNATURE         CreativeCore_FORGE_v2.11.30_mc1.20.1.jar          |CreativeCore                  |creativecore                  |2.11.30             |DONE      |Manifest: NOSIGNATURE         waterframes-FORGE-mc1.20.1-v2.0.14.jar            |WaterFrames                   |waterframes                   |2.0.14              |DONE      |Manifest: NOSIGNATURE         smoothboot(reloaded)-mc1.20.1-0.0.4.jar           |Smooth Boot (Reloaded)        |smoothboot                    |0.0.4               |DONE      |Manifest: NOSIGNATURE         yawp-1.20.1-0.0.4.1-beta5-forge.jar               |Yet Another World Protector   |yawp                          |0.0.4.1-beta5       |DONE      |Manifest: NOSIGNATURE         Quark-4.0-460.jar                                 |Quark                         |quark                         |4.0-460             |DONE      |Manifest: NOSIGNATURE         supplementaries-1.20-3.1.34.jar                   |Supplementaries               |supplementaries               |1.20-3.1.34         |DONE      |Manifest: NOSIGNATURE         create-stuff-additions1.20.1_v2.0.9.jar           |Create Stuff & Additions      |create_sa                     |2.0.9               |DONE      |Manifest: NOSIGNATURE         malum-1.20.1-1.6.5.1.jar                          |Malum                         |malum                         |1.20.1-1.6.5.1      |DONE      |Manifest: NOSIGNATURE         legendarymonsters-1.7.7 MC 1.20.1.jar             |LegendaryMonsters             |legendary_monsters            |1.20.1              |DONE      |Manifest: NOSIGNATURE         irons_spellbooks-1.20.1-3.4.0.9.jar               |Iron's Spells 'n Spellbooks   |irons_spellbooks              |1.20.1-3.4.0.9      |DONE      |Manifest: NOSIGNATURE         decorative_storage-2.1011-forge-1.20.1.jar        |Decorative Storage            |decorative_storage            |2.1011              |DONE      |Manifest: NOSIGNATURE         legendarycreatures-1.20.1-1.0.12.jar              |Legendary Creatures           |legendarycreatures            |1.20.1-1.0.12       |DONE      |Manifest: NOSIGNATURE         creeperoverhaul-3.0.2-forge.jar                   |Creeper Overhaul              |creeperoverhaul               |3.0.2               |DONE      |Manifest: NOSIGNATURE         alexsdelight-1.5.jar                              |Alex's Delight                |alexsdelight                  |1.5                 |DONE      |Manifest: NOSIGNATURE         ferritecore-6.0.1-forge.jar                       |Ferrite Core                  |ferritecore                   |6.0.1               |DONE      |Manifest: 41:ce:50:66:d1:a0:05:ce:a1:0e:02:85:9b:46:64:e0:bf:2e:cf:60:30:9a:fe:0c:27:e0:63:66:9a:84:ce:8a         yet_another_config_lib_v3-3.6.6+1.20.1-forge.jar  |YetAnotherConfigLib           |yet_another_config_lib_v3     |3.6.6+1.20.1-forge  |DONE      |Manifest: NOSIGNATURE         KawaiiDishes_1.10.2-1.20.1.jar                    |Kawaii Dishes                 |kawaiidishes                  |1.10.2              |DONE      |Manifest: NOSIGNATURE         justzoom_forge_1.0.2_MC_1.20.1.jar                |Just Zoom                     |justzoom                      |1.0.2               |DONE      |Manifest: NOSIGNATURE         rarcompat-1.20.1-0.1.7.jar                        |RAR-Compat                    |rarcompat                     |0.1.7               |DONE      |Manifest: NOSIGNATURE         lodestone-1.20.1-1.6.4.1.jar                      |Lodestone                     |lodestone                     |1.20.1-1.6.4.1      |DONE      |Manifest: NOSIGNATURE         expandability-forge-9.0.4.jar                     |ExpandAbility                 |expandability                 |9.0.4               |DONE      |Manifest: NOSIGNATURE         create_enchantment_industry-1.3.2-for-create-6.0.4|Create Enchantment Industry   |create_enchantment_industry   |1.3.2-for-create-6.0|DONE      |Manifest: NOSIGNATURE     Crash Report UUID: e66e9e00-1f50-474d-b47a-7fea2071fa06     FML: 47.3     Forge: net.minecraftforge:47.3.11
    • Trying to set up a server on apexhosting, and it keeps crashing, could someone help me with this? Information i feel is of note: 1: this was created with mrpack file converted into a zip file 2: It says i have fabric, but i believe this is the mod Forgified Fabric API, apologies if this makes it so you can't help me. Crash log: https://pastebin.com/YbhQY3We  
    • Typically—at least in my case—the broken datapack thing always turns out to be a broken mod. Someone else here might have a better answer for you than I do, but when that happens, I go through all my mods, disabling them one by one until I locate the culprit. It’s a headache, but it’s the only way I know how to do it.
    • Is there any mod for creating world templates for 1.20.1 forge, I found a fabric mod for such as purpose but can't seem to find one for forge. I know connector and forgeified fabric api exist but i'd prefer a forge mod to adding like 50 mods to my 200 mod modpack. Does anyone know of such a mod or is my only option using the fabric mod with connector?  
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.