Назад

Скидываем сюда готовые сорцы!

Автор: ????: Дата: 02.12.2009

@showcraft
by Brain.

Index: atcommand.c
===================================================================
--- atcommand.c * *(revision 12745)
+++ atcommand.c * *(working copy)
@@ -7797,7 +7797,19 @@
* *clif_displaymessage(fd, "Skill delay failures are shown now.");
* *return 0;
}
+//@showcraft [Brainstorm]
+int atcommand_showcraft(const int fd, struct map_session_data* sd, const char* command, const char* message)
+{
+ * *if (sd->state.showcraft) {
+ * * * *sd->state.showcraft = 0;
+ * * * *clif_displaymessage(fd, "Crafting chance will not be shown.");
+ * * * *return 0;
+ * *}

+ * *sd->state.showcraft = 1;
+ * *clif_displaymessage(fd, "Crafting chance is now shown.");
+ * *return 0;
+}
/*==========================================
** Barricade Build
**------------------------------------------*/
@@ -8560,6 +8572,8 @@
* *{ "points", * * * * * *60, * * atcommand_cash },
* *{ "barricade", * * * * 60, * * atcommand_barricade },
* *{ "killbarricade", * * 60, * * atcommand_barricade_destroy },
+ * *//Vanaheim Commands
+ * *{ "showcraft", * * * * *0, atcommand_showcraft}, //Brainstorm
};


Index: battle.c
===================================================================
--- battle.c * *(revision 12745)
+++ battle.c * *(working copy)
@@ -3698,6 +3698,8 @@
* *{ "ksprotection", * * * * * * * * * * * &battle_config.ksprotection, * * * * * * * * * *5000, * 0, * * *INT_MAX, * * * *},
* *{ "auction_feeperhour", * * * * * * * * &battle_config.auction_feeperhour, * * * * * * *12000, *0, * * *INT_MAX, * * * *},
* *{ "auction_maximumprice", * * * * * * * &battle_config.auction_maximumprice, * * * * * *500000000, 0, * MAX_ZENY, * * * },
+ * *//Vanaheim battle settings [Brainstorm]
+ * *{ "disp_craft_chance", * * * * * * * * *&battle_config.disp_craft_chance, * * * * * * * 0, * * *0, * * *1, * * * * * * *},
};


Index: battle.h
===================================================================
--- battle.h * *(revision 12745)
+++ battle.h * *(working copy)
@@ -451,6 +451,8 @@
* *int ksprotection;
* *int auction_feeperhour;
* *int auction_maximumprice;
+ * *//Vanaheim battle settings [Brainstorm]
+ * *int disp_craft_chance; // Battle Flag to Show crafting percentages [Brain]
} battle_config;

void do_init_battle(void);
Index: pc.c
===================================================================
--- pc.c * *(revision 12745)
+++ pc.c * *(working copy)
@@ -753,6 +753,9 @@
* * * *sd->state.showexp = 1;
* *if (battle_config.disp_zeny)
* * * *sd->state.showzeny = 1;
+ * *//Vanaheim settings [Brainstorm]
+ * *if (battle_config.disp_craft_chance) // Battle Flag to Show Pot Heal [Brain]
+ * * * *sd->state.showcraft = 1;
* *
* *if (!(battle_config.display_skill_fail&2))
* * * *sd->state.showdelay = 1;
Index: pc.h
===================================================================
--- pc.h * *(revision 12745)
+++ pc.h * *(working copy)
@@ -113,6 +113,8 @@
* * * *unsigned short autoloot;
* * * *unsigned short autolootid; // [Zephyrus]
* * * *unsigned noks : 3; // [Zeph Kill Steal Protection]
+ * * * *//Vanaheim settings [Brainstorm]
+ * * * *unsigned showcraft :1; //Show craft and produce chances [Brainstorm]
* * * *bool changemap;
* * * *struct guild *gmaster_flag;
* *} state;
Index: skill.c
===================================================================
--- skill.c * *(revision 12745)
+++ skill.c * *(working copy)
@@ -10162,7 +10162,17 @@
* *if(make_per < 1) make_per = 1;

