• 0

/me /ame и прочие команды отыгрыша

Вопросы

из названия понятно, что мне нужно. сам я туповатый и эти команды у меня работают некорректно, так что нужен знающий человек :^)

Поделиться сообщением


Ссылка на сообщение

22 ответа на этот вопрос

  • 0

да, то что есть на форуме - не пашет полностью тоже

Отредактировано пользователем streetmeat

Поделиться сообщением


Ссылка на сообщение
  • 0

@streetmeat, ну, скидывайте, что вы именно пытаетесь вставить из форума, какие ошибки появляются в логах (если появляются), что еще интересного насчет команд этих.

Поделиться сообщением


Ссылка на сообщение
  • 0
2 минуты назад, odosenok сказал:

@streetmeat, ну, скидывайте, что вы именно пытаетесь вставить из форума, какие ошибки появляются в логах (если появляются), что еще интересного насчет команд этих.

команды брал из этой темы https://pawno-rus.ru/topic/3380-cmdkomandy-me-ame-do-todo-s-n-try-dlya-processora-dc_cmd/. взял /me (для примера) и переделал под свой мод, и получаю такую ошибку
https://imgur.com/a/9zLpYEd
пока другие не пробовал, но может тут ещё найду решение для будущих проблем (наверное)

Поделиться сообщением


Ссылка на сообщение
  • 0

@streetmeat, это ошибка табуляции. Потому что у вас не везде соблюдена табуляция. Весь код должен идти за красной линией (см. изображение). Однако, первая строчка стоит неправильно. Достаточно ее сдвинуть правее и все будет хорошо.

Спойлер

Безымянный.png

 

Поделиться сообщением


Ссылка на сообщение
  • 0
В 29.04.2020 в 22:53, odosenok сказал:

@streetmeat, это ошибка табуляции. Потому что у вас не везде соблюдена табуляция. Весь код должен идти за красной линией (см. изображение). Однако, первая строчка стоит неправильно. Достаточно ее сдвинуть правее и все будет хорошо.

  изображение (открыть спойлер)

Безымянный.png

 

я уже этим разобрался, но вылилась другая проблема - команда не работает
https://imgur.com/a/FttvUxv

 

вылилась новая проблема - не отображается никнейм когда пишешь отыгровку
https://imgur.com/a/R2pg5qT

Поделиться сообщением


Ссылка на сообщение
  • 0

АВТОМАТИЧЕСКИ СФОРМИРОВАННОЕ СООБЩЕНИЕ:

Данная тема была перемещена модерацией или администрацией портала PAWNO-RUS.RU! 

Перемещена из: "Магазин > Стол заказов"

Перемещена в: "Скриптинг PAWN > Вопросы / проблемы по скриптингу"

 

С уважением, ваш Бот! 

Если вы НЕ согласны с переносом данной темы в раздел "Скриптинг PAWN > Вопросы / проблемы по скриптингу", пожалуйтесь на это сообщение в жалобе указав причины вашего недовольства. Спасибо. 

 

Поделиться сообщением


Ссылка на сообщение
  • 0

Добавьте в OnPlayerConnect строку
 

GetPlayerName(playerid, PlayerInfo[playerid][NAME], sizeof PlayerInfo[playerid][NAME]);

 

Скорее всего её нет, поэтому в самой строке не хранится имя игрока.

Поделиться сообщением


Ссылка на сообщение
  • 0
3 часа назад, smvrtdev сказал:

Добавьте в OnPlayerConnect строку
 


GetPlayerName(playerid, PlayerInfo[playerid][NAME], sizeof PlayerInfo[playerid][NAME]);

 

Скорее всего её нет, поэтому в самой строке не хранится имя игрока.

https://imgur.com/a/ye94Hxx появились такие ошибки. щас попробую исправить, если не выйдет - отпишу

ошибки всё так же, ничего не поменялось

Поделиться сообщением


Ссылка на сообщение
  • 0

Дайте полный код команды, которая в Вашем моде.

