Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 11
  1. #1
    Аватар для Alexey_Nikiforov
    Уровень знаний 1

    Статус
    Оффлайн
    Регистрация
    12.02.2016
    Сообщений
    61
    Репутация:
    1 ±

    [CMD] Использование ID и имени игрока в командах.

    Как сделать что бы можно было использовать для выполнения команды как ID игрока так и его имя.
    В данном случае указано ID и имя.
    Но работает не так как нужно.
    PHP код:
    CMD:sethp(playerid,params[]){    
        new 
    str[50],playahealth;    
        if(
    sscanf(params,"ui",playahealth)) return SCM(playeridCOLOR_WHITE,"Используйте: /sethp [id/имя][кол-во жизней]");
        if(
    health || health 100) return SCM(playeridCOLOR_GREY"Нельзя дать менее 0 и более 100 жизней.");
        if(!
    IsPlayerConnected(playa)) return SCM(playeridCOLOR_WHITE"Игрок не в сети");
        
    format(str,sizeof(str), "%s установил вам жизней %d",pInfo[playerid][pName],health);
        
    SetPlayerHealth(playa,float(health));
        
    SCM(playa,COLOR_WHITEstr);
        return 
    1;

    Суть проблемы заключается в том что если написать вот так.
    /sethp A 0

    Эта команда убъет всех игроков у кого имя начинается на A
    Как сделать что бы считывало ники игроков на сервере.
    И если не найдет совпадения писало что игрок не в сети.
    Последний раз редактировалось Alexey_Nikiforov; 24.02.2016 в 20:17.

  2. #2
    Аватар для BadPawn
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.01.2016
    Адрес
    Приморье, Спасск-Дальний
    Сообщений
    165
    Репутация:
    7 ±
    U - ид и имя игрока. Все верно.

    Если нет эффекта, то попробуй не через созданную переменную, а по стандарту params[0].

    Так же, вместо создания переменных для хранения ида игрока, лвл, уровень и т.д. в командах, советую просто дефайнить. Проще ведь)

    После if.sscanf.params."ud".params0.params1 п шем следующее:
    PHP код:
    #define id params[0] 
    В конце команды до return 1:
    PHP код:
    #undef id 
    Последний раз редактировалось BadPawn; 24.02.2016 в 19:26.

  3. #3
    Аватар для Alexey_Nikiforov
    Уровень знаний 1

    Статус
    Оффлайн
    Регистрация
    12.02.2016
    Сообщений
    61
    Репутация:
    1 ±
    Подредактировал вопрос.

  4. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от BadPawn Посмотреть сообщение
    U - ид и имя игрока. Все верно.

    Если нет эффекта, то попробуй не через созданную переменную, а по стандарту params[0].

    Так же, вместо создания переменных для хранения ида игрока, лвл, уровень и т.д. в командах, советую просто дефайнить. Проще ведь)

    После if.sscanf.params."ud".params0.params1 п шем следующее:
    PHP код:
    #define id params[0] 
    В конце команды до return 1:
    PHP код:
    #undef id 
    Просвещение здесь
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  5. #5
    Аватар для Alexey_Nikiforov
    Уровень знаний 1

    Статус
    Оффлайн
    Регистрация
    12.02.2016
    Сообщений
    61
    Репутация:
    1 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    До туда мало кто доходит =)

  6. #6
    Аватар для _lizard
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.02.2016
    Адрес
    Геленджик
    Сообщений
    193
    Репутация:
    26 ±
    На будущее, здоровье хранится в переменных типа Float
    Последний раз редактировалось _lizard; 24.02.2016 в 20:46.

  7. #7
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Цитата Сообщение от _lizard Посмотреть сообщение
    На будущее, здоровье хранится в переменных типа Float
    Ну так он чтобы не писать в команде 100.0 пишет 100 и округляет во Float уже в SetPlayerHealth..
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  8. #8
    Аватар для _lizard
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.02.2016
    Адрес
    Геленджик
    Сообщений
    193
    Репутация:
    26 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    Ну так он чтобы не писать в команде 100.0 пишет 100 и округляет во Float уже в SetPlayerHealth..
    DC писал статью по этому поводу уже и объяснял, почему это плохо

  9. #9
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от _lizard Посмотреть сообщение
    DC писал статью по этому поводу уже и объяснял, почему это плохо
    Если ты не заметил, он там сам указал конвертацию значения переменной в float. Сделано это намеренно и ничего страшного в данном случае нет. А Кортез имел ввиду подобные ошибки в глобальном масштабе.




    Как это сделать в sscanf я, увы, не знаю, но вот как бы я это реализовал собственными силами:

    PHP код:
    stock FindPlayerInServer(buffer[], bool:ignorecase false)//true - регистр не учитывается | false - учитывается
    {
        if((
    buffer[0] >= 48 && buffer[0] <= 57 && ((buffer[1] >= 48 && buffer[1] <= 57) || buffer[1] == EOS) &&
        ((
    buffer[2] >= 48 && buffer[2] <= 57) || buffer[2] == EOS)) && buffer[3] == EOS) return strval(buffer);
        else
        {
            if(
    strlen(buffer) > MAX_PLAYER_NAME) return INVALID_PLAYER_ID;
            new 
    ds_player_name[MAX_PLAYER_NAME+1];

            for(new 
    GetPlayerPoolSize(); != -1i--)
            
    //for(new i = GetMaxPlayers()-1; i != -1; i--)
            //for(new i; i < MAX_PLAYERS; i++)
            //foreach(new i: Player)
            
    {
                if(!
    IsPlayerConnected(i)) continue;//Если включишь foreach, удали эту строку
                
    GetPlayerName(ids_player_nameMAX_PLAYER_NAME);
                if(!
    strcmp(ds_player_namebufferignorecase)) return i;
            }
            return 
    INVALID_PLAYER_ID;
        }

     Разбор полётов
    PHP код:
    stock FindPlayerInServer(buffer[], bool:ignorecase false
    Собственно, два параметра. В один строка, в которой находится ник или ID, а во втором указывается то, стоит ли учитывать регистр при поиске ника или нет (если не указывать, регистр будет учитываться)

    PHP код:
    if((buffer[0] >= 48 && buffer[0] <= 57 && ((buffer[1] >= 48 && buffer[1] <= 57) || buffer[1] == EOS) &&
    ((
    buffer[2] >= 48 && buffer[2] <= 57) || buffer[2] == EOS)) && buffer[3] == EOS) return strval(buffer); 
    Собственно логика сей "страшной" проверки такова: в SA-MP максимальный ID игрока - 999 (1000 игроков. Первый ID - 0 => последний - 999), следовательно, если в первой ячейке записана цифра, во второй и третьей так же цифра или нуль-символ, а в четвёртой - нуль символ, значит в массиве указан именно ID и его смело можно возвращать.

    Иначе

    PHP код:
    if(strlen(buffer) > MAX_PLAYER_NAME) return INVALID_PLAYER_ID
    если в функцию передана строка больше MAX_PLAYER_NAME, значит указан явно не ник и смело можно возвращать невалидный ID (то бишь, что игрок не найден)

    PHP код:
    for(new GetPlayerPoolSize(); != -1i--) 
    Собстно, запускаем цикл на всех игроков, в котором извлекаем ник каждого игрока и записываем с существующим (GetPlayerPoolSize - функция, добавленная в 0.3.7, которая вернёт ID последнего игрока). Так же там указаны другие вариации циклов, если этот тебя не устроит


     Код для твоего случая (с использованием твоего массива pName) + команда

    PHP код:
    CMD:sethp(playerid,params[]){    
        new 
    str[50], playa[MAX_PLAYER_NAME+1], health;    
        if(
    sscanf(params,"s[24]i"playahealth)) return SCM(playeridCOLOR_WHITE,"Используйте: /sethp [id/имя][кол-во жизней]");
        
    playa[0] = FindPlayerInServer(playafalse);//У меня ник DeimoS. При вводе "Deimos" скажет, что игрок не найден
        //playa[0] = FindPlayerInServer(playa, true);//У меня ник DeimoS. При вводе "Deimos" скажет, что игрок найден
        
    if(!IsPlayerConnected(playa[0])) return SCM(playeridCOLOR_WHITE"Игрок не в сети");
        if(
    health || health 100) return SCM(playeridCOLOR_GREY"Нельзя дать менее 0 и более 100 жизней.");
        
    format(str,sizeof(str), "%s установил вам жизней %d",pInfo[playerid][pName],health);
        
    SetPlayerHealth(playa[0],float(health));
        
    SCM(playa[0],COLOR_WHITEstr);
        return 
    1;
    }

    stock FindPlayerInServer(buffer[], bool:ignorecase false)//true - регистр не учитывается | false - учитывается
    {
        if((
    buffer[0] >= 48 && buffer[0] <= 57 && ((buffer[1] >= 48 && buffer[1] <= 57) || buffer[1] == EOS) &&
        ((
    buffer[2] >= 48 && buffer[2] <= 57) || buffer[2] == EOS)) && buffer[3] == EOS) return strval(buffer);
        else
        {
            if(
    strlen(buffer) > MAX_PLAYER_NAME) return INVALID_PLAYER_ID;

            for(new 
    GetPlayerPoolSize(); != -1i--)
            
    //for(new i = GetMaxPlayers()-1; i != -1; i--)
            //for(new i; i < MAX_PLAYERS; i++)
            //foreach(new i: Player)
            
    {
                if(!
    IsPlayerConnected(i)) continue;//Если включишь foreach, удали эту строку
                
    if(!strcmp(pInfo[i][pName], bufferignorecase)) return i;
            }
            return 
    INVALID_PLAYER_ID;
        }



    Функция вернёт INVALID_PLAYER_ID, если игрок с таким ID/ником не найден
    Последний раз редактировалось DeimoS; 24.02.2016 в 21:36.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  10. Пользователь сказал cпасибо:
    Alexey_Nikiforov (24.02.2016)
  11. #10
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Alexey_Nikiforov Посмотреть сообщение
    Эта команда убъет всех игроков у кого имя начинается на A
    Не правда, эта команда убьёт лишь одного игрока, имя которого начинается на A. Лично я не вижу в этом проблемы.

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •