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

Seton

Участник
Сообщения
44
Реакции
41
Как реализовать выдачу скина при убийстве с ножа жертве?
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Как реализовать выдачу скина при убийстве с ножа жертве?
если в кратце, то хукаем евент player_death, получаем индекс оружия его classname, проверяем "нож ли это" проверкой if(StrContains(classname, "knife", false) != -1) и если тру, то выдаём игроку скин, скин указываем в конфиге/кваре/дефайне, модельку скина прекешировать и добавить в загрузки заранее ещё потребутеся.
 

Seton

Участник
Сообщения
44
Реакции
41
если в кратце, то хукаем евент player_death, получаем индекс оружия его classname, проверяем "нож ли это" проверкой if(StrContains(classname, "knife", false) != -1) и если тру, то выдаём игроку скин, скин указываем в конфиге/кваре/дефайне, модельку скина прекешировать и добавить в загрузки заранее ещё потребутеся.
Суть понял, только вопрос каким образом сделать проверку на каждое убийство? То есть убийца убивает допустим 2 игроков и в новом раунде этим 2 жертвам выдается скин

PHP:
public player_death(Handle:event, const String:name[], bool:dontBroadcast)
{ 
    decl String:weapon_n[32];
    GetEventString(event, "weapon", weapon_n, sizeof(weapon_n));
    new victim = GetClientOfUserId(GetEventInt(event, "userid"));

    if(!StrEqual(weapon_n, "knife"))
        return;

    if(g_iSvin == victim)
        return;

    g_iSvin = victim;
}

public player_spawn(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    if(client && client == g_iSvin && IsClientInGame(client) && IsPlayerAlive(client))
    {
        switch(GetClientTeam(client))
        {
            case CS_TEAM_TR:
            {
                if(IsModelPrecached(svin_model)) SetEntityModel(client, svin_model);
            }
            case CS_TEAM_CT:
            {
                if(IsModelPrecached(svin_model)) SetEntityModel(client, svin_model);
            }
        }
        g_iSvin = -1;
    }
    return Plugin_Stop;
}
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Суть понял, только вопрос каким образом сделать проверку на каждое убийство? То есть убийца убивает допустим 2 игроков и в новом раунде этим 2 жертвам выдается скин

PHP:
public player_death(Handle:event, const String:name[], bool:dontBroadcast)
{
    decl String:weapon_n[32];
    GetEventString(event, "weapon", weapon_n, sizeof(weapon_n));
    new victim = GetClientOfUserId(GetEventInt(event, "userid"));

    if(!StrEqual(weapon_n, "knife"))
        return;

    if(g_iSvin == victim)
        return;

    g_iSvin = victim;
}

public player_spawn(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    if(client && client == g_iSvin && IsClientInGame(client) && IsPlayerAlive(client))
    {
        switch(GetClientTeam(client))
        {
            case CS_TEAM_TR:
            {
                if(IsModelPrecached(svin_model)) SetEntityModel(client, svin_model);
            }
            case CS_TEAM_CT:
            {
                if(IsModelPrecached(svin_model)) SetEntityModel(client, svin_model);
            }
        }
        g_iSvin = -1;
    }
    return Plugin_Stop;
}
сделай переменную g_iSvin как g_iSvin[MAXPLAYERS + 1], индекс в этой переменной будет индекс игрока (g_iSvin[client]), по сути, ты присваиваешь значение в массиве по индексу игрока. Можно ещё просто в ArrayList кидать userid игроков которым выдать нужно и после спавна читать ArrayList и удалять, но этот путь сложнее чутка будет чем с обычными array
 

Ganter1234

Участник
Сообщения
1,149
Реакции
667
Как реализовать выдачу скина при убийстве с ножа жертве?
Как то так (лайт вариант):
#include <sdktools>

#define MODEL_PATH "models/player/blablabla"

bool SkinChange[MAXPLAYERS+1];

public void OnPluginStart()
{
    HookEvent("player_spawn", Player_Spawn);
    HookEvent("player_death", Player_Death);
}

