Jump to content

[SOLVED][1.7.10]Cancelling Crafting?


deadrecon98

Recommended Posts

I am trying to make a mod(duh) and I am getting stuck on one bit where it checks whether the player has the requirements and if not I want it to cancel the crafting (or at least get rid of the product('s)) and give the player back their items. I am currently looking into the onCreated method but I don't think it is possible here. Any help would be greatly appreciated. Here is my code btw, just in case you are confused as to what I am trying to do.

 

	@Override
public void onCreated(ItemStack is, World world, EntityPlayer player){
	super.onCreated(is, world, player);

	if(!world.isRemote){
		if(Levels.getMagicLevel(player) >= levelNeeded){
			Levels.addMagicXP(player, this.xpGiven);
			player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.GREEN + "+" + this.xpGiven + EnumChatFormatting.GOLD + " to Magic! Only " + Levels.getRemainingXpToLevel(player) + " to go!"));
			player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Total XP: " + EnumChatFormatting.GOLD + Levels.getMagicXP(player)));
		}else{
			if(this.craftingReagentsI.size() > 0){
				for(int i=0;i<this.craftingReagentsI.size();i++){
					player.dropItem(this.craftingReagentsI.get(i), 1);
				}
			}
			if(this.craftingReagentsB.size() > 0){
				for(int i=0;i<this.craftingReagentsB.size();i++){
					player.dropItem(new ItemStack(this.craftingReagentsB.get(i)).getItem(), 1);
				}
			}
		}
	}
}

Link to comment
Share on other sites

Use an IRecipe. That way the result won't show unless are requirements are met.

Could you give me an example of how this could be achieved?

What you want to do is create a class implementing IRecipe. Fill in the methods appropriately. Check all conditions under the matches() method and return false if any of your conditions are false. Return the crafting result under getRecipeResult(). See net.minecraft.item.crafting for more details.

 

 

EDIT: Forgot the most important part: register your recipe using GameRegistry.addRecipe(new YourIRecipe());

Maker of the Craft++ mod.

Link to comment
Share on other sites

Use an IRecipe. That way the result won't show unless are requirements are met.

Could you give me an example of how this could be achieved?

What you want to do is create a class implementing IRecipe. Fill in the methods appropriately. Check all conditions under the matches() method and return false if any of your conditions are false. Return the crafting result under getRecipeResult(). See net.minecraft.item.crafting for more details.

 

 

EDIT: Forgot the most important part: register your recipe using GameRegistry.addRecipe(new YourIRecipe());

 

Thank you, I've never bothered with something like this before but turns out it's very simple!

Link to comment
Share on other sites

What kind of recipe do you want to check? The InventoryCrafting is just a normal IInventory. It has 9 slots, you check if they contain a specific pattern.

 

I just want to check a normal recipe like 111, 222, 323, but I am trying to figure out a way of doing this. The recipe(3 in specific) would be the block but I cannot get the block by itself so I tried using ItemStacks. With ItemStacks however, I need to check if they are null and then it just goes downhill from there.

Link to comment
Share on other sites

What kind of recipe do you want to check? The InventoryCrafting is just a normal IInventory. It has 9 slots, you check if they contain a specific pattern.

 

I just want to check a normal recipe like 111, 222, 323, but I am trying to figure out a way of doing this. The recipe(3 in specific) would be the block but I cannot get the block by itself so I tried using ItemStacks. With ItemStacks however, I need to check if they are null and then it just goes downhill from there.

There is no reason for you to check if its null.

And heres a tutorial which you could have found in five seconds.

 

http://www.minecraftforge.net/wiki/Crafting_and_Smelting

I'm back from being gone for... I think its been about a year. I'm pretty sure nobody remembers me, but hello anybody who does!

Link to comment
Share on other sites

What kind of recipe do you want to check? The InventoryCrafting is just a normal IInventory. It has 9 slots, you check if they contain a specific pattern.

 

I just want to check a normal recipe like 111, 222, 323, but I am trying to figure out a way of doing this. The recipe(3 in specific) would be the block but I cannot get the block by itself so I tried using ItemStacks. With ItemStacks however, I need to check if they are null and then it just goes downhill from there.

There is no reason for you to check if its null.

And heres a tutorial which you could have found in five seconds.

 

http://www.minecraftforge.net/wiki/Crafting_and_Smelting

 

...Ummm, it HAS to be checked otherwise the game WILL crash. Also that link is way off topic. Read the rest of the post, I am not trying to learn how to create a recipe, I am trying to learn how to define one in a specific bit of code.

Link to comment
Share on other sites

Ok... you can cheat here a bit.

Register your recipe like normal. Then get (and remove) the last element in CraftingManager().getInstance().getRecipeList. It will be an IRecipe representing the recipe you just registered (note you must do these steps immediately after each other).

 

Then in your IRecipe implementation you delegate all methods to that original IRecipe. Except that in matches() you also check the additional condition. Then register your IRecipe. Done.

 

Lol what? That was wordy.

So i've managed to get as far as

//cm is CraftingManager, I have a variable set up to call the class.
	cm.addRecipe(new ItemStack(blankRune, 4), "SS ", "S S", "S  ", Character.valueOf('S'), Blocks.stone);
	cm.getRecipeList().remove((cm.getRecipeList().size() - 1));

But as for delegating all methods, I have no idea what you mean.

Link to comment
Share on other sites

That remove() call gives you an IRecipe.

In your IRecipe class makes a field of type IRecipe. Put that IRecipe you get from remove in there.

 

Then in e.g. getCraftingResult you just call getCraftingResult on that IRecipe field.

 

So i've managed to get a big chunk of the code fixed now is all I need to know is how to set the output. Also, for some reason the getCraftingResult() method isn't being called, I have to manually call it.

	public static ArrayList<IRecipe> runeList = new ArrayList<IRecipe>();

@Override
public boolean matches(InventoryCrafting IC, World world) {
	EntityPlayer player = findPlayer(IC);
	if(!player.worldObj.isRemote){
		if(runeList.get(0).matches(IC, world)){
			System.out.println(getCraftingResult(IC));
		}
	}
	return false;
}

@Override
public ItemStack getCraftingResult(InventoryCrafting IC){
	EntityPlayer player = findPlayer(IC);
	World world = player.worldObj;
	if(!player.worldObj.isRemote){
		if(runeList.get(0).matches(IC, world)){
			return runeList.get(0).getRecipeOutput();
		}
	}
	return null;
}

Link to comment
Share on other sites

Uhm... what are you doing?!?

Your matches method always returns false.

Why do you have a List of IRecipe? You only want a single IRecipe...

 

Ok, so I changed the method to return true if the requirements are met(Completely forgot that the method wasn't void) but it still won't show up. If I click it, I still get the item but the slot doesn't actually display the item.

As for the list, I plan on adding more recipes and doing the same thing with them so by making a list I can make it more versatile. (And they are going to be processed one at a time)

Link to comment
Share on other sites

You cannot wrap multiple IRecipe's in one IRecipe. You need a "new" IRecipe for every IRecipe you replace.

 

ALL the methods except matches should be like this:

 

return theIRecipe.someMethod(args);

 

Nothing else!

 

Lol, the IRecipe's are completely seperate. I just took the object itself and stuck it into a list so that I may have multiple IRecipe's.

and as for the returning method, I have set that up the way you are showing. xD Here is my code again so that you may point some stupid mistake I made.

(It is only getting the first entry in the recipe list as well because I have only added one and don't want to implement the full thing yet)

	@Override
public boolean matches(InventoryCrafting IC, World world) {
	EntityPlayer player = findPlayer(IC);
	if(!player.worldObj.isRemote){
		if(runeList.get(0).matches(IC, world)){
			return true;
		}
	}
	return false;
}

@Override
public ItemStack getCraftingResult(InventoryCrafting IC){
	EntityPlayer player = findPlayer(IC);
	World world = player.worldObj;
	if(!player.worldObj.isRemote){
		if(runeList.get(0).matches(IC, world)){
			return runeList.get(0).getRecipeOutput();
		}
	}
	return null;
}

 

P.S. I should also mention that it will give me item(Even though it won't show up in the product cell) the first time but not any time after that. It will just give me a phantom item that isn't really there but is? Kind of like it is client only but a bit odder.

Link to comment
Share on other sites

I give up. Just use this code:

 

List<IRecipe> recipes = CraftingManager.getInstance().getRecipeList();
GameRegistry.addRecipe(new ItemStack(Blocks.dirt), "x", 'x', Items.diamond);
IRecipe recipe = recipes.remove(recipes.size() - 1);
GameRegistry.addRecipe(new MyRecipe(recipe));


class MyRecipe implements IRecipe {

    private final IRecipe wrapped;

    MyRecipe(IRecipe wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public boolean matches(InventoryCrafting grid, World world) {
        return additionalCondition(grid, world) && wrapped.matches(grid, world);
    }
    
    private boolean additionalCondition(InventoryCrafting grid, World world) {
        return true; // do some checks
    }

    @Override
    public ItemStack getCraftingResult(InventoryCrafting grid) {
        return wrapped.getCraftingResult(grid);
    }

    @Override
    public int getRecipeSize() {
        return wrapped.getRecipeSize();
    }

    @Override
    public ItemStack getRecipeOutput() {
        return wrapped.getRecipeOutput();
    }
}

Oh jesus, my stupidity hurts. I was treating the class like it wasn't an object. xD

Thanks a ton, I had no idea how off I was.

Link to comment
Share on other sites

It seems that I am getting another issue. The first Item I added (which needs to meet no requirements) works fine, but the second one put through it doesn't show up in the product grid. This one has the requirement of needing level one. Do you have any ideas as to what may be causing this?

P.S. I also changed it to only update when on the client side and that worked but you could no longer get the item because the server was told it was false.

 

EDIT: This seems to only be an issue when using two items of the same class.

package com.Cyphereion.RunesOfAltura.Manager;

import java.lang.reflect.Field;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ContainerPlayer;
import net.minecraft.inventory.ContainerWorkbench;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.inventory.SlotCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.world.World;

import com.Cyphereion.RunesOfAltura.Data.Levels;
import com.Cyphereion.RunesOfAltura.Object.ItemRune;
import com.google.common.base.Throwables;

import cpw.mods.fml.relauncher.ReflectionHelper;

public class CraftManager implements IRecipe {

    private final IRecipe wrapped;

    public CraftManager(IRecipe wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public boolean matches(InventoryCrafting grid, World world) {
    	return additionalCondition(grid, world) && wrapped.matches(grid, world);
    }
    
    private boolean additionalCondition(InventoryCrafting grid, World world) {
    	ItemStack output = this.wrapped.getRecipeOutput();
    	EntityPlayer player = findPlayer(grid);
        ItemRune rune = (ItemRune)output.getItem();
    	if(Levels.getMagicLevel(player) >= rune.levelNeeded){
    		return true;
    	}
        return false;
    }
    
    private static final Field eventHandlerField = ReflectionHelper.findField(InventoryCrafting.class, "eventHandler");
    private static final Field containerPlayerPlayerField = ReflectionHelper.findField(ContainerPlayer.class, "thePlayer");
    private static final Field slotCraftingPlayerField = ReflectionHelper.findField(SlotCrafting.class, "thePlayer");

    private static EntityPlayer findPlayer(InventoryCrafting inv) {
       try {
          Container container = (Container) eventHandlerField.get(inv);
          if (container instanceof ContainerPlayer) {
             return (EntityPlayer) containerPlayerPlayerField.get(container);
          } else if (container instanceof ContainerWorkbench) {
             return (EntityPlayer) slotCraftingPlayerField.get(container.getSlot(0));
          } else {
             // don't know the player
             return null;
          }
       } catch (Exception e) {
          throw Throwables.propagate(e);
       }
    }

    @Override
    public ItemStack getCraftingResult(InventoryCrafting grid) {
        return wrapped.getCraftingResult(grid);
    }

    @Override
    public int getRecipeSize() {
        return wrapped.getRecipeSize();
    }

    @Override
    public ItemStack getRecipeOutput() {
        return wrapped.getRecipeOutput();
    }
}

Link to comment
Share on other sites

Show it.

 

WorldData.java

package com.Cyphereion.RunesOfAltura.Data;

import java.util.Iterator;

import com.Cyphereion.RunesOfAltura.RunesOfAltura;

import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.village.Village;
import net.minecraft.world.World;
import net.minecraft.world.WorldSavedData;
import net.minecraft.world.storage.MapStorage;

public class WorldData extends WorldSavedData {

   final static String key = RunesOfAltura.MODID;
   
   public static WorldData forWorld(World world) {
      MapStorage storage = world.perWorldStorage;
      WorldData result = (WorldData)storage.loadData(WorldData.class, key);
      if (result == null) {
         result = new WorldData(key);
         storage.setData(key, result);
      }
      return result;
   }
   
   private NBTTagCompound data = new NBTTagCompound();

   public WorldData(String tagName) {
       super(tagName);
   }

   @Override
   public void readFromNBT(NBTTagCompound compound) {
  	 data = compound.getCompoundTag(key);
   }

   @Override
   public void writeToNBT(NBTTagCompound compound) {
       compound.setTag(key, data);
   }

   public NBTTagCompound getData() {
       return data;
   }
}

 

Levels.java

package com.Cyphereion.RunesOfAltura.Data;

import java.util.Random;

import com.Cyphereion.RunesOfAltura.RunesOfAltura;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;

public class Levels {

static LogManager log = RunesOfAltura.instance.log;

public static void addMagicXP(EntityPlayer player, int amount){
	if(!player.worldObj.isRemote){
		log.info("Adding " + amount + " xp to " + player.getDisplayName() + ".");
		WorldData data = WorldData.forWorld(player.worldObj);
		NBTTagCompound tag = data.getData();
		int xp = tag.getInteger(player.getDisplayName() + ".magicXP");
		tag.setInteger(player.getDisplayName() + ".magicXP", xp + amount);
		data.markDirty();
		xp = tag.getInteger(player.getDisplayName() + ".magicXP");
		if(xp >= (50 * tag.getInteger(player.getDisplayName() + ".magicLevel") + 12)){
			levelUpMagic(player);
		}
	}
}

public static void levelUpMagic(EntityPlayer player){
	if(!player.worldObj.isRemote){
		WorldData data = WorldData.forWorld(player.worldObj);
		NBTTagCompound tag = data.getData();
		int lvl = tag.getInteger(player.getDisplayName() + ".magicLevel");
		tag.setInteger(player.getDisplayName() + ".magicLevel", lvl + 1);
		tag.setInteger(player.getDisplayName() + ".magicXP", 0);
		log.info("Player " + player.getDisplayName() + " is now magic level " + tag.getInteger(player.getDisplayName() + ".magicLevel") + ".");
		player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.AQUA + "Level Up!" + EnumChatFormatting.GOLD + " You are now level " + EnumChatFormatting.RED + tag.getInteger(player.getDisplayName() + ".magicLevel") + EnumChatFormatting.GOLD + "!"));
	}
	double x = player.posX, y = player.posY, z = player.posZ;
	Random rand = new Random();
	for(int i=0;i<50;i++){
		Minecraft.getMinecraft().theWorld.spawnParticle("lava", x + 0.5D + rand.nextDouble(), y + 0.5D + rand.nextDouble(), z - 1 + 0.5D + rand.nextDouble(), 0, 0, 0);
	}
}

public static int getRemainingXpToLevel(EntityPlayer player){
	WorldData data = WorldData.forWorld(player.worldObj);
	NBTTagCompound tag = data.getData();
	int xp = tag.getInteger(player.getDisplayName() + ".magicXP");
	int xpToLevel = 50 * tag.getInteger(player.getDisplayName() + ".magicLevel") + 12;
	return xpToLevel - xp;
}

public static int getMagicLevel(EntityPlayer player){
	WorldData data = WorldData.forWorld(player.worldObj);
	NBTTagCompound tag = data.getData();
	return tag.getInteger(player.getDisplayName() + ".magicLevel");
}

public static int getMagicXP(EntityPlayer player){
	WorldData data = WorldData.forWorld(player.worldObj);
	NBTTagCompound tag = data.getData();
	return tag.getInteger(player.getDisplayName() + ".magicXP");
}
}

Link to comment
Share on other sites

 

CraftingManager

package com.Cyphereion.RunesOfAltura.Manager;

import java.lang.reflect.Field;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ContainerPlayer;
import net.minecraft.inventory.ContainerWorkbench;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.inventory.SlotCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.world.World;

import com.Cyphereion.RunesOfAltura.RunesOfAltura;
import com.Cyphereion.RunesOfAltura.Data.EntityPlayerExtended;
import com.Cyphereion.RunesOfAltura.Data.LogManager;
import com.Cyphereion.RunesOfAltura.Object.ItemRune;
import com.google.common.base.Throwables;

import cpw.mods.fml.relauncher.ReflectionHelper;

public class CraftManager implements IRecipe {

    private final IRecipe wrapped;
    static LogManager log = RunesOfAltura.instance.log;

    public CraftManager(IRecipe wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public boolean matches(InventoryCrafting grid, World world) {
    	return additionalCondition(grid, world) && wrapped.matches(grid, world);
    }
    
    private boolean additionalCondition(InventoryCrafting grid, World world) {
    	ItemStack output = this.wrapped.getRecipeOutput();
    	EntityPlayerExtended player = EntityPlayerExtended.get(findPlayer(grid));
    	
    	if(output.getItem() instanceof ItemRune){
		ItemRune rune = (ItemRune)output.getItem();
            return player.getMagicLevel() >= rune.levelNeeded ? true:false;
    	}
    	return false;
    }
    
    private static final Field eventHandlerField = ReflectionHelper.findField(InventoryCrafting.class, "eventHandler");
    private static final Field containerPlayerPlayerField = ReflectionHelper.findField(ContainerPlayer.class, "thePlayer");
    private static final Field slotCraftingPlayerField = ReflectionHelper.findField(SlotCrafting.class, "thePlayer");

    private static EntityPlayer findPlayer(InventoryCrafting inv) {
       try {
          Container container = (Container) eventHandlerField.get(inv);
          if (container instanceof ContainerPlayer) {
             return (EntityPlayer) containerPlayerPlayerField.get(container);
          } else if (container instanceof ContainerWorkbench) {
             return (EntityPlayer) slotCraftingPlayerField.get(container.getSlot(0));
          } else {
             log.error("Player not found!");
             return null;
          }
       } catch (Exception e) {
          throw Throwables.propagate(e);
       }
    }

    @Override
    public ItemStack getCraftingResult(InventoryCrafting grid) {
        return wrapped.getCraftingResult(grid);
    }

    @Override
    public int getRecipeSize() {
        return wrapped.getRecipeSize();
    }

    @Override
    public ItemStack getRecipeOutput() {
        return wrapped.getRecipeOutput();
    }
}

IExtendedEntityProperties.

 

Ok, to your request I have completely changed my player data system but the same thing is happening. Here is some more source code.

 

ItemRune.java

package com.Cyphereion.RunesOfAltura.Object;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;

import com.Cyphereion.RunesOfAltura.Data.EntityPlayerExtended;

public class ItemRune extends Item{

public int xpGiven, levelNeeded;
public ItemRune(int xpGiven, int levelNeeded){
	this.xpGiven = xpGiven;
	this.levelNeeded = levelNeeded;
}

@Override
public void onCreated(ItemStack is, World world, EntityPlayer player){
	super.onCreated(is, world, player);
	EntityPlayerExtended playerEXT = EntityPlayerExtended.get(player);
	if(!world.isRemote){
		playerEXT.addMagicXP(this.xpGiven);
		player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.GREEN + "+" + this.xpGiven + EnumChatFormatting.GOLD + " to Magic! Only " + playerEXT.getRemainingXpToLevel() + " to go!"));
		player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Total XP: " + EnumChatFormatting.GOLD + playerEXT.getMagicXP()));
	}
}

}

 

EventManager.java

package com.Cyphereion.RunesOfAltura.Manager;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.event.entity.EntityEvent.EntityConstructing;

import com.Cyphereion.RunesOfAltura.Data.EntityPlayerExtended;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;

public class EventManager
{
@SubscribeEvent
public void onEntityConstructing(EntityConstructing event)
{
	if (event.entity instanceof EntityPlayer && EntityPlayerExtended.get((EntityPlayer) event.entity) == null){
		EntityPlayerExtended.register((EntityPlayer) event.entity);
	}

	if (event.entity instanceof EntityPlayer && event.entity.getExtendedProperties(EntityPlayerExtended.EXT_PROP_NAME) == null){
		event.entity.registerExtendedProperties(EntityPlayerExtended.EXT_PROP_NAME, new EntityPlayerExtended((EntityPlayer) event.entity));
	}

}
}

 

EntityPlayerExtended.java

package com.Cyphereion.RunesOfAltura.Data;

import java.util.Random;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import net.minecraftforge.common.IExtendedEntityProperties;

import com.Cyphereion.RunesOfAltura.RunesOfAltura;

public class EntityPlayerExtended implements IExtendedEntityProperties
{
public final static String EXT_PROP_NAME = "RoA";

private final EntityPlayer player;

private int magicXP = 0, magicLevel = 0;
static LogManager log = RunesOfAltura.instance.log;

public EntityPlayerExtended(EntityPlayer player)
{
	this.player = player;
	this.magicLevel = 0;
	this.magicXP = 0;
}

/**
 * Used to register these extended properties for the player during EntityConstructing event
 * This method is for convenience only; it will make your code look nicer
 */
public static final void register(EntityPlayer player)
{
	player.registerExtendedProperties(EntityPlayerExtended.EXT_PROP_NAME, new EntityPlayerExtended(player));
}

/**
 * Returns ExtendedPlayer properties for player
 * This method is for convenience only; it will make your code look nicer
 */
public static final EntityPlayerExtended get(EntityPlayer player)
{
	return (EntityPlayerExtended) player.getExtendedProperties(EXT_PROP_NAME);
}

@Override
public void saveNBTData(NBTTagCompound compound)
{
	NBTTagCompound properties = new NBTTagCompound();

	properties.setInteger("magicXP", this.magicXP);
	properties.setInteger("magicLevel", this.magicLevel);

	compound.setTag(EXT_PROP_NAME, properties);

}

@Override
public void loadNBTData(NBTTagCompound compound)
{
	NBTTagCompound properties = (NBTTagCompound) compound.getTag(EXT_PROP_NAME);
	this.magicXP = properties.getInteger("magicXP");
	this.magicLevel = properties.getInteger("magicLevel");
	log.debug("Magic XP: " + this.magicXP + " : Magic Level: " + this.magicLevel);
}

@Override
public void init(Entity entity, World world)
{
}

public void addMagicXP(int amount){
	if(!player.worldObj.isRemote){
		log.info("Adding " + amount + " xp to " + "");
		this.magicXP += amount;
		if(this.magicXP >= (50 * this.magicLevel + 12)){
			levelUpMagic();
		}
	}
}

public void levelUpMagic(){
	if(!player.worldObj.isRemote){
		this.magicLevel ++;
		this.magicXP = 0;
		log.info("Player " + player.getDisplayName() + " is now magic level " + this.magicLevel + ".");
		player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.AQUA + "Level Up!" + EnumChatFormatting.GOLD + " You are now level " + EnumChatFormatting.RED + this.magicLevel + EnumChatFormatting.GOLD + "!"));
	}
	double x = player.posX, y = player.posY, z = player.posZ;
	Random rand = new Random();
	for(int i=0;i<50;i++){
		Minecraft.getMinecraft().theWorld.spawnParticle("lava", x + 0.5D + rand.nextDouble(), y + 0.5D + rand.nextDouble(), z - 1 + 0.5D + rand.nextDouble(), 0, 0, 0);
	}
}

public int getRemainingXpToLevel(){
	int xpToLevel = 50 * this.magicLevel + 12;
	return xpToLevel - this.magicXP;
}

public int getMagicLevel(){
	return this.magicLevel;
}

public int getMagicXP(){
	return this.magicXP;
}
}

