Jump to content

Recommended Posts

Posted

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 :)

Posted

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 :)

Posted

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.

Posted

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 :)

Posted

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.

Posted

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.

Posted

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 :)

Posted

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 :)

Posted

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.

Posted

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 :)

Posted

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

Posted

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.

Posted

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 :)

Posted

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

Posted

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.

Posted

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 :)

Posted

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

Posted

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 :)

Posted

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!

Posted

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

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 :)

Posted

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())

Posted

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 :)

Posted

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

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • So me and a couple of friends are playing with a shitpost mod pack and one of the mods in the pack is corail tombstone and for some reason there is a problem with it, where on death to fire the player will get kicked out of the server and the tombstone will not spawn basically deleting an entire inventory, it doesn't matter what type of fire it is, whether it's from vanilla fire/lava, or from modded fire like ice&fire/lycanites and it's common enough to where everyone on the server has experienced at least once or twice and it doesn't give any crash log. a solution to this would be much appreciated thank you!
    • It is 1.12.2 - I have no idea if there is a 1.12 pack
    • Okay, but does the modpack works with 1.12 or just with 1.12.2, because I need the Forge client specifically for Minecraft 1.12, not 1.12.2
    • Version 1.19 - Forge 41.0.63 I want to create a wolf entity that I can ride, so far it seems to be working, but the problem is that when I get on the wolf, I can’t control it. I then discovered that the issue is that the server doesn’t detect that I’m riding the wolf, so I’m struggling with synchronization. However, it seems to not be working properly. As I understand it, the server receives the packet but doesn’t register it correctly. I’m a bit new to Java, and I’ll try to provide all the relevant code and prints *The comments and prints are translated by chatgpt since they were originally in Spanish* Thank you very much in advance No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. MountableWolfEntity package com.vals.valscraft.entity; import com.vals.valscraft.network.MountSyncPacket; import com.vals.valscraft.network.NetworkHandler; import net.minecraft.client.Minecraft; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.animal.Wolf; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.Entity; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.network.PacketDistributor; public class MountableWolfEntity extends Wolf { private boolean hasSaddle; private static final EntityDataAccessor<Byte> DATA_ID_FLAGS = SynchedEntityData.defineId(MountableWolfEntity.class, EntityDataSerializers.BYTE); public MountableWolfEntity(EntityType<? extends Wolf> type, Level level) { super(type, level); this.hasSaddle = false; } @Override protected void defineSynchedData() { super.defineSynchedData(); this.entityData.define(DATA_ID_FLAGS, (byte)0); } public static AttributeSupplier.Builder createAttributes() { return Wolf.createAttributes() .add(Attributes.MAX_HEALTH, 20.0) .add(Attributes.MOVEMENT_SPEED, 0.3); } @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { ItemStack itemstack = player.getItemInHand(hand); if (itemstack.getItem() == Items.SADDLE && !this.hasSaddle()) { if (!player.isCreative()) { itemstack.shrink(1); } this.setSaddle(true); return InteractionResult.SUCCESS; } else if (!level.isClientSide && this.hasSaddle()) { player.startRiding(this); MountSyncPacket packet = new MountSyncPacket(true); // 'true' means the player is mounted NetworkHandler.CHANNEL.sendToServer(packet); // Ensure the server handles the packet return InteractionResult.SUCCESS; } return InteractionResult.PASS; } @Override public void travel(Vec3 travelVector) { if (this.isVehicle() && this.getControllingPassenger() instanceof Player) { System.out.println("The wolf has a passenger."); System.out.println("The passenger is a player."); Player player = (Player) this.getControllingPassenger(); // Ensure the player is the controller this.setYRot(player.getYRot()); this.yRotO = this.getYRot(); this.setXRot(player.getXRot() * 0.5F); this.setRot(this.getYRot(), this.getXRot()); this.yBodyRot = this.getYRot(); this.yHeadRot = this.yBodyRot; float forward = player.zza; float strafe = player.xxa; if (forward <= 0.0F) { forward *= 0.25F; } this.flyingSpeed = this.getSpeed() * 0.1F; this.setSpeed((float) this.getAttributeValue(Attributes.MOVEMENT_SPEED) * 1.5F); this.setDeltaMovement(new Vec3(strafe, travelVector.y, forward).scale(this.getSpeed())); this.calculateEntityAnimation(this, false); } else { // The wolf does not have a passenger or the passenger is not a player System.out.println("No player is mounted, or the passenger is not a player."); super.travel(travelVector); } } public boolean hasSaddle() { return this.hasSaddle; } public void setSaddle(boolean hasSaddle) { this.hasSaddle = hasSaddle; } @Override protected void dropEquipment() { super.dropEquipment(); if (this.hasSaddle()) { this.spawnAtLocation(Items.SADDLE); this.setSaddle(false); } } @SubscribeEvent public static void onServerTick(TickEvent.ServerTickEvent event) { if (event.phase == TickEvent.Phase.START) { MinecraftServer server = net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(); if (server != null) { for (ServerPlayer player : server.getPlayerList().getPlayers()) { if (player.isPassenger() && player.getVehicle() instanceof MountableWolfEntity) { MountableWolfEntity wolf = (MountableWolfEntity) player.getVehicle(); System.out.println("Tick: " + player.getName().getString() + " is correctly mounted on " + wolf); } } } } } private boolean lastMountedState = false; @Override public void tick() { super.tick(); if (!this.level.isClientSide) { // Only on the server boolean isMounted = this.isVehicle() && this.getControllingPassenger() instanceof Player; // Only print if the state changed if (isMounted != lastMountedState) { if (isMounted) { Player player = (Player) this.getControllingPassenger(); // Verify the passenger is a player System.out.println("Server: Player " + player.getName().getString() + " is now mounted."); } else { System.out.println("Server: The wolf no longer has a passenger."); } lastMountedState = isMounted; } } } @Override public void addPassenger(Entity passenger) { super.addPassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(true)); } } } @Override public void removePassenger(Entity passenger) { super.removePassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is no longer mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(false)); } } } @Override public boolean isControlledByLocalInstance() { Entity entity = this.getControllingPassenger(); return entity instanceof Player; } @Override public void positionRider(Entity passenger) { if (this.hasPassenger(passenger)) { double xOffset = Math.cos(Math.toRadians(this.getYRot() + 90)) * 0.4; double zOffset = Math.sin(Math.toRadians(this.getYRot() + 90)) * 0.4; passenger.setPos(this.getX() + xOffset, this.getY() + this.getPassengersRidingOffset() + passenger.getMyRidingOffset(), this.getZ() + zOffset); } } } MountSyncPacket package com.vals.valscraft.network; import com.vals.valscraft.entity.MountableWolfEntity; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class MountSyncPacket { private final boolean isMounted; public MountSyncPacket(boolean isMounted) { this.isMounted = isMounted; } public void encode(FriendlyByteBuf buffer) { buffer.writeBoolean(isMounted); } public static MountSyncPacket decode(FriendlyByteBuf buffer) { return new MountSyncPacket(buffer.readBoolean()); } public void handle(NetworkEvent.Context context) { context.enqueueWork(() -> { ServerPlayer player = context.getSender(); // Get the player from the context if (player != null) { // Verifies if the player has dismounted if (!isMounted) { Entity vehicle = player.getVehicle(); if (vehicle instanceof MountableWolfEntity wolf) { // Logic to remove the player as a passenger wolf.removePassenger(player); System.out.println("Server: Player " + player.getName().getString() + " is no longer mounted."); } } } }); context.setPacketHandled(true); // Marks the packet as handled } } networkHandler package com.vals.valscraft.network; import com.vals.valscraft.valscraft; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.simple.SimpleChannel; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class NetworkHandler { private static final String PROTOCOL_VERSION = "1"; public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel( new ResourceLocation(valscraft.MODID, "main"), () -> PROTOCOL_VERSION, PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals ); public static void init() { int packetId = 0; // Register the mount synchronization packet CHANNEL.registerMessage( packetId++, MountSyncPacket.class, MountSyncPacket::encode, MountSyncPacket::decode, (msg, context) -> msg.handle(context.get()) // Get the context with context.get() ); } }  
  • Topics

×
×
  • Create New...

Important Information

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