Jump to content

Greyscail

Members
  • Posts

    22
  • Joined

  • Last visited

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

Greyscail's Achievements

Tree Puncher

Tree Puncher (2/8)

0

Reputation

  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?
×
×
  • Create New...

Important Information

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