diff --git a/client/in_world.cpp b/client/in_world.cpp index ecddb90..6914681 100644 --- a/client/in_world.cpp +++ b/client/in_world.cpp @@ -73,16 +73,8 @@ InWorld::InWorld( //TODO: add the tilesheet to the map system? tileSheet.Load(config["dir.tilesets"] + "terrain.bmp", 12, 15); - //TODO: move this into it's own function //request a sync - SerialPacket packet; - char buffer[PACKET_STRING_SIZE]; - packet.meta.type = SerialPacket::Type::SYNCHRONIZE; - packet.clientInfo.clientIndex = clientIndex; - packet.clientInfo.accountIndex = accountIndex; - packet.clientInfo.characterIndex = characterIndex; - serialize(&packet, buffer); - network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE); + RequestSynchronize(); //debug // RequestRegion(0, 0); @@ -114,7 +106,6 @@ void InWorld::Update(double delta) { for (auto& it : characterMap) { it.second.Update(delta); } - //TODO: sort the players and entities by Y position //update the camera if(localCharacter) { @@ -145,6 +136,7 @@ void InWorld::Render(SDL_Surface* const screen) { //draw characters for (auto& it : characterMap) { + //TODO: drawing order according to Y position it.second.DrawTo(screen, camera.x, camera.y); } @@ -316,20 +308,29 @@ void InWorld::HandleCharacterNew(SerialPacket packet) { throw(std::runtime_error("Cannot create duplicate characters")); } - //TODO: set the player's handle - //TODO: use a reference, don't use a lookup for every call - characterMap[packet.characterInfo.characterIndex].sprite.LoadSurface(config["dir.sprites"] + packet.characterInfo.avatar, 4, 4); - characterMap[packet.characterInfo.characterIndex].position = packet.characterInfo.position; - characterMap[packet.characterInfo.characterIndex].motion = packet.characterInfo.motion; - characterMap[packet.characterInfo.characterIndex].CorrectSprite(); + //create the character object + CharacterData& character = characterMap[packet.characterInfo.characterIndex]; + + //set the members + character.handle = packet.characterInfo.handle; + character.avatar = packet.characterInfo.avatar; + character.sprite.LoadSurface(config["dir.sprites"] + character.avatar, 4, 4); + character.mapIndex = packet.characterInfo.mapIndex; + character.position = packet.characterInfo.position; + character.motion = packet.characterInfo.motion; + character.stats = packet.characterInfo.stats; + + character.CorrectSprite(); //catch this client's player object if (packet.characterInfo.characterIndex == characterIndex && !localCharacter) { - localCharacter = &characterMap[characterIndex]; + localCharacter = &character; //setup the camera + //TODO: can't change the screen size camera.width = GetScreen()->w; camera.height = GetScreen()->h; + //center on the player's character camera.marginX = (GetScreen()->w / 2 - localCharacter->sprite.GetImage()->GetClipW() / 2); camera.marginY = (GetScreen()->h / 2 - localCharacter->sprite.GetImage()->GetClipH() / 2); @@ -337,21 +338,34 @@ void InWorld::HandleCharacterNew(SerialPacket packet) { } void InWorld::HandleCharacterDelete(SerialPacket packet) { - //TODO: authenticate when own character is being deleted - - characterMap.erase(packet.characterInfo.characterIndex); - + //TODO: authenticate when own character is being deleted (linked to a TODO in the server) //catch this client's player object if (packet.characterInfo.characterIndex == characterIndex) { characterIndex = -1; localCharacter = nullptr; } + + characterMap.erase(packet.characterInfo.characterIndex); } //------------------------- //Server control //------------------------- +void InWorld::RequestSynchronize() { + SerialPacket packet; + char buffer[PACKET_STRING_SIZE]; + + //request a sync + packet.meta.type = SerialPacket::Type::SYNCHRONIZE; + packet.clientInfo.clientIndex = clientIndex; + packet.clientInfo.accountIndex = accountIndex; + packet.clientInfo.characterIndex = characterIndex; + + serialize(&packet, buffer); + network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE); +} + void InWorld::SendPlayerUpdate() { SerialPacket packet; char buffer[PACKET_BUFFER_SIZE]; diff --git a/client/in_world.hpp b/client/in_world.hpp index 60a96a8..2062d3e 100644 --- a/client/in_world.hpp +++ b/client/in_world.hpp @@ -90,6 +90,7 @@ protected: void HandleRegionContent(SerialPacket); //Server control + void RequestSynchronize(); void SendPlayerUpdate(); void RequestDisconnect(); void RequestShutDown(); @@ -111,7 +112,6 @@ protected: Image buttonImage; RasterFont font; TileSheet tileSheet; - //TODO: sprites //map RegionPager regionPager; @@ -119,7 +119,7 @@ protected: //UI Button disconnectButton; Button shutDownButton; - //TODO: Fix the camera + //TODO: Review the camera struct { int x = 0, y = 0; int width = 0, height = 0; diff --git a/client/lobby_menu.cpp b/client/lobby_menu.cpp index 8bd5671..cf7732d 100644 --- a/client/lobby_menu.cpp +++ b/client/lobby_menu.cpp @@ -100,8 +100,8 @@ void LobbyMenu::FrameEnd() { } void LobbyMenu::Render(SDL_Surface* const screen) { - //TODO: this needs rewriting //TODO: I need a proper UI system for the entire client and the editor + //UI search.DrawTo(screen); join.DrawTo(screen); @@ -127,7 +127,7 @@ void LobbyMenu::Render(SDL_Surface* const screen) { font.DrawStringTo("?", screen, listBox.x - font.GetCharW(), listBox.y + i*listBox.h); } - //ping? + //TODO: ping/delay? } } diff --git a/rsc/scripts/setup_server.sql b/rsc/scripts/setup_server.sql index d43c592..9ea5498 100644 --- a/rsc/scripts/setup_server.sql +++ b/rsc/scripts/setup_server.sql @@ -1,57 +1,18 @@ ---TODO: Rename the SQL's tables, for consistency -------------------------- ---Server -------------------------- - -CREATE TABLE IF NOT EXISTS UserAccounts ( +CREATE TABLE IF NOT EXISTS Accounts ( uid INTEGER PRIMARY KEY AUTOINCREMENT, username varchar(100) UNIQUE, --TODO: server-client security -- password varchar(100), blacklisted BIT DEFAULT 0, - whitelisted BIT DEFAULT 1 --- TODO: moderator + whitelisted BIT DEFAULT 1, + administrator BIT DEFAULT 0 ); -------------------------- ---Items -------------------------- - -CREATE TABLE IF NOT EXISTS MundaneItems ( - --metadata - uid INTEGER PRIMARY KEY AUTOINCREMENT, - itemID INTEGER, - stackSize INTEGER DEFAULT 0, - owner INTEGER REFERENCES PlayerCharacters(uid) -); - -CREATE TABLE IF NOT EXISTS Consumables ( - --metadata - uid INTEGER PRIMARY KEY AUTOINCREMENT, - itemID INTEGER, - stackSize INTEGER DEFAULT 0, - owner INTEGER REFERENCES PlayerCharacters(uid) - --holds all consumable items info (food, potions, etc.) -); - -CREATE TABLE IF NOT EXISTS Equipment ( - --metadata - uid INTEGER PRIMARY KEY AUTOINCREMENT, - itemID INTEGER, - owner INTEGER REFERENCES PlayerCharacters(uid) - --hold all equipment info - --stat mods, special effects, etc. -); - -------------------------- ---Players -------------------------- - -CREATE TABLE IF NOT EXISTS PlayerCharacters ( +CREATE TABLE IF NOT EXISTS Characters ( uid INTEGER PRIMARY KEY AUTOINCREMENT, --metadata - owner INTEGER REFERENCES UserAccounts(uid), + owner INTEGER REFERENCES Accounts(uid), handle varchar(100) UNIQUE, avatar varchar(100), birth timestamp NOT NULL DEFAULT (datetime()), @@ -78,8 +39,25 @@ CREATE TABLE IF NOT EXISTS PlayerCharacters ( luck REAL DEFAULT 0.0, --equipment - weapon INTEGER REFERENCES Equipment(uid), - helmet INTEGER REFERENCES Equipment(uid), - armour INTEGER REFERENCES Equipment(uid) + weapon INTEGER REFERENCES WornEquipment(uid), + helmet INTEGER REFERENCES WornEquipment(uid), + armour INTEGER REFERENCES WornEquipment(uid) --etc. ); + +CREATE TABLE IF NOT EXISTS InventoryItems ( + --metadata + uid INTEGER PRIMARY KEY AUTOINCREMENT, + itemID INTEGER, --type + stackSize INTEGER DEFAULT 0, + owner INTEGER REFERENCES Characters(uid) +); + +CREATE TABLE IF NOT EXISTS WornEquipment ( + --metadata + uid INTEGER PRIMARY KEY AUTOINCREMENT, + itemID INTEGER, --type + owner INTEGER REFERENCES Characters(uid) + --hold all equipment info + --stat mods, special effects, etc. +); \ No newline at end of file diff --git a/server/account_management.cpp b/server/account_management.cpp index 734244f..cca3630 100644 --- a/server/account_management.cpp +++ b/server/account_management.cpp @@ -29,10 +29,10 @@ //Define the queries //------------------------- -static const char* CREATE_USER_ACCOUNT = "INSERT INTO UserAccounts (username) VALUES (?);"; -static const char* LOAD_USER_ACCOUNT = "SELECT * FROM UserAccounts WHERE username = ?;"; -static const char* SAVE_USER_ACCOUNT = "UPDATE OR FAIL UserAccounts SET blacklisted = ?2, whitelisted = ?3 WHERE uid = ?1;"; -static const char* DELETE_USER_ACCOUNT = "DELETE FROM UserAccounts WHERE uid = ?;"; +static const char* CREATE_USER_ACCOUNT = "INSERT INTO Accounts (username) VALUES (?);"; +static const char* LOAD_USER_ACCOUNT = "SELECT * FROM Accounts WHERE username = ?;"; +static const char* SAVE_USER_ACCOUNT = "UPDATE OR FAIL Accounts SET blacklisted = ?2, whitelisted = ?3 WHERE uid = ?1;"; +static const char* DELETE_USER_ACCOUNT = "DELETE FROM Accounts WHERE uid = ?;"; //------------------------- //Define the methods diff --git a/server/character_management.cpp b/server/character_management.cpp index 3835448..fe7de3e 100644 --- a/server/character_management.cpp +++ b/server/character_management.cpp @@ -30,10 +30,10 @@ //------------------------- //TODO: save and load the statistics -static const char* CREATE_CHARACTER = "INSERT INTO PlayerCharacters (owner, handle, avatar) VALUES (?, ?, ?);"; -static const char* LOAD_CHARACTER = "SELECT * FROM PlayerCharacters WHERE handle = ?;"; -static const char* SAVE_CHARACTER = "UPDATE OR FAIL PlayerCharacters SET mapIndex = ?2, positionX = ?3, positionY = ?4 WHERE uid = ?1;"; -static const char* DELETE_CHARACTER = "DELETE FROM PlayerCharacters WHERE uid = ?;"; +static const char* CREATE_CHARACTER = "INSERT INTO Characters (owner, handle, avatar) VALUES (?, ?, ?);"; +static const char* LOAD_CHARACTER = "SELECT * FROM Characters WHERE handle = ?;"; +static const char* SAVE_CHARACTER = "UPDATE OR FAIL Characters SET mapIndex = ?2, positionX = ?3, positionY = ?4 WHERE uid = ?1;"; +static const char* DELETE_CHARACTER = "DELETE FROM Characters WHERE uid = ?;"; //------------------------- //Define the methods diff --git a/server/server_connections.cpp b/server/server_connections.cpp index 0027b6c..1e771c3 100644 --- a/server/server_connections.cpp +++ b/server/server_connections.cpp @@ -106,6 +106,8 @@ void ServerApplication::HandleSynchronize(SerialPacket packet) { newPacket.characterInfo.mapIndex = it.second.mapIndex; newPacket.characterInfo.position = it.second.position; newPacket.characterInfo.motion = it.second.motion; + newPacket.characterInfo.stats = it.second.stats; + serialize(&newPacket, buffer); network.Send(&clientMap[packet.clientInfo.clientIndex].address, buffer, PACKET_BUFFER_SIZE); }