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

Mr.Black

Участник
Сообщения
145
Реакции
61
Добрый вечер. Подскажите, пожалуйста, как получить значение Cvar'a ?
Мне нужно в плагине узнать сколько длится разминка и прибавить к ней 2 секунды. (mp_warmuptime).
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Добрый вечер. Подскажите, пожалуйста, как получить значение Cvar'a ?
Мне нужно в плагине узнать сколько длится разминка и прибавить к ней 2 секунды. (mp_warmuptime).
PHP:
Handle c_Time;

public OnPluginStart()
{
    c_Time = FindConVar("mp_warmuptime");
}

твоя функция
{
    GetConVarInt(c_Time);    // Что бы получить текущее значение
    SetConVarInt(c_Time);    // Что бы установить новое значение 
}
 

Mr.Black

Участник
Сообщения
145
Реакции
61
PHP:
Handle c_Time;

public OnPluginStart()
{
    c_Time = FindConVar("mp_warmuptime");
}

твоя функция
{
    GetConVarInt(c_Time);    // Что бы получить текущее значение
    SetConVarInt(c_Time);    // Что бы установить новое значение
}
Могу ли я FindConVar делать не на старте плагина, а например, OnMapStart ?
 

Madness aka null138

Участник
Сообщения
713
Реакции
734
Могу ли я FindConVar делать не на старте плагина, а например, OnMapStart ?
Хоть где угодно. Можно даже так сразу:
C++:
GetConVarInt(FindConVar("mp_warmuptime"));

upd. хотя в этом случае лучше получать float значение через GetConVarFloat
 

iLoco

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

версия sdktool build 6428 (sm 1.10 build 6428)
Тестил на таком плагине:
#pragma semicolon 1
#pragma newdecls required

public void OnPlayerRunCmdPost(int iClient, int buttons, int impulse, const float vel[3], const float angles[3], int weapon, int subtype, int cmdnum, int tickcount, int seed, const int mouse[2])
{
    if(buttons & IN_SCORE && GetClientTeam(iClient) != 1)
    {
        PrintToChatAll("s");
    }
}
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
Я бы тоже крашился, если бы за секунду от каждого игрока выводил 64 или 128 сообщений.
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Я бы тоже крашился, если бы за секунду от каждого игрока выводил 64 или 128 сообщений.
Я даже на сервер зайти не успеваю, как тут-же крашится, пробовал на втором, где sm 1.10 build 6453, то всё норм.
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
Попробуй в консоль выводить игроку/серверу, а не в чат. Там в PrintToChatAll идёт массив от 1 до кол-ва игроков, а ты ещё и в OnPlayerRunCmdPost ляпнул, который вызывается в секунду столько же раз, сколько тик на сервере (а может и больше). То есть, грубо говоря, на сервере макс. число игроков 32 и тик сервера 128, то за секунду 4096 раз будет пытаться выводить сообщение!!! Про кол-во операций я и вовсе промолчу (форматирование текста, сам цикл 0-24, суммирование переменной i++).
Сообщения автоматически склеены:

Возможно у тебя на втором сервере просто меньше слотов/тик, либо оба...
 

Madness aka null138

Участник
Сообщения
713
Реакции
734
насколько я помню, во время подключении к серверу, игрок отправляет некоторые пакеты серверу, которые триггерят onclientruncmd.
попробуй хотя бы записать последнюю нажатую кнопку в глобальный массив и проверяй, не является ли нажатая кнопка предыдущим, дабы избежать спама раз в тик.
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Попробуй в консоль выводить игроку/серверу, а не в чат. Там в PrintToChatAll идёт массив от 1 до кол-ва игроков, а ты ещё и в OnPlayerRunCmdPost ляпнул, который вызывается в секунду столько же раз, сколько тик на сервере (а может и больше). То есть, грубо говоря, на сервере макс. число игроков 32 и тик сервера 128, то за секунду 4096 раз будет пытаться выводить сообщение!!! Про кол-во операций я и вовсе промолчу (форматирование текста, сам цикл 0-24, суммирование переменной i++).
Сообщения автоматически склеены:

