Jump to content
Search In
  • More options...
Find results that contain...
Find results in...


  • Posts

  • Joined

  • Last visited

Everything posted by Greyscail

  1. just discovered RenderSpecificHandEvent and canceling that doesn't work either
  2. I've read several threads about this from older versions of forge but I just can't get this to work. I've tried stopping the animation in the AttackEntityEvent, MouseEvent, and PlayerInteractEvent but none of them seem to be able to stop the animation. I've tried: player.resetActiveHand(); player.swingProgressInt = -1; player.isSwingInProgress = true; I've even tried canceling the events right when they start but I can't stop that pesky attack animation no matter what I do. I've seen other threads say to override the onSwing method in your mod's item class but I want to cancel the attack animation for vanilla items so I'm absolutely lost. Is there a way to intercept the packet responsible for the attack animation?
  3. I still don't understand how I'm supposed to use a buffer to tell the server to run a function, at best I can use the buffer to indicate to the server what function to run... EDIT: actually hold on I got an idea
  4. Yea but from what I saw on the docs: public class ModMessage implements IMessage { public ModMessage() { } protected int code; public ModMessage(int code) { this.code = code; } @Override public void toBytes(ByteBuf buf) { buf.writeInt(code); } @Override public void fromBytes(ByteBuf buf) { code = buf.readInt(); } } The only thing I send as a message to the server is an integer...? I didn't know how to cal a function with just an integer and all that code is what I came up with
  5. I still don't get it, how is it mixed? The only line of code that I'm having issues with is: boolean isSuccessfulAttack = ((EntityLivingBase) target).attackEntityFrom(DamageSource.causePlayerDamage(player), damage); And I was told that it needed to be called from the server side. The way you're making it sound is like everything I wrote needs to be called from the server side. For one, the first class where the bulk of the code is, is my Event Handler so I couldn't make that server side even if I wanted to
  6. But I thought it wouldn't matter since that was all from before: AttackHandler.attackQueue.add(new Attack(player, minecraft.objectMouseOver.entityHit)); ExampleMod.INSTANCE.registerMessage(ModMessageHandler.class, ModMessage.class, ExampleMod.id++, Side.SERVER); ExampleMod.INSTANCE.sendToServer(new ModMessage(ModMessageHandler.DO_ATTACK)); I thought everything before that wouldn't matter
  7. public class ModEventHandler { private static final int LMB = 0, RMB = 1; private static enum WEAPON { ItemSword, ItemAxe } @SubscribeEvent public void dualWield(MouseEvent event) { if (event.isButtonstate()) { Minecraft minecraft = Minecraft.getMinecraft(); EntityPlayerSP player = minecraft.player; ItemStack mainhand = player.getHeldItem(EnumHand.MAIN_HAND); ItemStack offhand = player.getHeldItem(EnumHand.OFF_HAND); String primaryType = mainhand.getItem().getClass().getSimpleName(); String secondaryType = offhand.getItem().getClass().getSimpleName(); try { WEAPON.valueOf(primaryType); WEAPON.valueOf(secondaryType); } catch (IllegalArgumentException e) { return; } if (event.getButton() == RMB) { if (!minecraft.player.isRowingBoat()) { switch (minecraft.objectMouseOver.typeOfHit) { case ENTITY: // minecraft.playerController.attackEntity(player, // minecraft.objectMouseOver.entityHit); // minecraft.playerController.syncCurrentPlayItem(); if (minecraft.playerController.getCurrentGameType() != GameType.SPECTATOR) { AttackHandler.attackQueue.add(new Attack(player, minecraft.objectMouseOver.entityHit)); ExampleMod.INSTANCE.registerMessage(ModMessageHandler.class, ModMessage.class, ExampleMod.id++, Side.SERVER); ExampleMod.INSTANCE.sendToServer(new ModMessage(ModMessageHandler.DO_ATTACK)); } break; case BLOCK: BlockPos blockpos = minecraft.objectMouseOver.getBlockPos(); if (!minecraft.world.isAirBlock(blockpos)) { minecraft.playerController.clickBlock(blockpos, minecraft.objectMouseOver.sideHit); break; } case MISS: minecraft.player.resetCooldown(); net.minecraftforge.common.ForgeHooks.onEmptyLeftClick(player); } } player.setActiveHand(EnumHand.OFF_HAND); player.swingArm(EnumHand.OFF_HAND); } } } } public class ModMessageHandler implements IMessageHandler<ModMessage, IMessage> { public static final int DO_ATTACK = 0; @Override public IMessage onMessage(ModMessage message, MessageContext ctx) { EntityPlayerMP serverPlayer = ctx.getServerHandler().player; int code = message.code; serverPlayer.getServerWorld().addScheduledTask(() -> { switch (code) { case DO_ATTACK: AttackHandler.attack(); break; default: break; } }); return null; } } public class AttackHandler { public static final ArrayList<Attack> attackQueue = new ArrayList<Attack>(); public static void attack() { Attack attack = attackQueue.get(0); attack(attack.getAttacker(), attack.getAttacked()); attackQueue.remove(0); } public static void attack(EntityPlayer player, Entity target) { if (!net.minecraftforge.common.ForgeHooks.onPlayerAttackTarget(player, target)) return; if (target.canBeAttackedWithItem()) { if (!target.hitByEntity(player)) { float damage = (float) player.getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).getAttributeValue(); float enchantmentModifier; if (target instanceof EntityLivingBase) { enchantmentModifier = EnchantmentHelper.getModifierForCreature(player.getHeldItem(EnumHand.OFF_HAND), ((EntityLivingBase) target).getCreatureAttribute()); } else { enchantmentModifier = EnchantmentHelper.getModifierForCreature(player.getHeldItem(EnumHand.OFF_HAND), EnumCreatureAttribute.UNDEFINED); } float swingModifier = player.getCooledAttackStrength(0.5F); damage *= (0.2F + swingModifier * swingModifier * 0.8F); enchantmentModifier *= swingModifier; player.resetCooldown(); if (damage > 0.0F || enchantmentModifier > 0.0F) { boolean isFullSwing = swingModifier > 0.9F; boolean isKnockbackStrike = false; int knockbackLevel = EnchantmentHelper.getKnockbackModifier(player); if (player.isSprinting() && isFullSwing) { player.world.playSound((EntityPlayer) null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_PLAYER_ATTACK_KNOCKBACK, player.getSoundCategory(), 1.0F, 1.0F); ++knockbackLevel; isKnockbackStrike = true; } boolean isCriticalStrike = isFullSwing && player.fallDistance > 0.0F && !player.onGround && !player.isOnLadder() && !player.isInWater() && !player.isPotionActive(MobEffects.BLINDNESS) && !player.isRiding() && target instanceof EntityLivingBase; // isCriticalStrike = isCriticalStrike && !player.isSprinting(); isCriticalStrike &= !player.isSprinting(); net.minecraftforge.event.entity.player.CriticalHitEvent hitResult = net.minecraftforge.common.ForgeHooks.getCriticalHit(player, target, isCriticalStrike, isCriticalStrike ? 1.5F : 1.0F); isCriticalStrike = hitResult != null; if (isCriticalStrike) { damage *= hitResult.getDamageModifier(); } damage = damage + enchantmentModifier; boolean isSweepingStrike = false; double d0 = (double) (player.distanceWalkedModified - player.prevDistanceWalkedModified); if (isFullSwing && !isCriticalStrike && !isKnockbackStrike && player.onGround && d0 < (double) player.getAIMoveSpeed()) { ItemStack itemstack = player.getHeldItem(EnumHand.OFF_HAND); if (itemstack.getItem() instanceof ItemSword) { isSweepingStrike = true; } } float targetHealth = 0.0F; boolean hasSetFire = false; int fireaspectModifier = EnchantmentHelper.getFireAspectModifier(player); if (target instanceof EntityLivingBase) { targetHealth = ((EntityLivingBase) target).getHealth(); if (fireaspectModifier > 0 && !target.isBurning()) { hasSetFire = true; target.setFire(1); } } double d1 = target.motionX; double d2 = target.motionY; double d3 = target.motionZ; if (target.getEntityWorld().isRemote) { System.out.println("CLIENT"); } if (!target.getEntityWorld().isRemote) { System.out.println("SERVER"); } boolean isSuccessfulAttack = ((EntityLivingBase) target).attackEntityFrom(DamageSource.causePlayerDamage(player), damage); target.performHurtAnimation(); if (isSuccessfulAttack) { if (knockbackLevel > 0) { if (target instanceof EntityLivingBase) { ((EntityLivingBase) target).knockBack(player, (float) knockbackLevel * 0.5F, (double) MathHelper.sin(player.rotationYaw * 0.017453292F), (double) (-MathHelper.cos(player.rotationYaw * 0.017453292F))); } else { target.addVelocity((double) (-MathHelper.sin(player.rotationYaw * 0.017453292F) * (float) knockbackLevel * 0.5F), 0.1D, (double) (MathHelper.cos(player.rotationYaw * 0.017453292F) * (float) knockbackLevel * 0.5F)); } player.motionX *= 0.6D; player.motionZ *= 0.6D; player.setSprinting(false); } if (isSweepingStrike) { float areaDamage = 1.0F + EnchantmentHelper.getSweepingDamageRatio(player) * damage; for (EntityLivingBase entitylivingbase : player.world.getEntitiesWithinAABB(EntityLivingBase.class, target.getEntityBoundingBox().grow(1.0D, 0.25D, 1.0D))) { if (entitylivingbase != player && entitylivingbase != target && !player.isOnSameTeam(entitylivingbase) && player.getDistanceSqToEntity(entitylivingbase) < 9.0D) { entitylivingbase.knockBack(player, 0.4F, (double) MathHelper.sin(player.rotationYaw * 0.017453292F), (double) (-MathHelper.cos(player.rotationYaw * 0.017453292F))); entitylivingbase.attackEntityFrom(DamageSource.causePlayerDamage(player), areaDamage); } } player.world.playSound((EntityPlayer) null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_PLAYER_ATTACK_SWEEP, player.getSoundCategory(), 1.0F, 1.0F); player.spawnSweepParticles(); } if (target instanceof EntityPlayerMP && target.velocityChanged) { ((EntityPlayerMP) target).connection.sendPacket(new SPacketEntityVelocity(target)); target.velocityChanged = false; target.motionX = d1; target.motionY = d2; target.motionZ = d3; } if (isCriticalStrike) { player.world.playSound((EntityPlayer) null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_PLAYER_ATTACK_CRIT, player.getSoundCategory(), 1.0F, 1.0F); player.onCriticalHit(target); } if (!isCriticalStrike && !isSweepingStrike) { if (isFullSwing) { player.world.playSound((EntityPlayer) null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_PLAYER_ATTACK_STRONG, player.getSoundCategory(), 1.0F, 1.0F); } else { player.world.playSound((EntityPlayer) null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_PLAYER_ATTACK_WEAK, player.getSoundCategory(), 1.0F, 1.0F); } } if (enchantmentModifier > 0.0F) { player.onEnchantmentCritical(target); } player.setLastAttackedEntity(target); if (target instanceof EntityLivingBase) { EnchantmentHelper.applyThornEnchantments((EntityLivingBase) target, player); } EnchantmentHelper.applyArthropodEnchantments(player, target); ItemStack weapon = player.getHeldItem(EnumHand.OFF_HAND); Entity entity = target; if (target instanceof MultiPartEntityPart) { IEntityMultiPart ientitymultipart = ((MultiPartEntityPart) target).parent; if (ientitymultipart instanceof EntityLivingBase) { entity = (EntityLivingBase) ientitymultipart; } } if (!weapon.isEmpty() && entity instanceof EntityLivingBase) { ItemStack beforeHitCopy = weapon.copy(); weapon.hitEntity((EntityLivingBase) entity, player); if (weapon.isEmpty()) { net.minecraftforge.event.ForgeEventFactory.onPlayerDestroyItem(player, beforeHitCopy, EnumHand.OFF_HAND); player.setHeldItem(EnumHand.OFF_HAND, ItemStack.EMPTY); } } if (target instanceof EntityLivingBase) { float f5 = targetHealth - ((EntityLivingBase) target).getHealth(); player.addStat(StatList.DAMAGE_DEALT, Math.round(f5 * 10.0F)); if (fireaspectModifier > 0) { target.setFire(fireaspectModifier * 4); } if (player.world instanceof WorldServer && f5 > 2.0F) { int k = (int) ((double) f5 * 0.5D); ((WorldServer) player.world).spawnParticle(EnumParticleTypes.DAMAGE_INDICATOR, target.posX, target.posY + (double) (target.height * 0.5F), target.posZ, k, 0.1D, 0.0D, 0.1D, 0.2D); } } player.addExhaustion(0.1F); } else { player.world.playSound((EntityPlayer) null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_PLAYER_ATTACK_NODAMAGE, player.getSoundCategory(), 1.0F, 1.0F); if (hasSetFire) { target.extinguish(); } } } } } } public static class Attack { EntityPlayer attacker; Entity attacked; public Attack(EntityPlayer attacker, Entity attacked) { this.attacker = attacker; this.attacked = attacked; } public EntityPlayer getAttacker() { return attacker; } public Entity getAttacked() { return attacked; } } } @Differentiation Erm that's my code I really don't know what's wrong...
  8. Erm, well you could call it a force of habit. At least in my mind it functions as a static method even though it doesn't make a difference
  9. Yea it's a boolean, and I'm hesitant to show all of my code because it'd be a huge mess with how spread out it is. And yea, it definitely says client side using the method showed me which is annoying because I'm certain I set the message system up properly and it definitely says Server Thread when I ran: System.out.println(Thread.currentThread().getName());
  10. Ok I've set all that up and works to an extent except the problem hasn't been solved, I have: boolean isSuccessfulAttack = target.attackEntityFrom(DamageSource.causePlayerDamage(player), damage); System.out.println(Thread.currentThread().getName()); And the console says Server Thread but target.attackEntiityFrom() still returns false
  11. hehe, I'm just more of a learn by example type of person rather than the type to dig through an instruction manual, had I ever seen packets being used then I'd have probably figured that out sooner
  12. I have this for my Event Handler class: public class ModEventHandler { @SubscribeEvent public static void dualWield(MouseEvent event) { // bunch of code boolean isSuccessfulAttack = target.attackEntityFrom(DamageSource.causePlayerDamage(player), damage); // bunch of code } } Registered as follows: @EventHandler public void preInit(FMLInitializationEvent event) { MinecraftForge.EVENT_BUS.register(ModEventHandler.class); } Where I've basically copied the code minecraft uses when you left click except I've altered it to allow attacking with the offhand weapon. My issue is that the line of code responsible for actually doing the damage seemingly only works when called from the server side. I have no clue how to remedy this, I've tried putting: public class ModEventHandler { @SideOnly(Side.SERVER) @SubscribeEvent public static void dualWield(MouseEvent event) { // bunch of code boolean isSuccessfulAttack = target.attackEntityFrom(DamageSource.causePlayerDamage(player), damage); // bunch of code } } But that just crashes. The issue I'm having is how should I call something from the server if it is running in my Event Handler?
  13. I think I'm having a similar problem, I'm trying to do: boolean isSuccessfulAttack = target.attackEntityFrom(DamageSource.causePlayerDamage(player), damage); But that doesn't work. Then I read this thread and thought it might work if I call it from the server but I don't know how to do that, I tried: boolean isSuccessfulAttack = Minecraft.getMinecraft().getIntegratedServer().getEntityFromUuid(target.getUniqueID()).attackEntityFrom(DamageSource.causePlayerDamage(player), damage); But that doesn't work either. I know about client side and server side and I have my proxies setup but I'm trying to do this in my event handler class so what should I do?
  14. @diesieben07 I got it to where the offhand is swung, is there a simple command in the api to simulate the player attacking? Like, a function I could call that makes the character attack forward without actually clicking the attack key
  15. Solution!! Replace: player.swingArm(EnumHand.OFF_HAND); with: player.setActiveHand(EnumHand.OFF_HAND); player.swingArm(EnumHand.OFF_HAND);
  16. I see, I've noticed under EntitiyPlayerSP there's two commands, namely resetActiveHand() and stopActiveHand(), I haven't gotten either of them to work like I thought they would.. Any ideas? or is this truly not possible?
  17. Thanks for pointing that out but it still didn't solve my issue, I think it's that swinging the offhand conflicts with the default attacking animation if they happen simultaneously.
  18. So I tried binding it to the right mouse button instead and that works, so I guess having the offhand arm swinging conflicts with the mainhand arm swinging during an attack. Is there a way to prevent the mainhand arm from swinging during an attack?
  19. I've literally tried everything, I don't get any errors and the function just doesn't work like it's supposed to. private static final int LMB = 0, RMB = 1; @SubscribeEvent public static void dualWield(MouseEvent event) { if (event.getButton() == LMB) { EntityPlayerSP player = Minecraft.getMinecraft().player; ItemStack mainhand = player.getHeldItemMainhand(); ItemStack offhand = player.getHeldItemOffhand(); if (offhand.getItem() instanceof ItemSword) { if (mainhand.getItem() instanceof ItemSword) { player.swingArm(EnumHand.OFF_HAND); } else { // player.setHeldItem(EnumHand.MAIN_HAND, offhand); // player.setHeldItem(EnumHand.OFF_HAND, mainhand); } } else { return; } } } When in game and I have a sword in my mainhand and offhand and attack it very rarely swings the sword in the offhand. If it didn't work at all then I'd think my code was wrong but it works rarely and even when I simplify it to be: private static final int LMB = 0, RMB = 1; @SubscribeEvent public static void dualWield(MouseEvent event) { if (event.getButton() == LMB) { EntityPlayerSP player = Minecraft.getMinecraft().player; oplayer.swingarm(EnumHand.OFF_HAND); } } It still only works when it wants to.
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.