Introducing rAthena's anonymous data collector. This aims at improving rAthena's overall features by letting we know which options are most and least used.
git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@16785 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
7a0f936c35
commit
56256a4532
@ -3285,6 +3285,35 @@ int parse_frommap(int fd)
|
|||||||
RFIFOSKIP(fd,6);
|
RFIFOSKIP(fd,6);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0x3008:
|
||||||
|
if( RFIFOREST(fd) < RFIFOW(fd,4) )
|
||||||
|
return 0;/* packet wasn't fully received yet (still fragmented) */
|
||||||
|
else {
|
||||||
|
int sfd;/* stat server fd */
|
||||||
|
RFIFOSKIP(fd, 2);/* we skip first 2 bytes which are the 0x3008, so we end up with a buffer equal to the one we send */
|
||||||
|
|
||||||
|
if( (sfd = make_connection(host2ip("stats.rathena.org"),(uint16)25421,true) ) == -1 ) {
|
||||||
|
RFIFOSKIP(fd, RFIFOW(fd,2) );/* skip this packet */
|
||||||
|
break;/* connection not possible, we drop the report */
|
||||||
|
}
|
||||||
|
|
||||||
|
session[sfd]->flag.server = 1;/* to ensure we won't drop our own packet */
|
||||||
|
|
||||||
|
WFIFOHEAD(sfd, RFIFOW(fd,2) );
|
||||||
|
|
||||||
|
memcpy((char*)WFIFOP(sfd,0), (char*)RFIFOP(fd, 0), RFIFOW(fd,2));
|
||||||
|
|
||||||
|
WFIFOSET(sfd, RFIFOW(fd,2) );
|
||||||
|
|
||||||
|
flush_fifo(sfd);
|
||||||
|
|
||||||
|
do_close(sfd);
|
||||||
|
|
||||||
|
RFIFOSKIP(fd, RFIFOW(fd,2) );/* skip this packet */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
// inter server - packet
|
// inter server - packet
|
||||||
@ -4244,7 +4273,7 @@ int check_connect_login_server(int tid, unsigned int tick, int id, intptr_t data
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ShowInfo("Attempt to connect to login-server...\n");
|
ShowInfo("Attempt to connect to login-server...\n");
|
||||||
login_fd = make_connection(login_ip, login_port);
|
login_fd = make_connection(login_ip, login_port, false);
|
||||||
if (login_fd == -1)
|
if (login_fd == -1)
|
||||||
{ //Try again later. [Skotlex]
|
{ //Try again later. [Skotlex]
|
||||||
login_fd = 0;
|
login_fd = 0;
|
||||||
|
@ -1220,6 +1220,7 @@ int inter_parse_frommap(int fd)
|
|||||||
case 0x3005: mapif_parse_RegistryRequest(fd); break;
|
case 0x3005: mapif_parse_RegistryRequest(fd); break;
|
||||||
case 0x3006: mapif_parse_NameChangeRequest(fd); break;
|
case 0x3006: mapif_parse_NameChangeRequest(fd); break;
|
||||||
case 0x3007: mapif_parse_accinfo(fd); break;
|
case 0x3007: mapif_parse_accinfo(fd); break;
|
||||||
|
/* 0x3008 is used by the report stuff */
|
||||||
default:
|
default:
|
||||||
if( inter_party_parse_frommap(fd)
|
if( inter_party_parse_frommap(fd)
|
||||||
|| inter_guild_parse_frommap(fd)
|
|| inter_guild_parse_frommap(fd)
|
||||||
|
@ -502,8 +502,7 @@ int make_listen_bind(uint32 ip, uint16 port)
|
|||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
int make_connection(uint32 ip, uint16 port)
|
int make_connection(uint32 ip, uint16 port, bool silent) {
|
||||||
{
|
|
||||||
struct sockaddr_in remote_address;
|
struct sockaddr_in remote_address;
|
||||||
int fd;
|
int fd;
|
||||||
int result;
|
int result;
|
||||||
@ -533,10 +532,12 @@ int make_connection(uint32 ip, uint16 port)
|
|||||||
remote_address.sin_addr.s_addr = htonl(ip);
|
remote_address.sin_addr.s_addr = htonl(ip);
|
||||||
remote_address.sin_port = htons(port);
|
remote_address.sin_port = htons(port);
|
||||||
|
|
||||||
|
if( !silent )
|
||||||
ShowStatus("Connecting to %d.%d.%d.%d:%i\n", CONVIP(ip), port);
|
ShowStatus("Connecting to %d.%d.%d.%d:%i\n", CONVIP(ip), port);
|
||||||
|
|
||||||
result = sConnect(fd, (struct sockaddr *)(&remote_address), sizeof(struct sockaddr_in));
|
result = sConnect(fd, (struct sockaddr *)(&remote_address), sizeof(struct sockaddr_in));
|
||||||
if( result == SOCKET_ERROR ) {
|
if( result == SOCKET_ERROR ) {
|
||||||
|
if( !silent )
|
||||||
ShowError("make_connection: connect failed (socket #%d, %s)!\n", fd, error_msg());
|
ShowError("make_connection: connect failed (socket #%d, %s)!\n", fd, error_msg());
|
||||||
do_close(fd);
|
do_close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -112,7 +112,7 @@ extern bool session_isActive(int fd);
|
|||||||
// Function prototype declaration
|
// Function prototype declaration
|
||||||
|
|
||||||
int make_listen_bind(uint32 ip, uint16 port);
|
int make_listen_bind(uint32 ip, uint16 port);
|
||||||
int make_connection(uint32 ip, uint16 port);
|
int make_connection(uint32 ip, uint16 port, bool silent);
|
||||||
int realloc_fifo(int fd, unsigned int rfifo_size, unsigned int wfifo_size);
|
int realloc_fifo(int fd, unsigned int rfifo_size, unsigned int wfifo_size);
|
||||||
int realloc_writefifo(int fd, size_t addition);
|
int realloc_writefifo(int fd, size_t addition);
|
||||||
int WFIFOSET(int fd, size_t len);
|
int WFIFOSET(int fd, size_t len);
|
||||||
|
@ -8,20 +8,16 @@
|
|||||||
* For detailed guidance on these check http://rathena.org/wiki/SRC/config/
|
* For detailed guidance on these check http://rathena.org/wiki/SRC/config/
|
||||||
**/
|
**/
|
||||||
|
|
||||||
/**
|
/// Max number of items on @autolootid list
|
||||||
* Max number of items on @autolootid list
|
|
||||||
**/
|
|
||||||
#define AUTOLOOTITEM_SIZE 10
|
#define AUTOLOOTITEM_SIZE 10
|
||||||
|
|
||||||
/**
|
/// The maximum number of atcommand suggestions
|
||||||
* The maximum number of atcommand suggestions
|
|
||||||
**/
|
|
||||||
#define MAX_SUGGESTIONS 10
|
#define MAX_SUGGESTIONS 10
|
||||||
|
|
||||||
//Comment to disable the official walk path
|
/// Comment to disable the official walk path
|
||||||
// -- The official walkpath disables users from taking non-clear walk paths,
|
/// The official walkpath disables users from taking non-clear walk paths,
|
||||||
// -- e.g. if they want to get around an obstacle they have to walk around it,
|
/// e.g. if they want to get around an obstacle they have to walk around it,
|
||||||
// -- while with OFFICIAL_WALKPATH disabled if they click to walk around a obstacle the server will do it automatically
|
/// while with OFFICIAL_WALKPATH disabled if they click to walk around a obstacle the server will do it automatically
|
||||||
#define OFFICIAL_WALKPATH
|
#define OFFICIAL_WALKPATH
|
||||||
|
|
||||||
/// leave this line uncommented to enable callfunc checks when processing scripts.
|
/// leave this line uncommented to enable callfunc checks when processing scripts.
|
||||||
@ -31,21 +27,25 @@
|
|||||||
/// your map-server using more resources while this is active, comment the line
|
/// your map-server using more resources while this is active, comment the line
|
||||||
#define SCRIPT_CALLFUNC_CHECK
|
#define SCRIPT_CALLFUNC_CHECK
|
||||||
|
|
||||||
|
/// Uncomment to disable rAthena's anonymous stat report
|
||||||
|
/// We kindly ask you to consider keeping it enabled, it helps us improve rAthena.
|
||||||
|
//#define STATS_OPT_OUT
|
||||||
|
|
||||||
/// uncomment to enable query_sql script command and mysql logs to function on it's own thread
|
/// uncomment to enable query_sql script command and mysql logs to function on it's own thread
|
||||||
/// be aware this feature is under tests and you should use at your own risk, we however
|
/// be aware this feature is under tests and you should use at your own risk, we however
|
||||||
/// welcome any feedback you may have regarding this feature, please send us all bug reports.
|
/// welcome any feedback you may have regarding this feature, please send us all bug reports.
|
||||||
//#define BETA_THREAD_TEST
|
//#define BETA_THREAD_TEST
|
||||||
|
|
||||||
//Uncomment to enable the Cell Stack Limit mod.
|
/// Uncomment to enable the Cell Stack Limit mod.
|
||||||
//It's only config is the battle_config cell_stack_limit.
|
/// It's only config is the battle_config cell_stack_limit.
|
||||||
//Only chars affected are those defined in BL_CHAR (mobs and players currently)
|
/// Only chars affected are those defined in BL_CHAR (mobs and players currently)
|
||||||
//#define CELL_NOSTACK
|
//#define CELL_NOSTACK
|
||||||
|
|
||||||
//Uncomment to enable circular area checks.
|
/// Uncomment to enable circular area checks.
|
||||||
//By default, all range checks in Aegis are of Square shapes, so a weapon range
|
/// By default, all range checks in Aegis are of Square shapes, so a weapon range
|
||||||
// of 10 allows you to attack from anywhere within a 21x21 area.
|
/// - of 10 allows you to attack from anywhere within a 21x21 area.
|
||||||
//Enabling this changes such checks to circular checks, which is more realistic,
|
/// Enabling this changes such checks to circular checks, which is more realistic,
|
||||||
// but is not the official behaviour.
|
/// - but is not the official behaviour.
|
||||||
//#define CIRCULAR_AREA
|
//#define CIRCULAR_AREA
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
142
src/map/battle.c
142
src/map/battle.c
@ -8,6 +8,7 @@
|
|||||||
#include "../common/showmsg.h"
|
#include "../common/showmsg.h"
|
||||||
#include "../common/ers.h"
|
#include "../common/ers.h"
|
||||||
#include "../common/random.h"
|
#include "../common/random.h"
|
||||||
|
#include "../common/socket.h"
|
||||||
#include "../common/strlib.h"
|
#include "../common/strlib.h"
|
||||||
#include "../common/utils.h"
|
#include "../common/utils.h"
|
||||||
|
|
||||||
@ -27,6 +28,7 @@
|
|||||||
#include "party.h"
|
#include "party.h"
|
||||||
#include "battle.h"
|
#include "battle.h"
|
||||||
#include "battleground.h"
|
#include "battleground.h"
|
||||||
|
#include "chrif.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -5717,7 +5719,141 @@ static const struct _battle_data {
|
|||||||
{ "homunculus_max_level", &battle_config.hom_max_level, 99, 0, MAX_LEVEL, },
|
{ "homunculus_max_level", &battle_config.hom_max_level, 99, 0, MAX_LEVEL, },
|
||||||
{ "homunculus_S_max_level", &battle_config.hom_S_max_level, 150, 0, MAX_LEVEL, },
|
{ "homunculus_S_max_level", &battle_config.hom_S_max_level, 150, 0, MAX_LEVEL, },
|
||||||
};
|
};
|
||||||
|
#ifndef STATS_OPT_OUT
|
||||||
|
/**
|
||||||
|
* rAthena anonymous statistic usage report -- packet is built here, and sent to char server to report.
|
||||||
|
**/
|
||||||
|
void rAthena_report(char* date, char *time_c) {
|
||||||
|
int i, rev = 0, bd_size = ARRAYLENGTH(battle_data);
|
||||||
|
unsigned int config = 0;
|
||||||
|
const char* rev_str;
|
||||||
|
char timestring[25];
|
||||||
|
time_t curtime;
|
||||||
|
char* buf;
|
||||||
|
|
||||||
|
enum config_table {
|
||||||
|
C_CIRCULAR_AREA = 0x0001,
|
||||||
|
C_CELLNOSTACK = 0x0002,
|
||||||
|
C_BETA_THREAD_TEST = 0x0004,
|
||||||
|
C_SCRIPT_CALLFUNC_CHECK = 0x0008,
|
||||||
|
C_OFFICIAL_WALKPATH = 0x0010,
|
||||||
|
C_RENEWAL = 0x0020,
|
||||||
|
C_RENEWAL_CAST = 0x0040,
|
||||||
|
C_RENEWAL_DROP = 0x0080,
|
||||||
|
C_RENEWAL_EXP = 0x0100,
|
||||||
|
C_RENEWAL_LVDMG = 0x0200,
|
||||||
|
C_RENEWAL_EDP = 0x0400,
|
||||||
|
C_RENEWAL_ASPD = 0x0800,
|
||||||
|
C_SECURE_NPCTIMEOUT = 0x1000,
|
||||||
|
C_SQL_DBS = 0x2000,
|
||||||
|
C_SQL_LOGS = 0x4000,
|
||||||
|
};
|
||||||
|
|
||||||
|
if( (rev_str = get_svn_revision()) != 0 )
|
||||||
|
rev = atoi(rev_str);
|
||||||
|
|
||||||
|
/* we get the current time */
|
||||||
|
time(&curtime);
|
||||||
|
strftime(timestring, 24, "%Y-%m-%d %H:%M:%S", localtime(&curtime));
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CIRCULAR_AREA
|
||||||
|
config |= C_CIRCULAR_AREA;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CELL_NOSTACK
|
||||||
|
config |= C_CELLNOSTACK;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_THREAD_TEST
|
||||||
|
config |= C_BETA_THREAD_TEST;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SCRIPT_CALLFUNC_CHECK
|
||||||
|
config |= C_SCRIPT_CALLFUNC_CHECK;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef OFFICIAL_WALKPATH
|
||||||
|
config |= C_OFFICIAL_WALKPATH;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RENEWAL
|
||||||
|
config |= C_RENEWAL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RENEWAL_CAST
|
||||||
|
config |= C_RENEWAL_CAST;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RENEWAL_DROP
|
||||||
|
config |= C_RENEWAL_DROP;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RENEWAL_EXP
|
||||||
|
config |= C_RENEWAL_EXP;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RENEWAL_LVDMG
|
||||||
|
config |= C_RENEWAL_LVDMG;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RENEWAL_EDP
|
||||||
|
config |= C_RENEWAL_EDP;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RENEWAL_ASPD
|
||||||
|
config |= C_RENEWAL_ASPD;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* not a ifdef because SECURE_NPCTIMEOUT is always defined, but either as 0 or higher */
|
||||||
|
#if SECURE_NPCTIMEOUT
|
||||||
|
config |= C_SECURE_NPCTIMEOUT;
|
||||||
|
#endif
|
||||||
|
/* non-define part */
|
||||||
|
if( db_use_sqldbs )
|
||||||
|
config |= C_SQL_DBS;
|
||||||
|
|
||||||
|
if( log_config.sql_logs )
|
||||||
|
config |= C_SQL_LOGS;
|
||||||
|
|
||||||
|
#define BFLAG_LENGTH 35
|
||||||
|
|
||||||
|
CREATE(buf, char, 6 + 12 + 9 + 24 + 4 + 4 + 4 + 4 + ( bd_size * ( BFLAG_LENGTH + 4 ) ) + 1 );
|
||||||
|
|
||||||
|
/* build packet */
|
||||||
|
|
||||||
|
WBUFW(buf,0) = 0x3000;
|
||||||
|
WBUFW(buf,2) = 6 + 12 + 9 + 24 + 4 + 4 + 4 + 4 + ( bd_size * ( BFLAG_LENGTH + 4 ) );
|
||||||
|
WBUFW(buf,4) = 0x9c;
|
||||||
|
|
||||||
|
safestrncpy((char*)WBUFP(buf,6), date, 12);
|
||||||
|
safestrncpy((char*)WBUFP(buf,6 + 12), time_c, 9);
|
||||||
|
safestrncpy((char*)WBUFP(buf,6 + 12 + 9), timestring, 24);
|
||||||
|
|
||||||
|
WBUFL(buf,6 + 12 + 9 + 24) = rev;
|
||||||
|
WBUFL(buf,6 + 12 + 9 + 24 + 4) = map_getusers();
|
||||||
|
|
||||||
|
WBUFL(buf,6 + 12 + 9 + 24 + 4 + 4) = config;
|
||||||
|
WBUFL(buf,6 + 12 + 9 + 24 + 4 + 4 + 4) = bd_size;
|
||||||
|
|
||||||
|
for( i = 0; i < bd_size; i++ ) {
|
||||||
|
safestrncpy((char*)WBUFP(buf,6 + 12 + 9+ 24 + 4 + 4 + 4 + 4 + ( i * ( BFLAG_LENGTH + 4 ) ) ), battle_data[i].str, 35);
|
||||||
|
WBUFL(buf,6 + 12 + 9 + 24 + 4 + 4 + 4 + 4 + BFLAG_LENGTH + ( i * ( BFLAG_LENGTH + 4 ) ) ) = *battle_data[i].val;
|
||||||
|
}
|
||||||
|
|
||||||
|
chrif_send_report(buf, 6 + 12 + 9 + 24 + 4 + 4 + 4 + 4 + ( bd_size * ( BFLAG_LENGTH + 4 ) ) );
|
||||||
|
|
||||||
|
aFree(buf);
|
||||||
|
|
||||||
|
#undef BFLAG_LENGTH
|
||||||
|
}
|
||||||
|
static int rAthena_report_timer(int tid, unsigned int tick, int id, intptr_t data) {
|
||||||
|
if( chrif_isconnected() ) {/* char server relays it, so it must be online. */
|
||||||
|
rAthena_report(__DATE__,__TIME__);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int battle_set_value(const char* w1, const char* w2)
|
int battle_set_value(const char* w1, const char* w2)
|
||||||
{
|
{
|
||||||
@ -5841,6 +5977,12 @@ void do_init_battle(void)
|
|||||||
{
|
{
|
||||||
delay_damage_ers = ers_new(sizeof(struct delay_damage),"battle.c::delay_damage_ers",ERS_OPT_CLEAR);
|
delay_damage_ers = ers_new(sizeof(struct delay_damage),"battle.c::delay_damage_ers",ERS_OPT_CLEAR);
|
||||||
add_timer_func_list(battle_delay_damage_sub, "battle_delay_damage_sub");
|
add_timer_func_list(battle_delay_damage_sub, "battle_delay_damage_sub");
|
||||||
|
|
||||||
|
#ifndef STATS_OPT_OUT
|
||||||
|
add_timer_func_list(rAthena_report_timer, "rAthena_report_timer");
|
||||||
|
add_timer_interval(gettick()+30000, rAthena_report_timer, 0, 0, 60000 * 30);
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_final_battle(void)
|
void do_final_battle(void)
|
||||||
|
@ -1523,7 +1523,7 @@ static int check_connect_char_server(int tid, unsigned int tick, int id, intptr_
|
|||||||
}
|
}
|
||||||
|
|
||||||
chrif_state = 0;
|
chrif_state = 0;
|
||||||
char_fd = make_connection(char_ip, char_port);
|
char_fd = make_connection(char_ip, char_port,false);
|
||||||
if (char_fd == -1)
|
if (char_fd == -1)
|
||||||
{ //Attempt to connect later. [Skotlex]
|
{ //Attempt to connect later. [Skotlex]
|
||||||
return 0;
|
return 0;
|
||||||
@ -1562,6 +1562,20 @@ int chrif_removefriend(int char_id, int friend_id) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void chrif_send_report(char* buf, int len) {
|
||||||
|
#ifndef STATS_OPT_OUT
|
||||||
|
WFIFOHEAD(char_fd,len + 2);
|
||||||
|
|
||||||
|
WFIFOW(char_fd,0) = 0x3008;
|
||||||
|
|
||||||
|
memcpy(WFIFOP(char_fd,2), buf, len);
|
||||||
|
|
||||||
|
WFIFOSET(char_fd,len + 2);
|
||||||
|
|
||||||
|
flush_fifo(char_fd); /* ensure it's sent now. */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see DBApply
|
* @see DBApply
|
||||||
*/
|
*/
|
||||||
|
@ -57,10 +57,9 @@ int chrif_char_online(struct map_session_data *sd);
|
|||||||
int chrif_changesex(struct map_session_data *sd);
|
int chrif_changesex(struct map_session_data *sd);
|
||||||
int chrif_chardisconnect(struct map_session_data *sd);
|
int chrif_chardisconnect(struct map_session_data *sd);
|
||||||
int chrif_divorce(int partner_id1, int partner_id2);
|
int chrif_divorce(int partner_id1, int partner_id2);
|
||||||
/**
|
|
||||||
* rAthena
|
|
||||||
**/
|
|
||||||
int chrif_removefriend(int char_id, int friend_id);
|
int chrif_removefriend(int char_id, int friend_id);
|
||||||
|
void chrif_send_report(char* buf, int len);
|
||||||
|
|
||||||
int do_final_chrif(void);
|
int do_final_chrif(void);
|
||||||
int do_init_chrif(void);
|
int do_init_chrif(void);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user