Возможно у тебя на втором сервере просто меньше слотов/тик, либо оба...
Вы б описание функции прочитали, а не ляпали несусветную дичь...
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Попробуй в консоль выводить игроку/серверу, а не в чат. Там в PrintToChatAll идёт массив от 1 до кол-ва игроков, а ты ещё и в OnPlayerRunCmdPost ляпнул, который вызывается в секунду столько же раз, сколько тик на сервере (а может и больше). То есть, грубо говоря, на сервере макс. число игроков 32 и тик сервера 128, то за секунду 4096 раз будет пытаться выводить сообщение!!! Про кол-во операций я и вовсе промолчу (форматирование текста, сам цикл 0-24, суммирование переменной i++).
Сообщения автоматически склеены:

Возможно у тебя на втором сервере просто меньше слотов/тик, либо оба...
Сама функция OnPlayerRunCmdPost и OnPlayerRunCmd крашит сервер вне зависимости на нажатую игроком кнопку, я только как конекчусь, в консоли пишет что я зашёл, в игре вижу выбор команды, ничего не нажимаю и сервер крашит, иногда успеваю зайти за тиму, но ничего не меняется, как крашило, так и крашит. PrintToChatAll я вписал для дебага, она не пишется в чат когда я захожу.

Кстати вчера тестил на sm 1.10 build 6458 win, с настройками сервера из линукса (sm 1.9), тоже крашило, возможно какая-то херня в файлах сервера, так как на sm 1.10 build 6453 всё норм работает с данным примером не крашит.
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
Вы б описание функции прочитали, а не ляпали несусветную дичь...
Прочитал:
C-подобный:
stock void PrintToChatAll(const char[] format, any ...)
{
	char buffer[254];

	for (int i = 1; i <= MaxClients; i++)
	{
		if (IsClientInGame(i))
		{
			SetGlobalTransTarget(i);
			VFormat(buffer, sizeof(buffer), format, 2);
			PrintToChat(i, "%s", buffer);
		}
	}
}
И что ты высрать попытался?
А может ты про OnPlayerRunCmdPost что-то попытался умное сказать? Описание из "wiki": Called after a clients movement buttons were processed.
Удивишься, но от игрока отсылаются пакеты. 64 раза в секунду, либо 128. Впредь не высирай несусветную хероту, если ты дуб.
 

kleuser

Участник
Сообщения
1,838
Реакции
732
Может кто переделать плагин.
Нужно убрать привязку по кнопке Е, и сделать через команду !whistle

C-подобный:
#include <sdktools>
#include <cstrike>

bool g_bCanWhistle[MAXPLAYERS+1];

char g_szPrefix[]                         = " \x04\x01\x04[WHISTLE]\x01";
char WHISTLE_FULL_SOUND_PATH[]             = "sound/zwolof/s_whistle.mp3";
char WHISTLE_RELATIVE_SOUND_PATH[]         = "*zwolof/s_whistle.mp3";

float fTime = 10.0;

public Plugin myinfo =
{
    name = "Simple Whistle",
    author = "zwolof",
    description = "Simple Whistle Plugin",
    version = "1.0",
    url = "https://steamcommunity.com/id/zwolof"
};

public void OnPluginStart()
{
    for(int i = 1; i <= MaxClients; i++)
        if(IsValidClient(i))
            g_bCanWhistle[i] = true;
}

public OnMapStart()
{
    AddFileToDownloadsTable(WHISTLE_FULL_SOUND_PATH);
    FakePrecacheSound(WHISTLE_RELATIVE_SOUND_PATH);
}

public Action OnPlayerRunCmd(client, &buttons)
{
    if(!IsPlayerAlive(client))
        return Plugin_Continue;
        
    if(!IsValidClient(client))
        return Plugin_Continue;
        
    if(GetClientTeam(client) == CS_TEAM_T)
    {
        if(buttons & IN_USE && g_bCanWhistle[client])
        {
            char szName[256];
            GetClientName(client, szName, sizeof(szName));
            
            PrintToChatAll("%s %s has \x04whistled\x01!", g_szPrefix, szName);
            float fVec[3];
            GetClientAbsOrigin(client, fVec);
            fVec[2] += 10;   
        
            EmitAmbientSound(WHISTLE_RELATIVE_SOUND_PATH, fVec, client, SNDLEVEL_RAIDSIREN, _, 0.3);
            g_bCanWhistle[client] = false;
            
            CreateTimer(fTime, RemoveCooldown, client);
        }
    }
    return Plugin_Continue;
}

