Skip to content

Commit 196fd69

Browse files
fix PlayerManager
1 parent 165d96d commit 196fd69

6 files changed

Lines changed: 315 additions & 546 deletions

File tree

include/database/DbManager.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,13 @@ class DbManager {
5454
nlohmann::json Query(const std::string& sql) { return backend_->Query(sql); };
5555
nlohmann::json GetPlayer(uint64_t playerId){ return backend_->GetPlayer(playerId); };
5656

57+
bool UpdatePlayerPosition(uint64_t playerId, float x, float y, float z) {
58+
if (backend_) {
59+
return backend_->UpdatePlayerPosition(playerId, x, y, z);
60+
}
61+
return false;
62+
}
63+
5764
// Configuration
5865
bool LoadConfiguration(const std::string& configPath = "");
5966
nlohmann::json GetConfiguration() const { return config_; }

include/game/LogicCore.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#include "network/BinaryProtocol.hpp"
2121
//#include "config/ConfigManager.hpp"
2222
//#include "logging/Logger.hpp"
23-
//#include "database/DbManager.hpp"
23+
#include "database/DbManager.hpp"
2424
//#include "game/RAIIThread.hpp"
2525
#include "game/LogicWorld.hpp"
2626
#include "game/LogicEntity.hpp"

include/game/Player.hpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
#include "logging/Logger.hpp"
1818
#include "config/ConfigManager.hpp"
19-
#include "database/DbManager.hpp"
19+
//#include "database/DbManager.hpp"
2020

2121
#include "game/GameEntity.hpp"
2222
#include "game/InventorySystem.hpp"
@@ -88,6 +88,9 @@ struct PlayerStats {
8888

8989
float total_playtime = 0.0f;
9090
float session_playtime = 0.0f;
91+
int connection_count = 0;
92+
std::chrono::system_clock::time_point last_connect{};
93+
std::chrono::system_clock::time_point last_disconnect{};
9194

9295
nlohmann::json Serialize() const;
9396
void Deserialize(const nlohmann::json& data);
@@ -244,7 +247,7 @@ class Player : public GameEntity {
244247

245248
// Player state management
246249
void Update(float delta_time);
247-
void SaveToDatabase();
250+
bool SaveToDatabase();
248251
bool LoadFromDatabase();
249252
void Regenerate(float delta_time);
250253

@@ -309,9 +312,16 @@ class Player : public GameEntity {
309312
// Player session
310313
void SetSessionId(uint64_t session_id) { session_id_ = session_id; }
311314
uint64_t GetSessionId() const { return session_id_; }
312-
313315
void SetConnectionQuality(float quality) { connection_quality_ = quality; }
314316
float GetConnectionQuality() const { return connection_quality_; }
317+
bool IsOnline() const { return online_; }
318+
319+
void SetBanned(bool banned) { banned_ = banned; }
320+
bool IsBanned() const { return banned_; }
321+
void SetBanReason(const std::string& reason) { ban_reason_ = reason; }
322+
const std::string& GetBanReason() const { return ban_reason_; }
323+
void SetBanExpires(std::chrono::system_clock::time_point expires) { ban_expires_ = expires; };
324+
std::chrono::system_clock::time_point GetBanExpires() const { return ban_expires_; }
315325

316326
// Serialization
317327
virtual nlohmann::json Serialize() const override;
@@ -327,10 +337,13 @@ class Player : public GameEntity {
327337
std::chrono::system_clock::time_point last_movement_;
328338

329339
bool online_ = false;
340+
bool banned_ = false;
341+
std::string ban_reason_;
330342
std::chrono::system_clock::time_point created_at_;
331343
std::chrono::system_clock::time_point last_login_;
332344
std::chrono::system_clock::time_point last_logout_;
333345
std::chrono::system_clock::time_point last_heartbeat_;
346+
std::chrono::system_clock::time_point ban_expires_;
334347

335348
mutable std::shared_mutex mutex_;
336349

include/game/PlayerManager.hpp

Lines changed: 58 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,38 @@
11
#pragma once
22

33
#include <algorithm>
4-
#include <cmath>
4+
#include <atomic>
55
#include <chrono>
6+
#include <cmath>
7+
#include <condition_variable>
68
#include <memory>
7-
#include <unordered_map>
9+
#include <mutex>
10+
#include <random>
811
#include <shared_mutex>
12+
#include <set>
13+
#include <string>
14+
#include <unordered_map>
15+
#include <vector>
916

17+
#include <glm/glm.hpp>
1018
#include <nlohmann/json.hpp>
19+
#include "logging/Logger.hpp"
20+
#include "network/ConnectionManager.hpp"
21+
#include "network/GameSession.hpp"
1122

12-
//#include "logging/Logger.hpp"
13-
//#include "database/DbManager.hpp"
23+
#include "database/DbManager.hpp"
1424
#include "game/RAIIThread.hpp"
1525
#include "game/Player.hpp"
1626

27+
// Forward declarations
28+
//class Player;
29+
1730
struct GlobalPlayerStats {
1831
int total_players = 0;
1932
int online_players = 0;
2033
int total_connections = 0;
21-
int total_playtime = 0;
22-
int average_playtime = 0;
34+
long long total_playtime = 0;
35+
double average_playtime = 0.0;
2336
int level_1_10 = 0;
2437
int level_11_20 = 0;
2538
int level_21_30 = 0;
@@ -28,23 +41,32 @@ struct GlobalPlayerStats {
2841
int level_50_plus = 0;
2942
};
3043

44+
struct Party {
45+
int64_t id;
46+
std::string name;
47+
int64_t leader_id;
48+
std::set<int64_t> members;
49+
std::chrono::system_clock::time_point created_at;
50+
};
51+
3152
class PlayerManager {
3253
public:
3354
static PlayerManager& GetInstance();
3455

3556
std::shared_ptr<Player> CreatePlayer(const std::string& username);
3657
std::shared_ptr<Player> GetPlayer(int64_t playerId);
3758
std::shared_ptr<Player> GetPlayerBySession(uint64_t sessionId);
59+
std::shared_ptr<Player> GetPlayerByUsername(const std::string& username);
60+
uint64_t GetSessionIdByPlayerId(int64_t playerId) const;
3861

3962
bool AuthenticatePlayer(const std::string& username, const std::string& password);
4063
void PlayerConnected(uint64_t sessionId, int64_t playerId);
4164
void PlayerDisconnected(uint64_t sessionId);
4265

43-
// Session management
4466
void BroadcastToNearbyPlayers(int64_t playerId, const nlohmann::json& message);
4567
std::vector<int64_t> GetNearbyPlayers(int64_t playerId, float radius);
68+
std::vector<std::shared_ptr<Player>> GetPlayersInRadius(const glm::vec3& center, float radius);
4669

47-
// Periodic tasks
4870
void SaveAllPlayers();
4971
void CleanupInactivePlayers();
5072

@@ -67,16 +89,27 @@ class PlayerManager {
6789
PlayerStats GetPlayerStats(int64_t playerId) const;
6890
GlobalPlayerStats GetGlobalPlayerStats() const;
6991
void PrintStats();
92+
7093
std::vector<int64_t> SearchPlayers(const std::string& query, int limit);
7194
std::vector<int64_t> GetPlayersByLevelRange(int minLevel, int maxLevel);
95+
7296
void CreateParty(int64_t leaderId, const std::string& partyName);
7397
void AddPlayerToParty(int64_t partyId, int64_t playerId);
7498
void RemovePlayerFromParty(int64_t partyId, int64_t playerId);
7599
std::vector<int64_t> GetPartyMembers(int64_t partyId) const;
76100
int64_t GeneratePartyId();
77101

102+
void Shutdown(); // Added missing declaration
103+
78104
private:
79105
PlayerManager();
106+
~PlayerManager();
107+
108+
void SaveLoop();
109+
void CleanupLoop();
110+
void UpdateConnectionStats(int64_t playerId, bool connected);
111+
112+
DbManager& dbManager_;
80113

81114
mutable std::shared_mutex playersMutex_;
82115
std::unordered_map<int64_t, std::shared_ptr<Player>> players_;
@@ -85,22 +118,30 @@ class PlayerManager {
85118
std::unordered_map<uint64_t, int64_t> sessionToPlayer_;
86119
std::unordered_map<int64_t, uint64_t> playerToSession_;
87120

121+
mutable std::shared_mutex usernameMutex_;
122+
std::unordered_map<std::string, int64_t> usernameToId_;
123+
124+
mutable std::mutex statsMutex_;
125+
std::unordered_map<int64_t, PlayerStats> playerStats_;
126+
127+
mutable std::mutex partyMutex_;
128+
std::unordered_map<int64_t, Party> parties_;
129+
130+
std::chrono::system_clock::time_point lastCleanup_;
131+
88132
// Thread management with RAII
89-
RAIIThread saveThread_; // Added
90-
RAIIThread cleanupThread_; // Added
91-
133+
RAIIThread saveThread_;
134+
RAIIThread cleanupThread_;
135+
92136
std::atomic<bool> running_{true};
93137
std::chrono::minutes saveInterval_{5};
94138
std::chrono::minutes cleanupInterval_{10};
95-
139+
96140
std::condition_variable saveCV_;
97141
std::condition_variable cleanupCV_;
98142
std::mutex saveMutex_;
99143
std::mutex cleanupMutex_;
100144

101-
CitusClient& dbClient_;
102-
103-
// Thread functions
104-
void SaveLoop();
105-
void CleanupLoop();
145+
static constexpr float DEFAULT_BROADCAST_RANGE = 100.0f; // Added
146+
static constexpr size_t MAX_PARTY_SIZE = 5; // Added
106147
};

src/game/Player.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1252,7 +1252,7 @@ void Player::Update(float delta_time) {
12521252
stats_.total_playtime += delta_time;
12531253
}
12541254

1255-
void Player::SaveToDatabase() {
1255+
bool Player::SaveToDatabase() {
12561256
try {
12571257
auto& dbClient = CitusClient::GetInstance();
12581258

@@ -1264,8 +1264,10 @@ void Player::SaveToDatabase() {
12641264
dbClient.SavePlayerData(GetId(), player_json);
12651265

12661266
Logger::Debug("Player {} data saved to database", GetId());
1267+
return true;
12671268
} catch (const std::exception& e) {
12681269
Logger::Error("Failed to save player {} to database: {}", GetId(), e.what());
1270+
return false;
12691271
}
12701272
}
12711273

0 commit comments

Comments
 (0)