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

Amirsz

Релаксируем... Ну хотя бы пытаемся
Сообщения
261
Реакции
81
Бьёт ошибку в error-логах хоть ты тресни.
L 03/09/2020 - 14:51:37: [SM] Exception reported: Client 2 is not connected
L 03/09/2020 - 14:51:37: [SM] Blaming: AntiVPN.smx
L 03/09/2020 - 14:51:37: [SM] Call stack trace:
L 03/09/2020 - 14:51:37: [SM] [0] GetClientAuthId
L 03/09/2020 - 14:51:37: [SM] [1] Line 131, AntiVPN.sp::HttpResponseCallback

Может кто знает как исправить?

C-подобный:
void HttpResponseCallback(bool success, const char[] error, System2HTTPRequest request, System2HTTPResponse response, HTTPRequestMethod method)
{
    if(success)
    {
        char[] content = new char[response.ContentLength + 1];
        response.GetContent(content, response.ContentLength + 1);
        char steamid[28], name[100], ip[30];
        DataPack pack = request.Any;
        pack.Reset();
        pack.ReadString(ip, sizeof(ip));
        int client = pack.ReadCell();
        delete pack;
        GetClientAuthId(client, AuthId_Steam2, steamid, sizeof(steamid));
        GetClientName(client, name, sizeof(name));
        int buffer_len = strlen(name) * 2 + 1;
        char[] newname = new char[buffer_len];
        SQL_EscapeString(g_db, name, newname, buffer_len);
        int proxy;
      
        if (StrEqual(content, "Y"))
        {
            VPNBlock_Log(0, client, ip);
            KickClient(client, "%t", "VPN Kick");
            proxy = 1;
        }
        else
        {
            proxy = 0;
        }
        char query[300];
        Format(query, sizeof(query), "INSERT INTO `AntiVPN`(`playername`, `steamid`, `lastupdated`, `ip`, `proxy`) VALUES('%s', '%s', '%d', '%s', '%d');", newname, steamid, GetTime(), ip, proxy);
        g_db.Query(queryI, query);
    }
    else
    {
        if (!g_written)
        {
            g_written = true;
            VPNBlock_Log(1);
        }
    }
}
Оффтоп
IsClientConnected(int client)
Добавь проверку.
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,076
Теперь даже не компилится :D
Клёвая ошибка!
Ну ладно, без рофлика (спустя 5 минуток написал):
Ошибку показать слабо? И где у тебя вообще HTTP-запрос отправляется? Может у тебя игрок даже не успел подключиться.
 
Последнее редактирование:

Sleep

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

#define MAX_WEAPONS        27

public Plugin:myinfo = {
    name = "Give Weapon",
    author = "Kiske",
    description = "Give a weapon to a player from a command",
    version = "1.0.1",
    url = "http://www.sourcemod.net/"
};

new const String:g_weapons[MAX_WEAPONS][] = {
    "weapon_ak47", "weapon_aug", "weapon_awp", "weapon_deagle", "weapon_elite", "weapon_famas", "weapon_fiveseven", "weapon_flashbang",
    "weapon_g3sg1", "weapon_galil", "weapon_glock", "weapon_hegrenade", "weapon_m249", "weapon_m4a1",
    "weapon_mac10", "weapon_tmp", "weapon_mp5navy", "weapon_p228", "weapon_p90", "weapon_sg550",
    "weapon_sg552", "weapon_smokegrenade", "weapon_scout", "weapon_ump45", "weapon_usp", "weapon_m3",
    "weapon_xm1014"
};

public OnPluginStart()
{
    RegAdminCmd("sm_weapons", smWeapon, ADMFLAG_BAN, "- <target> <weaponname>");
    RegAdminCmd("sm_weaponlist", smWeaponList, ADMFLAG_BAN, "- list of the weapon names");
}

