Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

adding health with attributes, and other stuff[Solved.. Finally]


Recommended Posts

so im making an item that does all the stuff below, problem is, adding health isn't working how should I fix this?

 

	@SubscribeEvent
public void playerTick(PlayerTickEvent event) {
	boolean hasItem = event.player.inventory.hasItem(ModItems.DnaPosideonInfused);

	if (event.player.capabilities.isCreativeMode) {
	} else {
		if (hasItem == true) {

			if (event.player.isWet()) {
				event.player.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(40.0D);
				event.player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 1, 1));
				event.player.addPotionEffect(new PotionEffect(Potion.waterBreathing.id, 1, 1));
				event.player.addPotionEffect(new PotionEffect(Potion.damageBoost.id, 3, 3));
				event.player.addPotionEffect(new PotionEffect(Potion.resistance.id, 1, 1));

			} else {

				if (hasItem == true) {
					event.player.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(30.0D);
					event.player.addPotionEffect(new PotionEffect(Potion.damageBoost.id, 1, 1));
					event.player.addPotionEffect(new PotionEffect(Potion.resistance.id, 0, 0));

				}
			}
		}
	}
	if (event.player.capabilities.isCreativeMode) {
	} else {
		if (hasItem == false) {
			event.player.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D);
		}

		if (event.player.isInWater() && hasItem == true) {
			event.player.addPotionEffect(new PotionEffect(
					Potion.regeneration.id, 1, 1));
		}
	}
}

Im serious don't look at it!!

Link to comment
Share on other sites

here is the new code:

	@SubscribeEvent
public void playerTick(PlayerTickEvent event) {
	boolean hasItem = event.player.inventory.hasItem(ModItems.DnaPosideonInfused);

	if (event.player.capabilities.isCreativeMode) {
	} else {
		if (hasItem == true) {
			if (event.player.isWet()) {
	            if(!event.player.worldObj.isRemote){
				event.player.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(40.0D);
				event.player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 1, 1));
				event.player.addPotionEffect(new PotionEffect(Potion.waterBreathing.id, 1, 1));
				event.player.addPotionEffect(new PotionEffect(Potion.damageBoost.id, 3, 3));
				event.player.addPotionEffect(new PotionEffect(Potion.resistance.id, 1, 1));
			}
			} else {

				if (hasItem == true) {
		            if(!event.player.worldObj.isRemote){
					event.player.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(30.0D);
					event.player.addPotionEffect(new PotionEffect(Potion.damageBoost.id, 1, 1));
					event.player.addPotionEffect(new PotionEffect(Potion.resistance.id, 0, 0));
		            }
				}
			}
		}
	}
	if (event.player.capabilities.isCreativeMode) {
	} else {
		if (hasItem == false) {
			event.player.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D);
		}

		if (event.player.isInWater() && hasItem == true) {
            if(!event.player.worldObj.isRemote){
			event.player.addPotionEffect(new PotionEffect(
					Potion.regeneration.id, 1, 1));
			}
		}
	}
}

Im serious don't look at it!!

Link to comment
Share on other sites

I found a different problem, I think Im registrying my event busses wrong, what do you think, also registering one before another makes an  effect, heres thee code:

package com.OlympiansMod.Main;

import net.minecraft.client.renderer.entity.RenderSnowball;
import net.minecraftforge.event.entity.living.LivingDeathEvent;

import com.OlympiansMod.Block.ModBlocks;
import com.OlympiansMod.Item.DnaPosideonInfused;
import com.OlympiansMod.Item.DnaZeusInfused;
import com.OlympiansMod.Item.ModItems;
import com.OlympiansMod.creativetabs.MCreativeTabs;
import com.OlympiansMod.entity.EntityCell;
import com.OlympiansMod.entity.EntityGreekFire;
import com.OlympiansMod.entity.MEntity;
import com.OlympiansMod.lib.Refstrings;
import com.OlympiansMod.world.MWorld;

import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.registry.GameRegistry;

