mirror of
https://github.com/Creators-of-Create/Create.git
synced 2025-02-13 22:05:01 +01:00
Fixes and tweaks
- Add #create:blaze_burner_capturable entity type tag - Make it so blocks that do not implement IWrenchable and that are tagged can only be picked up with a wrench while sneaking - Fix AnalogLeverInstance not rendering indicator on 1.18 and 1.19 and rendering indicator at wrong place in 1.20 - Change AirCurrent entity distance calculation to fix issues with some items not being processed - Simplify AirCurrent max VoxelShape depth calculation by using min and max instead of raycasting - Fix pipe cobblestone generation - Fix vertical smart observers outputting redstone signal from wrong sides - Fix smart observer using wrong bottom texture
This commit is contained in:
parent
26c9af50a7
commit
8bf42ffa6f
22 changed files with 135 additions and 114 deletions
|
@ -5340,6 +5340,7 @@ ad8fa04f7bbbafd70d0ce158af78a35e899301e2 data/create/tags/blocks/tracks.json
|
||||||
50936b211d94167a35ec78c89954082a336b6269 data/create/tags/blocks/valve_handles.json
|
50936b211d94167a35ec78c89954082a336b6269 data/create/tags/blocks/valve_handles.json
|
||||||
eac71740fb12bdb38b5dfaa2268613d7ba82b809 data/create/tags/blocks/windmill_sails.json
|
eac71740fb12bdb38b5dfaa2268613d7ba82b809 data/create/tags/blocks/windmill_sails.json
|
||||||
9851b3bef451f326ef322a31f85b9a970859590d data/create/tags/blocks/wrench_pickup.json
|
9851b3bef451f326ef322a31f85b9a970859590d data/create/tags/blocks/wrench_pickup.json
|
||||||
|
cf85bc6b8b9d3fe2baf408731225de9c050763b8 data/create/tags/entity_types/blaze_burner_capturable.json
|
||||||
74700d556ca80c7a1db5fd4efb09c3ddb26cad66 data/create/tags/entity_types/ignore_seat.json
|
74700d556ca80c7a1db5fd4efb09c3ddb26cad66 data/create/tags/entity_types/ignore_seat.json
|
||||||
a8bdc387cfa6296ebcc4af14323e2ddb632234dc data/create/tags/fluids/bottomless/allow.json
|
a8bdc387cfa6296ebcc4af14323e2ddb632234dc data/create/tags/fluids/bottomless/allow.json
|
||||||
74700d556ca80c7a1db5fd4efb09c3ddb26cad66 data/create/tags/fluids/bottomless/deny.json
|
74700d556ca80c7a1db5fd4efb09c3ddb26cad66 data/create/tags/fluids/bottomless/deny.json
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"replace": false,
|
||||||
|
"values": [
|
||||||
|
"minecraft:blaze"
|
||||||
|
]
|
||||||
|
}
|
|
@ -92,7 +92,6 @@ import com.simibubi.create.foundation.networking.SimplePacketBase;
|
||||||
import com.simibubi.create.foundation.utility.ServerSpeedProvider;
|
import com.simibubi.create.foundation.utility.ServerSpeedProvider;
|
||||||
import com.simibubi.create.infrastructure.command.HighlightPacket;
|
import com.simibubi.create.infrastructure.command.HighlightPacket;
|
||||||
import com.simibubi.create.infrastructure.command.SConfigureConfigPacket;
|
import com.simibubi.create.infrastructure.command.SConfigureConfigPacket;
|
||||||
|
|
||||||
import com.simibubi.create.infrastructure.debugInfo.ServerDebugInfoPacket;
|
import com.simibubi.create.infrastructure.debugInfo.ServerDebugInfoPacket;
|
||||||
|
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
|
|
@ -285,6 +285,7 @@ public class AllTags {
|
||||||
|
|
||||||
public enum AllEntityTags {
|
public enum AllEntityTags {
|
||||||
|
|
||||||
|
BLAZE_BURNER_CAPTURABLE,
|
||||||
IGNORE_SEAT,
|
IGNORE_SEAT,
|
||||||
|
|
||||||
;
|
;
|
||||||
|
@ -318,9 +319,12 @@ public class AllTags {
|
||||||
this.alwaysDatagen = alwaysDatagen;
|
this.alwaysDatagen = alwaysDatagen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean matches(EntityType<?> type) {
|
||||||
|
return type.is(tag);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean matches(Entity entity) {
|
public boolean matches(Entity entity) {
|
||||||
return entity.getType()
|
return matches(entity.getType());
|
||||||
.is(tag);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void init() {}
|
private static void init() {}
|
||||||
|
|
|
@ -9,7 +9,7 @@ import net.minecraft.world.level.material.Fluid;
|
||||||
import net.minecraftforge.eventbus.api.Event;
|
import net.minecraftforge.eventbus.api.Event;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This Event is fired when a two fluids meet in a pipe ({@link Flow})<br>
|
* This Event is fired when two fluids meet in a pipe ({@link Flow})<br>
|
||||||
* or when a fluid in a pipe meets with a fluid in the world
|
* or when a fluid in a pipe meets with a fluid in the world
|
||||||
* ({@link Spill}).<br>
|
* ({@link Spill}).<br>
|
||||||
* <br>
|
* <br>
|
||||||
|
|
|
@ -46,7 +46,7 @@ public class WrenchItem extends Item {
|
||||||
Block block = state.getBlock();
|
Block block = state.getBlock();
|
||||||
|
|
||||||
if (!(block instanceof IWrenchable)) {
|
if (!(block instanceof IWrenchable)) {
|
||||||
if (canWrenchPickup(state))
|
if (player.isShiftKeyDown() && canWrenchPickup(state))
|
||||||
return onItemUseOnOther(context);
|
return onItemUseOnOther(context);
|
||||||
return super.useOn(context);
|
return super.useOn(context);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ import net.minecraft.world.level.material.Fluid;
|
||||||
import net.minecraft.world.level.material.FluidState;
|
import net.minecraft.world.level.material.FluidState;
|
||||||
import net.minecraft.world.level.material.Fluids;
|
import net.minecraft.world.level.material.Fluids;
|
||||||
import net.minecraftforge.common.MinecraftForge;
|
import net.minecraftforge.common.MinecraftForge;
|
||||||
|
import net.minecraftforge.eventbus.api.EventPriority;
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
import net.minecraftforge.fluids.FluidStack;
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
|
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
|
||||||
|
@ -36,7 +37,7 @@ public class FluidReactions {
|
||||||
level.setBlockAndUpdate(pos, event.getState());
|
level.setBlockAndUpdate(pos, event.getState());
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent(priority = EventPriority.HIGH)
|
||||||
public static void handlePipeFlowCollisionFallback(PipeCollisionEvent.Flow event) {
|
public static void handlePipeFlowCollisionFallback(PipeCollisionEvent.Flow event) {
|
||||||
Fluid f1 = event.getFirstFluid();
|
Fluid f1 = event.getFirstFluid();
|
||||||
Fluid f2 = event.getSecondFluid();
|
Fluid f2 = event.getSecondFluid();
|
||||||
|
@ -67,7 +68,7 @@ public class FluidReactions {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent(priority = EventPriority.HIGH)
|
||||||
public static void handlePipeSpillCollisionFallback(PipeCollisionEvent.Spill event) {
|
public static void handlePipeSpillCollisionFallback(PipeCollisionEvent.Spill event) {
|
||||||
Fluid pf = event.getPipeFluid();
|
Fluid pf = event.getPipeFluid();
|
||||||
Fluid wf = event.getWorldFluid();
|
Fluid wf = event.getWorldFluid();
|
||||||
|
@ -78,7 +79,7 @@ public class FluidReactions {
|
||||||
event.setState(Blocks.COBBLESTONE.defaultBlockState());
|
event.setState(Blocks.COBBLESTONE.defaultBlockState());
|
||||||
} else if (pf == Fluids.LAVA && wf == Fluids.WATER) {
|
} else if (pf == Fluids.LAVA && wf == Fluids.WATER) {
|
||||||
event.setState(Blocks.STONE.defaultBlockState());
|
event.setState(Blocks.STONE.defaultBlockState());
|
||||||
} else if (pf == Fluids.LAVA && wf == Fluids.FLOWING_LAVA) {
|
} else if (pf == Fluids.LAVA && wf == Fluids.FLOWING_WATER) {
|
||||||
event.setState(Blocks.COBBLESTONE.defaultBlockState());
|
event.setState(Blocks.COBBLESTONE.defaultBlockState());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,9 +32,7 @@ import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.phys.AABB;
|
import net.minecraft.world.phys.AABB;
|
||||||
import net.minecraft.world.phys.BlockHitResult;
|
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
|
||||||
import net.minecraft.world.phys.shapes.Shapes;
|
import net.minecraft.world.phys.shapes.Shapes;
|
||||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
import net.minecraftforge.api.distmarker.Dist;
|
||||||
|
@ -62,21 +60,20 @@ public class AirCurrent {
|
||||||
if (direction == null)
|
if (direction == null)
|
||||||
rebuild();
|
rebuild();
|
||||||
Level world = source.getAirCurrentWorld();
|
Level world = source.getAirCurrentWorld();
|
||||||
Direction facing = direction;
|
|
||||||
if (world != null && world.isClientSide) {
|
if (world != null && world.isClientSide) {
|
||||||
float offset = pushing ? 0.5f : maxDistance + .5f;
|
float offset = pushing ? 0.5f : maxDistance + .5f;
|
||||||
Vec3 pos = VecHelper.getCenterOf(source.getAirCurrentPos())
|
Vec3 pos = VecHelper.getCenterOf(source.getAirCurrentPos())
|
||||||
.add(Vec3.atLowerCornerOf(facing.getNormal())
|
.add(Vec3.atLowerCornerOf(direction.getNormal())
|
||||||
.scale(offset));
|
.scale(offset));
|
||||||
if (world.random.nextFloat() < AllConfigs.client().fanParticleDensity.get())
|
if (world.random.nextFloat() < AllConfigs.client().fanParticleDensity.get())
|
||||||
world.addParticle(new AirFlowParticleData(source.getAirCurrentPos()), pos.x, pos.y, pos.z, 0, 0, 0);
|
world.addParticle(new AirFlowParticleData(source.getAirCurrentPos()), pos.x, pos.y, pos.z, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
tickAffectedEntities(world, facing);
|
tickAffectedEntities(world);
|
||||||
tickAffectedHandlers();
|
tickAffectedHandlers();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void tickAffectedEntities(Level world, Direction facing) {
|
protected void tickAffectedEntities(Level world) {
|
||||||
for (Iterator<Entity> iterator = caughtEntities.iterator(); iterator.hasNext();) {
|
for (Iterator<Entity> iterator = caughtEntities.iterator(); iterator.hasNext();) {
|
||||||
Entity entity = iterator.next();
|
Entity entity = iterator.next();
|
||||||
if (!entity.isAlive() || !entity.getBoundingBox()
|
if (!entity.isAlive() || !entity.getBoundingBox()
|
||||||
|
@ -85,14 +82,14 @@ public class AirCurrent {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec3 center = VecHelper.getCenterOf(source.getAirCurrentPos());
|
Vec3i flow = (pushing ? direction : direction.getOpposite()).getNormal();
|
||||||
Vec3i flow = (pushing ? facing : facing.getOpposite()).getNormal();
|
|
||||||
|
|
||||||
float sneakModifier = entity.isShiftKeyDown() ? 4096f : 512f;
|
|
||||||
float speed = Math.abs(source.getSpeed());
|
float speed = Math.abs(source.getSpeed());
|
||||||
double entityDistance = entity.position()
|
float sneakModifier = entity.isShiftKeyDown() ? 4096f : 512f;
|
||||||
.distanceTo(center);
|
double entityDistance = VecHelper.alignedDistanceToFace(entity.position(), source.getAirCurrentPos(), direction);
|
||||||
float acceleration = (float) (speed / sneakModifier / (entityDistance / maxDistance));
|
// entityDistanceOld should be removed eventually. Remember that entityDistanceOld cannot be 0 while entityDistance can,
|
||||||
|
// so division by 0 must be avoided.
|
||||||
|
double entityDistanceOld = entity.position().distanceTo(VecHelper.getCenterOf(source.getAirCurrentPos()));
|
||||||
|
float acceleration = (float) (speed / sneakModifier / (entityDistanceOld / maxDistance));
|
||||||
Vec3 previousMotion = entity.getDeltaMovement();
|
Vec3 previousMotion = entity.getDeltaMovement();
|
||||||
float maxAcceleration = 5;
|
float maxAcceleration = 5;
|
||||||
|
|
||||||
|
@ -108,7 +105,6 @@ public class AirCurrent {
|
||||||
if (entity instanceof ServerPlayer)
|
if (entity instanceof ServerPlayer)
|
||||||
((ServerPlayer) entity).connection.aboveGroundTickCount = 0;
|
((ServerPlayer) entity).connection.aboveGroundTickCount = 0;
|
||||||
|
|
||||||
entityDistance -= .5f;
|
|
||||||
FanProcessingType processingType = getTypeAt((float) entityDistance);
|
FanProcessingType processingType = getTypeAt((float) entityDistance);
|
||||||
|
|
||||||
if (processingType == AllFanProcessingTypes.NONE)
|
if (processingType == AllFanProcessingTypes.NONE)
|
||||||
|
@ -229,57 +225,75 @@ public class AirCurrent {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static float getFlowLimit(Level world, BlockPos start, float max, Direction facing) {
|
public static float getFlowLimit(Level world, BlockPos start, float max, Direction facing) {
|
||||||
Vec3 directionVec = Vec3.atLowerCornerOf(facing.getNormal());
|
for (int i = 0; i < max; i++) {
|
||||||
Vec3 planeVec = VecHelper.axisAlingedPlaneOf(directionVec);
|
BlockPos currentPos = start.relative(facing, i + 1);
|
||||||
|
if (!world.isLoaded(currentPos)) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
// 4 Rays test for holes in the shapes blocking the flow
|
|
||||||
float offsetDistance = .25f;
|
|
||||||
Vec3[] offsets = new Vec3[] { planeVec.multiply(offsetDistance, offsetDistance, offsetDistance),
|
|
||||||
planeVec.multiply(-offsetDistance, -offsetDistance, offsetDistance),
|
|
||||||
planeVec.multiply(offsetDistance, -offsetDistance, -offsetDistance),
|
|
||||||
planeVec.multiply(-offsetDistance, offsetDistance, -offsetDistance), };
|
|
||||||
|
|
||||||
float limitedDistance = 0;
|
|
||||||
|
|
||||||
// Determine the distance of the air flow
|
|
||||||
Outer: for (int i = 1; i <= max; i++) {
|
|
||||||
BlockPos currentPos = start.relative(facing, i);
|
|
||||||
if (!world.isLoaded(currentPos))
|
|
||||||
break;
|
|
||||||
BlockState state = world.getBlockState(currentPos);
|
BlockState state = world.getBlockState(currentPos);
|
||||||
BlockState copycatState = CopycatBlock.getMaterial(world, currentPos);
|
BlockState copycatState = CopycatBlock.getMaterial(world, currentPos);
|
||||||
if (shouldAlwaysPass(copycatState.isAir() ? state : copycatState))
|
if (shouldAlwaysPass(copycatState.isAir() ? state : copycatState)) {
|
||||||
continue;
|
continue;
|
||||||
VoxelShape voxelshape = state.getCollisionShape(world, currentPos, CollisionContext.empty());
|
|
||||||
if (voxelshape.isEmpty())
|
|
||||||
continue;
|
|
||||||
if (voxelshape == Shapes.block()) {
|
|
||||||
max = i - 1;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Vec3 offset : offsets) {
|
VoxelShape shape = state.getCollisionShape(world, currentPos);
|
||||||
Vec3 rayStart = VecHelper.getCenterOf(currentPos)
|
if (shape.isEmpty()) {
|
||||||
.subtract(directionVec.scale(.5f + 1 / 32f))
|
continue;
|
||||||
.add(offset);
|
|
||||||
Vec3 rayEnd = rayStart.add(directionVec.scale(1 + 1 / 32f));
|
|
||||||
BlockHitResult blockraytraceresult =
|
|
||||||
world.clipWithInteractionOverride(rayStart, rayEnd, currentPos, voxelshape, state);
|
|
||||||
if (blockraytraceresult == null)
|
|
||||||
continue Outer;
|
|
||||||
|
|
||||||
double distance = i - 1 + blockraytraceresult.getLocation()
|
|
||||||
.distanceTo(rayStart);
|
|
||||||
if (limitedDistance < distance)
|
|
||||||
limitedDistance = (float) distance;
|
|
||||||
}
|
}
|
||||||
|
if (shape == Shapes.block()) {
|
||||||
max = limitedDistance;
|
return i;
|
||||||
break;
|
}
|
||||||
|
double shapeDepth = findMaxDepth(shape, facing);
|
||||||
|
if (shapeDepth == Double.POSITIVE_INFINITY) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return Math.min((float) (i + shapeDepth + 1/32d), max);
|
||||||
}
|
}
|
||||||
|
|
||||||
return max;
|
return max;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final double[][] DEPTH_TEST_COORDINATES = {
|
||||||
|
{ 0.25, 0.25 },
|
||||||
|
{ 0.25, 0.75 },
|
||||||
|
{ 0.5, 0.5 },
|
||||||
|
{ 0.75, 0.25 },
|
||||||
|
{ 0.75, 0.75 }
|
||||||
|
};
|
||||||
|
|
||||||
|
// Finds the maximum depth of the shape when traveling in the given direction.
|
||||||
|
// The result is always positive.
|
||||||
|
// If there is a hole, the result will be Double.POSITIVE_INFINITY.
|
||||||
|
private static double findMaxDepth(VoxelShape shape, Direction direction) {
|
||||||
|
Direction.Axis axis = direction.getAxis();
|
||||||
|
Direction.AxisDirection axisDirection = direction.getAxisDirection();
|
||||||
|
double maxDepth = 0;
|
||||||
|
|
||||||
|
for (double[] coordinates : DEPTH_TEST_COORDINATES) {
|
||||||
|
double depth;
|
||||||
|
if (axisDirection == Direction.AxisDirection.POSITIVE) {
|
||||||
|
double min = shape.min(axis, coordinates[0], coordinates[1]);
|
||||||
|
if (min == Double.POSITIVE_INFINITY) {
|
||||||
|
return Double.POSITIVE_INFINITY;
|
||||||
|
}
|
||||||
|
depth = min;
|
||||||
|
} else {
|
||||||
|
double max = shape.max(axis, coordinates[0], coordinates[1]);
|
||||||
|
if (max == Double.NEGATIVE_INFINITY) {
|
||||||
|
return Double.POSITIVE_INFINITY;
|
||||||
|
}
|
||||||
|
depth = 1 - max;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (depth > maxDepth) {
|
||||||
|
maxDepth = depth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return maxDepth;
|
||||||
|
}
|
||||||
|
|
||||||
private static boolean shouldAlwaysPass(BlockState state) {
|
private static boolean shouldAlwaysPass(BlockState state) {
|
||||||
return AllTags.AllBlockTags.FAN_TRANSPARENT.matches(state);
|
return AllTags.AllBlockTags.FAN_TRANSPARENT.matches(state);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,10 +3,12 @@ package com.simibubi.create.content.processing.burner;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
import javax.annotation.ParametersAreNonnullByDefault;
|
import javax.annotation.ParametersAreNonnullByDefault;
|
||||||
|
|
||||||
import com.simibubi.create.AllBlocks;
|
import com.simibubi.create.AllBlocks;
|
||||||
|
import com.simibubi.create.AllTags.AllEntityTags;
|
||||||
import com.simibubi.create.foundation.utility.RegisteredObjects;
|
import com.simibubi.create.foundation.utility.RegisteredObjects;
|
||||||
import com.simibubi.create.foundation.utility.VecHelper;
|
import com.simibubi.create.foundation.utility.VecHelper;
|
||||||
|
|
||||||
|
@ -14,7 +16,6 @@ import net.minecraft.MethodsReturnNonnullByDefault;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.NonNullList;
|
import net.minecraft.core.NonNullList;
|
||||||
import net.minecraft.core.particles.ParticleTypes;
|
import net.minecraft.core.particles.ParticleTypes;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import net.minecraft.sounds.SoundEvents;
|
import net.minecraft.sounds.SoundEvents;
|
||||||
import net.minecraft.sounds.SoundSource;
|
import net.minecraft.sounds.SoundSource;
|
||||||
import net.minecraft.util.random.WeightedEntry.Wrapper;
|
import net.minecraft.util.random.WeightedEntry.Wrapper;
|
||||||
|
@ -22,7 +23,6 @@ import net.minecraft.world.InteractionHand;
|
||||||
import net.minecraft.world.InteractionResult;
|
import net.minecraft.world.InteractionResult;
|
||||||
import net.minecraft.world.entity.EntityType;
|
import net.minecraft.world.entity.EntityType;
|
||||||
import net.minecraft.world.entity.LivingEntity;
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
import net.minecraft.world.entity.monster.Blaze;
|
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.item.BlockItem;
|
import net.minecraft.world.item.BlockItem;
|
||||||
import net.minecraft.world.item.CreativeModeTab;
|
import net.minecraft.world.item.CreativeModeTab;
|
||||||
|
@ -100,11 +100,9 @@ public class BlazeBurnerBlockItem extends BlockItem {
|
||||||
possibleSpawns.add(spawner.nextSpawnData);
|
possibleSpawns.add(spawner.nextSpawnData);
|
||||||
}
|
}
|
||||||
|
|
||||||
ResourceLocation blazeId = RegisteredObjects.getKeyOrThrow(EntityType.BLAZE);
|
|
||||||
for (SpawnData e : possibleSpawns) {
|
for (SpawnData e : possibleSpawns) {
|
||||||
ResourceLocation spawnerEntityId = new ResourceLocation(e.entityToSpawn()
|
Optional<EntityType<?>> optionalEntity = EntityType.by(e.entityToSpawn());
|
||||||
.getString("id"));
|
if (optionalEntity.isEmpty() || !AllEntityTags.BLAZE_BURNER_CAPTURABLE.matches(optionalEntity.get()))
|
||||||
if (!spawnerEntityId.equals(blazeId))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
spawnCaptureEffects(world, VecHelper.getCenterOf(pos));
|
spawnCaptureEffects(world, VecHelper.getCenterOf(pos));
|
||||||
|
@ -123,7 +121,7 @@ public class BlazeBurnerBlockItem extends BlockItem {
|
||||||
InteractionHand hand) {
|
InteractionHand hand) {
|
||||||
if (hasCapturedBlaze())
|
if (hasCapturedBlaze())
|
||||||
return InteractionResult.PASS;
|
return InteractionResult.PASS;
|
||||||
if (!(entity instanceof Blaze))
|
if (!AllEntityTags.BLAZE_BURNER_CAPTURABLE.matches(entity))
|
||||||
return InteractionResult.PASS;
|
return InteractionResult.PASS;
|
||||||
|
|
||||||
Level world = player.level;
|
Level world = player.level;
|
||||||
|
|
|
@ -33,12 +33,11 @@ public class AnalogLeverInstance extends BlockEntityInstance<AnalogLeverBlockEnt
|
||||||
indicator = mat.getModel(AllPartialModels.ANALOG_LEVER_INDICATOR, blockState)
|
indicator = mat.getModel(AllPartialModels.ANALOG_LEVER_INDICATOR, blockState)
|
||||||
.createInstance();
|
.createInstance();
|
||||||
|
|
||||||
transform(indicator);
|
|
||||||
|
|
||||||
AttachFace face = blockState.getValue(AnalogLeverBlock.FACE);
|
AttachFace face = blockState.getValue(AnalogLeverBlock.FACE);
|
||||||
rX = face == AttachFace.FLOOR ? 0 : face == AttachFace.WALL ? 90 : 180;
|
rX = face == AttachFace.FLOOR ? 0 : face == AttachFace.WALL ? 90 : 180;
|
||||||
rY = AngleHelper.horizontalAngle(blockState.getValue(AnalogLeverBlock.FACING));
|
rY = AngleHelper.horizontalAngle(blockState.getValue(AnalogLeverBlock.FACING));
|
||||||
|
|
||||||
|
transform(indicator.loadIdentity());
|
||||||
animateLever();
|
animateLever();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ public class SmartObserverBlock extends DirectedDirectionalBlock implements IBE<
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSignal(BlockState blockState, BlockGetter blockAccess, BlockPos pos, Direction side) {
|
public int getSignal(BlockState blockState, BlockGetter blockAccess, BlockPos pos, Direction side) {
|
||||||
return isSignalSource(blockState) && (side == null || side != blockState.getValue(FACING)
|
return isSignalSource(blockState) && (side == null || side != getTargetDirection(blockState)
|
||||||
.getOpposite()) ? 15 : 0;
|
.getOpposite()) ? 15 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,6 @@ package com.simibubi.create.foundation.events;
|
||||||
|
|
||||||
import com.simibubi.create.AllFluids;
|
import com.simibubi.create.AllFluids;
|
||||||
import com.simibubi.create.Create;
|
import com.simibubi.create.Create;
|
||||||
import com.simibubi.create.api.event.PipeCollisionEvent;
|
|
||||||
import com.simibubi.create.content.contraptions.ContraptionHandler;
|
import com.simibubi.create.content.contraptions.ContraptionHandler;
|
||||||
import com.simibubi.create.content.contraptions.actors.trainControls.ControlsServerHandler;
|
import com.simibubi.create.content.contraptions.actors.trainControls.ControlsServerHandler;
|
||||||
import com.simibubi.create.content.contraptions.minecart.CouplingPhysics;
|
import com.simibubi.create.content.contraptions.minecart.CouplingPhysics;
|
||||||
|
@ -36,11 +35,8 @@ import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.LevelAccessor;
|
import net.minecraft.world.level.LevelAccessor;
|
||||||
import net.minecraft.world.level.block.Blocks;
|
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.material.Fluid;
|
|
||||||
import net.minecraft.world.level.material.FluidState;
|
import net.minecraft.world.level.material.FluidState;
|
||||||
import net.minecraft.world.level.material.Fluids;
|
|
||||||
import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent;
|
import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent;
|
||||||
import net.minecraftforge.event.AddPackFindersEvent;
|
import net.minecraftforge.event.AddPackFindersEvent;
|
||||||
import net.minecraftforge.event.AddReloadListenerEvent;
|
import net.minecraftforge.event.AddReloadListenerEvent;
|
||||||
|
|
|
@ -23,7 +23,7 @@ import net.minecraft.world.level.saveddata.maps.MapDecoration;
|
||||||
import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
|
import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
|
||||||
|
|
||||||
// random priority to prevent networking conflicts
|
// random priority to prevent networking conflicts
|
||||||
@Mixin(value = ClientboundMapItemDataPacket.class, priority = 826)
|
@Mixin(value = ClientboundMapItemDataPacket.class, priority = 426)
|
||||||
public class ClientboundMapItemDataPacketMixin {
|
public class ClientboundMapItemDataPacketMixin {
|
||||||
@Shadow
|
@Shadow
|
||||||
@Final
|
@Final
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
package com.simibubi.create.foundation.mixin.accessor;
|
package com.simibubi.create.foundation.mixin.accessor;
|
||||||
|
|
||||||
import net.minecraft.SystemReport;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
|
|
||||||
import java.util.Map;
|
import net.minecraft.SystemReport;
|
||||||
|
|
||||||
@Mixin(SystemReport.class)
|
@Mixin(SystemReport.class)
|
||||||
public interface SystemReportAccessor {
|
public interface SystemReportAccessor {
|
||||||
|
|
|
@ -351,4 +351,9 @@ public class VecHelper {
|
||||||
return new double[] { t, u };
|
return new double[] { t, u };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static double alignedDistanceToFace(Vec3 pos, BlockPos blockPos, Direction face) {
|
||||||
|
Axis axis = face.getAxis();
|
||||||
|
return Math.abs(getCoordinate(pos, axis) - (blockPos.get(axis) + (face.getAxisDirection() == Direction.AxisDirection.POSITIVE ? 1 : 0)));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -211,6 +211,8 @@ public class CreateRegistrateTags {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void genEntityTags(RegistrateTagsProvider<EntityType<?>> prov) {
|
private static void genEntityTags(RegistrateTagsProvider<EntityType<?>> prov) {
|
||||||
|
prov.tag(AllEntityTags.BLAZE_BURNER_CAPTURABLE.tag)
|
||||||
|
.add(EntityType.BLAZE);
|
||||||
|
|
||||||
// VALIDATE
|
// VALIDATE
|
||||||
|
|
||||||
|
|
|
@ -1,26 +1,5 @@
|
||||||
package com.simibubi.create.infrastructure.debugInfo;
|
package com.simibubi.create.infrastructure.debugInfo;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
|
||||||
import com.jozufozu.flywheel.Flywheel;
|
|
||||||
import com.jozufozu.flywheel.backend.Backend;
|
|
||||||
import com.simibubi.create.Create;
|
|
||||||
import com.simibubi.create.foundation.mixin.accessor.SystemReportAccessor;
|
|
||||||
import com.simibubi.create.infrastructure.debugInfo.element.DebugInfoSection;
|
|
||||||
|
|
||||||
import net.minecraft.SharedConstants;
|
|
||||||
import net.minecraft.SystemReport;
|
|
||||||
import net.minecraft.Util;
|
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
|
|
||||||
import com.simibubi.create.infrastructure.debugInfo.element.InfoElement;
|
|
||||||
|
|
||||||
import com.simibubi.create.infrastructure.debugInfo.element.InfoEntry;
|
|
||||||
|
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
|
||||||
import net.minecraftforge.fml.DistExecutor;
|
|
||||||
import net.minecraftforge.fml.ModList;
|
|
||||||
import net.minecraftforge.forgespi.language.IModInfo;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -29,7 +8,24 @@ import java.util.stream.Stream;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.jozufozu.flywheel.Flywheel;
|
||||||
|
import com.jozufozu.flywheel.backend.Backend;
|
||||||
import com.mojang.blaze3d.platform.GlUtil;
|
import com.mojang.blaze3d.platform.GlUtil;
|
||||||
|
import com.simibubi.create.Create;
|
||||||
|
import com.simibubi.create.foundation.mixin.accessor.SystemReportAccessor;
|
||||||
|
import com.simibubi.create.infrastructure.debugInfo.element.DebugInfoSection;
|
||||||
|
import com.simibubi.create.infrastructure.debugInfo.element.InfoElement;
|
||||||
|
import com.simibubi.create.infrastructure.debugInfo.element.InfoEntry;
|
||||||
|
|
||||||
|
import net.minecraft.SharedConstants;
|
||||||
|
import net.minecraft.SystemReport;
|
||||||
|
import net.minecraft.Util;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraftforge.api.distmarker.Dist;
|
||||||
|
import net.minecraftforge.fml.DistExecutor;
|
||||||
|
import net.minecraftforge.fml.ModList;
|
||||||
|
import net.minecraftforge.forgespi.language.IModInfo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows for providing easily accessible debugging information.
|
* Allows for providing easily accessible debugging information.
|
||||||
|
|
|
@ -2,10 +2,10 @@ package com.simibubi.create.infrastructure.debugInfo;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import net.minecraft.world.entity.player.Player;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import net.minecraft.world.entity.player.Player;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A supplier of debug information. May be queried on the client or server.
|
* A supplier of debug information. May be queried on the client or server.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
package com.simibubi.create.infrastructure.debugInfo.element;
|
package com.simibubi.create.infrastructure.debugInfo.element;
|
||||||
|
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import java.util.function.Consumer;
|
||||||
import net.minecraft.world.entity.player.Player;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.function.Consumer;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
|
import net.minecraft.world.entity.player.Player;
|
||||||
|
|
||||||
public sealed interface InfoElement permits DebugInfoSection, InfoEntry {
|
public sealed interface InfoElement permits DebugInfoSection, InfoEntry {
|
||||||
void write(Player player, FriendlyByteBuf buffer);
|
void write(Player player, FriendlyByteBuf buffer);
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
package com.simibubi.create.infrastructure.debugInfo.element;
|
package com.simibubi.create.infrastructure.debugInfo.element;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import com.simibubi.create.infrastructure.debugInfo.DebugInformation;
|
import com.simibubi.create.infrastructure.debugInfo.DebugInformation;
|
||||||
import com.simibubi.create.infrastructure.debugInfo.InfoProvider;
|
import com.simibubi.create.infrastructure.debugInfo.InfoProvider;
|
||||||
|
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
public record InfoEntry(String name, InfoProvider provider) implements InfoElement {
|
public record InfoEntry(String name, InfoProvider provider) implements InfoElement {
|
||||||
public InfoEntry(String name, String info) {
|
public InfoEntry(String name, String info) {
|
||||||
this(name, player -> info);
|
this(name, player -> info);
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
"0": "create:block/smart_observer",
|
"0": "create:block/smart_observer",
|
||||||
"2": "create:block/smart_observer_front",
|
"2": "create:block/smart_observer_front",
|
||||||
"4": "create:block/smart_observer_top",
|
"4": "create:block/smart_observer_top",
|
||||||
"6": "block/observer_top",
|
"6": "create:block/smart_observer_bottom",
|
||||||
"7": "create:block/smart_observer_side",
|
"7": "create:block/smart_observer_side",
|
||||||
"particle": "create:block/smart_observer"
|
"particle": "create:block/smart_observer"
|
||||||
},
|
},
|
||||||
|
|
Before Width: | Height: | Size: 234 B After Width: | Height: | Size: 234 B |
Loading…
Reference in a new issue