Не корректно работает плагин, мой первый плагин

kepay

Участник
Сообщения
20
Реакции
2
Попытался написать простой плагин, он получилось, как получилось. Плагин должен дать игроку набившему больше все фрагов в прошлом раунде бонусы, а именно hp, броню, гранаты, ак, мк и деньги. От выдает бонусы всем кто сделал хотя бы один фраг
PHP:
#include <sourcemod>
#include <sdktools>
#include <cstrike>
new players_key[MAXPLAYERS+1];
public OnPluginStart() 
{ 

    HookEvent("round_start", roundStart); 
    HookEvent("player_death", player_death);
}
 
public Action:roundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
   PrintToChatAll("Топ Фрагеры получают статус ПРОФИ на раунд.");
   PrintToChatAll("ПРОФИ получают 110hp, набор гранат, m4a1, ak47 и 8 000$");
   for ( new client = 1; client <= MaxClients+1; client++){
    //if (!IsPlayerGenericAdmin(client)){
        if (IsValidClient(client, true)){
            
            new key = false;
            for (new i = 1 ; i <=  MaxClients+1 ; i++) {
                if (players_key[i] <= players_key[client]) {
                    if (players_key[client] != 0) key = true;
                } else key = false;
                
            }
            
            
            //PrintToServer("client: %s", " " + client);
            
            //if (IsClientInGame(client)) PrintToChatAll("%N <index = %d>", GetClientUserId(client), GetClientUserId(client));
            
            if (key) {
                decl String:nik[MAX_NAME_LENGTH];
                GetClientName(client, nik, MAX_NAME_LENGTH);
                //PrintToChatAll("nick = %s", nik);
                PrintToChatAll("ПРОФИ в этом раунде %s", nik);
                new team = GetClientTeam(client);
                SetEntProp(client, Prop_Send, "m_ArmorValue", 110, 4);
                SetEntProp(client, Prop_Send, "m_bHasHelmet", 1);
                GivePlayerItem(client, "weapon_flashbang");
                GivePlayerItem(client, "weapon_flashbang");
                GivePlayerItem(client, "weapon_hegrenade");
                GivePlayerItem(client, "weapon_smokegrenade");           
                if (GetTeamScore(CS_TEAM_T)+GetTeamScore(CS_TEAM_CT) > 1){
                   //decl CurrentMoney; 
                   //CurrentMoney = GetEntProp(client, Prop_Send, "m_iAccount"); 
                   SetEntProp(client, Prop_Send, "m_iAccount", 8000);
                }           
                if(team == CS_TEAM_CT)
                {
                   GivePlayerItem(client, "item_defuser");
                   GivePlayerItem(client, "weapon_m4a1");
                   GivePlayerItem(client, "weapon_ak47");
                   GivePlayerItem(client, "weapon_incgrenade");
                }           
                if(team == CS_TEAM_T)
                {
                   GivePlayerItem(client, "weapon_m4a1");
                   GivePlayerItem(client, "weapon_ak47");
                   GivePlayerItem(client, "weapon_molotov");
                }
            }
        }
      //}   
    }
    for (new client = 1; client <= MaxClients+1; client++){
        players_key[client] = 0;
    }
}
 
public player_death(Handle:event, const String:name[], bool:dontBroadcast)
{
     new client = GetClientOfUserId(GetEventInt(event, "attacker"));
     if (client > 0 && GetClientTeam(client) != GetClientTeam(GetClientOfUserId(GetEventInt(event, "userid"))))
     {
         players_key[client] += 1;
     }
}

 
bool:IsPlayerGenericAdmin(client)
{
   return CheckCommandAccess(client, "generic_admin", ADMFLAG_GENERIC, false);
}
 
bool:IsValidClient(client, bool:alive = false) 
{ 
    return (client >= 1 && client <= MaxClients && IsClientConnected(client) && IsClientInGame(client) && (alive == false || IsPlayerAlive(client))); 
}

Так, для справки, плагин, из интернета я дописал под свои нужды
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
просто нужно было выдавать бонусы после цикла, в котором выясняется игрок с самым большим количеством фрагов, а не внутри него
 

Kllaster

Участник
Сообщения
47
Реакции
7
Держи, думаю сам под себя подправишь
PHP:
#include <sourcemod>
#include <sdktools>
#include <cstrike>

#pragma semicolon 1

#pragma newdecls required

int g_iKliis[MAXPLAYERS+1] = 0;

