66 lines
2.2 KiB
C#
66 lines
2.2 KiB
C#
using Mine2d.engine;
|
|
using Mine2d.engine.system.annotations;
|
|
using Mine2d.game.backend.data;
|
|
using Mine2d.game.core.data;
|
|
using Mine2d.game.core.data.entities;
|
|
|
|
namespace Mine2d.game.backend.interactor;
|
|
|
|
[Interactor]
|
|
public class ItemPhysics
|
|
{
|
|
|
|
[Interaction(InteractorKind.Hybrid, "tick")]
|
|
public static void TickHybrid()
|
|
{
|
|
var gameState = Context.Get().GameState;
|
|
var world = gameState.World;
|
|
foreach (var chunk in world.Chunks)
|
|
{
|
|
var entities = chunk.Value.Entities;
|
|
foreach (var entity in entities)
|
|
{
|
|
if (entity is ItemEntity itemEntity)
|
|
{
|
|
itemEntity.Velocity += new Vector2(0, 0.1f);
|
|
itemEntity.Velocity *= new Vector2(0.7f, 1f);
|
|
var nextPos = itemEntity.Position + itemEntity.Velocity;
|
|
if (world.HasChunkAt(nextPos) && world.GetChunkAt(nextPos).HasTileAt(nextPos))
|
|
{
|
|
itemEntity.Velocity = new Vector2(0, 0);
|
|
continue;
|
|
}
|
|
itemEntity.Position = nextPos;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
[Interaction(InteractorKind.Hybrid, "tick")]
|
|
public static void Pickup(TickPacket tickPacket)
|
|
{
|
|
var gameState = Context.Get().GameState;
|
|
var world = gameState.World;
|
|
foreach (var chunk in world.Chunks)
|
|
{
|
|
foreach (var player in gameState.Players)
|
|
{
|
|
|
|
var items = chunk.Value.Entities.Where(e =>
|
|
{
|
|
Console.WriteLine("Where");
|
|
return e is ItemEntity itemEntity &&
|
|
(player.Position + new Vector2(7, 3) - itemEntity.Position).LengthSquared() < 8 * 8 &&
|
|
player.inventory.PickupItemStack(new ItemStack { Id = itemEntity.ItemId, Count = 1 });
|
|
});
|
|
if (items.Any())
|
|
{
|
|
Context.Get().GameAudio.Play(Sound.ItemPickup);
|
|
Console.WriteLine(tickPacket.Tick + " " + items.Count());
|
|
}
|
|
_ = chunk.Value.Entities.RemoveAll(e => items.Contains(e));
|
|
}
|
|
}
|
|
}
|
|
}
|