Merge branch 'client-fix' into develop (read more)

The entire repository builds cleanly, but the client is still broken and
incompatible with the server. Still, I'm merging this build into develop.

I don't know if the client runs correctly.

Much of the modifications since branching from master are untested.
This commit is contained in:
Kayne Ruse
2014-06-11 21:59:44 +10:00
10 changed files with 229 additions and 183 deletions
+1 -1
View File
@@ -124,7 +124,7 @@ void ClientApplication::LoadScene(SceneList sceneIndex) {
activeScene = new OptionsMenu(&config); activeScene = new OptionsMenu(&config);
break; break;
case SceneList::LOBBYMENU: case SceneList::LOBBYMENU:
activeScene = new LobbyMenu(&config, &network, &clientIndex, &accountIndex, &characterIndex); activeScene = new LobbyMenu(&config, &network, &clientIndex, &accountIndex);
break; break;
case SceneList::INWORLD: case SceneList::INWORLD:
activeScene = new InWorld(&config, &network, &clientIndex, &accountIndex, &characterIndex, &combatMap, &characterMap); activeScene = new InWorld(&config, &network, &clientIndex, &accountIndex, &characterIndex, &combatMap, &characterMap);
+41 -38
View File
@@ -85,11 +85,10 @@ void InCombat::FrameStart() {
} }
void InCombat::Update(double delta) { void InCombat::Update(double delta) {
SerialPacket packet; //suck in and process all waiting packets
char packetBuffer[MAX_PACKET_SIZE];
//suck in all waiting packets while(network.Receive(reinterpret_cast<SerialPacket*>(packetBuffer))) {
while(network.Receive(&packet)) { HandlePacket(reinterpret_cast<SerialPacket*>(packetBuffer));
HandlePacket(packet);
} }
//TODO: more //TODO: more
@@ -154,19 +153,19 @@ void InCombat::KeyUp(SDL_KeyboardEvent const& key) {
//Network handlers //Network handlers
//------------------------- //-------------------------
void InCombat::HandlePacket(SerialPacket packet) { void InCombat::HandlePacket(SerialPacket* const argPacket) {
switch(packet.meta.type) { switch(argPacket->type) {
case SerialPacket::Type::DISCONNECT: case SerialPacketType::DISCONNECT:
HandleDisconnect(packet); HandleDisconnect(argPacket);
break; break;
//handle errors //handle errors
default: default:
throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in InCombat: " + to_string_custom(int(packet.meta.type)))); throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in InCombat: " + to_string_custom(static_cast<int>(argPacket->type)) ));
break; break;
} }
} }
void InCombat::HandleDisconnect(SerialPacket) { void InCombat::HandleDisconnect(SerialPacket* const) {
SetNextScene(SceneList::RESTART); SetNextScene(SceneList::RESTART);
} }
@@ -177,52 +176,56 @@ void InCombat::HandleDisconnect(SerialPacket) {
//------------------------- //-------------------------
void InCombat::RequestSynchronize() { void InCombat::RequestSynchronize() {
SerialPacket packet; ClientPacket newPacket;
//request a sync //request a sync
packet.meta.type = SerialPacket::Type::SYNCHRONIZE; newPacket.type = SerialPacketType::SYNCHRONIZE;
packet.clientInfo.clientIndex = clientIndex; newPacket.clientIndex = clientIndex;
packet.clientInfo.accountIndex = accountIndex; newPacket.accountIndex = accountIndex;
packet.clientInfo.characterIndex = characterIndex;
network.SendTo(Channels::SERVER, &packet); network.SendTo(Channels::SERVER, &newPacket);
} }
void InCombat::SendPlayerUpdate() { void InCombat::SendPlayerUpdate() {
SerialPacket packet; CharacterPacket newPacket;
//pack the packet //pack the packet
packet.meta.type = SerialPacket::Type::CHARACTER_UPDATE; newPacket.type = SerialPacketType::CHARACTER_UPDATE;
packet.characterInfo.clientIndex = clientIndex;
packet.characterInfo.accountIndex = accountIndex;
packet.characterInfo.characterIndex = characterIndex;
// packet.characterInfo.position = localCharacter->position;
// packet.characterInfo.motion = localCharacter->motion;
//TODO: stats
network.SendTo(Channels::SERVER, &packet); newPacket.characterIndex = characterIndex;
//handle, avatar
newPacket.accountIndex = accountIndex;
// newPacket.roomIndex = localCharacter->roomIndex;
// newPacket.origin = localCharacter->origin;
// newPacket.motion = localCharacter->motion;
// newPacket.stats = localCharacter->stats;
//TODO: equipment
//TODO: items
//TODO: buffs
//TODO: debuffs
network.SendTo(Channels::SERVER, &newPacket);
} }
void InCombat::RequestDisconnect() { void InCombat::RequestDisconnect() {
SerialPacket packet; ClientPacket newPacket;
//send a disconnect request //send a disconnect request
packet.meta.type = SerialPacket::Type::DISCONNECT; newPacket.type = SerialPacketType::DISCONNECT;
packet.clientInfo.clientIndex = clientIndex; newPacket.clientIndex = clientIndex;
packet.clientInfo.accountIndex = accountIndex; newPacket.accountIndex = accountIndex;
packet.clientInfo.characterIndex = characterIndex;
network.SendTo(Channels::SERVER, &packet); network.SendTo(Channels::SERVER, &newPacket);
} }
void InCombat::RequestShutdown() { void InCombat::RequestShutdown() {
SerialPacket packet; ClientPacket newPacket;
//send a shutdown request //send a shutdown request
packet.meta.type = SerialPacket::Type::SHUTDOWN; newPacket.type = SerialPacketType::SHUTDOWN;
packet.clientInfo.clientIndex = clientIndex; newPacket.clientIndex = clientIndex;
packet.clientInfo.accountIndex = accountIndex; newPacket.accountIndex = accountIndex;
packet.clientInfo.characterIndex = characterIndex;
network.SendTo(Channels::SERVER, &packet); network.SendTo(Channels::SERVER, &newPacket);
} }
+2 -2
View File
@@ -73,8 +73,8 @@ protected:
void KeyUp(SDL_KeyboardEvent const&); void KeyUp(SDL_KeyboardEvent const&);
//Network handlers //Network handlers
void HandlePacket(SerialPacket); void HandlePacket(SerialPacket* const);
void HandleDisconnect(SerialPacket); void HandleDisconnect(SerialPacket* const);
//TODO: more network handlers //TODO: more network handlers
//Server control //Server control
+93 -85
View File
@@ -22,6 +22,7 @@
#include "in_world.hpp" #include "in_world.hpp"
#include "channels.hpp" #include "channels.hpp"
#include "utility.hpp"
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>
@@ -93,11 +94,10 @@ void InWorld::FrameStart() {
} }
void InWorld::Update(double delta) { void InWorld::Update(double delta) {
SerialPacket packet; //suck in and process all waiting packets
char packetBuffer[MAX_PACKET_SIZE];
//suck in all waiting packets while(network.Receive(reinterpret_cast<SerialPacket*>(packetBuffer))) {
while(network.Receive(&packet)) { HandlePacket(reinterpret_cast<SerialPacket*>(packetBuffer));
HandlePacket(packet);
} }
//update the characters //update the characters
@@ -248,76 +248,55 @@ void InWorld::KeyUp(SDL_KeyboardEvent const& key) {
//Network handlers //Network handlers
//------------------------- //-------------------------
void InWorld::HandlePacket(SerialPacket packet) { void InWorld::HandlePacket(SerialPacket* const argPacket) {
switch(packet.meta.type) { switch(argPacket->type) {
case SerialPacket::Type::DISCONNECT: case SerialPacketType::DISCONNECT:
HandleDisconnect(packet); HandleDisconnect(argPacket);
break; break;
case SerialPacket::Type::REGION_CONTENT: case SerialPacketType::CHARACTER_NEW:
HandleRegionContent(packet); HandleCharacterNew(dynamic_cast<CharacterPacket*>(argPacket));
break; break;
case SerialPacket::Type::CHARACTER_UPDATE: case SerialPacketType::CHARACTER_DELETE:
HandleCharacterUpdate(packet); HandleCharacterDelete(dynamic_cast<CharacterPacket*>(argPacket));
break; break;
case SerialPacket::Type::CHARACTER_NEW: case SerialPacketType::CHARACTER_UPDATE:
HandleCharacterNew(packet); HandleCharacterUpdate(dynamic_cast<CharacterPacket*>(argPacket));
break; break;
case SerialPacket::Type::CHARACTER_DELETE: case SerialPacketType::REGION_CONTENT:
HandleCharacterDelete(packet); HandleRegionContent(dynamic_cast<RegionPacket*>(argPacket));
break; break;
//handle errors //handle errors
default: default:
throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in InWorld: " + to_string_custom(int(packet.meta.type)))); throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in InWorld: " + to_string_custom(static_cast<int>(argPacket->type)) ));
break; break;
} }
} }
void InWorld::HandleDisconnect(SerialPacket packet) { void InWorld::HandleDisconnect(SerialPacket* const argPacket) {
SetNextScene(SceneList::RESTART); SetNextScene(SceneList::RESTART);
} }
void InWorld::HandleRegionContent(SerialPacket packet) { void InWorld::HandleCharacterNew(CharacterPacket* const argPacket) {
//replace existing regions if (characterMap.find(argPacket->characterIndex) != characterMap.end()) {
regionPager.UnloadRegion(packet.regionInfo.x, packet.regionInfo.y);
regionPager.PushRegion(packet.regionInfo.region);
packet.regionInfo.region = nullptr;
}
void InWorld::HandleCharacterUpdate(SerialPacket packet) {
if (characterMap.find(packet.characterInfo.characterIndex) == characterMap.end()) {
HandleCharacterNew(packet);
return;
}
//update only if the message didn't originate from here
if (packet.characterInfo.clientIndex != clientIndex) {
characterMap[packet.characterInfo.characterIndex].origin = packet.characterInfo.origin;
characterMap[packet.characterInfo.characterIndex].motion = packet.characterInfo.motion;
}
characterMap[packet.characterInfo.characterIndex].CorrectSprite();
}
void InWorld::HandleCharacterNew(SerialPacket packet) {
if (characterMap.find(packet.characterInfo.characterIndex) != characterMap.end()) {
throw(std::runtime_error("Cannot create duplicate characters")); throw(std::runtime_error("Cannot create duplicate characters"));
} }
//create the character object //create the character object
CharacterData& character = characterMap[packet.characterInfo.characterIndex]; CharacterData& character = characterMap[argPacket->characterIndex];
//set the members //set the members
character.handle = packet.characterInfo.handle; character.handle = argPacket->handle;
character.avatar = packet.characterInfo.avatar; character.avatar = argPacket->avatar;
character.sprite.LoadSurface(config["dir.sprites"] + character.avatar, 4, 4); character.sprite.LoadSurface(config["dir.sprites"] + character.avatar, 4, 4);
character.mapIndex = packet.characterInfo.mapIndex; character.roomIndex = argPacket->roomIndex;
character.origin = packet.characterInfo.origin; character.origin = argPacket->origin;
character.motion = packet.characterInfo.motion; character.motion = argPacket->motion;
character.stats = packet.characterInfo.stats; character.stats = argPacket->stats;
character.CorrectSprite(); character.CorrectSprite();
//catch this client's player object //catch this client's player object
if (packet.characterInfo.characterIndex == characterIndex && !localCharacter) { if (argPacket->characterIndex == characterIndex && !localCharacter) {
localCharacter = &character; localCharacter = &character;
//setup the camera //setup the camera
@@ -331,15 +310,39 @@ void InWorld::HandleCharacterNew(SerialPacket packet) {
} }
} }
void InWorld::HandleCharacterDelete(SerialPacket packet) { void InWorld::HandleCharacterDelete(CharacterPacket* const argPacket) {
//TODO: authenticate when own character is being deleted (linked to a TODO in the server) //TODO: authenticate when own character is being deleted (linked to a TODO in the server)
//catch this client's player object //catch this client's player object
if (packet.characterInfo.characterIndex == characterIndex) { if (argPacket->characterIndex == characterIndex) {
characterIndex = -1; characterIndex = -1;
localCharacter = nullptr; localCharacter = nullptr;
} }
characterMap.erase(packet.characterInfo.characterIndex); characterMap.erase(argPacket->characterIndex);
}
void InWorld::HandleCharacterUpdate(CharacterPacket* const argPacket) {
if (characterMap.find(argPacket->characterIndex) == characterMap.end()) {
HandleCharacterNew(argPacket);
return;
}
CharacterData& character = characterMap[argPacket->characterIndex];
//TODO: review this
if (argPacket->characterIndex != characterIndex) {
character.roomIndex = argPacket->roomIndex;
character.origin = argPacket->origin;
character.motion = argPacket->motion;
character.CorrectSprite();
}
}
void InWorld::HandleRegionContent(RegionPacket* const argPacket) {
//replace existing regions
regionPager.UnloadRegion(argPacket->x, argPacket->y);
regionPager.PushRegion(argPacket->region);
argPacket->region = nullptr;
} }
//------------------------- //-------------------------
@@ -347,63 +350,68 @@ void InWorld::HandleCharacterDelete(SerialPacket packet) {
//------------------------- //-------------------------
void InWorld::RequestSynchronize() { void InWorld::RequestSynchronize() {
SerialPacket packet; ClientPacket newPacket;
//request a sync //request a sync
packet.meta.type = SerialPacket::Type::SYNCHRONIZE; newPacket.type = SerialPacketType::SYNCHRONIZE;
packet.clientInfo.clientIndex = clientIndex; newPacket.clientIndex = clientIndex;
packet.clientInfo.accountIndex = accountIndex; newPacket.accountIndex = accountIndex;
packet.clientInfo.characterIndex = characterIndex;
network.SendTo(Channels::SERVER, &packet); network.SendTo(Channels::SERVER, &newPacket);
} }
void InWorld::SendPlayerUpdate() { void InWorld::SendPlayerUpdate() {
SerialPacket packet; CharacterPacket newPacket;
//pack the packet //pack the packet
packet.meta.type = SerialPacket::Type::CHARACTER_UPDATE; newPacket.type = SerialPacketType::CHARACTER_UPDATE;
packet.characterInfo.clientIndex = clientIndex;
packet.characterInfo.accountIndex = accountIndex;
packet.characterInfo.characterIndex = characterIndex;
packet.characterInfo.origin = localCharacter->origin;
packet.characterInfo.motion = localCharacter->motion;
network.SendTo(Channels::SERVER, &packet); newPacket.characterIndex = characterIndex;
//handle, avatar
newPacket.accountIndex = accountIndex;
newPacket.roomIndex = localCharacter->roomIndex;
newPacket.origin = localCharacter->origin;
newPacket.motion = localCharacter->motion;
newPacket.stats = localCharacter->stats;
//TODO: equipment
//TODO: items
//TODO: buffs
//TODO: debuffs
network.SendTo(Channels::SERVER, &newPacket);
} }
void InWorld::RequestDisconnect() { void InWorld::RequestDisconnect() {
SerialPacket packet; ClientPacket newPacket;
//send a disconnect request //send a disconnect request
packet.meta.type = SerialPacket::Type::DISCONNECT; newPacket.type = SerialPacketType::DISCONNECT;
packet.clientInfo.clientIndex = clientIndex; newPacket.clientIndex = clientIndex;
packet.clientInfo.accountIndex = accountIndex; newPacket.accountIndex = accountIndex;
packet.clientInfo.characterIndex = characterIndex;
network.SendTo(Channels::SERVER, &packet); network.SendTo(Channels::SERVER, &newPacket);
} }
void InWorld::RequestShutDown() { void InWorld::RequestShutDown() {
SerialPacket packet; ClientPacket newPacket;
//send a shutdown request //send a shutdown request
packet.meta.type = SerialPacket::Type::SHUTDOWN; newPacket.type = SerialPacketType::SHUTDOWN;
packet.clientInfo.clientIndex = clientIndex; newPacket.clientIndex = clientIndex;
packet.clientInfo.accountIndex = accountIndex; newPacket.accountIndex = accountIndex;
packet.clientInfo.characterIndex = characterIndex;
network.SendTo(Channels::SERVER, &packet); network.SendTo(Channels::SERVER, &newPacket);
} }
void InWorld::RequestRegion(int mapIndex, int x, int y) { void InWorld::RequestRegion(int roomIndex, int x, int y) {
SerialPacket packet; RegionPacket packet;
//pack the region's data //pack the region's data
packet.meta.type = SerialPacket::Type::REGION_REQUEST; packet.type = SerialPacketType::REGION_REQUEST;
packet.regionInfo.mapIndex = mapIndex; packet.roomIndex = roomIndex;
packet.regionInfo.x = x; packet.x = x;
packet.regionInfo.y = y; packet.y = y;
network.SendTo(Channels::SERVER, &packet); network.SendTo(Channels::SERVER, &packet);
} }
+8 -10
View File
@@ -23,8 +23,6 @@
#define INWORLD_HPP_ #define INWORLD_HPP_
//maps //maps
#include "map_allocator.hpp"
#include "map_file_format.hpp"
#include "region_pager.hpp" #include "region_pager.hpp"
//networking //networking
@@ -80,19 +78,19 @@ protected:
void KeyUp(SDL_KeyboardEvent const&); void KeyUp(SDL_KeyboardEvent const&);
//Network handlers //Network handlers
void HandlePacket(SerialPacket); void HandlePacket(SerialPacket* const);
void HandleDisconnect(SerialPacket); void HandleDisconnect(SerialPacket* const);
void HandleCharacterNew(SerialPacket); void HandleCharacterNew(CharacterPacket* const);
void HandleCharacterDelete(SerialPacket); void HandleCharacterDelete(CharacterPacket* const);
void HandleCharacterUpdate(SerialPacket); void HandleCharacterUpdate(CharacterPacket* const);
void HandleRegionContent(SerialPacket); void HandleRegionContent(RegionPacket* const);
//Server control //Server control
void RequestSynchronize(); void RequestSynchronize();
void SendPlayerUpdate(); void SendPlayerUpdate();
void RequestDisconnect(); void RequestDisconnect();
void RequestShutDown(); void RequestShutDown();
void RequestRegion(int mapIndex, int x, int y); void RequestRegion(int roomIndex, int x, int y);
//utilities //utilities
void UpdateMap(); void UpdateMap();
@@ -112,7 +110,7 @@ protected:
TileSheet tileSheet; TileSheet tileSheet;
//map //map
RegionPager<BlankAllocator, DummyFormat> regionPager; RegionPager regionPager;
//UI //UI
Button disconnectButton; Button disconnectButton;
+41 -37
View File
@@ -34,14 +34,12 @@ LobbyMenu::LobbyMenu(
ConfigUtility* const argConfig, ConfigUtility* const argConfig,
UDPNetworkUtility* const argNetwork, UDPNetworkUtility* const argNetwork,
int* const argClientIndex, int* const argClientIndex,
int* const argAccountIndex, int* const argAccountIndex
int* const argCharacterIndex
): ):
config(*argConfig), config(*argConfig),
network(*argNetwork), network(*argNetwork),
clientIndex(*argClientIndex), clientIndex(*argClientIndex),
accountIndex(*argAccountIndex), accountIndex(*argAccountIndex)
characterIndex(*argCharacterIndex)
{ {
//setup the utility objects //setup the utility objects
image.LoadSurface(config["dir.interface"] + "button_menu.bmp"); image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
@@ -87,9 +85,9 @@ void LobbyMenu::FrameStart() {
void LobbyMenu::Update(double delta) { void LobbyMenu::Update(double delta) {
//suck in and process all waiting packets //suck in and process all waiting packets
SerialPacket packet; char packetBuffer[MAX_PACKET_SIZE];
while(network.Receive(&packet)) { while(network.Receive(reinterpret_cast<SerialPacket*>(packetBuffer))) {
HandlePacket(packet); HandlePacket(reinterpret_cast<SerialPacket*>(packetBuffer));
} }
} }
@@ -149,7 +147,7 @@ void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
if (search.MouseButtonUp(button) == Button::State::HOVER) { if (search.MouseButtonUp(button) == Button::State::HOVER) {
//broadcast to the network, or a specific server //broadcast to the network, or a specific server
SerialPacket packet; SerialPacket packet;
packet.meta.type = SerialPacket::Type::BROADCAST_REQUEST; packet.type = SerialPacketType::BROADCAST_REQUEST;
network.SendTo(config["server.host"].c_str(), config.Int("server.port"), &packet); network.SendTo(config["server.host"].c_str(), config.Int("server.port"), &packet);
//reset the server list //reset the server list
@@ -159,11 +157,9 @@ void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr && selection->compatible) { else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr && selection->compatible) {
//pack the packet //pack the packet
SerialPacket packet; ClientPacket packet;
packet.meta.type = SerialPacket::Type::JOIN_REQUEST; packet.type = SerialPacketType::JOIN_REQUEST;
strncpy(packet.clientInfo.username, config["client.username"].c_str(), PACKET_STRING_SIZE); strncpy(packet.username, config["client.username"].c_str(), PACKET_STRING_SIZE);
strncpy(packet.clientInfo.handle, config["client.handle"].c_str(), PACKET_STRING_SIZE);
strncpy(packet.clientInfo.avatar, config["client.avatar"].c_str(), PACKET_STRING_SIZE);
//join the selected server //join the selected server
network.SendTo(&selection->address, &packet); network.SendTo(&selection->address, &packet);
@@ -176,6 +172,7 @@ void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
else if ( else if (
//has the user selected a server on the list? //has the user selected a server on the list?
//TODO: replace with regular collision checker
button.x > listBox.x && button.x > listBox.x &&
button.x < listBox.x + listBox.w && button.x < listBox.x + listBox.w &&
button.y > listBox.y && button.y > listBox.y &&
@@ -204,34 +201,41 @@ void LobbyMenu::KeyUp(SDL_KeyboardEvent const& key) {
//Network handlers //Network handlers
//------------------------- //-------------------------
void LobbyMenu::HandlePacket(SerialPacket packet) { void LobbyMenu::HandlePacket(SerialPacket* const argPacket) {
switch(packet.meta.type) { switch(argPacket->type) {
case SerialPacket::Type::BROADCAST_RESPONSE: { case SerialPacketType::BROADCAST_RESPONSE:
//extract the data HandleBroadcastResponse(dynamic_cast<ServerPacket*>(argPacket));
ServerInformation server;
server.address = packet.meta.srcAddress;
server.networkVersion = packet.serverInfo.networkVersion;
server.name = packet.serverInfo.name;
server.playerCount = packet.serverInfo.playerCount;
//NOTE: Check compatibility here
server.compatible = server.networkVersion == NETWORK_VERSION;
//push
serverInfo.push_back(server);
}
break; break;
case SerialPacket::Type::JOIN_RESPONSE: case SerialPacketType::JOIN_RESPONSE:
clientIndex = packet.clientInfo.clientIndex; HandleJoinResponse(dynamic_cast<ClientPacket*>(argPacket));
accountIndex = packet.clientInfo.accountIndex;
characterIndex = packet.clientInfo.characterIndex;
network.Bind(&packet.meta.srcAddress, Channels::SERVER);
SetNextScene(SceneList::INWORLD);
break; break;
//handle errors //handle errors
default: default:
throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in LobbyMenu: " + to_string_custom(int(packet.meta.type)))); throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in LobbyMenu: " + to_string_custom(static_cast<int>(argPacket->type)) ));
break; break;
} }
}
void LobbyMenu::HandleBroadcastResponse(ServerPacket* const argPacket) {
//extract the data
ServerInformation server;
server.address = argPacket->srcAddress;
server.name = argPacket->name;
server.playerCount = argPacket->playerCount;
server.version = argPacket->version;
//NOTE: Check compatibility here
server.compatible = server.version == NETWORK_VERSION;
//push
serverInfo.push_back(server);
}
void LobbyMenu::HandleJoinResponse(ClientPacket* const argPacket) {
clientIndex = argPacket->clientIndex;
accountIndex = argPacket->accountIndex;
network.Bind(&argPacket->srcAddress, Channels::SERVER);
SetNextScene(SceneList::INWORLD);
//TODO: send this player's character info
} }
+8 -8
View File
@@ -22,13 +22,13 @@
#ifndef LOBBYMENU_HPP_ #ifndef LOBBYMENU_HPP_
#define LOBBYMENU_HPP_ #define LOBBYMENU_HPP_
//graphics & utilities //graphics & ui
#include "image.hpp" #include "image.hpp"
#include "raster_font.hpp" #include "raster_font.hpp"
#include "button.hpp" #include "button.hpp"
#include "config_utility.hpp"
//network //utilities
#include "config_utility.hpp"
#include "udp_network_utility.hpp" #include "udp_network_utility.hpp"
//client //client
@@ -44,8 +44,7 @@ public:
ConfigUtility* const argConfig, ConfigUtility* const argConfig,
UDPNetworkUtility* const argNetwork, UDPNetworkUtility* const argNetwork,
int* const argClientIndex, int* const argClientIndex,
int* const argAccountIndex, int* const argAccountIndex
int* const argCharacterIndex
); );
~LobbyMenu(); ~LobbyMenu();
@@ -64,14 +63,15 @@ protected:
void KeyUp(SDL_KeyboardEvent const&); void KeyUp(SDL_KeyboardEvent const&);
//Network handlers //Network handlers
void HandlePacket(SerialPacket); void HandlePacket(SerialPacket* const);
void HandleBroadcastResponse(ServerPacket* const);
void HandleJoinResponse(ClientPacket* const);
//shared parameters //shared parameters
ConfigUtility& config; ConfigUtility& config;
UDPNetworkUtility& network; UDPNetworkUtility& network;
int& clientIndex; int& clientIndex;
int& accountIndex; int& accountIndex;
int& characterIndex;
//members //members
Image image; Image image;
@@ -83,9 +83,9 @@ protected:
//server list //server list
struct ServerInformation { struct ServerInformation {
IPaddress address; IPaddress address;
int networkVersion;
std::string name; std::string name;
int playerCount; int playerCount;
int version;
bool compatible; bool compatible;
}; };
+33
View File
@@ -63,7 +63,25 @@ Region* RegionPager::FindRegion(int x, int y) {
return nullptr; return nullptr;
} }
Region* RegionPager::PushRegion(Region* const region) {
if (
region->GetX() != snapToBase(REGION_WIDTH, region->GetX()) ||
region->GetY() != snapToBase(REGION_HEIGHT, region->GetY())
)
{
throw(std::runtime_error("Pushed region does not conform to the region grid"));
}
regionList.push_front(region);
return regionList.front();
}
Region* RegionPager::LoadRegion(int x, int y) { Region* RegionPager::LoadRegion(int x, int y) {
//only work if using lua
if (!luaState) {
throw(std::runtime_error("RegionPager::luaState is null"));
}
//load the region if possible //load the region if possible
//snap the coords //snap the coords
@@ -97,6 +115,11 @@ Region* RegionPager::LoadRegion(int x, int y) {
} }
Region* RegionPager::SaveRegion(int x, int y) { Region* RegionPager::SaveRegion(int x, int y) {
//only work if using lua
if (!luaState) {
throw(std::runtime_error("RegionPager::luaState is null"));
}
//snap the coords //snap the coords
x = snapToBase(REGION_WIDTH, x); x = snapToBase(REGION_WIDTH, x);
y = snapToBase(REGION_HEIGHT, y); y = snapToBase(REGION_HEIGHT, y);
@@ -118,6 +141,11 @@ Region* RegionPager::SaveRegion(int x, int y) {
} }
Region* RegionPager::CreateRegion(int x, int y) { Region* RegionPager::CreateRegion(int x, int y) {
//only work if using lua
if (!luaState) {
throw(std::runtime_error("RegionPager::luaState is null"));
}
//snap the coords //snap the coords
x = snapToBase(REGION_WIDTH, x); x = snapToBase(REGION_WIDTH, x);
y = snapToBase(REGION_HEIGHT, y); y = snapToBase(REGION_HEIGHT, y);
@@ -143,6 +171,11 @@ Region* RegionPager::CreateRegion(int x, int y) {
} }
void RegionPager::UnloadRegion(int x, int y) { void RegionPager::UnloadRegion(int x, int y) {
//only work if using lua
if (!luaState) {
throw(std::runtime_error("RegionPager::luaState is null"));
}
//snap the coords //snap the coords
x = snapToBase(REGION_WIDTH, x); x = snapToBase(REGION_WIDTH, x);
y = snapToBase(REGION_HEIGHT, y); y = snapToBase(REGION_HEIGHT, y);
+2
View File
@@ -29,6 +29,7 @@
#include <list> #include <list>
#include <string> #include <string>
//TODO: split this into two: "RegionPagerBase" and "RegionPagerLua"
class RegionPager { class RegionPager {
public: public:
RegionPager() = default; RegionPager() = default;
@@ -41,6 +42,7 @@ public:
//region manipulation //region manipulation
Region* GetRegion(int x, int y); Region* GetRegion(int x, int y);
Region* FindRegion(int x, int y); Region* FindRegion(int x, int y);
Region* PushRegion(Region* const);
Region* LoadRegion(int x, int y); Region* LoadRegion(int x, int y);
Region* SaveRegion(int x, int y); Region* SaveRegion(int x, int y);
@@ -38,8 +38,6 @@ struct SerialPacketBase {
SerialPacketType type; SerialPacketType type;
IPaddress srcAddress; IPaddress srcAddress;
typedef SerialPacketType Type;
virtual ~SerialPacketBase() {}; virtual ~SerialPacketBase() {};
}; };