Назад

Помогите реализовать одну идею!

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

Мне очень охота у себя на сервере поставить свою команду помощи то есть типа стандартной @help
Думал попробую написать в начале сам :).Посмотрел приме стандартной команды помощи,ну в общем вот что смастерил.

/*==========================================
* @wro
*------------------------------------------*/
ACMD_FUNC(wro)
{
char buf[2048], w1[2048], w2[2048];
int i, gm_level;
FILE* fp;
nullpo_retr(-1, sd);

memset(buf, '\0', sizeof(buf));

if ((fp = fopen(wro_txt, "r")) != NULL) {
clif_displaymessage(fd, msg_txt(26)); // Help commands:
gm_level = pc_isGM(sd);
while(fgets(buf, sizeof(buf), fp) != NULL) {
if (buf[0] == '/' && buf[1] == '/')
continue;
for (i = 0; buf != '\0'; i++) {
if (buf == '\r' || buf == '\n') {
buf = '\0';
break;
}
}
if (sscanf(buf, "%2047[^:]:%2047[^\n]", w1, w2) < 2)
clif_displaymessage(fd, buf);
else if (gm_level >= atoi(w1))
clif_displaymessage(fd, w2);
}
fclose(fp);
} else {
clif_displaymessage(fd, msg_txt(27)); // File help.txt not found.
return -1;
}

return 0;
}

После кампила вот что пишет:...
4>..\src\map\atcommand.c(9127): error C2065: wro_txt: необъявленный идентификатор
4>..\src\map\atcommand.c(9127): warning C4047: функция: "const char *" отличается по уровням косвенного обращения от "int"
4>..\src\map\atcommand.c(9127): warning C4024: fopen: различные типы для формального и фактического параметров 1

Объясните пожалуйста новечку что я сделал не так?

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

Цитата nomn;36167:
ололо. в чем задача? переименовать @help или сделать другой функционал? вопроса не вижу.

Cделать другой функционал хочу.:)

Автор: Кеник: Дата: 03.20.2011

ТОгда стоит уточнить - что ты хочешь получить в итоге...

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

Цитата Кеник;36183:
ТОгда стоит уточнить - что ты хочешь получить в итоге...


[COLOR="Indigo"]золотые слова.
[/COLOR]

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

Цитата Кеник;36183:
ТОгда стоит уточнить - что ты хочешь получить в итоге...


Я хочу получить в итоге чтобы у меня была на сервере своя команда помощи тоесть пишу @wro и должно выйте типа такого
---------------Команды сервера Ыуа Ро-----------
@ab - бла бла бла
@dt - бла бла бла
@irc - бла бла бла
и так даллия......
Это всё как я понял надо приписывать в папке conf/wro.txt ну знаете там же лежат help.txt,help2.txt.
Я понял что надо ещё прописать эт wro.txt в файле map_athena.conf
// When @help or @h is typed when you are a gm, this is displayed for helping new gms understand gm commands.
help_txt: conf/help.txt
help2_txt: conf/help2.txt
wro.txt: conf/wro.txt <<<<вот
charhelp_txt: conf/charhelp.txt


Ну и как бы ясное дело чтобы это всё заработало надо добавить в сорцах свою команду,только я не знаю как:huh: вроде бы попытался (написано выше) но не получилось:(

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

Если я не так излагаю суть своей идеи то извините!

Автор: Cole McCormick: Дата: 03.21.2011

Могбы переписать содержимое этих 2-х хелпов, и если уж так преспичило в сорцах название комманды поменять =) Такой нубский вопрос, а ты в аткоманд на прова добавлял её?

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

Цитата Naota;36216:
Могбы переписать содержимое этих 2-х хелпов, и если уж так преспичило в сорцах название комманды поменять =) Такой нубский вопрос, а ты в аткоманд на прова добавлял её?

Переписать можно,но я просто не хочу их трогать:)Права да я добавил.

Может сейчас скажу глупость ну в общем вот что я думаю:
После компилирования у меня показала ошибку (остальная часть от неё написана с верху в первом посту)
4>..\src\map\atcommand.c(9127): error C2065: wro_txt: необъявленный идентификатор 

Мне кажется что wro_txt надо куда то ещё приписать в сорцах чтобы он его идентифицировал.
Вот только вопрос куда?:mellow:

Автор: Gremlin: Дата: 03.21.2011

wro.txt: conf/wro.txt <<<<вот

попробуй поменять на
wro_txt: conf/wro.txt <<<<вот

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