public Action RemoveCooldown(Handle tmr, int client)
{
    g_bCanWhistle[client] = true;
    PrintToChat(client, "%s You can now \x04whistle\x01 again!", g_szPrefix);
}

stock FakePrecacheSound(const char[] szPath)
{
    AddToStringTable(FindStringTable("soundprecache"), szPath);
}

stock bool IsValidClient(int client)
{
    if (0 < client && client <= MaxClients && IsClientInGame(client))
        return true;

    return false;
}
 

Madness aka null138

Участник
Сообщения
713
Реакции
734
Может кто переделать плагин.
Нужно убрать привязку по кнопке Е, и сделать через команду !whistle

C-подобный:
#include <sdktools>
#include <cstrike>

bool g_bCanWhistle[MAXPLAYERS+1];

char g_szPrefix[]                         = " \x04\x01\x04[WHISTLE]\x01";
char WHISTLE_FULL_SOUND_PATH[]             = "sound/zwolof/s_whistle.mp3";
char WHISTLE_RELATIVE_SOUND_PATH[]         = "*zwolof/s_whistle.mp3";

float fTime = 10.0;

public Plugin myinfo =
{
    name = "Simple Whistle",
    author = "zwolof",
    description = "Simple Whistle Plugin",
    version = "1.0",
    url = "https://steamcommunity.com/id/zwolof"
};

public void OnPluginStart()
{
    for(int i = 1; i <= MaxClients; i++)
        if(IsValidClient(i))
            g_bCanWhistle[i] = true;
}

public OnMapStart()
{
    AddFileToDownloadsTable(WHISTLE_FULL_SOUND_PATH);
    FakePrecacheSound(WHISTLE_RELATIVE_SOUND_PATH);
}

public Action OnPlayerRunCmd(client, &buttons)
{
    if(!IsPlayerAlive(client))
        return Plugin_Continue;
   
    if(!IsValidClient(client))
        return Plugin_Continue;
   
    if(GetClientTeam(client) == CS_TEAM_T)
    {
        if(buttons & IN_USE && g_bCanWhistle[client])
        {
            char szName[256];
            GetClientName(client, szName, sizeof(szName));
       
            PrintToChatAll("%s %s has \x04whistled\x01!", g_szPrefix, szName);
            float fVec[3];
            GetClientAbsOrigin(client, fVec);
            fVec[2] += 10;
   
            EmitAmbientSound(WHISTLE_RELATIVE_SOUND_PATH, fVec, client, SNDLEVEL_RAIDSIREN, _, 0.3);
            g_bCanWhistle[client] = false;
       
            CreateTimer(fTime, RemoveCooldown, client);
        }
    }
    return Plugin_Continue;
}

public Action RemoveCooldown(Handle tmr, int client)
{
    g_bCanWhistle[client] = true;
    PrintToChat(client, "%s You can now \x04whistle\x01 again!", g_szPrefix);
}

stock FakePrecacheSound(const char[] szPath)
{
    AddToStringTable(FindStringTable("soundprecache"), szPath);
}

stock bool IsValidClient(int client)
{
    if (0 < client && client <= MaxClients && IsClientInGame(client))
        return true;

    return false;
}

C++:
#include <sdktools>

#define prefix " \x04\x01\x04[WHISTLE]\x01"
#define WHISTLE_FULL_SOUND_PATH "sound/zwolof/s_whistle.mp3"
#define WHISTLE_RELATIVE_SOUND_PATH "*zwolof/s_whistle.mp3"

bool g_bCanWhistle[MAXPLAYERS+1] = {true, ...};

public void OnPluginStart() {
    RegConsoleCmd("sm_whistle", whistle, "Whistle");
}

public void OnMapStart() {
    AddFileToDownloadsTable(WHISTLE_FULL_SOUND_PATH);
    AddToStringTable(FindStringTable("soundprecache"), WHISTLE_RELATIVE_SOUND_PATH);
}

public void OnClientDisconnect(int client) {
    g_bCanWhistle[client] = true;
}

