Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Цитата Сообщение от BadPawn Посмотреть сообщение
    U - ид и имя игрока. Все верно.

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

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

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

    Широко известно, что идеи стоят 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,360
    Репутация:
    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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Цитата Сообщение от _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.
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

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

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

 

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

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

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

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

Ваши права

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