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

ivanms1337

Участник
Сообщения
69
Реакции
2
Ох уж эта css(лично для меня), ну не играл я в нее, не играл.. Тьфу ты, точнее не держал сервера там.

Попробуйте так...
PHP:
public OnPluginStart() HookEvent("player_death", PlayerDeath);

public Action:PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
   new client = GetClientOfUserId(GetEventInt(event, "userid"));
 
   if(GetClientFrags(client) < 0) SetEntProp(client, Prop_Data, "m_iFrags", 0);
}
Все равно
 

DarklSide

Участник
Сообщения
931
Реакции
468
PHP:
public OnPluginStart()HookEvent("player_death", PlayerDeath);
public Action:PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    if (client > 0)CreateTimer(0.1, TimerFrags, GetClientSerial(client), TIMER_FLAG_NO_MAPCHANGE);
}
public Action:TimerFrags(Handle:timer, any:serial)
{
    new client = GetClientFromSerial(serial);
    if (IsClientInGame(client) && GetClientFrags(client) < 0)SetEntProp(client, Prop_Data, "m_iFrags", 0);
    return Plugin_Stop;
}
 

ivanms1337

Участник
Сообщения
69
Реакции
2
PHP:
public OnPluginStart()HookEvent("player_death", PlayerDeath);
public Action:PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    if (client > 0)CreateTimer(0.1, TimerFrags, GetClientSerial(client), TIMER_FLAG_NO_MAPCHANGE);
}
public Action:TimerFrags(Handle:timer, any:serial)
{
    new client = GetClientFromSerial(serial);
    if (IsClientInGame(client) && GetClientFrags(client) < 0)SetEntProp(client, Prop_Data, "m_iFrags", 0);
    return Plugin_Stop;
}
Спасибо все замечательно работает
 

ivanms1337

Участник
Сообщения
69
Реакции
2
Можете добавить в плагин что бы когда кикало, писал сервер что кикнут игрок?

PHP:
#pragma semicolon 1
#include <sourcemod>

public OnPluginStart()
{
    HookEvent("player_changename", player_changename);
}

public player_changename(Handle:event, const String:name[], bool:dontBroadcast)
{
    KickClient(GetClientOfUserId(GetEventInt(event, "userid")), "Запрещенно менять ник на сервере");
}
 

Kruzya

Участник
Сообщения
12,974
Реакции
10,938
PHP:
#pragma semicolon 1
#include <sourcemod>

public OnPluginStart()
{
    HookEvent("player_changename", player_changename);
}

public player_changename(Handle:event, const String:name[], bool:dontBroadcast) {
    new iClient = GetClientOfUserId(GetEventInt(event, "userid"));

    PrintToChatAll("[SM] Игрок %N кикнут за изменение имени", iClient);
    KickClient(iClient, "Запрещено менять ник на сервере");
}
Оффтоп
 

edik06041

Участник
Сообщения
2
Реакции
1
Помогите установил MYJB сборку, в консоле пишет что все плагины ERORS или Failed
 

ivanms1337

Участник
Сообщения
69
Реакции
2
PHP:
#pragma semicolon 1
#include <sourcemod>

public OnPluginStart()
{
    HookEvent("player_changename", player_changename);
}

public player_changename(Handle:event, const String:name[], bool:dontBroadcast) {
    new iClient = GetClientOfUserId(GetEventInt(event, "userid"));

    PrintToChatAll("[SM] Игрок %N кикнут за изменение имени", iClient);
    KickClient(iClient, "Запрещено менять ник на сервере");
}
Оффтоп
В этом коде игрок успевает сменить ник, после смены только кикает, а надо что бы его кикнуло и он не успел сменить ник
 

Kruzya

Участник
Сообщения
12,974
Реакции
10,938
@ivanms1337, А по другому и никак. Смиритесь.
И вообще неясно, зачем Вам такое.
 

Someone

Участник
Сообщения
1,933
Реакции
1,653

Аналогично с другими типами голосований (basevotes/votekick.sp и другие).