public Action:smWeapon(id, args)
{
    if(args < 2)
    {
        ReplyToCommand(id, "[SM] Usage: sm_weapons <name | #userid> <weaponname>");
        return Plugin_Handled;
    }
    
    decl String:sArg[256];
    decl String:sTempArg[32];
    decl String:sWeaponName[32];
    decl String:sWeaponNameTemp[32];
    decl iL;
    decl iNL;
    
    GetCmdArgString(sArg, sizeof(sArg));
    iL = BreakString(sArg, sTempArg, sizeof(sTempArg));
    
    if((iNL = BreakString(sArg[iL], sWeaponName, sizeof(sWeaponName))) != -1)
    iL += iNL;
    
    new i;
    new iValid = 0;
    
    if(StrContains(sWeaponName, "weapon_") == -1)
    {
        FormatEx(sWeaponNameTemp, 31, "weapon_");
        StrCat(sWeaponNameTemp, 31, sWeaponName);
        
        strcopy(sWeaponName, 31, sWeaponNameTemp);
    }
    
    for(i = 0; i < MAX_WEAPONS; ++i)
    {
        if(StrEqual(sWeaponName, g_weapons[i]))
        {
            iValid = 1;
            break;
        }
    }
    
    if(!iValid)
    {
        ReplyToCommand(id, "[SM] The weaponname (%s) isn't valid", sWeaponName);
        return Plugin_Handled;
    }
    
    decl String:sTargetName[MAX_TARGET_LENGTH];
    decl sTargetList[1];
    decl bool:bTN_IsML;
    
    new iTarget = -1;
    
    if(ProcessTargetString(sTempArg, id, sTargetList, 1, COMMAND_FILTER_ALIVE|COMMAND_FILTER_NO_MULTI, sTargetName, sizeof(sTargetName), bTN_IsML) > 0)
    iTarget = sTargetList[0];
    if(IsFakeClient(iTarget))
    {
        ReplyToCommand(id, "[SM] Bot isn't support");
    }
    
    if(iTarget != -1 && !IsFakeClient(iTarget))
    {       
        new iWeapon1 = GetPlayerWeaponSlot(iTarget, 0);
        new iWeapon2 = GetPlayerWeaponSlot(iTarget, 1);
        new iWeapon3 = GetPlayerWeaponSlot(iTarget, 3);
        decl String:buffer1[32];
        decl String:buffer2[32];
        decl String:buffer3[32];
        
        if(iWeapon1 != -1)
        {
            GetEntityClassname(iWeapon1, buffer1, 32);
            RemovePlayerItem(iTarget, iWeapon1);            
        }
        if(iWeapon2 != -1)
        {
            GetEntityClassname(iWeapon2, buffer2, 32);
            RemovePlayerItem(iTarget, iWeapon2);
        }
        if(iWeapon3 != -1)
        {
            GetEntityClassname(iWeapon3, buffer3, 32);
            RemovePlayerItem(iTarget, iWeapon3);
        }       
        
        GivePlayerItem(iTarget, sWeaponName);
        
        if((iWeapon1 != -1) && !(StrEqual(buffer1, sWeaponName)))
        {                       
            GivePlayerItem(iTarget, buffer1);
        }
        if(iWeapon2 != -1 && !(StrEqual(buffer2, sWeaponName)))
        {                       
            GivePlayerItem(iTarget, buffer2);
        }
        if(iWeapon3 != -1 && !(StrEqual(buffer3, sWeaponName)))
        {                       
            GivePlayerItem(iTarget, buffer3);
        }
    }   
    return Plugin_Handled;
}

public Action:smWeaponList(id, args)
{
    new i;
    for(i = 0; i < MAX_WEAPONS; ++i)
    ReplyToCommand(id, "%s", g_weapons[i]);
    
    ReplyToCommand(id, "");
    ReplyToCommand(id, "* No need to put weapon_ in the <weaponname>");
    
    return Plugin_Handled;
}
 

Madness aka null138

Участник
Сообщения
721
Реакции
784
Бьёт ошибку в error-логах хоть ты тресни.
L 03/09/2020 - 14:51:37: [SM] Exception reported: Client 2 is not connected
L 03/09/2020 - 14:51:37: [SM] Blaming: AntiVPN.smx
L 03/09/2020 - 14:51:37: [SM] Call stack trace:
L 03/09/2020 - 14:51:37: [SM] [0] GetClientAuthId
L 03/09/2020 - 14:51:37: [SM] [1] Line 131, AntiVPN.sp::HttpResponseCallback

Может кто знает как исправить?

