Jump to content

[1.7.10] Shield ?


KakesRevenge

Recommended Posts

Hello everyone,

im trying to make a shield.

Ive tried to subscribe living hurt event but this is not working :

 

@SubscribeEvent
public void LivingHurt(LivingHurtEvent event) {
	if(event.entityLiving instanceof EntityPlayer) {
		EntityPlayer player = (EntityPlayer)event.entityLiving;
		if(player.getCurrentEquippedItem() == new ItemStack(ItemHandler.Shield)) {
			event.ammount = 0F;
		}
	}
}

 

any ideas ? thx in advance

I'm beginner in java and in minecraft modding.

Please be specific.

Any code examples are appreciated.

Sorry for my english i'm from Czech republic.

Please hit that thank you button if i helped :)

Link to comment
Share on other sites

i tried :

if(player.getCurrentEquippedItem() == ItemHandler.Shield){

but it wont work

so what should i do ?

I'm beginner in java and in minecraft modding.

Please be specific.

Any code examples are appreciated.

Sorry for my english i'm from Czech republic.

Please hit that thank you button if i helped :)

Link to comment
Share on other sites

To expand upon diesieben's comment, you need to compare the Item and possibly the damage value and maybe even the NBT tag of the ItemStacks in question in order to determine equality.

 

Usually, you don't care if the ItemStacks are actually equal, but rather that the Item it contains is the same.

 

In your case, you want to know if the ItemStack contains an ItemShield item (assuming that's the name of your shield item class), so you'd have to first check if the stack is null, and then check if stack.getItem() is an instanceof your ItemShield class, or you could compare it directly to YourItems.shield:

ItemStack stack = player.getHeldItem();
if (stack != null && stack.getItem() instanceof ItemShield) {

// Alternatively:
if (stack != null && stack.getItem() == ItemHandler.shield) {

Using instanceof is more flexible, as it will handle ALL shield items with one check, whereas the latter you have to check specifically for each item you want to handle, making it a pain if you (or another modder using your mod) ever add more shields.

Link to comment
Share on other sites

thank you for your detailed explanation it works fine now :)

+ i have 1 more question - how to check what/who is hurting me ?

I'm beginner in java and in minecraft modding.

Please be specific.

Any code examples are appreciated.

Sorry for my english i'm from Czech republic.

Please hit that thank you button if i helped :)

Link to comment
Share on other sites

Both LivingHurtEvent adn LivingAttackEvent ship DamageSource with them.

You can check if source is related to entity and then e.g know that Zombie hit you.

 

Difference between events:

One is called after applying attack (hurt).

Second fires the moment entity "hits" target, so before everything (knockback, potion checks, everything).

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

Link to comment
Share on other sites

To expand a little on what Ernio said, DamageSource contains information about the entity that the damage was caused by.

 

source.getEntity() is always (in vanilla implementations, at least) the entity that is ultimately responsible for the damage, such as the player entity who released the arrow entity that hit you.

 

source.getSourceOfDamage() returns the entity directly responsible for the damage; in the example above, it would give you the arrow entity.

 

I've seen the difference between those two trip quite a few people up.

Link to comment
Share on other sites

thank you very much and how to check if im rightclicking the item ? in the event ?

I'm beginner in java and in minecraft modding.

Please be specific.

Any code examples are appreciated.

Sorry for my english i'm from Czech republic.

Please hit that thank you button if i helped :)

Link to comment
Share on other sites

one more thing - how can i do it so that you have sword and when you right click it the shield will show up ?

I'm beginner in java and in minecraft modding.

Please be specific.

Any code examples are appreciated.

Sorry for my english i'm from Czech republic.

Please hit that thank you button if i helped :)

Link to comment
Share on other sites

Depending what is your goal - do you want to make that instead of sword, there will be shield - bacause that is relatively easy.

 

Other option would be to make shield render in left hand when clicking with sword.

That is like whole different level of coding. WHOLE. DIFFERENT. LEVEL. (Packets, ExtendedProperties, PlayerRenderer, a lot of data exchange and tracking).

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

Link to comment
Share on other sites

yes i want the second option ... is there some kind of tutorial ? i have no idea how should i learn that ...

I'm beginner in java and in minecraft modding.

Please be specific.

Any code examples are appreciated.

Sorry for my english i'm from Czech republic.

Please hit that thank you button if i helped :)

Link to comment
Share on other sites

yes i want the second option ... is there some kind of tutorial ? i have no idea how should i learn that ...

No, probably no... As Ernio said, it's whole different level of coding, but if you're good at java and you can sustain working with tutorials telling only parts of what need and assembling them together... Then yes, maybe you can do this...

At least you will have to know: Packets, ExtendedEntityProperties, Events, PlayerRendering...

Link to comment
Share on other sites

There is a reason why there are no tutorials for advanced stuff.

To code something like that you would need extensive knowledge about Forge and many parts of the Minecraft itself.

 

Goal: make player have equippable shield that will appear when "blocking" with sword.

 

1. IExtendedEntityProperties (IEEP) to save data.

2. IInventory implementation to save inventory.

3. Container/Gui/GuiHandler to display shield slot.

4. SimpleNetworkWrapper and packeting to synchronize clients.

5. RenderPlayerEvent to render shield.

6. ItemRendering and Models (strong dependence to MC version) - loading models and rendering them.

7. Extensive knowledge about making Items and using their methods.

 

Basically what you are after:

Make IInventory which will be saved in IEEP. In that IInventory you will be able to place shield. Use Container to open inv on server, Gui on client, GuiHandler as "bridge".