PHP:
public Action Command_Vote(int client, int args)
{
    if (args < 1)
    {
        ReplyToCommand(client, "[SM] Usage: sm_vote <question> [Answer1] [Answer2] ... [Answer5]");
        return Plugin_Handled; 
    }
  
    if (IsVoteInProgress())
    {
        ReplyToCommand(client, "[SM] %t", "Vote in Progress");
        return Plugin_Handled;
    }
      
    if (!TestVoteDelay(client))
    {
        return Plugin_Handled;
    }
  
    char text[256];
    GetCmdArgString(text, sizeof(text));

    char answers[5][64];
    int answerCount; 
    int len = BreakString(text, g_voteArg, sizeof(g_voteArg));
    int pos = len;
  
    while (args > 1 && pos != -1 && answerCount < 5)
    { 
        pos = BreakString(text[len], answers[answerCount], sizeof(answers[]));
        answerCount++;
      
        if (pos != -1)
        {
            len += pos;
        } 
    }

    LogAction(client, -1, "\"%L\" initiated a generic vote.", client);
    ShowActivity2(client, "[SM] ", "%t", "Initiate Vote", g_voteArg);
  
    g_voteType = question;
  
    g_hVoteMenu = new Menu(Handler_VoteCallback, MENU_ACTIONS_ALL);
    g_hVoteMenu.SetTitle("%s?", g_voteArg);
    
    g_hVoteMenu.AddItem("", "Свой текст", ITEMDRAW_DISABLED);
    g_hVoteMenu.AddItem("", "Свой текст 2", ITEMDRAW_DISABLED);
    
    FormatEx(text, sizeof(text), "%t", "My_Text_3");
    g_hVoteMenu.AddItem("", text, ITEMDRAW_DISABLED);
  
    if (answerCount < 2)
    {
        g_hVoteMenu.AddItem(VOTE_YES, "Yes");
        g_hVoteMenu.AddItem(VOTE_NO, "No");
    }
    else
    {
        for (int i = 0; i < answerCount; i++)
        {
            g_hVoteMenu.AddItem(answers[i], answers[i]);
        } 
    }
  
    g_hVoteMenu.ExitButton = false;
    g_hVoteMenu.DisplayVoteToAll(20);     
  
    return Plugin_Handled; 
}
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
ничего не изменилось, создал голосование за карту, 5 карт и все, текста нету
--- Добавлено позже ---
хотелсь бы как в этом плагине MapChooser Extended 1.10.2 (Updated 2014-02-05) - AlliedModders
--- Добавлено позже ---
текст такой
1. Не менять
2. Выбери, какая карта будет следующей...
3. ...и не клацай кнопки,не подумав ;-)
4 карта
5. карта
6. карта
7. карта
8. карта
Я там только для sm_vote сделал.

Аналогично с другими типами голосований (basevotes/votekick.sp и другие).

Просто скопируй, то что я написал и в ставь в другие голосования.
 
Последнее редактирование:

ivanms1337

Участник
Сообщения
69
Реакции
2
@ivanms1337, А по другому и никак. Смиритесь.
И вообще неясно, зачем Вам такое.
Можете сюда еще добавить ?

PHP:
#include <sourcemod>

#define PLUGIN_VERSION "1.1.5"

new bool:g_bKickedByPlugin[MAXPLAYERS+1];

new Handle:g_kvDB = INVALID_HANDLE;

new Handle:cvar_ar_time = INVALID_HANDLE;
new Handle:cvar_ar_admin_immunity = INVALID_HANDLE;
new Handle:cvar_ar_disconnect_by_user_only = INVALID_HANDLE;
new Handle:cvar_lan = INVALID_HANDLE;

new bool:isLAN = false;
new ar_time = 30;
new ar_disconnect_by_user_only = true;
new ar_admin_immunity = false;


