Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

I'm one of the members of Soul Shards: The Old Ways dev team and I'm trying to work how to prevent mobs spawned via the soul cages dropping xp when killed, here is the current code in the cagetile class

 

 

package sstow.gameObjs.tile;

import java.util.List;

import sstow.gameObjs.ObjHandler;
import sstow.utils.EntityMapper;
import sstow.utils.Config;
import sstow.utils.TOWLogger;
import sstow.utils.TierHandler;
import sstow.utils.Utils;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.monster.EntityBlaze;
import net.minecraft.entity.monster.EntityEnderman;
import net.minecraft.entity.monster.EntityGhast;
import net.minecraft.entity.monster.EntityMagmaCube;
import net.minecraft.entity.monster.EntityMob;
import net.minecraft.entity.monster.EntityPigZombie;
import net.minecraft.entity.monster.EntitySkeleton;
import net.minecraft.entity.monster.EntitySlime;
import net.minecraft.entity.monster.IMob;
import net.minecraft.entity.passive.EntityAnimal;
import net.minecraft.entity.passive.IAnimals;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;

public class CageTile extends TileEntity implements ISidedInventory {
private ItemStack inventory;
private int counter;
private int updateCounter;
private int tier;
private static final int[] slot = new int[] { 0, 1, 2, 3, 4, 5 };
private String entName;
private boolean redstoneActive;
private boolean initChecks;
private boolean active;

public CageTile() {
	counter = 0;
	updateCounter = 0;
	redstoneActive = false;
	initChecks = false;
	active = false;
}

@Override
public void updateEntity() {
	if (worldObj.isRemote) {
		return;
	}
	this.worldObj.func_147453_f(this.xCoord, this.yCoord, this.zCoord,
			ObjHandler.SOUL_CAGE);
	if (!initChecks) {
		checkRedstone();
		initChecks = true;
	}

	if (this.worldObj.getBlockMetadata(xCoord, yCoord, zCoord) == 0
			|| tier <= 0) {
		updateCounter = 0;
		counter = 0;
		return;
	}

	if (updateCounter == 19) {
		EntityLiving ent = EntityMapper.getNewEntityInstance(this.worldObj,
				entName);

		if (canEntitySpawn(ent)) {
			setMetadata(2);
			active = true;
		} else {
			setMetadata(1);
			active = false;
		}
		updateCounter = 0;
	} else {
		updateCounter += 1;
	}

	if (this.worldObj.getBlockMetadata(xCoord, yCoord, zCoord) <= 1) {
		counter = 0;
		return;
	}

	if (counter >= TierHandler.getCooldown(tier - 1) * 20 - 1) {
		if (Config.ENABLE_DEBUG) {
			TOWLogger.logDebug("SPAWNING!");
		}
		EntityLiving[] toSpawn = new EntityLiving[TierHandler
				.getNumSpawns(tier - 1)];

		ItemStack heldItem = Utils.getEntityHeldItem(inventory);
		for (int i = 0; i < toSpawn.length; i++) {
			toSpawn[i] = EntityMapper.getNewEntityInstance(this.worldObj,
					entName);

			if ((toSpawn[i] instanceof EntitySlime)) {
				toSpawn[i].getDataWatcher().updateObject(16,
						Byte.valueOf((byte) 1));
			}

			if (heldItem != null) {
				toSpawn[i].setCurrentItemOrArmor(0, heldItem);
			}

			for(int j=1;j<=4;j++){
				toSpawn[i].setCurrentItemOrArmor(j, Utils.getEntityArmor(inventory, j));
			}

			toSpawn[i].getEntityData().setBoolean("SSTOW", true);

			toSpawn[i].forceSpawn = true;
			toSpawn[i].func_110163_bv();
		}
		spawnEntities(toSpawn);
		counter = 0;
	} else {
		counter += 1;
	}
}

public void checkRedstone() {
	if (worldObj.isBlockIndirectlyGettingPowered(this.xCoord, this.yCoord,
			this.zCoord)) {
		redstoneActive = true;
	} else {
		redstoneActive = false;
	}
}

private void setMetadata(int meta) {
	if (this.worldObj.getBlockMetadata(this.xCoord, this.yCoord,
			this.zCoord) != meta) {
		this.worldObj.setBlockMetadataWithNotify(this.xCoord, this.yCoord,
				this.zCoord, meta, 2);
	}
}

private boolean canEntitySpawn(EntityLiving ent) {
	if ((Config.ENABLE_FLOOD_PREVENTION) && (hasReachedSpawnLimit(ent))) {
		return false;
	}

	if ((TierHandler.getChecksRedstone(tier - 1))
			&& (redstoneActive == Config.INVERT_REDSTONE)) {
		return false;
	}

	if ((TierHandler.getChecksPlayer(tier - 1))
			&& (!isPlayerClose(this.xCoord, this.yCoord, this.zCoord))) {
		return false;
	}

	if ((TierHandler.getChecksLight(tier - 1)) && (!canSpawnInLight(ent))) {
		return false;
	}

	if ((TierHandler.getChecksWorld(tier - 1)) && (!canSpawnInWorld(ent))) {
		return false;
	}
	return true;
}

private boolean isPlayerClose(int x, int y, int z) {
	return worldObj.getClosestPlayer(x, y, z, 16.0D) != null;
}

private boolean canSpawnInWorld(EntityLiving ent) {
	int dimension = worldObj.provider.dimensionId;

	if ((ent instanceof EntitySkeleton)) {
		EntitySkeleton skele = (EntitySkeleton) ent;

		if ((skele.getSkeletonType() == 1) && (dimension == -1)) {
			return true;
		}
		if (dimension == 0) {
			return true;
		}
		return false;
	}

	if (((ent instanceof EntityBlaze))
			|| ((ent instanceof EntityPigZombie))
			|| ((ent instanceof EntityGhast))
			|| ((ent instanceof EntityMagmaCube))) {
		return dimension == -1;
	}
	if ((ent instanceof EntityEnderman)) {
		return dimension == 1;
	}
	return true;
}

private boolean canSpawnInLight(EntityLiving ent) {
	int light = worldObj.getBlockLightValue(xCoord, yCoord, zCoord);
	if (((ent instanceof EntityMob)) || ((ent instanceof IMob))) {
		return light <= 8;
	}
	if (((ent instanceof EntityAnimal)) || ((ent instanceof IAnimals))) {
		return light > 8;
	}
	return true;
}

private boolean canSpawnAtCoords(EntityLiving ent) {
	return worldObj.getCollidingBoundingBoxes(ent, ent.boundingBox)
			.isEmpty();
}

private boolean hasReachedSpawnLimit(EntityLiving ent) {
	AxisAlignedBB aabb = AxisAlignedBB
			.getBoundingBox(xCoord - 16, yCoord - 16, zCoord - 16,
					xCoord + 16, yCoord + 16, zCoord + 16);
	int mobCount = 0;

	for (EntityLiving entity : (List<EntityLiving>) worldObj
			.getEntitiesWithinAABB(ent.getClass(), aabb)) {
		if (entity.getEntityData().getBoolean("SSTOW")) {
			mobCount++;
		}
	}
	return mobCount >= Config.MAX_NUM_ENTITIES;
}

private void spawnEntities(EntityLiving[] ents) {
	for (EntityLiving ent : ents) {
		int counter = 0;
		do {
			counter++;
			if (counter >= 5) {
				ent.setDead();
				break;
			}
			double x = xCoord
					+ (worldObj.rand.nextDouble() - worldObj.rand
							.nextDouble()) * 4.0D;
			double y = yCoord + worldObj.rand.nextInt(3) - 1;
			double z = zCoord
					+ (worldObj.rand.nextDouble() - worldObj.rand
							.nextDouble()) * 4.0D;
			ent.setLocationAndAngles(x, y, z,
					worldObj.rand.nextFloat() * 360.0F, 0.0F);
		} while (!canSpawnAtCoords(ent) || counter >= 5);
		if (!ent.isDead) {
			worldObj.spawnEntityInWorld(ent);
		}
	}
}

public void invalidate() {
	super.invalidate();
	initChecks = false;
}

public void readFromNBT(NBTTagCompound nbt) {
	super.readFromNBT(nbt);

	inventory = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("Shard"));
	if (inventory != null) {
		tier = Utils.getShardTier(inventory);
		entName = Utils.getShardBoundEnt(inventory);
	}
	active = nbt.getBoolean("active");
}