Link to comment
Share on other sites

You'll also need to show your updated IRecipe code.

 

Btw, you registered your properties twice in onEntityConstructing - you only need the first one, because it does exactly what the second one does:

if (event.entity instanceof EntityPlayer && EntityPlayerExtended.get((EntityPlayer) event.entity) == null){
EntityPlayerExtended.register((EntityPlayer) event.entity);
}

// the following is totally unnecessary, as it does exactly what was just done above
/*
if (event.entity instanceof EntityPlayer && event.entity.getExtendedProperties(EntityPlayerExtended.EXT_PROP_NAME) == null){
event.entity.registerExtendedProperties(EntityPlayerExtended.EXT_PROP_NAME, new EntityPlayerExtended((EntityPlayer) event.entity));
}
*/

 

That's the second time today I've seen that exact same code - any particular reason people are duplicating it?

Link to comment
Share on other sites

You'll also need to show your updated IRecipe code.

 

Btw, you registered your properties twice in onEntityConstructing - you only need the first one, because it does exactly what the second one does:

if (event.entity instanceof EntityPlayer && EntityPlayerExtended.get((EntityPlayer) event.entity) == null){
		EntityPlayerExtended.register((EntityPlayer) event.entity);
	}

 

That's the second time today I've seen that exact same code - any particular reason people are duplicating it?

 