@Mod(modid = Refstrings.MODID , name = Refstrings.NAME , version = Refstrings.VERSION)
public class MainRegistry {
private static int modGuiIndex = 0;

public static final int GUI_CUSTOM_INV = modGuiIndex++;

@SidedProxy(clientSide = Refstrings.CLIENTSIDE , serverSide = Refstrings.SERVERSIDE)
public static ServerProxy proxy;

@Instance
public static MainRegistry modInstance;


@EventHandler
public static void PreLoad(FMLPreInitializationEvent PreEvent) {
	MCreativeTabs.initialiseTabs();
	ModBlocks.MainRegistry();
	MEntity.MainRegistry();
	ModItems.MainRegistry();
	FMLCommonHandler.instance().bus().register(new DnaPosideonInfused());
	FMLCommonHandler.instance().bus().register(new DnaZeusInfused());
	MWorld.MainRegistry();
        CraftingManager.mainRegistry(); 
              

}
@EventHandler
public static void Load(FMLInitializationEvent event) {
	 proxy.registerRenderInfo(); 
}
@EventHandler
public static void PostLoad(FMLPostInitializationEvent PostEvent) {
}

}

Im serious don't look at it!!

Link to comment
Share on other sites

Everything you do, regarding data, should happen on server and be eventually sent to clients.

 

Yes - potion effects HAVE to be added on server side only. They are handled internally and synchronized to all clients.

Note that setting potion time to "1" might cause issues (effect will "blink" or won't even appear - depends if you use START or END tick). Always use 2+ values.

 

As to SharedMonsterAttributes (SMA):

SMA is NOT something that is synchronized. Its name, through still bad, kinda tells you what it is - "SHARED".

Vanilla sets entity's SMA only ONCE - when entity is being constructed. SMA is set on both server and client side - meaning both client entity and server one will have same SMA that was coded in Entity.class.

 

Changing SMA need to happen on BOTH sides. If you decide to alter it - you need to send packet to all clients that it changed.

Also - if you change SMA, let's say health for one player and then someother player sees him (didn't see him before) - you ALSO need to send packet to set its new health. SMA is constant value for both sides and all entities of same type (class).

 

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

Link to comment
Share on other sites

Everything you do, regarding data, should happen on server and be eventually sent to clients.

 

Yes - potion effects HAVE to be added on server side only. They are handled internally and synchronized to all clients.

Note that setting potion time to "1" might cause issues (effect will "blink" or won't even appear - depends if you use START or END tick). Always use 2+ values.

 

As to SharedMonsterAttributes (SMA):

SMA is NOT something that is synchronized. Its name, through still bad, kinda tells you what it is - "SHARED".

Vanilla sets entity's SMA only ONCE - when entity is being constructed. SMA is set on both server and client side - meaning both client entity and server one will have same SMA that was coded in Entity.class.

 

Changing SMA need to happen on BOTH sides. If you decide to alter it - you need to send packet to all clients that it changed.

Also - if you change SMA, let's say health for one player and then someother player sees him (didn't see him before) - you ALSO need to send packet to set its new health. SMA is constant value for both sides and all entities of same type (class).

 

If you use modifiers to modify the SMA, then they WILL be sent to the client automatically, but ONLY if they are declared as watched with

.setShouldWatch(true)

.

Health is shared by default, for example.

I have a tutorial on the Attribute system here:

http://www.minecraftforge.net/forum/index.php/topic,30137.0.html

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Link to comment
Share on other sites

everything is valid, except like I said earlier why, registering everything server side works just not with the event bus registered

I found a different problem, I think Im registrying my event busses wrong, what do you think, also registering one before another makes an  effect, heres thee code:

package com.OlympiansMod.Main;

import net.minecraft.client.renderer.entity.RenderSnowball;
import net.minecraftforge.event.entity.living.LivingDeathEvent;

import com.OlympiansMod.Block.ModBlocks;
import com.OlympiansMod.Item.DnaPosideonInfused;
import com.OlympiansMod.Item.DnaZeusInfused;
import com.OlympiansMod.Item.ModItems;
import com.OlympiansMod.creativetabs.MCreativeTabs;
import com.OlympiansMod.entity.EntityCell;
import com.OlympiansMod.entity.EntityGreekFire;
import com.OlympiansMod.entity.MEntity;
import com.OlympiansMod.lib.Refstrings;
import com.OlympiansMod.world.MWorld;

import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.registry.GameRegistry;

@Mod(modid = Refstrings.MODID , name = Refstrings.NAME , version = Refstrings.VERSION)
public class MainRegistry {
private static int modGuiIndex = 0;

public static final int GUI_CUSTOM_INV = modGuiIndex++;

@SidedProxy(clientSide = Refstrings.CLIENTSIDE , serverSide = Refstrings.SERVERSIDE)
public static ServerProxy proxy;

@Instance
public static MainRegistry modInstance;


@EventHandler
public static void PreLoad(FMLPreInitializationEvent PreEvent) {
	MCreativeTabs.initialiseTabs();
	ModBlocks.MainRegistry();
	MEntity.MainRegistry();
	ModItems.MainRegistry();
	FMLCommonHandler.instance().bus().register(new DnaPosideonInfused());
	FMLCommonHandler.instance().bus().register(new DnaZeusInfused());
	MWorld.MainRegistry();
        CraftingManager.mainRegistry(); 
              

}
@EventHandler
public static void Load(FMLInitializationEvent event) {
	 proxy.registerRenderInfo(); 
}
@EventHandler
public static void PostLoad(FMLPostInitializationEvent PostEvent) {
}

}

 

It works if the itemposideon is register after the zeus bus, and vis versa,  its kinds hard to explain just look at the code. why is it doing this? it works perfectly if its registered second.

 

and thanks about the potion effects, it works now, this is mainly about the health stuff though, meaning I just want to clarify that I don't think the main registry has anything to do with the potion effects.

Im serious don't look at it!!

Link to comment
Share on other sites

It might be only me, but I seriosuly don't get what is the ACTUAL problem here.

First you say something about health, now you start with even buses. I am lost.

 

Anyway - if you want direct help - make GitHub. Other option is to post all classes regarding problem (with proxies if used).

 

Also note that tick events always have 2 phases - pick one, otherwise code is ran twice. (e.g: event.phase == Phase.END).

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

Link to comment
Share on other sites

ok just tell me where I should register the event busses

PreInit

 

or a better question would be, how do I modify player attributes easily.

Alredy told, twice (in different aspects).

 

* SMA Base is something shared and set by Entity.class

* SMA Modifiers are auto-synced if set to be.

 

You either want to add/remove modifiers to attribute or set your own base value, but in that case you need to do all syncs on your own.

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

Link to comment
Share on other sites

yeah so It worked slightly:

here is every class im hoping this will help me solve the problem.

MainRegistry:

package com.OlympiansMod.Main;

import net.minecraft.client.renderer.entity.RenderSnowball;
import net.minecraftforge.event.entity.living.LivingDeathEvent;

import com.OlympiansMod.Block.ModBlocks;
import com.OlympiansMod.Item.DnaPosideonInfused;
import com.OlympiansMod.Item.DnaStats;
import com.OlympiansMod.Item.DnaStats2;
import com.OlympiansMod.Item.DnaZeusInfused;
import com.OlympiansMod.Item.ModItems;
import com.OlympiansMod.creativetabs.MCreativeTabs;
import com.OlympiansMod.entity.EntityCell;
import com.OlympiansMod.entity.EntityGreekFire;
import com.OlympiansMod.entity.MEntity;
import com.OlympiansMod.lib.Refstrings;
import com.OlympiansMod.world.MWorld;

import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.registry.GameRegistry;

