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

DarkerZ

Участник
Сообщения
395
Реакции
175
Напишите плагин, чтобы рандомно несколько пуль не регало в человека
C-подобный:
#include <sdkhooks>
#define RANDOM_PERCENT 5

public void OnClientPutInServer(int iClient)
{
    SDKHook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}

public void OnClientDisconnect(int iClient)
{
    SDKUnhook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action OnTakeDamage(int iClient, int &iAttacker, int &iInflictor, float &iDamage, int &iDamagetype)
{
    if(GetClientTeam(iClient) > 1 && iClient != iAttacker && iAttacker > 0 && iAttacker <= MaxClients && GetRandomInt(0,100) < RANDOM_PERCENT) return Plugin_Handled;
    return Plugin_Continue;
}
 
Последнее редактирование:

paradoks5312

Участник
Сообщения
34
Реакции
7
Доброго времени суток, умные люди, подскажите пожалуйста: как сделать чтобы текст вывода по центру не исчезал сразу, а висел секунд 10.
C-подобный:
#pragma semicolon 1
#include <sourcemod>

#define PLUGIN_VERSION "0.08"

#define YELLOW               0x01
#define NAME_TEAMCOLOR       0x02
#define TEAMCOLOR            0x03
#define GREEN                0x04

public Plugin:myinfo =
{
    name = "Most destructive",
    author = "X@IDER",
    description = "Show most dsestructive player at end of round",
    version = PLUGIN_VERSION,
    url = "http://www.sourcemod.net/"
};

new GDamage[66],GPlayers[66],GHits[66];

new Handle:sm_most_damage_mode = INVALID_HANDLE;
new Handle:sm_most_damage_lines = INVALID_HANDLE;

new String:DmgParam[16] = "dmg_health";    // cstrike, l4d, insurgency

public OnPluginStart()
{
    LoadTranslations("plugin.mdest");

    sm_most_damage_mode = CreateConVar("sm_md_mode", "1", "0 - display in chat, 1 - in hint", 0);
    sm_most_damage_lines = CreateConVar("sm_md_lines", "3", "0 - none, 1 - most damage, 2 - most kills, 3 - both", 0);
    
    HookEvent("round_start", Round_Start, EventHookMode_PostNoCopy);
    HookEvent("round_end", Round_End, EventHookMode_PostNoCopy);
    HookEvent("player_hurt", Damage, EventHookMode_Post);
    HookEvent("player_death", Death, EventHookMode_Post);
    
    new String:GameDir[32];
    GetGameFolderName(GameDir,32);
    
    if (!strcmp(GameDir,"dod")) DmgParam = "damage";
}

public SayText2(to, from, const String:format[], any:...)
{
    decl String:message[256];
    VFormat(message,sizeof(message),format,4);
    
    new Handle:hBf = StartMessageOne("SayText2", to);
    BfWriteByte(hBf, from);
    BfWriteByte(hBf, true);
    BfWriteString(hBf, message);
    
    EndMessage();
}

public Death(Handle:event, const String:name[], bool:dontBroadcast)
{
    new t = GetClientOfUserId(GetEventInt(event,"attacker"));
    if (t) GPlayers[t]++;
}

public Damage(Handle:event, const String:name[], bool:dontBroadcast)
{
    new t = GetClientOfUserId(GetEventInt(event,"attacker"));   
    if (t)
    {
        GDamage[t] += GetEventInt(event,DmgParam);
        GHits[t]++;
    }
}

public Round_Start(Handle:event, const String:name[], bool:dontBroadcast)
{
    for (new i = 1; i <= MaxClients; i++)
    GDamage[i] = GPlayers[i] = GHits[i] = 0;
}

public Round_End(Handle:event, const String:name[], bool:dontBroadcast)
{
    new maxGD = 0,maxGP = 0;
    GDamage[0] = GPlayers[0] = GHits[0] = 0;

    new String:nameGD[32],String:nameGP[32];

    for (new i = 1; i <= MaxClients; i++)
    if (IsClientInGame(i))
    {
        if (GDamage[i] > GDamage[maxGD]) maxGD = i;
        else if ((GDamage[i] == GDamage[maxGD]) && (GPlayers[i] > GPlayers[maxGD])) maxGD = i;
        if (GPlayers[i] > GPlayers[maxGP]) maxGP = i;
        else if ((GDamage[i] > GDamage[maxGP]) && (GPlayers[i] == GPlayers[maxGP])) maxGP = i;
    }

    GetClientName(maxGD,nameGD,31);
    GetClientName(maxGP,nameGP,31);

    new lines = GetConVarInt(sm_most_damage_lines);

    if (GetConVarBool(sm_most_damage_mode))
    {
        decl String:buff[512],String:line[512];
        buff[0] = 0;
        if (maxGP && (lines & 2))
        {
            Format(line,512,"%t","Max kills",nameGP,GDamage[maxGP],GPlayers[maxGP],GHits[maxGP]);
            StrCat(buff,512,line);
        }
        if (buff[0]) PrintCenterTextAll(buff);
    } else
    {
        for (new i = 1; i <= MaxClients; i++)
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            if (maxGP && (lines & 2)) SayText2(i,maxGP,"%t","Maximum kills",YELLOW,TEAMCOLOR,nameGP,YELLOW,GREEN,GDamage[maxGP],YELLOW,GREEN,GPlayers[maxGP],YELLOW,GREEN,GHits[maxGP],YELLOW);
        }
    }
}
Заранее благодарю!
 

mikhail112322345

Участник
Сообщения
1
Реакции
0
Система дропа

1.Объясняю. что бы у каждого игрока был отдельный инвентарь
2. Что бы на сервере была система кейсов откуда игроки могли выбивать скины и они добавлялись бы им отдельно в инвентарь ,
3. Выпадения скинов за хорошую игру после раунда
4.Что был магазин где можно было бы продовать или покупать эти скины
просто когда всем бесплатно , то это не сильно как то создает ценность серверу а так прям ухх ))
Ищу короче кто осилит это написать , если кто и осилит то пишите в дискорде "warriorarks" или тут на сайте
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Система дропа

1.Объясняю. что бы у каждого игрока был отдельный инвентарь
2. Что бы на сервере была система кейсов откуда игроки могли выбивать скины и они добавлялись бы им отдельно в инвентарь ,
3. Выпадения скинов за хорошую игру после раунда
4.Что был магазин где можно было бы продовать или покупать эти скины
просто когда всем бесплатно , то это не сильно как то создает ценность серверу а так прям ухх ))
Ищу короче кто осилит это написать , если кто и осилит то пишите в дискорде "warriorarks" или тут на сайте
Если цена этому будет равна free, то никто не осилит, не в том плане, что не сможет, а в том плане, что живем 1 раз, зачем столько времени тратить на кого-то?
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Система дропа

1.Объясняю. что бы у каждого игрока был отдельный инвентарь
2. Что бы на сервере была система кейсов откуда игроки могли выбивать скины и они добавлялись бы им отдельно в инвентарь ,
3. Выпадения скинов за хорошую игру после раунда
4.Что был магазин где можно было бы продовать или покупать эти скины
просто когда всем бесплатно , то это не сильно как то создает ценность серверу а так прям ухх ))
Ищу короче кто осилит это написать , если кто и осилит то пишите в дискорде "warriorarks" или тут на сайте
Есть просто система кейсов, где игрокам выпадают скины в их инвентарь, но это платно и это только под CS:GO.
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Добавь пожалуйста текста,если время будет.
Чтоб при спавне писало игрокам,что стрельба только с No Zoom.
Заранее благодарю!
C++:
public void OnPluginStart()
{
    HookEvent("player_spawn", spawn);
}

public void spawn(Event hEvent, const char[] sEvent, bool bdb)
{
    int client = GetClientOfUserId(hEvent.GetInt("userid"));
    
    if(client < 1 || client > MaxClients)
        return Plugin_Continue;
        
    if(!IsClientInGame(client))
        return Plugin_Continue;
        
    if(IsFakeClient(client))
        return Plugin_Continue;
        
    if(bEnable)
        PrintToChat(client, "Стрельба только No Zoom")
    
    return Plugin_Continue;
}
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
@-=|УЧЕНИК|=-, добавил, но просто при спавне это излишне, кмк. В начале раунда сообщения для всех хватило бы.
 

Вложения

  • sm_no_zoom_awp 1.0.1_22.09.2023.sp
    1.7 КБ · Просмотры: 9

khood

Участник
Сообщения
214
Реакции
51
Пожалуйста, реализуйте еще отображение информации об игроке в игровом процессе.
C++:
Action Timer_Updater(Handle timer)
{
    char sBuffer[255];
    for (int i = 1; i <= MaxClients; ++i)
    {
        if (IsClientInGame(i) && !IsPlayerAlive(i))
        {
            int m_iObserverMode = GetEntProp(i, Prop_Send, "m_iObserverMode");
            if (m_iObserverMode < 4 || 6 < m_iObserverMode)
                continue;

            int iTarget = GetEntPropEnt(i, Prop_Send, "m_hObserverTarget");
            if (iTarget < 1 || MaxClients < iTarget)
                continue;

            if ((iRANK[iTarget] = LR_GetClientInfo(iTarget, ST_RANK)) < 1 || 18 < iRANK[iTarget])
                continue;

            int next = iRANK[iTarget] < 18 ? g_hEXP.Get(iRANK[iTarget]) : 0;
            char sRANK[128];
            FormatEx(sRANK, sizeof(sRANK), "rank_%i", iRANK[iTarget]);
            FormatEx(sBuffer, 255, "Игрок %N\nРанг: (%T)\n Опыт: (%i / %i)\n Кредиты: (%i)\n Здоровье: (%i)\n Броня: (%i)", iTarget, sRANK, iTarget, LR_GetClientInfo(iTarget, ST_EXP), next, Shop_GetClientCredits(iTarget), GetClientHealth(iTarget), GetClientArmor(iTarget));

            hShowStats[i] = StartMessageOne("KeyHintText", i);
            {
                BfWriteByte(hShowStats[i], 1);
                BfWriteString(hShowStats[i], sBuffer);
            }
            EndMessage();
        }
    }
    return Plugin_Continue;
}
 

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

вся жизнь,сплошной цирк.
Сообщения
876
Реакции
212

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Пожалуйста, реализуйте еще отображение информации об игроке в игровом процессе.
C++:
Action Timer_Updater(Handle timer)
{
    char sBuffer[255];
    for (int i = 1; i <= MaxClients; ++i)
    {
        if (IsClientInGame(i) && !IsPlayerAlive(i))
        {
            int m_iObserverMode = GetEntProp(i, Prop_Send, "m_iObserverMode");
            if (m_iObserverMode < 4 || 6 < m_iObserverMode)
                continue;

            int iTarget = GetEntPropEnt(i, Prop_Send, "m_hObserverTarget");
            if (iTarget < 1 || MaxClients < iTarget)
                continue;

            if ((iRANK[iTarget] = LR_GetClientInfo(iTarget, ST_RANK)) < 1 || 18 < iRANK[iTarget])
                continue;

            int next = iRANK[iTarget] < 18 ? g_hEXP.Get(iRANK[iTarget]) : 0;
            char sRANK[128];
            FormatEx(sRANK, sizeof(sRANK), "rank_%i", iRANK[iTarget]);
            FormatEx(sBuffer, 255, "Игрок %N\nРанг: (%T)\n Опыт: (%i / %i)\n Кредиты: (%i)\n Здоровье: (%i)\n Броня: (%i)", iTarget, sRANK, iTarget, LR_GetClientInfo(iTarget, ST_EXP), next, Shop_GetClientCredits(iTarget), GetClientHealth(iTarget), GetClientArmor(iTarget));

            hShowStats[i] = StartMessageOne("KeyHintText", i);
            {
                BfWriteByte(hShowStats[i], 1);
                BfWriteString(hShowStats[i], sBuffer);
            }
            EndMessage();
        }
    }
    return Plugin_Continue;
}
Точнее опишите задачу
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Пожалуйста, реализуйте еще отображение информации об игроке в игровом процессе.
C++:
Action Timer_Updater(Handle timer)
{
    char sBuffer[255];
    for (int i = 1; i <= MaxClients; ++i)
    {
        if (IsClientInGame(i) && !IsPlayerAlive(i))
        {
            int m_iObserverMode = GetEntProp(i, Prop_Send, "m_iObserverMode");
            if (m_iObserverMode < 4 || 6 < m_iObserverMode)
                continue;

            int iTarget = GetEntPropEnt(i, Prop_Send, "m_hObserverTarget");
            if (iTarget < 1 || MaxClients < iTarget)
                continue;

            if ((iRANK[iTarget] = LR_GetClientInfo(iTarget, ST_RANK)) < 1 || 18 < iRANK[iTarget])
                continue;

            int next = iRANK[iTarget] < 18 ? g_hEXP.Get(iRANK[iTarget]) : 0;
            char sRANK[128];
            FormatEx(sRANK, sizeof(sRANK), "rank_%i", iRANK[iTarget]);
            FormatEx(sBuffer, 255, "Игрок %N\nРанг: (%T)\n Опыт: (%i / %i)\n Кредиты: (%i)\n Здоровье: (%i)\n Броня: (%i)", iTarget, sRANK, iTarget, LR_GetClientInfo(iTarget, ST_EXP), next, Shop_GetClientCredits(iTarget), GetClientHealth(iTarget), GetClientArmor(iTarget));

            hShowStats[i] = StartMessageOne("KeyHintText", i);
            {
                BfWriteByte(hShowStats[i], 1);
                BfWriteString(hShowStats[i], sBuffer);
            }
            EndMessage();
        }
    }
    return Plugin_Continue;
}
Проверяй
 