C-подобный:
void HttpResponseCallback(bool success, const char[] error, System2HTTPRequest request, System2HTTPResponse response, HTTPRequestMethod method)
{
    if(success)
    {
        char[] content = new char[response.ContentLength + 1];
        response.GetContent(content, response.ContentLength + 1);
        char steamid[28], name[100], ip[30];
        DataPack pack = request.Any;
        pack.Reset();
        pack.ReadString(ip, sizeof(ip));
        int client = pack.ReadCell();
        delete pack;
        GetClientAuthId(client, AuthId_Steam2, steamid, sizeof(steamid));
        GetClientName(client, name, sizeof(name));
        int buffer_len = strlen(name) * 2 + 1;
        char[] newname = new char[buffer_len];
        SQL_EscapeString(g_db, name, newname, buffer_len);
        int proxy;
     
        if (StrEqual(content, "Y"))
        {
            VPNBlock_Log(0, client, ip);
            KickClient(client, "%t", "VPN Kick");
            proxy = 1;
        }
        else
        {
            proxy = 0;
        }
        char query[300];
        Format(query, sizeof(query), "INSERT INTO `AntiVPN`(`playername`, `steamid`, `lastupdated`, `ip`, `proxy`) VALUES('%s', '%s', '%d', '%s', '%d');", newname, steamid, GetTime(), ip, proxy);
        g_db.Query(queryI, query);
    }
    else
    {
        if (!g_written)
        {
            g_written = true;
            VPNBlock_Log(1);
        }
    }
}
Оффтоп


C++:
void HttpResponseCallback(bool success, const char[] error, System2HTTPRequest request, System2HTTPResponse response, HTTPRequestMethod method)
{
    if(success)
    {
        char[] content = new char[response.ContentLength + 1];
        response.GetContent(content, response.ContentLength + 1);
        char steamid[28], name[100], ip[30];
        DataPack pack = request.Any;
        pack.Reset();
        pack.ReadString(ip, sizeof(ip));
        int client = pack.ReadCell();
        delete pack;
        if(!IsClientConnected(client)) return;
        GetClientAuthId(client, AuthId_Steam2, steamid, sizeof(steamid));
        GetClientName(client, name, sizeof(name));
        int buffer_len = strlen(name) * 2 + 1;
        char[] newname = new char[buffer_len];
        SQL_EscapeString(g_db, name, newname, buffer_len);
        int proxy;
     
        if (StrEqual(content, "Y"))
        {
            VPNBlock_Log(0, client, ip);
            KickClient(client, "%t", "VPN Kick");
            proxy = 1;
        }
        else
        {
            proxy = 0;
        }
        char query[300];
        Format(query, sizeof(query), "INSERT INTO `AntiVPN`(`playername`, `steamid`, `lastupdated`, `ip`, `proxy`) VALUES('%s', '%s', '%d', '%s', '%d');", newname, steamid, GetTime(), ip, proxy);
        g_db.Query(queryI, query);
    }
    else
    {
        if (!g_written)
        {
            g_written = true;
            VPNBlock_Log(1);
        }
    }
}
 

goldfish

Участник
Сообщения
17
Реакции
1
Здравствуйте, извините если не в том разделе вопрос.

Как вывести игроку эту подсказку (играить в роли..) после подключения игрока и захвата бота?
Безымянный.png


дело в том, что после более чем 5 игроков сервер уже не переключает игроков в спектры к ботам, в этом случае в спектры кидает плагин (мультислот) но после этого игрок уже сидит в спектрах без этой подсказки, и так есть способы включить принудительно этот интервейс?

Так же заодно хотел бы узнать иногда появляется сверху вотакой интерфейс сверху и там что-то написано (уже не помню :D вроде что-то типо "команда выживших") вот как этот интерфейс заставит отобразиться и при каких условияъ он будет отображаться?
Безымянный.png


Спасибо
 
Последнее редактирование модератором:

xyligan