* *
- * *if(rand()%10000 < make_per || qty > 1){ //Success, or crafting multiple items.
+ * *// @showcraft command implementation [Brainstorm]
+ * *{
+ * *char output[256];
+ * *int craft_chance = rand()%10000; //Save the obtained value
+ * *if(sd->state.showcraft){
+ * * * *sprintf(output,
+ * * * * * *"[SHOW CRAFT] Required Chance to Craft: %02.02f%% Obtained: %02.02f%% .",(float)make_per/100,(float)craft_chance/100);
+ * * * *clif_disp_onlyself(sd,output,strlen(output));
+ * *}
+ * *//if(rand()%10000 < make_per || qty > 1){ //Success, or crafting multiple items.
+ * *if(craft_chance < make_per || qty > 1){ //Success, or crafting multiple items. [Brainstorm]
* * * *struct item tmp_item;
* * * *memset(&tmp_item,0,sizeof(tmp_item));
* * * *tmp_item.nameid=nameid;
@@ -10285,6 +10295,7 @@
* * * * * *return 1;
* * * *}
* *}
+ * *} //@showcraft [Brainstorm]
* *//Failure * *
// * *if(log_config.produce)
// * * * *log_produce(sd,nameid,slot1,slot2,slot3,0);

Автор: Мяфк: Дата: 02.12.2009

Показывает эмоции без задержки. Номера: 1-63

src\map\atcommand.c
Вставляем:

ACMD_FUNC(emotion); // Anarchist
{ AtCommand_Emotion, * * *"@emotion", * * *1, atcommand_emotion }, // Anarchist
/*==========================================
* @emotion X by Anarchist
* => Displays the emotions without delay
*------------------------------------------
*/
int atcommand_emotion(
* *const int fd, struct map_session_data* sd,
* *const char* command, const char* message)
{
* *if (!message || !*message) {
*clif_displaymessage(fd, "usage: @emotion 1-63");
*return -1;
* *}
* *clif_emotion(&sd->bl, atoi(message));
* *return 0;
}
В старых сборках ещё добавить:
src\map\atcommand.h
AtCommand_Emotion, // Anarchist

Автор: Мяфк: Дата: 02.12.2009

Эмоции в виде сердечек. Х - 1 или 2

src\map\atcommand.c

ACMD_FUNC(heart); // Anarchist
{ AtCommand_Heart, * *"@heart", * * *1, atcommand_heart }, // Anarchist
/*==========================================
* @heart X by Anarchist
* => Displays the heart special effect
*------------------------------------------
*/
int atcommand_heart(
* * const int fd, struct map_session_data* sd,
* * const char* command, const char* message)
{
* *nullpo_retr(-1, sd);

* *if (!message || !*message) {
*clif_displaymessage(fd, "usage: @heart 1 or 2");
*return -1;
* *}
* *if ( atoi(message) == 1 ) {
*clif_specialeffect(&sd->bl, 364, 0);
* *} else if ( atoi(message) == 2 ) {
*clif_specialeffect(&sd->bl, 509, 0);
* *}
* *return 0;
}
В старых сборках добавляем:
src\map\atcommand.h
AtCommand_Heart, // Anarchist

Автор: Мяфк: Дата: 02.12.2009

@dance X (by Anarchist)
Спецэффекты в стиле танца. Номера: 1-9

src\map\atcommand.c

ACMD_FUNC(dance); // Anarchist
{ AtCommand_Dance, * *"@dance", * * *1, atcommand_dance }, // Anarchist
/*==========================================
* @dance X by Anarchist
* => Special effects with dance style
*------------------------------------------
*/
int atcommand_dance(
* *const int fd, struct map_session_data* sd,
* *const char* command, const char* message)
{
* *nullpo_retr(-1, sd);

* *if (!message || !*message) {
*clif_displaymessage(fd, "usage: @dance 1-9");
*return -1;
* *}
* *if ( atoi(message) == 1 ) {
*clif_specialeffect(&sd->bl, 413, 0);
* *} else if ( atoi(message) == 2 ) {
*clif_specialeffect(&sd->bl, 414, 0);
* *} else if ( atoi(message) == 3 ) {
*clif_specialeffect(&sd->bl, 415, 0);
* *} else if ( atoi(message) == 4 ) {
*clif_specialeffect(&sd->bl, 426, 0);
* *} else if ( atoi(message) == 5 ) {
*clif_specialeffect(&sd->bl, 458, 0);
* *} else if ( atoi(message) == 6 ) {
*clif_specialeffect(&sd->bl, 466, 0);
* *} else if ( atoi(message) == 7 ) {
*clif_specialeffect(&sd->bl, 501, 0);
* *} else if ( atoi(message) == 8 ) {
*clif_specialeffect(&sd->bl, 540, 0);
* *} else if ( atoi(message) == 9 ) {
*clif_specialeffect(&sd->bl, 550, 0);
* *}
* *return 0;
}
В старых сборках ещё добавить:
src\map\atcommand.h
AtCommand_Dance, // Anarchist