public void writeToNBT(NBTTagCompound nbt) {
	super.writeToNBT(nbt);
	if (inventory != null) {
		NBTTagCompound tag = new NBTTagCompound();
		inventory.writeToNBT(tag);
		nbt.setTag("Shard", tag);
	}
	nbt.setBoolean("active", active);
}

public int getSizeInventory() {
	return 0;
}

public ItemStack getStackInSlot(int slot) {
	return inventory;
}

public ItemStack decrStackSize(int slot, int qty) {
	if (qty == 0) {
		return null;
	}
	ItemStack stack = inventory.copy();
	inventory = null;

	this.worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 2);
	this.tier = 0;
	this.entName = null;

	return stack;
}

public void setInventorySlotContents(int slot, ItemStack stack) {
	this.inventory = stack;

	this.worldObj.setBlockMetadataWithNotify(this.xCoord, this.yCoord,
			this.zCoord, 1, 2);
	this.tier = Utils.getShardTier(this.inventory);
	this.entName = Utils.getShardBoundEnt(this.inventory);
}

@Override
public ItemStack getStackInSlotOnClosing(int slot) {
	return null;
}

@Override
public String getInventoryName() {
	return null;
}

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

@Override
public int getInventoryStackLimit() {
	return 1;
}

@Override
public boolean isUseableByPlayer(EntityPlayer player) {
	return false;
}