Поделиться сообщением


Ссылка на сообщение
  • 0
1 час назад, smvrtdev сказал:

Дайте полный код команды, которая в Вашем моде.

CMD:me(playerid, params[])
{
	if(sscanf(params, "s[118]", params[0])) return SCM(playerid, COLOR_GREY, !"/me [действие]");
	new string[144];
	format(string, sizeof(string), "* %s %s", PlayerInfo[playerid][NAME], params[0]);
	ProxDetector(20.0, playerid, string, COLOR_ROSE, COLOR_ROSE, COLOR_ROSE, COLOR_ROSE, COLOR_ROSE);
	SetPlayerChatBubble(playerid, params[0], COLOR_ROSE, 20, 7500);
	return 1;
}

если было про /me

Поделиться сообщением


Ссылка на сообщение
  • 0

ProxDetector корректно работает в других случаях?

 

12 часов назад, streetmeat сказал:

https://imgur.com/a/ye94Hxx появились такие ошибки. щас попробую исправить, если не выйдет - отпишу

ошибки всё так же, ничего не поменялось

Вместо sizeof PlayerInfo[playerid][NAME] поставь sizeof(PlayerInfo[playerid][NAME])

Поделиться сообщением


Ссылка на сообщение
  • 0

@streetmeat sizeof можно использовать только для объектов, размер которых известен на момент компиляции. PlayerInfo[playerid][NAME] таким не является, так как зависит от переменной playerid, которая известна только на момент исполнения кода. 

вместо sizeof PlayerInfo[playerid][NAME] вставьте просто константу MAX_PLAYER_NAME

Поделиться сообщением


Ссылка на сообщение
  • 0
2 часа назад, DEST сказал:

@streetmeat sizeof можно использовать только для объектов, размер которых известен на момент компиляции. PlayerInfo[playerid][NAME] таким не является, так как зависит от переменной playerid, которая известна только на момент исполнения кода. 

вместо sizeof PlayerInfo[playerid][NAME] вставьте просто константу MAX_PLAYER_NAME

сработало)

вот ещё такой вопрос, но про /ame - как сделать так, чтобы самому игроку отправилось сообщение в чат? через scm (sendclientmessage)?

Поделиться сообщением


Ссылка на сообщение
  • 0
14 минут назад, streetmeat сказал:

сработало)

вот ещё такой вопрос, но про /ame - как сделать так, чтобы самому игроку отправилось сообщение в чат? через scm (sendclientmessage)?

Да.

Поделиться сообщением


Ссылка на сообщение
  • 0

https://imgur.com/a/pZ2My2r
 

CMD:ame(playerid, params[])
{
	new string[180];
	if(sscanf(params, "s[124]", params[0])) return SCM(playerid, COLOR_GREY, "/ame [äåéñòâèå]");
	SetPlayerChatBubble(playerid,string,COLOR_ROSE,30.0,5000);
	format(string, sizeof(string), "> %s", string);
	SCM(playerid, COLOR_ROSE, string);
    return 1;
}

ладно, где я зафакапился, что у меня ни отыгровка, ни ник игрока не отображается?

Поделиться сообщением


Ссылка на сообщение
  • 0

Ты отправляешь игроку и в проксдетектор string, а текст в params[0].

Поделиться сообщением


Ссылка на сообщение
  • 0
13 минут назад, povstanec сказал:

Ты отправляешь игроку и в проксдетектор string, а текст в params[0].

https://imgur.com/a/GE18m9I подправил, но ника нет. где ещё надо заменить?
 

CMD:ame(playerid, params[])
{
	new string[180];
	if(sscanf(params, "s[124]", params[0])) return SCM(playerid, COLOR_GREY, "/ame [действие]");
	SetPlayerChatBubble(playerid, params[0], COLOR_ROSE, 20, 5000);
	format(string, sizeof(string), "> %s", params[0]);
	SCM(playerid, COLOR_ROSE, string);
    return 1;
}

 

Поделиться сообщением


