TagName
#1

Добрый день. Есть код, который по сути должен преобразовывать %0 > PlayerInfo[0][pName]. Если написать в чат %0 выведет без проблем имя. Если же ввести %0 и пробел, то выводит %0. Если же ввести %00, то Выведет 'Имя'0. Если ввести %0'Буква', то выводит %0'Буква'.
Если Ввести %00%0, то выводит %00'Имя'. Т.е. просто игнорит.. Что я сделал не так?
Код:
stock TagName(chat[])
{
	new text[256], length = strlen(chat), a = 0;
	strmid(text, chat, 0, length, 256);
	while(a < (length - 1))
	{
	    if(text[a]=='#' || text[a]=='@')
		{
			if(IsNumeric(text[a+1]))
			{
				new id, tmp[3];//3
				strmid(tmp, text, a+1, (IsNumeric(text[a+2])) ? a+3:a+2);//+3
				id = strval(tmp);
				if(IsPlayerConnected(id))
				{
					if(id < 10) strdel(text[a], 0, 2);
					else strdel(text[a], 0, 3);
					new NameText[60];
					format(NameText, 60, "{888888}%s (%d){ffffff}", PlayerInfo[id][pName], id);
					strins(text[a], NameText, 0);//0
					length += strlen(NameText);
					a += strlen(NameText);
					continue;
				}
				else a++;
			}
			else a++;
		}
		
	return text;
}
Reply
#2

http://gta-news.org/forum/53-215-1
Reply
#3

Всё это время система уже была... Блин, к черту всё.
Спасибо! Ты просто бог!)
Да-да, с маленькой..
Reply
#4

А у меня то почему игнорит @0@0?
Reply
#5

Ну что за изверги такие, быдло "программисты". OKStyle опять разочаровал.
Так сложно сделать простенькую, без лишнего де... маленькую функцию?

strlen, strmid, strins, strdel — зачем?

Все намного проще, компактнее и гораздо производительнее.

PHP код:
stock SearchCode(text[], size sizeof text)
{
    new 
x= -1sid[4];
    while(
text[++i]) if(text[i] == '@' && 47 text[i+1] < 58)
    {
        
i;
        do 
sid[x-i] = text[++x];
        while(
47 text[x] < 58 && 3);
        if(
IsPlayerConnected((sid[0] = strval(sid))))
        
format(text[i], size i"%s%s"pName[sid[0]], text[x+1]);
        
sid "   ";
    }

Reply
#6

Лол, только задача совсем другая И что за pName? И ошибка при компиляции, кто же у неопознанного аргумента size получает? Ай-яй-яй... У меня код самодостаточный, без всяких функций. И рабочий. А у тебя ещё надстройку придётся делать. Так что ты держишься на том же уровне в моих глазах. И я не тёлка, чтобы тебя очаровывать)
Reply
#7

Quote:
Originally Posted by OKStyle
Посмотреть сообщение
Лол, только задача совсем другая И что за pName? И ошибка при компиляции, кто же у неопознанного аргумента size получает? Ай-яй-яй... У меня код самодостаточный, без всяких функций. И рабочий. А у тебя ещё надстройку придётся делать. Так что ты держишься на том же уровне в моих глазах. И я не тёлка, чтобы тебя очаровывать)
Ну что, поехали...

Предоставленная мною версия имеет возможностm использоваться не только в OnPlayerText.
Понимающий человек, знает, что длинна строки text[] в отзыве OnPlayerText равна 144 символа, дописываем в ручную второй аргумент, 144 — ошибка устранена. Легко, правда? А сам додуматься не мог

Идем дальше, что такое pName?
Интеллектуально отсталым не понять, сожалею, но я помогу тебе разобраться в этом сложном вопросе.
Человек, следящий за производительностью не станет каждый раз узнавать имя, а сделает это один раз при подключении игрока, сохранив в глобальную переменную. Что то мне не видно смысла, каждый раз по новой узнавать.
Может ты найдешь?

"Держишься на том же уровне в моих глазах" — спасибо, я знаю, что давно и далеко ушел вперед тебя


Раз ты не умеешь сидеть тихо, пошли разбирать твой код:
PHP код:
new PlayerName[MAX_PLAYER_NAME]; // объявили локальное хранилище, потратили десятые миллисекунд
for(new strfind(text"@"true), 0tmp[4]; != -1strfind(text"@"truei)) // используем samp функцию, теряем скорость
{
    ++
i0;
    while(
48 <= text[i] <= 57 && != 4tmp[a++] = text[i++];
    if(
tmp[0] == EOS) continue; // задействовали не нужную проверку, ниже опишу почему
    
GetPlayerName(strval(tmp), PlayerNamesizeof(PlayerName)); // вот это вообще бред, тысячи раз узнавать имя
    
strdel(text1i); // используем samp функцию, теряем скорость
    
strins(textPlayerName1128); // используем samp функцию, теряем скорость

и того каждый цикл 100% используем strfind, в каждом выполнении цикла используем по 3 функции:
GetPlayerName, strdel, strins.
Ну и вот подошел момент указать на важнейшие ошибки кода.

Не очищаешь tmp по окончанию цикла, а это значит, если первый id был 53, а второй 4,
мы будем второй раз узнавать имя не 4 id, а 43!
От этого и проверка tmp[0] == EOS не имеет смысла.
А ведь ты не подумал об этом, правда?
Потому что не можешь, не развиваешься, а только говоришь, говоришь, хвастаешься,
чем попало и не признаешь действительно хороших, продуманных работ.

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

Показать ещё ошибочку? Да без проблем, лови.
В проверке a != 4 мы позволяем использовать 4 символа! Что это значит?
Игрок может ввести число 9999, а в samp максимальный id это 999, но нам же наплевать, правда? И так сойдет.
И сразу назревает дополнительная ошибка!
Размер tmp 3 ячейки, четвертая никогда не используется.
Если ввести число 9999, мы выйдем за границы массива и дай бог
стоит crashdetect, который скажет OKStyle об этом.



Лучше не отвечай на это сообщение, если конечно стул ещё не прогорел
А может повезет, Stepashka как обычно что то подотрет.

Reply
#8

Quote:
Originally Posted by SoNikMells
Посмотреть сообщение
// используем samp функцию, теряем скорость
Жжёшь, пиши ещё!
Reply
#9

Stepashka, поясни, я что то написал не так?
Reply
#10

Quote:
Originally Posted by SoNikMells
Посмотреть сообщение
Stepashka, поясни, я что то написал не так?
Я процитировал то что ты написал не так.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)