Use RenderPlayerEvent - you will need to load shield model and render it. In order to move/rotate player's left arm you will ned to cancel rendering of player and render it on your own from begining, changing arms in process. To do that - in RenderPlayerEvent you could check if player is blocking - i BELIVE there is method/boolean for that in 1.7.10, if not: use PlayerUseItemEvent and save boolean in IEEP that will tell you if player is currently "shielding". In the second case (there is no boolean in vanilla side) - you will need to synchronize everything on your own - you can utilize PlayerEvent.StartTracking and EntityTracker to do that, or simply apply dataWatcher to player with boolean.

If the player is blocking, you can check wether he has shield equipped (in your inventory) - if so you can get it's model and render it.

 

I will say it again - this is not basic, not simple, not even intermidiate modding. This shit is advanced - if you want to code it well (because nothing is advanced if you don't code it well).

 

Your are better off with experimenting with those 7 things I wrote - know how they work and when/how to use them. It takes time to start using different tools to create one thing.

 

EDIT

There is no player.isBlocking (note that names are examples), BUT there is 'private ItemStack itemInUse;' (at least on 1.8). You can use that.

if (player.itemInUse.getItem() instanceof ItemSword) -> that means that you must be blocking (I mean, i think - blocking = using sword, so basically this should work).

Vanilla would handle shynchronization for you (because that's vanilla's field).

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

Link to comment
Share on other sites

thank you for your explanation but what shield slot ? what gui ? all i need is sword which will be rendered in hand as shield when "using it" holding  right click

I'm beginner in java and in minecraft modding.

Please be specific.

Any code examples are appreciated.

Sorry for my english i'm from Czech republic.

Please hit that thank you button if i helped :)

Link to comment
Share on other sites

thank you for your explanation but what shield slot ? what gui ? all i need is sword which will be rendered in hand as shield when "using it" holding  right click

Now we understand, what you want to do:

Hold right lcick with shield, and whiel - dcrease attack damage and render as blocking? right???

Link to comment
Share on other sites

Other option would be to make shield render in left hand when clicking with sword.

yes i want the second option

 

Well, vanilla doesn't allow you to have left hand - never. So I am getting conflicted ideas from you.

 

Do you want to have sword in right and shield in left hand when blocking, or do you want to render shield instead of sword when blocking with sword?

That wa my question previously.

 

What I described earlier was a very sophisticated way of making what you wanna have. But I guess that could be too hard :P

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

Link to comment
Share on other sites

I have a sword and when its in my hand and im holding the right mouse button, i cant attack and im blockin the damage and in my hand the sword is rendering as a shield.

 

EDIT : all in one hand

I'm beginner in java and in minecraft modding.

Please be specific.

Any code examples are appreciated.

Sorry for my english i'm from Czech republic.

Please hit that thank you button if i helped :)

Link to comment
Share on other sites

I have a sword and when its in my hand and im holding the right mouse button, i cant attack and im blockin the damage and in my hand the sword is rendering as a shield.

 

EDIT : all in one hand

Oooh, got you! You just have to use shield texture for sword when held... That's all!!!

 

EDIT: 

public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining)

will help you! (usingItem is item that player is holding right click on, may be null!!!)...

Link to comment
Share on other sites

Yep, basically when right clicked the sword shield texture will appear in hand

I'm beginner in java and in minecraft modding.

Please be specific.

Any code examples are appreciated.

Sorry for my english i'm from Czech republic.

Please hit that thank you button if i helped :)

Link to comment
Share on other sites

Yep, basically when right clicked the sword shield texture will appear in hand

Ok, then as i said,

public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining)

will help you! (for params, see /** */)

 

Link to comment
Share on other sites

When you're ready to attempt the advanced version, I do actually have a couple of tutorials that will get you well on your way:

1. IExtendedEntityProperties

2. Custom player inventory (e.g. shield slot)

3. Packets

4. Example of all of the above

 

That should be enough to get you a shield slot (or wait for 1.9? :P), then it's up to you to figure out when the player has a shield equipped in that slot and handle any rendering that needs to be done.

 

Good luck!

Link to comment
Share on other sites

Thanks :P and how return the texture name ? i mean the icon

I think Elix's answer covered that already:

[Ok, then as i said,

public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining)

will help you! (for params, see /** */)

If you are having trouble using it, post the code that you have tried. You will need to put that method in your SWORD class, btw, to return a SHIELD icon when in use (if (player.isUsingItem())

Link to comment
Share on other sites

i tried this and i know you will be face palming really hard but i have no idea how to set icons to this :D

 

@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) {
	if(player.isUsingItem() == true) {
		return (IIcon) this.setTextureName(ProjektWow.MODID + ":" + "testshield");
	}
        return (IIcon) this.setTextureName(ProjektWow.MODID + ":" + "testsword");
    }

I'm beginner in java and in minecraft modding.

Please be specific.

Any code examples are appreciated.

Sorry for my english i'm from Czech republic.

Please hit that thank you button if i helped :)

Link to comment
Share on other sites

i tried this and i know you will be face palming really hard but i have no idea how to set icons to this :D

 

@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) {
	if(player.isUsingItem() == true) {
		return (IIcon) this.setTextureName(ProjektWow.MODID + ":" + "testshield");
	}
        return (IIcon) this.setTextureName(ProjektWow.MODID + ":" + "testsword");
    }

So, IICons... Are used in another way:

Create in your item class 2 IICon fields: one for sword texture and one for shield

Remove .setTextureName

Override registerICons(IIConRegister reg)

In this method register IICons using icon = rg.registerIICon();

Then in getIICon method, depending on state return either swordTexture or ShieldTexture

 

Some of method/field/class names/descriptions may not be exact, but similar to one that are...

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.