From 73daa75c5f0a91b1e39eef3a7454c43610c31591 Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Wed, 14 Dec 2022 19:03:00 +0100 Subject: [PATCH] added placement --- Mine2d/engine/EventService.cs | 4 +- Mine2d/game/backend/interactor/Place.cs | 43 +++++++++++++++++++ .../backend/network/packets/PacketType.cs | 5 ++- .../backend/network/packets/PlacePacket.cs | 10 +++++ Mine2d/game/core/PlayerEntity.cs | 2 + Mine2d/game/core/tiles/TileRegistry.cs | 5 +++ .../game/frontend/events/PlayerPlaceInput.cs | 30 +++++++++++++ 7 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 Mine2d/game/backend/interactor/Place.cs create mode 100644 Mine2d/game/backend/network/packets/PlacePacket.cs create mode 100644 Mine2d/game/frontend/events/PlayerPlaceInput.cs diff --git a/Mine2d/engine/EventService.cs b/Mine2d/engine/EventService.cs index b9e226c..8dc5f66 100644 --- a/Mine2d/engine/EventService.cs +++ b/Mine2d/engine/EventService.cs @@ -22,11 +22,11 @@ public class EventService { EventPublisher.Publish(EventType.MouseMotion, e); } - if (e.type == SDL_EventType.SDL_MOUSEBUTTONDOWN && e.button.button == SDL_BUTTON_LEFT) + if (e.type == SDL_EventType.SDL_MOUSEBUTTONDOWN) { EventPublisher.Publish(EventType.MouseButtonDown, e); } - if (e.type == SDL_EventType.SDL_MOUSEBUTTONUP && e.button.button == SDL_BUTTON_LEFT) + if (e.type == SDL_EventType.SDL_MOUSEBUTTONUP) { EventPublisher.Publish(EventType.MouseButtonUp, e); } diff --git a/Mine2d/game/backend/interactor/Place.cs b/Mine2d/game/backend/interactor/Place.cs new file mode 100644 index 0000000..100c952 --- /dev/null +++ b/Mine2d/game/backend/interactor/Place.cs @@ -0,0 +1,43 @@ +using Mine2d.engine.system.annotations; +using Mine2d.game.backend.network.packets; +using Mine2d.game.core; +using Mine2d.game.core.data; + +namespace Mine2d.game.backend.interactor; + +[Interactor] +public class Place +{ + [Interaction(InteractorKind.Server, PacketType.Place)] + public static void PlaceServer(PlacePacket packet) + { + var ctx = Context.Get(); + var player = ctx.GameState.Players.Find(p => p.Id == packet.PlayerGuid); + if (player == null) + { + return; + } + if ((player.GetCenter() - packet.Target).LengthSquared() > Constants.BreakDistance * Constants.BreakDistance) + { + return; + } + if (ctx.GameState.World.HasChunkAt(packet.Target)) + { + var chunk = ctx.GameState.World.GetChunkAt(packet.Target); + var tile = chunk.GetTileAt(packet.Target); + var tileId = tile.Id; + if (tileId != 0 || player.Inventory.Hotbar[packet.Slot]?.Count <= 0) + { + return; + } + player.Inventory.Hotbar[packet.Slot].Count--; + var itemId = player.Inventory.Hotbar[packet.Slot].Id; + if (player.Inventory.Hotbar[packet.Slot].Count <= 0) + { + player.Inventory.Hotbar[packet.Slot] = null; + } + var itemTileId = ctx.TileRegistry.GetTileIdByItemId(itemId); + chunk.SetTileAt(packet.Target, STile.From(itemTileId)); + } + } +} diff --git a/Mine2d/game/backend/network/packets/PacketType.cs b/Mine2d/game/backend/network/packets/PacketType.cs index 26bdd5a..f1f7b17 100644 --- a/Mine2d/game/backend/network/packets/PacketType.cs +++ b/Mine2d/game/backend/network/packets/PacketType.cs @@ -9,5 +9,6 @@ public enum PacketType SelfMoved, Break, PlayerMoved, - BlockBroken -} \ No newline at end of file + BlockBroken, + Place +} diff --git a/Mine2d/game/backend/network/packets/PlacePacket.cs b/Mine2d/game/backend/network/packets/PlacePacket.cs new file mode 100644 index 0000000..ce25ef5 --- /dev/null +++ b/Mine2d/game/backend/network/packets/PlacePacket.cs @@ -0,0 +1,10 @@ +namespace Mine2d.game.backend.network.packets; + +public class PlacePacket : Packet +{ + public override PacketType Type => PacketType.Place; + + public Guid PlayerGuid { get; init; } + public Vector2 Target { get; init; } + public int Slot { get; init; } +} diff --git a/Mine2d/game/core/PlayerEntity.cs b/Mine2d/game/core/PlayerEntity.cs index f96daec..1a2a3d6 100644 --- a/Mine2d/game/core/PlayerEntity.cs +++ b/Mine2d/game/core/PlayerEntity.cs @@ -35,6 +35,8 @@ public class PlayerEntity { var world = Context.Get().GameState.World; bool hasCollision; + bool hasSetGround = false; + bool ground = false; do { var pL = p.Position + new Vector2(0, -8); diff --git a/Mine2d/game/core/tiles/TileRegistry.cs b/Mine2d/game/core/tiles/TileRegistry.cs index a813c43..bd7a6ec 100644 --- a/Mine2d/game/core/tiles/TileRegistry.cs +++ b/Mine2d/game/core/tiles/TileRegistry.cs @@ -28,4 +28,9 @@ public class TileRegistry { return this.Tiles[id]; } + + public int GetTileIdByItemId(ItemId itemId) + { + return this.Tiles.FirstOrDefault(x => x.Value.Drop == itemId).Key; + } } diff --git a/Mine2d/game/frontend/events/PlayerPlaceInput.cs b/Mine2d/game/frontend/events/PlayerPlaceInput.cs new file mode 100644 index 0000000..6192cb3 --- /dev/null +++ b/Mine2d/game/frontend/events/PlayerPlaceInput.cs @@ -0,0 +1,30 @@ +using Mine2d.engine.system; +using Mine2d.engine.system.annotations; +using Mine2d.game.backend.network.packets; + +namespace Mine2d.game.frontend.events; + +public class PlayerPlaceInput +{ + [EventListener(EventType.MouseButtonDown)] + public static void OnMouseDown(SDL_Event e) + { + Console.WriteLine("Mouse button down"); + if (e.button.button != SDL_BUTTON_RIGHT) + { + return; + } + + var ctx = Context.Get(); + var amp = ctx.FrontendGameState.MousePosition + / ctx.FrontendGameState.Settings.GameScale + + ctx.FrontendGameState.Camera.Position; + + ctx.Backend.ProcessPacket(new PlacePacket + { + PlayerGuid = ctx.FrontendGameState.PlayerGuid, + Target = amp, + Slot = ctx.FrontendGameState.HotbarIndex + }); + } +}