2015-02-01 18:53:10 -07:00

141 lines
4.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TrueCraft.API;
using TrueCraft.API.Networking;
using TrueCraft.API.Entities;
using TrueCraft.Core.Networking.Packets;
using TrueCraft.Core;
using TrueCraft.API.Server;
namespace TrueCraft.Core.Entities
{
public class ItemEntity : ObjectEntity, IAABBEntity
{
public static float PickupRange = 2;
public ItemEntity(Vector3 position, ItemStack item)
{
Position = position;
Item = item;
if (Item.ID == 0)
System.Diagnostics.Debugger.Break();
}
public ItemStack Item { get; set; }
public override IPacket SpawnPacket
{
get
{
return new SpawnItemPacket(EntityID, Item.ID, Item.Count, Item.Metadata,
MathHelper.CreateAbsoluteInt(Position.X), MathHelper.CreateAbsoluteInt(Position.Y),
MathHelper.CreateAbsoluteInt(Position.Z),
MathHelper.CreateRotationByte(Yaw),
MathHelper.CreateRotationByte(Pitch), 0);
}
}
public override Size Size
{
get { return new Size(0.25, 0.25, 0.25); }
}
public BoundingBox BoundingBox
{
get
{
return new BoundingBox(Position, Position + Size);
}
}
public void TerrainCollision(Vector3 collisionPoint, Vector3 collisionDirection)
{
// This space intentionally left blank
}
public override byte EntityType
{
get { return 2; }
}
public override int Data
{
get { return 1; }
}
public override MetadataDictionary Metadata
{
get
{
var metadata = base.Metadata;
metadata[10] = Item;
return metadata;
}
}
public override bool SendMetadataToClients
{
get
{
return true;
}
}
public bool BeginUpdate()
{
EnablePropertyChange = false;
return true;
}
public void EndUpdate(Vector3 newPosition)
{
EnablePropertyChange = true;
Position = newPosition;
}
public override void Update(IEntityManager entityManager)
{
var nearbyEntities = entityManager.EntitiesInRange(Position, PickupRange);
if ((DateTime.Now - SpawnTime).TotalSeconds > 1)
{
var player = nearbyEntities.FirstOrDefault(e => e is PlayerEntity && (e as PlayerEntity).Health != 0
&& e.Position.DistanceTo(Position) <= PickupRange);
if (player != null)
{
var playerEntity = player as PlayerEntity;
playerEntity.OnPickUpItem(this);
entityManager.DespawnEntity(this);
}
/* TODO: Merging item entities (this code behaves strangely
var item = nearbyEntities.FirstOrDefault(e => e is ItemEntity
&& e != this
&& (DateTime.Now - (e as ItemEntity).SpawnTime).TotalSeconds > 1
&& (e as ItemEntity).Item.ID == Item.ID && (e as ItemEntity).Item.Metadata == Item.Metadata
&& (e as ItemEntity).Item.Nbt == Item.Nbt
&& e.Position.DistanceTo(Position) < PickupRange);
if (item != null)
{
// Merge
entityManager.DespawnEntity(item);
var newItem = Item;
newItem.Count += (item as ItemEntity).Item.Count;
Item = newItem;
OnPropertyChanged("Metadata");
}*/
}
}
public float AccelerationDueToGravity
{
get { return 0.08f; }
}
public float Drag
{
get { return 0.98f; }
}
}
}