mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-12-29 08:27:03 +01:00
Merge pull request #1138 from SuicidalSteve/mc1.15/dev
[Bugfix] Make omnidirectional entity crushing more consistent.
This commit is contained in:
commit
325ca68917
2 changed files with 28 additions and 9 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue