Skip to content

Commit

Permalink
Jars will now use the correct damage and enchantment modifiers of the…
Browse files Browse the repository at this point in the history
…ir contained item the striking and entity
  • Loading branch information
Sollace committed Aug 25, 2021
1 parent 4b40325 commit 171aa3b
Showing 1 changed file with 75 additions and 2 deletions.
77 changes: 75 additions & 2 deletions src/main/java/com/minelittlepony/unicopia/item/FilledJarItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,22 @@

import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.enchantment.Enchantments;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityGroup;
import net.minecraft.entity.EquipmentSlot;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.attribute.EntityAttributeInstance;
import net.minecraft.entity.attribute.EntityAttributes;
import net.minecraft.entity.damage.DamageSource;
import net.minecraft.item.ItemStack;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.ActionResult;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.WorldEvents;

public class FilledJarItem extends JarItem implements ChameleonItem {
Expand All @@ -37,21 +46,85 @@ public ActionResult onGroundTick(IItemEntity item) {

@Override
protected float getProjectileDamage(ItemStack stack) {
stack = getAppearanceStack(stack);
return 0;
}

@Override
public void onImpact(MagicProjectileEntity projectile, Entity entity) {
super.onImpact(projectile, entity);

if (!entity.isAttackable()) {
return;
}

ItemStack stack = getAppearanceStack(projectile.getStack());

boolean onFire = false;

float prevHealth = 0.0F;
int fire = EnchantmentHelper.getLevel(Enchantments.FIRE_ASPECT, stack);

if (entity instanceof LivingEntity) {
prevHealth = ((LivingEntity)entity).getHealth();

if (fire > 0 && !entity.isOnFire()) {
onFire = true;
entity.setOnFireFor(1);
}
}

float damage = EnchantmentHelper.getAttackDamage(stack, entity instanceof LivingEntity ? ((LivingEntity)entity).getGroup() : EntityGroup.DEFAULT);

EntityAttributeInstance instance = new EntityAttributeInstance(EntityAttributes.GENERIC_ATTACK_DAMAGE, i -> {});

stack.getAttributeModifiers(EquipmentSlot.MAINHAND).get(EntityAttributes.GENERIC_ATTACK_DAMAGE).forEach(modifier -> {
instance.addTemporaryModifier(modifier);
});

return (float)instance.getValue();
damage += instance.getValue();

if (entity.damage(DamageSource.thrownProjectile(projectile, projectile.getOwner()), damage)) {

int knockback = EnchantmentHelper.getLevel(Enchantments.KNOCKBACK, stack);

final float toRadians = (float)Math.PI / 180F;

if (entity instanceof LivingEntity) {
((LivingEntity)entity).takeKnockback(
knockback / 2F,
MathHelper.sin(projectile.getYaw() * toRadians),
-MathHelper.cos(projectile.getYaw() * toRadians)
);

if (fire > 0) {
entity.setOnFireFor(fire * 4);
}

float healthDiff = prevHealth - ((LivingEntity)entity).getHealth();

if (projectile.world instanceof ServerWorld && healthDiff > 2) {
((ServerWorld)projectile.world).spawnParticles(ParticleTypes.DAMAGE_INDICATOR, entity.getX(), entity.getBodyY(0.5D), entity.getZ(), (int)(healthDiff / 2F), 0.1, 0, 0.1, 0.2);
}
} else {
entity.addVelocity(
-MathHelper.sin(projectile.getYaw() * toRadians) * knockback / 2F, 0.1D,
MathHelper.cos(projectile.getYaw() * toRadians) * knockback / 2F
);
}
} else {
if (onFire) {
entity.setOnFire(false);
}
}
}

@Override
protected void onImpact(MagicProjectileEntity projectile) {
ItemStack stack = getAppearanceStack(projectile.getStack());
stack.damage(1, projectile.world.random, null);



projectile.dropStack(stack);
projectile.world.syncWorldEvent(WorldEvents.BLOCK_BROKEN, projectile.getBlockPos(), Block.getRawIdFromState(Blocks.GLASS.getDefaultState()));
}
Expand Down

0 comments on commit 171aa3b

Please sign in to comment.