Jump to content

Adding more damage to a sword if a player is sprinting


Asweez

Recommended Posts

You would most likely use the hitEntity method in Item.java and then tell the game:

if(player.isSpriniting) {
    //do your stuff
}

 

Alternatively, you could use the LivingAttackEvent but, not really useful considering you have a sword class. :P

I am not a cat. I know my profile picture is sexy and amazing beyond anything you could imagine but my cat like features only persist in my fierce eyes. I might be a cat.

Link to comment
Share on other sites

With custom sword:

 

public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker)
    {
if (attacker instanceof EntityPlayer)
	if (sprinting - post above)
		target.attackEntityFrom(DamageSource.causePlayerDamage((EntityPlayer) attacker), 1.0F);

        stack.damageItem(1, attacker); // this or super.hitEntity is NEEDED, otherwise sword will not lose durability.
        return true;
    }

 

For vanilla

LivingAttackEvent (strongly prefered) or LivingHurtEvent if you want to apply damage after hit.

 

Disclaimer - I have no idea how #causePlayerDamage actually works, just noticed method in eclipse. There are several others if you want to know and also you can define your own (simply make new DamageSource).

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

Link to comment
Share on other sites

To be clear, the 1.0F in the attackEntityFrom() method should be changed to the amount of damage you want to do. You probably want to make it a multiplier of the base damage -- i.e. if sprinting doubles the damage, then multiply the base damage by 2.0F.

 

And the causePlayerDamage() method doesn't actually do any damage, it just makes sure the DamageSource has the player field properly filled in.

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

Nope none of that worked

 

Heres the code:

public boolean hitEntity(ItemStack p_77644_1_, EntityLivingBase target, EntityLivingBase attacker)
    {
	if(attacker.isSprinting()){
		System.out.println("sprint");
		target.attackEntityFrom(DamageSource.causePlayerDamage((EntityPlayer)attacker), 15);
	}
        return true;
    }

 

"sprint" never comes up in the console. And I don't need to damage the sword so that's why that's not there.

Creator of the MyFit, MagiCraft, Tesseract gun, and Papa's Wingeria mod.

Link to comment
Share on other sites

Does it not detect the player is sprinting or, not add the damage? You need to be more specific instead of just saying. "Nope none of that worked". :P

I am not a cat. I know my profile picture is sexy and amazing beyond anything you could imagine but my cat like features only persist in my fierce eyes. I might be a cat.

Link to comment
Share on other sites

Does it not detect the player is sprinting or, not add the damage? You need to be more specific instead of just saying. "Nope none of that worked". :P

"sprint" never comes up in the console.

If I am reading that right, it does not pass the
if(attacker.isSprinting())

, so it does not detect that the player is sprinting.

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Link to comment
Share on other sites

I seemed to of missed the bottom line of his post. Are you sure the entity you are using is the attacker? First, try switching them by using

if(target.isSpriniting())

just to see if the target is actually the attacker. After that make sure you are sprinting when you try to attack something. xD I know that may sound a bit silly but, the game could be stopping your sprinting as you hit.

I am not a cat. I know my profile picture is sexy and amazing beyond anything you could imagine but my cat like features only persist in my fierce eyes. I might be a cat.

Link to comment
Share on other sites

If you look at the call hierarchy for the hitEntity() method, it seems that the attacker is the last parameter (ItemStack calls it with the EntityPlayer), so I think that is correct.

 

I think the question is whether the method is being called at all. I would put another console statement at the beginning of the method.

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

Tested here.. this function cannot be used for this...

 

Same if trying with onLeftClickEntity()..

 

 

Probably when you hit anything you stop the sprint action.

 

Try a sync with onupdate call to create a "ghost sprint status" inside the sword...

 

example:

 

on update: if player is sprinting set flag to true.. if player not sprinting count 3 ticks and set flag to false.

 

onhit/onleftclickentity: if flag true, do more damage.

 

 

Maybe it can work...

// BSc CIS, hardcore gamer and a big fan of Minecraft.

 

TmzOS ::..

Link to comment
Share on other sites

@TamzOS That could work. But, how would he be able to get the instance of EntityPlayer? He couldn't use Minecraft.getMinecraft() considering it needs to be ran server-side.

I am not a cat. I know my profile picture is sexy and amazing beyond anything you could imagine but my cat like features only persist in my fierce eyes. I might be a cat.

Link to comment
Share on other sites

Try something like this..

 

@Override
public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) 
{
	if(!world.isRemote && entity instanceof EntityPlayer && ((EntityPlayer) entity).getCurrentEquippedItem() != null)
	{

		if(((EntityPlayer) entity).isSprinting())
		{
			this.sprint = true;
			System.out.println("aaaa");
		}
		else
		{
			this.counter++;
			if(this.counter>5)
			{
				this.counter=0;
				this.sprint = false;
			}
		}
	}
}

 

 

// BSc CIS, hardcore gamer and a big fan of Minecraft.

 

TmzOS ::..

Link to comment
Share on other sites

You can't hold fields inside Item itself.

You need to store them into NBT of given ItemStack (there is one on onUpdate()).

onUpdate() is called always when item is in player's inventory, do additional check if player is holding given item (the one that actually check for sprinting).

 

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

Link to comment
Share on other sites

You can't hold fields inside Item itself.

You need to store them into NBT of given ItemStack (there is one on onUpdate()).

onUpdate() is called always when item is in player's inventory, do additional check if player is holding given item (the one that actually check for sprinting).

 

Since the sprinting status is temporary (no need to save whether player is sprinting) and because it is not tied specifically to an item, I would simply create a static field in my main mod class and use that.

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

Bad, bad, bad :o

 

I corrected him, because he used Item#onUpdate method with this.sprint, which obviously points out to field in Item.class which is NOT acceptable.

 

Try something like this..

@Override
public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) 
{
	....
	this.sprint = true;
	this.counter++;
	...
}

 

Your idea is bad, jabelar. Holding value in MainMod.class is ridiculus since it'll be for client, both onUpdate() and damage-dealing runs on server.

 

Yes, field is temporary and doesn't need saving, it still needs to be saved per-player, your would need either IExtendedItemProperties to get that working per-player (and like said before, no need to save it) or simplier way which I wrote in previous post - save temporary value in Item's NBT itself. Note: Simplier != Better, IEEP is always superior in stufff like that.

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

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