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

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.