Jump to content

Recommended Posts

Posted (edited)

I am trying to store data on a player and have this data manipulated by mainhand weapons, armor, and stuff like that. The issue I'm trying to tackle is updating this information when these items change and such. Originally I was thinking of updating this information in a player tick event - check to see if the item held/worn is the right type and has the right data, take this data and add it to the player's data. If the item changes, remove it. All of this in a tick event is kinda tricky to handle but is doable. So I started to look into other ways of handling this, and I figured Attributes work similar to how I want to handle this. When you hold a sword, damage goes up and speed goes down when in your mainhand. But this would require making a new attribute for the player and item, and looking into that, people have said that making attributes for a player isn't the right way to handle it. Is the case all the time in that you should always save data in a capability, or is it possible in this case?

 

To explain what I'm trying to do if it helps, every player has a set of stats. Some weapons have these stats too. When you are using a weapon/wearing armor that has one of these stats, I need to update the information in the player to get the correct totals.

 

Edit: I just worked this up and it works like I want - might not be the most efficient way of doing things.

 

	private int ticks;
	
	private ItemStack mainhand;
	private ItemStack helmet;
	private ItemStack chestplate;
	private ItemStack leggings;
	private ItemStack boots;
	
	/* Called ever second to check for slots and update stat bonuses. Might need to be re-worked. */
	@SubscribeEvent
	public void onPlayerTick(PlayerTickEvent event)
	{
		if (event.phase == Phase.START && !event.player.getEntityWorld().isRemote)
		{
			if (ticks % 20 == 0)
			{
				IPlayerInformation playerInfo = event.player.getCapability(CapabilityPlayerInformation.PLAYER_INFORMATION, null);
				
				if (playerInfo != null)
				{	
					if (event.player.inventory.getCurrentItem() != mainhand)
					{
						updateStats(event.player, playerInfo);
						mainhand = event.player.inventory.getCurrentItem();
					}
					
					for (ItemStack stack : event.player.inventory.armorInventory)
					{
						if (stack.getItem() instanceof ItemArmor)
						{
							if (((ItemArmor) stack.getItem()).getEquipmentSlot() == EntityEquipmentSlot.HEAD && stack != helmet)
							{
								updateStats(event.player, playerInfo);
								helmet = stack;
							}
							else if (((ItemArmor) stack.getItem()).getEquipmentSlot() == EntityEquipmentSlot.CHEST && stack != chestplate)
							{
								updateStats(event.player, playerInfo);
								chestplate = stack;
							}
							else if (((ItemArmor) stack.getItem()).getEquipmentSlot() == EntityEquipmentSlot.LEGS && stack != leggings)
							{
								updateStats(event.player, playerInfo);
								leggings = stack;
							}
							else if (((ItemArmor) stack.getItem()).getEquipmentSlot() == EntityEquipmentSlot.FEET && stack != boots)
							{
								updateStats(event.player, playerInfo);
								boots = stack;
							}
						}
					}
				}
				
				ticks = 0;
			}
			
			ticks++;
		}
	}
	
	private void updateStats(EntityPlayer player, IPlayerInformation info)
	{	
		info.removeBonusStats();
		
		if (player.inventory.getCurrentItem().getItem() instanceof ItemSword)
		{
			NBTTagCompound nbt = NBTHelper.loadStackNBT(player.inventory.getCurrentItem());
			
			if (WeaponAttribute.STRENGTH.hasAttribute(nbt)) info.setBonusStrengthStat(info.getBonusStrengthStat() + (int) WeaponAttribute.STRENGTH.getAmount(nbt));
			if (WeaponAttribute.AGILITY.hasAttribute(nbt)) info.setBonusAgilityStat(info.getBonusAgilityStat() + (int) WeaponAttribute.AGILITY.getAmount(nbt));
			if (WeaponAttribute.DEXTERITY.hasAttribute(nbt)) info.setBonusDexterityStat(info.getBonusDexterityStat() + (int) WeaponAttribute.DEXTERITY.getAmount(nbt));
			if (WeaponAttribute.INTELLIGENCE.hasAttribute(nbt)) info.setBonusIntelligenceStat(info.getBonusIntelligenceStat() + (int) WeaponAttribute.INTELLIGENCE.getAmount(nbt));
			if (WeaponAttribute.WISDOM.hasAttribute(nbt)) info.setBonusWisdomStat(info.getBonusWisdomStat() + (int) WeaponAttribute.WISDOM.getAmount(nbt));
			if (WeaponAttribute.FORTITUDE.hasAttribute(nbt)) info.setBonusFortitudeStat(info.getBonusFortitudeStat() + (int) WeaponAttribute.FORTITUDE.getAmount(nbt));
		}
		
		for (ItemStack stack : player.inventory.armorInventory)
		{
			NBTTagCompound nbt = NBTHelper.loadStackNBT(stack);
			
			if (ArmorAttribute.STRENGTH.hasAttribute(nbt)) info.setBonusStrengthStat(info.getBonusStrengthStat() + (int) ArmorAttribute.STRENGTH.getAmount(nbt));
			if (ArmorAttribute.AGILITY.hasAttribute(nbt)) info.setBonusAgilityStat(info.getBonusAgilityStat() + (int) ArmorAttribute.AGILITY.getAmount(nbt));
			if (ArmorAttribute.DEXTERITY.hasAttribute(nbt)) info.setBonusDexterityStat(info.getBonusDexterityStat() + (int) ArmorAttribute.DEXTERITY.getAmount(nbt));
			if (ArmorAttribute.INTELLIGENCE.hasAttribute(nbt)) info.setBonusIntelligenceStat(info.getBonusIntelligenceStat() + (int) ArmorAttribute.INTELLIGENCE.getAmount(nbt));
			if (ArmorAttribute.WISDOM.hasAttribute(nbt)) info.setBonusWisdomStat(info.getBonusWisdomStat() + (int) ArmorAttribute.WISDOM.getAmount(nbt));
			if (ArmorAttribute.FORTITUDE.hasAttribute(nbt)) info.setBonusFortitudeStat(info.getBonusFortitudeStat() + (int) ArmorAttribute.FORTITUDE.getAmount(nbt));
		}
		
		LostEclipse.network.sendTo(new PacketUpdatePlayerStats(info), (EntityPlayerMP) player);
	}

 

Edited by TheXFactor117

Developer of Levels and Lost Eclipse

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



×
×
  • Create New...

Important Information

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