Назад

Префикс в имени

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

Необходимо по завершению создания персонажа, к указанному имени добавлялся префикс. К примеру, я создаю персонажа, указываю имя "Архипоп" нажимаю "Ок". Создается персонаж с ником "Архипоп[G]" где "Архипоп"-имя указанное при создании, [G]-префикс добавленный после создания.

Возможно ли динамическое изменение имени в игре? Игрок выполняет некое действие в игре (убивает, умирает, проходит квест и т.д.) и к его основному имени прибавляется некий префикс без видимых перезагрузок?

[SPOILER="fakename()"]Собрал воедино, компилируется без ошибок, скрипт работает без ошибок.

BUILDIN_FUNC(fakename)
{
TBL_PC* sd = script_rid2sd(st);
char name[NAME_LENGTH];
const char* message = script_getstr(st,2);

if((!message || !*message) && strlen(sd->fakename) > 1) {
sd->fakename[0]='\0';
clif_charnameack(0, &sd->bl);
return 0;
}

if (!message || !*message || sscanf(message, "%23[^\n]", name) < 1) {

return 1;
}

if(strlen(name) < 2) {

return 1;
}

memcpy(sd->fakename,name,NAME_LENGTH);
sd->fakename[NAME_LENGTH-1] = '\0';
clif_charnameack(0, &sd->bl);

return 0;
}

Добавить в
struct script_function buildin_func[] = {

следующее
BUILDIN_DEF(fakename,"s"),
[/SPOILER]

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

Цитата Asuma;31548:
1. Поправьте запрос в char_sql/char.c

// validation success, log result
if (log_char) {
if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
"VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
charlog_db, "make new char", sd->account_id, slot, esc_name, str, agi, vit, int_, dex, luk, hair_style, hair_color) )
Sql_ShowDebug(sql_handle);
}


2. Реально, но вам придется обновлять базу данных и текущую память - что есть не хорошо.

Что значит обновлять? Если это обычный sql "UPDATE" то это не страшно =)

Автор: 10minutemail: Дата: 01.27.2011

Цитата FakeChel;31547:
Необходимо по завершению создания персонажа, к указанному имени добавлялся префикс. К примеру, я создаю персонажа, указываю имя "Архипоп" нажимаю "Ок". Создается персонаж с ником "Архипоп[G]" где "Архипоп"-имя указанное при создании, [G]-префикс добавленный после создания.

Возможно ли динамическое изменение имени в игре? Игрок выполняет некое действие в игре (убивает, умирает, проходит квест и т.д.) и к его основному имени прибавляется некий префикс без видимых перезагрузок?

Изменение в игре возможно, но игроку необходимо будет перезаходить после запроса на изменение имени в бд.
Так же надо будет изменить максимальное количество символов в таблице char у поля name.

Автор: Asuma: Дата: 01.27.2011

Ок, вы знаете что эмулятор синхронизирует свою память с базой данных?

Автор: Sanasol: Дата: 01.27.2011

нахер тут сорсы. есть скрипт на eathena.ws
Титулы выдает всякие.
Убил 20 бафо ты король бафо и т.д
http://www.eathena.ws/board/index.php?showtopic=252567&hl=title

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

В игре есть команда @fakename можно через нее попробовать сделать. Изменяемое имя в игре не обязательно сохранять в базе, пусть даже при пере-заходе оно возвращается к исходному.

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

Как сделать функцию fakename() по аналогии @fakename чтоб пользоваться в скриптах, а не через команду в игре и "atcommand"

BUILDIN_FUNC(fakename)
{
char name[NAME_LENGTH];
struct map_session_data* sd;
const char* message = script_getstr(st,2);
if((!message || !*message) && strlen(sd->fakename) > 1) {
sd->fakename[0]='\0';
clif_charnameack(0, &sd->bl);
return 0;
}

if (!message || !*message || sscanf(message, "%23[^\n]", name) < 1) {

return 1;
}

if(strlen(name) < 2) {

return 1;
}

memcpy(sd->fakename,name,NAME_LENGTH);
sd->fakename[NAME_LENGTH-1] = '\0';
clif_charnameack(0, &sd->bl);
//clif_displaymessage(sd->fd,"Fake name enabled.");

return 0;
}

компилируется без ошибок, а в игре не работает =\

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

Есть предложения?

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

Мап-сервер вообще ничего не пишет?
И да, тот код - что вы написали - всё, что вы добавили, или еще что-нибудь?

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

Цитата Jarek;33812:
Мап-сервер вообще ничего не пишет?
И да, тот код - что вы написали - всё, что вы добавили, или еще что-нибудь?


Добавил еще
BUILDIN_DEF(fakename,"s"),
в
struct script_function buildin_func[] = {}

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

Не обратил внимания на то, как вы обращаетесь с sd (Я удивляюсь, что компилятор даже ворнинга не выдал)

char name[NAME_LENGTH];
TBL_PC* sd;
const char* message = script_getstr(st,2);
sd = map_id2sd(st->rid);

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

Цитата Jarek;33816:
Не обратил внимания на то, как вы обращаетесь с sd (Я удивляюсь, что компилятор даже ворнинга не выдал)


прокомментируй пожалуйста, почему именно так?

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

#define ACMD_FUNC(x) int atcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message)

#define BUILDIN_FUNC(x) int buildin_ ## x (struct script_state* st)


В ACMD session_data сразу посылается в качестве аргумента
а в BUILDIN фукции нам надо её "вытащить" из script_state

Я думал, что это очевидно...


Кстати, туплю, можно проще
char name[NAME_LENGTH];
TBL_PC* sd = map_id2sd(st->rid);
const char* message = script_getstr(st,2);

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

Собрал воедино, компилируется без ошибок, скрипт работает без ошибок.

BUILDIN_FUNC(fakename)
{
TBL_PC* sd = script_rid2sd(st);
char name[NAME_LENGTH];
const char* message = script_getstr(st,2);

if((!message || !*message) && strlen(sd->fakename) > 1) {
sd->fakename[0]='\0';
clif_charnameack(0, &sd->bl);
return 0;
}

if (!message || !*message || sscanf(message, "%23[^\n]", name) < 1) {

return 1;
}

if(strlen(name) < 2) {

return 1;
}

memcpy(sd->fakename,name,NAME_LENGTH);
sd->fakename[NAME_LENGTH-1] = '\0';
clif_charnameack(0, &sd->bl);

return 0;
}

Добавить в
struct script_function buildin_func[] = {

следующее
BUILDIN_DEF(fakename,"s"),