Автор: Мяфк: Дата: 02.12.2009

@show <х> (by KarLaeda)
Показывает на минимапе выбранные координаты.

src\map\atcommand.c

ACMD_FUNC(show); // KarLaeda
{ AtCommand_Show, * *"@show", * * *1, atcommand_show }, // KarLaeda
/*==========================================
* @show by KarLaeda
* => Displays the point on minimap
*------------------------------------------
*/
int atcommand_show(
* *const int fd, struct map_session_data* sd,
* *const char* command, const char* message)
{
* *int x = 0, y = 0;
* *nullpo_retr(-1, sd);

* *if (!message || !*message || (sscanf(message, "%d %d", &x, &y) != 2)) {
*clif_displaymessage(fd, "usage: @show  ");
*return -1;
* *}
*clif_viewpoint(sd, 1, 1, x, y, 2, 0xFF0000);
*return 0;
}
В старых сборках ещё добавить:
src\map\atcommand.h
AtCommand_Show, // KarLaeda

Автор: Мяфк: Дата: 02.12.2009

@ipban (by Griniy, Updated by Empty)

В связи с большими изменениями в структуре SQL запросов в последних ревизиях еА,
Пришлось переделывать многое.
Вот вам поправленный вариант @ipban, прекрасно работает на ревизиях 114хх.

./src/map/atcommand.h

