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

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@Афро, код был там, откуда ты скрин взял
А так достаточно глянуть, наверное, код любого плагина с "HUD" в названии

А так обновляешь по таймеру что-то типа этого:
PHP:
SetHudTextParams(fX, fY, fTime, iRed, iGreen, iBlue, iAlfa, 0, 0.0, 0.1, 0.1);
ShowHudText(iClient, iChannel, "%s", sText);
SetHudTextParams · halflife · SourceMod Scripting API Reference
ShowHudText · halflife · SourceMod Scripting API Reference
 
  • Мне нравится
Реакции: Afro

Truyn

King of clowns
Сообщения
1,591
Реакции
749
@Grey83
почему не работает в лазерминах 1.5.2

// Remove mines after the death of their owner.
// -
// Default: "0"
// Minimum: "0.000000"
// Maximum: "1.000000"
sm_lasermines_death_purge "1"

не исчезает
 

Arthur Don

Участник
Сообщения
1,696
Реакции
256
Нужен плагин, который будет банить если игрок ливает с сервера за терров, Для дерзана.
 

Голос_в_ночи

Племяш Габена
Сообщения
333
Реакции
31
Доброго времени суток ребята!
Нужно объединить 2 плагина в 1
Нужно, чтобы в обычном [CS: Source] - Hud Info отображалось звание, которое в ARMY RANKS. Желательно реализовать редактирование в файле all.txt
Еще бы добавить в плагин таймер, который бы переключал информацию. Например, сначала показывается информация сервера, а через Х секунд "Ваше звание", "Следующее звание", "Требуется убийств"
Исходники обоих плагинов приложены.
Игра CSS OB. Спасибо!:ab:
 

Вложения

  • all.txt
    985 байт · Просмотры: 6
  • army_ranks_hud_info.sp
    2.3 КБ · Просмотры: 8
  • hud_info.sp
    13.2 КБ · Просмотры: 6
Последнее редактирование:

smxnet

Участник
Сообщения
80
Реакции
4
Привет ребят я хочу сделать у себя на сервере голосование за ноу-зум. Игроки прописывают в чат команду votezoom , и это значит, что они хотят играть без зума. Если большинство прописывает, то авп на сервере переходит в режим без зума у всех вот если кто может подскажите может плагин или сами можете кто написать (сервер css steam) заранее благодарю за ответы
 

alexmy

Участник
Сообщения
284
Реакции
13
Всем привет. Может кто помочь, в чем проблема?
PHP:
float a = GetAngle(vfront, velocitymissile);
    float amax = 3.14159*duration*2.0;
    if(a > amax )a = amax;
    ScaleVector(vfront, a);
    LogMessage("a - %f  vfront - %f", a, vfront);
Эта часть кода приводит сервер в краш а именно:
PHP:
float a = GetAngle(vfront, velocitymissile);
Делал отладку и результаты были такие:
PHP:
L 03/04/2019 - 21:16:32: [l4d_fly_infected.smx] a - 0.228802  vfront - 0.199747
L 03/04/2019 - 21:16:32: [l4d_fly_infected.smx] a - 0.212599  vfront - -0.174038
L 03/04/2019 - 21:16:32: [l4d_fly_infected.smx] a - 0.211161  vfront - 0.183851
L 03/04/2019 - 21:16:32: [l4d_fly_infected.smx] a - 0.210562  vfront - -0.172467
L 03/04/2019 - 21:16:32: [l4d_fly_infected.smx] a - NaN  vfront - NaN

вот сам весь код:
Оффтоп
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
судя по тому что тебе предложили на АМ, ты разве что можешь делать проверку на NaN: сравнивай a c a и если будет не равно, то у тебя NaN.
Как-то так
PHP:
    float a = GetAngle(vfront, velocitymissile);
    if(a != a)
    {
        LogMessage("'a' is NaN!");
        return;
    }
    float amax = 3.14159*duration*2.0;
    if(a > amax ) a = amax;
    ScaleVector(vfront, a);
    LogMessage("a - %f  vfront - %f", a, vfront);
 

alexmy

Участник
Сообщения
284
Реакции
13
судя по тому что тебе предложили на АМ, ты разве что можешь делать проверку на NaN: сравнивай a c a и если будет не равно, то у тебя NaN.
Как-то так
PHP:
    float a = GetAngle(vfront, velocitymissile);
    if(a != a)
    {
        LogMessage("'a' is NaN!");
        return;
    }
    float amax = 3.14159*duration*2.0;
    if(a > amax ) a = amax;
    ScaleVector(vfront, a);
    LogMessage("a - %f  vfront - %f", a, vfront);
