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