public void OnPluginStart()
{
HookEvent("player_death", Event_PlayerDeath);
HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
}

public Action Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
int iAttackerClient = GetClientOfUserId(hEvent.GetInt("attacker"));
g_iKliis[iAttackerClient]++;
}

public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
int iMVPClient;
int iMaxKills;
char nik[MAX_NAME_LENGTH];

for(int i = 1; i < MaxClients; ++i)
{
if(IsClientInGame(i)){
if (g_iKliis[i] > iMaxKills)
{
iMaxKills = g_iKliis[i];
}
}
}

for(int i = 0; i < MaxClients; ++i)
{
if(g_iKliis [i] == iMaxKills){
iMVPClient = i;
break;
}
}

GetClientName(iMVPClient, nik, MAX_NAME_LENGTH);
PrintToChatAll("ПРОФИ в этом раунде %s с %i килами", nik, iMaxKills);

GivePlayerItem(iMVPClient, "weapon_ak47");

for(int i = 0; i < MaxClients; ++i)
{
g_iKliis[i] = 0;
}

return;
}
 
Последнее редактирование:

kepay

Участник
Сообщения
20
Реакции
2
Держи, думаю сам под себя подправишь
C-подобный:
#include <sourcemod>
#include <sdktools>
#include <cstrike>

#pragma semicolon 1

#pragma newdecls required

int g_iKliis[MAXPLAYERS+1] = 0;

public void OnPluginStart()
{
HookEvent("player_death", Event_PlayerDeath);
HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
}

public Action Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
int iAttackerClient = GetClientOfUserId(hEvent.GetInt("attacker"));
g_iKliis[iAttackerClient]++;
}

public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
int iMVPClient;
int iMaxKills;
char nik[MAX_NAME_LENGTH];

for(int i = 1; i < MaxClients; ++i)
{
if(IsClientInGame(i)){
if (g_iKliis[i] > iMaxKills)
{
iMaxKills = g_iKliis[i];
}
}
}

for(int i = 0; i < MaxClients; ++i)
{
if(g_iKliis [i] == iMaxKills){
iMVPClient = i;
break;
}
}

GetClientName(iMVPClient, nik, MAX_NAME_LENGTH);
PrintToChatAll("ПРОФИ в этом раунде %s с %i килами", nik, iMaxKills);

GivePlayerItem(iMVPClient, "weapon_ak47");

for(int i = 0; i < MaxClients; ++i)
{
g_iKliis[i] = 0;
}

return;
}

Спасибо. Я уже сделал, что хотел. Наверно надо было написать. Это мои первые шаги в программирование под SM, обязательно разберу твой код для само развития. Вот, что у меня получилось
PHP:
#include <sourcemod>
#include <sdktools>
#include <cstrike>
new players_key[MAXPLAYERS+1];
public OnPluginStart() 
{ 

    HookEvent("round_start", roundStart); 
    HookEvent("player_death", player_death);
}
 
public Action:roundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
   PrintToChatAll("Топ Фрагеры получают статус ПРОФИ на раунд.");
   PrintToChatAll("ПРОФИ получают 120hp, набор гранат, m4a1, ak47, с4 и 8 000$");
   for ( new client = 1; client <= MaxClients+1; client++){
    //if (!IsPlayerGenericAdmin(client)){
        if (IsValidClient(client, true)){
            
            new key = true;
            for (new i = 1 ; i <=  MaxClients+1 ; i++) {
                if (players_key[i] > players_key[client]) {
                    key = false;
                }
                
            }
            
            
            //PrintToServer("client: %s", " " + client);
            
            //if (IsClientInGame(client)) PrintToChatAll("%N <index = %d>", GetClientUserId(client), GetClientUserId(client));
            
            if (key) {
                decl String:nik[MAX_NAME_LENGTH];
                GetClientName(client, nik, MAX_NAME_LENGTH);
                //PrintToChatAll("nick = %s", nik);
                PrintToChatAll("ПРОФИ в этом раунде %s, за %d убийств в прошлом раунде!", nik, players_key[client]);
                new team = GetClientTeam(client);
                SetEntProp(client, Prop_Send, "m_ArmorValue", 120, 4);
                SetEntProp(client, Prop_Send, "m_bHasHelmet", 1);
                GivePlayerItem(client, "weapon_flashbang");
                GivePlayerItem(client, "weapon_flashbang");
                GivePlayerItem(client, "weapon_hegrenade");
                GivePlayerItem(client, "weapon_smokegrenade");           
                if (GetTeamScore(CS_TEAM_T)+GetTeamScore(CS_TEAM_CT) > 1){
                   //decl CurrentMoney; 
                   //CurrentMoney = GetEntProp(client, Prop_Send, "m_iAccount"); 
                   SetEntProp(client, Prop_Send, "m_iAccount", 8000);
                }           
                if(team == CS_TEAM_CT)
                {
                   GivePlayerItem(client, "item_defuser");
                   GivePlayerItem(client, "weapon_m4a1");
                   GivePlayerItem(client, "weapon_ak47");
                   GivePlayerItem(client, "weapon_incgrenade");
                }           
                if(team == CS_TEAM_T)
                {
                   GivePlayerItem(client, "weapon_c4");
                   GivePlayerItem(client, "weapon_m4a1");
                   GivePlayerItem(client, "weapon_ak47");
                   GivePlayerItem(client, "weapon_molotov");                   
                }
            }
        }
      //}   
    }
    for (new client = 1; client <= MaxClients+1; client++){
        players_key[client] = 0;
    }
}
 
