Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: Как присвоить id выбранного игрока - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

Перейти к содержимому

  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Pawn ]
Как присвоить id выбранного игрока

#11
Пользователь офлайн   Lesnik 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию
Спасибо DeimoS, помог! + дал :)

Сообщение отредактировал Lesnik: 17 октября 2020 - 15:44

0

#12
Пользователь офлайн   execution88 

  • Прохожий
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDeimoS (17 октября 2020 - 12:28) писал:

Эмм, за чем следить? Ты текст в диалогах пишешь будучи в алкогольном угаре или что? Почему нужно следить за чем-то, что ты сам продумываешь и сам пишешь?
Ну и да: если просто выводить ID игрока в одном и том же стиле постоянно (например: "[ID: %d]"), то и код будет универсальным для всех случаев. Можно даже код будет упрятать в функцию, в которую уже будет передаваться текст и которая будет возвращать получаемый ID.


Если я изменю текст или ещё что-то, то мне придётся и менять формулу определения ID.

Просмотр сообщенияDeimoS (17 октября 2020 - 12:28) писал:

Действительно: создавать массив на 1000000 ячеек - это не костыльно, а двумя вызовами strfind получать нужные данные из строки, которую сервер в любом случае будет передавать - костыльно. Логично (нет).

Не понял только, откуда мы 1_000_000 ячеек получили.

Просмотр сообщенияDeimoS (17 октября 2020 - 12:28) писал:

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

Если назвать адекватно функции получения/установки значений - никаких проблем и близко не будет. Так можно сказать абсолютно обо всех случаях (забыли что-то дописать/лишний раз вызвали - вот и баг).

Сообщение отредактировал execution88: 17 октября 2020 - 17:27

0

#13
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияexecution88 (17 октября 2020 - 17:25) писал:

Если я изменю текст или ещё что-то, то мне придётся и менять формулу определения ID.


Каким образом ты собрался изменять написание ID?) И зачем тебе это вдруг понадобиться?
И даже если вдруг понадобиться, то всё, что тебе нужно - просто скопировать ту часть текста, которая идёт до спецификатора ID игрока, и вставить её в strfind + то же самое сделать для символов после спецификатора. Ну и "+1" заменить на количество символов, которые ты вставил в первый strfind. Всё. Никаких сложных подсчётов или чего-либо ещё.

Если же ты просто решишь что-то дописать в строку, не меняя ту часть, которая связана с отображением ID игрока - "формулу" трогать не придётся.


Вот тебе даже готовая функция для упрощённого изменения паттернов:
main()
{
    new inputtext[] = "DeimoS [ID: 666]: Привет";
    new id = ExtractPlayerIDFromString(inputtext, "[ID: ", "]");
    printf("ID: %d", id);
}

stock ExtractPlayerIDFromString(const text[], const pattern_1[], const pattern_2[])
{
    if(isnull(text))
    {
        return INVALID_PLAYER_ID;
    }
    new id_buff[4];
    id_buff[0] = strfind(text, pattern_1)+strlen(pattern_1);
    if(id_buff[0] == -1)
    {
        return INVALID_PLAYER_ID;
    }
    id_buff[1] = strfind(text, pattern_2, false, id_buff[0]);
    if(id_buff[1] == -1)
    {
        return INVALID_PLAYER_ID;
    }
    strmid(id_buff, text, id_buff[0], id_buff[1], 11);
    return strval(id_buff);
}


Просмотр сообщенияexecution88 (17 октября 2020 - 17:25) писал:

Не понял только, откуда мы 1_000_000 ячеек получили.


Из твоего же кода?
У тебя двухмерный массив, каждая мера которого равна MAX_PLAYERS. MAX_PLAYERS таит в себе число "1000".
Соответственно, у тебя есть 1000 ячеек, для каждой из которых создаётся ещё по 1000 ячеек.
1000*1000 = 1000000 ячеек.

Просмотр сообщенияexecution88 (17 октября 2020 - 17:25) писал:

Если назвать адекватно функции получения/установки значений - никаких проблем и близко не будет.


Эмм, какие функции? Если ты предлагаешь для каждого такого диалога создавать свой массив, то это самый гениальный способ растранжирить всю оперативную память :yes:

Просмотр сообщенияexecution88 (17 октября 2020 - 17:25) писал:

Так можно сказать абсолютно обо всех случаях (забыли что-то дописать/лишний раз вызвали - вот и баг).


Так а кто-ж с этим спорит? Я тебе лишь говорю, что ты создаёшь дополнительное проблемное место своим кодом, хотя есть более простой и действенный вариант, который не имеет всех перечисленных проблем.

Сообщение отредактировал DeimoS: 17 октября 2020 - 18:04

0

#14
Пользователь офлайн   execution88 

  • Прохожий
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDeimoS (17 октября 2020 - 18:03) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


Несомненно, если бы выделял я столько памяти лишь для этого диалога и лишь для хранения ID игроков - ты был бы прав.
Я же рассматриваю как универсальное использование для всех диалогов и установки различных значений, дабы каждый раз не изобретать велосипед.
0

#15
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияexecution88 (17 октября 2020 - 20:15) писал:

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


И тем самым ты делаешь свой код менее читаемым, ибо если решишь отследить в какой момент в твой массив PlayerListitem попадают данные - не получится просто взять название массива и парой нажатий найти все места использования в конкретной системе.

Ты либо троллишь, либо не разбираешься в том, о чём говоришь. В любом случае предлагаю закончить этот диалог. Если тебе больше нравится выделять кучу памяти и прописывать вызов массивов в нескольких местах, усложняя читаемость и поддержку кода - пожалуйста, я тебе не запрещаю. Но не нужно придумывать какую-то сложность для моего способа, которой в нём нет. Даже если ты вдруг решишь раз в год изменить текст диалога, у тебя займёт 30 секунд составление новой "формулы". Выделять 4 мегабайта памяти ради того, чтоб однажды, возможно сэкономить 30 секунд своего времени - это наиглупейшее решение, как по мне. Но ты вправе делать так, как тебе хочется.
0

Поделиться темой:


  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика