Написание и Редактирование плагина (Бесплатно)

AlexPa1

Светлый
Сообщения
281
Реакции
50
Здравствуйте, мне нужно портфолио так что сделаю ваш заказ бесплатно!

Игры:
CSSv34, CSS, CSGO, TF2

Напишу лёгкий плагин для сервера
+Редактирую и изменю имеющий плагин
-За большие плагины не возьмусь


P.s После оказание помощи желательно оставить отзыв.
 

September

В отпуске
Модератор
Сообщения
3,236
Реакции
1,057
Буду первым.

Респавн вновь зашедших игроков на сервер.
Но без абуза перезаходом на сервер

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

Игра ксго
 
Сообщения
100
Реакции
22
Bround - Можно добавить сюда раунды на Ak-47, Ssg08, Usp-s и подобные
 

Virus

Вечно молодой
Сообщения
134
Реакции
42
Менял карту и добавлял на нее такие вот ворота через которые нельзя пройти, возможно ли такое вот поле силовое поставить в плагин блок пост ? и когда игроков было бы 5 на 5 то эти ворота бы пропускали игроков, но не пропадали. И трудно ли это реализовать?
 

Вложения

Сообщения
694
Реакции
358
Показ ассистов на основе

Пожалуйста войдите или зарегистрируйтесь чтобы видеть скрытый текст.

примера.
CS:S v34
SM 1.9
Оффтоп
 
Сообщения
463
Реакции
72
Простой плагин для DM

Описание: террористы теряют бомбу на базе кт и не могу до нее добраться.
Выводится автоматическое голосование "Вернуть бомбу террористам" "Да или Нет".

SM 1.9
CSS V34
 
Сообщения
398
Реакции
126
@AlexPa1, работаешь с тф значит?
Прям вот разбираешься в ней? Если да, то могу сотрудничать с тобой (брать заказы), мало сейчас тех, кто с тф работает.
 

AlexPa1

Светлый
Сообщения
281
Реакции
50
Простой плагин для DM

Описание: террористы теряют бомбу на базе кт и не могу до нее добраться.
Выводится автоматическое голосование "Вернуть бомбу террористам" "Да или Нет".

SM 1.9
CSS V34
Код:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools_functions>

public void OnPluginStart()
{
    HookEvent("bomb_dropped", Event_OnBombDropped, EventHookMode_Post);
}
public Action Event_OnBombDropped(Handle event, const char[] name, bool dontBroadcast)
{
    DoVoteMenu(name);
    return Plugin_Handled;
}

public Handle_VoteMenu(Handle:menu, MenuAction:action, param1, param2)
{
    if (action == MenuAction_End)
    {
        // Вызывается после VoteEnd
        CloseHandle(menu);
    }

    else if (action == MenuAction_VoteEnd)
    {
        // 0=да, 1=нет
        if (param1 == 0)
        {
            new String:GiveC4[64];
            GetMenuItem(menu, param1, GiveC4, sizeof(GiveC4));
        }
    }
}
 
DoVoteMenu(const String:GiveC4[])
{
    if (IsVoteInProgress())
    {
        return;
    }

    new Handle:menu = CreateMenu(Handle_VoteMenu);
    SetMenuTitle(menu, "Отдать бомбу Т?", GiveC4);
    AddMenuItem(menu, GiveC4, "Да");
    AddMenuItem(menu, "no", "Нет");
    SetMenuExitButton(menu, false);
    VoteMenuToAll(menu, 20);
}

public GiveC4(Handle:event, const String:name[], bool:silent)
{
    new random_client = GiveC42();
    if (random_client > 0)
    {
        // случайный игрок выбран, что-то делаем
        new client = GetClientOfUserId(GetEventInt(event, "userid"));
        if (GetClientTeam(client) == 2)
        GivePlayerItem(client, "weapon_c4");
    }
}

