| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- /*
- * Copyright (c) 2014, Oculus VR, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- */
- /// \file
- #ifndef __MASTER_COMMON_H
- #define __MASTER_COMMON_H
- #include "DS_List.h"
- #include "NetworkTypes.h"
- #include "BitStream.h"
- #include "PluginInterface.h"
- using namespace RakNet;
- class RakPeerInterface;
- struct Packet;
- // IP, Port, Ping - case sensitive!
- #define NUMBER_OF_DEFAULT_MASTER_SERVER_KEYS 3
- // If we ping NUMBER_OF_MISSED_PINGS_TO_DROP without ever a response, that server is dropped from the list.
- // This includes the last ping, so actually NUMBER_OF_MISSED_PINGS_TO_DROP-1 would be truly missed
- #define NUMBER_OF_MISSED_PINGS_TO_DROP 4
- // KEEP_ALIVE_PING_FREQUENCY is how often to ping servers to make sure they are active
- #define KEEP_ALIVE_PING_FREQUENCY 20000
- // How many ms must pass per connection before we check average bytes for a flood attack
- #define FLOOD_ATTACK_CHECK_DELAY 5000
- // How many bytes per ms someone has to send on average before they are banned.
- #define FLOOD_ATTACK_BYTES_PER_MS 2.0f
- struct GameServerRule;
- struct GameServer;
- /// \defgroup MASTER_SERVER_GROUP MasterServer
- /// \ingroup PLUGINS_GROUP
- /// \ingroup MASTER_SERVER_GROUP
- /// \brief Just a utility class.
- struct GameServerList
- {
- public:
- GameServerList();
- ~GameServerList();
- void Clear(void);
- void SortOnKey(char *key, bool ascending);
- void QuickSort(int low, int high, bool ascending);
- int Partition(int low, int high, bool ascending);
- int GetIndexByPlayerID(PlayerID playerID);
- DataStructures::List<GameServer*> serverList;
- };
- /// \ingroup MASTER_SERVER_GROUP
- class MasterCommon : public PluginInterface
- {
- public:
- MasterCommon();
- // ---------------------------------------------------
- // BROWSER FUNCTIONS
- // ---------------------------------------------------
- // Sorting function
- // ruleIdentifier is a string used by you previously when adding rules via PostRule
- // It can also be "IP" "Port" or "Ping"
- // Set ascending to true to sort from low to high. Otherwise sorts from high to low.
- void SortServerListOnKey(char *ruleIdentifier, bool ascending);
- // serverIndex should be from 0 to GetServerListSize()-1
- // ruleIdentifier is a string used by you previously when adding rules via PostRule
- // It can also be "IP" "Port" or "Ping".
- // identifier found will return true if the specified rule is found AND you are reading the
- // correct type.
- // GetServerListRuleAsInt should be used for int values.
- // GetServerListRuleAsString should be used for string values
- unsigned int GetServerListSize(void);
- int GetServerListRuleAsInt(int serverIndex, char *ruleIdentifier, bool *identifierFound);
- const char* GetServerListRuleAsString(int serverIndex, char *ruleIdentifier, bool *identifierFound);
- protected:
- void OnAttach(RakPeerInterface *peer);
- // Delete all elements from the server list
- void ClearServerList(void);
- // Returns true if a rule is reserved
- bool IsReservedRuleIdentifier(char *ruleIdentifier);
- void HandlePong(Packet *packet);
- // Adds or updates the specified rule to the specified server.
- // Returns true if the server has been changed. False if we are adding a rule that is already the same
- bool UpdateServerRule(GameServer *gameServer, char *ruleIdentifier, char *stringData, int intData);
- // Remove the specified rule from the server.
- // Returns true if the rule was removed.
- bool RemoveServerRule(GameServer *gameServer, char *ruleIdentifier);
- // Encode a playerID to a bitstream
- void SerializePlayerID(PlayerID *playerID, BitStream *outputBitStream);
- // Encode a rule to a bitstream
- void SerializeRule(GameServerRule *gameServerRule, BitStream *outputBitStream);
- // Decode a playerID from a bitstream
- void DeserializePlayerID(PlayerID *playerID, BitStream *inputBitStream);
- // Decode a rule from a bitstream
- GameServerRule *DeserializeRule(BitStream *inputBitStream);
- // Encode a server to a bitstream
- void SerializeServer(GameServer *gameServer, BitStream *outputBitStream);
- // Create a server from a bitstream
- GameServer *DeserializeServer(BitStream *inputBitStream);
- // Add the default rules to a server (ip, port, ping)
- void AddDefaultRulesToServer(GameServer *gameServer, PlayerID playerID);
- // Update one server based on the information in another
- void UpdateServer(GameServer *destination, GameServer *source, bool deleteSingleRules);
- // Add the specified server to the list of servers - or if the server already exists
- // Update the existing server and delete the server passed
- // deleteSingleRules means if a match is found and a rule exists in the old
- // server but not the new, then delete that rule.
- // Returns the new or updated server
- GameServer * UpdateServerList(GameServer *gameServer, bool deleteSingleRules, bool *newServerAdded);
- RakPeerInterface *rakPeer;
- GameServerList gameServerList;
- };
- /// \ingroup MASTER_SERVER_GROUP
- struct GameServerRule
- {
- GameServerRule();
- ~GameServerRule();
- char *key;
- // stringValue and intValue are mutually exclusive
- char *stringValue;
- int intValue;
- };
- /// \ingroup MASTER_SERVER_GROUP
- struct GameServer
- {
- GameServer();
- ~GameServer();
- void Clear(void);
- bool FindKey(char *key);
- int keyIndex;
- int numberOfKeysFound;
- RakNetTime lastUpdateTime;
- PlayerID connectionIdentifier; // The game server
- PlayerID originationId; // Only used by the server - the master client PlayerID
- int failedPingResponses;
- RakNetTime nextPingTime;
- // When inserting rules, don't forget that IP and ping should always be added.
- // These are required for any game server
- DataStructures::List<GameServerRule*> serverRules;
- };
- #endif
|