public Action whistle(int client, int args) {
    if(!IsValidClient(client)) return Plugin_Handled;

    if(g_bCanWhistle[client] && GetClientTeam(client) == 3) {
        g_bCanWhistle[client] = false;
        PrintToChatAll("%s %N has \x04whistled\x01!", prefix, client);
        float fVec[3];
        GetClientAbsOrigin(client, fVec);
        fVec[2] += 10; 
        EmitAmbientSound(WHISTLE_RELATIVE_SOUND_PATH, fVec, client, SNDLEVEL_RAIDSIREN, _, 0.3);
        CreateTimer(10.0, RemoveCooldown, GetClientOfUserId(client));
    }
    return Plugin_Handled;
}

public Action RemoveCooldown(Handle tmr, any client) {
    if(!IsClientInGame(client)) return Plugin_Stop;

    g_bCanWhistle[client] = true;
    PrintToChat(client, "%s You can now \x04whistle\x01 again!", prefix);
    return Plugin_Handled;
}

stock bool IsValidClient(int client) {
    if (0 < client && client <= MaxClients && IsClientInGame(client) && IsPlayerAlive(client))
        return true;

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

ExiteE

Участник
Сообщения
120
Реакции
10
Хотел бы попросить немного подправить плагин, а именно сделать так, чтобы деньги не выдавались на пистолетке. Но при этом у меня стоит первый раунд как на фейсите(+пистолетка). То есть чтобы деньги начислялись после 2 рануда. Заранее спасибо
 

Вложения

  • VIP_Money_1.1.sp
    2.3 КБ · Просмотры: 5
Последнее редактирование:

alexmy

Участник
Сообщения
284
Реакции
13
Ребята привет. Как можно получить координаты оружие, которое бросил?
 

Madness aka null138

Участник
Сообщения
713
Реакции
734
Ребята привет. Как можно получить координаты оружие, которое бросил?
C++:
#include <sdktools>
#include <sdkhooks>

bool bEntTouch[2048] = {false, ...};

public void OnClientPutInServer(int client) {
    SDKHook(client, SDKHook_WeaponDropPost, WeaponDropPost);
}

public Action WeaponDropPost(int client, int weapon) {
    if(weapon < 1 || !IsValidEdict(weapon)) return;
    SDKHook(weapon, SDKHook_StartTouch, StartTouch);
}

public Action StartTouch(int entity, int entity2) {
    if(!bEntTouch[entity] && entity2 == 0) {
        bEntTouch[entity] = true;
        CreateTimer(0.7, GetPos, entity, TIMER_FLAG_NO_MAPCHANGE);
    }
}

public Action GetPos(Handle timer, any entity) {
    float fEntPos[3]; GetEntPropVector(entity, Prop_Send, "m_vecOrigin", fEntPos);
    bEntTouch[entity] = false;
    // fEntPos то, что тебе нужно.
}
Сообщения автоматически склеены:

Хотел бы попросить немного подправить плагин, а именно сделать так, чтобы деньги не выдавались на пистолетке. Но при этом у меня стоит первый раунд как на фейсите(+пистолетка). То есть чтобы деньги начислялись после 2 рануда. Заранее спасибо
 

Вложения

  • VIP_Money_1.1.sp
    2.5 КБ · Просмотры: 9
Последнее редактирование:

ExiteE

Участник
Сообщения
120
Реакции
10
C++:
#include <sdktools>
#include <sdkhooks>

bool bEntTouch[2048] = {false, ...};

public void OnClientPutInServer(int client) {
    SDKHook(client, SDKHook_WeaponDropPost, WeaponDropPost);
}

public Action WeaponDropPost(int client, int weapon) {
    if(weapon < 1 || !IsValidEdict(weapon)) return;
    SDKHook(weapon, SDKHook_StartTouch, StartTouch);
}

public Action StartTouch(int entity, int entity2) {
    if(!bEntTouch[entity] && entity2 == 0) {
        bEntTouch[entity] = true;
        CreateTimer(0.7, GetPos, entity, TIMER_FLAG_NO_MAPCHANGE);
    }
}

public Action GetPos(Handle timer, any entity) {
    float fEntPos[3]; GetEntPropVector(entity, Prop_Send, "m_vecOrigin", fEntPos);
    bEntTouch[entity] = false;
    // fEntPos то, что тебе нужно.
}
Сообщения автоматически склеены:
Попробовал скомпилить и оказалось, что это палгин компилируется на ядре 3.0, а у меня вип ядро версии 2.1.3. Возможно под эту версию сделаю?
 

Madness aka null138

Участник
Сообщения
713
Реакции
734
Сверху Снизу