public Action Player_Death(Event event, char[] name, bool silent)
{
    char g_sWeaponName[32];
    int victim = GetClientOfUserId(event.GetInt("userid"));
    event.GetString("weapon", g_sWeaponName, sizeof(g_sWeaponName));

    if(StrEqual(g_sWeaponName, "weapon_knife")) {
        SetSkinVictim(victim);
    }
}

public Action Player_Spawn(Event event, char[] name, bool silent)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    
    if(IsClientInGame(client) && SkinChange[client])
    {
        SetEntityModel(client, MODEL_PATH);
        SkinChange[client] = false;
    }
}

void SetSkinVictim(int client)
{
    if(!IsModelPrecached(MODEL_PATH)) PrecacheModel(MODEL_PATH, true);

    SkinChange[client] = true;
}
 

xstage

🏹
Сообщения
726
Реакции
754
если в кратце, то хукаем евент player_death, получаем индекс оружия его classname, проверяем "нож ли это" проверкой if(StrContains(classname, "knife", false) != -1) и если тру, то выдаём игроку скин, скин указываем в конфиге/кваре/дефайне, модельку скина прекешировать и добавить в загрузки заранее ещё потребутеся.
Как то так (лайт вариант):
#include <sdktools>

#define MODEL_PATH "models/player/blablabla"

bool SkinChange[MAXPLAYERS+1];

public void OnPluginStart()
{
    HookEvent("player_spawn", Player_Spawn);
    HookEvent("player_death", Player_Death);
}

public Action Player_Death(Event event, char[] name, bool silent)
{
    char g_sWeaponName[32];
    int victim = GetClientOfUserId(event.GetInt("userid"));
    event.GetString("weapon", g_sWeaponName, sizeof(g_sWeaponName));

    if(StrEqual(g_sWeaponName, "weapon_knife")) {
        SetSkinVictim(victim);
    }
}

public Action Player_Spawn(Event event, char[] name, bool silent)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
   
    if(IsClientInGame(client) && SkinChange[client])
    {
        SetEntityModel(client, MODEL_PATH);
        SkinChange[client] = false;
    }
}

void SetSkinVictim(int client)
{
    if(!IsModelPrecached(MODEL_PATH)) PrecacheModel(MODEL_PATH, true);

    SkinChange[client] = true;
}
Оба про bayonet забываете у него нет в названии knife
 

GLUCK

Участник
Сообщения
82
Реакции
9
Нужно чтобы кто-то сделал плагин выдачи предметов в шоп по ркону на стимид без присутствия самого игрока на сервере. Подобный плагин есть но там только выдаёт на имя игрока.
 

Seton

Участник
Сообщения
44
Реакции
41
Ребят, вопрос такой, как сделать создание моба только для клиентмода? Файлы ниже прикреплены

PHP:
#pragma semicolon 1
#include <sourcemod>
#include <cstrike>
#include <sdktools>
#include <sdkhooks>

//Настройка моба
#define MOB_MODEL "models/1ama/1work/item_erotic.mdl"
#define SPRITE "powerfind/bomb_effect/effect_iskra.vmt"
#define SOUND "powerfind/strip.mp3"

//Настройка поворота func_rotating
#define ROTATE_SPEED "1"
#define ROTATE_SPAWNFLAGS "64"

new String:animations[][] =
{
    "1_combo1",
    "1_combo2",
    "1_combo3",
    "1_combo4"

};

new iEntity = 0;
new iRotator = 0;
new g_iCollision = -1;
new g_iSolidFlags = -1;
new Handle:TimerAnim;

new Float:fBombPos[3];


