Делаю MOD TF2 BETA 1.0 (Вопросы)

KiKiEEKi

Меценат
Сообщения
94
Реакции
48
Здравствуйте, не хочу создавать много тем со своими вопросами в начинание своего мода.

1. Как сделать так что бы переменная g_slot1 менялась с false на true только тому кто выбрал пункт в панели(меню) а не всем на сервере.

Скажите или укажите на решение моего вопроса пожалуйста.

p.s не ругайте за старый и новый синтаксис(я брал готовые решение из плагинов %90)


Код:
#define PLUGIN_VERSION        "beta 1.0"

public Plugin:myinfo =
{
    name        = "Team Fortress 2 MOD",
    author        = "vk.com/kikieeki",
    version        = PLUGIN_VERSION
}

#include <cstrike>
#include <sdktools>

new Handle: g_TF2;

new
    Handle:g_cvJumpBoost    = INVALID_HANDLE,
    Handle:g_cvJumpEnable    = INVALID_HANDLE,
    Handle:g_cvJumpMax        = INVALID_HANDLE,
    Float:g_flBoost            = 250.0,
    bool:g_bDoubleJump        = true,
    g_fLastButtons[MAXPLAYERS+1],
    g_iJumps[MAXPLAYERS+1],
    g_iJumpMax

bool g_slot1 = false;

public OnPluginStart()
{
    HookEvent("player_spawn", player_spawn);
    RegConsoleCmd("sm_tf", Command_OpenMenu_TF2);

    g_TF2 = CreatePanel();
    SetPanelTitle(g_TF2, "Team Fortress 2 MOD:")
    SetPanelCurrentKey(g_TF2, 1)
    DrawPanelItem(g_TF2, "Разведчик")
    SetPanelCurrentKey(g_TF2, 2)
    DrawPanelItem(g_TF2, "Солдат")
    SetPanelCurrentKey(g_TF2, 3)
    DrawPanelItem(g_TF2, "Поджигатель")
    SetPanelCurrentKey(g_TF2, 4)
    DrawPanelItem(g_TF2, "Подрывник")
    SetPanelCurrentKey(g_TF2, 5)
    DrawPanelItem(g_TF2, "Пулемётчик")
    SetPanelCurrentKey(g_TF2, 6)
    DrawPanelItem(g_TF2, "Инженер")
    SetPanelCurrentKey(g_TF2, 7)
    DrawPanelItem(g_TF2, "Медик")
    SetPanelCurrentKey(g_TF2, 8)
    DrawPanelItem(g_TF2, "Снайпер")
    SetPanelCurrentKey(g_TF2, 9)
    DrawPanelItem(g_TF2, "Шпион")


    CreateConVar("sm_tf2_version", PLUGIN_VERSION, "Версия плагина", FCVAR_NOTIFY)
    g_cvJumpEnable = CreateConVar("sm_doublejump_enabled", "1", "Вкл/Выкл двойной прыжок", FCVAR_NOTIFY)
    g_cvJumpBoost = CreateConVar("sm_doublejump_boost", "250.0", "Высота повторных прыжков", FCVAR_NOTIFY)
    g_cvJumpMax = CreateConVar("sm_doublejump_max", "1", "Кол-во прыжков", FCVAR_NOTIFY)
    
    HookConVarChange(g_cvJumpBoost,        convar_ChangeBoost)
    HookConVarChange(g_cvJumpEnable,    convar_ChangeEnable)
    HookConVarChange(g_cvJumpMax,        convar_ChangeMax)
    
    g_bDoubleJump    = GetConVarBool(g_cvJumpEnable)
    g_flBoost        = GetConVarFloat(g_cvJumpBoost)
    g_iJumpMax        = GetConVarInt(g_cvJumpMax)
}

public player_spawn(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    FakeClientCommand(iClient, "sm_tf");
    new wslot0 = GetPlayerWeaponSlot(iClient, 0);
    new wslot1 = GetPlayerWeaponSlot(iClient, 1);
    new wslot2 = GetPlayerWeaponSlot(iClient, 2);
    RemovePlayerItem(iClient, wslot0);
    RemovePlayerItem(iClient, wslot1);
    RemovePlayerItem(iClient, wslot2);
}