GiveC42()
{
    new indexes[MaxClients+1], players = 0;
    for (new i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i)) indexes[players++] = i;
    }
    if (players > 0) return indexes[GetRandomInt(0, players-1)];
    return 0;
}
Сообщения автоматически склеены:

Менял карту и добавлял на нее такие вот ворота через которые нельзя пройти, возможно ли такое вот поле силовое поставить в плагин блок пост ? и когда игроков было бы 5 на 5 то эти ворота бы пропускали игроков, но не пропадали. И трудно ли это реализовать?
Можно сделать так, ставить ворота на карту и ставить в это же место невидимый блок и убирать его при достижении 10 игроков.
Можно ещё редактировать карту, так же поставить ворота и невидимый блок и открывать проход при достижении 10 игроков
 
Последнее редактирование:

Саша Шеин

Кому костылей?
Сообщения
1,572
Реакции
445
C++:
GiveC42()
{
    new indexes[MaxClients+1], players = 0;
    for (new i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i)) indexes[players++] = i;
    }
    if (players > 0) return indexes[GetRandomInt(0, players-1)];
    return 0;
}
C4 может получить только Т игрок. Если это проверить дальше, то в случае выпадения КТ, бомба так и не вернется.:blush:
Сообщения автоматически склеены:

C++:
new String:GiveC4[64];
GetMenuItem(menu, param1, GiveC4, sizeof(GiveC4));
Возможно я что-то упускаю, но зачем это? И где вообще вызывается функция GiveC4 ?:blink:
 

Grey83

похухоль
Сообщения
2,973
Реакции
1,650
AlexPa1, у тебя в событии никак не определяется местонахождение бомбы
И что за событие с каллбэком GiveC4?
У тебя код вообще нерабочий.
Что за хрень я только что смотрел? Сделайте мне развидеть это!

Если никто не поднимет брошенную бомбу в течение времени, установленном кваром sm_c4_return_vote, то будет создано голосование.
Если к этому времени раунд или карта завершится, то голосование не будет создано.
Если после окончания голосования бомба уже будет поднята или же раунд или карта будет завершёны, то ничего не произойдёт.
C++:
#pragma semicolon 1
#pragma newdecls required

#include <cstrike>
#include <sdktools_functions>

Handle hTimer;
bool bDropped;
int iTime;

public void OnPluginStart()
{
    ConVar cvar;
    (cvar = CreateConVar("sm_c4_return_vote", "15", "The time after which a vote will be created if a bomb is not raised from the ground", _, true)).AddChangeHook(CVarChanged);
    iTime = cvar.IntValue;

    HookEvent("bomb_dropped", Event_Bomb);
    HookEvent("bomb_pickup", Event_Bomb);
}

public void CVarChanged(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    iTime = cvar.IntValue;
}

public Action CS_OnTerminateRound(float& delay, CSRoundEndReason& reason)
{
    OnMapEnd();
}

public void OnMapEnd()
{
    bDropped = false;
    if(hTimer) delete hTimer;
}

public void Event_Bomb(Event event, const char[] name, bool dontBroadcast)
{
    bDropped = name[5] == 'd';
    if(bDropped) hTimer = CreateTimer((iTime + 0.0), Timer_Vote);
    else OnMapEnd();
}

public Action Timer_Vote(Handle timer)
{
    if(IsVoteInProgress()) return;    // голосование ещё идёт

    Menu menu = new Menu(Handle_VoteMenu);
    menu.SetTitle("Отдать бомбу Т?");
    menu.AddItem("yes", "Да");
    menu.AddItem("no", "Нет");
    menu.ExitButton = false;
    menu.DisplayVoteToAll(15);
    hTimer = null;
}

public int Handle_VoteMenu(Menu menu, MenuAction action, int param1, int param2)
{
    if(action == MenuAction_End) delete menu;
    else if(action == MenuAction_VoteEnd && !bDropped && !param1)
    {
        int clients[MAXPLAYERS+1], num;
        for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && GetClientTeam(i) == 2 && IsPlayerAlive(i))
            clients[num++] = i;
        if(num) GivePlayerItem(GetRandomInt(0, num-1), "weapon_c4");
    }
}
 

Вложения

Последнее редактирование:
Сообщения
463
Реакции
72
AlexPa1, у тебя в событии никак не определяется местонахождение бомбы
И что за событие с каллбэком GiveC4?
У тебя код вообще нерабочий.
Что за хрень я только что смотрел? Сделайте мне развидеть это!

Если никто не поднимет брошенную бомбу в течение времени, установленном кваром sm_c4_return_vote, то будет создано голосование.
Если к этому времени раунд или карта завершится, то голосование не будет создано.
Если после окончания голосования бомба уже будет поднята или же раунд или карта будет завершёны, то ничего не произойдёт.
C++:
#pragma semicolon 1
#pragma newdecls required

#include <cstrike>
#include <sdktools_functions>

Handle hTimer;
bool bDropped;
int iTime;

public void OnPluginStart()
{
    ConVar cvar;
    (cvar = CreateConVar("sm_c4_return_vote", "15", "The time after which a vote will be created if a bomb is not raised from the ground", _, true)).AddChangeHook(CVarChanged);
    iTime = cvar.IntValue;

    HookEvent("bomb_dropped", Event_Bomb);
    HookEvent("bomb_pickup", Event_Bomb);
}

public void CVarChanged(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    iTime = cvar.IntValue;
}

public Action CS_OnTerminateRound(float& delay, CSRoundEndReason& reason)
{
    OnMapEnd();
}

public void OnMapEnd()
{
    bDropped = false;
    if(hTimer) delete hTimer;
}

public void Event_Bomb(Event event, const char[] name, bool dontBroadcast)
{
    bDropped = name[5] == 'd';
    if(bDropped) hTimer = CreateTimer((iTime + 0.0), Timer_Vote);
    else OnMapEnd();
}

public Action Timer_Vote(Handle timer)
{
    if(IsVoteInProgress()) return;    // голосование ещё идёт

    Menu menu = new Menu(Handle_VoteMenu);
    menu.SetTitle("Отдать бомбу Т?");
    menu.AddItem("yes", "Да");
    menu.AddItem("no", "Нет");
    menu.ExitButton = false;
    menu.DisplayVoteToAll(15);
    hTimer = null;
}

public int Handle_VoteMenu(Menu menu, MenuAction action, int param1, int param2)
{
    if(action == MenuAction_End) delete menu;
    else if(action == MenuAction_VoteEnd && !bDropped && !param1)
    {
        int clients[MAXPLAYERS+1], num;
        for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && GetClientTeam(i) == 2 && IsPlayerAlive(i))
            clients[num++] = i;
        if(num) GivePlayerItem(GetRandomInt(0, num-1), "weapon_c4");
    }
}
А по итогу плагин не у кого не работает адекватно.
Что автор топика писал, что здесь без разницы.)))
Плагин попросту не учитывает голоса. Стоит какая мифическая цифра в 13 и все.
Не важно, что положительных голос больше "все равно бомбу Т не отдам" т.к. надо каких то там 13 голосов)).
Играю с ботами, бомба оказалось на базе КТ, через какое то время выводится голосование за бомбу - естественно нажимаю Да, а по итогу "хрен вам, а не бомбу" надо там чего то 13 и все)))))))).
Извиняюсь за сарказм).
 

Grey83

похухоль
Сообщения
2,973
Реакции
1,650
Плагин попросту не учитывает голоса.
Обновил код:
1) теперь голосование будет отсылаться только живым спецам, если они не боты;
2) добавлен квар sm_c4_return_votes, который устанавливает какой процент из проголосовавших (от 5 до 100, дефолт - 60) должен быть за, чтобы голосование считалось успешным;
* квар sm_c4_return_vote переименован в sm_c4_return_time
3) в конце голосования будет извещение о его результатах
4) если квар sm_c4_return_time установлен в 0, то голосование не будет создаваться (т.е. плагин выключен)
C++:
#pragma semicolon 1
#pragma newdecls required