@Mod(modid = Refstrings.MODID , name = Refstrings.NAME , version = Refstrings.VERSION)
public class MainRegistry {
private static int modGuiIndex = 0;

public static final int GUI_CUSTOM_INV = modGuiIndex++;

@SidedProxy(clientSide = Refstrings.CLIENTSIDE , serverSide = Refstrings.SERVERSIDE)
public static ServerProxy proxy;

@Instance
public static MainRegistry modInstance;


@EventHandler
public static void PreLoad(FMLPreInitializationEvent PreEvent) {
	MCreativeTabs.initialiseTabs();
	ModBlocks.MainRegistry();
	MEntity.MainRegistry();
	ModItems.MainRegistry();
	FMLCommonHandler.instance().bus().register(new DnaZeusInfused());
	FMLCommonHandler.instance().bus().register(new DnaPosideonInfused());
	MWorld.MainRegistry();
        CraftingManager.mainRegistry(); 
    
}
@EventHandler
public static void Load(FMLInitializationEvent event) {
	 proxy.registerRenderInfo(); 
}
@EventHandler
public static void PostLoad(FMLPostInitializationEvent PostEvent) {
}

}

ItemClasses:

package com.OlympiansMod.Item;

import java.util.List;

import com.sun.media.jfxmedia.events.PlayerEvent;

import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent.Phase;
import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent;
import net.minecraft.entity.Entity;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;

public class DnaZeusInfused extends Item {

@SubscribeEvent
public void playerTick(PlayerTickEvent event) {
	boolean hasItem = event.player.inventory.hasItem(ModItems.DnaZeusInfused);
	if (event.player.capabilities.isCreativeMode) {
	} else {	

		if (hasItem == true) {
			event.player.capabilities.allowFlying = true;
			if (event.player.capabilities.isFlying) {
	            if(!event.player.worldObj.isRemote){
				event.player.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(40.0D);				
				event.player.addPotionEffect(new PotionEffect(
						Potion.damageBoost.id, 1, 1));
				event.player.addPotionEffect(new PotionEffect(
						Potion.resistance.id, 1, 1));
				event.player.addPotionEffect(new PotionEffect(
						Potion.hunger.id, 3, 3));
	            }
			} else {
			if (hasItem == true) {
	            if(!event.player.worldObj.isRemote){
				event.player.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(30.0D);
				event.player.addPotionEffect(new PotionEffect(Potion.damageBoost.id, 0, 0));
				event.player.addPotionEffect(new PotionEffect(Potion.resistance.id, 0, 0));
					}
				}
			}
		}
	}

		if (event.player.capabilities.isCreativeMode) {
		} else {
			if (hasItem == false) {
	            if(!event.player.worldObj.isRemote){
				event.player.getEntityAttribute(SharedMonsterAttributes.maxHealth).removeAllModifiers();
				event.player.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D);
	            }
				event.player.capabilities.allowFlying = false;
				event.player.capabilities.isFlying = false;

		}

		if (event.player.isInWater() && hasItem == true) {
            if(!event.player.worldObj.isRemote){
				event.player.addPotionEffect(new PotionEffect(
						Potion.weakness.id, 0, 0));
			}
		}
	}

}
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
	if (!world.isRemote) {
		player.attackEntityFrom(DamageSource.causeIndirectMagicDamage(player, player), 10);
		player.addPotionEffect(new PotionEffect(Potion.blindness.id, 60, 5));
		player.addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 5));
		player.addPotionEffect(new PotionEffect(Potion.wither.id, 60, 5));
		player.inventory.addItemStackToInventory(new ItemStack(
				ModItems.DNAZeus));
		return new ItemStack(ModItems.DnaInfuser);

	}

	return stack;
}
public void addInformation(ItemStack stack, EntityPlayer player, List list,
		boolean i) {
	list.add(EnumChatFormatting.AQUA
			+ "Dna Infuser:");
	list.add("                         ");
	list.add(EnumChatFormatting.BLUE + "Mode:");
	list.add(EnumChatFormatting.BLUE + "Actively Infusing:");
	list.add(EnumChatFormatting.BLUE + "Dna of Zeus");


}
}

package com.OlympiansMod.Item;

import java.util.List;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;