Цитата Gremlin;36221]
wro.txt: conf/wro.txt <<<<вот

попробуй поменять на
wro_txt: conf/wro.txt <<<<вот

Всё спасибо =) я уже сделал вот что надо было!
в файле map.c прописать под
char charhelp_txt[256:
= "conf/charhelp.txt";

вот это
char wro_txt[256] = "conf/wro.txt"; 

там же под
		else
if (strcmpi(w1, "charhelp_txt") == 0)
strcpy(charhelp_txt, w2);

надо прописать
		else
if (strcmpi(w1, "wro_txt") == 0)
strcpy(wro_txt, w2);


Потом идём в map.h
под
extern char charhelp_txt[];  

прописываем
extern char wro_txt[];

Вот и всё =)

Автор: Mel9: Дата: 03.21.2011

http://s016.radikal.ru/i337/1103/10/ded9c19f8574.jpg

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

И вот последний вопрос по теме:)

А как можно сделать так чтоб эти команды помощи он отображал жёлтым или например синим?
Попробовал прописать так
1:"^880000@ab - бла бла бла^000000"
Не получилось:(

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

Можно.

Вот тебе пример одной из команд, переделай броадкаст на клифмеседж

ACMD_FUNC(kami)
{
unsigned long color=0;
nullpo_retr(-1, sd);

memset(atcmd_output, '\0', sizeof(atcmd_output));

if(*(command + 5) != 'c' && *(command + 5) != 'C') {

if (!message || !*message) {
clif_displaymessage(fd, "Please, enter a message (usage: @kami ).");
return -1;
}

sscanf(message, "%199[^\n]", atcmd_output);
intif_broadcast(atcmd_output, strlen(atcmd_output) + 1, (*(command + 5) == 'b' || *(command + 5) == 'B') ? 0x10 : 0);

} else {

if(!message || !*message || (sscanf(message, "%lx %199[^\n]", &color, atcmd_output) < 2)) {
clif_displaymessage(fd, "Please, enter color and message (usage: @kamic ).");
return -1;
}

if(color > 0xFFFFFF) {
clif_displaymessage(fd, "Invalid color.");
return -1;
}

intif_broadcast2(atcmd_output, strlen(atcmd_output) + 1, color, 0x190, 12, 0, 0);
}
return 0;
}

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

Цитата Kill Spirit;36245:
Можно.

Вот тебе пример одной из команд, переделай броадкаст на клифмеседж


Извините но до меня что то не дошло как сделать:(

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

/*==========================================
* @wro
*------------------------------------------*/
ACMD_FUNC(wro)
{
char buf[2048], w1[2048], w2[2048];
int i, gm_level;
FILE* fp;
nullpo_retr(-1, sd);

memset(buf, '\0', sizeof(buf));

if ((fp = fopen(wro_txt, "r")) != NULL) {
clif_displaymessage(fd, msg_txt(26)); // Help commands:
gm_level = pc_isGM(sd);
while(fgets(buf, sizeof(buf), fp) != NULL) {
if (buf[0] == '/' && buf[1] == '/')
continue;
for (i = 0; buf != '\0'; i++) {
if (buf == '\r' || buf == '\n') {
buf = '\0';
break;
}
}
if (sscanf(buf, "%2047[^:]:%2047[^\n]", w1, w2) < 2)
clif_displaymessage(fd, buf);
else if (gm_level >= atoi(w1))
clif_displaymessage(fd, w2);
intif_broadcast2(buf,strlen(buf) + 1, 0xD20000, 0x190, 12, 0, 0);
}
fclose(fp);
} else {
clif_displaymessage(fd, msg_txt(27)); // File help.txt not found.
return -1;
}
return 0;
}

Добавил я вот это
intif_broadcast2(buf,strlen(buf) + 1, 0xD20000, 0x190, 12,

под вот эту строчку
if (sscanf(buf, "%2047[^:]:%2047[^\n]", w1, w2) < 2)
clif_displaymessage(fd, buf);
else if (gm_level >= atoi(w1))
clif_displaymessage(fd, w2);

Вроде бы получилось что я хотел когда ввожу команду @wro пишет красным а не стандартно зелёным:) только вот проблема почему то он каждую строчку дублирует зелёным,или как там правильно сказать)))

Поясните пожалуйста!
Я не туда вписал строчку?
intif_broadcast2(buf,strlen(buf) + 1, 0xD20000, 0x190, 12, 0, 0);
или это строка вообще не правильно написана:)?

Автор: Jarek: Дата: 04.15.2011