public OnPluginStart()
{
    HookEvent("bomb_planted", bomb_planted);
    HookEvent("bomb_exploded", end);
    HookEvent("bomb_defused", end);
    HookEvent("round_end", end);
    HookEvent("round_start", round_start);
   
        AddFileToDownloadsTable("materials/1ama/1work/item_erotic/CherryPopz_Face_D.vmt");
        AddFileToDownloadsTable("materials/1ama/1work/item_erotic/CherryPopz_Face_D.vtf");
        AddFileToDownloadsTable("materials/1ama/1work/item_erotic/CherryPopz_Hair_D.vmt");
        AddFileToDownloadsTable("materials/1ama/1work/item_erotic/CherryPopz_Hair_D.vtf");
        AddFileToDownloadsTable("materials/1ama/1work/item_erotic/i.vmt");
        AddFileToDownloadsTable("materials/1ama/1work/item_erotic/i.vtf");
        AddFileToDownloadsTable("materials/1ama/1work/item_erotic/CherryPopz_Body_D.vmt");
        AddFileToDownloadsTable("materials/1ama/1work/item_erotic/CherryPopz_Body_D.vtf");
        AddFileToDownloadsTable("models/1ama/1work/item_erotic.sw.vtx");
        AddFileToDownloadsTable("models/1ama/1work/item_erotic.vvd");
        AddFileToDownloadsTable("models/1ama/1work/item_erotic.dx80.vtx");
        AddFileToDownloadsTable("models/1ama/1work/item_erotic.dx90.vtx");
        AddFileToDownloadsTable("models/1ama/1work/item_erotic.mdl");
        AddFileToDownloadsTable("materials/powerfind/bomb_effect/effect_iskra.vtf");
        AddFileToDownloadsTable("materials/powerfind/bomb_effect/effect_iskra.vmt");
        AddFileToDownloadsTable("sound/powerfind/strip.mp3");
}

public Action:round_start(Handle:event, String:name[], bool:dontBroadcast)
{
    if(TimerAnim)
    {
        KillTimer(TimerAnim, false);
        TimerAnim = INVALID_HANDLE;
    }
    return Plugin_Continue;
}

public end(Handle:event, String:name[], bool:dontBroadcast)
{

    if (TimerAnim)
    {
        KillTimer(TimerAnim, false);
        TimerAnim = INVALID_HANDLE;
       
        AcceptEntityInput(iRotator, "Stop");
        AcceptEntityInput(iRotator, "kill");
       
        AcceptEntityInput(iEntity, "KillHierarchy");
       
        for(new i = 1; i <= MaxClients; i++)
            if(IsClientInGame(i) && !IsFakeClient(i))
                StopSound(i, SNDCHAN_STATIC, SOUND);
    }
   
    /*if(Beam != INVALID_HANDLE)
    {
        KillTimer(Beam);
        Beam = INVALID_HANDLE;
    }*/
}

public bomb_planted(Handle:event, String:name[], bool:dontBroadcast)
{
    new giC4Index = FindEntityByClassname(MaxClients + 1, "planted_c4");
    if(0 < giC4Index)
    {
        GetEntPropVector(giC4Index, Prop_Send, "m_vecOrigin", fBombPos, 0);
       
        CreateMob(fBombPos);
    }
}

public OnMapStart()
{
    PrecacheModel(MOB_MODEL, true);
    PrecacheDecal(SPRITE, true);
    PrecacheSound(SOUND, true);
}

public Action:AnimTimer(Handle:timer, any:entity)
{
    SetVariantString(animations[GetRandomInt(0, sizeof(animations)-1)]);
    AcceptEntityInput(entity, "SetAnimation");
    return Plugin_Continue;
}

