Merge remote-tracking branch 'origin/mc1.15/dev' into mc1.15/dev

This commit is contained in:
JozsefA 2021-03-30 14:17:16 -07:00
commit 4ec25798a5
9 changed files with 136 additions and 73 deletions

View File

@ -90,6 +90,7 @@ public class DeployerFakePlayer extends FakePlayer {
@Override
public ItemStack onFoodEaten(World world, ItemStack stack) {
stack.shrink(1);
return stack;
}

View File

@ -13,19 +13,17 @@ import com.simibubi.create.content.contraptions.components.deployer.DeployerTile
import com.simibubi.create.content.curiosities.tools.SandPaperItem;
import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld;
import net.minecraft.advancements.CriteriaTriggers;
import net.minecraft.block.BeehiveBlock;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.material.Material;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.enchantment.Enchantments;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.ai.attributes.AttributeModifier;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.fluid.Fluid;
import net.minecraft.fluid.Fluids;
import net.minecraft.inventory.EquipmentSlotType;
@ -39,13 +37,13 @@ import net.minecraft.item.ItemUseContext;
import net.minecraft.item.Items;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.server.management.PlayerInteractionManager;
import net.minecraft.stats.Stats;
import net.minecraft.tileentity.BeehiveTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResult;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.Hand;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
@ -53,6 +51,7 @@ import net.minecraft.util.math.RayTraceContext;
import net.minecraft.util.math.RayTraceContext.BlockMode;
import net.minecraft.util.math.RayTraceContext.FluidMode;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.GameType;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.common.ForgeHooks;
@ -216,7 +215,7 @@ public class DeployerHandler {
progress += before;
if (progress >= 1) {
safeTryHarvestBlock(player.interactionManager, clickedPos);
tryHarvestBlock(player.interactionManager, clickedPos);
world.sendBlockBreakProgress(player.getEntityId(), clickedPos, -1);
player.blockBreakingProgress = null;
return;
@ -255,11 +254,9 @@ public class DeployerHandler {
boolean flag1 =
!(player.isSneaking() && holdingSomething) || (stack.doesSneakBypassUse(world, clickedPos, player));
if (clickedState.getBlock() instanceof BeehiveBlock)
return; // Beehives assume a lot about the usage context. Crashes to side-effects
// Use on block
if (useBlock != DENY && flag1 && clickedState.onUse(world, player, hand, result) == ActionResultType.SUCCESS)
if (useBlock != DENY && flag1
&& safeOnUse(clickedState, world, clickedPos, player, hand, result) == ActionResultType.SUCCESS)
return;
if (stack.isEmpty())
return;
@ -294,7 +291,8 @@ public class DeployerHandler {
ActionResult<ItemStack> onItemRightClick = item.onItemRightClick(itemUseWorld, player, hand);
ItemStack resultStack = onItemRightClick.getResult();
if (resultStack != stack || resultStack.getCount() != stack.getCount() || resultStack.getUseDuration() > 0 || resultStack.getDamage() != stack.getDamage()) {
if (resultStack != stack || resultStack.getCount() != stack.getCount() || resultStack.getUseDuration() > 0
|| resultStack.getDamage() != stack.getDamage()) {
player.setHeldItem(hand, onItemRightClick.getResult());
}
@ -309,51 +307,89 @@ public class DeployerHandler {
player.resetActiveHand();
}
private static boolean safeTryHarvestBlock(PlayerInteractionManager interactionManager, BlockPos clickedPos) {
BlockState state = interactionManager.world.getBlockState(clickedPos);
if (!(state.getBlock() instanceof BeehiveBlock))
return interactionManager.tryHarvestBlock(clickedPos);
else {
harvestBeehive(interactionManager, state, clickedPos);
}
public static boolean tryHarvestBlock(PlayerInteractionManager interactionManager, BlockPos pos) {
// <> PlayerInteractionManager#tryHarvestBlock
ServerWorld world = interactionManager.world;
ServerPlayerEntity player = interactionManager.player;
BlockState blockstate = world.getBlockState(pos);
GameType gameType = interactionManager.getGameType();
if (net.minecraftforge.common.ForgeHooks.onBlockBreakEvent(world, gameType, player, pos) == -1)
return false;
TileEntity tileentity = world.getTileEntity(pos);
if (player.getHeldItemMainhand()
.onBlockStartBreak(pos, player))
return false;
if (player.canMine(world, pos, gameType))
return false;
ItemStack prevHeldItem = player.getHeldItemMainhand();
ItemStack heldItem = prevHeldItem.copy();
boolean canHarvest = blockstate.canHarvestBlock(world, pos, player);
prevHeldItem.onBlockDestroyed(world, blockstate, pos, player);
if (prevHeldItem.isEmpty() && !heldItem.isEmpty())
net.minecraftforge.event.ForgeEventFactory.onPlayerDestroyItem(player, heldItem, Hand.MAIN_HAND);
if (!blockstate.removedByPlayer(world, pos, player, canHarvest, world.getFluidState(pos)))
return true;
blockstate.getBlock()
.onPlayerDestroy(world, pos, blockstate);
if (!canHarvest)
return true;
Block.getDrops(blockstate, world, pos, tileentity, player, prevHeldItem)
.forEach(item -> player.inventory.placeItemBackInInventory(world, item));
blockstate.spawnAdditionalDrops(world, pos, prevHeldItem);
return true;
}
private static void harvestBeehive(PlayerInteractionManager interactionManager, BlockState state,
BlockPos clickedPos) {
// Modified code from PlayerInteractionManager, Block and BeehiveBlock to handle
// deployers breaking beehives without crash.
ItemStack itemstack = interactionManager.player.getHeldItemMainhand();
ItemStack itemstack1 = itemstack.copy();
boolean flag1 = state.canHarvestBlock(interactionManager.world, clickedPos, interactionManager.player);
itemstack.onBlockDestroyed(interactionManager.world, state, clickedPos, interactionManager.player);
if (itemstack.isEmpty() && !itemstack1.isEmpty())
net.minecraftforge.event.ForgeEventFactory.onPlayerDestroyItem(interactionManager.player, itemstack1,
Hand.MAIN_HAND);
boolean flag = state.removedByPlayer(interactionManager.world, clickedPos, interactionManager.player, flag1,
interactionManager.world.getFluidState(clickedPos));
if (flag)
state.getBlock()
.onPlayerDestroy(interactionManager.world, clickedPos, state);
if (flag && flag1) {
interactionManager.player.addStat(Stats.BLOCK_MINED.get(state.getBlock()));
interactionManager.player.addExhaustion(0.005F);
TileEntity te = interactionManager.world.getTileEntity(clickedPos);
ItemStack heldItem = interactionManager.player.getHeldItemMainhand();
Block.spawnDrops(state, interactionManager.world, clickedPos, te, interactionManager.player, heldItem);
if (!interactionManager.world.isRemote && te instanceof BeehiveTileEntity) {
BeehiveTileEntity beehivetileentity = (BeehiveTileEntity) te;
if (EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, heldItem) == 0) {
interactionManager.world.updateComparatorOutputLevel(clickedPos, state.getBlock());
}
CriteriaTriggers.BEE_NEST_DESTROYED.test(interactionManager.player,
state.getBlock(), heldItem, beehivetileentity.getBeeCount());
}
}
public static ActionResultType safeOnUse(BlockState state, World world, BlockPos pos, PlayerEntity player,
Hand hand, BlockRayTraceResult ray) {
if (state.getBlock() instanceof BeehiveBlock)
return safeOnBeehiveUse(state, world, pos, player, hand);
return state.onUse(world, player, hand, ray);
}
protected static ActionResultType safeOnBeehiveUse(BlockState state, World world, BlockPos pos, PlayerEntity player,
Hand hand) {
// <> BeehiveBlock#onUse
BeehiveBlock block = (BeehiveBlock) state.getBlock();
ItemStack prevHeldItem = player.getHeldItem(hand);
int honeyLevel = state.get(BeehiveBlock.HONEY_LEVEL);
boolean success = false;
if (honeyLevel < 5)
return ActionResultType.PASS;
if (prevHeldItem.getItem() == Items.SHEARS) {
world.playSound(player, player.getX(), player.getY(), player.getZ(), SoundEvents.field_226133_ah_,
SoundCategory.NEUTRAL, 1.0F, 1.0F);
// <> BeehiveBlock#dropHoneycomb
player.inventory.placeItemBackInInventory(world, new ItemStack(Items.field_226635_pU_, 3));
prevHeldItem.damageItem(1, player, s -> s.sendBreakAnimation(hand));
success = true;
}
if (prevHeldItem.getItem() == Items.GLASS_BOTTLE) {
prevHeldItem.shrink(1);
world.playSound(player, player.getX(), player.getY(), player.getZ(), SoundEvents.ITEM_BOTTLE_FILL,
SoundCategory.NEUTRAL, 1.0F, 1.0F);
ItemStack honeyBottle = new ItemStack(Items.field_226638_pX_);
if (prevHeldItem.isEmpty())
player.setHeldItem(hand, honeyBottle);
else
player.inventory.placeItemBackInInventory(world, honeyBottle);
success = true;
}
if (!success)
return ActionResultType.PASS;
block.takeHoney(world, state, pos);
return ActionResultType.SUCCESS;
}
}

View File

@ -156,6 +156,8 @@ public class FluidPropagator {
if (PumpBlock.isPump(connectedState) && connectedState.get(PumpBlock.FACING)
.getAxis() == side.getAxis())
return false;
if (connectedState.has(BlockStateProperties.HONEY_LEVEL))
return true;
if (Block.hasSolidSide(connectedState, reader, connectedPos, side.getOpposite()))
return false;
if (!(connectedState.getMaterial()

View File

@ -1,5 +1,8 @@
package com.simibubi.create.content.contraptions.fluids;
import static net.minecraft.state.properties.BlockStateProperties.HONEY_LEVEL;
import static net.minecraft.state.properties.BlockStateProperties.WATERLOGGED;
import java.util.List;
import javax.annotation.Nullable;
@ -21,7 +24,6 @@ import net.minecraft.nbt.CompoundNBT;
import net.minecraft.potion.Effect;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.PotionUtils;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tags.FluidTags;
import net.minecraft.util.Direction;
import net.minecraft.util.SoundCategory;
@ -71,7 +73,14 @@ public class OpenEndedPipe extends FlowSource {
BlockState state = world.getBlockState(outputPos);
IFluidState fluidState = state.getFluidState();
boolean waterlog = state.has(BlockStateProperties.WATERLOGGED);
boolean waterlog = state.has(WATERLOGGED);
if (state.has(HONEY_LEVEL) && state.get(HONEY_LEVEL) >= 5) {
if (!simulate)
world.setBlockState(outputPos, state.with(HONEY_LEVEL, 0), 3);
return new FluidStack(AllFluids.HONEY.get()
.getStillFluid(), 250);
}
if (!waterlog && !state.getMaterial()
.isReplaceable())
@ -83,11 +92,11 @@ public class OpenEndedPipe extends FlowSource {
if (simulate)
return stack;
AllTriggers.triggerForNearbyPlayers(AllTriggers.PIPE_SPILL, world, pos, 5);
if (waterlog) {
world.setBlockState(outputPos, state.with(BlockStateProperties.WATERLOGGED, false), 3);
world.setBlockState(outputPos, state.with(WATERLOGGED, false), 3);
world.getPendingFluidTicks()
.scheduleTick(outputPos, Fluids.WATER, 1);
return stack;
@ -105,7 +114,7 @@ public class OpenEndedPipe extends FlowSource {
BlockState state = world.getBlockState(outputPos);
IFluidState fluidState = state.getFluidState();
boolean waterlog = state.has(BlockStateProperties.WATERLOGGED);
boolean waterlog = state.has(WATERLOGGED);
if (!waterlog && !state.getMaterial()
.isReplaceable())
@ -139,11 +148,11 @@ public class OpenEndedPipe extends FlowSource {
2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F);
return true;
}
AllTriggers.triggerForNearbyPlayers(AllTriggers.PIPE_SPILL, world, pos, 5);
if (waterlog) {
world.setBlockState(outputPos, state.with(BlockStateProperties.WATERLOGGED, true), 3);
world.setBlockState(outputPos, state.with(WATERLOGGED, true), 3);
world.getPendingFluidTicks()
.scheduleTick(outputPos, Fluids.WATER, 1);
return true;

View File

@ -142,6 +142,8 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren
public static boolean canConnectTo(ILightReader world, BlockPos neighbourPos, BlockState neighbour, Direction direction) {
if (FluidPropagator.hasFluidCapability(world, neighbourPos, direction.getOpposite()))
return true;
if (neighbour.has(BlockStateProperties.HONEY_LEVEL))
return true;
FluidTransportBehaviour transport = TileEntityBehaviour.get(world, neighbourPos, FluidTransportBehaviour.TYPE);
BracketedTileEntityBehaviour bracket = TileEntityBehaviour.get(world, neighbourPos, BracketedTileEntityBehaviour.TYPE);
if (isPipe(neighbour))

View File

@ -3,7 +3,7 @@ package com.simibubi.create.foundation.config;
public class CClient extends ConfigBase {
public ConfigGroup client = group(0, "client",
"Client-only settings - If you're looking for general settings, look inside your worlds serverconfig folder!");
"Client-only settings - If you're looking for general settings, look inside your worlds serverconfig folder!");
public ConfigBool tooltips = b(true, "enableTooltips", "Show item descriptions on Shift and controls on Ctrl.");
public ConfigBool enableOverstressedTooltip =
b(true, "enableOverstressedTooltip", "Display a tooltip when looking at overstressed components.");
@ -12,13 +12,18 @@ public class CClient extends ConfigBase {
public ConfigFloat fanParticleDensity = f(.5f, 0, 1, "fanParticleDensity");
public ConfigBool rainbowDebug =
b(true, "enableRainbowDebug", "Show colourful debug information while the F3-Menu is open.");
public ConfigBool experimentalRendering =
b(true, "experimentalRendering", "Use modern OpenGL features to drastically increase performance.");
public ConfigInt overlayOffsetX = i(20, Integer.MIN_VALUE, Integer.MAX_VALUE, "overlayOffsetX",
"Offset the overlay from goggle- and hover- information by this many pixels on the X axis; Use /create overlay");
public ConfigInt overlayOffsetY = i(0, Integer.MIN_VALUE, Integer.MAX_VALUE, "overlayOffsetY",
"Offset the overlay from goggle- and hover- information by this many pixels on the Y axis; Use /create overlay");
public ConfigBool smoothPlacementIndicator = b(false, "smoothPlacementIndicator",
"Use an alternative indicator when showing where the assisted placement ends up relative to your crosshair");
public ConfigInt overlayOffsetX = i(20, Integer.MIN_VALUE, Integer.MAX_VALUE, "overlayOffsetX", "Offset the overlay from goggle- and hover- information by this many pixels on the X axis; Use /create overlay");
public ConfigInt overlayOffsetY = i(0, Integer.MIN_VALUE, Integer.MAX_VALUE, "overlayOffsetY", "Offset the overlay from goggle- and hover- information by this many pixels on the Y axis; Use /create overlay");
public ConfigBool smoothPlacementIndicator = b(false, "smoothPlacementIndicator", "Use an alternative indicator when showing where the assisted placement ends up relative to your crosshair");
public ConfigGroup ponder = group(1, "ponder", "Ponder settings");
public ConfigBool comfyReading =
b(false, "comfyReading", "Slow down a ponder scene whenever there is text on screen.");
@Override
public String getName() {

View File

@ -12,6 +12,7 @@ import org.lwjgl.opengl.GL11;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement;
@ -80,7 +81,6 @@ public class PonderUI extends NavigatableSimiScreen {
PonderChapter chapter = null;
private boolean userViewMode;
private boolean slowTextMode;
private boolean identifyMode;
private ItemStack hoveredTooltipItem;
private BlockPos hoveredBlockPos;
@ -205,7 +205,7 @@ public class PonderUI extends NavigatableSimiScreen {
.fade(0, -1));
widgets.add(slowMode = new PonderButton(width - 20 - 31, bY, () -> {
slowTextMode = !slowTextMode;
setComfyReadingEnabled(!isComfyReadingEnabled());
}).showing(AllIcons.I_MTD_SLOW_MODE)
.fade(0, -1));
@ -269,7 +269,7 @@ public class PonderUI extends NavigatableSimiScreen {
PonderScene activeScene = scenes.get(index);
extendedTickLength = 0;
if (slowTextMode)
if (isComfyReadingEnabled())
activeScene.forEachVisible(TextWindowElement.class, twe -> extendedTickLength = 2);
if (extendedTickTimer == 0) {
@ -616,7 +616,7 @@ public class PonderUI extends NavigatableSimiScreen {
userMode.dim();
}
if (slowTextMode)
if (isComfyReadingEnabled())
slowMode.flash();
else
slowMode.dim();
@ -981,4 +981,12 @@ public class PonderUI extends NavigatableSimiScreen {
hoveredTooltipItem = ItemStack.EMPTY;
}
public boolean isComfyReadingEnabled() {
return AllConfigs.CLIENT.comfyReading.get();
}
public void setComfyReadingEnabled(boolean slowTextMode) {
AllConfigs.CLIENT.comfyReading.set(slowTextMode);
}
}

View File

@ -8,7 +8,7 @@ import net.minecraft.block.Blocks;
public class PonderIndex {
public static final boolean EDITOR_MODE = true;
public static final boolean EDITOR_MODE = false;
public static void register() {
// Register storyboards here

View File

@ -84,8 +84,8 @@ public class InputWindowElement extends AnimatedOverlayElement {
int width = 0;
int height = 0;
int xFade = direction == Pointing.RIGHT ? -1 : direction == Pointing.LEFT ? 1 : 0;
int yFade = direction == Pointing.DOWN ? -1 : direction == Pointing.UP ? 1 : 0;
float xFade = direction == Pointing.RIGHT ? -1 : direction == Pointing.LEFT ? 1 : 0;
float yFade = direction == Pointing.DOWN ? -1 : direction == Pointing.UP ? 1 : 0;
xFade *= 10 * (1 - fade);
yFade *= 10 * (1 - fade);