Umm I copied the code from somewhere else. that's why the second one was there.

 

Here are my whatchamacallits:

	List<IRecipe> recipes = CraftingManager.getInstance().getRecipeList();

	GameRegistry.addRecipe(new ItemStack(blankRune), "x", 'x', Items.diamond);
	IRecipe recipe = recipes.remove(recipes.size() - 1);
	GameRegistry.addRecipe(new CraftManager(recipe));

	GameRegistry.addRecipe(new ItemStack(newRune), "xx", 'x', Items.diamond);
	IRecipe recipe1 = recipes.remove(recipes.size() - 1);
	GameRegistry.addRecipe(new CraftManager(recipe1));

Link to comment
Share on other sites

You'll also need to show your updated IRecipe code.

 

Btw, you registered your properties twice in onEntityConstructing - you only need the first one, because it does exactly what the second one does:

if (event.entity instanceof EntityPlayer && EntityPlayerExtended.get((EntityPlayer) event.entity) == null){
EntityPlayerExtended.register((EntityPlayer) event.entity);
}

// the following is totally unnecessary, as it does exactly what was just done above
/*
if (event.entity instanceof EntityPlayer && event.entity.getExtendedProperties(EntityPlayerExtended.EXT_PROP_NAME) == null){
event.entity.registerExtendedProperties(EntityPlayerExtended.EXT_PROP_NAME, new EntityPlayerExtended((EntityPlayer) event.entity));
}
*/

 