Вложения

  • Info_Client.sp
    1.7 КБ · Просмотры: 14

khood

Участник
Сообщения
214
Реакции
51
Fix eror:
L 09/27/2023 - 14:08:29: [SM] Exception reported: Entity 5 (5) is invalid
L 09/27/2023 - 14:08:29: [SM] Blaming: shop_speed.smx
L 09/27/2023 - 14:08:29: [SM] Call stack trace:
L 09/27/2023 - 14:08:29: [SM]   [0] SetEntPropFloat
L 09/27/2023 - 14:08:29: [SM]   [1] Line 134, C:\Documents and Settings\Admin\ \sourcemod\shop\shop_speed.sp::SetSpeed
 

Вложения

  • shop_speed.sp
    3.3 КБ · Просмотры: 5

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Fix eror:
L 09/27/2023 - 14:08:29: [SM] Exception reported: Entity 5 (5) is invalid
L 09/27/2023 - 14:08:29: [SM] Blaming: shop_speed.smx
L 09/27/2023 - 14:08:29: [SM] Call stack trace:
L 09/27/2023 - 14:08:29: [SM]   [0] SetEntPropFloat
L 09/27/2023 - 14:08:29: [SM]   [1] Line 134, C:\Documents and Settings\Admin\ \sourcemod\shop\shop_speed.sp::SetSpeed
Добавь проверку
C-подобный:
IsClientInGame(client) && IsPlayerAlive(client)
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Всем доброго времени суток, подскажите пожалуйста, как можно получить конкретный %. Я использую GetRandomFloat(1.0, 100.0) <= шанс. Но как по мне этот пример не является корректным, т.к. сгенерированное число может быть несколько раз подряд > того диапазона что указан. Хотело бы получить именно тот шанс что я указал. Если это конечно возможно сделать
Пример:
Я указал шанс в 3% и именно с шансом в 3% произойдет событие.
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Всем доброго времени суток, подскажите пожалуйста, как можно получить конкретный %. Я использую GetRandomFloat(1.0, 100.0) <= шанс. Но как по мне этот пример не является корректным, т.к. сгенерированное число может быть несколько раз подряд > того диапазона что указан. Хотело бы получить именно тот шанс что я указал. Если это конечно возможно сделать
Пример:
Я указал шанс в 3% и именно с шансом в 3% произойдет событие.
А чем тебе не нравится такой вариант? И как число может быть больше указанного диапазона?


C-подобный:
PrintToChatAll("%s", ReturnAccept(0.03) ? "Повезло" : "Не повезло");

stock bool ReturnAccept(float fChance)
{
    return (GetRandomInt(1, 100) > RoundToFloor(fChance * 100.0)) ? false : true;
}
 
Последнее редактирование:

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
А чем тебе не нравится такой вариант?
C-подобный:
bool ReturnAccept(float fChance)
{
    return (GetRandomInt(1, 100) > RoundToFloor(fChance * 100.0)) ? false : true;
}
Это ж фактически тоже самое, только в вашем примере идет округление. А хотелось бы получить реальный шанс
 
Сверху Снизу