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

Svoboda

Помощь по CSS v92
Сообщения
393
Реакции
56
Всем привет
Не подскажете? Как можно сделать так что бы когда люди заходили на сервер их кликало с причиной "Мы переехали на новый IP:...."?
Вот держи правда он чуть чуть не так работает,он игрокам пишет в чате что сервер переехал и просит их перейти на него а если они не переходят то их кикает
 

Вложения

  • ip.sp
    2.1 КБ · Просмотры: 23

Jedi qLux

Участник
Сообщения
187
Реакции
42
Вот держи правда он чуть чуть не так работает,он игрокам пишет в чате что сервер переехал и просит их перейти на него а если они не переходят то их кикает
СПАСИБО БОЛЬШОЕ :3
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
Как можно сделать так что бы когда люди заходили на сервер их кликало с причиной "Мы переехали на новый IP:...."?
PHP:
#include <sourcemod>

#pragma newdecls  required
#pragma semicolon 1

public bool OnClientConnect(int iClient, char[] szRejectMsg, int iBufferLength) {
  strcopy(szRejectMsg, iBufferLength, "Мы переехали на новый IP: 127.0.0.1:27015");
  return false;
}
 

Jedi qLux

Участник
Сообщения
187
Реакции
42
Ребята, можно как-то этот исходник переписать что бы когда активировался NoZoom раунд, все другие оружия выключались?
C-подобный:
#include <sourcemod>
#include <sdkhooks>
#include <sdktools>
#include <csgo_colors>

#undef REQUIRE_PLUGIN
#include <adminmenu>

bool g_iNoZoomOnly;
int g_iNoZoomOnlyRounds;
int g_iKDRounds;
bool g_iPV[MAXPLAYERS+1];

int m_flNextSecondaryAttack = -1;

int g_cRounds, g_cKDRounds;
float g_cPercent;
bool g_cPrintKills, g_cPrintAdv;

TopMenu g_hAdminMenu = null;

public Plugin myinfo =
{
    name    = "NoZoom System",
    description = "NoZoom system for CS:GO.",
    author    = "DUCK (vk.com/geliydaun)",
    version = "1.0.9",
    url = "http://crystals.pw/"
};

public void OnPluginStart()
{
    RegConsoleCmd("sm_nz", VoteZoom);
    RegConsoleCmd("sm_nozoom", VoteZoom);
    
    HookEvent("player_death", PlayerDeath);
    HookEvent("round_start", RoundStart);
    
    m_flNextSecondaryAttack = FindSendPropInfo("CBaseCombatWeapon", "m_flNextSecondaryAttack");
    
    ConVar cvar;
    
    cvar = CreateConVar("sm_vz_rounds", "5", "Количество раундов без прицела после голосования.");
    HookConVarChange(cvar, RoundsCvarChange);
    g_cRounds = GetConVarInt(cvar);
    
    cvar = CreateConVar("sm_vz_kd_rounds", "5", "Количество раундов между голосованиями.");
    HookConVarChange(cvar, KDRoundsCvarChange);
    g_cKDRounds = GetConVarInt(cvar);
    
    cvar = CreateConVar("sm_vz_percent", "0.5", "Процент от всех игроков, требуемый для начала игры без прицелов. (0.5 - 50%)");
    HookConVarChange(cvar, PercentCvarChange);
    g_cPercent = GetConVarFloat(cvar);
    
    cvar = CreateConVar("sm_print_kills_to_chat", "1", "Писать в чат об убийствах без прицела? (Во время NoZoom раундов функция автоматически отключается) (1 - Да, 0 - нет).");
    HookConVarChange(cvar, PrintKillsCvarChange);
    g_cPrintKills = GetConVarBool(cvar);
    
    cvar = CreateConVar("sm_print_adv", "1", "Включена ли реклама в начале раунда? 1 - Да, 0 - Нет");
    HookConVarChange(cvar, PrintAdvCvarChange);
    g_cPrintAdv = GetConVarBool(cvar);
    
    AutoExecConfig(true, "NoZoom");
    
    if (LibraryExists("adminmenu"))
    {
        TopMenu hTopMenu;
        hTopMenu = GetAdminTopMenu();
        if (hTopMenu != null)
        {
            OnAdminMenuReady(hTopMenu);
        }
    }
    
    for (int i = 1; i <= MaxClients; ++i)
    {       
        if (IsClientInGame(i))
        {
            OnClientPutInServer(i);
        }
    }
}

