
This makes sure that you get new entities as you move to chunks that have them, and that entities are despawned as you move further away from them.
153 lines
5.3 KiB
C#
153 lines
5.3 KiB
C#
using System;
|
|
using TrueCraft.API.Logic;
|
|
using TrueCraft.API.World;
|
|
using TrueCraft.API;
|
|
using TrueCraft.API.Networking;
|
|
using TrueCraft.Core.Entities;
|
|
using TrueCraft.API.Entities;
|
|
using TrueCraft.API.Server;
|
|
|
|
namespace TrueCraft.Core.Logic
|
|
{
|
|
/// <summary>
|
|
/// Provides common implementations of block logic.
|
|
/// </summary>
|
|
public abstract class BlockProvider : IItemProvider, IBlockProvider
|
|
{
|
|
public virtual bool BlockRightClicked(BlockDescriptor descriptor, BlockFace face, IWorld world, IRemoteClient user)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public virtual bool BlockPlaced(BlockDescriptor descriptor, BlockFace face, IWorld world, IRemoteClient user)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public virtual void BlockMined(BlockDescriptor descriptor, BlockFace face, IWorld world, IRemoteClient user)
|
|
{
|
|
GenerateDropEntity(descriptor, world, user.Server);
|
|
world.SetBlockID(descriptor.Coordinates, 0);
|
|
}
|
|
|
|
private void GenerateDropEntity(BlockDescriptor descriptor, IWorld world, IMultiplayerServer server)
|
|
{
|
|
var entityManager = server.GetEntityManagerForWorld(world);
|
|
var items = GetDrop(descriptor);
|
|
foreach (var item in items)
|
|
entityManager.SpawnEntity(new ItemEntity(new Vector3(descriptor.Coordinates) + new Vector3(0.5), item));
|
|
}
|
|
|
|
public virtual bool IsSupported(BlockDescriptor descriptor, IMultiplayerServer server, IWorld world)
|
|
{
|
|
var support = GetSupportDirection(descriptor);
|
|
if (support != Coordinates3D.Zero)
|
|
{
|
|
var supportingBlock = server.BlockRepository.GetBlockProvider(world.GetBlockID(descriptor.Coordinates + support));
|
|
if (!supportingBlock.Opaque)
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public virtual void BlockUpdate(BlockDescriptor descriptor, IMultiplayerServer server, IWorld world)
|
|
{
|
|
if (!IsSupported(descriptor, server, world))
|
|
{
|
|
GenerateDropEntity(descriptor, world, server);
|
|
world.SetBlockID(descriptor.Coordinates, 0);
|
|
}
|
|
}
|
|
|
|
public virtual void BlockScheduledEvent(BlockDescriptor descriptor, IWorld world, object data)
|
|
{
|
|
// This space intentionally left blank
|
|
}
|
|
|
|
protected virtual ItemStack[] GetDrop(BlockDescriptor descriptor) // TODO: Include tools
|
|
{
|
|
return new[] { new ItemStack(descriptor.ID, 1, descriptor.Metadata) };
|
|
}
|
|
|
|
public virtual void ItemUsedOnEntity(ItemStack item, IEntity usedOn, IWorld world, IRemoteClient user)
|
|
{
|
|
// This space intentionally left blank
|
|
}
|
|
|
|
public virtual void ItemUsedOnNothing(ItemStack item, IWorld world, IRemoteClient user)
|
|
{
|
|
// This space intentionally left blank
|
|
}
|
|
|
|
public virtual void ItemUsedOnBlock(Coordinates3D coordinates, ItemStack item, BlockFace face, IWorld world, IRemoteClient user)
|
|
{
|
|
coordinates += MathHelper.BlockFaceToCoordinates(face);
|
|
world.SetBlockID(coordinates, (byte)item.ID);
|
|
world.SetMetadata(coordinates, (byte)item.Metadata);
|
|
item.Count--;
|
|
user.Inventory[user.SelectedSlot] = item;
|
|
}
|
|
|
|
short IItemProvider.ID
|
|
{
|
|
get
|
|
{
|
|
return ID;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// The ID of the block.
|
|
/// </summary>
|
|
public abstract byte ID { get; }
|
|
|
|
public virtual Coordinates3D GetSupportDirection(BlockDescriptor descriptor)
|
|
{
|
|
return Coordinates3D.Zero;
|
|
}
|
|
|
|
/// <summary>
|
|
/// The maximum amount that can be in a single stack of this block.
|
|
/// </summary>
|
|
public virtual sbyte MaximumStack { get { return 64; } }
|
|
|
|
/// <summary>
|
|
/// How resist the block is to explosions.
|
|
/// </summary>
|
|
public virtual double BlastResistance { get { return 0; } }
|
|
|
|
/// <summary>
|
|
/// How resist the block is to player mining/digging.
|
|
/// </summary>
|
|
public virtual double Hardness { get { return 0; } }
|
|
|
|
/// <summary>
|
|
/// The light level emitted by the block. 0 - 15
|
|
/// </summary>
|
|
public virtual byte Luminance { get { return 0; } }
|
|
|
|
/// <summary>
|
|
/// Whether or not the block is opaque
|
|
/// </summary>
|
|
public virtual bool Opaque { get { return true; } }
|
|
|
|
/// <summary>
|
|
/// The amount removed from the light level as it passes through this block.
|
|
/// 255 - Let no light pass through(this may change)
|
|
/// Notes:
|
|
/// - This isn't needed for opaque blocks
|
|
/// - This is needed since some "partial" transparent blocks remove more than 1 level from light passing through such as Ice.
|
|
/// </summary>
|
|
public virtual byte LightModifier { get { return 1; } }
|
|
|
|
/// <summary>
|
|
/// The name of the block as it would appear to players.
|
|
/// </summary>
|
|
public virtual string DisplayName { get { return string.Empty; } }
|
|
|
|
public virtual Tuple<int, int> GetTextureMap(byte metadata)
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
} |