public class DnaPosideonInfused extends Item{
@SubscribeEvent
public void playerTick(PlayerTickEvent event) {
	boolean hasItem = event.player.inventory.hasItem(ModItems.DnaPosideonInfused);

	if (event.player.capabilities.isCreativeMode) {
	} else {
		if (hasItem == true) {
			if (event.player.isWet()) {
	            if(!event.player.worldObj.isRemote){
				event.player.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(45.0D);
				event.player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 1, 1));
				event.player.addPotionEffect(new PotionEffect(Potion.waterBreathing.id, 1, 1));
				event.player.addPotionEffect(new PotionEffect(Potion.damageBoost.id, 3, 3));
				event.player.addPotionEffect(new PotionEffect(Potion.resistance.id, 1, 1));
			}
			} else {

				if (hasItem == true) {
		            if(!event.player.worldObj.isRemote){
					event.player.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(30.0D);
					event.player.addPotionEffect(new PotionEffect(Potion.damageBoost.id, 1, 1));
					event.player.addPotionEffect(new PotionEffect(Potion.resistance.id, 0, 0));
		            }
				}
			}
		}
	}
	if (event.player.capabilities.isCreativeMode) {
	} else {
		if (hasItem == false) {
            if(!event.player.worldObj.isRemote){
			event.player.getEntityAttribute(SharedMonsterAttributes.maxHealth).removeAllModifiers();
			event.player.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D);
            }
		}

		if (event.player.isInWater() && hasItem == true) {
            if(!event.player.worldObj.isRemote){
			event.player.addPotionEffect(new PotionEffect(
					Potion.regeneration.id, 1, 1));
			}
		}
	}
}
public ItemStack onItemRightClick(ItemStack stack, World world,
		EntityPlayer player) {
	if (!world.isRemote) {
		player.attackEntityFrom(
				DamageSource.causeIndirectMagicDamage(player, player), 10);
		player.addPotionEffect(new PotionEffect(Potion.blindness.id, 60, 5));
		player.addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 5));
		player.addPotionEffect(new PotionEffect(Potion.wither.id, 60, 5));
		player.inventory.addItemStackToInventory(new ItemStack(
				ModItems.DNAPosideon));
		return new ItemStack(ModItems.DnaInfuser);

	}

	return stack;
}

public void addInformation(ItemStack stack, EntityPlayer player, List list,
	boolean i) {

list.add(EnumChatFormatting.AQUA + "Dna Infuser:");
list.add("                         ");
list.add(EnumChatFormatting.BLUE + "Mode:");
list.add(EnumChatFormatting.BLUE + "Actively Infusing:");
list.add(EnumChatFormatting.BLUE + "Dna of Posideon");

}
}


 

so yeah, the dnaposideoninfused works perfectly, problem is the dnaZeusInfused works, except for the health modifiers, and I can get the dnazeusInfused to work, but I have to place the event bus before the dna posideon infused. but then the dnaposideoninfused doesn't work. why is this?

Im serious don't look at it!!

Link to comment
Share on other sites

fw1vI.jpg

 

width=600 height=399http://images-cdn.9gag.com/photo/arpnqKB_700b.jpg[/img]

 

Aaaanyway... (mind that my life and everything I say is a joke)

I will just point out everything bad:

1.

Also note that tick events always have 2 phases - pick one, otherwise code is ran twice. (e.g: event.phase == Phase.END).

56586470.jpg

 

2.

