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

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
а в чём проблема вывести по событию? раунд ведь завершается по разминированию бомбы
Name:bomb_defused
Structure:
shortuseridplayer who defused the bomb
shortsitebombsite index
Мне нужно именно в событии конца раунда вывести сообщение о том что игрок разминировал бомбу
Получается вот что я хочу сделать:
В конце раунда (В событии конца раунда) должно быть так: Если бомба разминирована, то выводится об этом текст, если нет то выводится другой текст.
Сделать это надо именно в событии конца раунда, так там идет проверка на бобедившую команду
 
Последнее редактирование:

DarkerZ

Участник
Сообщения
395
Реакции
175
Мне нужно именно в событии конца раунда вывести сообщение о том что игрок разминировал бомбу
Получается вот что я хочу сделать:
В конце раунда (В событии конца раунда) должно быть так: Если бомба разминирована, то выводится об этом текст, если нет то выводится другой текст.
Сделать это надо именно в событии конца раунда, так там идет проверка на бобедившую команду
Попробуй записать в переменную код события(сам придумай значения) и userid игрока, ну и в конце раунда через case выполняй те или иные действия
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Мне нужно именно в событии конца раунда вывести сообщение о том что игрок разминировал бомбу
Получается вот что я хочу сделать:
В конце раунда (В событии конца раунда) должно быть так: Если бомба разминирована, то выводится об этом текст, если нет то выводится другой текст.
Сделать это надо именно в событии конца раунда, так там идет проверка на бобедившую команду
Вот так хочешь?
4.png3.png
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Почти, я пытаюсь сделать СЦИ с csgo для css v34. Хочу чтоб рандомно писало Самого Ценного Игрока, в зависимости от того что он сделал. К примеру: Если игрок разминировал бомбу, то с опр. шансом ему дадут СЦИ. И вот сделал уже все, кроме того, о чем выше писал.
1691477040631.png

Сообщения автоматически склеены:

Попробуй записать в переменную код события(сам придумай значения) и userid игрока, ну и в конце раунда через case выполняй те или иные действия
В какую переменную можно записать данные с события?
 
Последнее редактирование:

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Подскажите пожалуйста, как сделать чтоб меню не закрывалось при выборе пункта:

Код:
#pragma newdecls required

public void OnPluginStart()
{
    RegConsoleCmd("sm_menu", Command_OpenMenu);
}

public Action Command_OpenMenu(int iClient, int args)
{
    Menu hMenu = new Menu(MenuHandler_MyMenu);
    hMenu.SetTitle("Название меню");
    hMenu.AddItem("", "Пункт 1");
    hMenu.AddItem("", "Пункт 2");
    hMenu.AddItem("", "Пункт 3");
    hMenu.AddItem("", "Пункт 4");
    hMenu.Display(iClient, 30);
    hMenu.ExitButton = true;
}

public int MenuHandler_MyMenu(Menu hMenu, MenuAction action, int client, int param)
{
    if(action == MenuAction_End)
    {
        hMenu.Close();
    }

    if(action == MenuAction_Select)
    {
        switch(param)
        {
            case 0:    {
                PrintToChat(client, "Пункт 1");
            }
            case 1:    {
                PrintToChat(client, "Пункт 2");
            }

            case 2:    {
                PrintToChat(client, "Пункт 3");
            }

            case 3:    {
                PrintToChat(client, "Пункт 4");
            }
        }
    }
}
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Подскажите пожалуйста, как сделать чтоб меню не закрывалось при выборе пункта:

Код:
#pragma newdecls required

public void OnPluginStart()
{
    RegConsoleCmd("sm_menu", Command_OpenMenu);
}

public Action Command_OpenMenu(int iClient, int args)
{
    Menu hMenu = new Menu(MenuHandler_MyMenu);
    hMenu.SetTitle("Название меню");
    hMenu.AddItem("", "Пункт 1");
    hMenu.AddItem("", "Пункт 2");
    hMenu.AddItem("", "Пункт 3");
    hMenu.AddItem("", "Пункт 4");
    hMenu.Display(iClient, 30);
    hMenu.ExitButton = true;
}