public Action CS_OnBuyCommand(client, const String:item[])
{
    if (strcmp(item, "g3sg1", false) == 0 || strcmp(item, "sg550", false) == 0 ||
        strcmp(item, "awp", false) == 0 || strcmp(item, "scout", false) == 0 ||
        strcmp(item, "ak47", false) == 0 || strcmp(item, "m4a1", false) == 0 ||
        strcmp(item, "sg552", false) == 0 || strcmp(item, "aug", false) == 0 ||
        strcmp(item, "galil", false) == 0 || strcmp(item, "famas", false) == 0 ||
        strcmp(item, "mac10", false) == 0 || strcmp(item, "mp5navy", false) == 0 ||
        strcmp(item, "tmp", false) == 0 || strcmp(item, "ump45", false) == 0 ||
        strcmp(item, "p90", false) == 0 || strcmp(item, "m3", false) == 0 ||
        strcmp(item, "xm1014", false) == 0 || strcmp(item, "m249", false) == 0 ||
        strcmp(item, "glock", false) == 0 || strcmp(item, "usp", false) == 0 ||
        strcmp(item, "p228", false) == 0 || strcmp(item, "deagle", false) == 0 ||
        strcmp(item, "fiveseven", false) == 0 || strcmp(item, "elite", false) == 0 ||
        strcmp(item, "hegrenade", false) == 0 || strcmp(item, "flashbang", false) == 0 ||
        strcmp(item, "smokegrenade", false) == 0)
    {
        PrintToChat(client, "\x07008000[TF2]\x01: Покупка запрещена!");
        return Plugin_Handled;
    }
    return Plugin_Continue;
}

public Action:Command_OpenMenu_TF2(client, argc)
{
    SendPanelToClient(g_TF2, client, Handler_TF2, MENU_TIME_FOREVER);
    return Plugin_Handled;
}

public Handler_TF2(Handle:panel, MenuAction:action, client, slot)
{
    switch (action)
    {
        case MenuAction_Select:
        {
            if (slot == 1) //Разведчик
            {
                SetEntityHealth(client, 125);
                SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.33);
                GivePlayerItem(client, "weapon_xm1014");
                GivePlayerItem(client, "weapon_p228");

                g_slot1 = true
            }
            else if (slot == 2) //Солдат
            {
                SetEntityHealth(client, 200);
                SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 0.8);
                GivePlayerItem(client, "weapon_m3");
                GivePlayerItem(client, "weapon_hegrenade");

                g_slot1 = false
            }
            else if (slot == 3) //Поджигатель
            {
                SetEntityHealth(client, 175);
                SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.0);
                GivePlayerItem(client, "weapon_m3");
            }
            else if (slot == 4) //Подрывник
            {
                SetEntityHealth(client, 175);
                SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 0.93);
                GivePlayerItem(client, "weapon_hegrenade");
            }
            else if (slot == 5) //Пулемётчик
            {
                SetEntityHealth(client, 300);
                SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 0.77);
                GivePlayerItem(client, "weapon_m249");
                GivePlayerItem(client, "weapon_deagle");
            }
            else if (slot == 6) //Инженер
            {
                SetEntityHealth(client, 125);
                SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.0);
                GivePlayerItem(client, "weapon_m3");
                GivePlayerItem(client, "weapon_p228");
            }
            else if (slot == 7) //Медик
            {
                SetEntityHealth(client, 150);
                SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.07);
                GivePlayerItem(client, "weapon_p90");
                GivePlayerItem(client, "weapon_p228");
            }
            else if (slot == 8) //Снайпер
            {
                SetEntityHealth(client, 125);
                SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.0);
                GivePlayerItem(client, "weapon_awp");
                GivePlayerItem(client, "weapon_elite");
            }
            else if (slot == 9) //Шпион
            {
                SetEntityHealth(client, 125);
                SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.07);
                GivePlayerItem(client, "weapon_deagle");
            }
        }
    }
}



public convar_ChangeBoost(Handle:convar, const String:oldVal[], const String:newVal[])
{
    g_flBoost = StringToFloat(newVal)
}

public convar_ChangeEnable(Handle:convar, const String:oldVal[], const String:newVal[])
{
    if (StringToInt(newVal) >= 1)
    {
        g_bDoubleJump = true
    }
    else
    {
        g_bDoubleJump = false
    }
}

public convar_ChangeMax(Handle:convar, const String:oldVal[], const String:newVal[])
{
    g_iJumpMax = StringToInt(newVal)
}

stock Landed(const any:client)
{
    g_iJumps[client] = 0    // сброс количества прыжков
}

public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon, int &subtype, int &cmdnum, int &tickcount, int &seed, int mouse[2])
{
    if(g_bDoubleJump)
    {
        new fCurFlags = GetEntityFlags(client);
        if(fCurFlags & FL_ONGROUND)
        {
            Landed(client);
        }
        else if(!(g_fLastButtons[client] & IN_JUMP) && (buttons & IN_JUMP) && !(fCurFlags & FL_ONGROUND))
        {
            ReJump(client);
        }
        
        g_fLastButtons[client] = buttons;
    }
}

stock ReJump(const any:client)
{
    if (g_slot1 == true)
    {
        if (g_iJumps[client] < g_iJumpMax) // прыгнул хотя бы один раз, но не превысил максимальных повторных прыжков
        {                       
            g_iJumps[client]++                                            // прирост количества прыжков
            decl Float:vVel[3]
            GetEntPropVector(client, Prop_Data, "m_vecVelocity", vVel)    // получить текущие скорости
            
            vVel[2] = g_flBoost
            TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, vVel)        // увеличить плеер
        }
    }
}
 

Mr_panica

Чем меньше светлых тем в этом мире, тем он ярче!
Меценат
Сообщения
755
Реакции
354
Если вкратце, то нужно создать массив переменной с размером MAXPLAYERS+1: bool g_slot1[MAXPLAYERS+1]; (нужно заменить на это на 25 строчке плагина)
Теперь у каждого игрока на сервере есть своя переменная g_slot1 со значением false.
Затем уже можно присваивать игроку нужное значение: g_slot1[client] = true; - мы поменяли переменную клиента g_slot1 на true.

Например:
C-подобный:
if (slot == 1) //Разведчик
            {
                SetEntityHealth(client, 125);
                SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.33);
                GivePlayerItem(client, "weapon_xm1014");
                GivePlayerItem(client, "weapon_p228");

                g_slot1[client]= true;  //<-- вот тут теперь у игрока переменная g_slot1 поменялась на true.
            }
 

Primo

Project-менеджер (типа серьёзный тип)
Меценат
Сообщения
1,473
Реакции
593
Если вкратце, то нужно создать массив переменной с размером MAXPLAYERS+1: bool g_slot1[MAXPLAYERS+1]; (нужно заменить на это на 25 строчке плагина)
Теперь у каждого игрока на сервере есть своя переменная g_slot1 со значением false.
Затем уже можно присваивать игроку нужное значение: g_slot1[client] = true; - мы поменяли переменную клиента g_slot1 на true.

Например:
C-подобный:
if (slot == 1) //Разведчик
            {
                SetEntityHealth(client, 125);
                SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.33);
                GivePlayerItem(client, "weapon_xm1014");
                GivePlayerItem(client, "weapon_p228");

                g_slot1[client]= true;  //<-- вот тут теперь у игрока переменная g_slot1 поменялась на true.
            }
Для тех, кто это будет читать.
Важно понимать, что это не у клиента будет переменная.
Вы по сути создаёте массив (таблицу) элементов, размер которого равен максимальному количеству игроков.
Так как подсчёт индексов игроков (userid) начинается с 1 (1, 2, 3, 4, 5 - напишите status в консоль и поймёте (0 - консоль\мир, не думаю, что стоит считать игроком)), мы в массив под этот же индекс записываем какое-то значение.
Из этого можно сделать вывод, что при обращении к массиву по индексу игрока мы получим нужное значение.
Например:
Индекс клиента client = 5. Соответственно, мы можем обратиться к массиву g_slot1[client], где client - индекс клиента, и получим элемент массива с данным индексом. Соответственно, если клиент будет иметь индекс 4, то мы можем получить элемент под индексом 4 массива g_slot1.

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

Я написал банальщину для тех, кто это понимает. Но новичкам это будет полезно знать на этапе начала знакомства с программированием
 

