Написание плагинов

Seton

Участник
Сообщения
44
Реакции
41
Создать bool на каждого игрока и переключать в нужный момент в зависимости от того, нажата клавиша или нет
C-подобный:
bool bPressed[MAXPLAYERS+1] = {false,...};
...
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(buttons & IN_ATTACK || buttons & IN_USE) bPressed[client] = true; //нажата E или ЛКМ
    else bPressed[client] = false;
    return Plugin_Continue;
}
...
...
    if(bPressed[client1] || bPressed[client2] && GetClientTeam(client1) == GetClientTeam(client2))
    {
        ...
    }
Суть в принципе понял, только как получить индекс второго игрока, через for или как то иначе?

C-подобный:
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(buttons & IN_USE)
        bPressed[client] = true;
    else
        bPressed[client] = false;
    
    for(new i = 1; i <= MaxClients; i++) for(new i2 = 1; i2 <= MaxClients; i2++) if(IsClientInGame(i) && IsPlayerAlive(i) if(IsClientInGame(i2) && IsPlayerAlive(i2))
    if(bPressed[i] || bPressed[i2] && GetClientTeam(i) == GetClientTeam(i2))
        SetEntData(client, g_iCollisionGroup, 5, 4, true);
    else
        SetEntData(client, g_iCollisionGroup, 2, 4, true);
    
    return Plugin_Continue;
}
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Суть в принципе понял, только как получить индекс второго игрока, через for или как то иначе?

C-подобный:
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(buttons & IN_USE)
        bPressed[client] = true;
    else
        bPressed[client] = false;
 
    for(new i = 1; i <= MaxClients; i++) for(new i2 = 1; i2 <= MaxClients; i2++) if(IsClientInGame(i) && IsPlayerAlive(i) if(IsClientInGame(i2) && IsPlayerAlive(i2))
    if(bPressed[i] || bPressed[i2] && GetClientTeam(i) == GetClientTeam(i2))
        SetEntData(client, g_iCollisionGroup, 5, 4, true);
    else
        SetEntData(client, g_iCollisionGroup, 2, 4, true);
 
    return Plugin_Continue;
}
Вызывать функцию, куда закидывать этих двух игроков и там уже через условие проверять их, я бы так наверное делал ну или через for, если у них обоих нажаты кнопки
C++:
if(bPressed[i] == bPressed[i2] == true)
{
    .....
}
Или через нахождение ближайшего игрока, если они должны быть возле друг друга
А что в итоге должно получиться? Просто при каких обстоятельствах и зачем нужно это делать. Если знать это, то можно более подходящий вариант найти в некоторых случаях
 
Последнее редактирование:

Seton

Участник
Сообщения
44
Реакции
41
Вызывать функцию, куда закидывать этих двух игроков и там уже через условие проверять их, я бы так наверное делал ну или через for, если у них обоих нажаты кнопки
C++:
if(bPressed[i] == bPressed[i2] == true)
{
    .....
}
Или через нахождение ближайшего игрока, если они должны быть возле друг друга
А что в итоге должно получиться?
В принципе да, через условие ближайшего игрока бы лучше, не подскажешь как?)
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
В принципе да, через условие ближайшего игрока бы лучше, не подскажешь как?)
Посмотри в исходнике Revivals, там вроде реализовано что-то подобное
Там так
C++:
stock int GetNearestTarget(int client)
{
    if(!IsPlayerAlive(client)) return 0;

    static int i, team, target;
    static float pos[3], dist[MAXPLAYERS+1], min_dist;
    if(!bEnemy) team = GetClientTeam(client);
    GetClientAbsOrigin(client, pos);

    i = target = 0, min_dist = fRadius;
    while(++i <= MaxClients) if(i != client && (bTogether || !iReviver[i] || iReviver[i] == client)
        && iDeathTeam[i] > 1 && (bEnemy || team == iDeathTeam[i])
        && FloatCompare(min_dist, (dist[i] = GetVectorDistance(pos, fDeathPos[i]))) == 1)
        {
            min_dist = dist[i];
            target = i;
        }

    return target;
}
 

Seton

Участник
Сообщения
44
Реакции
41
Вызывать функцию, куда закидывать этих двух игроков и там уже через условие проверять их, я бы так наверное делал ну или через for, если у них обоих нажаты кнопки
C++:
if(bPressed[i] == bPressed[i2] == true)
{
    .....
}
Или через нахождение ближайшего игрока, если они должны быть возле друг друга
А что в итоге должно получиться? Просто при каких обстоятельствах и зачем нужно это делать. Если знать это, то можно более подходящий вариант найти в некоторых случаях
Два игрока нажимают клавишу E и у них должен включаться block-модельки (для подсадки)
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Два игрока нажимают клавишу E и у них должен включаться block-модельки (для подсадки)
Есть еще такое в smlib smlib/clients.inc at aad2c8e963dbd7790096efd7920bd9f3cf76082d · bcserv/smlib
 
Последнее редактирование:

-=|УЧЕНИК|=-

вся жизнь,сплошной цирк.
Сообщения
876
Реакции
212
Привет всем!
Если кому не сложно,можно ли подправить плагин?
Баланс работает нормально все,ну не считая того,что в эррорах ошибки от него,ну это не критично конечно.
Если можно подправить,то хотелось бы,чтоб при балансе,модели менялись.
А то щас при балансе,скины не меняются,а перекидывает со скином за которую команду был.
Заранее благодарю!
 

Вложения

  • Special Team Balancer.sp
    2.8 КБ · Просмотры: 9

Seton

Участник
Сообщения
44
Реакции
41
Выдает ошибку: [SM] Exception reported: Entity index 0 is not a valid client (строка GetPlayerWeaponSlot)
C-подобный:
new iClient = iArray[GetRandomInt(0, iSize + -1)];
new slot = GetPlayerWeaponSlot(iClient, CS_SLOT_C4);
if(slot != -1)
    SDKHooks_DropWeapon(iClient, slot);

p.s. Суть плагина: при round_start перекидывает рандомного игрока(CS_SwitchTeam) за другую команду (баланс) и делает CS_RespawnPlayer(для точки спавна именно нужной команды),
но перед сменой как раз проверяет слот c4, чтобы при условии: если слот c4 имеется, то выкинуть
 

HAIRAKE

Участник
Сообщения
36
Реакции
4
Здраствуйте напишите пожалуйста плагин когда человек лезит на вышку ему пишет сообщение и ударяет молнией шлепает и снимает по 5 хп и фиолетовый неон на земле awp lego 2 карта css v92
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@txxbio, есть же вроде карты с заблокированной вышкой.

Да и есть плагины, с помощью которых можно её заблочить:
 

HAIRAKE

Участник
Сообщения
36
Реакции
4
@txxbio, есть же вроде карты с заблокированной вышкой.

Да и есть плагины, с помощью которых можно её заблочить:
мне над именно который я описал братан чтобы в чат еще писал
 

Seton

Участник
Сообщения
44
Реакции
41
Проблемки с кодом после декомпиля (заполнение array):
4 строка: error 028: invalid subscript (not an array or too many subscripts): "var1"
8 строка: error 028: invalid subscript (not an array or too many subscripts): "var1"
10 строка:error 035: argument type mismatch (argument 3)

C-подобный:
new var1;
if (reverse)
{
    var1[0] = angels;
}
else
{
    var1[0] = birds_angels[i];
}
DispatchKeyValueVector(bird, "angles", var1);
 
Сверху Снизу