This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2015-09-30 18:29:07 -04:00

126 lines
3.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TrueCraft.API.Logic;
using TrueCraft.API;
using TrueCraft.Core.Logic.Blocks;
using TrueCraft.API.World;
using TrueCraft.API.Networking;
namespace TrueCraft.Core.Logic.Items
{
public abstract class DoorItem : ItemProvider, ICraftingRecipe
{
[Flags]
public enum DoorFlags
{
Northeast = 0x0,
Southeast = 0x1,
Southwest = 0x2,
Northwest = 0x3,
Lower = 0x0,
Upper = 0x8,
Closed = 0x0,
Open = 0x4
}
protected abstract byte BlockID { get; }
public override sbyte MaximumStack { get { return 1; } }
public ItemStack[,] Pattern
{
get
{
var baseMaterial = (this is IronDoorItem) ? IronIngotItem.ItemID : WoodenPlanksBlock.BlockID;
return new[,]
{
{ new ItemStack(baseMaterial), new ItemStack(baseMaterial) },
{ new ItemStack(baseMaterial), new ItemStack(baseMaterial) },
{ new ItemStack(baseMaterial), new ItemStack(baseMaterial) }
};
}
}
public ItemStack Output
{
get
{
return new ItemStack(ID);
}
}
public bool SignificantMetadata
{
get
{
return false;
}
}
public override void ItemUsedOnBlock(Coordinates3D coordinates, ItemStack item, BlockFace face, IWorld world, IRemoteClient user)
{
var bottom = coordinates + MathHelper.BlockFaceToCoordinates(face);
var top = bottom + Coordinates3D.Up;
if (world.GetBlockID(top) != 0 || world.GetBlockID(bottom) != 0)
return;
DoorFlags direction;
switch (MathHelper.DirectionByRotationFlat(user.Entity.Yaw))
{
case Direction.North:
direction = DoorFlags.Northwest;
break;
case Direction.South:
direction = DoorFlags.Southeast;
break;
case Direction.East:
direction = DoorFlags.Northeast;
break;
default: // Direction.West:
direction = DoorFlags.Southwest;
break;
}
user.Server.BlockUpdatesEnabled = false;
world.SetBlockID(bottom, BlockID);
world.SetMetadata(bottom, (byte)direction);
world.SetBlockID(top, BlockID);
world.SetMetadata(top, (byte)(direction | DoorFlags.Upper));
user.Server.BlockUpdatesEnabled = true;
item.Count--;
user.Inventory[user.SelectedSlot] = item;
}
}
public class IronDoorItem : DoorItem
{
public static readonly short ItemID = 0x14A;
public override short ID { get { return 0x14A; } }
public override Tuple<int, int> GetIconTexture(byte metadata)
{
return new Tuple<int, int>(12, 2);
}
public override string DisplayName { get { return "Iron Door"; } }
protected override byte BlockID { get { return IronDoorBlock.BlockID; } }
}
public class WoodenDoorItem : DoorItem
{
public static readonly short ItemID = 0x144;
public override short ID { get { return 0x144; } }
public override Tuple<int, int> GetIconTexture(byte metadata)
{
return new Tuple<int, int>(11, 2);
}
public override string DisplayName { get { return "Wooden Door"; } }
protected override byte BlockID { get { return WoodenDoorBlock.BlockID; } }
}
}