Ссылка на сообщение
  • 0

@streetmeat

Спойлер

CMD:me(playerid, params[])
{
	if (!params[0]) return SCM(playerid, COLOR_GREY, !"/me [действие]"); // если строка действия на передана, выведем сообщение
	
	new string[144]; // создадим переменную для хранения текста с действием игрока
	format(string, sizeof(string), "* %s %s", PlayerInfo[playerid][NAME], params[0]); // форматируем переменную
	ProxDetector(20.0, playerid, string, COLOR_ROSE, COLOR_ROSE, COLOR_ROSE, COLOR_ROSE, COLOR_ROSE); // выведем текст из string всем в радиусе 20.0
	SetPlayerChatBubble(playerid, params[0], COLOR_ROSE, 20, 7500); // выведем текст действия над головой игрока
	
	SendClientMessage(playerid, COLOR_ROSE, string); // выведем аналогичный текст, как в  ProxDetector, самому игроку
	return 1;
}

 

 

А Ваш вариант выше отправлял сообщение только Вам, не всем игрокам в некотором радиусе.

Поделиться сообщением


Ссылка на сообщение
  • 0
CMD:ame(playerid, params[])
{
	new string[180];
	if(sscanf(params, "s[124]", params[0])) return SCM(playerid, COLOR_GREY, "/ame [действие]");
	SetPlayerChatBubble(playerid, params[0], COLOR_ROSE, 20, 5000);
	format(string, sizeof(string), "> %s %s", PlayerInfo[playerid][NAME], params[0]);
	SCM(playerid, COLOR_ROSE, string);
    return 1;
}

 

Поделиться сообщением


Ссылка на сообщение
  • 0

@odosenok  и @povstanec  всё работает, спасибо)

Поделиться сообщением


Ссылка на сообщение
  • 0

и последний вопрос: как убрать в ми, ами и ду черту в нике между именем и фамилией?

Поделиться сообщением


Ссылка на сообщение
  • 0

@streetmeat, давайте я попробую здесь изложить ход рассуждений, чтобы Вы поняли, по какому принципу стоит решать подобные вопросы, а не брали постоянно готовый участок кода.

 

