141 lines
4.1 KiB
C#
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; }
|
|
}
|
|
}
|
|
}
|