Наводка: А что по вашему делает clif_displaymessage ?

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

Цитата Jarek;38806:
Наводка: А что по вашему делает clif_displaymessage ?

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

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

Блин если я не достал всех:D,последний вопрос по теме:).
Вот что я намудрил:

ACMD_FUNC(wro)
{
char buf[2048], w1[2048], w2[2048];
int i, gm_level;
FILE* fp;
nullpo_retr(-1, sd);

memset(buf, '\0', sizeof(buf));

if ((fp = fopen(wro_txt, "r")) != NULL) {
intif_broadcast2("Команды сервера:",strlen("Команды сервера:"), 0xe70d41, 0x190, 12, 0, 0);
gm_level = pc_isGM(sd);
while(fgets(buf, sizeof(buf), fp) != NULL) {
if (buf[0] == '/' && buf[1] == '/')
continue;
for (i = 0; buf != '\0'; i++) {
if (buf == '\r' || buf == '\n') {
buf = '\0';
break;
}
}
if (sscanf(buf, "%2047[^:]:%2047[^\n]", w1, w2) < 2)
intif_broadcast2(buf,strlen(buf), 0x0de2e7, 0x190, 12, 0, 0);
else if (gm_level >= atoi(w1))
intif_broadcast2(w2,strlen(w2), 0x0de2e7, 0x190, 12, 0, 0);
}
fclose(fp);
} else {
clif_displaymessage(fd, msg_txt(27)); // File help.txt not found.
return -1;
}

return 0;
}

Заменил clif_displaymessage на intif_broadcast2
Вроде бы работает всё на ура!

Только сейчас понял что intif_broadcast2 отправляет глобальное сообщение на весь сервер,а кроме этого broadcast2 больше не где я не нашёл unsigned long fontColor (ну то есть это присутствует только там)
На сервере LazyRo вот что.

Мне кажется может они сделали подобие intif_broadcast2 только так чтоб не отправлял глобально а только тому кто эту команду ввёл в чат?
intif.c
int intif_broadcast2(const char* mes, int len, unsigned long fontColor, short fontType, short fontSize, short fontAlign, short fontY)
{
// Send to the local players
if (fontColor == 0xFE000000) // This is main chat message [LuzZza]
clif_MainChatMessage(NULL, mes);
else
clif_broadcast2(NULL, mes, len, fontColor, fontType, fontSize, fontAlign, fontY, ALL_CLIENT);

if (CheckForCharServer())
return 0;

if (other_mapserver_count < 1)
return 0; //No need to send.

WFIFOHEAD(inter_fd, 16 + len);
WFIFOW(inter_fd,0) = 0x3000;
WFIFOW(inter_fd,2) = 16 + len;
WFIFOL(inter_fd,4) = fontColor;
WFIFOW(inter_fd,8) = fontType;
WFIFOW(inter_fd,10) = fontSize;
WFIFOW(inter_fd,12) = fontAlign;
WFIFOW(inter_fd,14) = fontY;
memcpy(WFIFOP(inter_fd,16), mes, len);
WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
return 0;
}

Вопрос!
Что здесь надо изменить/удалить чтоб данная вещь не отправлял сообщение глобально?

Автор: imba: Дата: 04.22.2011

clif_broadcast2 - SELF

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

Цитата imba;39599:
clif_broadcast2 - SELF

Вы имеете в виду
clif_broadcast2(NULL, mes, len, fontColor, fontType, fontSize, fontAlign, fontY, ALL_CLIENT);
вместо ALL_CLIENT вставить SELF если да то не работает.:)

Автор: imba: Дата: 04.22.2011

В ф-ции ACMD_FUNC(wro):

intif_broadcast2(buf,strlen(buf), 0x0de2e7, 0x190, 12, 0, 0);

На
clif_broadcast2(&sd->bl,buf, strlen(buf) + 1, 0x0de2e7, 0x190, 12, 0, 0, SELF);

И так заменить все вызовы ф-ции intif_broadcast2. Дошло?

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

Цитата imba;39607:
В ф-ции ACMD_FUNC(wro):
intif_broadcast2(buf,strlen(buf), 0x0de2e7, 0x190, 12, 0, 0);

На
clif_broadcast2(&sd->bl,buf, strlen(buf) + 1, 0x0de2e7, 0x190, 12, 0, 0, SELF);

И так заменить все вызовы ф-ции intif_broadcast2. Дошло?

Да я всё понял:) Работает. :clap:
Спасибо большое.