public OnPluginStart()
{
    g_kvDB = CreateKeyValues("AntiReconnect");
    
    CreateConVar("sm_anti_reconnect_version", PLUGIN_VERSION, "Версия плагина", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
    cvar_ar_time = CreateConVar("sm_anti_reconnect_time", "10", "Время в секундах, после которого игрок снова может зайти на сервер.", FCVAR_PLUGIN, true, 0.0);
    cvar_ar_disconnect_by_user_only = CreateConVar("sm_anti_reconnect_disconnect_by_user_only", "1", "\n0: Заблокировать все реконекты, \n1: Заблокировать, если игрок вышел самостоятельно.", FCVAR_PLUGIN, true, 0.0, true, 1.0);
    cvar_ar_admin_immunity = CreateConVar("sm_anti_reconnect_admin_immunity", "1", "Включить/выключить иммунитет.", FCVAR_PLUGIN, true, 0.0, true, 1.0);
    cvar_lan = FindConVar("sv_lan");
    
    HookConVarChange(cvar_ar_time, OnCVarChange);
    HookConVarChange(cvar_ar_disconnect_by_user_only, OnCVarChange);
    HookConVarChange(cvar_ar_admin_immunity, OnCVarChange);
    HookConVarChange(cvar_lan, OnCVarChange);
    
    HookEvent("player_disconnect", Event_PlayerDisconnect, EventHookMode_Post);
    
    AutoExecConfig(true, "AntiReconnect");
    LoadTranslations("AntiReconnect.phrases");
}

public Action:Event_PlayerDisconnect(Handle:event, const String:name[], bool:dontBroadcast)
{
    decl String:reason[128];
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    
    if (g_bKickedByPlugin[client] || !client)
        return;
    
    GetEventString(event, "reason", reason, 128);

    if (StrEqual(reason, "Disconnect by user.") || !ar_disconnect_by_user_only)
    {
        if (isLAN || ar_time == 0 || IsFakeClient(client))
            return;
        
        if (GetUserFlagBits(client) && ar_admin_immunity)
            return;
        
        decl String:steamId[30];
        GetClientAuthString(client, steamId, sizeof(steamId));
        
        KvSetNum(g_kvDB, steamId, GetTime());
    }
}

public OnClientPostAdminCheck(client)
{
    g_bKickedByPlugin[client] = false;
    
    if (isLAN || ar_time == 0 || IsFakeClient(client) || !IsClientConnected(client))
        return;
    
    decl String:steamId[30];   
    GetClientAuthString(client, steamId, sizeof(steamId));   
    
    new disconnect_time = KvGetNum(g_kvDB, steamId, -1);
    
    if (disconnect_time == -1)
        return;
    
    new wait_time = disconnect_time + ar_time - GetTime();
    
    if (wait_time <= 0)
    {
        KvDeleteKey(g_kvDB, steamId);
    }
    else
    {
        g_bKickedByPlugin[client] = true;
        KickClient(client, "%t", "You are not allowed to reconnect for X seconds", wait_time);
        LogAction(-1, client,"Kicked \"%L\". Player is not allowed to reconnect for %d seconds.", client, wait_time);
    }
}

public OnCVarChange(Handle:convar_hndl, const String:oldValue[], const String:newValue[])
{
    GetCVars();
}

public OnConfigsExecuted()
{
    GetCVars();
}

public OnMapStart()
{
    CloseHandle(g_kvDB);
    g_kvDB = CreateKeyValues("AntiReconnect");
}

public GetCVars()
{
    isLAN = GetConVarBool(cvar_lan);
    ar_time = GetConVarInt(cvar_ar_time);
    ar_disconnect_by_user_only = GetConVarBool(cvar_ar_disconnect_by_user_only);
    ar_admin_immunity = GetConVarBool(cvar_ar_admin_immunity);
}
 

kleuser

Участник
Сообщения
1,838
Реакции
733
Кто может сделать простой плагин?
Нужно когда игрок не двигается (афк в начале раунда) его нельзя было убить, и при этому моделька окрашивалась в любой указанный цвет. Что-то типо как в плагине KnifeDozor.
 

wayLANder

Где AlmazON?
Сообщения
1,743
Реакции
577
@ivanms1337, не получится никаким способом сделать кик игрока до того, как он будет определён плагином как запрещённый.
Смотри пример:
У меня есть мой обычный ник
Я меняю его на тот, который у тебя запрещён
Плагин видит, что ник запрещён (тоесть ник обрабатывается ТОЛЬКО после того, как он был сменен) и кикает игрока.
Даже, если и сделать кучу всяких наворотов, по итогу все равно в причине кика будет указан запрещенный ник (игрок (тут ник игрока с запрещенными словами) был кикнут).
Плагин не сможет кикнуть игрока до того, как его ник, собственно, поменяется.
 

MaDaRa

Участник
Сообщения
49
Реакции
2
Кто может сделать простой плагин?
Нужно когда игрок не двигается (афк в начале раунда) его нельзя было убить, и при этому моделька окрашивалась в любой указанный цвет. Что-то типо как в плагине KnifeDozor.
есть плагин который дает гм в начале раунда на 5 сек...
--- Добавлено позже ---
Плагин не сможет кикнуть игрока до того, как его ник, собственно, поменяется.
поставь плагин запрещения смены ника на сервере и плагин на запрещенные ники поставь захочет сменить кикнет с сервера захочет зайти за запрещёным ником тупо не сможет зайти его кикнет возможно и забанит. ну а машине всегда надо проверять, такой тебе пример будет ник обычный не заперещёный и у тебя такой плагин который не проверяет а сразу банит вот и будет банить всех подряд, тоже самое у меня в сампе плагин был бан по железу написал без серийника он забанил кого то другого
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,974
Реакции
10,938

Someone

Участник
Сообщения
1,933
Реакции
1,653
текст такой
Выбери, какая карта будет следующей...
...и не клацай кнопки,не подумав ;-)
4

ну так, это же и есть по идеии, в админке/управление голосованием/смена карты, и ничего не изменилось
 

Вложения

  • basevotes.rar
    10.7 КБ · Просмотры: 24

Grey83

не пишу плагины с весны 2022
Сообщения
8,805
Реакции
5,254
Надо как-то "отловить" смену ника до того, как это произойдёт.
разве HookEvent("player_changename", Event_PlayerChangename, EventHookMode_Pre); уже не работает?
PHP:
public void OnPluginStart()
{
...
    HookEvent("player_changename", Event_PlayerChangename, EventHookMode_Pre);
...
}

public Action Event_PlayerChangename(Event event, const char[] name, bool dontBroadcast)

{
    char sName[65];
    int client = GetClientOfUserId(GetEventInt(event, "userid"));
    if(IsFakeClient(client)) return Plugin_Continue;

    GetEventString(event, "newname", sName, sizeof(sName));
    SetNewName(client, sName);
    return Plugin_Changed; // avoid printing the change to the chat
}

void SetNewName(int client, char[] sName)
{...}
 

serega36

Участник
Сообщения
127
Реакции
5
кто сможет переделать Admin Join Sound ! что бы не по флагу а по стиму ставить музыку! не бесплатно! пишите в личку!
 
Сверху Снизу