void do_init_chlogif(void) { // establish char-login connection if not present add_timer_func_list(chlogif_check_connect_logserver, "check_connect_login_server"); add_timer_interval(gettick() + 1000, chlogif_check_connect_logserver, 0, 0, 10 * 1000); // send a list of all online account IDs to login server add_timer_func_list(chlogif_send_acc_tologin, "send_accounts_tologin"); add_timer_interval(gettick() + 1000, chlogif_send_acc_tologin, 0, 0, 3600 * 1000); //Sync online accounts every hour }
void do_init_instance(void) { instance_readdb(); memset(instance_data, 0, sizeof(instance_data)); memset(&instance_wait, 0, sizeof(instance_wait)); instance_wait.timer = -1; add_timer_func_list(instance_delete_timer,"instance_delete_timer"); add_timer_func_list(instance_subscription_timer,"instance_subscription_timer"); }
void gui_init () { char line[1024], w1[1024], w2[1024]; int flush_on = 0; int flush_time = 100; int imalive_on = 0; int imalive_time = 30; char **argv; int *argc; FILE *fp; int i; IMPORT_SYMBOL(argc, 2); IMPORT_SYMBOL(argv, 3); IMPORT_SYMBOL(gettick, 5); IMPORT_SYMBOL(add_timer_interval, 8); IMPORT_SYMBOL(add_timer_func_list, 9); do { fp = fopen("plugins/gui.conf","r"); if (fp == NULL) break; while(fgets(line, sizeof(line), fp)) { if (line[0] == '/' && line[1] == '/') continue; if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) { if(strcmpi(w1,"imalive_on")==0){ imalive_on = atoi(w2); } else if(strcmpi(w1,"imalive_time")==0){ imalive_time = atoi(w2); } else if(strcmpi(w1,"flush_on")==0){ flush_on = atoi(w2); } else if(strcmpi(w1,"flush_time")==0){ flush_time = atoi(w2); } } } fclose(fp); } while (0); for (i = 1; i < *argc ; i++) if (strcmp(argv[i], "--gui") == 0) flush_on = imalive_on = 1; if (flush_on) { add_timer_func_list(flush_timer, "flush_timer"); add_timer_interval(gettick()+1000,flush_timer,0,0,flush_time); } if (imalive_on) { add_timer_func_list(imalive_timer, "imalive_timer"); add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000); } }
int main(int argc,char **argv) { int next; do_socket(); #ifdef _WIN32 atexit(sig_proc); #else signal(SIGPIPE,SIG_IGN); signal(SIGTERM,sig_proc); signal(SIGINT,sig_proc); #endif do_init(argc,argv); if (packet_parse_time > 0) { add_timer_func_list(parsepacket_timer,"parsepacket_timer"); add_timer_interval(gettick()+packet_parse_time,parsepacket_timer,0,0,packet_parse_time); while(1){ next=do_timer(gettick_nocache()); do_sendrecv(next); } } else { while(1){ next=do_timer(gettick_nocache()); do_sendrecv(next); do_parsepacket(); } } return 0; }
// Constructor, init vars void do_init_party(void) { party_db = idb_alloc(DB_OPT_RELEASE_DATA); party_booking_db = idb_alloc(DB_OPT_RELEASE_DATA); // Party Booking [Spiria] add_timer_func_list(party_send_xy_timer, "party_send_xy_timer"); add_timer_interval(gettick()+battle_config.party_update_interval, party_send_xy_timer, 0, 0, battle_config.party_update_interval); }
void do_init_elemental(void) { read_elementaldb(); read_elemental_skilldb(); add_timer_func_list(elemental_ai_timer,"elemental_ai_timer"); add_timer_interval(gettick()+MIN_ELETHINKTIME,elemental_ai_timer,0,0,MIN_ELETHINKTIME); }
//------------------------------ // Init inter-server for parties //------------------------------ void inter_party_init() { int i; int total_party; total_party = 0; sql_request("SELECT count(1) FROM `%s`", party_db); if (sql_get_row()) { total_party = sql_get_integer(0); if (total_party > 0) { // Searching for party_newid sql_request("SELECT max(`party_id`) FROM `%s`", party_db); if (sql_get_row()) party_newid = sql_get_integer(0) + 1; } } party_num = 0; party_max = 256; CALLOC(partys, struct party, 256); add_timer_func_list(party_sync_timer, "party_sync_timer"); i = add_timer_interval(gettick_cache + 60 * 1000, party_sync_timer, 0, 0, 60 * 1000); // to check parties in memory and free if not used return; }
void mapreg_init (void) { mapreg_db = idb_alloc (DB_OPT_BASE); mapregstr_db = idb_alloc (DB_OPT_RELEASE_DATA); script_load_mapreg(); add_timer_func_list (script_autosave_mapreg, "script_autosave_mapreg"); add_timer_interval (gettick() + MAPREG_AUTOSAVE_INTERVAL, script_autosave_mapreg, 0, 0, MAPREG_AUTOSAVE_INTERVAL); }
void do_init_battleground(void) { bg_team_db = idb_alloc(DB_OPT_RELEASE_DATA); queue_db = idb_alloc(DB_OPT_RELEASE_DATA); add_timer_func_list(bg_send_xy_timer, "bg_send_xy_timer"); add_timer_interval(gettick() + battle_config.bg_update_interval, bg_send_xy_timer, 0, 0, battle_config.bg_update_interval); bg_guild_build_data(); }
void do_init_guild(void) { guild_db=idb_alloc(DB_OPT_RELEASE_DATA); castle_db=idb_alloc(DB_OPT_BASE); guild_expcache_db=idb_alloc(DB_OPT_BASE); guild_infoevent_db=idb_alloc(DB_OPT_BASE); expcache_ers = ers_new(sizeof(struct guild_expcache)); guild_castleinfoevent_db=idb_alloc(DB_OPT_BASE); sv_readdb(db_path, "castle_db.txt", ',', 4, 5, -1, &guild_read_castledb); memset(guild_skill_tree,0,sizeof(guild_skill_tree)); sv_readdb(db_path, "guild_skill_tree.txt", ',', 2+MAX_GUILD_SKILL_REQUIRE*2, 2+MAX_GUILD_SKILL_REQUIRE*2, -1, &guild_read_guildskill_tree_db); //guild skill tree [Komurka] add_timer_func_list(guild_payexp_timer,"guild_payexp_timer"); add_timer_func_list(guild_send_xy_timer, "guild_send_xy_timer"); add_timer_interval(gettick()+GUILD_PAYEXP_INVERVAL,guild_payexp_timer,0,0,GUILD_PAYEXP_INVERVAL); add_timer_interval(gettick()+GUILD_SEND_XY_INVERVAL,guild_send_xy_timer,0,0,GUILD_SEND_XY_INVERVAL); }
/*========================================== * *------------------------------------------*/ int do_init_chrif(void) { auth_db = idb_alloc(DB_OPT_BASE); auth_db_ers = ers_new(sizeof(struct auth_node),"chrif.c::auth_db_ers",ERS_OPT_NONE); add_timer_func_list(check_connect_char_server, "check_connect_char_server"); add_timer_func_list(auth_db_cleanup, "auth_db_cleanup"); // establish map-char connection if not present add_timer_interval(gettick() + 1000, check_connect_char_server, 0, 0, 10 * 1000); // wipe stale data for timed-out client connection requests add_timer_interval(gettick() + 1000, auth_db_cleanup, 0, 0, 30 * 1000); // send the user count every 10 seconds, to hide the charserver's online counting problem add_timer_interval(gettick() + 1000, send_usercount_tochar, 0, 0, UPDATE_INTERVAL); return 0; }
void do_init_guild(void) { guild_db=idb_alloc(DB_OPT_RELEASE_DATA); castle_db=idb_alloc(DB_OPT_BASE); guild_expcache_db=idb_alloc(DB_OPT_BASE); guild_infoevent_db=idb_alloc(DB_OPT_BASE); expcache_ers = ers_new(sizeof(struct guild_expcache)); guild_castleinfoevent_db=idb_alloc(DB_OPT_BASE); guild_read_castledb(); guild_read_guildskill_tree_db(); //guild skill tree [Komurka] add_timer_func_list(guild_payexp_timer,"guild_payexp_timer"); add_timer_func_list(guild_save_sub, "guild_save_sub"); add_timer_func_list(guild_send_xy_timer, "guild_send_xy_timer"); add_timer_interval(gettick()+GUILD_PAYEXP_INVERVAL,guild_payexp_timer,0,0,GUILD_PAYEXP_INVERVAL); add_timer_interval(gettick()+GUILD_SEND_XY_INVERVAL,guild_send_xy_timer,0,0,GUILD_SEND_XY_INVERVAL); }
/** * loginchrif constructor * Initialisation, function called at start of the login-serv. */ void do_init_loginchrif(void){ int i; for( i = 0; i < ARRAYLENGTH(ch_server); ++i ) logchrif_server_init(i); // add timer to detect ip address change and perform update if (login_config.ip_sync_interval) { add_timer_func_list(logchrif_sync_ip_addresses, "sync_ip_addresses"); add_timer_interval(gettick() + login_config.ip_sync_interval, logchrif_sync_ip_addresses, 0, 0, login_config.ip_sync_interval); } }
// initialize void ipban_init(void) { const char* username; const char* password; const char* hostname; uint16 port; const char* database; const char* codepage; ipban_inited = true; if( !login_config.ipban ) return;// ipban disabled if( ipban_db_hostname[0] != '\0' ) {// local settings username = ipban_db_username; password = ipban_db_password; hostname = ipban_db_hostname; port = ipban_db_port; database = ipban_db_database; codepage = ipban_codepage; } else {// global settings username = global_db_username; password = global_db_password; hostname = global_db_hostname; port = global_db_port; database = global_db_database; codepage = global_codepage; } // establish connections sql_handle = Sql_Malloc(); if( SQL_ERROR == Sql_Connect(sql_handle, username, password, hostname, port, database) ) { Sql_ShowDebug(sql_handle); Sql_Free(sql_handle); exit(EXIT_FAILURE); } if( codepage[0] != '\0' && SQL_ERROR == Sql_SetEncoding(sql_handle, codepage) ) Sql_ShowDebug(sql_handle); ShowStatus("Conectado ao banco de dados ipban '%s'.\n", database); Sql_PrintExtendedInfo(sql_handle); if( login_config.ipban_cleanup_interval > 0 ) { // set up periodic cleanup of connection history and active bans add_timer_func_list(ipban_cleanup, "ipban_cleanup"); cleanup_timer_id = add_timer_interval(gettick()+10, ipban_cleanup, 0, 0, login_config.ipban_cleanup_interval*1000); } else // make sure it gets cleaned up on login-server start regardless of interval-based cleanups ipban_cleanup(0,0,0,0); }
/*========================================== * *------------------------------------------*/ int do_init_chrif(void) { add_timer_func_list(check_connect_char_server, "check_connect_char_server"); add_timer_func_list(send_usercount_tochar, "send_usercount_tochar"); add_timer_func_list(send_users_tochar, "send_users_tochar"); add_timer_func_list(auth_db_cleanup, "auth_db_cleanup"); add_timer_interval(gettick() + 1000, check_connect_char_server, 0, 0, 10 * 1000); #ifdef TXT_ONLY //Txt needs this more frequently because it is used for the online.html file. add_timer_interval(gettick() + 1000, send_users_tochar, 0, 0, UPDATE_INTERVAL); #else add_timer_interval(gettick() + 1000, send_users_tochar, 0, 0, CHECK_INTERVAL); add_timer_interval(gettick() + 1000, send_usercount_tochar, 0, 0, UPDATE_INTERVAL); #endif add_timer_interval(gettick() + 1000, auth_db_cleanup, 0, 0, 30 * 1000); auth_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int)); return 0; }
int do_init_elemental(void) { #ifdef RENEWAL read_elementaldb(); read_elemental_skilldb(); #endif add_timer_func_list(elemental_ai_timer,"elemental_ai_timer"); add_timer_interval(gettick()+MIN_ELETHINKTIME,elemental_ai_timer,0,0,MIN_ELETHINKTIME); return 0; }
void do_init_homunculus(void){ int class_; read_homunculusdb(); read_homunculus_expdb(); read_homunculus_skilldb(); // Add homunc timer function to timer func list [Toms] add_timer_func_list(hom_hungry, "hom_hungry"); //Stock view data for homuncs memset(&hom_viewdb, 0, sizeof(hom_viewdb)); for (class_ = 0; class_ < ARRAYLENGTH(hom_viewdb); class_++) hom_viewdb[class_].class_ = HM_CLASS_BASE+class_; }
// initialize void ipban_init(void) { const char* username; const char* password; const char* hostname; uint16 port; const char* database; const char* codepage; ipban_inited = true; if( !login_config.ipban ) return;// ipban disabled if( ipban_db_hostname[0] != '\0' ) {// local settings username = ipban_db_username; password = ipban_db_password; hostname = ipban_db_hostname; port = ipban_db_port; database = ipban_db_database; codepage = ipban_codepage; } else {// global settings username = global_db_username; password = global_db_password; hostname = global_db_hostname; port = global_db_port; database = global_db_database; codepage = global_codepage; } // establish connections sql_handle = Sql_Malloc(); if( SQL_ERROR == Sql_Connect(sql_handle, username, password, hostname, port, database) ) { Sql_ShowDebug(sql_handle); Sql_Free(sql_handle); exit(EXIT_FAILURE); } if( codepage[0] != '\0' && SQL_ERROR == Sql_SetEncoding(sql_handle, codepage) ) Sql_ShowDebug(sql_handle); // set up periodic cleanup of connection history and active bans add_timer_func_list(ipban_cleanup, "ipban_cleanup"); cleanup_timer_id = add_timer_interval(gettick()+10, ipban_cleanup, 0, 0, 60*1000); }
/*========================================== * 接続 *------------------------------------------ */ bool sqldbs_connect(struct sqldbs_handle *hd, const char *host, const char *user, const char *passwd, const char *db, unsigned short port, const char *charset, int keepalive, const char *tag) { if(hd == NULL) return false; hd->result = NULL; hd->transaction_count = 0; hd->tag = NULL; if(mysql_init(&hd->handle) == NULL) { printf("Database Server Out of Memory\n"); return false; } printf("Connecting Database Server -> %s@%s:%d/%s", user, host, port, db); if(charset && *charset) { mysql_options(&hd->handle, MYSQL_SET_CHARSET_NAME, charset); printf(" (charset: %s)", charset); } printf("\n ... "); if(!mysql_real_connect(&hd->handle, host, user, passwd, db, port, NULL, 0)) { printf("%s\n", mysql_error(&hd->handle)); return false; } printf("connect success!\n"); if(charset && *charset) { sqldbs_query(hd, "SET NAMES %s", charset); } printf("MySQL Server version %s\n", mysql_get_server_info(&hd->handle)); if(keepalive > 0) { add_timer_func_list(sqldbs_keepalive_timer); add_timer_interval(gettick() + keepalive * 1000, sqldbs_keepalive_timer, 0, hd, keepalive * 1000); printf("MySQL keepalive timer set: interval = %d (sec)\n", keepalive); } if(tag) hd->tag = (char *)aStrdup(tag); return true; }
void network_init(){ SESSION *s; int32 i; memset(g_Session, 0x00, (sizeof(SESSION) * MAXCONN) ); for(i = 0; i < MAXCONN; i++){ s = &g_Session[i]; s->type = NST_FREE; s->disconnect_in_progress = false; } // Initialize the correspondig event dispatcher evdp_init(); // add_timer_func_list(_network_async_free_netbuf_proc, "_network_async_free_netbuf_proc"); }//end: network_init()
/*========================================== * map鯖初期化の大元 *------------------------------------------ */ int do_init(int argc,char *argv[]) { srand(gettick()); if(map_config_read((argc<2)? MAP_CONF_NAME:argv[1])) exit(1); battle_config_read((argc>2)? argv[2]:BATTLE_CONF_FILENAME); atcommand_config_read((argc>3)? argv[3]:ATCOMMAND_CONF_FILENAME); script_config_read((argc>4)? argv[4]:SCRIPT_CONF_NAME); msg_config_read((argc>5)? argv[5]:MSG_CONF_NAME); atexit(do_final); id_db = numdb_init(); map_db = strdb_init(16); nick_db = strdb_init(24); charid_db = numdb_init(); grfio_init((argc>6)? argv[6]:GRF_PATH_FILENAME); map_readallmap(); add_timer_func_list(map_clearflooritem_timer,"map_clearflooritem_timer"); do_init_chrif(); do_init_clif(); do_init_itemdb(); do_init_mob(); // npcの初期化時内でmob_spawnして、mob_dbを参照するのでinit_npcより先 do_init_script(); do_init_npc(); do_init_pc(); do_init_storage(); do_init_party(); do_init_guild(); do_init_skill(); do_init_pet(); npc_event_do_oninit(); // npcのOnInitイベント実行 return 0; }
// 初期化 void do_init_party(void) { party_db=numdb_init(); add_timer_func_list(party_send_xy_timer,"party_send_xy_timer"); add_timer_interval(gettick()+PARTY_SEND_XY_INVERVAL,party_send_xy_timer,0,0,PARTY_SEND_XY_INVERVAL); }
// initialize int inter_init(const char *file) { //int i; ShowInfo ("interserver initialize...\n"); inter_config_read(file); //DB connection initialized mysql_init(&mysql_handle); ShowInfo("Connect Character DB server.... (Character Server)\n"); if(!mysql_real_connect(&mysql_handle, char_server_ip, char_server_id, char_server_pw, char_server_db ,char_server_port, (char *)NULL, 0)) { //pointer check ShowFatalError("%s\n",mysql_error(&mysql_handle)); exit(1); } else if (inter_sql_test()) { ShowStatus("Connect Success! (Character Server)\n"); } if(char_gm_read) { mysql_init(&lmysql_handle); ShowInfo("Connect Character DB server.... (login server)\n"); if(!mysql_real_connect(&lmysql_handle, login_server_ip, login_server_id, login_server_pw, login_server_db ,login_server_port, (char *)NULL, 0)) { //pointer check ShowFatalError("%s\n",mysql_error(&lmysql_handle)); exit(1); } else { ShowStatus ("Connect Success! (Login Server)\n"); } } if(strlen(default_codepage) > 0 ) { sprintf( tmp_sql, "SET NAMES %s", default_codepage ); if (mysql_query(&mysql_handle, tmp_sql)) { ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); } if(char_gm_read) if (mysql_query(&lmysql_handle, tmp_sql)) { ShowSQL("DB error - %s\n",mysql_error(&lmysql_handle)); ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); } } wis_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int)); inter_guild_sql_init(); inter_storage_sql_init(); inter_party_sql_init(); inter_pet_sql_init(); inter_accreg_sql_init(); //printf ("interserver timer initializing : %d sec...\n",autosave_interval); //i=add_timer_interval(gettick()+autosave_interval,inter_save_timer,0,0,autosave_interval); if (connection_ping_interval) { add_timer_func_list(inter_sql_ping, "inter_sql_ping"); add_timer_interval(gettick()+connection_ping_interval*60*60*1000, inter_sql_ping, 0, 0, connection_ping_interval*60*60*1000); } return 0; }
void do_init_chcnslif(void){ if( charserv_config.console ){ //start listening add_timer_func_list(cnslif_console_timer, "cnslif_console_timer"); add_timer_interval(gettick()+1000, cnslif_console_timer, 0, 0, 1000); //start in 1s each 1sec } }
void do_init_instance(void) { memset(instance, 0x00, sizeof(instance)); add_timer_func_list(instance_destroy_timer, "instance_destroy_timer"); }
/** * Initialize the module. * Launched at login-serv start, create db or other long scope variable here. */ void do_init_logincnslif(void){ if( login_config.console ) { add_timer_func_list(parse_console_timer, "parse_console_timer"); add_timer_interval(gettick()+1000, parse_console_timer, 0, 0, 1000); //start in 1s each 1sec } }
/// opens accounts file, loads it, and starts a periodic saving timer static bool account_db_txt_init(AccountDB* self) { AccountDB_TXT* db = (AccountDB_TXT*)self; DBMap* accounts; FILE* fp; char line[2048]; unsigned int version = 0; // create accounts database db->accounts = idb_alloc(DB_OPT_RELEASE_DATA); accounts = db->accounts; // open data file fp = fopen(db->account_db, "r"); if( fp == NULL ) { // no account file -> no account -> no login, including char-server (ERROR) ShowError(CL_RED"account_db_txt_init: Accounts file [%s] not found."CL_RESET"\n", db->account_db); return false; } // load data file while( fgets(line, sizeof(line), fp) != NULL ) { int account_id, n; unsigned int v; struct mmo_account acc; struct mmo_account* tmp; struct DBIterator* iter; int (*compare)(const char* str1, const char* str2) = ( db->case_sensitive ) ? strcmp : stricmp; if( line[0] == '/' && line[1] == '/' ) continue; n = 0; if( sscanf(line, "%d%n", &v, &n) == 1 && (line[n] == '\n' || line[n] == '\r') ) {// format version definition version = v; continue; } n = 0; if( sscanf(line, "%d\t%%newid%%%n", &account_id, &n) == 1 && (line[n] == '\n' || line[n] == '\r') ) {// auto-increment if( account_id > db->next_account_id ) db->next_account_id = account_id; continue; } if( !mmo_auth_fromstr(&acc, line, version) ) { ShowError("account_db_txt_init: skipping invalid data: %s", line); continue; } // apply constraints & checks here if( acc.sex != 'S' && (acc.account_id < START_ACCOUNT_NUM || acc.account_id > END_ACCOUNT_NUM) ) ShowWarning("account_db_txt_init: account %d:'%s' has ID outside of the defined range for accounts (min:%d max:%d)!\n", acc.account_id, acc.userid, START_ACCOUNT_NUM, END_ACCOUNT_NUM); iter = accounts->iterator(accounts); for( tmp = (struct mmo_account*)iter->first(iter,NULL); iter->exists(iter); tmp = (struct mmo_account*)iter->next(iter,NULL) ) if( compare(acc.userid, tmp->userid) == 0 ) break; iter->destroy(iter); if( tmp != NULL ) {// entry with identical username ShowWarning("account_db_txt_init: account %d:'%s' has same username as account %d. The account will be inaccessible!\n", acc.account_id, acc.userid, tmp->account_id); } if( idb_get(accounts, acc.account_id) != NULL ) {// account id already occupied ShowError("account_db_txt_init: ID collision for account id %d! Discarding data for account '%s'...\n", acc.account_id, acc.userid); continue; } // record entry in db tmp = (struct mmo_account*)aMalloc(sizeof(struct mmo_account)); memcpy(tmp, &acc, sizeof(struct mmo_account)); idb_put(accounts, acc.account_id, tmp); if( acc.account_id >= db->next_account_id ) db->next_account_id = acc.account_id + 1; } // close data file fclose(fp); // initialize data saving timer add_timer_func_list(mmo_auth_sync_timer, "mmo_auth_sync_timer"); db->save_timer = add_timer_interval(gettick() + AUTH_SAVING_INTERVAL, mmo_auth_sync_timer, 0, (intptr)db, AUTH_SAVING_INTERVAL); return true; }
// 初期化 void do_init_party(void) { party_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int)); add_timer_func_list(party_send_xy_timer,"party_send_xy_timer"); add_timer_interval(gettick()+PARTY_SEND_XY_INVERVAL,party_send_xy_timer,0,0,PARTY_SEND_XY_INVERVAL); }
// 初期化 void do_init_party(void) { party_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int)); add_timer_func_list(party_send_xy_timer, "party_send_xy_timer"); add_timer_interval(gettick()+battle_config.party_update_interval, party_send_xy_timer, 0, 0, battle_config.party_update_interval); }
int do_init_mail(void) { add_timer_func_list(mail_check_timer,"mail_check_timer"); mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0); return 0; }