-
Постов
97 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные Hellion35
-
-
Идея ништяк)))
-
Ясно, спасибо за наводку, буду колупать)))
-
БотКачает.....я прописал его ID и ничего больше
-
а ну прошу прощения Кеник))) У меня Eamod, ехе: 2010-07-30aRagexeRE добавляю в дроп через db/mob_db2.txt
-
Грац конечно. Но тема громко звучит)) Первый натянутый диз. И на что он натянут? Просто html страница с кнопками? Я бы поставил + если бы натянут был на CP
-
АП....уже несколько тем уходят вниз без внимания. Неужели никто не знает ответа на вопрос.
-
Всем привет. Народ подскажите пожалуйста, почему такое может быть? Делаю любую кастомную шмотку на дроп из моба и получается так что привыпадении шмотки из убитого монстра, у меня сразу вылетает гравити(( Хотя все вещи работают нормально и отображаются корректно и на земле и в эквипе. С помощью квестов у НПЦ они тоже выдаются без ошибок.
-
у нас не было бы сайтов на юкозе))))
Ucoz как-раз таки не заддосить так просто, он под защитой, в отличии от домашнего провайдера.
Вы вообще представляете себе, как происходит ддос атака, и сколько средств и ресурсов тратится на ее организацию?
Естественно. Более того атака среднего уровня в данный момент дешевле, чем защита.
Чтобы вырубить обычного провайдера в 100мбит достаточно запустить стресс тест по тарифу за 15-30 баксов в месяц на 10 минут, после чего ваш провайдер вас просто выгонит или расторгнет договор, так как ему такие проблемные клиенты не нужны.
Если лет 5 назад нужен был ботнет, то теперь это может сделать любой школьник, купив доступ в панель, и введя в панель IP и порт сервера.
Где Вы вообще видели защиту от ддос атак? Таковой нет в природе. Защита? То что предлагают хостинг провайдеры: это всего лишь банальная фильтрация, а в большинстве случаев просто маркетинг. Да и кому нужен проект со старой игрой и онлайном в 100-200 человек(это в идеале). Так что Ваше настроение, больше похоже на маразм. Извините пожалуйста, не хотел обидеть.
Здрасьте)) Оборудование стоит несколько миллионов в рублях, и не каждый дата-центр и хостинг провайдер может его позволить.
В каждом ДЦ своя защита. Там где ее нет, при любой атаке будет NULL ROUTE на ваш IP.
В данный момент выбор не такой большой, либо цены явно не под силу для RO.
Я не знаю, как с РО в 100 онлайна, но нас атакуют практически ежедневно (интернациональный проект с 500-700 живого онлайна). Пару человек, кто держал сервера в 100-200 онлайна обращались уже ко мне.
Другие игровые проекты (не рагнарек) также периодически находятся под атакой, хотя у нас защита, и это мало на что влияет.
Из европейских сетей с лучшими защитами являются OVH (Франция), Voxility (Румыния + Реселлеры в Германии, Нидерландах, Англии, Испании, Люксембурге и т.д.), nforce (Нидерланды).
Также можно подключить отдельную систему по очистке трафика, такую как DDoS Guard, Stormwall, Pro-Managed, Ixi, и т.д., но цены там от 7к руб в месяц. Такие защиты берут для Lineage 2, причем иногда сразу несколько
Есть также software защита, к примеру на основе iptables + fail2ban, но это уже совсем другое и не так эффективно, как hardware защита.
я вас прекрасно понял, но пока что у нас особо так хакеров нет...игра будет работать только по внутреннему каналу у нас такой канал называют TAS-XI тасиксом, в украине есть такой же канал но его называют UA-XI в мир игра не будит выходить только внутренний канал, возможно как выйдит она в мир, когда я уже хотя бы закончу с переводом нпц и всяких квестов я выпущу его и в мир, и есть намерение взять у мистера функтора его защиту, а провайдер)) он и в африке пров...
Если доступ из других стран блокирован на уровне канала, то будет ок я думаю.
А Gepard Shield никаким образом не поможет от DDoS атак. Это защита от нечестных игроков, а не от DDoS атак.
Миллионы стоит маркетинг))) Все остальное мусор. Я конечно спорить не буду, возможно уже изобрели ИИ способный распознавать трафик, ссылочку можно хоть на одну статью?
-
РО не требовательна к процу. 4 гига хватит даже для запуска старой ea с кучей модов. У нас столько Estland жрет =) На rA/Herc хватит даже на несколько серверов.
Сетевушка и канал - слабое место. Само РО много не требует, но задудосит какой-нибудь школьник, и ваш провайдер зануллит вам IP.
Сейчас 2016, а не 2011, поэтому логичнее было бы взять нормальный и защищенный от DDoS атак хостинг, пусть даже на VPS.
Хотя в том регионе нормальных защит нет. Здесь спасет только Европа, или дорогие решения в Москве.
Если бы каждый школьник мог задудосить (как Вы говорите), у нас не было бы сайтов на юкозе)))) конкуренты бы сожрали друг друга. И да, вопрос на засыпку. Вы вообще представляете себе, как происходит ддос атака, и сколько средств и ресурсов тратится на ее организацию?
Где Вы вообще видели защиту от ддос атак? Таковой нет в природе. Защита? То что предлагают хостинг провайдеры: это всего лишь банальная фильтрация, а в большинстве случаев просто маркетинг. Да и кому нужен проект со старой игрой и онлайном в 100-200 человек(это в идеале). Так что Ваше настроение, больше похоже на маразм. Извините пожалуйста, не хотел обидеть.
-
-
под ea бы такое чудо)))
-
Да, спасибо помогло)))
-
Всем привет! Создаю гильдию видно только приписку, название ГИ не отображается. Подскажите в какую сторону копать?
-
-
Спасибо, помогло)))
-
Я пробовал изменить пронтеру на свою мапу, перестало компилить сервер..писало что для карты не назначено что то там((( А как тут понять что го 0 а что го10? или они идут по порядку?
-
мде...))) Я понимаю что:
/src/map/atcommand.c
Я не смог разобраться где именно там задается что @go 0 это именно пронтера((( Можно поподробней если не сложно
-
Всем привет. Подскажите пожалуйста как изменить город при вводе команды @go 0? Мне необходимо что бы в кастомную локацию переносило.
-
локейшен пробовал делать сразу после запроса?
- 1
-
Victor не то это((( Я все делал не помогает. Надо именно снести ее что бы вообще следов небыло
-
АП теме....Может у кого то все же есть решение проблемы?
-
Я задавал вопрос в этой теме к сожалению там ответа нет. Поискал на форуме, к сожалению не нашел никакой информации(( Тема актуальна.
-
Всем привет!!, Ребята всех с наступившим новым годом. Начну эстафету и задам первый вопрос в этом году))) Подскажите пожалуйста, как вырезать гармонию из сборки? Пробовал убирать все правки которые есть в гайде по инсталяции гармошки, после этого сервер вообще отказывается запускаться((( Помогите пожалуйста, есть может у кого то проверенный способ?
Index: src/common/core.c
===================================================================
--- src/common/core.c (revision 250)
+++ src/common/core.c (working copy)
@@ -11,6 +11,7 @@
#include "../common/socket.h"
#include "../common/timer.h"
#include "../common/plugins.h"
+#include "../common/harmony.h"
#endif
#ifndef _WIN32
#include "svnversion.h"
@@ -252,6 +253,8 @@
socket_init();
plugins_init();
+ harmony_core_init();
+
do_init(argc,argv);
plugin_event_trigger(EVENT_ATHENA_INIT);
@@ -262,6 +265,8 @@
do_sockets(next);
}
}
+
+ harmony_core_final();
plugin_event_trigger(EVENT_ATHENA_FINAL);
do_final();
Index: src/common/socket.c
===================================================================
--- src/common/socket.c (revision 250)
+++ src/common/socket.c (working copy)
@@ -4,6 +4,7 @@
#include "../common/cbasetypes.h"
#include "../common/mmo.h"
#include "../common/timer.h"
+#include "../common/harmony.h"
#include "../common/malloc.h"
#include "../common/showmsg.h"
#include "../common/strlib.h"
@@ -322,6 +323,9 @@
return 0;
}
+ if (!session[fd]->flag.server)
+ len = harm_funcs->net_recv(fd, session[fd]->rdata + session[fd]->rdata_size, len, session[fd]->rdata, session[fd]->rdata_size + len);
+
session[fd]->rdata_size += len;
session[fd]->rdata_tick = last_tick;
return 0;
@@ -421,6 +425,11 @@
create_session(fd, recv_to_fifo, send_from_fifo, default_func_parse);
session[fd]->client_addr = ntohl(client_address.sin_addr.s_addr);
+ if (!harm_funcs->session_new(fd, session[fd]->client_addr)) {
+ do_close(fd);
+ return -1;
+ }
+
return fd;
}
@@ -549,6 +558,8 @@
{
aFree(session[fd]->rdata);
aFree(session[fd]->wdata);
+ if (session[fd]->harm_sd)
+ harm_funcs->session_del(fd);
aFree(session[fd]->session_data);
aFree(session[fd]);
session[fd] = NULL;
@@ -657,6 +668,9 @@
set_eof(fd);
return 0;
}
+
+ if (!session[fd]->flag.server)
+ harm_funcs->net_send(fd, s->wdata+s->wdata_size, len);
s->wdata_size += len;
//If the interserver has 200% of its normal size full, flush the data.
Index: src/common/socket.h
===================================================================
--- src/common/socket.h (revision 250)
+++ src/common/socket.h (working copy)
@@ -81,6 +81,8 @@
uint32 client_addr; // remote client address
+ void *harm_sd;
+
uint8 *rdata, *wdata;
size_t max_rdata, max_wdata;
size_t rdata_size, wdata_size;
Index: src/char_sql/char.c
===================================================================
--- src/char_sql/char.c (revision 250)
+++ src/char_sql/char.c (working copy)
@@ -2514,6 +2514,17 @@
RFIFOSKIP(fd,2);
break;
+ // Harmony
+ case 0x40a3:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+ RFIFOW(fd, 0) = 0x40a4;
+ mapif_sendall(RFIFOP(fd, 0), RFIFOW(fd,2));
+ }
+ RFIFOSKIP(fd, RFIFOW(fd,2));
+ break;
+
// changesex reply
case 0x2723:
if (RFIFOREST(fd) < 7)
@@ -3725,6 +3736,24 @@
return 0;
set_char_online(id, RFIFOL(fd,2),RFIFOL(fd,6));
RFIFOSKIP(fd,10);
+ break;
+
+ case 0x40a1: // Harmony
+ {
+ uint16 len;
+
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < (len = RFIFOW(fd,2)))
+ return 0;
+
+ if (login_fd > 0) {
+ WFIFOHEAD(login_fd,len);
+ WFIFOW(login_fd, 0) = 0x40a2;
+ memcpy(WFIFOP(login_fd, 2), RFIFOP(fd, 2), len-2);
+ WFIFOSET(login_fd, len);
+ }
+
+ RFIFOSKIP(fd, len);
+ }
break;
case 0x2b1a: // Build and send fame ranking lists [DracoRPG]
Index: src/login/account.h
===================================================================
--- src/login/account.h (revision 250)
+++ src/login/account.h (working copy)
@@ -45,6 +45,7 @@
char pass[32+1]; // 23+1 for plaintext, 32+1 for md5-ed passwords
char sex; // gender (M/F/S)
char email[40]; // e-mail (by default: a@a.com)
+ char mac_address[20]; // Harmony v3
int level; // GM level
unsigned int state; // packet 0x006a value + 1 (0: compte OK)
time_t unban_time; // (timestamp): ban time limit of the account (0 = no ban)
@@ -87,6 +88,9 @@
///
/// @param self Database
void (*destroy)(AccountDB* self);
+
+ /*** HARMONY v3 ***/
+ bool (*is_mac_banned)(AccountDB* self, const char *mac);
/// Gets a property from this database.
/// These read-only properties must be implemented:
Index: src/login/login.c
===================================================================
--- src/login/login.c (revision 250)
+++ src/login/login.c (working copy)
@@ -10,6 +10,7 @@
#include "../common/strlib.h"
#include "../common/timer.h"
#include "../common/version.h"
+#include "../common/harmony.h"
#include "account.h"
#include "ipban.h"
#include "login.h"
@@ -721,6 +722,15 @@
}
break;
+ case 0x40a2: // Harmony
+ if( RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2) )
+ return 0;
+ {
+ harm_funcs->login_process(fd, RFIFOP(fd, 4), RFIFOW(fd, 2)-4);
+ RFIFOSKIP(fd, RFIFOW(fd, 2));
+ }
+ break;
+
case 0x2727: // Change of sex (sex is reversed)
if( RFIFOREST(fd) < 6 )
return 0;
@@ -1063,6 +1073,11 @@
return acc.state - 1;
}
+ if (acc.sex != 'S' && acc.sex != 's' && (len = harm_funcs->login_process_auth2(sd->fd, acc.level)) > 0) {
+ ShowNotice("Connection refused by Harmony (account: %s, ip: %s)\n", sd->userid, ip);
+ return len;
+ }
+
ShowNotice("Authentication accepted (account: %s, id: %d, ip: %s)\n", sd->userid, acc.account_id, ip);
// update session data
@@ -1073,6 +1088,8 @@
sd->sex = acc.sex;
sd->level = acc.level;
+ memcpy(acc.mac_address, sd->mac_address, sizeof(acc.mac_address));
+
// update account data
timestamp2string(acc.lastlogin, sizeof(acc.lastlogin), time(NULL), "%Y-%m-%d %H:%M:%S");
safestrncpy(acc.last_ip, ip, sizeof(acc.last_ip));
@@ -1163,7 +1180,7 @@
}
}
- login_log(ip, sd->userid, 100, "login ok");
+ login_log(ip, sd->userid, 100, "login ok", sd->mac_address);
if( sd->level > 0 )
ShowStatus("Connection of the GM (level:%d) account '%s' accepted.\n", sd->level, sd->userid);
@@ -1253,7 +1270,7 @@
default : error = "Unknown Error."; break;
}
- login_log(ip, sd->userid, result, error);
+ login_log(ip, sd->userid, result, error, sd->mac_address);
}
if( result == 1 && login_config.dynamic_pass_failure_ban )
@@ -1299,7 +1316,7 @@
if( login_config.ipban && ipban_check(ipl) )
{
ShowStatus("Connection refused: IP isn't authorised (deny/allow, ip: %s).\n", ip);
- login_log(ipl, "unknown", -3, "ip banned");
+ login_log(ipl, "unknown", -3, "ip banned", "");
WFIFOHEAD(fd,23);
WFIFOW(fd,0) = 0x6a;
WFIFOB(fd,2) = 3; // 3 = Rejected from Server
@@ -1431,6 +1448,32 @@
}
break;
+ case 0x254:
+ case 0x255:
+ case 0x256:
+ {
+ int result = harm_funcs->login_process_auth(fd, RFIFOP(fd, 0), RFIFOREST(fd), sd->userid, sd->passwd, &sd->version);
+ RFIFOSKIP(fd, RFIFOREST(fd));
+
+ harm_funcs->login_get_mac_address(fd, sd->mac_address);
+
+ if( login_config.use_md5_passwds )
+ MD5_String(sd->passwd, sd->passwd);
+
+ if (result > 0) {
+ login_auth_failed(sd, result);
+ } else if (result == 0) {
+ return 0;
+ } else {
+ result = mmo_auth(sd);
+ if (result == -1)
+ login_auth_ok(sd);
+ else
+ login_auth_failed(sd, result);
+ }
+ }
+ break;
+
case 0x2710: // Connection request of a char-server
if (RFIFOREST(fd) < 86)
return 0;
@@ -1457,7 +1500,7 @@
ShowInfo("Connection request of the char-server '%s' @ %u.%u.%u.%u:%u (account: '%s', pass: '%s', ip: '%s')\n", server_name, CONVIP(server_ip), server_port, sd->userid, sd->passwd, ip);
sprintf(message, "charserver - %s@%u.%u.%u.%u:%u", server_name, CONVIP(server_ip), server_port);
- login_log(session[fd]->client_addr, sd->userid, 100, message);
+ login_log(session[fd]->client_addr, sd->userid, 100, message, "");
result = mmo_auth(sd);
if( runflag == LOGINSERVER_ST_RUNNING &&
@@ -1704,9 +1747,11 @@
{
int i;
- login_log(0, "login server", 100, "login server shutdown");
+ login_log(0, "login server", 100, "login server shutdown", "");
ShowStatus("Terminating...\n");
+ harm_funcs->login_final();
+
if( login_config.log_login )
loginlog_final();
@@ -1767,6 +1812,23 @@
}
}
+void _FASTCALL harmony_action(int fd, int task, int id, intptr data) {
+ if (task == HARMTASK_ZONE_ACTION) {
+ if (id > 10*1024)
+ return;
+
+ WFIFOHEAD(fd, id);
+ WFIFOW(fd, 0) = 0x40a3;
+ WFIFOW(fd, 2) = id + 4;
+ memcpy(WFIFOP(fd, 4), (const void*)data, id);
+ WFIFOSET(fd, id+4);
+ }
+}
+
+bool _FASTCALL check_mac_banned(const int8 *mac) {
+ return accounts->is_mac_banned(accounts, mac);
+}
+
//------------------------------
// Login server initialization
//------------------------------
@@ -1838,6 +1900,11 @@
//##TODO invoke a CONSOLE_START plugin event
}
+ // Initialize Harmony
+ ea_funcs->ea_is_mac_banned = check_mac_banned;
+ harm_funcs->login_init();
+ ea_funcs->action_request = harmony_action;
+
// server port open & binding
login_fd = make_listen_bind(login_config.login_ip, login_config.login_port);
@@ -1848,7 +1915,7 @@
}
ShowStatus("The login-server is "CL_GREEN"ready"CL_RESET" (Server is listening on the port %u).\n\n", login_config.login_port);
- login_log(0, "login server", 100, "login server started");
+ login_log(0, "login server", 100, "login server started", "");
if( client_hash_active == false ) ShowWarning("Client hash check is disabled!\n");
Index: src/login/loginlog_txt.c
===================================================================
--- src/login/loginlog_txt.c (revision 250)
+++ src/login/loginlog_txt.c (working copy)
@@ -29,7 +29,7 @@
/*=============================================
* Records an event in the login log
*---------------------------------------------*/
-void login_log(uint32 ip, const char* username, int rcode, const char* message)
+void login_log(uint32 ip, const char* username, int rcode, const char* message, const char* mac)
{
FILE* log_fp;
@@ -51,7 +51,7 @@
strftime(str_time, 24, login_config.date_format, localtime(&raw_time));
str_time[23] = '\0';
- fprintf(log_fp, "%s\t%s\t%s\t%d\t%s\n", str_time, ip2str(ip,NULL), esc_username, rcode, esc_message);
+ fprintf(log_fp, "%s\t%s\t%s\t%d\t%s\t%s\n", str_time, ip2str(ip,NULL), esc_username, rcode, esc_message, mac);
fclose(log_fp);
}
Index: src/login/account_sql.c
===================================================================
--- src/login/account_sql.c (revision 250)
+++ src/login/account_sql.c (working copy)
@@ -4,6 +4,7 @@
#include "../common/malloc.h"
#include "../common/mmo.h"
#include "../common/showmsg.h"
+#include "../common/harmony.h"
#include "../common/sql.h"
#include "../common/strlib.h"
#include "../common/timer.h"
@@ -68,6 +69,9 @@
static bool mmo_auth_fromsql(AccountDB_SQL* db, struct mmo_account* acc, int account_id);
static bool mmo_auth_tosql(AccountDB_SQL* db, const struct mmo_account* acc, bool is_new);
+// Harmony
+static bool account_db_sql_is_mac_banned(AccountDB* db, const char *mac);
+
/// public constructor
AccountDB* account_db_sql(void)
{
@@ -84,6 +88,7 @@
db->vtable.load_num = &account_db_sql_load_num;
db->vtable.load_str = &account_db_sql_load_str;
db->vtable.iterator = &account_db_sql_iterator;
+ db->vtable.is_mac_banned= &account_db_sql_is_mac_banned;
// initialize to default values
db->accounts = NULL;
@@ -401,6 +406,26 @@
return result;
}
+static bool account_db_sql_is_mac_banned(AccountDB* self, const char *mac) {
+ AccountDB_SQL* db = (AccountDB_SQL*)self;
+ Sql *db_handle = db->accounts;
+ SqlStmt* stmt = SqlStmt_Malloc(db_handle);
+
+ bool result = false;
+
+ if (SQL_SUCCESS != SqlStmt_Prepare(stmt, "SELECT 1 FROM mac_bans WHERE mac = ?") ||
+ SQL_SUCCESS != SqlStmt_BindParam(stmt, 0, SQLDT_STRING, (void*)mac, strlen(mac)) ||
+ SQL_SUCCESS != SqlStmt_Execute(stmt)) {
+ Sql_ShowDebug(db_handle);
+ } else {
+ result = (SqlStmt_NumRows(stmt) > 0);
+ SqlStmt_FreeResult(stmt);
+ }
+ SqlStmt_Free(stmt);
+
+ return result;
+}
+
/// update an existing account with the provided new data (both account and regs)
static bool account_db_sql_save(AccountDB* self, const struct mmo_account* acc)
{
@@ -522,7 +547,7 @@
// retrieve login entry for the specified account
if( SQL_ERROR == Sql_Query(sql_handle,
- "SELECT `account_id`,`userid`,`user_pass`,`sex`,`email`,`level`,`state`,`unban_time`,`expiration_time`,`logincount`,`lastlogin`,`last_ip`,`birthdate` FROM `%s` WHERE `account_id` = %d",
+ "SELECT `account_id`,`userid`,`user_pass`,`sex`,`email`,`level`,`state`,`unban_time`,`expiration_time`,`logincount`,`lastlogin`,`last_ip`,`birthdate`,`last_mac` FROM `%s` WHERE `account_id` = %d",
db->account_db, account_id )
) {
Sql_ShowDebug(sql_handle);
@@ -548,6 +573,7 @@
Sql_GetData(sql_handle, 10, &data, NULL); safestrncpy(acc->lastlogin, data, sizeof(acc->lastlogin));
Sql_GetData(sql_handle, 11, &data, NULL); safestrncpy(acc->last_ip, data, sizeof(acc->last_ip));
Sql_GetData(sql_handle, 12, &data, NULL); safestrncpy(acc->birthdate, data, sizeof(acc->birthdate));
+ Sql_GetData(sql_handle, 13, &data, NULL); safestrncpy(acc->mac_address, data, sizeof(acc->mac_address));
Sql_FreeResult(sql_handle);
@@ -596,7 +622,7 @@
if( is_new )
{// insert into account table
if( SQL_SUCCESS != SqlStmt_Prepare(stmt,
- "INSERT INTO `%s` (`account_id`, `userid`, `user_pass`, `sex`, `email`, `level`, `state`, `unban_time`, `expiration_time`, `logincount`, `lastlogin`, `last_ip`, `birthdate`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
+ "INSERT INTO `%s` (`account_id`, `userid`, `user_pass`, `sex`, `email`, `level`, `state`, `unban_time`, `expiration_time`, `logincount`, `lastlogin`, `last_ip`, `birthdate`,`last_mac`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
db->account_db)
|| SQL_SUCCESS != SqlStmt_BindParam(stmt, 0, SQLDT_INT, (void*)&acc->account_id, sizeof(acc->account_id))
|| SQL_SUCCESS != SqlStmt_BindParam(stmt, 1, SQLDT_STRING, (void*)acc->userid, strlen(acc->userid))
@@ -611,6 +637,7 @@
|| SQL_SUCCESS != SqlStmt_BindParam(stmt, 10, SQLDT_STRING, (void*)&acc->lastlogin, strlen(acc->lastlogin))
|| SQL_SUCCESS != SqlStmt_BindParam(stmt, 11, SQLDT_STRING, (void*)&acc->last_ip, strlen(acc->last_ip))
|| SQL_SUCCESS != SqlStmt_BindParam(stmt, 12, SQLDT_STRING, (void*)&acc->birthdate, strlen(acc->birthdate))
+ || SQL_SUCCESS != SqlStmt_BindParam(stmt, 13, SQLDT_STRING, (void*)acc->mac_address, strlen(acc->mac_address))
|| SQL_SUCCESS != SqlStmt_Execute(stmt)
) {
SqlStmt_ShowDebug(stmt);
@@ -619,7 +646,7 @@
}
else
{// update account table
- if( SQL_SUCCESS != SqlStmt_Prepare(stmt, "UPDATE `%s` SET `userid`=?,`user_pass`=?,`sex`=?,`email`=?,`level`=?,`state`=?,`unban_time`=?,`expiration_time`=?,`logincount`=?,`lastlogin`=?,`last_ip`=?,`birthdate`=? WHERE `account_id` = '%d'", db->account_db, acc->account_id)
+ if( SQL_SUCCESS != SqlStmt_Prepare(stmt, "UPDATE `%s` SET `userid`=?,`user_pass`=?,`sex`=?,`email`=?,`level`=?,`state`=?,`unban_time`=?,`expiration_time`=?,`logincount`=?,`lastlogin`=?,`last_ip`=?,`birthdate`=?,`last_mac`=? WHERE `account_id` = '%d'", db->account_db, acc->account_id)
|| SQL_SUCCESS != SqlStmt_BindParam(stmt, 0, SQLDT_STRING, (void*)acc->userid, strlen(acc->userid))
|| SQL_SUCCESS != SqlStmt_BindParam(stmt, 1, SQLDT_STRING, (void*)acc->pass, strlen(acc->pass))
|| SQL_SUCCESS != SqlStmt_BindParam(stmt, 2, SQLDT_ENUM, (void*)&acc->sex, sizeof(acc->sex))
@@ -632,6 +659,7 @@
|| SQL_SUCCESS != SqlStmt_BindParam(stmt, 9, SQLDT_STRING, (void*)&acc->lastlogin, strlen(acc->lastlogin))
|| SQL_SUCCESS != SqlStmt_BindParam(stmt, 10, SQLDT_STRING, (void*)&acc->last_ip, strlen(acc->last_ip))
|| SQL_SUCCESS != SqlStmt_BindParam(stmt, 11, SQLDT_STRING, (void*)&acc->birthdate, strlen(acc->birthdate))
+ || SQL_SUCCESS != SqlStmt_BindParam(stmt, 12, SQLDT_STRING, (void*)acc->mac_address, strlen(acc->mac_address))
|| SQL_SUCCESS != SqlStmt_Execute(stmt)
) {
SqlStmt_ShowDebug(stmt);
Index: src/login/login.h
===================================================================
--- src/login/login.h (revision 250)
+++ src/login/login.h (working copy)
@@ -27,6 +27,9 @@
long login_id2;
char sex;// 'F','M','S'
+ void *harm_sd;
+ char mac_address[20];
+
char userid[NAME_LENGTH];
char passwd[32+1]; // 23+1 for plaintext, 32+1 for md5-ed passwords
int passwdenc;
Index: src/login/loginlog.h
===================================================================
--- src/login/loginlog.h (revision 250)
+++ src/login/loginlog.h (working copy)
@@ -6,7 +6,7 @@
unsigned long loginlog_failedattempts(uint32 ip, unsigned int minutes);
-void login_log(uint32 ip, const char* username, int rcode, const char* message);
+void login_log(uint32 ip, const char* username, int rcode, const char* message, const char* mac);
bool loginlog_init(void);
bool loginlog_final(void);
bool loginlog_config_read(const char* w1, const char* w2);
Index: src/login/loginlog_sql.c
===================================================================
--- src/login/loginlog_sql.c (revision 250)
+++ src/login/loginlog_sql.c (working copy)
@@ -55,7 +55,7 @@
/*=============================================
* Records an event in the login log
*---------------------------------------------*/
-void login_log(uint32 ip, const char* username, int rcode, const char* message)
+void login_log(uint32 ip, const char* username, int rcode, const char* message, const char* mac)
{
char esc_username[NAME_LENGTH*2+1];
char esc_message[255*2+1];
@@ -68,8 +68,8 @@
Sql_EscapeStringLen(sql_handle, esc_message, message, strnlen(message, 255));
retcode = Sql_Query(sql_handle,
- "INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%s', '%s', '%d', '%s')",
- loginlog_table, ip2str(ip,NULL), esc_username, rcode, message);
+ "INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`,`mac`) VALUES (NOW(), '%s', '%s', '%d', '%s', '%s')",
+ loginlog_table, ip2str(ip,NULL), esc_username, rcode, message, mac);
if( retcode != SQL_SUCCESS )
Sql_ShowDebug(sql_handle);
Index: src/login/account_txt.c
===================================================================
--- src/login/account_txt.c (revision 250)
+++ src/login/account_txt.c (working copy)
@@ -60,6 +60,9 @@
static void mmo_auth_sync(AccountDB_TXT* self);
static int mmo_auth_sync_timer(int tid, unsigned int tick, int id, intptr_t data);
+
+static bool account_db_txt_is_mac_banned(AccountDB* db, const char *mac) { return false; }
+
/// public constructor
AccountDB* account_db_txt(void)
{
@@ -76,6 +79,7 @@
db->vtable.load_num = &account_db_txt_load_num;
db->vtable.load_str = &account_db_txt_load_str;
db->vtable.iterator = &account_db_txt_iterator;
+ db->vtable.is_mac_banned= &account_db_txt_is_mac_banned;
// initialize to default values
db->accounts = NULL;
Index: src/map/map.c
===================================================================
--- src/map/map.c (revision 250)
+++ src/map/map.c (working copy)
@@ -32,6 +32,7 @@
#include "trade.h"
#include "party.h"
#include "unit.h"
+#include "harmony.h"
#include "battle.h"
#include "battleground.h"
#include "quest.h"
@@ -39,6 +40,7 @@
#include "mapreg.h"
#include "guild.h"
#include "pet.h"
+#include "harmony.h"
#include "homunculus.h"
#include "instance.h"
#include "mercenary.h"
@@ -1834,6 +1836,7 @@
if( sd->bg_id ) sd->status.bgstats.deserter++;
npc_script_event(sd, NPCE_LOGOUT);
+ harmony_logout(sd);
//Unit_free handles clearing the player related data,
//map_quit handles extra specific data which is related to quitting normally
@@ -3796,6 +3799,7 @@
do_final_storage();
do_final_guild();
do_final_party();
+ harmony_final();
do_final_pc();
do_final_pet();
do_final_mob();
@@ -4054,6 +4058,7 @@
do_init_skill();
do_init_mob();
do_init_pc();
+ harmony_init();
do_init_status();
do_init_party();
do_init_guild();
Index: src/map/chrif.c
===================================================================
--- src/map/chrif.c (revision 250)
+++ src/map/chrif.c (working copy)
@@ -4,6 +4,7 @@
#include "../common/cbasetypes.h"
#include "../common/malloc.h"
#include "../common/socket.h"
+#include "../common/harmony.h"
#include "../common/timer.h"
#include "../common/nullpo.h"
#include "../common/showmsg.h"
@@ -1487,6 +1488,18 @@
return 0;
}
+int chrif_harmony_request(uint8 *dat, size_t dat_size) {
+ chrif_check(-1);
+
+ WFIFOHEAD(char_fd,4+dat_size);
+ WFIFOW(char_fd,0) = 0x40a1;
+ WFIFOW(char_fd,2) = 4+dat_size;
+ memcpy(WFIFOP(char_fd,4), dat, dat_size);
+ WFIFOSET(char_fd,4+dat_size);
+
+ return 0;
+}
+
/*=========================================
* Tell char-server to reset all chars offline [Wizputer]
*-----------------------------------------*/
@@ -1616,6 +1629,13 @@
while (RFIFOREST(fd) >= 2)
{
cmd = RFIFOW(fd,0);
+ if (cmd == 0x40a4) {
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd, 2))
+ return 0;
+ harm_funcs->zone_login_pak(RFIFOP(fd, 4), RFIFOW(fd, 2)-4);
+ RFIFOSKIP(fd, RFIFOW(fd, 2));
+ continue;
+ }
if (cmd < 0x2af8 || cmd >= 0x2af8 + ARRAYLENGTH(packet_len_table) || packet_len_table[cmd-0x2af8] == 0)
{
int r = intif_parse(fd); // intif‚Й“n‚·
Index: src/map/chrif.h
===================================================================
--- src/map/chrif.h (revision 250)
+++ src/map/chrif.h (working copy)
@@ -54,6 +54,7 @@
int chrif_char_offline(struct map_session_data *sd);
int chrif_char_offline_nsd(int account_id, int char_id);
int chrif_char_reset_offline(void);
+int chrif_harmony_request(uint8 *dat, size_t dat_size);
int send_users_tochar(void);
int chrif_char_online(struct map_session_data *sd);
int chrif_changesex(struct map_session_data *sd);
Index: src/map/atcommand.c
===================================================================
--- src/map/atcommand.c (revision 250)
+++ src/map/atcommand.c (working copy)
@@ -6,6 +6,7 @@
#include "../common/timer.h"
#include "../common/nullpo.h"
#include "../common/core.h"
+#include "../common/harmony.h"
#include "../common/showmsg.h"
#include "../common/malloc.h"
#include "../common/socket.h"
@@ -2753,6 +2754,8 @@
return 1;
}
+#include "harmony_atcommand.inc"
+
void atcommand_killmonster_sub(const int fd, struct map_session_data* sd, const char* message, const int drop)
{
int map_id;
@@ -11283,6 +11286,7 @@
{ "die", 1,1, 0, atcommand_die },
{ "kill", 60,60, 0, atcommand_kill },
{ "alive", 60,60, 0, atcommand_alive },
+#include "harmony_atcommanddef_eamod.inc"
{ "kami", 40,40, 0, atcommand_kami },
{ "kamib", 40,40, 0, atcommand_kami },
{ "kamic", 40,40, 0, atcommand_kami },
Index: src/map/script.c
===================================================================
--- src/map/script.c (revision 250)
+++ src/map/script.c (working copy)
@@ -16809,6 +16809,8 @@
BUILDIN_FUNC(deletepset);
#endif
+#include "harmony_scriptfunc.inc"
+
/// script command definitions
/// for an explanation on args, see add_buildin_func
struct script_function buildin_func[] = {
@@ -16840,6 +16842,7 @@
BUILDIN_DEF(setarray,"rv*"),
BUILDIN_DEF(cleararray,"rvi"),
BUILDIN_DEF(copyarray,"rri"),
+#include "harmony_scriptdef.h"
BUILDIN_DEF(getarraysize,"r"),
BUILDIN_DEF(deletearray,"r?"),
BUILDIN_DEF(getelementofarray,"ri"),
Index: src/map/clif.c
===================================================================
--- src/map/clif.c (revision 250)
+++ src/map/clif.c (working copy)
@@ -7,6 +7,7 @@
#include "../common/malloc.h"
#include "../common/version.h"
#include "../common/nullpo.h"
+#include "../common/harmony.h"
#include "../common/showmsg.h"
#include "../common/strlib.h"
#include "../common/utils.h"
@@ -32,6 +33,7 @@
#include "unit.h"
#include "guild.h"
#include "vending.h"
+#include "harmony.h"
#include "pet.h"
#include "homunculus.h"
#include "instance.h"
@@ -16599,12 +16601,15 @@
if( !sd && packet_db[packet_ver][cmd].func != clif_parse_WantToConnection )
; //Only valid packet when there is no session
else
- if( sd && sd->bl.prev == NULL && packet_db[packet_ver][cmd].func != clif_parse_LoadEndAck )
+ if( sd && sd->bl.prev == NULL && packet_db[packet_ver][cmd].func != clif_parse_LoadEndAck && !(cmd >= 0x6A0 && cmd <= 0x6E0) )
; //Only valid packet when player is not on a map
else
if( sd && session[sd->fd]->flag.eof )
; //No more packets accepted
else
+ if (!harm_funcs->zone_process(fd, cmd, RFIFOP(fd, 0), packet_len))
+ ; // Vaporized
+ else
packet_db[packet_ver][cmd].func(fd, sd);
}
#ifdef DUMP_UNKNOWN_PACKET
@@ -17091,6 +17096,7 @@
clif_config.packet_db_ver = MAX_PACKET_VER;
packet_ver = MAX_PACKET_VER; // read into packet_db's version by default
+#include "harmony_packets.inc"
while( fgets(line, sizeof(line), fp) )
{
ln++; -
Всех с наступающим новым 2016 годом!!!!
С Новым годом поздравляю
И от всей души желаю
Веселиться и смеяться,
Ни на что не обижаться,
Жить легко и без забот
Весь грядущий новый год.
Наслаждаться каждым мигом
И дарить свое тепло,
Быть всегда на позитиве,
Чтоб всегда во всём везло!
С Новым годом! С новым счастьем!
Смеха, мира и добра!
Пусть обходят все ненастья,
Жизнь одарит вас сполна!
И немного информации о новом году
Сложно найти человека, который был бы равнодушен к новогодним праздникам! Любовь к этой волшебной ночи в каждом заложена с раннего детства. Новый год у всех ассоциируется с подарками, сладостями, весельем и хорошим настроением! Но мало кто знает о том, почему именно календарный год начинается 1 января. Между тем, история у этого праздника богата и интересна.
Почему Новый год отмечают первого января
Новый год — один из древнейших праздников, но в мире до сих пор нет единой даты начала года. Разные народы ведут отчет времени с различных периодов, а в некоторых странах вообще отсутствует фиксированная дата, а летосчисление ведется по лунному календарю.
В дохристианские времена этот важный праздник многие народы отмечали в день зимнего солнцестояния. На Руси до 10 века начало нового года встречали в дни, приближенные к весеннему равноденствию. Празднование зарождения года весной было естественным — люди радовались окончанию долгой зимы, прибавлению дня, новому урожаю.
С приходом христианства (988-989 годы) Русь перешла на юлианский календарь. С тех времен начало года стали встречать в первый день весны, считающийся днем зарождения мира. Тогда же год разделили на 12 месяцев и присвоили каждому из них свое название, соответствующее природным явлениям.
В 1492 году дату начала года перенесли на 1 сентября. Соответствующий указ был подписан Иоанном Третьим. Чтобы создать у народа праздничное настроение, государь устроил в Кремле пышное торжество, на которое были приглашены все желающие. В этот день подойти к царю мог любой простой человек и попросить у него помощи, в которой правитель практически никогда не отказывал. Последний раз в таком формате Новый год на Руси встретили в 1698 году, тогда государь одарил каждого гостя яблоком и ласково назвал братом.
Тем, что новогодний праздник приходится на 1 января россияне обязаны великому реформатору Петру Первому — именно он указом «О реформе календаря в России» приказал перенести празднование Нового года на общепринятый в Европе день. Указом царя все жители больших и малых городов должны были радостно встречать праздник, поздравлять друг друга и дарить подарки. Государь отдал приказ ровно в полночь выпустить первую ракету, поздравив этим всех собравшихся на Красной площади с новым 1700 годом.
Начиная с 1897 года, 1 января в России стал официальным нерабочим днем. Это было закреплено соответствующим указом и распространялось на всех трудящихся заводов, фабрик и других производств.
После того, как власть в стране оказалась в руках большевиков, начало года стали отмечать по григорианскому календарю. Таким образом праздничные дни пришлись на период поста, что сделало их неинтересными для христиан. Коммунисты тоже не очень-то чествовали Новый год, елки в стране были запрещены, а народные гуляния не одобрялись. В период с 1930 по 1947 год этот день был типичным рабочим днем и только в 1947 ему вернули статус выходного дня.
Долгое время в Советском Союзе праздничным считалось только 1 января, а двухдневные выходные были установлены в 1992 году. Еще больше праздничных дней россияне получили в 1995 году — тогда вышел указ о пятидневных новогодних каникулах, что фактически удлинило январский отдых до 8-10 дней. В 2013 году к праздничным дням были причислены 6 и 8 января.
Откуда пришел Дед мороз
Образ Деда Мороза появился намного раньше, чем празднование Нового года. В русском фольклоре хранитель холодов чаще всего был злым и недружелюбным. После того, как начало года перенесли на зимнее время, морозный владыка получил новую роль — он стал дарить подарки и нести людям всех возрастов праздник.
У современного Деда Мороза есть свой день рождения — 18 ноября и свой дом, который находится в Великом Устюге. Теперь он получает просьбы о подарках по электронной почте и передает свои координаты по спутниковой системе навигации.
История новогодней елки
Украшенная игрушками и гирляндами елка — главный символ Нового года, без которого сложно представить себе веселый и вкусный праздник. Украшать ели было принято еще в древние времена, когда начало года встречали в день весеннего солнцестояния. Тогда славяне пели возле елочек песни, водили хороводы и плясали.
В России хвойная красавица появилась в 1700 году, как несложно догадаться, этот нарядный обычай был введен Петром Первым. Однако лишь к середине 19 века праздничная елка распространилась по стране и стала народной любимицей, олицетворяющей не только Новый год, но и Рождество Христово. В 1920 году большевики запретили наряжать хвойные деревья, причислив этот обычай к религиозным пережиткам. Только в 1936 году ель вернулась на законных правах, а ее верхушку стала украшать символичная пятиконечная звезда.
Нужно закодировать скрипт!
в PHP скрипты
Опубликовано · Изменено пользователем Hellion35
Почитай про обфускацию и Zend Guard например. Что касается ежемесячной оплаты, думаю можно выводить работу скрипта с помощью ифрэймов, дабы контролировать на сторонних ресурсах, либо раздавать лицензии на ограниченный срок. Хотя это не очень эффективно, сейчас нулять все что только можно)) Так что первый вариант гораздо продуктивней и безопасней. Скрипт отрабатывает на вашем сервере и выводит результат на клиентском сайте при помощи iframe, И необходимость в шифровании отпадает сама по себе.
p.s. жесть надо так тему засрать(((
p.p.s. Хотя я даже не уточнил что за скрипт))) Мой совет применим к PHP если что)))