Паркетный пол трещит под моей крышкой черепной
Сообщения
900
Реакции
434
C++:
void HttpResponseCallback(bool success, const char[] error, System2HTTPRequest request, System2HTTPResponse response, HTTPRequestMethod method)
{
    if(success)
    {
        char[] content = new char[response.ContentLength + 1];
        response.GetContent(content, response.ContentLength + 1);
        char steamid[28], name[100], ip[30];
        DataPack pack = request.Any;
        pack.Reset();
        pack.ReadString(ip, sizeof(ip));
        int client = pack.ReadCell();
        delete pack;
        if(!IsClientConnected(client)) return;
        GetClientAuthId(client, AuthId_Steam2, steamid, sizeof(steamid));
        GetClientName(client, name, sizeof(name));
        int buffer_len = strlen(name) * 2 + 1;
        char[] newname = new char[buffer_len];
        SQL_EscapeString(g_db, name, newname, buffer_len);
        int proxy;
    
        if (StrEqual(content, "Y"))
        {
            VPNBlock_Log(0, client, ip);
            KickClient(client, "%t", "VPN Kick");
            proxy = 1;
        }
        else
        {
            proxy = 0;
        }
        char query[300];
        Format(query, sizeof(query), "INSERT INTO `AntiVPN`(`playername`, `steamid`, `lastupdated`, `ip`, `proxy`) VALUES('%s', '%s', '%d', '%s', '%d');", newname, steamid, GetTime(), ip, proxy);
        g_db.Query(queryI, query);
    }
    else
    {
        if (!g_written)
        {
            g_written = true;
            VPNBlock_Log(1);
        }
    }
}
Спасибо, но уже пофиксил:)
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,076
Так что, всё же есть хоть у кого-то идеи по уменьшению размера спрайта? Спрайт 1024х1024 гигантский, scale ни в свойствах, ни в vmt не помог (либо я кривуля)
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Так что, всё же есть хоть у кого-то идеи по уменьшению размера спрайта? Спрайт 1024х1024 гигантский, scale ни в свойствах, ни в vmt не помог (либо я кривуля)
Через это пробовали?
C++:
int iScaleOfsset = GetEntSendPropOffs(ent, "m_flModelScale", true);
if(iScaleOfsset != -1)
{
    SetEntDataFloat(ent, iScaleOfsset, new_scale, true);
}
Оффтоп
 

x330122

Участник
Сообщения
357
Реакции
152
Так что, всё же есть хоть у кого-то идеи по уменьшению размера спрайта? Спрайт 1024х1024 гигантский, scale ни в свойствах, ни в vmt не помог (либо я кривуля)
Сохранить .VTF файл с размером 512x512 попробуй.
1584182981390.png
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,076
Спрайт же, а не декаль. Но попробую.

Сохранить .VTF файл с размером 512x512 попробуй.
Факт остаётся фактом: спрайт будет гигантский, пробовал и 256х256, всё же больше, но и пикселит уже сильно. 128х128 более-менее, но так же пиксели.

Через это пробовали?
Вот про это я к слову забыл. Возможно есть такое и оно работает.
Использовал DispatchKeyValue(sprite, "scale", "0.0625");
Получал значения через flScale, вроде бы значения были такие же (но не хотели как надо). В общем буду пробовать!
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,805
Реакции
5,254
RusJJ, при создании env_sprite (ent= CreateEntityByName("env_sprite")) делаешь DispatchKeyValue(ent, "scale", "0.1"); перед DispatchSpawn(ent);
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,076
@Grey83, ну это само собой.
Просто дело в том, что размеры, которые можно: 0.125, 0.25, 0.5, 1.0
Почему-то другие игнорируются, а если точнее - заменяются ближним из одного сверху.
0.0625 меньше в 2 раза, чем 0.125, но не работает - слишком большой. Попробовал сейчас $scale 0.0625 в VMT, отпишусь
1584190635381.png


