fix server problems

This commit is contained in:
stalkerg
2020-07-25 15:25:30 +09:00
parent b7456a9636
commit dd3173581e
11 changed files with 1879 additions and 2094 deletions

View File

@@ -3,14 +3,12 @@
#include <chrono>
#include <thread>
#define VERSION "1.9"
#define VERSION "1.9"
/* --------------------------- PROTOTYPE SECTION --------------------------- */
void ComlineAnalyze(int argc,char** argv);
void terminal();
void ComlineAnalyze(int argc, char **argv);
/* --------------------------- DEFINITION SECTION -------------------------- */
struct KDsPlus : XRuntimeObject
{
struct KDsPlus: XRuntimeObject {
virtual int Quant(void);
};
@@ -21,49 +19,47 @@ int time_to_live = 0;
int ErrHExcept = 1;
int GlobalExit = 0;
int terminal_log = 0;
char* result_name = 0;
char *result_name = 0;
int StatLogging = 0;
int leave_empty_games = 0;
Server* server;
Server *server;
int xtInitApplication(void) {
#ifdef _WIN32
SetConsoleTitle("Vangers Server ");
#else
std::cout << "\033]0;" << "Vangers Server " << "\007";
std::cout << "\033]0;"
<< "Vangers Server "
<< "\007";
#endif
std::cout << "Multiplayer VANGERS Server by K-D LAB\nRelease Version " VERSION " (c) 1998 All Rights Reserved\n";
std::cout << "Compilation: DATE: " << __DATE__ << " TIME: " << __TIME__ << "\n\n";
std::cout << "Multiplayer VANGERS Server by K-D LAB\nRelease Version " VERSION
" (c) 1998 All Rights Reserved\n";
std::cout << "Compilation: DATE: " << __DATE__ << " TIME: " << __TIME__ << "\n\n";
//SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
ComlineAnalyze(__argc,__argv);
// ErrH.SetFlags(XERR_CTRLBRK);
// SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
ComlineAnalyze(__argc, __argv);
// ErrH.SetFlags(XERR_CTRLBRK);
/* initialize SDL */
if(SDL_Init(0)==-1) {
std::cout<<"SDL_Init: %s\n"<<SDL_GetError()<<std::endl;
if (SDL_Init(0) == -1) {
std::cout << "SDL_Init: %s\n" << SDL_GetError() << std::endl;
exit(1);
}
if(!XSocketInit())
if (!XSocketInit())
ErrH.Abort("WinSock initialization failed, check Your TCP/IP settings");
// if(terminal_log) {
// terminal();
// return -1;
// }
server = new Server(default_server_port, broadcast_port, time_to_live);
#ifdef _DEBUG
if(result_name) {
(server -> create_game()) -> load_result(server,result_name);
if (result_name) {
(server->create_game())->load_result(server, result_name);
ErrH.Abort("Result loaded");
}
#endif
KDsPlus* p = new KDsPlus;
KDsPlus *p = new KDsPlus;
xtCreateRuntimeObjectTable();
xtRegisterRuntimeObject(p);
@@ -75,93 +71,73 @@ void xtDoneApplication(void) {
}
void Syncro() {
const int dt_total = 1000/64;
const int dt_total = 1000 / 64;
static int t_prev = 0;
int dt = dt_total - (clock() - t_prev);
if(dt > 0)
if (dt > 0)
std::this_thread::sleep_for(std::chrono::milliseconds(dt));
t_prev = clock();
}
int KDsPlus::Quant(void) {
//if(GlobalExit || XKey.Pressed(VK_ESCAPE)) return XT_TERMINATE_ID;
//TODO: I hope you can stop server by ctrl+c
if(GlobalExit)
// if(GlobalExit || XKey.Pressed(VK_ESCAPE)) return XT_TERMINATE_ID;
// TODO: I hope you can stop server by ctrl+c
if (GlobalExit)
return XT_TERMINATE_ID;
frame++;
Syncro();
server -> quant();
server->quant();
DBGCHECK
return 0;
}
void ComlineAnalyze(int argc,char** argv) {
int i,j;
for(i = 1;i < argc;i++)
if(argv[i][0] == '/'){
void ComlineAnalyze(int argc, char **argv) {
int i, j;
for (i = 1; i < argc; i++)
if (argv[i][0] == '/') {
j = 0;
while(argv[i][j] == '/' || argv[i][j] == '-'){
switch(argv[i][j + 1]){
case 'p':
default_server_port = atoi(argv[i] + (j + 2));
break;
case 'b':
if(argv[i][j + 2] == '-')
broadcast_port = 0;
else
broadcast_port = atoi(argv[i] + (j + 2));
break;
case 't':
time_to_live = atoi(argv[i] + (j + 2));
std::cout << "Time to Live: " << time_to_live << " second\n";
break;
case 'i':
//TODO: looks like only windows strange function
//FreeConsole();
break;
case 's':
std::cout << "Logging ON\n";
StatLogging = 1;
break;
case 'l':
std::cout << "Empty games will not be removed\n";
leave_empty_games = 1;
break;
case 'h':
case '?':
std::cout << "Switches: \n /pxxxx - main TCP/IP port \n /bxxxx - UDP broadcast port \n /b- - supress UDP broadcast \n /i - invisible mode \n /txxx - time to live without clients, seconds\n /s - creates log file (VangersServer.log)\n /l - leave empty games\n\n";
break;
}
j+=2;
while (argv[i][j] == '/' || argv[i][j] == '-') {
switch (argv[i][j + 1]) {
case 'p':
default_server_port = atoi(argv[i] + (j + 2));
break;
case 'b':
if (argv[i][j + 2] == '-')
broadcast_port = 0;
else
broadcast_port = atoi(argv[i] + (j + 2));
break;
case 't':
time_to_live = atoi(argv[i] + (j + 2));
std::cout << "Time to Live: " << time_to_live << " second\n";
break;
case 'i':
// TODO: looks like only windows strange function
// FreeConsole();
break;
case 's':
std::cout << "Logging ON\n";
StatLogging = 1;
break;
case 'l':
std::cout << "Empty games will not be removed\n";
leave_empty_games = 1;
break;
case 'h':
case '?':
std::cout << "Switches: \n"
<< " /pxxxx - main TCP/IP port \n"
<< " /bxxxx - UDP broadcast port \n"
<< " /b- - supress UDP broadcast \n"
<< " /i - invisible mode \n"
<< " /txxx - time to live without clients, seconds\n"
<< " /s - creates log file (VangersServer.log)\n"
<< " /l - leave empty games\n"
<< "\n";
break;
}
j += 2;
}
else
} else
result_name = argv[i];
}
/*
void terminal()
{
XCon < "MP TERMINAL:\n\n";
XSocket sock;
//if(!sock.open_by_socks5("etype0.enet.ru",1973,"toothelator"))
if(!sock.open_by_socks5("mike.nevalink.ru",1973,"toothelator"))
//if(!sock.open("localhost",1973))
//if(!sock.open("mike.nevalink.ru",1973))
return;
OutputEventBuffer out(100);
XBuffer in(2000);
out.begin_event(META_OPEN_LOG);
out.end_event();
out.send(sock);
int counter = 0;
while(sock()){
int len = sock.receive(in,in.length());
in[len] = 0;
XCon < in < " " <= (counter++ % 10) < " " < "\b\b\b";
in.init();
Syncro();
}
}
*/

View File

@@ -2,27 +2,20 @@
#ifndef KDSPLUS_H
#define KDSPLUS_H
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define WIN32_EXTRA_LEAN
#define WIN32_LEAN_AND_MEAN
#ifdef _WINDOWS_
#include <windows.h>
# include <windows.h>
#endif
#define KDWIN
//#include "../lib/xtool/xtcore.h"
//#include "../lib/xtool/xerrhand.h"
//#include "../lib/xtool/xstream.h"
//#include "../lib/xtool/xglobal.h"
//#include "xsocket.h"
#include "server.h"
extern int frame;
@@ -33,9 +26,9 @@ extern int leave_empty_games;
#ifdef _DEBUG
void win32_check();
#define DBGCHECK win32_check();
# define DBGCHECK win32_check();
#else
#define DBGCHECK
# define DBGCHECK
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,18 +1,17 @@
#include "../lib/xtool/xglobal.h"
#include "xsocket.h"
#include "multiplayer.h"
#include "xsocket.h"
#define DIRECT_SENDING_OBJECT 1
#define IN_BUFFER_SIZE 128000
#define OUT_BUFFER_SIZE 128000
#define OUT_QUEUE_SIZE (1 << 10)
#define IN_BUFFER_META_SIZE 4000
#define OUT_BUFFER_META_SIZE 20000
#define Y_SHIFT 2
#define PLAYERS_RADIUS 128
#define WAITING_TO_REMOVE (60*1000)
#define DIRECT_SENDING_OBJECT 1
#define IN_BUFFER_SIZE 128000
#define OUT_BUFFER_SIZE 128000
#define OUT_QUEUE_SIZE (1 << 10)
#define IN_BUFFER_META_SIZE 4000
#define OUT_BUFFER_META_SIZE 20000
#define Y_SHIFT 2
#define PLAYERS_RADIUS 128
#define WAITING_TO_REMOVE (60 * 1000)
/*******************************************************************************
Structures
@@ -24,51 +23,91 @@ struct World;
struct Event {
int code;
Player* pointer;
Event(){ code = 0; pointer = 0; }
Event(int cd){ code = cd; pointer = 0; }
Event(int cd,Player* ptr){ code = cd; pointer = ptr; }
int operator == (Event& ev) { return code == ev.code && pointer == ev.pointer; }
int operator != (Event& ev) { return code != ev.code || pointer != ev.pointer; }
Player *pointer;
Event() {
code = 0;
pointer = 0;
}
Event(int cd) {
code = cd;
pointer = 0;
}
Event(int cd, Player *ptr) {
code = cd;
pointer = ptr;
}
int operator==(Event &ev) {
return code == ev.code && pointer == ev.pointer;
}
int operator!=(Event &ev) {
return code != ev.code || pointer != ev.pointer;
}
};
class OutputEventBuffer : public XBuffer {
class OutputEventBuffer: public XBuffer {
unsigned int pointer_to_size_of_event;
public:
OutputEventBuffer(unsigned int size);
public:
OutputEventBuffer(unsigned int size);
int send(XSocket& sock);
int send(XSocket &sock);
void begin_event(int event_ID);
void end_event();
};
};
class InputEventBuffer : public XBuffer {
class InputEventBuffer: public XBuffer {
int event_ID;
int size_of_event;
unsigned int next_event_pointer;
unsigned int filled_size;
public:
public:
InputEventBuffer(unsigned int size);
void reset();
int receive(XSocket& sock);
int current_event(){ return event_ID; }
int event_size(){ return size_of_event; }
int next_event();
int receive(XSocket &sock);
int current_event() {
return event_ID;
}
int event_size() {
return size_of_event;
}
int next_event();
void ignore_event();
int get_byte(){ unsigned char t; *this > t; return (int)t; }
int get_short(){ short t; *this > t; return (int)t; }
int get_word(){ unsigned short t; *this > t; return (int)t; }
int get_int(){ int t; *this > t; return (int)t; }
unsigned int get_dword(){ unsigned int t; *this > t; return (unsigned int )t; }
double get_float(){ float t; *this > t; return (double)t; }
};
int get_byte() {
unsigned char t;
*this > t;
return (int)t;
}
int get_short() {
short t;
*this > t;
return (int)t;
}
int get_word() {
unsigned short t;
*this > t;
return (int)t;
}
int get_int() {
int t;
*this > t;
return (int)t;
}
unsigned int get_dword() {
unsigned int t;
*this > t;
return (unsigned int)t;
}
double get_float() {
float t;
*this > t;
return (double)t;
}
};
struct Object {
int ID;
@@ -79,23 +118,22 @@ struct Object {
unsigned int send_hide;
unsigned int send_delete;
int time;
int x,y,radius;
int x, y, radius;
int body_size;
int death_body_size;
unsigned char* body;
Object* next;
Object* prev;
XTList<Object>* list;
unsigned char *body;
Object* next_alt;
Object* prev_alt;
XTListAlt<Object>* list_alt;
Object *next;
Object *prev;
XTList<Object> *list;
Object();
~Object();
Object *next_alt;
Object *prev_alt;
XTListAlt<Object> *list_alt;
Object();
~Object();
};
struct World {
@@ -103,36 +141,36 @@ struct World {
int V_SIZE;
int number_of_objects;
int number_of_y_lists;
XTList<Object>* y_lists;
XTList<Object> *y_lists;
XTListAlt<Object> objects;
XTListAlt<Player> current_players;
World* next;
World* prev;
XTList<World>* list;
World(int ID,int V_SIZE);
~World();
World *next;
World *prev;
XTList<World> *list;
void attach_player(Player* player);
void detach_player(Player* player);
World(int ID, int V_SIZE);
~World();
Object* search_object(int ID);
void attach_player(Player *player);
void detach_player(Player *player);
void add_object(Object* obj);
void move_object(Object* obj);
void delete_object(Object* obj);
Object *search_object(int ID);
int getDistY(int v0,int v1);
int check_visibility(Player* player,Object* object);
int check_visibility(Player* p1,Player* p2);
void process_create(Player* player,Object* obj);
void process_update(Player* player,Object* object);
void process_delete(Object* obj);
void process_set_position(Player* player);
void process_create_inventory(Player* player,Object* obj);
void process_update_inventory(Player* player,Object* obj);
void add_object(Object *obj);
void move_object(Object *obj);
void delete_object(Object *obj);
int getDistY(int v0, int v1);
int check_visibility(Player *player, Object *object);
int check_visibility(Player *p1, Player *p2);
void process_create(Player *player, Object *obj);
void process_update(Player *player, Object *object);
void process_delete(Object *obj);
void process_set_position(Player *player);
void process_create_inventory(Player *player, Object *obj);
void process_update_inventory(Player *player, Object *obj);
};
struct Player {
@@ -141,23 +179,23 @@ struct Player {
int client_version;
int client_mask;
int status;
char* name;
char* password;
char *name;
char *password;
Server* server;
Game* game;
World* world;
int x,y;
Server *server;
Game *game;
World *world;
int x, y;
int y_half_size_of_screen;
int x_prev,y_prev;
int x_prev, y_prev;
int y_half_size_of_screen_prev;
PlayerBody body;
float prev_rating;
XTList<Object> inventory;
//Object* current_sent_object;
XTList<Object> inventory;
// Object* current_sent_object;
unsigned int birth_time;
unsigned int last_sent_position;
unsigned int last_IO_operation;
@@ -167,25 +205,25 @@ struct Player {
XSocket socket;
InputEventBuffer in_buffer;
OutputEventBuffer out_buffer;
XQueue<Object*> object_queue;
XQueue<Object *> object_queue;
XQueue<Event> code_queue;
Player* next;
Player* prev;
XTList<Player>* list;
Player *next;
Player *prev;
XTList<Player> *list;
Player* next_alt;
Player* prev_alt;
XTListAlt<Player>* list_alt;
Player(Server* server,XSocket& sock);
~Player();
Player *next_alt;
Player *prev_alt;
XTListAlt<Player> *list_alt;
Player(Server *server, XSocket &sock);
~Player();
void identification();
int is_alive();
int receive();
int send();
void put_object(Object* object);
void put_object(Object *object);
void clear_object_queue(int keep_globals);
};
@@ -196,53 +234,53 @@ struct Game {
XTList<Player> players;
XTList<Player> removed_players;
XTList<World> worlds;
XTList<Object> global_objects;
XTList<Object> global_objects;
unsigned int birth_time;
char name[128];
ServerData data;
Game* next;
Game* prev;
XTList<Game>* list;
Game *next;
Game *prev;
XTList<Game> *list;
Game(int ID);
~Game();
int attach_player(Player* player);
void detach_player(Player* player);
Game(int ID);
~Game();
int attach_player(Player *player);
void detach_player(Player *player);
int quant();
void get_object_ID_offsets(OutputEventBuffer& out_buffer,int client_ID);
void put_event_for_all(int code,Player* player = 0);
void process_direct_sending(Object* obj,unsigned int mask);
void get_total_list_of_players_data(OutputEventBuffer& out_buffer);
void get_object_ID_offsets(OutputEventBuffer &out_buffer, int client_ID);
void put_event_for_all(int code, Player *player = 0);
void process_direct_sending(Object *obj, unsigned int mask);
void get_total_list_of_players_data(OutputEventBuffer &out_buffer);
void check_global_objects(Player *player);
void process_create_globals(Player *player, Object *obj);
void process_update_globals(Player *player, Object *obj);
void process_delete_globals(Object *obj);
void check_global_objects(Player* player);
void process_create_globals(Player* player,Object* obj);
void process_update_globals(Player* player,Object* obj);
void process_delete_globals(Object* obj);
void process_VAN_WAR_ratings();
void process_MECHOSOMA_ratings();
void process_PASSEMBLOSS_ratings();
void save_result();
void load_result(Server* server,char* name);
void load_result(Server *server, char *name);
};
struct RatingData {
char* name;
char* password;
char *name;
char *password;
int MP_game;
float rating;
RatingData(char* _name,char* _password,int MP_game,float rating);
~RatingData();
RatingData(char *_name, char *_password, int MP_game, float rating);
~RatingData();
RatingData* next;
RatingData* prev;
XTList<RatingData>* list;
RatingData *next;
RatingData *prev;
XTList<RatingData> *list;
};
struct Server {
@@ -258,43 +296,41 @@ struct Server {
unsigned int time_to_live;
unsigned int time_to_destroy;
int next_broadcast;
XSocket broadcast_socket;
int n_games[NUMBER_MP_GAMES];
int n_players_max[NUMBER_MP_GAMES], n_players_sum[NUMBER_MP_GAMES];
int playing_time_max[NUMBER_MP_GAMES], playing_time_sum[NUMBER_MP_GAMES];
Server(int main_port,int broadcast_port,int time_to_live);
~Server();
void clear();
Game* create_game();
Server(int main_port, int broadcast_port, int time_to_live);
~Server();
void clear();
Game *create_game();
int quant();
int check_new_clients();
int clients_quant();
int games_quant();
void get_games_list(OutputEventBuffer& out_buffer,int client_version);
void analyse_statistics(Game* g);
void get_games_list(OutputEventBuffer &out_buffer, int client_version);
void analyse_statistics(Game *g);
void report();
void load_rating_list(const char* name);
void save_rating_list(const char* name);
RatingData* search_rating_data(char* player_name, char* player_password, int MP_game);
void add_rating_data(Player* player, int MP_game);
void get_top_list(OutputEventBuffer& out_buffer,int MP_game);
void consoleReport(int players);
void load_rating_list(const char *name);
void save_rating_list(const char *name);
RatingData *search_rating_data(char *player_name, char *player_password, int MP_game);
void add_rating_data(Player *player, int MP_game);
void get_top_list(OutputEventBuffer &out_buffer, int MP_game);
};
/*******************************************************************************
Defines
*******************************************************************************/
#define GLOBAL_CLOCK() (round(clock()*(256./CLOCKS_PER_SEC)))
#define SECONDS() (round(clock()*(1./CLOCKS_PER_SEC)))
#define SERVER_ERROR(str,code) ErrH.Abort(str,XERR_USER,code)
#define START_TIMER(interval) unsigned int _end_time_ = clock() + interval;
#define CHECK_TIMER() ((int)(clock() - _end_time_) < 0)
#define IS_FUTURE(time) ((int)((time) - clock()) > 0)
#define IS_PAST(time) ((int)(clock() - (time)) > 0)
#define TIME_INTERVAL(time) ((int)(clock() - (time)))
#define GLOBAL_CLOCK() (round(clock() * (256. / CLOCKS_PER_SEC)))
#define SECONDS() (round(clock() * (1. / CLOCKS_PER_SEC)))
#define SERVER_ERROR(str, code) ErrH.Abort(str, XERR_USER, code)
#define START_TIMER(interval) unsigned int _end_time_ = clock() + interval;
#define CHECK_TIMER() ((int)(clock() - _end_time_) < 0)
#define IS_FUTURE(time) ((int)((time)-clock()) > 0)
#define IS_PAST(time) ((int)(clock() - (time)) > 0)
#define TIME_INTERVAL(time) ((int)(clock() - (time)))

View File

@@ -1,6 +1,4 @@
#include "../xsocket.h"
const char TG_NO_TOUCH = 1;
const char TG_POINT_TOUCH = 2;
const char TG_SPHERICAL_TOUCH = 3;

View File

@@ -626,13 +626,13 @@ void iQuantFirst(void)
iSetOptionValueCHR(iPLAYER_NAME2,"Vanger");
iSetOptionValueCHR(iPLAYER_PASSWORD,iSTR_DefaultPassword);
if(lang() == RUSSIAN) {
iSetOptionValueCHR(iHOST_NAME, "vangers.pp.ru");
iSetOptionValueCHR(iHOST_NAME, "vangers.anime-pictures.net");
} else if (lang() == GERMAN) {
// iSetOptionValueCHR(iHOST_NAME,"www.imagicgames.de");
iSetOptionValueCHR(iHOST_NAME,"vangers.pp.ru");
iSetOptionValueCHR(iHOST_NAME,"vangers.anime-pictures.net");
}
else
iSetOptionValueCHR(iHOST_NAME,"vangers.pp.ru");
iSetOptionValueCHR(iHOST_NAME,"vangers.anime-pictures.net");
// iSetOptionValueCHR(iHOST_NAME,"www.imagicgames.com");
iSetOptionValueCHR(iSERVER_NAME,iSTR_NONE);
iSetOptionValueCHR(iPROXY_SERVER,"192.1.1.1");

View File

@@ -9,14 +9,14 @@
#define AUXILIARY_EVENT 0x80
#define ECHO_EVENT 0x20
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Отправляемые и получаемые
const int CREATE_OBJECT = 0x02; //znfo 8-| CREATE_OBJECT eq CREATE_PERMANENT_OBJECT
const int CREATE_PERMANENT_OBJECT = 0x02;
const int DELETE_OBJECT = 0x04;
const int UPDATE_OBJECT = 0x08;
const int HIDE_OBJECT = 0x0C;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Служебные отправляемые
const int GAMES_LIST_QUERY = 0x81;
const int TOP_LIST_QUERY = 0x82; // MP_game(1)
@@ -40,7 +40,7 @@ const int SET_PLAYER_DATA = 0x94; // PlayerData
const int DIRECT_SENDING = 0x95; // Mask(4), SendData
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Служебные получаемые
const int GAMES_LIST_RESPONSE = 0xC1; // Number(1),{ game_ID(1), game_Name(str) }
const int TOP_LIST_RESPONSE = 0xC2; // MP_game(1), Number(1),{ Name(str), rating(float) }
const int TOTAL_LIST_OF_PLAYERS_DATA = 0xCC; // Number(1),{ client_ID(1), BodySize(2) , Body, Name(str) }
@@ -66,7 +66,7 @@ const int PLAYERS_RATING = 0xD4; // Client(1),rating(float), for me
//zmod fixed
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//модовые константы
const int zSERVER_VERSION_RESPONSE = 0xE1; // version(4)
const int zGAME_DATA_RESPONSE = 0xE2; // mod_id(4)
const int zTIME_RESPONSE = 0xE3; // time(4)
@@ -74,17 +74,17 @@ const int zTIME_RESPONSE = 0xE3; // time(4)
const int zCREATE_OBJECT_BY_CLIENT = 0xE4; // GLOBAL_CLOCK(4),Type(1),ID(1),BodySize(1),Body(array)
const int zCREATE_OBJECT_BY_SERVER = 0xE5; // NOT KNOWN YET
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>... <20><><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD>
// кароче эти айди используются (или по крайней мере должны) только в трех... уже двух, вышеперечисленных евентах
// а поэтому все на йух
const int zOBJ_ID_DOLLY = 0x01;
/*****************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
[<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - 1][station - 5][world - 4][<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - 6][counter - 16]
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
[1 - 10] - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
station = 00000 - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 31 <20><><EFBFBD><EFBFBD><EFBFBD>, [1 - 31]
Структура идентификатора объекта:
[признак глобальности - 1][station - 5][world - 4][тип объекта - 6][counter - 16]
первые восемь типов - личные вещи игрока
[1 - 10] - автоматически удаляемые типы
station = 00000 - объект, не имеющий создателя
всего может быть 31 игрок, [1 - 31]
*****************************************************************/
const int MAX_NID_OBJECT = 15;
@@ -234,17 +234,17 @@ struct VanVarStatistic
{
int MaxLiveTime;//None
int MinLiveTime;//None
int KillFreq;//hh:mm:ss - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int DeathFreq;//hh:mm:ss - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int KillFreq;//hh:mm:ss - Средний период убийств
int DeathFreq;//hh:mm:ss - Средний период смертей
};
struct MechosomaStatistic
{
int ItemCount1,ItemCount2;
int MaxTransitTime;//hh:mm:ss - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
int MaxTransitTime;//hh:mm:ss - Время окончания гонки
int MinTransitTime;//None
int SneakCount;//<EFBFBD><EFBFBD><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int LostCount;//<EFBFBD><EFBFBD><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int SneakCount;//Кол-во украденного товара
int LostCount;//Кол-во потерянного товара
};
struct PassemblossStatistic

View File

@@ -10,7 +10,6 @@
#include "sound/hsound.h"
#endif
#include "xsocket.h"
#ifndef _WIN32
#include <arpa/inet.h> // ntohl() FIXME: remove
#endif

View File

@@ -5,7 +5,6 @@
#include "xsocket.h"
#include "multiplayer.h"
#define BROADCAST_PORT 1992
#define DEFAULT_SERVER_PORT 2197
extern double zMod_cycle;

View File

@@ -1,59 +1,51 @@
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <time.h>
#include <string.h>
#ifdef _WINDOWS_
#define WIN32_EXTRA_LEAN
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock.h>
# define WIN32_EXTRA_LEAN
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
# include <winsock.h>
#else
#include <unistd.h> // gethostname()
#include <limits.h> // HOST_NAME_MAX
#ifdef __HAIKU__
#include <posix/sys/select.h> // fd_set
#endif
#ifndef _WIN32
#include <arpa/inet.h> // ntohl() FIXME: remove
#endif
# include <limits.h> // HOST_NAME_MAX
# include <unistd.h> // gethostname()
# ifdef __HAIKU__
# include <posix/sys/select.h> // fd_set
# endif
# ifndef _WIN32
# include <arpa/inet.h> // ntohl() FIXME: remove
# endif
#endif
#include "xsocket.h"
#define KDWIN
#include "global.h"
#define XSOCKET_ERROR(str, code) do { \
if (ErrHUsed) { \
std::cout<<str<<": "<<code<<"\n"; \
} else { \
XSocketLastErrorString = (char *)str; \
XSocketLastErrorCode = (char *)code; \
} \
} while(0)
#define XSOCKET_ERROR(str, code) \
do { \
if (ErrHUsed) { \
std::cout << str << ": " << code << "\n"; \
} else { \
XSocketLastErrorString = (char *)str; \
XSocketLastErrorCode = (char *)code; \
} \
} while (0)
// HOST_NAME_MAX is deprecated; use conservative value
#ifndef HOST_NAME_MAX
#define HOST_NAME_MAX 255
# define HOST_NAME_MAX 255
#endif
static char* XSocketLastErrorString = 0;
static char* XSocketLastErrorCode = 0;
static char *XSocketLastErrorString = 0;
static char *XSocketLastErrorCode = 0;
IPaddress XSocketLocalHostADDR;
IPaddress XSocketLocalHostExternADDR;
// HOST_NAME_MAX is POSIX.1-2001
static char XSocketLocalHostName[HOST_NAME_MAX+1];
/*****************************************************************
Initialization
*****************************************************************/
static char XSocketLocalHostName[HOST_NAME_MAX + 1];
int XSocketInit(int ErrHUsed) {
static int XSocketInitializationOK = 0;
if(XSocketInitializationOK)
if (XSocketInitializationOK)
return 1;
// SDL_Init() should have already been called before this.
@@ -80,10 +72,6 @@ int XSocketInit(int ErrHUsed) {
return 1;
}
/*****************************************************************
Constructor
*****************************************************************/
XSocket::XSocket() {
tcpSock = INVALID_SOCKET;
ErrHUsed = 1;
@@ -93,11 +81,11 @@ XSocket::XSocket() {
}
XSocket::~XSocket() {
if(tcpSock != INVALID_SOCKET)
if (tcpSock != INVALID_SOCKET)
close();
}
XSocket::XSocket(XSocket& donor) {
XSocket::XSocket(XSocket &donor) {
tcpSock = donor.tcpSock;
ErrHUsed = donor.ErrHUsed;
addr = donor.addr;
@@ -105,7 +93,7 @@ XSocket::XSocket(XSocket& donor) {
socketSet = NULL;
}
XSocket& XSocket::operator = (XSocket& donor) {
XSocket &XSocket::operator=(XSocket &donor) {
tcpSock = donor.tcpSock;
ErrHUsed = donor.ErrHUsed;
addr = donor.addr;
@@ -115,10 +103,6 @@ XSocket& XSocket::operator = (XSocket& donor) {
return *this;
}
/*****************************************************************
Connect functions
*****************************************************************/
int XSocket::tcp_open() {
tcpSock = SDLNet_TCP_Open(&addr);
@@ -141,12 +125,9 @@ int XSocket::open(int IP, int port) {
return tcp_open();
}
int XSocket::open(char* name,int port) {
#if _SERVER // FIXME: check actual define name
if (!name) ErrH.Exit();
#else
if (!name) ErrH.Abort("NULL inet_addr() argument...");
#endif
int XSocket::open(char *name, int port) {
if (!name)
ErrH.Abort("NULL inet_addr() argument...");
if (SDLNet_ResolveHost(&addr, name, port) == -1) {
XSOCKET_ERROR("TCP socket hostname resolution failed", SDLNet_GetError());
@@ -156,15 +137,10 @@ int XSocket::open(char* name,int port) {
return tcp_open();
}
/*****************************************************************
UDP connection function
*****************************************************************/
void XSocket::close() {
if (tcpSock) {
SDLNet_TCP_Close(tcpSock);
tcpSock = INVALID_SOCKET;
}
if (socketSet) {
SDLNet_FreeSocketSet(socketSet);
@@ -174,10 +150,6 @@ void XSocket::close() {
addr.port = 0;
}
/*****************************************************************
Listen - Accept functions
*****************************************************************/
int XSocket::listen(int port) {
addr.host = INADDR_ANY;
addr.port = htons(port);
@@ -192,172 +164,59 @@ int XSocket::listen(int port) {
}
XSocket XSocket::accept() {
XSocket xsock;
TCPsocket newSock;
newSock = SDLNet_TCP_Accept(tcpSock);
if (!newSock) {
XSOCKET_ERROR("TCP accept failed", SDLNet_GetError());
// TODO: check possible error conditions and results
SDL_Delay(100);
}
if (!newSock) // TODO: Should emit error here
return xsock;
XSocket xsock;
xsock.tcpSock = newSock;
xsock.ErrHUsed = ErrHUsed;
xsock.addr.port = addr.port;
xsock.socketSet = SDLNet_AllocSocketSet(16);
SDLNet_TCP_AddSocket(xsock.socketSet, newSock);
return xsock;
}
// TODO
int XSocket::set_nonblocking_mode(int enable_nonblocking) {
/* unsigned long arg = enable_nonblocking;
if(ioctlsocket(sock,FIONBIO,&arg)){
XSOCKET_ERROR("ioctlsocket() failed",SDLNet_GetError());
int XSocket::send(const char *buffer, int size) {
if (!tcpSock)
return 0;
}*/
return 1;
}
/*****************************************************************
Send and Receive functions
*****************************************************************/
int XSocket::send(const char* buffer, int size) {
int status = 0;
if (tcpSock) {
status = SDLNet_TCP_Send(tcpSock, buffer, size);
if (status < size) {
XSOCKET_ERROR("TCP send failed", SDLNet_GetError());
// TODO: close socket?
return 0;
}
return status;
} else {
int status = SDLNet_TCP_Send(tcpSock, buffer, size);
if (status < size) {
XSOCKET_ERROR("TCP send failed", SDLNet_GetError()); // TODO: close socket?
return 0;
}
return 1;
return status;
}
int XSocket::receive(char* buffer, int size_of_buffer, int ms_time) {
int status = 0;
int XSocket::receive(char *buffer, int size_of_buffer, int ms_time) {
if (ms_time == 0) {
int numready;
int n;
numready = SDLNet_CheckSockets(socketSet, 0);
if(numready==-1) {
n = SDLNet_CheckSockets(socketSet, 0);
if (n == -1) {
printf("SDLNet_CheckSockets: %s\n", SDLNet_GetError());
//most of the time this is a system error, where perror might help you.
// most of the time this is a system error, where perror might help you.
perror("SDLNet_CheckSockets");
} else if (numready == 0) {
} else if (n == 0) {
return 0;
}
if(!SDLNet_SocketReady(tcpSock)) {
if (!SDLNet_SocketReady(tcpSock)) {
return 0;
}
}
if (tcpSock) {
status = SDLNet_TCP_Recv(tcpSock, buffer, size_of_buffer);
if (status <= 0)
{
XSOCKET_ERROR("TCP recv failed", SDLNet_GetError());
return 0;
}
return status;
if (!tcpSock)
return 0;
} else {
int status = SDLNet_TCP_Recv(tcpSock, buffer, size_of_buffer);
if (status <= 0) {
close();
return 0;
}
return 1;
}
/*****************************************************************
Select functions
*****************************************************************/
// TODO: MODIFY
int XSocket::check_readability(int ms_time)
{
// return SDLNet_SocketReady(tcpSock);
return 1;
/* if(sock == INVALID_SOCKET)
return 0;
int val;
FD_ZERO(&XSocketSet);
FD_SET(sock,&XSocketSet);
timeval timeout = { ms_time/1000, ms_time % 1000 };
if((val = select(0, &XSocketSet, 0, 0, &timeout)) == SOCKET_ERROR){
XSOCKET_ERROR("select() failed",SDLNet_GetError());
return 0;
}
return val;*/
return 0;
}
// TODO: MODIFY
int XSocket::check_writeability(int ms_time)
{
/* if(sock == INVALID_SOCKET)
return 0;
int val;
FD_ZERO(&XSocketSet);
FD_SET(sock,&XSocketSet);
timeval timeout = { ms_time/1000, ms_time % 1000 };
if((val = select(0, 0, &XSocketSet, 0, &timeout)) == SOCKET_ERROR){
XSOCKET_ERROR("select() failed",SDLNet_GetError());
return 0;
}
return val;*/
return 0;
}
/*****************************************************************
Send To and Receive From functions
*****************************************************************/
// DO NOT USE?
int XSocket::sendto(const char* buffer, int size, unsigned int IP)
{
/* SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = IP;
addr.sin_port = htons(port);
int status = ::sendto(sock, buffer, size, 0, (LPSOCKADDR)&addr, sizeof(SOCKADDR_IN));
if(status == SOCKET_ERROR){
int err_code;
if((err_code = SDLNet_GetError()) == WSAEWOULDBLOCK)
return 0;
// XSOCKET_ERROR("sendto() failed",err_code);
sock = INVALID_SOCKET;
return 0;
}
return status;*/
return 0;
}
// DO NOT USE
int XSocket::receivefrom(char* buffer, int size_of_buffer, int ms_time)
{
/* int status = 0;
if(check_readability(ms_time)){
status = recvfrom(sock, buffer, size_of_buffer, 0,0,0);
if(status == SOCKET_ERROR){
XSOCKET_ERROR("recvfrom() failed",SDLNet_GetError());
sock = INVALID_SOCKET;
return 0;
}
}
return status;*/
return 0;
}
// WTF?
char* get_name_by_addr(int IP)
{
IPaddress addr;
addr.host = htonl(IP);
return (char *)SDLNet_ResolveIP(&addr); // TODO: erm, check if code that calls this function does anything nasty to the returned buffer...
return status;
}

View File

@@ -1,25 +1,19 @@
#ifndef _XSOCKET_H
#define _XSOCKET_H
#include "global.h"
#include "xglobal.h"
#include "SDL_net.h"
#include "xcontainers.h"
int XSocketInit(int ErrHUsed = 1);
int XSocketGetErrorStatus();
char* XSocketGetLastError();
// extern char XSocketLocalHostName[257];
extern IPaddress XSocketLocalHostADDR; // used in network.cpp
extern IPaddress XSocketLocalHostExternADDR; // used in iscreen/iscr_fnc.cpp
// extern int XSocketInitializationOK;
char* get_name_by_addr(int IP);
#define INVALID_SOCKET NULL
#define SOCKET_ERROR (-1)
#define SEND_BROADCAST (unsigned int)0xffffffff
#define XS_WAITING_TIME 120000
class XSocket
{
@@ -37,27 +31,14 @@ class XSocket
int open(int IP,int port);
int open(char* name,int port);
// socks4/5 operation is allowed by using FreeCap or tsocks wrappers.
// int open_by_socks5(char* name,int port,char* proxy_name,int proxy_port = 1080);
void close();
int listen(int port);
XSocket accept();
void set_ErrHUsing(int enable_using);
int set_nonblocking_mode(int enable_nonblocking);
int check_readability(int ms_time = 0);
int check_writeability(int ms_time = 0);
int send(const char* buffer, int size);
int receive(char* buffer, int size_of_buffer, int ms_time = 0);
int sendto(const char* buffer, int size, unsigned int IP = SEND_BROADCAST);
int receivefrom(char* buffer, int size_of_buffer, int ms_time = 0);
int operator! (){ return tcpSock == INVALID_SOCKET; }
int operator() (){ return tcpSock != INVALID_SOCKET; }
@@ -65,7 +46,4 @@ class XSocket
int tcp_open();
};
// For some reason, container classes were defined in xsocket include in original V.
#include "xcontainers.h"
#endif