public int MenuHandler_MyMenu(Menu hMenu, MenuAction action, int client, int param)
{
    if(action == MenuAction_End)
    {
        hMenu.Close();
    }

    if(action == MenuAction_Select)
    {
        switch(param)
        {
            case 0:    {
                PrintToChat(client, "Пункт 1");
            }
            case 1:    {
                PrintToChat(client, "Пункт 2");
            }

            case 2:    {
                PrintToChat(client, "Пункт 3");
            }

            case 3:    {
                PrintToChat(client, "Пункт 4");
            }
        }
    }
}
При нажатие на пунк открывай его заново, то есть функцию впиши ту которая открывает меню.
 

khood

Участник
Сообщения
214
Реакции
51
👋, можете написать плагин чтобы по заложникам пули не регались (грубо говоря чтобы нельзя было убить заложников) игра css: ob
 

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
Всем привет
Вопрос по коду
Как привязать ентити к другому ентити, при этом чтобы оно повторяло только позицию родителя, но не углы

code:
#pragma semicolon 1

#include <sdktools>

#pragma newdecls required

#define dPush 100.0

int   
    Screen[MAXPLAYERS+1],
    Melon[MAXPLAYERS+1];
float
    MelonPos[MAXPLAYERS],
    MelonEndPos[MAXPLAYERS+1],
    MelonVel[MAXPLAYERS+1][3];