public player_death(Handle:event, const String:name[], bool:dontBroadcast)
{
     new client = GetClientOfUserId(GetEventInt(event, "attacker"));
     if (client > 0 && GetClientTeam(client) != GetClientTeam(GetClientOfUserId(GetEventInt(event, "userid"))))
     {
         players_key[client] += 1;
     }
}

 
bool:IsPlayerGenericAdmin(client)
{
   return CheckCommandAccess(client, "generic_admin", ADMFLAG_GENERIC, false);
}
 
bool:IsValidClient(client, bool:alive = false) 
{ 
    return (client >= 1 && client <= MaxClients && IsClientConnected(client) && IsClientInGame(client) && (alive == false || IsPlayerAlive(client))); 
}
 

suremiur

♂ overlay master ♂
Сообщения
537
Реакции
585
@kepay, раз ты новенький, то лучше работать с новым синтаксисом. Знаю что тут есть те, кто поспорят, но новый куда удобнее, понятнее и красивее.
 

kepay

Участник
Сообщения
20
Реакции
2
@kepay, раз ты новенький, то лучше работать с новым синтаксисом. Знаю что тут есть те, кто поспорят, но новый куда удобнее, понятнее и красивее.
В кодинге под sourcepawn я и правда новенький. что ты имеешь введу под новым синтаксисом?
 

suremiur

♂ overlay master ♂
Сообщения
537
Реакции
585

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@kepay, если бы твой код работал, то почищенный он бы выглядел примерно вот так:
PHP:
#include <sdktools>

new players_key[MAXPLAYERS+1];

public OnPluginStart()
{
    HookEvent("round_start", roundStart, EventHookMode_PostNoCopy);
    HookEvent("player_death", player_death);
}

public roundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
    PrintToChatAll("Топ Фрагеры получают статус ПРОФИ на раунд.\nПРОФИ получают 120hp, набор гранат, m4a1, ak47, с4 и 8 000$");
    for(new client = 1, i, bool:key = true; client <= MaxClients; client++) if(IsValidClient(client, true))
    {
        for(i = 1; i <= MaxClients; i++) if (players_key[i] > players_key[client]) key = false;
        if(key)
        {
            PrintToChatAll("ПРОФИ в этом раунде %N, за %d убийств в прошлом раунде!", client, players_key[client]);
            new team = GetClientTeam(client);
            SetEntProp(client, Prop_Send, "m_ArmorValue", 120, 4);
            SetEntProp(client, Prop_Send, "m_bHasHelmet", 1);
            GivePlayerItem(client, "weapon_flashbang");
            GivePlayerItem(client, "weapon_flashbang");
            GivePlayerItem(client, "weapon_hegrenade");
            GivePlayerItem(client, "weapon_smokegrenade");
            if (GetTeamScore(2)+GetTeamScore(3) > 1)
                SetEntProp(client, Prop_Send, "m_iAccount", 8000);
            if(team == 3)
            {
                GivePlayerItem(client, "item_defuser");
                GivePlayerItem(client, "weapon_m4a1");
                GivePlayerItem(client, "weapon_ak47");
                GivePlayerItem(client, "weapon_incgrenade");
            }
            else if(team == 2)
            {
                GivePlayerItem(client, "weapon_c4");
                GivePlayerItem(client, "weapon_ak47");
                GivePlayerItem(client, "weapon_m4a1");
                GivePlayerItem(client, "weapon_molotov");
            }
        }
    }
    for(new i = 1; i <= MaxClients; i++) players_key[i] = 0;
}

