summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/ServerData.txt17
-rw-r--r--docs/architecture.txt222
-rw-r--r--docs/messages.txt105
-rw-r--r--docs/server.txt172
4 files changed, 0 insertions, 516 deletions
diff --git a/docs/ServerData.txt b/docs/ServerData.txt
deleted file mode 100644
index 2074835c..00000000
--- a/docs/ServerData.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-As per Elven's request, I'm making this document to contain the information relevant to
-server development as far as my understanding goes. This file contains the following:
- - Information that will be stored in Player Account
-
-
-
-1. Information stored in a Player Account
- - Inventory - an array of 110 item IDs (the last 10 slots or so are current equipment)
- - Position - the place where the player is in worldspace (3 ints, x, y, map)
- - Estate - stored as an array of Tiled maps, the same way any map is.
- - Skills - an array of 100 Skill structures
- - Quest Info - an array of X short integers, specifying the player's position
- in or accomplishment of the game quests. (X is the number of quests)
- - Pet Status - pets are stored as an array of skills and some general information
- (age, type of monster, loyalty, equipment, etc.) You can have up to
- 3 pets at once.
-
diff --git a/docs/architecture.txt b/docs/architecture.txt
deleted file mode 100644
index 7cd54d53..00000000
--- a/docs/architecture.txt
+++ /dev/null
@@ -1,222 +0,0 @@
--------------------
-SERVER ARCHITECTURE
--------------------
-
-1. INTRODUCTION
-2. RO REVIEW
-3. EATHENA MODEL
-4. TMW SERVER
-5. TCP - UDP
-6. SECURITY
-7. DATABASE
-8. REGISTRATION
-9. SERVER CONTROL
-10. OPERATING SYSTEM
-11. ADVANCED DATA TRANSMISSION
-
-
-1. INTRODUCTION
-
-One of the most important thing in a online game is the architecture of the
-server system, which reflects in performances (lag and denial of service),
-scalability, fault tolerance. In this article we will examine the pre-existing
-model and we will evaluate a way to improve it and to add custom features.
-
-
-2. RO REVIEW
-
-Let's start by taking as reference the current server system used to play
-Ragnarok Online on the euRO server. (www.euro-ro.net)
-RO works by using 4 kinds of server:
-
- - Login Server (L): takes care of verifying accounts with username-password
- system, allows also encrypted login.
-
- - Char Server (C): saves every player status (stats, items, equipment, skills
- and so on.
-
- - Map Server (M): the real game server, work as interconnection between
- clients, manage chat, monster AI, damage calculations and everything you can
- see in game.
-
- - Inter Server (I): probably manages the messages between the other type of
- servers.
-
-In euRO there are 1 login server, 1 char server, 1 inter server and 14 map
-servers.
-
-
-3. EATHENA MODEL
-
-The eAthena system mirrors the way used by official RO servers. eAthena
-implements 3 servers: login, char and map. It is allowed to have more than one
-map server at a time. Every server communicates with all the others.
-
-
-4. TMW SERVER
-
-The basic idea of TMW server architecture mainly is the same as the one used by
-eAthena. Since the login and char server don't have heavy traffic they could be
-melt togheter.
-
- C M
- \ /
- C - L - M
- / \
- C M
-
-The login server manages new connections and stores all the informations about
-the player. The map server is pretty the same as the eAthena one. The login
-server manages also connections to a new map server when changing map. Having
-only one server (L) to manage all the connections between clients and map
-servers is a bad point: if the login server crashes players won't be able to
-play anymore. In fact new connecting players won't be able to connect to login
-server, while map server will disconnect every player, since they can't save
-their infos.
-The solutions are:
-
- - implementing a distributed login server which can manage crashes and
- redirect new connections to another login server. This way means a more
- complex implementation and probably the need to other computers since we
- want the login servers to be independent from each other crashes at all.
- (Remember this is a free project so we should limit the number of
- computers to act as servers)
-
- - RALS (Redundant Array of Login Servers): we can have two login servers,
- only one of them is active at a time and they share the same database
- where to store infos about players. If one of the map servers loose the
- connection with the login server enables the other, while the crashed one
- restarts. Even if it restarted is it now considered disabled. The new
- active login server will send messages to every map server to inform them.
- Every time a client connects check both of the login server and connect to
- the active one. The bad points of this system are that will imply a lot of
- data consistency checks: map servers should resend last data since it
- was lost when the login server crashed, the new login server should check
- if some of the data was already stored before the crash, what if both of
- them crash?
-
- - waiting it's the only solution! Let's design the login server as much
- simple and stable as possible and create a smart restarting system.
- This way we will have less frequent crashes and a very low restarting
- time. Obiouvlsy this is the easiest and less expensive solution.
-
-
-5. Network protocol: TCP
-
-RO is TCP based, mainly because you use the mouse to move the player. When you
-want to reach a point on the map, you click on it and the client send a packet
-to the server with destination coordinates. The server replies with an
-agreement if there's a path to that way. Using this way you don't need high
-speed nor a lot of packets, so TCP it's enough.
-
-With our custom server we want to achieve pixel movements, by that we mean that
-the player is not always positioned in the center of the tile, but will have
-fine coordinates.
-
-Asking the server if every destination coordinates is walkable means a lot of
-traffic from and to the server and probably will result in lag. Using UDP will
-probably help avoiding this problem, but having a reliable protocol such as TCP
-will make things easier and more stable. We just need to design an efficient
-prediction system (probably also a linear one will suffice).
-
-An idea could be using the system I used for a racing game where speed was
-fundamental. When you press a key to move, the client sends a packet with
-starting coordinates, direction and client time. When you release the key (or
-change direction) the client sends another packet with current coordinates and
-client time. According to the player speed and the difference of client times
-the server check if the coordinates sent by the client are right, if not reply
-with a packet with the correct position. The server also check if the time
-interval sent by the client is right: if not it means that the values have been
-hacked or the lag corrupted them. We can set a tolerance value: if the time
-interval exceeds the tolerance then the whole movement is discarded and the
-server send a packet to tell the client to place the player at starting coords.
-
-
-6. SECURITY
-
-To certificate authenticity of the player we can use a system based on digital
-signature and hash (encrypted login).
-
-Better security can be provided by encrypting payload of packets using RSA
-algorytm. When logging in the client generates both its public and private key
-and will send the public one to the server. The server acts the same: when it
-starts it creates both the key and replies to login with its public key.
-Using encryption will reduce client/server performances because this will need
-a lot more calculations.
-Furthermore if using digital signature will introduce a lot of overhead.
-So there's still the need to discuss if we need to use encryption not only in
-the login part.
-
-Solutions to keep the server working and avoid unfair players:
-
- - DoS attack:
- * Account activation.
- * Limit number of accounts to 1 per email address.
-
- - Cheating/Botting:
- * First of all just keep every calculation done by the server.
-
-Also we need the possibility to warn/kick/ban players/accounts/ip addresses.
-
-
-7. DATABASE
-
-Player data should be stored using databases, probably MySQL. This way player
-infos could be easily accessed trough web and used to show stats or required
-infos on the website/forum.
-
-
-8. REGISTRATION
-
-Still to decide if we want to use a dialog (client registration) or to use a
-web based interface (web registration).
-Registration should ask for less details as possible. This way it will be less
-annoying. Required infos will be:
-
- - username
- - password
- - email (to limit account number and to be used to activate account)
-
-More infos could be added later for security problem (such as activation codes
-and so on).
-In RO you also have to choose the sex of your player. It will be better to let
-the user choose the sex when creating the player: this way he can delete is male
-player and create a female one.
-
-
-9. SERVER CONTROL
-
-The server can be controlled in two ways:
-
- - In game control: server admins or GMs sending particular commands or a
- trough a GUI (the way it is used in Ultima Online).
-
- - A graphical interface which connects to the server trough an open port.
-
-The prefferred way is the first one.
-
-
-10. OPERATING SYSTEM
-
-We have two choices about this: the former is to follow as for the client the
-cross-compatibility philosophy. This means that the server will compile on every
-windows, unix, macos based system. The latter is to choose the best performance
-system (probably linux) and implement a unique os server.
-Just remember that the current game server run on linux.
-
-
-11. ADVANCED DATA TRANSMISSION
-
-Other ways to reduce bandwidth can be considered such as:
-
- - Using bitstreams instead of bytestreams: this way if you need to send a
- boolean values only 1 bit will be required instead of 1 byte (compression
- 8:1), item types (4 different types) can be represented sending 2 bits
- instead of 1 byte (compression 8:2), player coordinates can be represented
- using 20 bits instead of 4 bytes (compression 24:20)
-
- - Compressing data following packet id could help reducing bandwidth usage
- as well. RLE compression or more advanced statistical techniques can be
- used. Compression can be disabled in very slow systems (If using
- compression is declared to the server when the client connects to map
- server. \ No newline at end of file
diff --git a/docs/messages.txt b/docs/messages.txt
deleted file mode 100644
index dddda233..00000000
--- a/docs/messages.txt
+++ /dev/null
@@ -1,105 +0,0 @@
--------------------------
-MESSAGE PASSING MECHANISM
--------------------------
-
-1. INTRODUCTION
-2. MESSAGE
-3. ROUTING
-4. SERIALIZING PRIMITIVES
-5. SERIALIZING CUSTOM DATA TYPES
-
-
-1. INTRODUCTION
-
-In server.txt we describe the datatypes involved at both client and server, and
-the related messages that are passed from client to server and back. In this
-file we will describe how the actual messages are composed and how they are
-routed from where they come from to where they are taken care of.
-
- PLEASE NOTE: Everything in this file is open for discussion. This file is
- meant to get ideas acros, find flaws in the reasoning and generally get
- comments on the system before somebody sets out to implement it.
-
-
-2. MESSAGE
-
-The protocol is described in terms of messages. Each message has a certain
-type, a length, and a certain number of values in primitive data types:
-
- { C msgId, S length, ... }
-
-The length stores the length of the remaining data. We need this so that the
-message can be cut off from the incoming stream of bytes and be encapsulated
-on its own to be further processed.
-
-The primitive data types are the same as those described in server.txt. The
-first thing that is done to the incoming message in to put it in an instance
-of the Message class. Below we outline the Message interface:
-
- class Message
- {
- public:
- Message(int length, void* data);
- ~Message();
-
- int getChar();
- int getShort();
- int getLong();
- std::string getString();
-
- private:
- int length, readPointer;
- void* data;
- }
-
-
-3. ROUTING
-
-After the Message instance has been constructed, it is routed to the message
-handler that has registered itself to handle this message type. If no handler
-has been registered a warning should probably be issued. A message handler
-implements the following interface:
-
- class MessageHandler
- {
- public:
- void receiveMessage(int msgId, Message *msg) = 0;
- }
-
-A mapping is made from message types to message handlers. One handler could
-be registered to handle a group of message types. This mapping can be stored
-in a std::map as follows:
-
- std::map<int, MessageHandler*> messageHandlers;
-
-This will be a member of the class that processes the incoming byte stream,
-which will implement an interface to allow registration of message handlers,
-for example:
-
- void registerHandler(int msgId, MessageHandler *handler);
-
-
-4. SERIALIZING PRIMITIVES
-
-Here we will describe for each primitive data type how it is serialized in
-bytes.
-
- char: 1 byte (direct copy)
- short: 2 bytes (now need to keep in mind endian order)
- long: 4 bytes (see short)
- string: 2 bytes for length (short) + X bytes (characters)
-
-
-5. SERIALIZING CUSTOM DATA TYPES
-
-Custom data types will be serialized using a composition of the primitive data
-types, or other custom data types. They will need to implement the following
-interface:
-
- class Serializable
- {
- public:
- void serialize(Message *msg);
- static Serializable *unserialize(Message *msg);
- }
-
diff --git a/docs/server.txt b/docs/server.txt
deleted file mode 100644
index e2d506af..00000000
--- a/docs/server.txt
+++ /dev/null
@@ -1,172 +0,0 @@
------------------------------
-THE MANA WORLD SERVER PROJECT
------------------------------
-
-1. INTRODUCTION
-2. MAP
-3. OBJECT
-4. BEING
-5. ITEM
-6. CHAT
-7. AUTHENTICATION
-
-
-1. INTRODUCTION
-
-First let me show you a screen shot of TMW. From left to right it shows a
-player, an enemy, a tree and an apple. In this document the player and enemy
-will go as beings, and the tree and apple will go as objects. Finally, the
-thing they're on is a map.
-
- o O
- O : A Player <> : A monster | : A tree o : An Apple.
-
- ----------------- Fig. 1) screen shot of TMW showing three kind of objects
- | |
- | o O | MAP
- | O <> |o | OBJECT
- | | BEING
- -----------------
-
-Each of these types has its own set of properties and things it can do in the
-game. A number of messages in the protocol can be grouped on these types. We'll
-go through each of them separately. Objects can be picked up and change into
-items, we'll mention those too.
-
-The effects of using objects or items, talking to beings and attacking enemies
-are all calculated server side. It is interesting to think about approaches
-that allow a scripting language to be used in these areas.
-
-In the messages described the following data types are being used:
-
- A - char array (null terminated)
- C - char (1 byte)
- S - short (2 bytes)
- L - long (4 bytes)
-
-
-2. MAP
-
-- Stored as XML file (.tmx)
-- Refers to tile set images and potentially to music file(s) and objects
-- Beings can change from one map to another (probably using warp and spawn
- points)
-
-
-3. OBJECT
-
-- Most properties specified in XML file
-- Mostly static (at least doesn't move, but can change)
-- Has collision properties, which can change
-- Can be an item (allowing picking it up)
-- Can be animated and change animation (max 256 animations)
-- Can potentially be activated/used (door, chest, portal)
-
- Server to client:
-
- MSG_NEW_OBJECT { L objectTypeId, L objectId, L x, L y }
- MSG_REMOVE_OBJECT { L objectId }
- MSG_CHANGE_OBJECT { L objectId, L x, L y, C currAnim, S flags }
-
- Client to server:
-
- MSG_PICKUP { L beingId, L objectId }
- MSG_USE_OBJECT { L beingId, L objectId }
-
-
-4. BEING
-
-- Most properties specified in XML file.
-- Dynamic (can walk around)
-- Character animation, but could still show arbitrary animations.
-- Can equip stuff, which could change appearance (max 256 equipment slots)
-- Has inventory
-- Connects to questing system
-- Can fight other beings
-- Dispositions: friendly, neutral, enemy
-- Can be shop
-- Can be talked to, potentially to gain quests
-- Controlled either by player or AI, AI could be either server or client side.
-- Carries money
-- Can be associated with a client
-
- Server to client:
-
- MSG_NEW_BEING { L beingTypeId, L beingId, L clientId, L x, L y }
- MSG_REMOVE_BEING { L beingId }
- MSG_INVENTORY_UPD { L beingId, L itemTypeId, L amount }
- MSG_EQUIPMENT_UPD { L beingId, L itemTypeId, C slot }
- MSG_ATTACK { L beingId, L targetId, L damage, C damType }
- MSG_PATH { L beingId, A path }
-
- Client to server:
-
- MSG_TARGET { L beingId, L targetId }
- MSG_WALK { L beingId, L x, L y }
- MSG_START_TRADE { L beingId, L shopBeingId }
- MSG_START_TALK { L beingId, L talkBeingId }
- MSG_REQ_TRADE { L beingId, L playerBeingId }
-
-More messages are needed for the talking with NPCs and trading with shops and
-other players.
-
-
-5. ITEM
-
-- Properties specified in XML file
-- Beings can carry them around
-- Can be traded between beings
-- Can potentially be equipped (in a certain slot)
-- Can potentially be used
-
- Client to server:
-
- MSG_USE_ITEM { L beingId, L itemTypeId }
- MSG_EQUIP { L beingId, L itemTypeId, C slot }
-
-
-6. CHAT
-
-There are several channels in the chat system:
-
- Area - To players around you (default)
- Region - To players on the same map (default)
- Global - To all players in the game (default)
- Team - To players in the same team (when in team)
- Guild - To players in the same guild (when in guild)
-
-In addition to these there are also system messages, and announcements made
-by moderators / administrators.
-
- Server to client:
-
- MSG_CHAT { L beingId, A name, A message, S channel }
- MSG_SYSTEM { A message }
- MSG_ANNOUNCEMENT { A message }
-
- Client to server:
-
- MSG_SAY { L beingId, A message, S channel }
- MSG_ANNOUNCE { A message }
-
-
-7. AUTHENTICATION
-
-Of course before the client can send/receive any of this, he needs to login to
-the server. The idea is that the client will send login info to the server,
-and that the server either denies the request (giving a reason) or sends the
-client a client id. The client later uses the client id to determine which
-being(s) are to be controlled.
-
- Server to client:
-
- MSG_ACCEPT_GAME { L clientId } // Accepted into the game
- MSG_ACCEPT_CREATE { } // Accepted into character creation
- MSG_DENY { A reason }
-
- Client to server:
-
- MSG_LOGIN { A name, A password }
- MSG_CHAR_CREATE { ... }
-
-The character creation process will need to be thought out.