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

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
1. Обезоруживание игрока:
C-подобный:
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.
C-подобный:
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. Воскрешение мертвого игрока.
C-подобный:
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);
        }

C-подобный:
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);
            }
        }
    }
}

Не хочет воскрешать мертвых.
 

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
Вопрос. Как мне закрывать данное меню, если открыто другое, но при этом открывать HUD если другое меню было закрыто?
Не понял вопроса ;( (Точнее алгоритма, что открыть, что закрыть)

Не хочет воскрешать мертвых.
А на каком моменте застревает?
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
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.0, Dead_Timer, client);
    При передаче индекса клиента в таймер есть небольшая вероятность того, что клиент выйдет, а на его место зайдёт другой игрок, тогда для него будет выполнен код из блока Action:Dead_Timer. Передавать в таймер всегда лучше userid клиента при помощи GetClientUserId(), а затем в таймере преобразовывать в индекс с помощью функции GetClientOfUserId() и проверять на неравенство нулю (игрок всё еще на сервере), тогда такой ошибки не будет.
  • GetClientTeam(client) проверять команду клиента при смерти тоже наверное не стоит, поскольку сначала игрок умирает, а затем меняет команду (для случая перехода в спектраторы), иначе были бы баги в отображении суицида. Но в этом я не уверен.
По поводу "почему не воскрешает" - сложно сказать, текст из PrintHintText() выводится? Если нет, то возможно вы не хукнули событие смерти игрока.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Как мне закрывать данное меню, если открыто другое, но при этом открывать HUD если другое меню было закрыто?
Вроде где-то был более конкретный вопрос: "Как узнать, что игрок/плагин открыл другое меню?", то есть конкретный ответ: MenuCancel_Interrupted = -2, /**< Client was interrupted with another menu */ - выведенное меню было перебито другим. Использовал его без GetClientMenu(), правда задача была немного более замысловатая.
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
По поводу "почему не воскрешает" - сложно сказать, текст из PrintHintText() выводится? Если нет, то возможно вы не хукнули событие смерти игрока.
Хукнул. Дело в том что, сообщение из PrintHintText вообще не выводится.
--- Добавлено позже ---
Решил проблему с меню, но заметил такую проблему. Игрок под открытым HUD меню, не может нажимать 1.2.3 (переключаться на оружие).
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Хукнул. Дело в том что, сообщение из PrintHintText вообще не выводится.
--- Добавлено позже ---
Решил проблему с меню, но заметил такую проблему. Игрок под открытым HUD меню, не может нажимать 1.2.3 (переключаться на оружие).
Извини, но просто интересно как в этом случае сработает твоя логика. Почему, на твой взгляд, появилась проблема с нажатием кнопок?)
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
Потому что открыто меню. Суть в том что, я видел где подобное меню открыто, но при этом спокойно можно переключаться между оружием.
--- Добавлено позже ---
GetClientTeam(client) проверять команду клиента при смерти тоже наверное не стоит, поскольку сначала игрок умирает, а затем меняет команду
Полностью заблокирован переход в другие команды. Переход осуществляется посредством изменения профессии (работы).
 
Сверху Снизу