Merge pull request #1138 from SuicidalSteve/mc1.15/dev

[Bugfix] Make omnidirectional entity crushing more consistent.
This commit is contained in:
simibubi 2021-03-03 16:23:46 +01:00 committed by GitHub
commit 325ca68917
Failed to generate hash of commit
2 changed files with 28 additions and 9 deletions

View file

@ -20,6 +20,7 @@ import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.item.ItemEntity;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@ -199,12 +200,25 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity {
return; return;
if (!(processingEntity instanceof ItemEntity)) { if (!(processingEntity instanceof ItemEntity)) {
Vec3d entityOutPos = outPos.add(facing.getAxis() == Axis.X ? .5f * offset : 0f
, facing.getAxis() == Axis.Y ? .5f * offset : 0f
, facing.getAxis() == Axis.Z ? .5f * offset : 0f);
int crusherDamage = AllConfigs.SERVER.kinetics.crushingDamage.get();
if (processingEntity instanceof LivingEntity) {
if ((((LivingEntity) processingEntity).getHealth() - crusherDamage <= 0) //Takes LivingEntity instances as exception, so it can move them before it would kill them.
&& (((LivingEntity) processingEntity).hurtTime <= 0)) { //This way it can actually output the items to the right spot.
processingEntity.setPosition(entityOutPos.x
, entityOutPos.y
, entityOutPos.z);
}
}
processingEntity.attackEntityFrom(CrushingWheelTileEntity.damageSource, processingEntity.attackEntityFrom(CrushingWheelTileEntity.damageSource,
AllConfigs.SERVER.kinetics.crushingDamage.get()); crusherDamage);
if (!processingEntity.isAlive()) { if (!processingEntity.isAlive()) {
processingEntity.setPosition(outPos.x + (facing.getAxis() == Axis.X ? .75f * offset : 0f) //This is supposed to move the mobs to the output location processingEntity.setPosition(entityOutPos.x
, outPos.y + (facing.getAxis() == Axis.Y ? .75f * offset : 0f) //So the item drops end up on the other end , entityOutPos.y
, outPos.z + (facing.getAxis() == Axis.Z ? .75f * offset : 0f)); //This, however, does not currently work consistently for non-downwards crushers. , entityOutPos.z);
} }
return; return;
} }

View file

@ -3,11 +3,13 @@ package com.simibubi.create.content.contraptions.components.crusher;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.DamageSource; import net.minecraft.util.DamageSource;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.AxisAlignedBB;
import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraft.util.math.Vec3d;
import net.minecraftforge.event.entity.living.LivingDropsEvent;
import net.minecraftforge.event.entity.living.LootingLevelEvent; import net.minecraftforge.event.entity.living.LootingLevelEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@ -50,14 +52,17 @@ public class CrushingWheelTileEntity extends KineticTileEntity {
public static void crushingIsFortunate(LootingLevelEvent event) { public static void crushingIsFortunate(LootingLevelEvent event) {
if (event.getDamageSource() != damageSource) if (event.getDamageSource() != damageSource)
return; return;
event.setLootingLevel(2); event.setLootingLevel(2); //This does not currently increase mob drops. It seems like this only works for damage done by an entity.
} }
@SubscribeEvent @SubscribeEvent
public static void crushingTeleportsEntities(LivingDeathEvent event) { public static void handleCrushedMobDrops(LivingDropsEvent event) {
if (event.getSource() != damageSource) if (event.getSource() != CrushingWheelTileEntity.damageSource)
return; return;
event.getEntity().setPos(event.getEntity().getX(), Math.floor(event.getEntity().getY()) - .5f, event.getEntity().getZ()); Vec3d outSpeed = Vec3d.ZERO;
for (ItemEntity outputItem : event.getDrops()) {
outputItem.setMotion(outSpeed);
}
} }
} }