Перейти к содержанию

Помогите с добавлением команды Админа


Рекомендуемые сообщения

Может кто подсказать как создать команду для админа дополнительную?

Суть команды в том, чтобы обычный игрок мог просмотреть какое кол-во на сервере определенной вещи.

К примеру:

@howmuch "Ghostring Card" - показывает сколько на сервере карт Гостринга

@howmuch 2199 - показывает солько на сервере Ahura Mazdah.

Данная команда должна быть на каждом сервере, чтобы игрок был уверен в честности Администрации.

Ссылка на комментарий
Поделиться на другие сайты

Можно сделать через bindatcmd. Если у тебя rAthena.

Задать команду, и через базу вытаскивать кол-во вещей.

Только помни что стандартно в массив помещается 128 элементов.

Можно изменить, гайд где-то был.

Ссылка на комментарий
Поделиться на другие сайты

Открываем (папка с эмулятором)/src/map/pc.h

Ищем:


int npc_timer_id; //For player attached npc timers. [Skotlex]
unsigned int chatID;
time_t idletime;

Добавляем:


int npc_timer_id; //For player attached npc timers. [Skotlex]
unsigned int chatID;
time_t idletime;
time_t howmuch_tick;

Далее.

Открываем (папка с эмулятором)/src/map/atcommand.c

Ищем:


static const char* atcommand_help_string(const char* command)
{
...
}

Добавляем после:


ACMD_FUNC(howmuch)
{
char item[100];
int i, j, cardnum, item_count = 0;
char* data;
struct item_data *id;
const char* tables[] = { "inventory", "storage", "cart_inventory" };
nullpo_retr(-1, sd);

if (DIFF_TICK(sd->howmuch_tick, gettick()) > 0)
{
sprintf(atcmd_output, "You can use @howmuch after %d seconds.", DIFF_TICK(sd->howmuch_tick, gettick()) / 1000);
clif_displaymessage(fd, atcmd_output);
return -1;
}

if (!message || !*message || (sscanf(message, "\"%99[^\"]\"", item) < 1 && sscanf(message, "%99s", item) < 1)) {
clif_displaymessage(fd, "Please, enter an item name/id (usage: @howmuch <item name or ID>).");
return -1;
}

if ((id = itemdb_searchname(item)) == NULL && (id = itemdb_exists(atoi(item))) == NULL)
{
clif_displaymessage(fd, "Invalid item ID or name.");
return -1;
}

for (i = 0, j = 0; i < ARRAYLENGTH(tables); j = 0)
{
if (itemdb_type(id->nameid) == IT_CARD)
{
for (cardnum = 0; cardnum < 4; cardnum++)
{
if ((Sql_Query(mmysql_handle, "SELECT * FROM `%s` WHERE `card%d` = %d;", tables[i], cardnum, id->nameid) != SQL_SUCCESS))
{
Sql_ShowDebug(mmysql_handle);
return 0;
}
item_count += (int)Sql_NumRows(mmysql_handle);
}
}

if ((Sql_Query(mmysql_handle, "SELECT `amount` FROM `%s` WHERE `nameid` = %d;", tables[i++], id->nameid) != SQL_SUCCESS))
{
Sql_ShowDebug(mmysql_handle);
return 0;
}

while (SQL_SUCCESS == Sql_NextRow(mmysql_handle) && j < Sql_NumRows(mmysql_handle))
{
Sql_GetData(mmysql_handle, 0, &data, NULL);
item_count += atoi(data);
j++;
}
}

sd->howmuch_tick = 30000 + gettick();
sprintf(atcmd_output, "Total count : %d | Item id : %d ('%s'[%d])", item_count, id->nameid, id->jname, id->slot);
clif_displaymessage(fd, atcmd_output);
return 0;

}

Ищем ниже:


...
ACMD_DEF(clonestat),
};
...

Добавляем:


...
ACMD_DEF(clonestat),
ACMD_DEF(howmuch),
};
...

Думаю как-то так. :)

Изменено пользователем Nurkz
  • Upvote 2
Ссылка на комментарий
Поделиться на другие сайты

А куда и в какие файлы кидать скрипт то?)

Плюсики обоим за отзывчивость)

src/map/atcommand.c

Большой кусок вбивай по примеру остальных.

Последний мелкий ACMD_DEF(howmuch) в AtCommandInfo atcommand_base[] = { так же как и остальные.

Ещё не забудь в conf/groups.txt выставить чтоб обычным игрокам было юзабельно.

Изменено пользователем INSTIGATOR
Ссылка на комментарий
Поделиться на другие сайты

Обновил пост, добавил timetick на 30 секунд, чтобы не нагружали сервер запросами в базу.

Но ставить на сервера с большим онлайном всё равно не советую, хотя ваше дело. :)

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...
Яндекс.Метрика