From 30aa11c083528d81be4884fb85296023c1e1b3e4 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Mon, 21 Mar 2016 22:06:25 +1100 Subject: [PATCH] Brought client into line with server Also added a new config file for developing over multiple machines. --- .../{base_monster.cpp => base_creature.cpp} | 14 +- .../{base_monster.hpp => base_creature.hpp} | 6 +- client/fatal_error.cpp | 2 +- client/scenes/lobby_menu.cpp | 2 +- client/scenes/world.cpp | 186 +++++++----------- client/scenes/world.hpp | 25 +-- common/network/serial_packet_type.hpp | 5 +- rsc/root_config_win.cfg | 8 + server/server_application.cpp | 11 +- server/server_utilities.cpp | 4 +- 10 files changed, 110 insertions(+), 153 deletions(-) rename client/entities/{base_monster.cpp => base_creature.cpp} (76%) rename client/entities/{base_monster.hpp => base_creature.hpp} (92%) create mode 100644 rsc/root_config_win.cfg diff --git a/client/entities/base_monster.cpp b/client/entities/base_creature.cpp similarity index 76% rename from client/entities/base_monster.cpp rename to client/entities/base_creature.cpp index cda27f8..de89a07 100644 --- a/client/entities/base_monster.cpp +++ b/client/entities/base_creature.cpp @@ -19,28 +19,28 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#include "base_monster.hpp" +#include "base_creature.hpp" #include "config_utility.hpp" -void BaseMonster::CorrectSprite() { - //TODO: (9) BaseMonster::CorrectSprite() +void BaseCreature::CorrectSprite() { + //TODO: (9) BaseCreature::CorrectSprite() } -std::string BaseMonster::SetHandle(std::string s) { +std::string BaseCreature::SetHandle(std::string s) { return handle = s; } -std::string BaseMonster::GetHandle() const { +std::string BaseCreature::GetHandle() const { return handle; } -std::string BaseMonster::SetAvatar(SDL_Renderer* const renderer, std::string s) { +std::string BaseCreature::SetAvatar(SDL_Renderer* const renderer, std::string s) { avatar = s; sprite.Load(renderer, ConfigUtility::GetSingleton()["dir.sprites"] + avatar, 4, 1); return avatar; } -std::string BaseMonster::GetAvatar() const { +std::string BaseCreature::GetAvatar() const { return avatar; } \ No newline at end of file diff --git a/client/entities/base_monster.hpp b/client/entities/base_creature.hpp similarity index 92% rename from client/entities/base_monster.hpp rename to client/entities/base_creature.hpp index d99ee55..1994ab9 100644 --- a/client/entities/base_monster.hpp +++ b/client/entities/base_creature.hpp @@ -23,10 +23,10 @@ #include "entity.hpp" -class BaseMonster: public Entity { +class BaseCreature: public Entity { public: - BaseMonster() = default; - virtual ~BaseMonster() = default; + BaseCreature() = default; + virtual ~BaseCreature() = default; void CorrectSprite(); diff --git a/client/fatal_error.cpp b/client/fatal_error.cpp index c8dba98..175dcab 100644 --- a/client/fatal_error.cpp +++ b/client/fatal_error.cpp @@ -19,6 +19,6 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#include "terminal_error.hpp" +#include "fatal_error.hpp" //DOCS: This empty file is used to force an object file \ No newline at end of file diff --git a/client/scenes/lobby_menu.cpp b/client/scenes/lobby_menu.cpp index c0b8a15..6e1d9aa 100644 --- a/client/scenes/lobby_menu.cpp +++ b/client/scenes/lobby_menu.cpp @@ -122,7 +122,7 @@ void LobbyMenu::RenderFrame(SDL_Renderer* renderer) { //draw the server's info serverVector[i].nameImage.DrawTo(renderer, boundingBox.x, boundingBox.y + boundingBox.h * i); - serverVector[i].playerCountImage.DrawTo(renderer, boundingBox.x+300, boundingBox.y + boundingBox.h * i); + serverVector[i].playerCountImage.DrawTo(renderer, boundingBox.x+276, boundingBox.y + boundingBox.h * i); } } diff --git a/client/scenes/world.cpp b/client/scenes/world.cpp index b9182ec..b9331d1 100644 --- a/client/scenes/world.cpp +++ b/client/scenes/world.cpp @@ -23,7 +23,7 @@ #include "channels.hpp" #include "ip_operators.hpp" -#include "terminal_error.hpp" +#include "fatal_error.hpp" #include #include @@ -32,6 +32,7 @@ #include #include #include + //------------------------- //static functions //------------------------- @@ -103,7 +104,7 @@ World::~World() { //unload the local data TTF_CloseFont(font); characterMap.clear(); - monsterMap.clear(); + creatureMap.clear(); } //------------------------- @@ -125,7 +126,7 @@ void World::Update() { HandlePacket(packetBuffer); } } - catch(terminal_error& e) { + catch(fatal_error& e) { throw(e); } catch(std::exception& e) { @@ -142,7 +143,7 @@ void World::Update() { for (auto& it : characterMap) { it.second.Update(); } - for (auto& it : monsterMap) { + for (auto& it : creatureMap) { it.second.Update(); } @@ -150,7 +151,7 @@ void World::Update() { //update the map UpdateMap(); } - catch(terminal_error& e) { + catch(fatal_error& e) { throw(e); } catch(std::exception& e) { @@ -165,8 +166,6 @@ void World::Update() { //get the collidable boxes std::list boxList = GenerateCollisionGrid(localCharacter, tileSheet.GetTileW(), tileSheet.GetTileH()); - std::cout << "Debug: " << boxList.size() << std::endl; - //process the collisions //BUG: Collisions not working if (localCharacter->ProcessCollisionGrid(boxList)) { @@ -199,7 +198,7 @@ void World::RenderFrame(SDL_Renderer* renderer) { //BUG: #29 Characters (and other entities) are drawn out of order it.second.DrawTo(renderer, camera.x, camera.y); } - for (auto& it : monsterMap) { + for (auto& it : creatureMap) { it.second.DrawTo(renderer, camera.x, camera.y); } @@ -381,55 +380,36 @@ void World::HandlePacket(SerialPacket* const argPacket) { case SerialPacketType::CHARACTER_UPDATE: hCharacterUpdate(static_cast(argPacket)); break; + case SerialPacketType::CHARACTER_CREATE: hCharacterCreate(static_cast(argPacket)); break; - case SerialPacketType::CHARACTER_DELETE: - hCharacterDelete(static_cast(argPacket)); + case SerialPacketType::CHARACTER_UNLOAD: + hCharacterUnload(static_cast(argPacket)); break; + case SerialPacketType::QUERY_CHARACTER_EXISTS: hQueryCharacterExists(static_cast(argPacket)); break; - case SerialPacketType::QUERY_CHARACTER_STATS: - hQueryCharacterStats(static_cast(argPacket)); - break; - case SerialPacketType::QUERY_CHARACTER_LOCATION: - hQueryCharacterLocation(static_cast(argPacket)); - break; + case SerialPacketType::CHARACTER_MOVEMENT: hCharacterMovement(static_cast(argPacket)); break; - case SerialPacketType::CHARACTER_ATTACK: - hCharacterAttack(static_cast(argPacket)); + + //creature management + case SerialPacketType::CREATURE_CREATE: + hCreatureCreate(static_cast(argPacket)); break; - case SerialPacketType::CHARACTER_DAMAGE: - hCharacterDamage(static_cast(argPacket)); + case SerialPacketType::CREATURE_UNLOAD: + hCreatureUnload(static_cast(argPacket)); break; - //monster management - case SerialPacketType::MONSTER_CREATE: - hMonsterCreate(static_cast(argPacket)); + case SerialPacketType::QUERY_CREATURE_EXISTS: + hQueryCreatureExists(static_cast(argPacket)); break; - case SerialPacketType::MONSTER_DELETE: - hMonsterDelete(static_cast(argPacket)); - break; - case SerialPacketType::QUERY_MONSTER_EXISTS: - hQueryMonsterExists(static_cast(argPacket)); - break; - case SerialPacketType::QUERY_MONSTER_STATS: - hQueryMonsterStats(static_cast(argPacket)); - break; - case SerialPacketType::QUERY_MONSTER_LOCATION: - hQueryMonsterLocation(static_cast(argPacket)); - break; - case SerialPacketType::MONSTER_MOVEMENT: - hMonsterMovement(static_cast(argPacket)); - break; - case SerialPacketType::MONSTER_ATTACK: - hMonsterAttack(static_cast(argPacket)); - break; - case SerialPacketType::MONSTER_DAMAGE: - hMonsterDamage(static_cast(argPacket)); + + case SerialPacketType::CREATURE_MOVEMENT: + hCreatureMovement(static_cast(argPacket)); break; //chat @@ -447,7 +427,7 @@ void World::HandlePacket(SerialPacket* const argPacket) { case SerialPacketType::REGION_REJECTION: case SerialPacketType::CHARACTER_REJECTION: case SerialPacketType::QUERY_REJECTION: - throw(terminal_error(static_cast(argPacket)->text)); + throw(fatal_error(static_cast(argPacket)->text)); break; case SerialPacketType::SHUTDOWN_REJECTION: throw(std::runtime_error(static_cast(argPacket)->text)); @@ -709,7 +689,7 @@ void World::hCharacterCreate(CharacterPacket* const argPacket) { newPacket.type = SerialPacketType::QUERY_CHARACTER_EXISTS; newPacket.roomIndex = roomIndex; network.SendTo(Channels::SERVER, &newPacket); - newPacket.type = SerialPacketType::QUERY_MONSTER_EXISTS; + newPacket.type = SerialPacketType::QUERY_CREATURE_EXISTS; network.SendTo(Channels::SERVER, &newPacket); } @@ -717,7 +697,7 @@ void World::hCharacterCreate(CharacterPacket* const argPacket) { std::cout << "Character Create, total: " << characterMap.size() << std::endl; } -void World::hCharacterDelete(CharacterPacket* const argPacket) { +void World::hCharacterUnload(CharacterPacket* const argPacket) { //ignore if this character doesn't exist std::map::iterator characterIt = characterMap.find(argPacket->characterIndex); if (characterIt == characterMap.end()) { @@ -736,7 +716,7 @@ void World::hCharacterDelete(CharacterPacket* const argPacket) { roomIndex = -1; regionPager.UnloadAll(); characterMap.clear(); - monsterMap.clear(); + creatureMap.clear(); } else { //remove this character @@ -744,7 +724,7 @@ void World::hCharacterDelete(CharacterPacket* const argPacket) { } //debug - std::cout << "Character Delete, total: " << characterMap.size() << std::endl; + std::cout << "Character Unload, total: " << characterMap.size() << std::endl; } void World::hQueryCharacterExists(CharacterPacket* const argPacket) { @@ -775,14 +755,6 @@ void World::hQueryCharacterExists(CharacterPacket* const argPacket) { std::cout << "Character Query, total: " << characterMap.size() << std::endl; } -void World::hQueryCharacterStats(CharacterPacket* const argPacket) { - //TODO: (9) World::hQueryCharacterStats() -} - -void World::hQueryCharacterLocation(CharacterPacket* const argPacket) { - //TODO: (9) World::hQueryCharacterLocation() -} - void World::hCharacterMovement(CharacterPacket* const argPacket) { //TODO: (1) Authentication if (argPacket->characterIndex == characterIndex) { @@ -799,110 +771,86 @@ void World::hCharacterMovement(CharacterPacket* const argPacket) { } } -void World::hCharacterAttack(CharacterPacket* const argPacket) { - //TODO: (9) World::hCharacterAttack() -} - -void World::hCharacterDamage(CharacterPacket* const argPacket) { - //TODO: (9) World::hCharacterDamage() -} - //------------------------- -//monster management +//creature management //------------------------- -void World::hMonsterCreate(MonsterPacket* const argPacket) { +void World::hCreatureCreate(CreaturePacket* const argPacket) { //check for logic errors - if (monsterMap.find(argPacket->monsterIndex) != monsterMap.end()) { + if (creatureMap.find(argPacket->creatureIndex) != creatureMap.end()) { std::ostringstream msg; - msg << "Double monster creation event; "; - msg << "Index: " << argPacket->monsterIndex << "; "; + msg << "Double creature creation event; "; + msg << "Index: " << argPacket->creatureIndex << "; "; msg << "Handle: " << argPacket->handle; throw(std::runtime_error(msg.str())); } - //ignore monsters from other rooms + //ignore creatures from other rooms if (roomIndex != argPacket->roomIndex) { //temporary error checking std::ostringstream msg; - msg << "Monster from the wrong room received: "; - msg << "monsterIndex: " << argPacket->monsterIndex << ", roomIndex: " << argPacket->roomIndex; + msg << "Creature from the wrong room received: "; + msg << "creatureIndex: " << argPacket->creatureIndex << ", roomIndex: " << argPacket->roomIndex; throw(std::runtime_error(msg.str())); } //implicitly create the element - BaseMonster* monster = &monsterMap[argPacket->monsterIndex]; + BaseCreature* creature = &creatureMap[argPacket->creatureIndex]; - //fill the monster's info - monster->SetHandle(argPacket->handle); - monster->SetAvatar(GetRenderer(), argPacket->avatar); - monster->SetBounds(argPacket->bounds); - monster->SetOrigin(argPacket->origin); - monster->SetMotion(argPacket->motion); + //fill the creature's info + creature->SetHandle(argPacket->handle); + creature->SetAvatar(GetRenderer(), argPacket->avatar); + creature->SetBounds(argPacket->bounds); + creature->SetOrigin(argPacket->origin); + creature->SetMotion(argPacket->motion); //debug - std::cout << "Monster Create, total: " << monsterMap.size() << std::endl; + std::cout << "Creature Create, total: " << creatureMap.size() << std::endl; } -void World::hMonsterDelete(MonsterPacket* const argPacket) { - //ignore if this monster doesn't exist - std::map::iterator monsterIt = monsterMap.find(argPacket->monsterIndex); - if (monsterIt == monsterMap.end()) { +void World::hCreatureUnload(CreaturePacket* const argPacket) { + //ignore if this creature doesn't exist + std::map::iterator creatureIt = creatureMap.find(argPacket->creatureIndex); + if (creatureIt == creatureMap.end()) { return; } - //remove this monster - monsterMap.erase(monsterIt); + //remove this creature + creatureMap.erase(creatureIt); //debug - std::cout << "Monster Delete, total: " << monsterMap.size() << std::endl; + std::cout << "Creature Unload, total: " << creatureMap.size() << std::endl; } -void World::hQueryMonsterExists(MonsterPacket* const argPacket) { - //ignore monsters in a different room (sub-optimal) +void World::hQueryCreatureExists(CreaturePacket* const argPacket) { + //ignore creatures in a different room (sub-optimal) if (argPacket->roomIndex != roomIndex) { return; } //implicitly create the element - BaseMonster* monster = &monsterMap[argPacket->monsterIndex]; + BaseCreature* creature = &creatureMap[argPacket->creatureIndex]; - //fill the monster's info - monster->SetHandle(argPacket->handle); - monster->SetAvatar(GetRenderer(), argPacket->avatar); - monster->SetBounds(argPacket->bounds); - monster->SetOrigin(argPacket->origin); - monster->SetMotion(argPacket->motion); + //fill the creature's info + creature->SetHandle(argPacket->handle); + creature->SetAvatar(GetRenderer(), argPacket->avatar); + creature->SetBounds(argPacket->bounds); + creature->SetOrigin(argPacket->origin); + creature->SetMotion(argPacket->motion); //debug - std::cout << "Monster Query, total: " << monsterMap.size() << std::endl; + std::cout << "Creature Query, total: " << creatureMap.size() << std::endl; } -void World::hQueryMonsterStats(MonsterPacket* const argPacket) { - //TODO: (9) World::hQueryMonsterStats() -} - -void World::hQueryMonsterLocation(MonsterPacket* const argPacket) { - //TODO: (9) World::hQueryMonsterLocation() -} - -void World::hMonsterMovement(MonsterPacket* const argPacket) { - //ignore if this monster doesn't exist - std::map::iterator monsterIt = monsterMap.find(argPacket->monsterIndex); - if (monsterIt == monsterMap.end()) { +void World::hCreatureMovement(CreaturePacket* const argPacket) { + //ignore if this creature doesn't exist + std::map::iterator creatureIt = creatureMap.find(argPacket->creatureIndex); + if (creatureIt == creatureMap.end()) { return; } - monsterIt->second.SetOrigin(argPacket->origin); - monsterIt->second.SetOrigin(argPacket->motion); -} - -void World::hMonsterAttack(MonsterPacket* const argPacket) { - //TODO: (9) World::hMonsterAttack() -} - -void World::hMonsterDamage(MonsterPacket* const argPacket) { - //TODO: (9) World::hMonsterDamage() + creatureIt->second.SetOrigin(argPacket->origin); + creatureIt->second.SetMotion(argPacket->motion); } //------------------------- diff --git a/client/scenes/world.hpp b/client/scenes/world.hpp index c8b8491..d1e36e3 100644 --- a/client/scenes/world.hpp +++ b/client/scenes/world.hpp @@ -40,7 +40,7 @@ //client #include "base_scene.hpp" -#include "base_monster.hpp" +#include "base_creature.hpp" #include "local_character.hpp" #include "SDL2/SDL.h" @@ -102,25 +102,18 @@ private: //character management void hCharacterUpdate(CharacterPacket* const); void hCharacterCreate(CharacterPacket* const); - void hCharacterDelete(CharacterPacket* const); + void hCharacterUnload(CharacterPacket* const); void hQueryCharacterExists(CharacterPacket* const); - void hQueryCharacterStats(CharacterPacket* const); - void hQueryCharacterLocation(CharacterPacket* const); void hCharacterMovement(CharacterPacket* const); - void hCharacterAttack(CharacterPacket* const); - void hCharacterDamage(CharacterPacket* const); - //monster management - void hMonsterCreate(MonsterPacket* const); - void hMonsterDelete(MonsterPacket* const); - void hQueryMonsterExists(MonsterPacket* const); - void hQueryMonsterStats(MonsterPacket* const); - void hQueryMonsterLocation(MonsterPacket* const); - void hMonsterMovement(MonsterPacket* const); - void hMonsterAttack(MonsterPacket* const); - void hMonsterDamage(MonsterPacket* const); + //creature management + void hCreatureCreate(CreaturePacket* const); + void hCreatureUnload(CreaturePacket* const); + void hQueryCreatureExists(CreaturePacket* const); + void hCreatureMovement(CreaturePacket* const); //chat + //TODO: ui chat engine void hTextBroadcast(TextPacket* const); void hTextSpeech(TextPacket* const); void hTextWhisper(TextPacket* const); @@ -158,7 +151,7 @@ private: //entities std::map characterMap; - std::map monsterMap; + std::map creatureMap; LocalCharacter* localCharacter = nullptr; //heartbeat diff --git a/common/network/serial_packet_type.hpp b/common/network/serial_packet_type.hpp index 281a54b..4485c37 100644 --- a/common/network/serial_packet_type.hpp +++ b/common/network/serial_packet_type.hpp @@ -134,8 +134,11 @@ enum class SerialPacketType { CREATURE_CREATE = 502, CREATURE_UNLOAD = 503, + //find out info from the server + QUERY_CREATURE_EXISTS = 504, + //actions taken - CREATURE_MOVEMENT = 504, + CREATURE_MOVEMENT = 505, FORMAT_END_CREATURE = 599, diff --git a/rsc/root_config_win.cfg b/rsc/root_config_win.cfg new file mode 100644 index 0000000..23f8eff --- /dev/null +++ b/rsc/root_config_win.cfg @@ -0,0 +1,8 @@ +config.next = rsc\config.cfg + +#debugging +server.name = DEV + +client.username = Ratstail91 +client.handle = Female Character +client.avatar = character2.png diff --git a/server/server_application.cpp b/server/server_application.cpp index 3512005..f689432 100644 --- a/server/server_application.cpp +++ b/server/server_application.cpp @@ -136,6 +136,7 @@ void ServerApplication::Init(int argc, char* argv[]) { std::cout << "Internal sizes:" << std::endl; + DEBUG_INTERNAL_VAR(config["server.name"]); DEBUG_INTERNAL_VAR(NETWORK_VERSION); DEBUG_INTERNAL_VAR(sizeof(Region::type_t)); DEBUG_INTERNAL_VAR(sizeof(Region)); @@ -303,6 +304,10 @@ void ServerApplication::HandlePacket(SerialPacket* const argPacket) { hCharacterMovement(static_cast(argPacket)); break; + case SerialPacketType::QUERY_CREATURE_EXISTS: + //TODO: creature queries + break; + //chat case SerialPacketType::TEXT_BROADCAST: hTextBroadcast(static_cast(argPacket)); @@ -656,9 +661,9 @@ void ServerApplication::hCharacterDelete(CharacterPacket* const argPacket) { CharacterData* characterData = characterMgr.Get(characterIndex); roomMgr.PopCharacter(characterData); - //pump character delete + //pump character unload CharacterPacket newPacket; - newPacket.type = SerialPacketType::CHARACTER_DELETE; + newPacket.type = SerialPacketType::CHARACTER_UNLOAD; newPacket.characterIndex = characterIndex; pumpPacketProximity(static_cast(&newPacket), characterData->GetRoomIndex()); @@ -728,7 +733,7 @@ void ServerApplication::hCharacterUnload(CharacterPacket* const argPacket) { //pump character delete CharacterPacket newPacket; - newPacket.type = SerialPacketType::CHARACTER_DELETE; + newPacket.type = SerialPacketType::CHARACTER_UNLOAD; newPacket.characterIndex = argPacket->characterIndex; pumpPacketProximity(static_cast(&newPacket), characterData->GetRoomIndex()); diff --git a/server/server_utilities.cpp b/server/server_utilities.cpp index dece9aa..20733b6 100644 --- a/server/server_utilities.cpp +++ b/server/server_utilities.cpp @@ -105,7 +105,7 @@ void fullCharacterUnload(int index) { //pump character unload CharacterPacket newPacket; - newPacket.type = SerialPacketType::CHARACTER_DELETE; + newPacket.type = SerialPacketType::CHARACTER_UNLOAD; newPacket.characterIndex = characterPair.first; //NOTE: more character info as needed @@ -182,7 +182,7 @@ void pumpAndChangeRooms(CharacterData* const characterData, int newRoomIndex, in //delete from the old room CharacterPacket newPacket; copyCharacterToPacket(&newPacket, characterData, characterIndex); - newPacket.type = SerialPacketType::CHARACTER_DELETE; + newPacket.type = SerialPacketType::CHARACTER_UNLOAD; pumpPacketProximity(&newPacket, characterData->GetRoomIndex()); //move the character between rooms