public void OnPluginStart(){
    HookEvent("player_spawn", OnPlayerSpawn);
    HookEvent("round_end", OnRoundEnd);
    CreateTimer(0.1, GlobalTimer, _, 1|1);
}
public void OnMapStart(){
    PrecacheModel("models/props_junk/watermelon01.mdl", true);
    AddFileToDownloadsTable("models/props_junk/watermelon01.dx80.vtx");
    AddFileToDownloadsTable("models/props_junk/watermelon01.dx90.vtx");
    AddFileToDownloadsTable("models/props_junk/watermelon01.mdl");
    AddFileToDownloadsTable("models/props_junk/watermelon01.phy");
    AddFileToDownloadsTable("models/props_junk/watermelon01.sw.vtx");
    AddFileToDownloadsTable("models/props_junk/watermelon01.vvd");
}
public void OnPlayerSpawn(Event event, const char[] name, bool db){
    int client = GetClientOfUserId(event.GetInt("userid"));

    Melon[client] = CreateEntityByName("prop_physics");

    if(Melon[client] < 1)
        return;

    float pos[3]; GetClientEyePosition(client, pos);

    SetEntityModel(Melon[client], "models/props_junk/watermelon01.mdl");
    
    TeleportEntity(Melon[client], pos, NULL_VECTOR, NULL_VECTOR);

    DispatchSpawn(Melon[client]);
    
    SetScreen(client, Melon[client]);
}
stock Action SetScreen(int client, int ToEnt){
    if(IsValidClient(client)){
        int entity = CreateEntityByName("prop_dynamic_ornament");
        if(entity < 1) return Plugin_Handled;

        Screen[client] = entity;

        DispatchKeyValue(entity, "model", "models/props_junk/watermelon01.mdl");
        DispatchKeyValue(entity, "solid", "0");
        SetEntityRenderMode(entity, RENDER_NONE)

        float pos[3]; GetEntPropVector(Melon[client], Prop_Send, "m_vecOrigin", pos);
        pos[2] += 100.0;
        DispatchKeyValueVector(entity, "origin", pos);
        
        float ang[3] = {90.0, 0.0, 0.0};
        DispatchKeyValueVector(entity, "angles", ang);
        DispatchSpawn(entity);

        SetVariantString("!activator");
        AcceptEntityInput(entity, "SetParent", ToEnt, entity);
        
        // SetVariantString("primary");
        // AcceptEntityInput(entity, "SetParentAttachment", client, entity);
        
        // SetVariantString("baseorigin");
        // AcceptEntityInput(entity, "SetParentAttachmentMaintainOffset", client, entity, 2);
        
        SetClientViewEntity(client, entity);
    }
    return Plugin_Continue;
}
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(IsValidClient(client) && IsPlayerAlive(client)){
        if(IsValidEntity(Melon[client])){
            float push[3];
            for(int x; x<3; x++)
                push[x] = MelonVel[client][x];

            if(buttons & IN_FORWARD || buttons & IN_MOVELEFT || buttons & IN_MOVERIGHT || buttons & IN_BACK || buttons & IN_JUMP){
                float sPush = dPush*1.3;
                
                if(buttons & IN_FORWARD)
                    push[0] = Lerp(0.05, 0.01, push[0], sPush);
                if(buttons & IN_MOVELEFT)
                    push[1] = Lerp(0.05, 0.01, push[1], sPush);
                if(buttons & IN_MOVERIGHT)
                    push[1] = Lerp(0.05, 0.01, push[1], -sPush);
                if(buttons & IN_BACK)
                    push[0] = Lerp(0.05, 0.01, push[0], -sPush);
                if(buttons & IN_JUMP)
                    if(push[2] < 0.1 && (MelonPos[client] - MelonEndPos[client]) < 8.87)
                        push[2] = Lerp(0.05, 0.75, push[2], sPush*2);
                        
                for(int x; x<3; x++)
                    MelonVel[client][x] = push[x];

                TeleportEntity(Melon[client], NULL_VECTOR, NULL_VECTOR, push);
            }
        }
    }
    return Plugin_Continue;
}
public Action GlobalTimer(Handle timer){
    for(int client = 1; client <= MaxClients; client++){
        if(IsValidClient(client) && IsPlayerAlive(client)){
            if(IsValidEntity(Melon[client])){
                float push[3];
                for(int x; x<3; x++)
                    push[x] = MelonVel[client][x];

                if(!(GetClientButtons(client)&IN_FORWARD))
                    push[0] = Lerp(0.05, 0.05, push[0], 0.0);
                if(!(GetClientButtons(client)&IN_MOVELEFT))
                    push[1] = Lerp(0.05, 0.05, push[1], 0.0);
                if(!(GetClientButtons(client)&IN_BACK))
                    push[0] = Lerp(0.05, 0.05, push[0], 0.0);
                if(!(GetClientButtons(client)&IN_MOVERIGHT))
                    push[1] = Lerp(0.05, 0.05, push[1], 0.0);

                float ang[3] = {90.0, 0.0, 0.0};
                float pos[3], EndPos[3];
                GetEntPropVector(Melon[client], Prop_Send, "m_vecOrigin", pos);
                TR_TraceRayFilter(pos, ang, MASK_SOLID, RayType_Infinite, EndPosFilter, Melon[client]);
                TR_GetEndPosition(EndPos);

                MelonPos[client] = pos[2];
                MelonEndPos[client] = EndPos[2];

                if((MelonPos[client] - MelonEndPos[client]) > 9.0)
                    push[2] = Lerp(0.05, 0.05, push[2], -300.0);
                else push[2] = 0.0;

                PrintHintText(client, "[%.1f][%.1f][%.1f]\n[%.1f]-[%.1f]=[%.1f]", push[0], push[1], push[2], MelonPos[client], MelonEndPos[client], MelonPos[client]-MelonEndPos[client]);

                TeleportEntity(Melon[client], NULL_VECTOR, NULL_VECTOR, push);
                
                for(int x; x<3; x++)
                    MelonVel[client][x] = push[x];
            }
        }
    }
}
public void OnRoundEnd(Event event, const char[] name, bool db){
    for(int client = 1; client <= MaxClients; client++){
        if(IsValidEntity(Melon[client])){
            AcceptEntityInput(Melon[client], "kill");
            Melon[client] = 0;
        }
        if(IsValidEntity(Screen[client])){
            AcceptEntityInput(Screen[client], "kill");
            Screen[client] = 0;
        }
    }
}
stock float Lerp(float MinDiff, float t, float start, float end){
    float result = start + t * (end - start);
    if(MinDiff > 0.0){
        if(result > start && result - start < MinDiff){
            result = start + MinDiff;
        }
        else if(result < start && start - result < MinDiff){
            result = start - MinDiff;
        }
    }
    return result;
}
public bool EndPosFilter(int ent, int mask, any index){
    return index != ent;
}
stock bool IsValidClient(int iClient){
    if(iClient <= 0 || iClient > MaxClients || !IsClientInGame(iClient) || !IsClientConnected(iClient))
        return false;
    return true;
}
 