AtCommand_ipban, //By [Griniy]
ACMD_FUNC(ipban); //By [Griniy]
{ AtCommand_ipban, * * *"@ipban", * * *20, atcommand_ipban }, //By [Griniy]
//IP ban by [Griniy], updated by [Empty]. Some code merged from charban command by Yor
int atcommand_ipban(const int fd, struct map_session_data* sd, const char* command, const char* message)
{
* *char *modif_p, *data, *last_ip;
* *int month, value;
* *char ip[16];
* *nullpo_retr(-1, sd);

* *memset(atcmd_output, '\', sizeof(atcmd_output));
* *memset(atcmd_player_name, '\', sizeof(atcmd_player_name));

* *if (!message || !*message || sscanf(message, "%199s %99[^\n]", atcmd_output, atcmd_player_name) < 2) {
* * * *clif_displaymessage(fd, "Please, enter ban time and a player name (usage: @ipban  ).");
* * * *return -1;
* *}
* *atcmd_output[sizeof(atcmd_output)-1] = '\';

* *modif_p = atcmd_output;
* *month = 0;
* *while (modif_p[0] != '\') {
* * * *value = atoi(modif_p);
* * * *if (value == 0)
* * * * * *modif_p++;

* * * *else {
* * * * * *if (modif_p[0] == '-' || modif_p[0] == '+')
* * * * * * * *modif_p++;

* * * * * *while (modif_p[0] >= '0' && modif_p[0] <= '9') {
* * * * * * * *modif_p++;
* * * * * * * *if (modif_p[0] == 'm') {
* * * * * * * * * *month = value;
* * * * * * * * * *modif_p++;
* * * * * * * *} else if (modif_p[0] != '\')
* * * * * * * * * *modif_p++;
* * * * * *}
* * * *}
* *}
* *if (month == 0) {
* * * *clif_displaymessage(fd, msg_table[85]); // Invalid time for ban command.
* * * *return -1;
* *}
* *if( SQL_ERROR == Sql_Query(mmysql_handle,
* * * *"SELECT `last_ip` From `login`, `char` WHERE login.account_id = char.account_id AND char.name = '%s'", atcmd_player_name ) )
* * * *Sql_ShowDebug(mmysql_handle);

* *if( Sql_NumRows(mmysql_handle) == 0 )
* *{
* * * *clif_displaymessage(fd, "The character name is unknown. Check and repit");
* * * *Sql_FreeResult(mmysql_handle);
* * * *return -1;
* *}

* *Sql_NextRow(mmysql_handle);

* *Sql_GetData(mmysql_handle, 0, &data, NULL); last_ip = data;
* *strcpy(ip, last_ip);
* *Sql_FreeResult(mmysql_handle);

* *if( SQL_ERROR == Sql_Query(mmysql_handle,"SELECT `rtime` From `ipbanlist` Where `list` = '%s'", ip))
* * * *Sql_ShowDebug(mmysql_handle);

* *if( Sql_NumRows(mmysql_handle) > 0 )
* *{
* * * *clif_displaymessage(fd, "This Character already in IPban list.");
* * * *Sql_FreeResult(mmysql_handle);
* * * *return -1;
* *} else
* * * *Sql_FreeResult(mmysql_handle);

* *if( SQL_ERROR == Sql_Query(mmysql_handle,
* * * *"INSERT INTO `ipbanlist` (`list`,`btime`,`rtime`,`reason`) VALUES ('%s', NOW() , NOW() + *INTERVAL %d MONTH ,'AtCommand ban for user name : %s')", ip, month, atcmd_player_name))
* * * *Sql_ShowDebug(mmysql_handle);

* *clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it.
* *if (map_nick2sd(atcmd_player_name))
* * * *clif_GM_kick(sd, map_nick2sd(atcmd_player_name));//Kick player

* *return 0;
}
Время бана устанавливается в месяцах.
Пример: @ipban +12m Test User

Автор: Мяфк: Дата: 02.12.2009

@unipban

/*==========================================
* UnBanIP by [Griniy]
* upgraded by Sam3000
*------------------------------------------*/
int atcommand_unbanip(const int fd, struct map_session_data* sd, const char* command, const char* message)
{
char *data, *last_ip, ip[16], output[255];
nullpo_retr(-1, sd);

memset(atcmd_player_name, '\', sizeof(atcmd_player_name));

if (!message || !*message || (sscanf(message, "%23[^\n]", atcmd_player_name) < 1)) {
* *clif_displaymessage(fd, "Please, enter a player name to unban (usage: @unbanip ).");
* *return -1;
}
if( SQL_ERROR == Sql_Query(mmysql_handle, "SELECT `last_ip` FROM `login`, `char` WHERE login.account_id = char.account_id AND char.name = '%s'",atcmd_player_name) ) {
* *Sql_ShowDebug(mmysql_handle);
* *Sql_FreeResult(mmysql_handle);
* *return -1;
}
if( Sql_NumRows(mmysql_handle) == 0 ) {
* *clif_displaymessage(fd, "The character name is unknown. Check and repit");
* *Sql_FreeResult(mmysql_handle);
* *return -1;
}
Sql_NextRow(mmysql_handle);
Sql_GetData(mmysql_handle, 0, &data, NULL); last_ip = data; strcpy(ip, last_ip);

if( SQL_ERROR == Sql_Query(mmysql_handle, "SELECT * FROM `ipbanlist` WHERE `list` = '%s'",ip) ) {
* *Sql_ShowDebug(mmysql_handle);
* *Sql_FreeResult(mmysql_handle);
* *return -1;
}

if( Sql_NumRows(mmysql_handle) == 0 ) {
* *clif_displaymessage(fd, "This Character dosn`t found in banlist.");
* *Sql_FreeResult(mmysql_handle);
* *return -1;
}

if( SQL_ERROR == Sql_Query(mmysql_handle, "DELETE FROM `ipbanlist` WHERE `list` = '%s'",ip) ) {
* *Sql_ShowDebug(mmysql_handle);
* *Sql_FreeResult(mmysql_handle);
* *return -1;
}

sprintf(output, "Unbanip %s succes.",atcmd_player_name);
clif_displaymessage(fd, output);
return 0;
}

Автор: Мяфк: Дата: 02.12.2009

Отображение HP и уровень моба одновремено.
1. Залазим в /src/map/clif.c
2. Находим там примерно на 7146 строке такой код:

case BL_MOB:
*{
*    struct mob_data *md = (struct mob_data *)bl;
*    nullpo_retr(0, md);

*    memcpy(WBUFP(buf,6), md->name, NAME_LENGTH);
*    if (md->guardian_data && md->guardian_data->guild_id) {
* *WBUFW(buf, 0) = cmd = 0x195;
* *WBUFB(buf,30) = 0;
* *memcpy(WBUFP(buf,54), md->guardian_data->guild_name, NAME_LENGTH);
* *memcpy(WBUFP(buf,78), md->guardian_data->castle->castle_name, NAME_LENGTH);
*    } else if (battle_config.show_mob_info) {
* *char mobhp[50], *str_p = mobhp;

* *WBUFW(buf, 0) = cmd = 0x195;
* *if (battle_config.show_mob_info&4)
* *    str_p += sprintf(str_p, "Lv. %d | ", md->level);
* *if (battle_config.show_mob_info&1)
* *    str_p += sprintf(str_p, "HP: %u/%u | ", md->status.hp, md->status.max_hp);
* *if (battle_config.show_mob_info&2)
* *    str_p += sprintf(str_p, "HP: %d%% | ",
* * *md->status.max_hp > 10000?
* * *md->status.hp/(md->status.max_hp/100):
* * *100*md->status.hp/md->status.max_hp);
* *//Even thought mobhp ain't a name, we send it as one so the client
* *//can parse it. [Skotlex]
* *if (str_p != mobhp) {
* *    *(str_p-3) = '\'; //Remove trailing space + pipe.
* *    memcpy(WBUFP(buf,30), mobhp, NAME_LENGTH);
* *    WBUFB(buf,54) = 0;
* *    memcpy(WBUFP(buf,78), mobhp, NAME_LENGTH);
* *}
*    }
*}
*break;
3. Далее в этом коде находим строчку:
str_p += sprintf(str_p, "HP: %u/%u | ", md->status.hp, md->status.max_hp);
4. Заменяем ее на:
str_p += sprintf(str_p, "HP: %u/%u - %d | ", md->status.hp, md->status.max_hp, md->level);
5. Компилируем и радуемся

P.S. Чтобы отображалось жизнь и уровень необходимо иметь show_mob_info = 1 в файле conf/battle/monster.conf

Автор: Мяфк: Дата: 02.12.2009

ЗЫ!
Если у вас будут ошибки при компиле, то вместо *** ставим табы...

Автор: Tарасик: Дата: 09.13.2009

Писал для своего серва,может кому нить пригодяться
@cast наложение Глории,Магнификата,Аги,Блес

/*==========================================
* @cast by Тарасик
*------------------------------------------
*/
int atcommand_cast(
const int fd, struct map_session_data* sd,
const char* command, const char* message)
{
nullpo_retr(-1, sd);
sc_start(&sd->bl,status_skill2sc(PR_GLORIA),100,1,skill_get_time(PR_GLORIA,1));
sc_start(&sd->bl,status_skill2sc(PR_MAGNIFICAT),100,1,skill_get_time(PR_MAGNIFICAT,1));
sc_start(&sd->bl,status_skill2sc(AL_INCAGI),100,10,600000);
sc_start(&sd->bl,status_skill2sc(AL_BLESSING),100,10,600000);
return 0;
}

{ "cast",			   1,1,	 atcommand_cast },//Тарасик


@happy
несколько емоцый(*ефектов)

* @happy by Тарасик
*------------------------------------------
*/
int atcommand_happy(
const int fd, struct map_session_data* sd,
const char* command, const char* message)
{
nullpo_retr(-1, sd);

if (!message || !*message) {
clif_displaymessage(fd, "Вот так: @happy 1,2,3,4,5");
return -1;
}
if ( atoi(message) == 1 ) {
clif_specialeffect(&sd->bl, 682, 0);
} else if ( atoi(message) == 2 ) {
clif_specialeffect(&sd->bl, 683, 0);
}
else if ( atoi(message) == 3 ) {
clif_specialeffect(&sd->bl, 684, 0);
}
else if ( atoi(message) == 4 ) {
clif_specialeffect(&sd->bl, 685, 0);
}
else if ( atoi(message) == 5 ) {
clif_specialeffect(&sd->bl, 686, 0);
}
return 0;
}


{ "happy",			   1,1,	 atcommand_happy },//Тарасик

Автор: nomn: Дата: 04.09.2010

[COLOR="Indigo"]Команда @res
Позволяет реснуться, если у вас есть определенный "рес-итем".
На использование требуется 1 итем.[/COLOR]

atcommand.c


/*==========================================
* @alive by eA Dev. Team
* @res edit by [nomn]
*------------------------------------------*/
int atcommand_res(const int fd, struct map_session_data* sd, const char* command, const char* message)
{
int item_id, item_position, type;
nullpo_retr(-1, sd);
// Вместо 19052 вводите нужный вам ID
item_id = 19052;
item_position = pc_search_inventory(sd, item_id);

if (item_position < 1)
{
clif_displaymessage(sd->fd, "Вам необходим 'Камень Воскрешения'.");
return -1;
}

if (!status_revive(&sd->bl, 100, 100))
{
clif_displaymessage(fd, "Ты все еще жив.");
return -1;
}
// Вместо 19052 вводите нужный вам ID
type = pc_search_inventory (sd, 19052);
pc_delitem(sd, type, 1, 0);
clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
clif_displaymessage(sd->fd, "Вы высвободили силу 'Камня Воскрешения'.");
return 0;
}


ниже в atcommand.c

{ "res", 0,99, atcommand_res }, // [eA Dev. Team] upgraded by nomn


atcommand_athena.conf

res: 0,99

Автор: Reversed_Sieg: Дата: 06.13.2010

Анти-бот анти-впе анти-рпе

http://slil.ru/29320905

В архиве:

loader.exe - запуск клиента (ваш ехе должен быть переименован в sakexe.bin, обязателен патч отмены 1sak1)
dll - сама защита, ключ можно поменять хекс редактором. По желанию можно ее запаковать каким-либо протектором или пакером
diff - дифф для сорцов (можно применить в ручную, либо любым клиентом subversion)

Важно: идет проверка на локальность соединения путем сравнения старшего октета айпи адреса с 127. Т.е. на локалке проверить нельзя, на удаленном хосте bind_ip должен быть 127.0.0.1.

Автор: Infarkt: Дата: 12.12.2010

@dt
@dt без приватного чата.

{ "dt", 1,1, atcommand_detach },


//======================
//by Anarchist
//modified by dersd
//@detach
//======================
int atcommand_detach( const int fd, struct map_session_data* sd, const char* command, const char* message)
{
nullpo_retr(-1, sd);

//sd->state.monster_ignore = 1;
sd->state.autotrade = 1;
clif_authfail_fd(fd, 15);
return 0;
}

Автор: Kill Spirit: Дата: 12.12.2010

Что за говно-детач?

Вот самый нормальный:

ea\src\map\atcommand.c

//Детач by Incubus
int atcommand_detach(const int fd, struct map_session_data* sd, const char* command, const char* message)
{
nullpo_retr(-1, sd);

if(!sd->chatID)
{
clif_displaymessage(fd,"Вы должны поставить чат.");
return -1;
}
if( map[sd->bl.m].flag.autotrade == battle_config.autotrade_mapflag )
{
sd->state.autotrade = 1;
sd->sc.opt1 = 6;
clif_changeoption(&sd->bl);
clif_authfail_fd(fd, 15);
} else {
clif_displaymessage(fd, "На этой локации, встать в @dt нельзя.");
return -1;
}
return 0;
}


	{ "detach",		 0,99,     atcommand_detach },	
{ "dt", 0,99, atcommand_detach },

Автор: Infarkt: Дата: 12.12.2010

clif_displaymessage(fd,"Вы должны поставить чат.");

а нахрена чат чтобы поставить дт :D :D

Автор: Kill Spirit: Дата: 12.12.2010

Цитата Infarkt;27516:
clif_displaymessage(fd,"Вы должны поставить чат.");

а нахрена чат чтобы поставить дт :D :D


Писали для моего сервера, поэтому стоит "Поставьте чат"

Автор: Fox[RM]: Дата: 12.12.2010

MapFlag NoStorage
Разработка : [SoulBlaker]
Доработка и перевод: RequieM

src/map/atcommand.c
Ищем :

int atcommand_storage(const int fd, struct map_session_data* sd, const char* command, const char* message)
{
nullpo_retr(-1, sd);

if (sd->npc_id || sd->vender_id || sd->state.trading || sd->state.storage_flag)
return -1;

if (storage_storageopen(sd) == 1)
{ //Already open.
clif_displaymessage(fd, msg_txt(250));
return -1;
}

clif_displaymessage(fd, "Storage opened.");

return 0;
}


Убираем эту строку:

	-clif_displaymessage(fd, msg_txt(250));



src/map/map.h

Ищем :

unsigned partylock :1;
unsigned guildlock :1;


Добавляем :

unsigned partylock :1;
unsigned guildlock :1;
+unsigned nostorage :1; // [SoulBlaker]


src/map/npc.c

Ищем:

else if (!strcmpi(w3,"guildlock"))
map[m].flag.guildlock=state;


Добавляем:

else if (!strcmpi(w3,"guildlock"))
map[m].flag.guildlock=state;
+else if (!strcmpi(w3,"nostorage"))
+ map[m].flag.nostorage=state;


src/map/script.c

Ищем:

MF_GUILDLOCK,   //45


Добавляем:

MF_GUILDLOCK,   //45
+MF_NOSTORAGE


Ищем далее:

case MF_GUILDLOCK:              script_pushint(st,map[m].flag.guildlock); break;


Добавляем:

case MF_GUILDLOCK:              script_pushint(st,map[m].flag.guildlock); break;
+case MF_NOSTORAGE: script_pushint(st,map[m].flag.nostorage); break;


Ищем далее:

case MF_GUILDLOCK:     map[m].flag.guildlock=1; break;


Добавляем:

case MF_GUILDLOCK:     map[m].flag.guildlock=1; break;
+case MF_NOSTORAGE: map[m].flag.nostorage=1; break;


Ищем далее:

case MF_GUILDLOCK:     map[m].flag.guildlock=0; break;


Добавляем:

case MF_GUILDLOCK:     map[m].flag.guildlock=0; break;
+case MF_NOSTORAGE: map[m].flag.nostorage=0; break;


src/map/storage.c

Ищем:

int storage_storageopen(struct map_session_data *sd)
{
nullpo_retr(0, sd);

if(sd->state.storage_flag)
return 1; //Already open?

if( !pc_can_give_items(pc_isGM(sd)) )
{ //check is this GM level is allowed to put items to storage
clif_displaymessage(sd->fd, msg_txt(246));
return 1;
}

sd->state.storage_flag = 1;
clif_storagelist(sd,&sd->status.storage);
clif_updatestorageamount(sd,sd->status.storage.storage_amount);
return 0;
}


Добавляем:

int storage_storageopen(struct map_session_data *sd)
{
+int m;
nullpo_retr(0, sd);

if(sd->state.storage_flag)
return 1; //Already open?

+m = sd->bl.m;
+if (map[m].flag.nostorage) {
+ clif_displaymessage(sd->fd, msg_txt(527));
+ return 1;
+}

if( !pc_can_give_items(pc_isGM(sd)) )
{ //check is this GM level is allowed to put items to storage
clif_displaymessage(sd->fd, msg_txt(246));
return 1;
}

sd->state.storage_flag = 1;
clif_storagelist(sd,&sd->status.storage);
clif_updatestorageamount(sd,sd->status.storage.storage_amount);
return 0;
}


conf/msg_athena.conf

После этой строки :

510: You have %d new emails (%d unread)


Добавляем:

// MapFlags NoStorage and NoGuildStorage
527: Вы не можете использовать склад на этой локации.


db/const.txt

Ищем:

mf_guildlock    45


Добавляем:

+mf_nostorage    46 
+mf_noguildstorage 47


После всего этого рекомпилим и радуемся.

Пример мапфлага:

prontera mapflag nostorage

Автор: Пацанчик: Дата: 01.04.2011

Цитата Reversed_Sieg;25223]Анти-бот анти-впе анти-рпе

[url]http://slil.ru/29320905[/url:


В архиве:

loader.exe - запуск клиента (ваш ехе должен быть переименован в sakexe.bin, обязателен патч отмены 1sak1)
dll - сама защита, ключ можно поменять хекс редактором. По желанию можно ее запаковать каким-либо протектором или пакером
diff - дифф для сорцов (можно применить в ручную, либо любым клиентом subversion)

Важно: идет проверка на локальность соединения путем сравнения старшего октета айпи адреса с 127. Т.е. на локалке проверить нельзя, на удаленном хосте bind_ip должен быть 127.0.0.1.


можете перезалить ?

Автор: FakeChel: Дата: 02.22.2011

Делал для своего сервера, аналог функции clearitem(), удаляет все из телеги.

clearcart ()

Index: script.c
===================================================================
--- script.c (revision 14722)
+++ script.c (working copy)
@@ -14822,7 +14822,23 @@
buyingstore_setup(sd, script_getnum(st,2));
return 0;
}
+// Удаление предметов из телеги
+BUILDIN_FUNC(clearcart)
+{
+ TBL_PC *sd=script_rid2sd(st);
+ int i;
+ if(sd==NULL) return 0;
+ for(i=0; i < MAX_CART; i++)
+ if ( sd->status.cart.nameid != 0 ){
+
+ if(log_config.enable_logs&0x40)
+ log_pick_pc(sd, "N", sd->status.cart.nameid, -sd->status.cart.amount, &sd->status.cart);

+ pc_cart_delitem(sd,i,sd->status.cart.amount,0);
+
+ }
+ return 0;
+}

// declarations that were supposed to be exported from npc_chat.c
#ifdef PCRE_SUPPORT
@@ -15225,5 +15241,6 @@
BUILDIN_DEF(checkquest, "i?"),
BUILDIN_DEF(changequest, "ii"),
BUILDIN_DEF(showevent, "ii"),
+ BUILDIN_DEF(clearcart,""),
{NULL,NULL,NULL},
};

Автор: Nikita54421: Дата: 03.11.2011

Задержка на бросание вещей на землю помогает для серверов у кого не стоит защита от wpe ну знаете когда люди там стрелы кидают и всё такое:)