@Override
public void openInventory() {
}

@Override
public void closeInventory() {
}

public int getTier() {
	return tier;
}

public String getEntityName() {
	return entName;
}

@Override
public boolean isItemValidForSlot(int slot, ItemStack stack) {
	return stack != null && stack.getItem() == ObjHandler.SOUL_SHARD
			&& Utils.isShardBound(stack) && Utils.getShardTier(stack) > 0;
}

@Override
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
	this.readFromNBT(pkt.func_148857_g());
	this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
}

@Override
public Packet getDescriptionPacket() {
	NBTTagCompound tag = new NBTTagCompound();
	this.writeToNBT(tag);
	return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord,
			this.zCoord, 0, tag);
}

@Override
public int[] getAccessibleSlotsFromSide(int var1) {

	return var1 == 0 ? slot : (var1 == 1 ? slot : slot);
}

@Override
public boolean canInsertItem(int var1, ItemStack stack, int p_102007_3_) {
	return this.isItemValidForSlot(var1, stack);
}

@Override
public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_,
		int p_102008_3_) {

	return true;
}
}

 

 

As you can see, there's two spots that we tag mobs spawned from the cages with "SSTOW" that is to let the soul stealer enchantment from this mod not to count those mob kills towards a shard total, but you still get xp from said mobs, how do I disable it? I found a protected int by the name "getExperiancePoints" but I can't access it (Or at least my knowledge of coding is very limited and I don't know of a method to access it), so any help would be greatly appreciated

 

tl;dr I want to stop mobs spawned with soul cages dropping xp on death

On a side note: I see no reason why the spawned mobs shouldn't be able to drop experience. This makes soul shards useless for experience spawners. If it's balancing that you're worried about, start by nerfing tier 5 spawners.

Don't make mods if you don't know Java.

Check out my website: http://shadowfacts.net

Developer of many mods

  • Author

On a side note: I see no reason why the spawned mobs shouldn't be able to drop experience. This makes soul shards useless for experience spawners. If it's balancing that you're worried about, start by nerfing tier 5 spawners.

 

People are using soul shards for inf mob essence with minefactory reloaded, and currently there's no api to tap into to prevent grinders producing mob essence

  • Author

If you can't stop MFR from creating mob essence, then it sounds like it's futile to try and prevent the mobs from dropping experience.

 

I have contacted skyboy in hopes he could add something to the api so we won't have to completely nerf the mobs dropping xp.

On a side note: I see no reason why the spawned mobs shouldn't be able to drop experience. This makes soul shards useless for experience spawners. If it's balancing that you're worried about, start by nerfing tier 5 spawners.

 

People are using soul shards for inf mob essence with minefactory reloaded, and currently there's no api to tap into to prevent grinders producing mob essence

 

I'm not seeing the problem. Let people play how they want. No need to police your playerbase.

  • Author

On a side note: I see no reason why the spawned mobs shouldn't be able to drop experience. This makes soul shards useless for experience spawners. If it's balancing that you're worried about, start by nerfing tier 5 spawners.

 

People are using soul shards for inf mob essence with minefactory reloaded, and currently there's no api to tap into to prevent grinders producing mob essence

 

I'm not seeing the problem. Let people play how they want. No need to police your playerbase.

 

You might not see a problem, but this is an exploit and needs to be fixed.

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.