KiKiEEKi

Меценат
Сообщения
94
Реакции
48
@Primo,
Это получается что если зашел игрок под индексом 5 и у него массив g_slot1[client] = true то после его выхода зайдет другой игрок то у него будет индекс 5 и массив g_slot1[client] = true ?

Как это я вижу:
индекс игроков [1,2,3,4,5,6] это сколько сейчас играют
индекс игроков [1,2,3,4,6] игрок под индексом 5 вышел
индекс игроков [1,2,3,4,5,6] зашел новый игрок, индекс будет такой? или [1,2,3,4,6,7]
 

Mr_panica

Чем меньше светлых тем в этом мире, тем он ярче!
Меценат
Сообщения
755
Реакции
354
Индекс у игроков всегда уникален и не может повторяться.
Если игрок вышел и у него был индекс 228, то у игрока, который зашёл прямо после него он будет 229.
 

KiKiEEKi

Меценат
Сообщения
94
Реакции
48
А если перезагрузка сервера, то индексы сначала начинаются же.
 

Young <

Пользователь
Команда форума
Меценат
Сообщения
932
Реакции
330
Индекс у игроков всегда уникален и не может повторяться.
Если игрок вышел и у него был индекс 228, то у игрока, который зашёл прямо после него он будет 229.
UserId индекс клиента*. Реальные индексы могут повторяться.
 

inklesspen

Пишу модули под LSD
Меценат
Сообщения
1,687
Реакции
696
А если перезагрузка сервера, то индексы сначала начинаются же.
Слоты это как ячейки в массиве
Зашел игрок, он получил индекс 1
Зашел другой игрок, он получил индекс 2
Зашел третий - получил индекс три
Вышел второй, игрок1 имеет индекс 1, игрок3 имеет индекс 3
Зашел игрок4 - получил индекс2

При заходе игрок получает свободный индекс, индекс не может быть выше определённого числа (MaxClients, MAXPLAYERS)
Но каждый игрок также получает номер по порядку - UserId, который уникален для каждой сессии в течение работы всего сервера
 

Young <

Пользователь
Команда форума
Меценат
Сообщения
932
Реакции
330
Это получается что если зашел игрок под индексом 5 и у него массив g_slot1[client] = true то после его выхода зайдет другой игрок то у него будет индекс 5 и массив g_slot1[client] = true ?
Сбрасывай при дисконнекте.
 

Mr_panica

Чем меньше светлых тем в этом мире, тем он ярче!
Меценат
Сообщения
755
Реакции
354
UserId индекс клиента*. Реальные индексы могут повторяться.
Да, я про UserID, который в status отображается)
И да, как сказали выше, можно просто ставить переменную в false при выходе игрока с сервера.

Оффтоп
 

KiKiEEKi

Меценат
Сообщения
94
Реакции
48
При заходе игрок получает свободный индекс, индекс не может быть выше определённого числа (MaxClients, MAXPLAYERS)
Но каждый игрок также получает номер по порядку - UserId, который уникален для каждой сессии в течение работы всего сервера
Вот и я об этом выше писал
индекс игроков [1,2,3,4,5,6] это сколько сейчас играют
индекс игроков [1,2,3,4,6] игрок под индексом 5 вышел
индекс игроков [1,2,3,4,5,6] зашел новый игрок, индекс будет такой? или [1,2,3,4,6,7]
Если MAXPLAYERS[6] то новый получит индекс 5 и будет у него g_slot1[client] = true
Сбрасывай при дисконнекте.
Ok
 

KiKiEEKi

Меценат
Сообщения
94
Реакции
48
Здравствуйте, скажите где найти список: const char[] te_name (TE name to hook.)

AddTempEntHook("Shotgun Shot", Hook_FireBullets);

Shotgun Shot - Это звук выстрела,

А где звуки Reload и Draw ?
 

KiKiEEKi

Меценат
Сообщения
94
Реакции
48
Привет народ. А возможно ли что бы клиент мог удалять файл у себя через меню на сервере и не скачивать именно его а остальные файлы скачивать?
 

KiKiEEKi

Меценат
Сообщения
94
Реакции
48
Как отловить надет ли глушитель на м4а1 и usp или нет?
 
Сверху