Skip to content

Commit b812b67

Browse files
continue refactor network layer
1 parent bf7d072 commit b812b67

21 files changed

Lines changed: 1325 additions & 1412 deletions

include/game/GameData.hpp

Lines changed: 143 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,98 @@
11
#pragma once
22

33
#include <cstdint>
4+
#include <variant>
45

56
#include <glm/glm.hpp>
67
#include <nlohmann/json.hpp>
78

9+
enum class LootRarity {
10+
COMMON,
11+
UNCOMMON,
12+
RARE,
13+
EPIC,
14+
LEGENDARY,
15+
MYTHIC
16+
};
17+
18+
enum class LootType {
19+
MISC,
20+
WEAPON,
21+
AMMO,
22+
ARMOR,
23+
CONSUMABLE,
24+
MATERIAL,
25+
QUEST,
26+
KEY,
27+
CURRENCY,
28+
JEWELRY
29+
};
30+
31+
enum class InventoryMoveType {
32+
REMOVE,
33+
USE, // use for self
34+
TRADE
35+
};
36+
37+
struct WeaponStats {
38+
uint16_t damage; // use as default if weapon like knife (without ammo, ammo_capacity always zero)
39+
uint8_t ammo_capacity;
40+
uint8_t delay_between_shots; // milliseconds, delay reloading between shots
41+
uint8_t element; // 0=physical, 1=fire, etc.
42+
uint8_t required_level;
43+
};
44+
45+
struct AmmoStats {
46+
float speed;
47+
uint16_t damage;
48+
};
49+
50+
struct ArmorStats {
51+
uint16_t defense;
52+
uint16_t durability;
53+
uint16_t max_durability;
54+
uint8_t armor_class; // light/medium/heavy
55+
uint8_t required_level;
56+
};
57+
58+
struct ConsumableStats {
59+
uint16_t effect_id; // e.g., healing potion, mana elixir
60+
uint16_t effect_power;
61+
uint32_t cooldown_ms;
62+
};
63+
64+
struct JewelryStats {
65+
uint16_t stat_bonus_type; // strength, intelligence, etc.
66+
uint16_t stat_bonus_value;
67+
uint8_t socket_count;
68+
};
69+
70+
struct QuestItem {
71+
uint32_t quest_id;
72+
uint32_t objective_index;
73+
};
74+
75+
using LootPayload = std::variant<
76+
std::monostate, // MISC, MATERIAL, KEY, CURRENCY
77+
WeaponStats,
78+
AmmoStats,
79+
ArmorStats,
80+
ConsumableStats,
81+
JewelryStats,
82+
QuestItem
83+
>;
84+
85+
886
struct AuthenticationData {
87+
uint64_t timestamp;
88+
uint64_t session_id;
989
std::string username;
1090
std::string password;
11-
uint64_t session_id;
1291
};
1392