CreateMob(Float:fOrigin[3])
{
    iEntity = CreateEntityByName("prop_dynamic");
    SetEntityModel(iEntity, MOB_MODEL);
    SetEntProp(iEntity, Prop_Send, "m_CollisionGroup", 0);
    SetEntProp(iEntity, Prop_Send, "m_nSolidType", 0);
    SetSolidFlags(iEntity, 152);
    SetEntityMoveType(iEntity, MOVETYPE_VPHYSICS);
   
    fOrigin[1] += 50;
    TeleportEntity(iEntity, fOrigin, NULL_VECTOR, NULL_VECTOR);
    DispatchSpawn(iEntity);
   
    SetVariantString("1_combo1");
    AcceptEntityInput(iEntity, "SetAnimation");

    iRotator = CreateEntityByName("func_rotating");
    if (iRotator <= 0)
        return;

    DispatchKeyValueVector(iRotator, "origin", fOrigin);
    decl String:rotator_name[20];
    Format(rotator_name, 20, "rt_%d", iRotator);
    DispatchKeyValue(iRotator, "targetname", rotator_name);
    DispatchKeyValue(iRotator, "maxspeed", ROTATE_SPEED);
    DispatchKeyValue(iRotator, "dmg", "0");
    DispatchKeyValue(iRotator, "solid", "0");
    DispatchKeyValue(iRotator, "spawnflags", ROTATE_SPAWNFLAGS);
    DispatchSpawn(iRotator);
    SetVariantString(rotator_name);
    DispatchKeyValueVector(iRotator, "origin", fOrigin);
    AcceptEntityInput(iEntity, "SetParent");
    AcceptEntityInput(iRotator, "Start");

    new sprite = CreateEntityByName("env_sprite");

    DispatchKeyValue(sprite, "spawnflags", "1");
    DispatchKeyValueFloat(sprite, "scale", 0.5);
    DispatchKeyValue(sprite, "rendermode", "1");
    DispatchKeyValue(sprite, "rendercolor", "255 255 255");
    DispatchKeyValue(sprite, "model", SPRITE);
    DispatchSpawn(sprite);

    TeleportEntity(sprite, fOrigin, NULL_VECTOR, NULL_VECTOR);

    SetVariantString("!activator");
    AcceptEntityInput(sprite, "SetParent", iEntity);

    new clients[MaxClients+1], total;

    for (new i = 1; i <= MaxClients; i++)
        if(IsClientInGame(i) && !IsFakeClient(i))
            clients[total++] = i;

    if(total > 0)
        EmitSound(clients, total, SOUND, iEntity, SNDCHAN_STATIC, _, _, 1.0);

    TimerAnim = CreateTimer(10.0, AnimTimer, iEntity, TIMER_REPEAT);
}

SetSolidFlags(entity, iFlags)
{
    if (g_iCollision == -1 || g_iSolidFlags == -1)
        return;
       
    SetEntData(entity, g_iSolidFlags + g_iCollision, iFlags, 2, true);
}

stock DrawRing(Float:pos[3])
{
    //TE_SetupBeamRingPoint(pos, 1.0, //Начальный радиус круга
        //RING_RADIUS,          // Радиус круга
        //beamsprite,         // Прекеш индекс текстуры
        //beamsprite,         // Прекеш индекс текстуры 2 (можно дублировать)
        //1.0,                  // Начальный кадр
        //30.0,                 // Скорость отрисовки (FPS)
        //2.0,                  // Срок жизни круга (сек)
        //5.0,          // Ширина круга
        //1.0,      // Амплитуда колебаний
        //{255, 255, 255, 255},   // Цвет (задан в виде массисва RGBA)
        //80,            // Скорость вращения текстуры
        //0);           // Флаг
    //TE_SendToAll(0.0);
}

public Action:Timer_Beacon(Handle:timer, any:value)
{
    //TE_SetupEnergySplash(fBombPos, fBombPos, true);
    //TE_SendToAll();
   
    static Float:RingOrigin[3];
    RingOrigin = fBombPos;
    RingOrigin[2] += 5.0;
    // TE_SetupBeamRingPoint(RingOrigin, 150.0,
        // 150.0,
        // beamsprite,
        // beamsprite,
        // 1,
        // 15,
        // 5.0,
        // 8.0,
        // 0.0,
        // {255, 255, 255, 255},
        // 100,
        // 0);
    // TE_SendToAll();
    DrawRing(RingOrigin);
}
 

Вложения

  • deb.sp
    6.9 КБ · Просмотры: 9
  • [INC]clientmod.rar
    16.1 КБ · Просмотры: 6