public OnLibraryRemoved(const char[] szName)
{
    if (StrEqual(szName, "adminmenu"))
        g_hAdminMenu = null;
}

public void OnAdminMenuReady(Handle aTopMenu)
{
    TopMenu hTopMenu = TopMenu.FromHandle(aTopMenu);

    if (hTopMenu == g_hAdminMenu)
        return;

    g_hAdminMenu = hTopMenu;

    TopMenuObject hCategory = g_hAdminMenu.FindCategory("ServerCommands");

    if (hCategory != INVALID_TOPMENUOBJECT)
        g_hAdminMenu.AddItem("AdminStart", Handler_AdminStart, hCategory, "start_nozoom", ADMFLAG_BAN);
}

public void Handler_AdminStart(TopMenu hMenu, TopMenuAction action, TopMenuObject object_id, int iClient, char[] sBuffer, int maxlength)
{
    switch (action)
    {
        case TopMenuAction_DisplayOption:
        {
            FormatEx(sBuffer, maxlength, "Начать битву без прицелов");
        }
        case TopMenuAction_SelectOption:
        {
            for (int i = 1; i <= MaxClients; ++i)
            {       
                if (IsClientInGame(i))
                {
                    g_iPV[i] = true;
                }
            }
            CGOPrintToChatAll("{RED}[ {DEFAULT}NoZoom {RED}] {DEFAULT}В следующем раунде начнется битва без прицелов!");
        }
    }
}

public OnMapStart()
{
    g_iNoZoomOnly = false;
    g_iKDRounds = g_cKDRounds + 1;
}

public void OnClientPutInServer(int client)
{
    SDKHook(client, SDKHook_PreThink, OnPreThink);
}

