• 0

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

Question

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

Share this post


Link to post

22 answers to this question

  • 0

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

Edited by streetmeat

Share this post


Link to post
  • 0

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

Share this post


Link to post
  • 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
пока другие не пробовал, но может тут ещё найду решение для будущих проблем (наверное)

Share this post


Link to post
  • 0

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

Спойлер

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

 

Share this post


Link to post
  • 0
В 29.04.2020 в 22:53, odosenok сказал:

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

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

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

 

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

 

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

Share this post


Link to post
  • 0

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

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

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

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

 

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

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

 

Share this post


Link to post
  • 0

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

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

 

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

Share this post


Link to post
  • 0
3 часа назад, smvrtdev сказал:

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


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

 

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

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

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

Share this post


Link to post
  • 0

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

Share this post


Link to post
  • 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

Share this post


Link to post
  • 0

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

 

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

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

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

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

Share this post


Link to post
  • 0

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

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

Share this post


Link to post
  • 0
2 часа назад, DEST сказал:

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

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

сработало)

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

Share this post


Link to post
  • 0
14 минут назад, streetmeat сказал:

сработало)

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

Да.

Share this post


Link to post
  • 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;
}

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

Share this post


Link to post
  • 0

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

Share this post


Link to post
  • 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;
}

 

Share this post


Link to post
  • 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;
}

 

 

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

Share this post


Link to post
  • 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;
}

 

Share this post


Link to post
  • 0

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

Share this post


Link to post
  • 0

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

Share this post


Link to post
  • 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;
}

 

 

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

Share this post


Link to post
This topic is now closed to further replies.
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By def
      arizona.pwn(23374) : error 012: invalid function call, not a valid address
      arizona.pwn(23374) : error 001: expected token: ";", but found ")"
      arizona.pwn(23374) : error 029: invalid expression, assumed zero
      arizona.pwn(23374) : fatal error 107: too many error messages on one line
      жалуется на данную строчку:
       
      %s{cccccc}Для продолжения нажмите 'Далее'",PN(playerid),playerid,ItemsInfo[itemid][ItemName2],hours,cost*hours,Inventory[playerid][2][slot], AksColorName(Inventory[playerid][4][slot]), Inventory[playerid][5][slot] ? GetNameStripe(Inventory[playerid][5][slot]) : "");  
    • By d7.KrEoL
      Datalink filterscript - передача тактической информации об игроках на карту sampmap.ru
      Скачать файл Данный скрипт позволяет передавать информацию об игроках на тактическую карту проекта sampmap. Управление функциями через RCON команды, сам скрипт хоть и полностью готов к использованию, но скорее является примером, на его основе можно писать свои системы для взаимодействия с тактической картой.
      Тактическая карта проекта sampmap - это подобие даталинк системы, которая позволяет координировать действия отряда, либо просто отслеживать местоположение игроков в режиме радара. Для каждого переданного в datalink систему (на тактическую карту) игрока выводится его основная информация о скорости, азимуте, высоте, величине и направлении вектора скорости, а так же принадлежность свой/чужой
      Несколько скринов:
       
       
      Архивы:
       
      Исходники:
       
      Команды (ркон) для dlink:
      Помимо серверной версии скрипта существуют так же клиентские для обычного клиента с moonloader и для RakSAMP Lite бота. Все эти скрипты распространяются по открытой лицензии MIT, здесь находится git с исходниками. Проект открыт для ваших предложений относительно кода, или дальнейшего развития, вы можете оставить свои предложения на официальной странице github.






      Добавил d7.KrEoL Добавлено 09.12.2024 Категория Скрипты Автор d7.KrEoL  
    • By d7.KrEoL
      Данный скрипт позволяет передавать информацию об игроках на тактическую карту проекта sampmap. Управление функциями через RCON команды, сам скрипт хоть и полностью готов к использованию, но скорее является примером, на его основе можно писать свои системы для взаимодействия с тактической картой.
      Тактическая карта проекта sampmap - это подобие даталинк системы, которая позволяет координировать действия отряда, либо просто отслеживать местоположение игроков в режиме радара. Для каждого переданного в datalink систему (на тактическую карту) игрока выводится его основная информация о скорости, азимуте, высоте, величине и направлении вектора скорости, а так же принадлежность свой/чужой
      Несколько скринов:
       
       
      Архивы:
       
      Исходники:
       
      Команды (ркон) для dlink:
      Помимо серверной версии скрипта существуют так же клиентские для обычного клиента с moonloader и для RakSAMP Lite бота. Все эти скрипты распространяются по открытой лицензии MIT, здесь находится git с исходниками. Проект открыт для ваших предложений относительно кода, или дальнейшего развития, вы можете оставить свои предложения на официальной странице github.






    • By Мемен Томорли
      Как сделать табличку после бана аккаунта? Типо как на малиновке, когда тебя банят, выдают табличку(скрин приложил), и при входе на сервер такую же табличку давало??