Yurka_Bear

Участник
Сообщения
61
Реакции
4
Всех с прошедшими праздниками! Ребят, подскажите пожалуйста. Как сделать возможность простым игрокам на сервере, добавлять ботов? Допустим зашел ночью один поиграть, прописал команду в чат bot_add и добавился бот, или пару ботов, возможно такое реализовать? CSS v34/ Sourcmode 1.6.3
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Всех с прошедшими праздниками! Ребят, подскажите пожалуйста. Как сделать возможность простым игрокам на сервере, добавлять ботов? Допустим зашел ночью один поиграть, прописал команду в чат bot_add и добавился бот, или пару ботов, возможно такое реализовать? CSS v34/ Sourcmode 1.6.3
Попробуй
x:
#include <sourcemod>
#define MaxBots 5
int iClients = 0;

public void OnPluginStart()
{
    AddCommandListener(botAction, "sm_addbot");
}

public Action botAction(int client, const char[] command, int args)
{
    if(client && !IsFakeClient(client) && IsClientInGame(client))
    {
        iClients = GetClientCount();
        if(iClients==1)
        {
            for (int i = 0;i<MaxBots;i++)
            {
                ServerCommand("bot_add");
            }
        }
        else if (iClients>1)
        {
            return;
        }
    }
}

public void OnClientDisconnect_Post(client)
{
    iClients = GetClientCount();
    if(iClients<1)
    {
        ServerCommand("bot_kick");
        iClients = 0;
    }
}
UPD: забыл про синтаксис
 
Последнее редактирование:

Yurka_Bear

Участник
Сообщения
61
Реакции
4
#include <sourcemod> #define MaxBots 5 int iClients = 0; public void OnPluginStart() { AddCommandListener(botAction, "sm_getbot"); } public Action botAction(int client, const char[] command, int args) { if(client && !IsFakeClient(client) && IsClientInGame(client)) { iClients = GetClientCount(); if(iClients==1) { for (int i = 0;i<MaxBots;i++) { ServerCommand("bot_add"); } } else if (iClients>1) { return; } } } public void OnClientDisconnect_Post(client) { iClients = GetClientCount(); if(iClients<1) { ServerCommand("bot_kick"); iClients = 0; } }
//// bot_add.sp
// C:\Users\¤щўяш\Desktop\bot_add.sp(3) : error 010: invalid function or declaration
// C:\Users\¤щўяш\Desktop\bot_add.sp(5) : error 001: expected token: ";", but found "-identifier-"
// C:\Users\¤щўяш\Desktop\bot_add.sp(10) : error 021: symbol already defined: "Action"
// C:\Users\¤щўяш\Desktop\bot_add.sp(10) : error 017: undefined symbol "client"
// C:\Users\¤щўяш\Desktop\bot_add.sp(10) : error 029: invalid expression, assumed zero
// C:\Users\¤щўяш\Desktop\bot_add.sp(10) : fatal error 127: too many error messages on one line
//
// Compilation aborted.
// 6 Errors.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@shantik2012, код написан на новом синтаксисе, а ты компилишь с помощью SM1.6
 

Kotya

Участник
Сообщения
15
Реакции
9
//// bot_add.sp
// C:\Users\¤щўяш\Desktop\bot_add.sp(3) : error 010: invalid function or declaration
// C:\Users\¤щўяш\Desktop\bot_add.sp(5) : error 001: expected token: ";", but found "-identifier-"
// C:\Users\¤щўяш\Desktop\bot_add.sp(10) : error 021: symbol already defined: "Action"
// C:\Users\¤щўяш\Desktop\bot_add.sp(10) : error 017: undefined symbol "client"
// C:\Users\¤щўяш\Desktop\bot_add.sp(10) : error 029: invalid expression, assumed zero
// C:\Users\¤щўяш\Desktop\bot_add.sp(10) : fatal error 127: too many error messages on one line
//
// Compilation aborted.
// 6 Errors.
C++:
#include <sourcemod>
int MaxBots  = 5;