public Action OnPreThink(int client)
{
    if(g_iNoZoomOnly)
    {
        SetNoScope(GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon"));
    }
    return Plugin_Continue;
}

public void OnClientDisconnect(int client)
{   
    g_iPV[client] = false;
}

public PlayerDeath(Event hEvent, const char[] name, bool dontBroadcast)
{
    if(g_cPrintKills)
    {
        if(!g_iNoZoomOnly)
        {
            int client = GetClientOfUserId(hEvent.GetInt("userid"));
            int attacker = GetClientOfUserId(hEvent.GetInt("attacker"));
          
            if (attacker > 0 && IsClientInGame(attacker))
            {
                if (attacker != client)
                {
                    char weapon[32];
                    GetEventString(hEvent, "weapon", weapon, sizeof(weapon));
                    if (!GetEntProp(attacker, Prop_Send, "m_bIsScoped") && StrContains(weapon, "awp", false) != -1)
                    {
                        CGOPrintToChatAll("{LIME} » Игрок {LIGHTBLUE}%N {LIME}убил {OLIVE}%N {LIME}без прицела!", attacker, client);
                    }
                }
            }
        }
    }
}
    
public Action VoteZoom(int client, int args)
{
    if (client > 0)
    {
        if(!g_iNoZoomOnly)
        {
            if(GetVotesNum() < RoundToFloor(float(GetClientCount(true)) * g_cPercent))
            {
                if(g_iKDRounds - 1 >= g_cKDRounds)
                {
                    if(!g_iPV[client]) CGOPrintToChatAll("{RED}[ {DEFAULT}NoZoom {RED}] {PURPLE}%N {DEFAULT}проголосовал за битву без прицелов {OLIVE}(%i из %i){DEFAULT}.", client, GetVotesNum()+1, RoundToFloor(float(GetClientCount(true)) * g_cPercent));
                    else CGOPrintToChat(client, "{RED}[ {DEFAULT}NoZoom {RED}]{DEFAULT}Вы уже проголосовали за битву без прицелов!");
                    g_iPV[client] = true;
                    if(GetVotesNum() >= RoundToFloor(float(GetClientCount(true)) * g_cPercent)) CGOPrintToChatAll("{RED}[ {DEFAULT}NoZoom {RED}] {DEFAULT}В следующем раунде начнется битва без прицелов!");
                }
                else CGOPrintToChat(client, "{RED}[ {DEFAULT}NoZoom {RED}] {DEFAULT}Голосовать за битву без прицелов можно будет через {OLIVE}%i{DEFAULT} раундов!", g_cKDRounds - g_iKDRounds + 1);
            }
            else CGOPrintToChat(client, "{RED}[ {DEFAULT}NoZoom {RED}] {DEFAULT}Достаточное количество голосов уже набрано!");
        }
        else CGOPrintToChat(client, "{RED}[ {DEFAULT}NoZoom {RED}] {DEFAULT}Битва без прицелов уже проходит!");
    }
    
    return Plugin_Handled;
}

public RoundStart(Event hEvent, const char[] name, bool dontBroadcast)
{
    if(!g_iNoZoomOnly)
    {
        if(g_iKDRounds - 1 < g_cKDRounds) ++g_iKDRounds;
        
        if(GetVotesNum() >= RoundToFloor(float(GetClientCount(true)) * g_cPercent))
        {
            g_iNoZoomOnly = true;
        }
        
        if(g_cPrintAdv) if(g_iKDRounds - 1 >= g_cKDRounds) CGOPrintToChatAll("{RED}[ {DEFAULT}NoZoom {RED}] {DEFAULT}Используйте команду {OLIVE}!nz{DEFAULT}, чтобы проголосовать за игру без прицелов!")
    }
    
    if(g_iNoZoomOnlyRounds == g_cRounds)
    {
        g_iNoZoomOnly = false;
        g_iNoZoomOnlyRounds = 0;

        for (int i = 1; i <= MaxClients; ++i)
        {       
            if (IsClientInGame(i))
            {
                g_iPV[i] = false;
            }
        }
        g_iKDRounds = 1;
        
        CGOPrintToChatAll("{RED}[ {DEFAULT}NoZoom {RED}] {DEFAULT}Битва без прицелов завершена!")
    }
    
    if(g_iNoZoomOnly)
    {
        ++g_iNoZoomOnlyRounds;
        CGOPrintToChatAll("{RED}[ {DEFAULT}NoZoom {RED}] {DEFAULT}Прицелы в этом раунде отключены!");
    }
}

void SetNoScope(int weapon)
{
    if (IsValidEdict(weapon))
    {
        char classname[32];
        GetEdictClassname(weapon, classname, sizeof(classname));
        
        if (!StrEqual(classname[7], "knife") && !StrEqual(classname[7], "revolver") && !StrEqual(classname[7], "hegrenade") && !StrEqual(classname[7], "incgrenade") && !StrEqual(classname[7], "molotov") && !StrEqual(classname[7], "smokegrenade") && !StrEqual(classname[7], "tagrenade") && !StrEqual(classname[7], "flashbang") && !StrEqual(classname[7], "decoy"))
        {
            SetEntDataFloat(weapon, m_flNextSecondaryAttack, GetGameTime() + 2.0);
        }
    }
}

GetVotesNum()
{
    int num;
    
    for (int i = 1; i <= MaxClients; ++i)
    {       
        if (g_iPV[i])
        {
            num++;
        }
    }
    
    return num;
}

public void RoundsCvarChange(Handle convar, char[] oldValue, char[] newValue) { g_cRounds = StringToInt(newValue); }

public void KDRoundsCvarChange(Handle convar, char[] oldValue, char[] newValue) { g_cKDRounds = StringToInt(newValue); }

public void PercentCvarChange(Handle convar, char[] oldValue, char[] newValue) { g_cPercent = StringToFloat(newValue); }

public void PrintKillsCvarChange(Handle convar, char[] oldValue, char[] newValue) { g_cPrintKills = view_as<bool>(StringToInt(newValue)); }

public void PrintAdvCvarChange(Handle convar, char[] oldValue, char[] newValue) { g_cPrintAdv = view_as<bool>(StringToInt(newValue)); }
 

acrobite

Участник
Сообщения
182
Реакции
33
Прошу помочь с плагином. Возникает ошибка:
L 04/30/2018 - 22:03:46: [SM] Exception reported: Client 9 is not in game
L 04/30/2018 - 22:03:46: [SM] Blaming: autorespawn.smx
L 04/30/2018 - 22:03:46: [SM] Call stack trace:
L 04/30/2018 - 22:03:46: [SM] [0] GetClientTeam
L 04/30/2018 - 22:03:46: [SM] [1] Line 259, C:\Users\addons\sourcemod\scripting\autorespawn.sp::RespawnPlayer2
 

Вложения

  • autorespawn.sp
    11.4 КБ · Просмотры: 8

Allen

love society
Сообщения
352
Реакции
274
Прошу помочь с плагином. Возникает ошибка:
L 04/30/2018 - 22:03:46: [SM] Exception reported: Client 9 is not in game
L 04/30/2018 - 22:03:46: [SM] Blaming: autorespawn.smx
L 04/30/2018 - 22:03:46: [SM] Call stack trace:
L 04/30/2018 - 22:03:46: [SM] [0] GetClientTeam
L 04/30/2018 - 22:03:46: [SM] [1] Line 259, C:\Users\addons\sourcemod\scripting\autorespawn.sp::RespawnPlayer2
Попробуй.
 

Вложения

  • autorespawn.sp
    11.5 КБ · Просмотры: 7

FokS

Участник
Сообщения
422
Реакции
52
Всем доброго времени суток, помогите прикрутить morecolors к плагину afk_manager.smx , я пробовал, но цвета не ставятся в файле перевода, хотелось в файле перевода раскрасить тексты. Заранее Спасибо.
 

Вложения

  • afk_manager.sp
    69.8 КБ · Просмотры: 8

Jedi qLux

Участник
Сообщения
187
Реакции
42
Всем привет!
Может кто-нибудь cv_serverformat = CreateConVar( "sm_hop_serverformat" сделать так что бы там можно было это сообщение разделить на строки (Мне нужно 5 строк)?
 

Вложения

  • serverhop.sp
    9.4 КБ · Просмотры: 7

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@Grey83, так \n Сурсмодом в конварах прямо так и воспринимается, и в сообщении мы видим именно \n, а не переход на новую строку.
 

alexmy

Участник
Сообщения
284
Реакции
13
Всем привет. народ есть такой плагин или может кто напишет. Если игрок отключился от сервера и назад пытается подключиться чтоб не мог подключится кое какое время.
 

StormX

Участник
Сообщения
891
Реакции
302

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
@Kr1kuzya, ну как бы там текст копируется из конвара, так что может правильно бы и получилось
PHP:
GetConVarString( cv_serverformat, format, sizeof( format ) );
...
serverInfo[i] = format;
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@Grey83, движок экранизирует символ \ автоматически. Так что нет.
 

StormX

Участник
Сообщения
891
Реакции
302
@Kr1kuzya,
Добавьте сюда пожалуйста иммунитет для Админа с root правами. Заранее спасибо.

#include <sourcemod>
#pragma newdecls required
#pragma semicolon 1

public bool OnClientConnect(int iClient, char[] szRejectMsg, int iBufferLength) {
strcopy(szRejectMsg, iBufferLength, "Мы переехали на новый IP: 111.111.11.111:55555");
return false;
}
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@niko7d, убедительная просьба при публикации кода, помимо тега спойлера, использовать тег кода:
upload_2018-5-3_14-54-30.png

C++:
#include <sourcemod>
#pragma newdecls required
#pragma semicolon 1

public bool OnClientConnect(int iClient, char[] szRejectMsg, int iBufferLength) {
  char szAuthId[32];

  // For start, try lookup admin by IP.
  if (GetClientIP(iClient, szAuthId, sizeof(szAuthId)) && UTIL_CheckAdminAccess(AUTHMETHOD_IP, szAuthId, Admin_Root))
    return true;

  // Now by nickname.
  if (GetClientName(iClient, szAuthId, sizeof(szAuthId)) && UTIL_CheckAdminAccess(AUTHMETHOD_NAME, szAuthId, Admin_Root))
    return true;

  // By SteamID.
  if (GetClientAuthId(iClient, AuthId_Steam2, szAuthId, sizeof(szAuthId)) && UTIL_CheckAdminAccess(AUTHMETHOD_STEAM, szAuthId, Admin_Root))
    return true;

  // this is not admin.
  strcopy(szRejectMsg, iBufferLength, "Мы переехали на новый IP: 111.111.11.111:55555");
  return false;
}

bool UTIL_CheckAdminAccess(const char[] szAuthMethod, const char[] szData, AdminFlag flag) {
  static AdminId aid;
  aid = FindAdminByIdentity(szAuthMethod, szData);
  return (aid != INVALID_ADMIN_ID && UTIL_IsHaveFlag(aid, flag));
}

bool UTIL_IsHaveFlag(AdminId aid, AdminFlag flag) {
  return (
    GetAdminFlag(aid, flag, Access_Real) ||
    GetAdminFlag(aid, flag, Access_Effective)
  );
}
Но не уверен, что по Стиму находить будет. В этот момент он по идее не должен быть известен серверу, и уж тем более SourceMod.
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
@Kr1kuzya,
Добавьте сюда пожалуйста иммунитет для Админа с root правами. Заранее спасибо.

Пользовался таким вариантом
PHP:
#include <sourcemod>
#pragma newdecls required
#pragma semicolon 1

public void OnClientPostAdminCheck(int iC){
    if(!(GetUserFlagBits(iC) & ADMFLAG_ROOT))
        KickClient(iC, "Мы переехали на новый IP: 111.111.11.111:55555");
    return;
}
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@BreakSharp, проблема в том, что OnClientPostAdminCheck() может никогда и не вызваться, если сервер Steam занят.
Это редко случается, конечно, но это бывает.
 

StormX

Участник
Сообщения
891
Реакции
302
@niko7d, убедительная просьба при публикации кода, помимо тега спойлера, использовать тег кода:
Посмотреть вложение 30345

C++:
#include <sourcemod>
#pragma newdecls required
#pragma semicolon 1

public bool OnClientConnect(int iClient, char[] szRejectMsg, int iBufferLength) {
  char szAuthId[32];

  // For start, try lookup admin by IP.
  if (GetClientIP(iClient, szAuthId, sizeof(szAuthId)) && UTIL_CheckAdminAccess(AUTHMETHOD_IP, szAuthId, Admin_Root))
    return true;

  // Now by nickname.
  if (GetClientName(iClient, szAuthId, sizeof(szAuthId)) && UTIL_CheckAdminAccess(AUTHMETHOD_NAME, szAuthId, Admin_Root))
    return true;

  // By SteamID.
  if (GetClientAuthId(iClient, AuthId_Steam2, szAuthId, sizeof(szAuthId)) && UTIL_CheckAdminAccess(AUTHMETHOD_STEAM, szAuthId, Admin_Root))
    return true;

  // this is not admin.
  strcopy(szRejectMsg, iBufferLength, "Мы переехали на новый IP: 111.111.11.111:55555");
  return false;
}

bool UTIL_CheckAdminAccess(const char[] szAuthMethod, const char[] szData, AdminFlag flag) {
  static AdminId aid;
  aid = FindAdminByIdentity(szAuthMethod, szData);
  return (aid != INVALID_ADMIN_ID && UTIL_IsHaveFlag(aid, flag));
}

bool UTIL_IsHaveFlag(AdminId aid, AdminFlag flag) {
  return (
    GetAdminFlag(aid, flag, Access_Real) ||
    GetAdminFlag(aid, flag, Access_Effective)
  );
}
Но не уверен, что по Стиму находить будет. В этот момент он по идее не должен быть известен серверу, и уж тем более SourceMod.

То что надо).
Замечание буду иметь ввиду, спасибо).
 

Jedi qLux

Участник
Сообщения
187
Реакции
42
Может кто-нибудь переписать исходник плагина NoZoom, что бы когда он активировался все другие оружия (deagle, нож можно оставить xd) отключались, очень просят игроки ;)
 
Сверху Снизу