#include <cstrike>
#include <sdktools_functions>

Handle hTimer;
bool bDropped;
int iTime,
    iLimit;

public void OnPluginStart()
{
    ConVar cvar;
    (cvar = CreateConVar("sm_c4_return_time", "15", "The time after which a vote will be created if a bomb is not raised from the ground. 0 - plugin disabled", _, true)).AddChangeHook(CVarChanged_Time);
    iTime = cvar.IntValue;

    (cvar = CreateConVar("sm_c4_return_votes", "60", "Percent required for successful C4 return vote.", _, true, 5.0, true, 100.0)).AddChangeHook(CVarChanged_Votes);
    iLimit = cvar.IntValue;

    HookEvent("bomb_dropped", Event_Bomb);
    HookEvent("bomb_pickup", Event_Bomb);

    LoadTranslations("basevotes.phrases");
}

public void CVarChanged_Time(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    iTime = cvar.IntValue;
}

public void CVarChanged_Votes(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    iLimit = cvar.IntValue;
}

public Action CS_OnTerminateRound(float& delay, CSRoundEndReason& reason)
{
    OnMapEnd();
}

public void OnMapEnd()
{
    bDropped = false;
    if(hTimer) delete hTimer;
}

public void Event_Bomb(Event event, const char[] name, bool dontBroadcast)
{
    bDropped = iTime && name[5] == 'd';
    if(bDropped) hTimer = CreateTimer((iTime + 0.0), Timer_Vote);
    else OnMapEnd();
}

public Action Timer_Vote(Handle timer)
{
    if(IsVoteInProgress()) return;

    Menu menu = new Menu(Handle_VoteMenu);
    menu.SetTitle("Отдать бомбу Т?");
    menu.AddItem("1", "Да");
    menu.AddItem("0", "Нет");
    menu.ExitButton = false;

    int clients[MAXPLAYERS+1], num;
    for(int i = 1; i <= MaxClients; i++) if(IsClientValid(i, 3)) clients[num++] = i;
    menu.DisplayVote(clients, num, 15);
    hTimer = null;
}

public int Handle_VoteMenu(Menu menu, MenuAction action, int param1, int param2)
{
    if(action == MenuAction_End) delete menu;
    else if(action == MenuAction_VoteEnd && !bDropped && !param1)
    {
        char item[4];
        int num, i, votes;
        GetMenuVoteInfo(param2, i, votes);
        menu.GetItem(param1, item, sizeof(item));
        if(item[0] == '0' && param1 == 1) i = votes - i;
        num = 100 * i / votes;
        if((item[0] == '1' && num < iLimit && param1 == 0) || (item[0] == '0' && param1 == 1))
            PrintToChatAll("[SM] %t", "Vote Failed", iLimit, num, votes);
        else
        {
            PrintToChatAll("[SM] %t", "Vote Successful", num, votes);
            int clients[MAXPLAYERS+1];
            for(i = 1, num = 0; i <= MaxClients; i++) if(IsClientValid(i, 2, true))
                clients[num++] = i;
            if(num) GivePlayerItem(GetRandomInt(0, num-1), "weapon_c4");
        }
    }
}

stock bool IsClientValid(int client, int team, bool bots = false)
{
    return IsClientInGame(client) && GetClientTeam(client) == team && IsPlayerAlive(client) && (bots || !IsFakeClient(client));
}
 

Вложения

Последнее редактирование:
Сообщения
221
Реакции
10
Вставлю тоже свои 5 копеек Xd
Игра CS:GO , плагин, который будет проверь инвентарь игрока (хилка, тег граната, основное оружие, второе оружие, оружие ближнего боя и т.д.) если при старте что-то из этого пропадает, то он выдает заново
 
Сверху