That's the second time today I've seen that exact same code - any particular reason people are duplicating it?

Its because they copied it from your tutorial. cheesy.gif

I'm back from being gone for... I think its been about a year. I'm pretty sure nobody remembers me, but hello anybody who does!

Link to comment
Share on other sites

I give up. Just use this code:

 

Ok, that was impressive.  Someone managed to out-stupid diesieben07's patience.

  • Haha 1

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • They were already updated, and just to double check I even did a cleanup and fresh update from that same page. I'm quite sure drivers are not the problem here. 
    • i tried downloading the drivers but it says no AMD graphics hardware has been detected    
    • Update your AMD/ATI drivers - get the drivers from their website - do not update via system  
    • As the title says i keep on crashing on forge 1.20.1 even without any mods downloaded, i have the latest drivers (nvidia) and vanilla minecraft works perfectly fine for me logs: https://pastebin.com/5UR01yG9
    • Hello everyone, I'm making this post to seek help for my modded block, It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :  The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :  The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :   Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6} Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} here is the code inside my custom "freeze" item :    @Override     public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {         if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {             BlockPos blockPos = pContext.getClickedPos();             BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));             if (secondBlockPos != null) {                 createFrozenBlock(pContext, secondBlockPos);             }             createFrozenBlock(pContext, blockPos);             return InteractionResult.SUCCESS;         }         return super.useOn(pContext);     }     public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {         BlockState oldState = pContext.getLevel().getBlockState(blockPos);         BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;         CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;         if (oldBlockEntity != null) {             pContext.getLevel().removeBlockEntity(blockPos);         }         BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);         pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);     }     public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {         BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();         ((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);         return FrozenBlock;     }  
  • Topics

×
×
  • Create New...

Important Information

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