• 0
streetmeat

/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 пользователей онлайн

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

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

    • Mister Odin
      От Mister Odin
       
      new
       g_teleport_list[39][E_TELEPORT_LIST] = {  {"Спавн пгт.Батырево", 1802.3612, 2508.4824, 15.8887},  {"Спавн г.Арзамас", -113.5887, 977.7222, 12.0346},     {"Спавн г.Южный", 2744.2770, -2446.7246, 21.8988},     {"Центральный банк", 1852.020385,2040.791381,15.892713},  {"Рублёвка", -837.7783, 888.6161, 12.7232},  {"Казино", 1332.4252, 2358.7014, 17.6641},  {"Битва за контейнеры", 614.5167, 1722.3566, 12.0709},  {"Автосалон низкого класса", 2493.9616, -722.9544, 12.3315},  {"Автосалон среднего класса", 1407.7449, 455.4801, 13.1630},  {"Автосалон высокого класса", -14.0637, 2614.5664, 10.9892},   {"Мотосалон Harley Davidson", 785.720153, 750.465087, 12.000024},  {"Автошкола", 1909.174438,2227.679687,15.708162},  {"Военкомат", 1916.778564,2302.411376,15.574637},  {"Правительство области", -139.140975,593.789611,12.145712},  {"Отдел полиции №1 (ГИБДД)", 1906.805786,-2234.382812,11.257631},  {"Отдел полиции №2 (УМВД)", 2581.309326,-2416.139892,21.960090},  {"Отдел ФСБ", 1823.904663,2095.636718,15.848405},  {"Городская больница г.Арзамас", -285.797210,581.851562,12.120290},   {"СМИ", -317.708038,821.221679,13.051450},  {"Воинская часть", 1703.197265,1678.025878,15.279437},  {"Арзамасская ОПГ", 438.705322,1046.505126,12.002637},  {"Батыревская ОПГ", 1941.203857,2161.006591,15.705187},  {"Лыткаринская ОПГ", -2346.002441,75.257041,21.002962},  {"Шахта", 2381.5727, 1726.4451, -2.1506},  {"Завод", -1062.6697, 2204.1894, 38.0964},  {"Инкосация", 1864.1374, 2011.7136, 15.8546},  {"Транспортная Компания", 2362.1115, 1972.5627, 15.5530},  {"База механиков", 1840.918090,-118.025146,15.695312},  {"Курьерская служба доставки", 2764.509765,-2396.882568,21.890625},  {"Аренда автобуса(Южный)", 2771.041992,-2454.780761,21.845964},  {"Аренда автобуса(Арзамас)", -127.487670,943.652648,12.142824},   {"Аренда автобуса(Батырево)", 1798.986328,2529.591552,15.664262},  {"Гоночная трасса", -1568.7784, 1611.8305, 36.3971},  {"Дом на горе", -789.5397, -456.7479, 741.1422},  {"СТО и тюнинг-ателье", 1856.1375, -122.3266, 15.6888},  {"Аренда транспорта пгт.Батырево", 1763.641723,2255.673339,15.865348},  {"Аренда транспорта г.Арзамас", -36.923530,1360.673583,12.002090},  {"Аренда транспорта г.Южный", 1966.599975,-2603.943603,10.820312},  {"Тайный интерьер в Лыткарино", -2424.5818, 2846.3291, 40.7908} };
    • Garnik
      От Garnik
      ERRORS:
      : error 017: undefined symbol "HouseInfo"
      : error 017: undefined symbol "OWNABLEHOUSES"
      : error 029: invalid expression, assumed zero
      : fatal error 107: too many error messages on one line
      ===============================================================================================================
       
       
      ================================================================================================================
      CMD:addhouse(playerid,params[])
      {
              if(PI[playerid][pAdmin] < 10)return false;
              new string[650];
              new house_class, house_price;
              new Float:X, Float:Y, Float:Z, Float:A;
              if(sscanf(params, "ii", house_class,house_price))
              {
                      SendClientMessage(playerid, -1, "???????????: /addhouse [????? ??????] [???? ???????]");
                      SendClientMessage(playerid, -1, "??????: [1 - ??????-?????] [2 - ???????-?????] [3 - ???????-?????] [4 - ???????-?????]");
                      return 1;
              }
              if(house_class > 4 || house_class < 1)
              {
                      SendClientMessage(playerid, -1, "ID ????????? ?? 1 ?? 4");
                      return 1;
              }
              //
              GetPlayerPos(playerid,X,Y,Z);
              GetPlayerFacingAngle(playerid,A);
              HouseInfo[OWNABLEHOUSES][hEnter_X]=X;
              HouseInfo[OWNABLEHOUSES][hEnter_Y]=Y;
              HouseInfo[OWNABLEHOUSES][hEnter_Z]=Z;
              HouseInfo[OWNABLEHOUSES][hEnter_A]=A;
              HouseInfo[OWNABLEHOUSES][hKlass]=house_class;
              HouseInfo[OWNABLEHOUSES][hCost]=house_price;
              string="";
              strmid(HouseInfo[OWNABLEHOUSES][hOwner],"The State",0,strlen("The State"),28);
              format(string, 144, "?? ??????? ??????? ??? ????? {e7e7e7}%d {ffffff}????????? ???????: {e7e7e7}%d",OWNABLEHOUSES+1,HouseInfo[OWNABLEHOUSES][hCost]);
              SendClientMessage(playerid,-1,string);
              //
              string="";
              format(string,1500,"INSERT INTO `houses`(`ID`,`Enter_X`, `Enter_Y`, `Enter_Z`, `Enter_A`,`Exit_X`, `Exit_Y`, `Exit_Z`, `Owner`, `Cost` , `Klass`, `Interior`, `Level`) VALUES ('%d','%.2f','%.2f','%.2f','%.2f','267.1','305','999.148','The State','%d','%d','2','1')",
              OWNABLEHOUSES+1,HouseInfo[OWNABLEHOUSES][hEnter_X],HouseInfo[
              OWNABLEHOUSES][hEnter_Y],HouseInfo[OWNABLEHOUSES][hEnter_Z]
              ,HouseInfo[OWNABLEHOUSES][hEnter_A],HouseInfo[OWNABLEHOUSES]
              [hCost],HouseInfo[OWNABLEHOUSES][hKlass]);
              mysql_tquery(mysql, string);
              OWNABLEHOUSES++;
              return 1;
      }
       0
       Ответить
    • Garnik
      От Garnik
      ERRORS:
      : error 017: undefined symbol "HouseInfo"
      : error 017: undefined symbol "OWNABLEHOUSES"
      : error 029: invalid expression, assumed zero
      : fatal error 107: too many error messages on one line
      ===============================================================================================================
       
       
      ================================================================================================================
      CMD:addhouse(playerid,params[])
      {
              if(PI[playerid][pAdmin] < 10)return false;
              new string[650];
              new house_class, house_price;
              new Float:X, Float:Y, Float:Z, Float:A;
              if(sscanf(params, "ii", house_class,house_price))
              {
                      SendClientMessage(playerid, -1, "???????????: /addhouse [????? ??????] [???? ???????]");
                      SendClientMessage(playerid, -1, "??????: [1 - ??????-?????] [2 - ???????-?????] [3 - ???????-?????] [4 - ???????-?????]");
                      return 1;
              }
              if(house_class > 4 || house_class < 1)
              {
                      SendClientMessage(playerid, -1, "ID ????????? ?? 1 ?? 4");
                      return 1;
              }
              //
              GetPlayerPos(playerid,X,Y,Z);
              GetPlayerFacingAngle(playerid,A);
              HouseInfo[OWNABLEHOUSES][hEnter_X]=X;
              HouseInfo[OWNABLEHOUSES][hEnter_Y]=Y;
              HouseInfo[OWNABLEHOUSES][hEnter_Z]=Z;
              HouseInfo[OWNABLEHOUSES][hEnter_A]=A;
              HouseInfo[OWNABLEHOUSES][hKlass]=house_class;
              HouseInfo[OWNABLEHOUSES][hCost]=house_price;
              string="";
              strmid(HouseInfo[OWNABLEHOUSES][hOwner],"The State",0,strlen("The State"),28);
              format(string, 144, "?? ??????? ??????? ??? ????? {e7e7e7}%d {ffffff}????????? ???????: {e7e7e7}%d",OWNABLEHOUSES+1,HouseInfo[OWNABLEHOUSES][hCost]);
              SendClientMessage(playerid,-1,string);
              //
              string="";
              format(string,1500,"INSERT INTO `houses`(`ID`,`Enter_X`, `Enter_Y`, `Enter_Z`, `Enter_A`,`Exit_X`, `Exit_Y`, `Exit_Z`, `Owner`, `Cost` , `Klass`, `Interior`, `Level`) VALUES ('%d','%.2f','%.2f','%.2f','%.2f','267.1','305','999.148','The State','%d','%d','2','1')",
              OWNABLEHOUSES+1,HouseInfo[OWNABLEHOUSES][hEnter_X],HouseInfo[
              OWNABLEHOUSES][hEnter_Y],HouseInfo[OWNABLEHOUSES][hEnter_Z]
              ,HouseInfo[OWNABLEHOUSES][hEnter_A],HouseInfo[OWNABLEHOUSES]
              [hCost],HouseInfo[OWNABLEHOUSES][hKlass]);
              mysql_tquery(mysql, string);
              OWNABLEHOUSES++;
              return 1;
      }