public player_death(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client, victim;;
    if((client = GetClientOfUserId(GetEventInt(event, "attacker")))
    && (victim = GetClientOfUserId(GetEventInt(event, "userid")))
    && GetClientTeam(client) != GetClientTeam(victim))
        players_key[client]++;
}

bool:IsValidClient(client, bool:alive = false)
{
    return 0 < client <= MaxClients && IsClientInGame(client) && (!alive || IsPlayerAlive(client));
}

@kepay, а универсальный плагин на новом синтаксисе для КСС и КСГО с выдачей награды всем игрокам, у кого максимальное количество фрагов (даже если у всех по 1 фрагу) будет выглядеть так:
PHP:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools>

bool bCSGO;
int iKills[MAXPLAYERS+1];

public void OnPluginStart()
{
    switch(GetEngineVersion())
    {
        case Engine_CSGO:    bCSGO = true;
        case Engine_CSS:    bCSGO = false;
        default:            SetFailState("This plugin only for CSS and CSGO!");
    }

    HookEvent("round_start",    Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("player_death",    Event_Death);
}

public void OnClientConnected(int client)
{
    iKills[client] = 0;
}

public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    if(GetTeamScore(2)+GetTeamScore(3) < 1)
        return;

    int MVP = GetMVP();
    if(!MVP)
        return;

    PrintToChatAll("Топ Фрагеры получают статус ПРОФИ на раунд.\nПРОФИ получают 120hp, набор гранат, m4a1, ak47, с4 и 8 000$");

    for(int i, MVPs[MAXPLAYERS+1], num = GetMVPsNum(iKills[MVP], MVPs); i < num; i++) GiveRevard(i);
}

stock void GiveRevard(int client)
{
    PrintToChatAll("ПРОФИ в этом раунде: %N! За %d убийств в прошлом раунде.", client, iKills[client]);
    SetEntityHealth(client, 120);
    SetEntProp(client, Prop_Data, "m_ArmorValue", 100);
    SetEntProp(client, Prop_Data, "m_bHasHelmet", 1);
    SetEntProp(client, Prop_Data, "m_iAccount", 8000);
    GivePlayerItem(client, "weapon_flashbang");
    GivePlayerItem(client, "weapon_flashbang");
    GivePlayerItem(client, "weapon_hegrenade");
    GivePlayerItem(client, "weapon_smokegrenade");
    if(GetClientTeam(client) == 3)
    {
        if(bCSGO) GivePlayerItem(client, "weapon_incgrenade");
        GivePlayerItem(client, "item_defuser");
        GivePlayerItem(client, "weapon_m4a1");
        GivePlayerItem(client, "weapon_ak47");
    }
    else
    {
        if(bCSGO) GivePlayerItem(client, "weapon_molotov");
        GivePlayerItem(client, "weapon_c4");
        GivePlayerItem(client, "weapon_ak47");
        GivePlayerItem(client, "weapon_m4a1");
    }
}

public void Event_Death(Event event, const char[] name, bool dontBroadcast)
{
    static int client, victim;
    if((client = GetClientOfUserId(event.GetInt("attacker"))) && !IsFakeClient(client)
    && (victim = GetClientOfUserId(event.GetInt("userid")))
    && GetClientTeam(client) != GetClientTeam(victim))
        iKills[client]++;
}

stock int GetMVP()
{
    int MVP;
    for(int i = 1, max; i <= MaxClients; i++) if(iKills[i] > max && IsValidClient(i))
    {
        MVP = i;
        max = iKills[i];
    }
    return MVP;
}

stock int GetMVPsNum(int kills, int[] MVPs)
{
    int num;
    for(int i = 1; i <= MaxClients; i++)
    {
        if(iKills[i] == kills && IsValidClient(i))
        {
            MVPs[num] = i;
            num++;
        }
        iKills[i] = 0;
    }
    return num;
}

stock bool IsValidClient(int client, bool alive = false)
{
    return 0 < client <= MaxClients && IsClientInGame(client) && GetClientTeam(client) > 1 && (!alive || IsPlayerAlive(client));
}
И выдаваться будет именно 120ХП, а не 120 брони, как у тебя получилось =)
Вот только если у игрока будет больше $8к, то ему, наверное будет обидно =D
 
Последнее редактирование:
Сверху Снизу