int iClients = 0;

public void OnPluginStart()
{
    AddCommandListener(botAction, "sm_addbot");
}

public Action botAction(int client, const char[] command, int args)
{
    if (client && IsClientInGame(client) && !IsFakeClient(client))
    {
        iClients = GetClientCount();

        if (iClients == 1)
        {
            for (int i = 0; i < MaxBots; i++)
            {
                ServerCommand("bot_add");
            }
        }
    }

    return Plugin_Handled;
}

public void OnClientDisconnect_Post(client)
{
    iClients = GetClientCount();

    if (iClients < 1)
    {
        iClients = 0;
        ServerCommand("bot_kick");
    }
}
 
Последнее редактирование:

Yurka_Bear

Участник
Сообщения
61
Реакции
4
C++:
#include <sourcemod>
int MaxBots  = 5;

int iClients = 0;

public void OnPluginStart()
{
    AddCommandListener(botAction, "sm_addbot");
}

public Action botAction(int client, const char[] command, int args)
{
    if (client && IsClientInGame(client) && !IsFakeClient(client))
    {
        iClients = GetClientCount();

        if (iClients == 1)
        {
            for (int i = 0; i < MaxBots; i++)
            {
                ServerCommand("bot_add");
            }
        }
    }

    return Plugin_Handled;
}

public void OnClientDisconnect_Post(client)
{
    iClients = GetClientCount();

    if (iClients < 1)
    {
        iClients = 0;
        ServerCommand("bot_kick");
    }
}
Те же ошибки
 

Kotya

Участник
Сообщения
15
Реакции
9
//// bot_add.sp
// C:\Users\¤щўяш\Desktop\bot_add.sp(3) : error 010: invalid function or declaration
// C:\Users\¤щўяш\Desktop\bot_add.sp(5) : error 001: expected token: ";", but found "-identifier-"
// C:\Users\¤щўяш\Desktop\bot_add.sp(10) : error 021: symbol already defined: "Action"
// C:\Users\¤щўяш\Desktop\bot_add.sp(10) : error 017: undefined symbol "client"
// C:\Users\¤щўяш\Desktop\bot_add.sp(10) : error 029: invalid expression, assumed zero
// C:\Users\¤щўяш\Desktop\bot_add.sp(10) : fatal error 127: too many error messages on one line
//
// Compilation aborted.
// 6 Errors.
а вот так?
C++:
#include <sourcemod>
#include <console.inc>
#define MaxBots 5
new iClients;
public OnPluginStart()
{
    AddCommandListener(botAction, "sm_addbot");
}
public Action:botAction(client, const String:command[], argc)
{
    if (client && IsClientInGame(client) && !IsFakeClient(client))
    {
        iClients = GetClientCount();
        if (iClients == 1)
        {
            for (new  i = 0; i < MaxBots; i++)
            {
                ServerCommand("bot_add");
            }
        }
    }
}
public OnClientDisconnect_Post(client)
{
    iClients = GetClientCount();
    if (iClients < 1)
    {
        ServerCommand("bot_kick");
    }
}
 

Yurka_Bear

Участник
Сообщения
61
Реакции
4
а вот так?
C++:
#include <sourcemod>
#include <console.inc>
#define MaxBots 5
new iClients;
public OnPluginStart()
{
    AddCommandListener(botAction, "sm_addbot");
}
public Action:botAction(client, const String:command[], argc)
{
    if (client && IsClientInGame(client) && !IsFakeClient(client))
    {
        iClients = GetClientCount();
        if (iClients == 1)
        {
            for (new  i = 0; i < MaxBots; i++)
            {
                ServerCommand("bot_add");
            }
        }
    }
}
public OnClientDisconnect_Post(client)
{
    iClients = GetClientCount();
    if (iClients < 1)
    {
        ServerCommand("bot_kick");
    }
}
А вот так все скомпилилось! Осталось проверить.
 
Сверху Снизу