Ряд вопросов.

Тема в разделе "Программирование / Скриптинг", создана пользователем Hejter, 6 мар 2016.

  1. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    1. Обезоруживание игрока:
    Код:
    stock RP_Disarm(player)
    {
        new weapon_id;
        for (new i = 0; i < 5; i++)
        {
            if (i < 5 && (weapon_id = GetPlayerWeaponSlot(player, i)) != -1)
            {
                RemovePlayerItem(player, weapon_id);
            }
        }
    }

    Шаг 2.
    Код:
    public RP_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new client = GetClientOfUserId(GetEventInt(event, "userid"));
        {
            if (IsClientInGame(client) && IsPlayerAlive(client))
            {
                RP_Disarm(client);
                GivePlayerItem(client, DEFAULT_KNIFE);
                SetEntityRenderColor(client, DEFAULT_COLOR);
            }
        }
    }

    Вопрос. Почему мне не выдается нож?
    --- Добавлено позже ---
    2. HUD

    Вопрос. Как мне закрывать данное меню, если открыто другое, но при этом открывать HUD если другое меню было закрыто?
    --- Добавлено позже ---
    3. Воскрешение мертвого игрока.
    Код:
    public RP_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new client = GetClientOfUserId(GetEventInt(event, "userid"));
        new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
       
        if (IsClientInGame(client))
        {
            if (GetClientTeam(client) > 1)
            {
                CreateTimer(RP_RESPAWN_TIME * 1.0, Dead_Timer, client);
                PrintHintText(client, "<font color='#ff0000'>Потрачено</font> \nВоскрешение через %d",RP_RESPAWN_TIME);
            }
    Код:
    public Action:Dead_Timer(Handle:timer, any:client)
    {
        if (IsClientInGame(client) && !IsPlayerAlive(client) && GetClientTeam(client) > 1)
        {
            CS_RespawnPlayer(client);
           
            if (Jail_Time[client] > 0)
            {
                TeleportEntity(client, g_CellLoc[GetRandomInt(0, g_CellQty)], NULL_VECTOR, NULL_VECTOR);
                RP_Cuff_Jail(client);
            }
            else
            {
                ChangeClientTeam(client, IsPolice(client) ? 3 : 2);
           
                if (StrEqual(current_map, RP_MAP))
                {
                    TeleportEntity(client, GetRandomInt(1, 2) == 1 ? SPAWN1 : SPAWN2, NULL_VECTOR, NULL_VECTOR);
                }
            }
        }
    }

    Не хочет воскрешать мертвых.
     
  2. Саша Шеин

    Саша Шеин

    Сообщения:
    1.258
    Симпатии:
    191
    Hejter нравится это.
  3. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Да я понял и так.
    Теперь надо решить другие вопросы, которых накопилось гора.
     
  4. Саша Шеин

    Саша Шеин

    Сообщения:
    1.258
    Симпатии:
    191
    Не понял вопроса ;( (Точнее алгоритма, что открыть, что закрыть)

    А на каком моменте застревает?
     
  5. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    238
    Симпатии:
    569
    1. Полностью обезоружить клиента можно в три строчки:
    PHP:
    // полностью обезоружить клиента
    StripClient(client)
    {
        
    // создаём сущность обезоруживания
        
    new entity CreateEntityByName("player_weaponstrip");
        
    // вызываем её для игрока
        
    AcceptEntityInput(entity"strip"client);
        
    // удаляем саму сущность
        
    AcceptEntityInput(entity"kill");
    }
    Ряд замечаний:
    • GetClientOfUserId() возвращает 0 в случае, если userid неправильный. Поэтому проверять на IsClientInGame() не имеет смысла, да и вообще хук вряд ли будет вызван для игрока, который не на сервере. Если всё же хочется проверить, то лучше проверять на != 0, если не равно, то игрок на сервере.
    • IsPlayerAlive() - не думаю, что игрок может возродится мёртвым.
    По поводу ошибки - если используете дефайны, то, пожалуйста, добавляйте их к коду. Без них тяжело ответить на ваш вопрос.

    2. Исходя из предположения, что вы используете таймер для вывода панели клиенту на экран. Перед тем, как вывести HUD игроку, вызовите функцию GetClientMenu(). Если результат вызова будет отличным от 0, то игрок смотрит какое-то меню и выводить ему HUD не нужно. Помимо этого, вам нужно учесть следующее: GetClientMenu() будет отличным от нуля из-за вашей же панели, поэтому вам нужно вручную отслеживать статус вашей панели (перед отправкой меню глобальную переменную (массив для всех игроков) ставить на true, если меню закрылось (MenuAction_Cancel или MenuAction_End), ставить на false. Тогда если ф-я вернёт MenuSource_RawPanel (открыта панель), то открывать панель или нет будет зависеть от глобальной переменной.

    3. Помимо замечаний из пункта 1, дополнительные:
    • PHP:
      RP_RESPAWN_TIME 1.0
      Определяйте RP_RESPAWN_TIME сразу как float либо используйте явное преобразование типа float(RP_RESPAWN_TIME). Если вам нужно красиво вывести дробное клиенту, используйте формат числа следующим образом: %x.yf, где x - число выводимых цифр в целом, y - число цифр после запятой (таким образом, чисел до запятой будет (x-y)), например, "%.1f" выведет все цифры до запятой, и одну после запятой, либо %5.1f выведет 4 цифры до запятой и 1 после. Если чисел до запятой будет меньше, то нули дописаны не будут, так же, как и для цифр после запятой.
    • PHP:
      CreateTimer(RP_RESPAWN_TIME 1.0Dead_Timerclient);
      При передаче индекса клиента в таймер есть небольшая вероятность того, что клиент выйдет, а на его место зайдёт другой игрок, тогда для него будет выполнен код из блока Action:Dead_Timer. Передавать в таймер всегда лучше userid клиента при помощи GetClientUserId(), а затем в таймере преобразовывать в индекс с помощью функции GetClientOfUserId() и проверять на неравенство нулю (игрок всё еще на сервере), тогда такой ошибки не будет.
    • GetClientTeam(client) проверять команду клиента при смерти тоже наверное не стоит, поскольку сначала игрок умирает, а затем меняет команду (для случая перехода в спектраторы), иначе были бы баги в отображении суицида. Но в этом я не уверен.
    По поводу "почему не воскрешает" - сложно сказать, текст из PrintHintText() выводится? Если нет, то возможно вы не хукнули событие смерти игрока.
     
    Danyas нравится это.
  6. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.590
    Симпатии:
    1.995
    Вроде где-то был более конкретный вопрос: "Как узнать, что игрок/плагин открыл другое меню?", то есть конкретный ответ: MenuCancel_Interrupted = -2, /**< Client was interrupted with another menu */ - выведенное меню было перебито другим. Использовал его без GetClientMenu(), правда задача была немного более замысловатая.
     
  7. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Хукнул. Дело в том что, сообщение из PrintHintText вообще не выводится.
    --- Добавлено позже ---
    Решил проблему с меню, но заметил такую проблему. Игрок под открытым HUD меню, не может нажимать 1.2.3 (переключаться на оружие).
     
  8. gibs

    gibs Фитиль народного волненья

    Сообщения:
    542
    Симпатии:
    139
    Извини, но просто интересно как в этом случае сработает твоя логика. Почему, на твой взгляд, появилась проблема с нажатием кнопок?)
     
  9. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Потому что открыто меню. Суть в том что, я видел где подобное меню открыто, но при этом спокойно можно переключаться между оружием.
    --- Добавлено позже ---
    Полностью заблокирован переход в другие команды. Переход осуществляется посредством изменения профессии (работы).