Grey83

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

@NeLifeASkazka, по коду: в OnRoundEnd() можно арбузы не уничтожать: в следующем раунде они всё равно должны пропасть (просто обнуляй индексы).
И добавлять модельку в автозагрузку тоже не нужно, т.к. это стандартная моделька игры, насколько я понимаю.
CreateTimer(0.1, GlobalTimer, _, 1|1);
тащемта 1|1 равно 1 =)

if(buttons & IN_FORWARD || buttons & IN_MOVELEFT || buttons & IN_MOVERIGHT || buttons & IN_BACK || buttons & IN_JUMP){
можно заменить на
if(buttons & (IN_FORWARD|IN_MOVELEFT|IN_MOVERIGHT|IN_BACK|IN_JUMP)){

C-подобный:
stock bool IsValidClient(int iClient){
    if(iClient <= 0 || iClient > MaxClients || !IsClientInGame(iClient) || !IsClientConnected(iClient))
        return false;
    return true;
}
В случае твоего кода можно упростить до вот этого:
C-подобный:
stock bool IsValidClient(int iClient){
    return IsClientInGame(iClient);
}

Ну и при смерти игрока надо бы, наверное, убивать энтити арбуза (ну или обнулять значение Melon[client], а в циклах ещё и проверять равно ли нулю это значение, а не просто IsValidEntity(Melon[client])).
 
Последнее редактирование:

Artem Chertov

Участник
Сообщения
55
Реакции
9
Доброй ночи
Можете сделать плагин, который при использовании команды !ahide спрячет админа из списка !admins
 

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
Доброй ночи
Можете сделать плагин, который при использовании команды !ahide спрячет админа из списка !admins
upd* Неправильно понял, извините
Сообщения автоматически склеены:

В смысле не поворачивало вслед за игроком? Только телепортировать вслед за игроком каждый тик, насколько я понимаю.
Вот как оно сейчас выглядит
Я думал как-то сделать чтобы оно только телепортировалось/привязывалось по позиции, а углы менять получая углы самого игрока
 
Последнее редактирование:

d3v

Участник
Сообщения
470
Реакции
146
Доброй ночи
Можете сделать плагин, который при использовании команды !ahide спрячет админа из списка !admins
 

Artem Chertov

Участник
Сообщения
55
Реакции
9
Большое спасибо! Давно искал этот плагин
Правда хотелось бы, чтобы можно было пропадать из списка !admins и без входа в наблюдатели
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Всем добрый день, подскажите пожалуйста, как вывести текст только по одному из двух условий, при условии, что оба условия одновременно были выполнены. Например, есть условия A и B. Условие А выводит текст - "Условие А выполнено", Условие В выводит текст - "Условие В выполнено". Нужно вывести текст одного из- этих условий при том что они оба были выполнены
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Всем добрый день, подскажите пожалуйста, как вывести текст только по одному из двух условий, при условии, что оба условия одновременно были выполнены. Например, есть условия A и B. Условие А выводит текст - "Условие А выполнено", Условие В выводит текст - "Условие В выполнено". Нужно вывести текст одного из- этих условий при том что они оба были выполнены
&& + GetRandom ?
 
Сверху Снизу