simplebunsen
Members-
Posts
11 -
Joined
-
Last visited
Everything posted by simplebunsen
-
So I want to have an armor item with a chance to get damaged on each tick while a certain condition is met. I can't use the PlayerEntity as ServerPlayerEntity though, since there is the following error: Net.minecraft.client.entity.player.ClientPlayerEntity cannot be cast to net.minecraft.entity.player.ServerPlayerEntity I suspect that it has do do something with sidedness, but can't wrap my head around how, since if I add an @OnlyIn Server Annotation, the Jump Boost doesn't seem to get applied clientside and isn't functionally there (desync?) How do I actually get the ServerPlayerEntity out of this event? @Override public void onArmorTick(ItemStack stack, World world, PlayerEntity player) { player.addPotionEffect(new EffectInstance(Effects.JUMP_BOOST, 0, 4, false, false, false)); if (chance && condition) { stack.attemptDamageItem(1, world.getRandom(), (ServerPlayerEntity) player); } }
-
I really forgot it huh ?♂️ Well it applies the effect more or less as expected on jumping, but the other thing doesn't take it away again at all. This all is in the class public class JumpBootsItem extends ArmorItem which is added to the forge event bus in the main mod method. Not sure if that's relevant.
-
So I went to solve the problem using the Modifiers.. Firstly I have no clue how to do Reflections, I'm not a Java Master yet ? So I used onGround. public void onArmorTick(ItemStack stack, World world, PlayerEntity player) { player.addPotionEffect(new EffectInstance(Effects.JUMP_BOOST, 0, 4, false, false, false)); if (!player.getAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).hasModifier(movementSpeed)) { if (slot == EquipmentSlotType.FEET && stack.getItem() == this && !player.onGround) { player.getAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).applyModifier(movementSpeed); LOGGER.fatal("I am NOT ON GROUND, speed should and has change"); //SPEED is applied (two times in game, maybe due to lack of checks for sidedness? how to do?) } } } @SubscribeEvent public static void onTickEvent(TickEvent.PlayerTickEvent event) { if (event.player.onGround && event.player.getAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).hasModifier(movementSpeed)){ event.player.getAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).removeModifier(movementSpeed); LOGGER.fatal("Stopped being in the air etc, speed back to normal"); } } No idea what I'm doing wrong, could you give me some pointers yet again, please?
-
Thanks for answering, I will try to implement this with my limited knowledge ? Would it be sufficient to apply the modifier in the onArmorTick class, since it only really needs to be checked when I have the armor on. Also, how to apply the modifier? Should I put and remove from the Multimap provided by getAttributeModifiers?
-
Thanks for replying, I wanted to use space bar so the player had agency over whether or not he actually wanted to continue jumping and receiving faster movement. I will use the second suggestion, but really that's beside the point as the problem I'm having concerns the AttributeModifier not changing properly. Do you know anything about that?
-
So I want to have an item that has Jump Boost when equipped (already working), and I want the movement speed to be faster in the air. Therefore, I want to change the Attribute Modifiers of my ArmorItem programatically, and at runtime. The code below doesn't produce the expected outcome of only applying the speedup when the player holds the space key, instead it only even seems to fire if I hover directly on the item in my armor slot, pressing the space bar. public class JumpBootsItem extends ArmorItem { private AttributeModifier movementSpeed = new AttributeModifier("JumpBootsMovementSpeedModifier", 1, Operation.MULTIPLY_TOTAL); public Minecraft mc = Minecraft.getInstance(); @Override public Multimap<String, AttributeModifier> getAttributeModifiers(EquipmentSlotType slot, ItemStack stack) { Multimap<String, AttributeModifier> output = super.getAttributeModifiers(slot, stack); if (slot == EquipmentSlotType.FEET && stack.getItem().equals(this) && InputMappings.isKeyDown(mc.getMainWindow().getHandle(), mc.gameSettings.keyBindJump.getKey().getKeyCode())) { output.put(SharedMonsterAttributes.MOVEMENT_SPEED.getName(), this.movementSpeed); LOGGER.fatal("I am holding jump, speed should change"); } return output; } How to actually implement what I'm trying to do? Should I maybe instead try to simply add a "clone" of the item with the speed boost applied, then silently change it in the armor slot once the space bar is pressed? Thanks for replies!