Index: src/map/pc.c
===================================================================
--- src/map/pc.c (revision 13956)
+++ src/map/pc.c (working copy)
@@ -452,6 +452,7 @@
sd->state.active = 0; //to be set to 1 after player is fully authed and loaded.
sd->bl.type = BL_PC;
sd->canlog_tick = gettick();
+ sd->candrop_tick = 0;
//Required to prevent homunculus copuing a base speed of 0.
sd->battle_status.speed = sd->base_status.speed = DEFAULT_WALK_SPEED;
return 0;
@@ -3288,6 +3289,12 @@
clif_displaymessage (sd->fd, msg_txt(263));
return 0;
}
+
+ if ( sd->candrop_tick && DIFF_TICK(gettick(), sd->candrop_tick) < 1000)
+ {
+ clif_displaymessage(sd->fd, "Пожалуйста, подождите 1 секунду, прежде чем бросить еще что либо.");
+ return 0;
+ }

//Logs items, dropped by (P)layers [Lupus]
if(log_config.enable_logs&0x8)
@@ -3298,7 +3305,9 @@
return 0;

pc_delitem(sd, n, amount, 0);
+ sd->candrop_tick=gettick();
return 1;
}

/*==========================================
Index: src/map/pc.h
===================================================================
--- src/map/pc.h (revision 13956)
+++ src/map/pc.h (working copy)
@@ -189,6 +189,7 @@

int invincible_timer;
unsigned int canlog_tick;
+ unsigned int candrop_tick;
unsigned int canuseitem_tick; // [Skotlex]
unsigned int canequip_tick; // [Inkfish]
unsigned int cantalk_tick;