flatten folder structure, fix collision boxes and gui/fp/tp transforms
This commit is contained in:
69
ButterflyPins/Blocks/BlockButterflyPinBoard.cs
Normal file
69
ButterflyPins/Blocks/BlockButterflyPinBoard.cs
Normal file
@@ -0,0 +1,69 @@
|
||||
using ButterflyPins.BlockEntities;
|
||||
using System;
|
||||
using Vintagestory.API.Common;
|
||||
using Vintagestory.API.MathTools;
|
||||
|
||||
namespace ButterflyPins.Blocks;
|
||||
|
||||
public class BlockButterflyPinBoard : Block
|
||||
{
|
||||
private const string ButterflyPinPrefix = "clothes-butterflypin-";
|
||||
|
||||
public override bool OnBlockInteractStart(IWorldAccessor world, IPlayer byPlayer, BlockSelection blockSel)
|
||||
{
|
||||
if (blockSel == null)
|
||||
return base.OnBlockInteractStart(world, byPlayer, blockSel);
|
||||
|
||||
if (world.BlockAccessor.GetBlockEntity(blockSel.Position) is not BlockEntityButterflyPinBoard board)
|
||||
return base.OnBlockInteractStart(world, byPlayer, blockSel);
|
||||
|
||||
int slotIndex = board.GetSlotIndex(blockSel.HitPosition);
|
||||
if (slotIndex < 0)
|
||||
return base.OnBlockInteractStart(world, byPlayer, blockSel);
|
||||
|
||||
ItemSlot activeSlot = byPlayer.InventoryManager.ActiveHotbarSlot;
|
||||
if (world.Side == EnumAppSide.Client)
|
||||
return (!activeSlot.Empty && board.CanInsert(slotIndex, activeSlot.Itemstack)) || board.CanTake(slotIndex);
|
||||
|
||||
if (!activeSlot.Empty && board.TryInsert(byPlayer, slotIndex, activeSlot))
|
||||
return true;
|
||||
|
||||
return board.TryTake(byPlayer, slotIndex) || base.OnBlockInteractStart(world, byPlayer, blockSel);
|
||||
}
|
||||
|
||||
public override void OnBlockBroken(IWorldAccessor world, BlockPos pos, IPlayer byPlayer, float dropQuantityMultiplier = 1)
|
||||
{
|
||||
if (world.Side == EnumAppSide.Server && world.BlockAccessor.GetBlockEntity(pos) is BlockEntityButterflyPinBoard board)
|
||||
board.DropContents();
|
||||
|
||||
base.OnBlockBroken(world, pos, byPlayer, dropQuantityMultiplier);
|
||||
}
|
||||
|
||||
public override bool ConsumeCraftingIngredients(ItemSlot[] slots, ItemSlot outputSlot, GridRecipe matchingRecipe)
|
||||
{
|
||||
bool preservedPin = false;
|
||||
|
||||
foreach (ItemSlot slot in slots)
|
||||
{
|
||||
if (slot.Empty)
|
||||
continue;
|
||||
|
||||
if (!preservedPin && IsButterflyPin(slot.Itemstack))
|
||||
{
|
||||
preservedPin = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
slot.TakeOut(1);
|
||||
slot.MarkDirty();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static bool IsButterflyPin(ItemStack stack)
|
||||
{
|
||||
AssetLocation? code = stack.Collectible?.Code;
|
||||
return code != null && code.Path.StartsWith(ButterflyPinPrefix, StringComparison.Ordinal);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user