Multiple changes, read more
* Implemented HeartbeatUtility * simplified the SQL files * Added a dummy inventory button
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "heartbeat_utility.hpp"
|
||||
|
||||
#include "channels.hpp"
|
||||
#include "ip_operators.hpp"
|
||||
|
||||
//heartbeat system
|
||||
void HeartbeatUtility::hPing(ServerPacket* const argPacket) {
|
||||
ServerPacket newPacket;
|
||||
newPacket.type = SerialPacketType::PONG;
|
||||
network.SendTo(argPacket->srcAddress, &newPacket);
|
||||
}
|
||||
|
||||
void HeartbeatUtility::hPong(ServerPacket* const argPacket) {
|
||||
if (*network.GetIPAddress(Channels::SERVER) != argPacket->srcAddress) {
|
||||
throw(std::runtime_error("Heartbeat message received from an unknown source"));
|
||||
}
|
||||
attemptedBeats = 0;
|
||||
lastBeat = Clock::now();
|
||||
}
|
||||
|
||||
int HeartbeatUtility::CheckHeartBeat() {
|
||||
//check the connection (heartbeat)
|
||||
if (Clock::now() - lastBeat > std::chrono::seconds(3)) {
|
||||
if (attemptedBeats > 2) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
ServerPacket newPacket;
|
||||
newPacket.type = SerialPacketType::PING;
|
||||
network.SendTo(Channels::SERVER, &newPacket);
|
||||
|
||||
attemptedBeats++;
|
||||
lastBeat = Clock::now();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "server_packet.hpp"
|
||||
#include "udp_network_utility.hpp"
|
||||
|
||||
#include <chrono>
|
||||
|
||||
class HeartbeatUtility {
|
||||
public:
|
||||
//heartbeat system
|
||||
void hPing(ServerPacket* const);
|
||||
void hPong(ServerPacket* const);
|
||||
|
||||
int CheckHeartBeat();
|
||||
|
||||
private:
|
||||
UDPNetworkUtility& network = UDPNetworkUtility::GetSingleton();
|
||||
typedef std::chrono::steady_clock Clock;
|
||||
Clock::time_point lastBeat = Clock::now();
|
||||
int attemptedBeats = 0;
|
||||
};
|
||||
+18
-41
@@ -77,12 +77,16 @@ World::World(int* const argClientIndex, int* const argAccountIndex):
|
||||
disconnectButton.SetText(GetRenderer(), font, WHITE, "Disconnect");
|
||||
shutdownButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||
shutdownButton.SetText(GetRenderer(), font, WHITE, "Shutdown");
|
||||
inventoryButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||
inventoryButton.SetText(GetRenderer(), font, WHITE, "Inventory");
|
||||
|
||||
//set the button positions
|
||||
disconnectButton.SetX(50);
|
||||
disconnectButton.SetY(50);
|
||||
shutdownButton.SetX(50);
|
||||
shutdownButton.SetY(70);
|
||||
inventoryButton.SetX(50);
|
||||
inventoryButton.SetY(90);
|
||||
|
||||
//load the tilesheet
|
||||
//TODO: (2) Tile size and tile sheet should be loaded elsewhere
|
||||
@@ -161,7 +165,12 @@ void World::Update() {
|
||||
delete reinterpret_cast<char*>(packetBuffer);
|
||||
|
||||
//heartbeat system
|
||||
CheckHeartBeat();
|
||||
if (heartbeatUtility.CheckHeartBeat()) {
|
||||
//escape to the disconnect screen
|
||||
SendDisconnectRequest();
|
||||
SetSceneSignal(SceneSignal::DISCONNECTEDSCREEN);
|
||||
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "Error: Lost connection to the server";
|
||||
}
|
||||
|
||||
//update all entities
|
||||
for (auto& it : characterMap) {
|
||||
@@ -261,6 +270,7 @@ void World::RenderFrame(SDL_Renderer* renderer) {
|
||||
//draw UI
|
||||
disconnectButton.DrawTo(renderer);
|
||||
shutdownButton.DrawTo(renderer);
|
||||
inventoryButton.DrawTo(renderer);
|
||||
|
||||
//FPS
|
||||
fpsTextLine.DrawTo(renderer);
|
||||
@@ -285,11 +295,13 @@ void World::QuitEvent() {
|
||||
void World::MouseMotion(SDL_MouseMotionEvent const& event) {
|
||||
disconnectButton.MouseMotion(event);
|
||||
shutdownButton.MouseMotion(event);
|
||||
inventoryButton.MouseMotion(event);
|
||||
}
|
||||
|
||||
void World::MouseButtonDown(SDL_MouseButtonEvent const& event) {
|
||||
disconnectButton.MouseButtonDown(event);
|
||||
shutdownButton.MouseButtonDown(event);
|
||||
inventoryButton.MouseButtonDown(event);
|
||||
}
|
||||
|
||||
void World::MouseButtonUp(SDL_MouseButtonEvent const& event) {
|
||||
@@ -299,6 +311,9 @@ void World::MouseButtonUp(SDL_MouseButtonEvent const& event) {
|
||||
if (shutdownButton.MouseButtonUp(event) == Button::State::RELEASED) {
|
||||
SendAdminShutdownRequest();
|
||||
}
|
||||
if (inventoryButton.MouseButtonUp(event) == Button::State::RELEASED) {
|
||||
//TODO: show the inventory screen
|
||||
}
|
||||
}
|
||||
|
||||
void World::MouseWheel(SDL_MouseWheelEvent const& event) {
|
||||
@@ -411,10 +426,10 @@ void World::HandlePacket(SerialPacket* const argPacket) {
|
||||
switch(argPacket->type) {
|
||||
//heartbeat system
|
||||
case SerialPacketType::PING:
|
||||
hPing(static_cast<ServerPacket*>(argPacket));
|
||||
heartbeatUtility.hPing(static_cast<ServerPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::PONG:
|
||||
hPong(static_cast<ServerPacket*>(argPacket));
|
||||
heartbeatUtility.hPong(static_cast<ServerPacket*>(argPacket));
|
||||
break;
|
||||
|
||||
//game server connections
|
||||
@@ -520,44 +535,6 @@ void World::HandlePacket(SerialPacket* const argPacket) {
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//heartbeat system
|
||||
//-------------------------
|
||||
|
||||
void World::hPing(ServerPacket* const argPacket) {
|
||||
ServerPacket newPacket;
|
||||
newPacket.type = SerialPacketType::PONG;
|
||||
network.SendTo(argPacket->srcAddress, &newPacket);
|
||||
}
|
||||
|
||||
void World::hPong(ServerPacket* const argPacket) {
|
||||
if (*network.GetIPAddress(Channels::SERVER) != argPacket->srcAddress) {
|
||||
throw(std::runtime_error("Heartbeat message received from an unknown source"));
|
||||
}
|
||||
attemptedBeats = 0;
|
||||
lastBeat = Clock::now();
|
||||
}
|
||||
|
||||
void World::CheckHeartBeat() {
|
||||
//check the connection (heartbeat)
|
||||
if (Clock::now() - lastBeat > std::chrono::seconds(3)) {
|
||||
if (attemptedBeats > 2) {
|
||||
//escape to the disconnect screen
|
||||
SendDisconnectRequest();
|
||||
SetSceneSignal(SceneSignal::DISCONNECTEDSCREEN);
|
||||
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "Error: Lost connection to the server";
|
||||
}
|
||||
else {
|
||||
ServerPacket newPacket;
|
||||
newPacket.type = SerialPacketType::PING;
|
||||
network.SendTo(Channels::SERVER, &newPacket);
|
||||
|
||||
attemptedBeats++;
|
||||
lastBeat = Clock::now();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//Connection control
|
||||
//-------------------------
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
#include "base_scene.hpp"
|
||||
#include "base_barrier.hpp"
|
||||
#include "base_creature.hpp"
|
||||
#include "heartbeat_utility.hpp"
|
||||
#include "local_character.hpp"
|
||||
|
||||
#include "SDL2/SDL.h"
|
||||
@@ -80,12 +81,6 @@ private:
|
||||
//handle incoming traffic
|
||||
void HandlePacket(SerialPacket* const);
|
||||
|
||||
//heartbeat system
|
||||
void hPing(ServerPacket* const);
|
||||
void hPong(ServerPacket* const);
|
||||
|
||||
void CheckHeartBeat();
|
||||
|
||||
//basic connections
|
||||
void SendLogoutRequest();
|
||||
void SendDisconnectRequest();
|
||||
@@ -148,6 +143,7 @@ private:
|
||||
TTF_Font* font = nullptr;
|
||||
Button disconnectButton;
|
||||
Button shutdownButton;
|
||||
Button inventoryButton;
|
||||
FrameRate fps;
|
||||
TextLine fpsTextLine;
|
||||
|
||||
@@ -165,11 +161,9 @@ private:
|
||||
LocalCharacter* localCharacter = nullptr;
|
||||
|
||||
//heartbeat
|
||||
//TODO: (2) Heartbeat needs it's own utility
|
||||
HeartbeatUtility heartbeatUtility;
|
||||
typedef std::chrono::steady_clock Clock;
|
||||
Clock::time_point lastBeat = Clock::now();
|
||||
Clock::time_point queryTime = Clock::now() - std::chrono::seconds(4); //back 4 seconds to trigger automatically
|
||||
int attemptedBeats = 0;
|
||||
|
||||
//ugly references; I hate this
|
||||
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||
|
||||
Reference in New Issue
Block a user