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

Seton

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

iLoco

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

Seton

Участник
Сообщения
23
Реакции
0
если в кратце, то хукаем евент 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,145
Реакции
1,147
Суть понял, только вопрос каким образом сделать проверку на каждое убийство? То есть убийца убивает допустим 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

Делаю дела ( ͡° ͜ʖ ͡°)
Контент-мейкер
Сообщения
924
Реакции
444
Как реализовать выдачу скина при убийстве с ножа жертве?
Как то так (лайт вариант):
#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

Не вывез последствий
Сообщения
425
Реакции
354
если в кратце, то хукаем евент 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

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

Seton

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

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 КБ · Просмотры: 5
  • [INC]clientmod.rar
    16.1 КБ · Просмотры: 2

shantik2012

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

Palonez

Я не шарю
Сообщения
765
Реакции
268
Всех с прошедшими праздниками! Ребят, подскажите пожалуйста. Как сделать возможность простым игрокам на сервере, добавлять ботов? Допустим зашел ночью один поиграть, прописал команду в чат 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: забыл про синтаксис
 
Последнее редактирование:

shantik2012

Участник
Сообщения
22
Реакции
1
#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
Контент-мейкер
Сообщения
5,870
Реакции
3,443
@shantik2012, код написан на новом синтаксисе, а ты компилишь с помощью SM1.6
 

Kotya

Участник
Сообщения
12
Реакции
7
//// 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");
    }
}
 
Последнее редактирование:

shantik2012

Участник
Сообщения
22
Реакции
1
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

Участник
Сообщения
12
Реакции
7
//// 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");
    }
}
 

shantik2012

Участник
Сообщения
22
Реакции
1
а вот так?
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");
    }
}
А вот так все скомпилилось! Осталось проверить.
 
Сверху