Пришлось читать википедию С++ NaN.
PHP:
float a = GetAngle(vfront, velocitymissile);
    float amax = 3.14159*duration*2.0;
    if(a > amax || a < amax || a == amax || a != amax || a * amax || a + amax || a - amax) a = amax;
с инфой из Вики и это вроде работает хорошо. Как тебе?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@alexmy, там же написано: NaN != NaN (т.е. надо сравнивать число с самим собой)
Достаточно одной проверки, как у меня (у тебя же duration не меняется со временем?)
 

Davidos

Участник
Сообщения
97
Реакции
41
Здравствуйте прошу помочь нужно сделать разветвление в меню, типа чтобы нажимаешь один открывается первая ветка оверлеев, если 2 вторая, и кнопку возврата.
Плагин: Overlay Menu
 

smxnet

Участник
Сообщения
80
Реакции
4
Привет ребят подскажите пжл есть ли такой плагин ну что бы вот когда террористы заложили бомбу на пленте то все террористы видят где ее заложили там желтые круги от плента идут а можно сделать плагин что бы контры на радаре тоже так видели бы то есть не только теры но и контры видели где заложили бомбу на каком пленте заранее благодарю сервер css steam
 

alexmy

Участник
Сообщения
284
Реакции
13
Всем привет, в чем проблема?
PHP:
L 03/05/2019 - 23:10:58: [SM] Call stack trace:
L 03/05/2019 - 23:10:58: [SM]   [0] GetEntProp
L 03/05/2019 - 23:10:58: [SM]   [1] Line 341, C:\Users\Алексей\Desktop\sourcemod-1.9.0-git6275-windows\scripting\l4d_fly_infected.sp::IsInfected
L 03/05/2019 - 23:10:58: [SM]   [2] Line 99, C:\Users\Алексей\Desktop\sourcemod-1.9.0-git6275-windows\scripting\l4d_fly_infected.sp::entity_visible
L 03/05/2019 - 23:10:58: [SM] Exception reported: Entity 5 (5) is invalid
.
код как бы работает, но спамит ошибку.
PHP:
public void entity_visible(Event event, const char [] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(IsPlayerAlive(client) && GetClientTeam(client) == 2 || IsInfected(client, ZOMBIECLASS_TANK))
    {
        for(int i = 1; i < MaxClients; i++)
        {
/*99*/            switch(i != client && IsClientInGame(i) && GetClientTeam(i) == 2 || IsInfected(i, ZOMBIECLASS_TANK) && GetEntProp(i, Prop_Send, "m_hasVisibleThreats"))
            {
                case 0: PrintToChatAll("false"), hasVisibleThreats = false;
                case 1: PrintToChatAll("true"), hasVisibleThreats = true;
            }
        }
    }
}
PHP:
int IsInfected(int client, int type)
{
341    int class = GetEntProp(client, Prop_Send, "m_zombieClass");
    if(type==class)return true;
    else return false;
}
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
@alexmy, в том, что если игрок не в игре, то выполняются действия, которые следуют за оператором ИЛИ (||). И кто вообще додумался в такой манере использовать оператор switch?! Это как-то даже не правильно с моральной точки зрения
 

alexmy

Участник
Сообщения
284
Реакции
13
@alexmy, в том, что если игрок не в игре, то выполняются действия, которые следуют за оператором ИЛИ (||). И кто вообще додумался в такой манере использовать оператор switch?! Это как-то даже не правильно с моральной точки зрения
Да экспериментировал с этим оператором :D. он мне больше нравится чем if/else if =). На счет ошибки, возможно ложную проверку сделать?
--- Добавлено позже ---
@alexmy, в том, что если игрок не в игре, то выполняются действия, которые следуют за оператором ИЛИ (||). И кто вообще додумался в такой манере использовать оператор switch?! Это как-то даже не правильно с моральной точки зрения
Хотя уже всё, разобрался!
--- Добавлено позже ---
Можно сделать проверки на две команды одним событием и одним User ID игрока. я пытаюсь проверить так:
PHP:
if(IsPlayerAlive(client) && GetClientTeam(client) == 2 || IsInfected(client, ZOMBIECLASS_TANK))
оно работает но криво, может выполнится код когда одна из двух команд жива.
Так пробовал, вообще мертво всё.
PHP:
if(IsPlayerAlive(client) && GetClientTeam(client) == 2 && IsInfected(client, ZOMBIECLASS_TANK))
 