Замечание: не есть правильно каждый раз при использовании команд отыгровки RolePlay-ситуаций искать нижнее подчеркивание в имени игрока и заменять его пробелом. Как минимум, это нерационально. Лучше добавьте в массив игрока глобальную переменную (теперь у Вас будет две переменных: одна - OOC-характера (внеигровая), хранящая игровое имя в полном формате, например, First_Second, другая - игровая (IC-характера), например, First Name. Проводите инициализацию двух переменных при подключении игрока к серверу и работайте дальше напрямую с этими переменными.

 

Вернемся к тому, как убрать нижнее подчеркивание. Есть у Вас, например, некоторая переменная, в которую записан nick-name игрока (я использую имя Дениса Косякова, поскольку 1 мая, сегодня, - день его рождения):

new name[MAX_PLAYER_NAME+1] = "Denis_Kosyakov";

Как убрать нижнее подчеркивание? Необходимо найти его местонахождение программно. Для этого нужно поискать какую-нибудь функцию поиска символа в строке (или же функцию поиска подстроки в строке). Как пользователя поисковой системой Google? Первая же вкладка - WIKI-страничка. 

Читаем, как пользоваться функцией strfind, какие аргументы она принимает, что возвращает. И делаем аналогично:

// создаем переменную для хранения строки - имени пользователя
new name[MAX_PLAYER_NAME+1] = "Denis_Kosyakov";
// в переменную underline будет записан порядковый номер (с нуля) нижнего подчеркивания 
new underline = strfind(name, "_"); // name - где ищем, "_" - что ищем (нижнее подчеркивание)

Нашли? Отлично. Теперь думаем, как можно заменить нижнее подчеркивание другим символом (речь идет о пробеле). Здесь достаточно просто изменить значение ячейки массива, обратившись к ней по индексу.

// создаем переменную для хранения строки - имени пользователя
new name[MAX_PLAYER_NAME+1] = "Denis_Kosyakov";
// в переменную underline будет записан порядковый номер (с нуля) нижнего подчеркивания 
new underline = strfind(name, "_"); // name - где ищем, "_" - что ищем (нижнее подчеркивание)
// заменяем значение ячейки массива с индексом underline новым значением - пробелом
name[underline] = ' '; // теперь в переменной name ячейка underline содержит пробел

Можно пойти другим способом - перебирать все ячейки строки, пока не будет найден символ нижнего подчеркивания. Нашли? Отлично, заменяем его пробелом, как это сделано в примере выше.

new name[MAX_PLAYER_NAME+1] = "Denis_Kosyakov";

// создаем цикл for. Переменная i "пробегается" от 0 до MAX_PLAYER_NAME = 24
for (new i = 0; i < MAX_PLAYER_NAME; i++) {
	if (name[i] == '_') { // если символ в i-ой (итой) ячейке экивалентен нижнему подчеркиванию
		name[i] = ' '; // изменяем символ в i-ой ячейке на символ пробела
		break; // если мы нашли одно нижнее подчеркивание, то больше их не будет - иначе это не RP nick-name
	}
}

Конкретно я использовал бы второй способ. А так... Что хотите, то и используйте. Можете даже создать отдельную функцию, которая бы в переданном nick-name находила символ нижнего подчеркивания и возвращала nick-name уже без этого символа.

Спойлер

// следующий макрос необходимо добавить в начало мода
#if !defined isnull
    #define isnull(%1) ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
#endif

// функция ликвидации нижнего подчеркивания из ника игрока
stock DeleteUnderline(nick[]) {
	if (isnull(nick)) { // если nick - пустая строка
		return '\0'; // завершаем работу функции, возвращаем нуль-символ
	}
	
	// создадим результирующую строку (в нее будет записан ник без нижнего подчеркивания)
	new result[MAX_PLAYER_NAME+1];
	
	// создадим цикл, в котором будем перебирать все символы ника
	for (int i = 0, length = strlen(nick); i < length; i++) {
		result[i] = (nick[i] == '_') ? (' ') : (nick[i]);
	}
	
	return result;
}

 

 

Ну, и если использовать функцию, то выход будет примерно таким:

Спойлер

CMD:ame(playerid, params[])
{
	new string[180];
	if(sscanf(params, "s[124]", params[0])) return SCM(playerid, COLOR_GREY, "/ame [действие]");
	SetPlayerChatBubble(playerid, params[0], COLOR_ROSE, 20, 5000);
	format(string, sizeof(string), "> %s %s", DeleteUnderline(PlayerInfo[playerid][NAME]), params[0]);
	SCM(playerid, COLOR_ROSE, string);
    return 1;
}

 

 

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

Поделиться сообщением


Ссылка на сообщение
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • От MrNARTI
      всем привет можете пожалуйста подсказать с командой от анти слива /aban
       
      чтобы банило и администратора который использовал эту кмд и адм которого указал в айди. 
    • От MrNARTI
      всем привет.
       
      появился баг раньше не было.
       
      когда захожу должно появляться окно для адм авторизации но почему то перестало.
      так же когда когда ввожу /car  показывает что тс загружен хотя я его не загружал и у меня его вообще нет
       
      кто может помогите:
      тг: aboba_qq
       
    • От MrNARTI
      Всем привет! 
      Подскажите пожалуйста команду для переворота тс по айди тс.
       
      все делаю для крмп!
    • От pigeon
      доброго времени суток. делал квесты для самп сервера, при компиляции возникла ошибка (9230) : error 052: multi-dimensional arrays must be fully initialized. помогите, пожалуйста, я чайник. ошибка в строке 9230.
      P. S. на орфографию в квестах не обращайте внимания,  это не я писал.
       
       

    • От Tookie Johnson
      Здравствуйте, не будет ли у кого нибудь системы анти-толкания транспортного средства для всего сервера?