@SubscribeEvent
public void playerTick(PlayerTickEvent event) {
boolean hasItem = event.player.inventory.hasItem(ModItems.DnaZeusInfused);

This piece of code is almost as ridiculus as building a bike with square "wheels" just to realize that round ones were invented thousands of years ago.

 

If you are planning on making an item that gives effects when inside inventory and/or held in hand - use the right method!

Item#onUpdate(...) is called whenever item is inside your inventory. To check if it's held you can simply do heldStack==stackFromOnUpdateMethod.

 

3.

For the love of god - keep some order when making chain if-statements.

1st check the logical side! Then do creative checks and then everything else.

 

4.

More @SubscribeEvent for same event = worse the design.

One mod should only subscribe to an event once, there is no logical point of doing it twice. Also - look again at point "1" and "2".

 

5.

removeAllModifiers();

Focus on "All" keyword. You certainly DON'T want to use this method, just because.

 

6.

Finally (writing this 3rd time):

You either ALTER BASE value, or ADD/REMOVE MODIFIER.

Every attribute has a BASE value that is set DIRECTLY from given Entity.class. This value (if not changed from outside) will most certainly be SAME for all entitities of given class for both client and server.

Altering BASE value in ANY way will require you to update other client's data, as BASE value is set ONCE and not tracked.

 

If you don't want to handle it on your own (all the updates) - you DO NOT even touch BASE value. Never, ever (not including making your own entity obviously).

 

If you want to go easy way - you do it by ADDING/REMOVING AttributeModifier to given Attribute. Base stays the same, you just add e.g +10 health (meaning entity will have 20+10).

In that case - modifiers WILL be auto-synced if set to do so (.setShouldWatch(true)).

 

6 (edit: because "7" is too mainstream). Why do your potions have "0" time?

 

Fix your code, read vanilla and check out modifiers (plenty of examples in vanilla).

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

Link to comment
Share on other sites

i know this is completely and utterly wrong but what do I do from here, plus im having trouble finding examples in vanilla(the healthboost potion effect does help me) or the internet. How/What should I do to just + 10 to a health modifier.

			            event.player.getEntityAttribute(SharedMonsterAttributes.maxHealth).applyModifier(new AttributeModifier(null, iconString, event.player.getMaxHealth() + 10D, 10));	

yeah don't even say anything about the code.. but seriously how do I apply an attribute.

Im serious don't look at it!!

Link to comment
Share on other sites

Okay, so basically (I think you finally got the idea).

 

There is the Attribute.

It kinda looks like this: (example)

Note: It obviously doesn't look like this in internals, I am just presenting idea.

 

Attribute<maxHealth>

--->Map<UUID, AttributeModifier>

 

Now the AttributeModifier is something that can be added/removed from Attribute based on it's UUID (internals also allow operating on names or operations, but it's not really place for you in this case, those are internals).

 

What you actually do here is save basic data about modifier as static thing and apply it to any number of entities you want.

Example:

public static String theUUID = "1F28C409-EA90-4E54-AD57-13F3D92F68B2"; // this is supposed to be some static-for-your-modifier UUID. You decide what this String is, it must be in an UUID format tho.
public static String theName = "MySuperModifier"; // This will be the name of modifier.
public static AttributeModifier myAttributeModifier = new AttributeModifier(UUID.fromString(theUUID), theName, 10.0D, 0); // And yes, you can put those above inside this one's declaration.

//Now what you do in method to apply/remove:

event.player.getEntityAttribute(SharedMonsterAttributes.maxHealth).applyModifier(myAttributeModifier);
// 10.0D is modifier value, in this case 10.0F health
// 0 is an operation - there are few operations, 0 is literally "+".
// After doing this - your entity's health will be 20+10.
// The Modifier is saved in entity with a key (theUUID).
// If you want to remove it, you simply:

event.player.getEntityAttribute(SharedMonsterAttributes.maxHealth).removeModifier(myAttributeModifier); // note that it is the same modifier instance used on all entities.

 

Lemme just note: I DO NOT personally use this fkd up system. For me - it's the most badly and overly-complicated thing that they've added to MC since they started "sane" and "code-cleanup" updates. I personally go with my own much clearer, faster and expanded system that operates direcly on BASE value.

I have no idea if this will work, I literally just readup it in past 20min directly from code. Guess it should.

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

Link to comment
Share on other sites

Lemme just note: I DO NOT personally use this fkd up system. For me - it's the most badly and overly-complicated thing that they've added to MC since they started "sane" and "code-cleanup" updates. I personally go with my own much clearer, faster and expanded system that operates direcly on BASE value.

I have no idea if this will work, I literally just readup it in past 20min directly from code. Guess it should.

 

I will shamelessly self-ad my tutorial again: http://www.minecraftforge.net/forum/index.php/topic,30137.0.html

 

But you got it right.

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

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

 Share



×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.