P.S. $scale в VMT не работает вообще никак :(
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
@Grey83, ну это само собой.
Просто дело в том, что размеры, которые можно: 0.125, 0.25, 0.5, 1.0
Почему-то другие игнорируются, а если точнее - заменяются ближним из одного сверху.
0.0625 меньше в 2 раза, чем 0.125, но не работает - слишком большой. Попробовал сейчас $scale 0.0625 в VMT, отпишусь
Посмотреть вложение 54005

P.S. $scale в VMT не работает вообще никак :(
C++:
AcceptEntityInput(ent, "SetScale", ent, ent, NEW_SCALE_FLOAT);
Взято с env_sprite_oriented - Valve Developer Community
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,805
Реакции
5,254
iLoco, если нужно поменять размер спрайта после его создания, то можно и так.
А как это делать в момент создания я уже написал.
 

RAIN182

Участник
Сообщения
411
Реакции
55
Где достать годный плагин фейковые игроки для csgo ? Да и что бы в браузере игры они отображались . Такой есть ?
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,076
А как это делать в момент создания я уже написал.
Использовал DispatchKeyValue(sprite, "scale", "0.0625");
Просто дело в том, что размеры, которые можно: 0.125, 0.25, 0.5, 1.0
Почему-то другие игнорируются, а если точнее - заменяются ближним из одного сверху.
В любом случае буду пробовать изменять по-другому, как подсказал @iLoco, хотя через flSpriteScale не работало так же.
 

magis1337

Участник
Сообщения
252
Реакции
23
на ggwp есть плагин wh Для игроков, получается после смерти они могут наблюдать в виде квадратика. Есть код, кто-то может мб сделать для админов только что-бы было? и так же что-бы не грузить сервер, можно было в консоле писать sm_wh включаются эти квадраты при нажатие снова отключается квадраты сам код
#pragma semicolon 1

#include <sourcemod>
#include <sdktools>
#include <sdkhooks>

public Plugin:myinfo =
{
name = "WH Clients Death",
author = "-=1989=- and WS FiX Nek.'a 2x2",
version = "3.4.1"
};

new g_MySprite[MAXPLAYERS + 1];
new g_MySpriteRef[MAXPLAYERS + 1];

public OnPluginStart()
{
HookEvent("player_spawn", player_spawn);
HookEvent("player_death", ClearEvent);
HookEvent("player_team", ClearEvent);
}

public OnMapStart()
{
AddFileToDownloadsTable("materials/ggwp/wh/rectangle_blue.vmt");
AddFileToDownloadsTable("materials/ggwp/wh/rectangle_blue.vtf");
AddFileToDownloadsTable("materials/ggwp/wh/rectangle_red.vmt");
AddFileToDownloadsTable("materials/ggwp/wh/rectangle_red.vtf");

PrecacheDecal("ggwp/wh/rectangle_blue.vmt", true);
PrecacheDecal("ggwp/wh/rectangle_red", true);
}

public ClearEvent(Handle:event, const String:name[], bool:silent)
{
wS_ClearSprite(GetClientOfUserId(GetEventInt(event, "userid")));
}

public player_spawn(Handle:event, const String:name[], bool:silent)
{
CreateTimer(0.1, player_spawn_Timer, GetEventInt(event, "userid"), TIMER_FLAG_NO_MAPCHANGE);
}

public Action:player_spawn_Timer(Handle:timer, any:id)
{
new client = GetClientOfUserId(id);
if (client < 1)
return Plugin_Stop;

wS_ClearSprite(client);

if (!IsPlayerAlive(client))
return Plugin_Stop;

new ent = CreateEntityByName("env_sprite");
if (ent < 1)
{
LogError("env_sprite error");
return Plugin_Stop;
}

g_MySprite[client] = ent;
g_MySpriteRef[client] = EntIndexToEntRef(ent);

decl Float:pos[3]; GetClientAbsOrigin(client, pos); pos[2] += 35.0;
DispatchKeyValueVector(ent, "origin", pos);
DispatchKeyValue(ent, "model", GetClientTeam(client) == 2 ? "ggwp/wh/rectangle_red.vmt" : "ggwp/wh/rectangle_blue.vmt");
DispatchKeyValue(ent, "rendermode", "0");
DispatchKeyValue(ent, "renderfx", "0");
DispatchKeyValue(ent, "renderamt", "255");
DispatchKeyValue(ent, "scale", "0.5");
DispatchKeyValue(ent, "GlowProxySize", "61.0");
DispatchSpawn(ent);

SetVariantString("!activator");
AcceptEntityInput(ent, "SetParent", client, ent);

SDKHook(ent, SDKHook_SetTransmit, Hook_SetTransmit);

return Plugin_Stop;
}

public Action:Hook_SetTransmit(entity, client)
{
return entity == g_MySprite[client] || IsPlayerAlive(client) ? Plugin_Handled : Plugin_Continue;
}

stock wS_ClearSprite(client)
{
if (g_MySprite[client] > 0)
{
new ent = EntRefToEntIndex(g_MySpriteRef[client]);
if (ent > 0) AcceptEntityInput(ent, "Kill");
g_MySprite[client] = 0;
g_MySpriteRef[client] = 0;
}
}

public OnClientDisconnect(client)
{
wS_ClearSprite(client);
}
 
Сверху Снизу