1493
struct PlayerStateData {
94+
uint64_t timestamp;
95+
uint64_t session_id;
1596
uint64_t player_id;
1697
uint32_t input_id;
1798
glm::vec3 position;
@@ -22,30 +103,80 @@ struct PlayerStateData {
22103
bool jumping;
23104
bool crouching;
24105
bool sprinting;
25-
uint64_t timestamp;
26-
uint64_t session_id;
27106
};
28107

29108
struct PlayerPositionData {
109+
uint64_t timestamp;
110+
uint64_t session_id;
30111
uint64_t player_id;
31112
glm::vec3 position;
32113
glm::vec3 velocity;
33-
uint64_t timestamp;
34-
uint64_t session_id;
35114
};
36115

37-
struct ChunkRequestData {
116+
struct ChunkData {
117+
uint64_t timestamp;
118+
uint64_t session_id;
38119
int chunk_x;
39120
int chunk_z;
40121
uint8_t lod;
41-
uint64_t session_id; // which session requested it
122+
nlohmann::json chunk_json;
42123
};
43124

44-
struct ChunkData {
45-
int chunk_x;
46-
int chunk_z;
47-
uint8_t lod;
48-
nlohmann::json chunk_json; // already serialized
125+
struct CollisionData {
126+
uint64_t timestamp;
127+
uint64_t session_id;
128+
glm::vec3 position;
129+
float radius;
130+
};
131+
132+
struct NpcData {
133+
uint64_t timestamp;
134+
uint64_t session_id;
135+
uint64_t player_id;
136+
uint64_t npc_id;
137+
float damage;
138+
float health;
139+
bool is_dead;
140+
std::string type; // "combat" or "dialogue"
141+
nlohmann::json quests; // for dialogue
142+
};
143+
144+
struct FamiliarData {
49145
uint64_t timestamp;
50146
uint64_t session_id;
147+
uint64_t familiar_id;
148+
uint64_t target_id;
149+
bool success;
150+
std::string command;
151+
};
152+
153+
struct EntitySpawnData {
154+
uint64_t timestamp;
155+
uint64_t session_id;
156+
uint64_t entity_id;
157+
int type;
158+
glm::vec3 position;
159+
};
160+
161+
struct LootPickupData {
162+
uint64_t timestamp;
163+
uint64_t session_id;
164+
uint64_t player_id;
165+
uint64_t loot_id; // world instance ID
166+
LootType type;
167+
LootRarity rarity;
168+
uint16_t quantity; // stack size (ignored for non‑stackables)
169+
LootPayload payload; // type‑safe extra data
170+
};
171+
172+
struct InventoryData {
173+
uint64_t timestamp;
174+
uint64_t session_id;
175+
uint64_t player_id;
176+
uint64_t loot_id; // world instance ID
177+
int use_slot_id; // equipmentSlots
178+
int inv_slot_id; // inventorySlots
179+
uint64_t target_id; // optional, if move_type TRADE
180+
uint16_t quantity;
181+
InventoryMoveType move_type;
51182
};

include/game/GameLogic.hpp

Lines changed: 23 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -30,62 +30,35 @@ class GameLogic : public LogicCore, public std::enable_shared_from_this<GameLogi
3030
public:
3131
static GameLogic& GetInstance();
3232

33-
// Core lifecycle
3433
void Initialize() override;
3534
void Shutdown() override;
3635

37-
// World configuration
3836
struct WorldConfig : public LogicWorld::WorldConfig {};
3937
void SetWorldConfig(const WorldConfig& config);
4038
const WorldConfig& GetWorldConfig() const;
4139

42-
// World maintenance
4340
void PerformMaintenance();
4441

45-
// IPC message handling
46-
void HandleIPCMessage(const nlohmann::json& message);
47-
48-
// World methods
4942
std::shared_ptr<WorldChunk> GetOrCreateChunk(int chunkX, int chunkZ);
5043
void GenerateWorldAroundPlayer(uint64_t playerId, const glm::vec3& position);
5144
void PreloadWorldData(float radius);
5245
float GetTerrainHeight(float x, float z) const;
5346
BiomeType GetBiomeAt(float x, float z) const;
5447

55-
// Entity methods
5648
uint64_t SpawnNPC(NPCType type, const glm::vec3& position, uint64_t ownerId = 0);
5749
void DespawnNPC(uint64_t npcId);
5850
NPCEntity* GetNPCEntity(uint64_t npcId);
5951
GameEntity* GetEntity(uint64_t entityId);
6052
std::shared_ptr<Player> GetPlayer(uint64_t playerId);
6153

62-
// Collision methods
6354
CollisionResult CheckCollision(const glm::vec3& position, float radius, uint64_t excludeEntityId = 0);
6455
bool Raycast(const glm::vec3& origin, const glm::vec3& direction, float maxDistance, RaycastHit& hit);
6556

66-
// Loot methods
6757
void CreateLootEntity(const glm::vec3& position, std::shared_ptr<LootItem> item, int quantity);
68-
void HandleLootPickup(uint64_t sessionId, const nlohmann::json& data);
69-
void HandleInventoryMove(uint64_t sessionId, const nlohmann::json& data);
70-
void HandleItemUse(uint64_t sessionId, const nlohmann::json& data);
71-
void HandleItemDrop(uint64_t sessionId, const nlohmann::json& data);
72-
void HandleTradeRequest(uint64_t sessionId, const nlohmann::json& data);
73-
void HandleGoldTransaction(uint64_t sessionId, const nlohmann::json& data);
74-
75-
// Message handlers (remaining non-virtual ones)
76-
void HandleNPCInteraction(uint64_t sessionId, const nlohmann::json& data);
77-
void HandleCollisionCheck(uint64_t sessionId, const nlohmann::json& data);
78-
void HandleEntitySpawnRequest(uint64_t sessionId, const nlohmann::json& data);
79-
void HandleFamiliarCommand(uint64_t sessionId, const nlohmann::json& data);
80-
81-
// Message handling entry points
82-
void HandleMessage(uint64_t sessionId, const nlohmann::json& message);
83-
84-
// Player connection/disconnection
58+
8559
void OnPlayerConnected(uint64_t sessionId, uint64_t playerId) override;
8660
void OnPlayerDisconnected(uint64_t sessionId) override;
8761

88-
// Broadcasting methods (still used)
8962
void BroadcastToNearbyPlayers(const glm::vec3& position, uint16_t messageType,
9063
const std::vector<uint8_t>& data, float radius = 50.0f);
9164
void BroadcastToNearbyOnlinePlayers(const glm::vec3& position, uint16_t messageType,
@@ -106,23 +79,34 @@ class GameLogic : public LogicCore, public std::enable_shared_from_this<GameLogi
10679
void SendAuthenticationSuccess(uint64_t sessionId, uint64_t playerId, const std::string& message);
10780
void SendAuthenticationFailure(uint64_t sessionId, const std::string& message);
10881

109-
// Callback setters for network layer
11082
void SetSendAuthenticationResponseCallback(std::function<void(uint64_t sessionId, bool success, const std::string& message, uint64_t playerId)> cb);
11183
void SetSendChunkCallback(std::function<void(uint64_t sessionId, const ChunkData&)> cb);
84+
void SetSendCollisionResponseCallback(std::function<void(uint64_t session_id, const CollisionResult& result)> cb);
11285
void SetPlayerStateCallback(std::function<void(const PlayerStateData&)> cb);
11386
void SetBroadcastPlayerPositionCallback(std::function<void(const PlayerPositionData&, float radius)> cb);
87+
void SetSendNPCInteractionResponseCallback(std::function<void(uint64_t session_id, const NpcData& response)> cb);
88+
void SetSendFamiliarCommandResponseCallback(std::function<void(uint64_t session_id, const FamiliarData& response)> cb);
89+
void SetSendEntitySpawnResponseCallback(std::function<void(uint64_t session_id, const EntitySpawnData& response)> cb);
90+
void SetSendLootPickupResponseCallback(std::function<void(uint64_t session_id, const LootPickupData& response)> cb);
91+
void SetSendInventoryResponseCallback(std::function<void(uint64_t session_id, const InventoryData& response)> cb);
11492

115-
// Incoming data entry points (called by sessions)
11693
void OnAuthentication(const AuthenticationData& data);
117-
void OnChunkRequest(const ChunkRequestData& data);
94+
void OnChunkRequest(const ChunkData& data);
95+
void OnCollisionCheck(const CollisionData& data);
11896
void OnPlayerPosition(const PlayerPositionData& data);
11997
void OnPlayerState(const PlayerStateData& data);
98+
void OnNPCInteraction(const NpcData& data);
99+
void OnFamiliarCommand(const FamiliarData& data);
100+
void OnEntitySpawnRequest(const EntitySpawnData& data);
101+
void OnLootPickup(const LootPickupData& data);
102+
void OnInventory(const InventoryData& data);
120103

121-
// Overrides of virtual methods from LogicCore
104+
// scripting
105+
void RegisterPythonEventHandlers() override;
122106
void FirePythonEvent(const std::string& eventName, const nlohmann::json& data) override;
123107
nlohmann::json CallPythonFunction(const std::string& moduleName, const std::string& functionName,
124108
const nlohmann::json& args) override;
125-
void RegisterPythonEventHandlers() override;
109+
126110
void SaveGameState() override;
127111
void CleanupOldData() override;
128112
void ProcessGameTick(float deltaTime) override;
@@ -135,7 +119,6 @@ class GameLogic : public LogicCore, public std::enable_shared_from_this<GameLogi
135119
void HandleCombat(uint64_t sessionId, const nlohmann::json& data) override;
136120
void HandleQuest(uint64_t sessionId, const nlohmann::json& data) override;
137121

138-
// Additional helpers
139122
void SetDatabaseService(DatabaseService* dbService);
140123
void SetConnectionManager(std::shared_ptr<ConnectionManager> connMgr);
141124
void SetDatabaseBackend(std::unique_ptr<DatabaseBackend> backend);
@@ -157,17 +140,21 @@ class GameLogic : public LogicCore, public std::enable_shared_from_this<GameLogi
157140

158141
std::function<void(uint64_t, bool, const std::string&, uint64_t)> sendAuthResponseCb_;
159142
std::function<void(uint64_t, const ChunkData&)> sendChunkCb_;
143+
std::function<void(uint64_t, const CollisionResult&)> sendCollisionResponseCb_;
160144
std::function<void(const PlayerPositionData&, float)> broadcastPlayerPositionCb_;
161145
std::function<void(const PlayerStateData&)> playerStateCb_;
146+
std::function<void(uint64_t, const NpcData&)> sendNPCInteractionResponseCb_;
147+
std::function<void(uint64_t, const FamiliarData&)> sendFamiliarCommandResponseCb_;
148+
std::function<void(uint64_t, const EntitySpawnData&)> sendEntitySpawnResponseCb_;
149+
std::function<void(uint64_t, const LootPickupData&)> sendLootPickupResponseCb_;
150+
std::function<void(uint64_t, const InventoryData&)> sendInventoryResponseCb_;
162151

163152
bool pythonEnabled_ = false;
164153

165154
void GameLoop() override;
166155
void SpawnerLoop() override;
167156
void UpdateWorld(float deltaTime);
168157

169-
// Helper methods
170-
void RegisterWorldHandlers();
171158
bool LoadGameData();
172159
void SaveChunkData();
173160

include/game/InventorySystem.hpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
#include "database/DbManager.hpp"
1010
#include "logging/Logger.hpp"
11+
12+
#include "game/GameData.hpp"
1113
#include "game/LootItem.hpp"
1214

1315
struct InventorySlot {
@@ -27,15 +29,16 @@ class InventorySystem {
2729
// Inventory management
2830
bool AddItem(uint64_t playerId, const LootItem& item, int quantity = 1);
2931
bool RemoveItem(uint64_t playerId, uint64_t itemId, int quantity = 1);
32+
bool UseItem(uint64_t playerId, uint64_t itemId, int quantity = 1);
3033
bool MoveItem(uint64_t playerId, int fromSlot, int toSlot);
3134
bool SwapItems(uint64_t playerId, int slot1, int slot2);
3235
bool SplitStack(uint64_t playerId, int slot, int splitQuantity);
3336
bool MergeStacks(uint64_t playerId, int sourceSlot, int targetSlot);
3437

3538
// Equipment management
36-
bool EquipItem(uint64_t playerId, int inventorySlot);
37-
bool UnequipItem(uint64_t playerId, int equipmentSlot);
38-
bool AutoEquip(uint64_t playerId, uint64_t itemId);
39+
bool EquipItem(uint64_t playerId, int inventorySlot, int quantity = 1);
40+
bool UnequipItem(uint64_t playerId, int equipmentSlot, int quantity = 1);
41+
bool AutoEquip(uint64_t playerId, uint64_t itemId, int quantity = 1);
3942

4043
// Query methods
4144
std::shared_ptr<LootItem> GetItem(uint64_t playerId, int slot);

include/game/LogicCore.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@ class LogicCore {
5454
uint64_t GetPlayerIdBySession(uint64_t sessionId) const;
5555
uint64_t GetSessionIdByPlayer(uint64_t playerId) const;
5656

57-
void SendError(uint64_t sessionId, const std::string& message, int code = 0);
58-
void SendSuccess(uint64_t sessionId, const std::string& message, const nlohmann::json& data = {});
59-
void SendToSession(uint64_t sessionId, const nlohmann::json& message);
60-
void SendBinaryToSession(uint64_t sessionId, uint16_t messageType, const std::vector<uint8_t>& data);
57+
void SendError(uint64_t sessionId, const std::string& description, int code = 0);
58+
void SendSuccess(uint64_t sessionId, const std::string& description, const nlohmann::json& data = {});
59+
void SendToSession(uint64_t sessionId, uint16_t messageType, const std::vector<uint8_t>& data);
60+
void SendToSessionJson(uint64_t sessionId, const nlohmann::json& message);
6161

6262
// Python scripting – virtual, to be overridden by GameLogic
6363
virtual void FirePythonEvent(const std::string& eventName, const nlohmann::json& data);

0 commit comments

Comments
 (0)