Последнее редактирование:

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Так пробовал, вообще мертво всё.
PHP:
if(IsPlayerAlive(client) && GetClientTeam(client) == 2 && IsInfected(client, ZOMBIECLASS_TANK))
Потому что 2 - выжившие, а 3 - инфицированные.
Но ты не пробовал использовать скобки в условии?
PHP:
if(IsPlayerAlive(client) && (GetClientTeam(client) == 2 || IsInfected(client, ZOMBIECLASS_TANK)))
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@Oligarx1488, скорей всего, что нет: у меня обычная версия переделана была под КСГО, а для этого плагина нужна версия для зомбимода (квары и нативы отличаются, скорей всего)
--- Добавлено позже ---
@alexmy, попробуй вот так:
PHP:
public void entity_visible(Event event, const char [] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(client && IsPlayerAlive(client) && (GetClientTeam(client) == 2 || IsInfected(client, ZOMBIECLASS_TANK)))
        for(int i = 1; i <= MaxClients; i++)
            if(i != client && IsClientInGame(i) && (GetClientTeam(i) == 2 || IsInfected(i, ZOMBIECLASS_TANK)))
            {
                if(GetEntProp(i, Prop_Send, "m_hasVisibleThreats"))
                    PrintToChatAll("true"), hasVisibleThreats = true;
                else PrintToChatAll("false"), hasVisibleThreats = false;
            }
}

int IsInfected(int client, int type)
{
    return GetClientTeam(client) == 3 && type == GetEntProp(client, Prop_Send, "m_zombieClass");
}
--- Добавлено позже ---
Вот только я не понимаю для чего тебе такой спам: у тебя цикл пройдётся по всем игрокам и для каждого определит значение m_hasVisibleThreats, по завершению цикла у тебя в чате будет столько сообщений "true/false", сколько игроков в каждой из команд и переменная hasVisibleThreats будет иметь такое значение, какое значение имело m_hasVisibleThreats у последнего валидного игрока из цикла
 
Последнее редактирование:

alexmy

Участник
Сообщения
284
Реакции
13
@Oligarx1488, скорей всего, что нет: у меня обычная версия переделана была под КСГО, а для этого плагина нужна версия для зомбимода (квары и нативы отличаются, скорей всего)
--- Добавлено позже ---
@alexmy, попробуй вот так:
PHP:
public void entity_visible(Event event, const char [] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(client && IsPlayerAlive(client) && (GetClientTeam(client) == 2 || IsInfected(client, ZOMBIECLASS_TANK)))
        for(int i = 1; i <= MaxClients; i++)
            if(i != client && IsClientInGame(i) && (GetClientTeam(i) == 2 || IsInfected(i, ZOMBIECLASS_TANK)))
            {
                if(GetEntProp(i, Prop_Send, "m_hasVisibleThreats"))
                    PrintToChatAll("true"), hasVisibleThreats = true;
                else PrintToChatAll("false"), hasVisibleThreats = false;
            }
}

int IsInfected(int client, int type)
{
    return GetClientTeam(client) == 3 && type == GetEntProp(client, Prop_Send, "m_zombieClass");
}
--- Добавлено позже ---
Вот только я не понимаю для чего тебе такой спам: у тебя цикл пройдётся по всем игрокам и для каждого определит значение m_hasVisibleThreats, по завершению цикла у тебя в чате будет столько сообщений "true/false", сколько игроков в каждой из команд и переменная hasVisibleThreats будет иметь такое значение, какое значение имело m_hasVisibleThreats у последнего валидного игрока из цикла
Привет. да тоже самое что и у меня вроде выходит:
PHP:
public Action entity_visible(Event event, const char [] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(IsPlayerAlive(client) &&  (GetClientTeam(client) == 2 || IsInfected(client, ZOMBIECLASS_TANK)))
    {
        for(int i = 1; i < MaxClients; i++)
        {
            if(i != client && IsValidEntity(i) && IsValidEdict(i) && IsClientInGame(i) && (GetClientTeam(i) == 2 || IsInfected(client, ZOMBIECLASS_TANK)))
            {
                int lost = GetEntProp(i, Prop_Send, "m_hasVisibleThreats");
                if(lost == 0) PrintToChatAll("false"), hasVisibleThreats = false;
                else if(lost == 1) PrintToChatAll("true"), hasVisibleThreats = true;
                break;
            }
        }
    }
}

if(GetEntProp(ent, Prop_Send, "m_hasVisibleThreats") == 0 && !hasVisibleThreats)
    {
        hasVisibleThreats = true;
        StopFly(ent);
        PrintToChatAll("\x03[\x04FLY TANK\x03] \x05Потерял выживших");
        for(int i = 1; i < MaxClients; i++)
        {
            if (i != ent && IsClientInGame(i) && GetClientTeam(i) == 2 && IsPlayerAlive(i))
            {
                float pos[3];
                GetClientAbsOrigin(i, pos);
                TeleportEntity(ent, pos, NULL_VECTOR,NULL_VECTOR);
                break;
            }
        }
        PrintToChatAll("\x03[\x04FLY TANK\x03] \x05Был телепортирован к выжившим");
    }
Да на счёт спама просто смотрю на последнее значение.
Есть вариант как бы отлавливать события, когда он реально появился на карте. Для сервера как лучше обновлять код таймером повторяющим или событием вот как сейчас?
 
Последнее редактирование модератором:

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
C-подобный:
                int lost = GetEntProp(i, Prop_Send, "m_hasVisibleThreats");
                if(lost == 0) PrintToChatAll("false"), hasVisibleThreats = false;
                else if(lost == 1) PrintToChatAll("true"), hasVisibleThreats = true;
В твоём случае то же, что и
C-подобный:
                if(!GetEntProp(i, Prop_Send, "m_hasVisibleThreats"))
                        PrintToChatAll("false"), hasVisibleThreats = false;
                else PrintToChatAll("true"), hasVisibleThreats = true;
--- Добавлено позже ---
Для сервера как лучше обновлять код таймером повторяющим или событием вот как сейчас?
А как ты событие таймером отловишь?

Кстати что означает у тебя булева переменная hasVisibleThreats?
 

alexmy

Участник
Сообщения
284
Реакции
13
А как ты событие таймером отловишь?
Я имел виду, есть на него события когда он появляется на карте, вот передавать по таймеру его данные, да пробовал не вариант. Нужно тогда отдельное событие для выживших.
Кстати что означает у тебя булева переменная hasVisibleThreats?
Блокирует эту часть кода:
PHP:
if(GetEntProp(ent, Prop_Send, "m_hasVisibleThreats") == 0 && !hasVisibleThreats)
    {
        hasVisibleThreats = true;
        StopFly(ent);
        PrintToChatAll("\x03[\x04FLY TANK\x03] \x05Потерял выживших");
        for(int i = 1; i < MaxClients; i++)
        {
            if (i != ent && IsClientInGame(i) && GetClientTeam(i) == 2 && IsPlayerAlive(i))
            {
                float pos[3];
                GetClientAbsOrigin(i, pos);
                TeleportEntity(ent, pos, NULL_VECTOR,NULL_VECTOR);
                break;
            }
        }
        PrintToChatAll("\x03[\x04FLY TANK\x03] \x05Был телепортирован к выжившим");
    }
оказывается если просто танк отвернется рядом с выживших m_hasVisibleThreats меняется на ноль, типа угрозы нету (потерял выживших все). Получается тогда уже не контролируемая телепортация. Вот по этому я пытаюсь использовать в цикле, что выжившие все больше не видят танка и танк больше не видит выживших.
PHP:
for(int i = 1; i <= MaxClients; i++)
            if(i != client && IsClientInGame(i) && (GetClientTeam(i) == 2 || IsInfected(i, ZOMBIECLASS_TANK)))
            {
                if(GetEntProp(i, Prop_Send, "m_hasVisibleThreats"))
                    PrintToChatAll("true"), hasVisibleThreats = true;
                else PrintToChatAll("false"), hasVisibleThreats = false;
            }
а сейчас получается так, если даже танка нету. а выживший видит любого зараженного начинается не контролируемая изменение переменной false/true .
PHP:
if(i != client && IsClientInGame(i) && (GetClientTeam(i) == 2 || IsInfected(i, ZOMBIECLASS_TANK)))
видимо эта часть кода так выполняется из-за ||
--- Добавлено позже ---
Можно как нибудь ломать цикл, если хотя бы у одного игрока?
PHP:
GetEntProp(ent, Prop_Send, "m_hasVisibleThreats") == 1
а если ноль продолжать проверку.
 
Последнее редактирование:
Сверху Снизу