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

cmb

Участник
Сообщения
15
Реакции
2
Как привязать хитбоксы привязанной к игроку модели (динамический пропс) чтобы они принимали урон
 

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
Как привязать хитбоксы привязанной к игроку модели (динамический пропс) чтобы они принимали урон
Вроде можно вот так, если ничего не путаю
SetEntPropEnt(ent, Prop_Data, "m_hOwnerEntity", client);

А для чего тебе это ?
 

khood

Участник
Сообщения
214
Реакции
51
Мне нужно переписать плагин так, чтобы при входе игроков автоматически добавлялись боты. Я также хочу, чтобы боты не отображались в списке наблюдателей, но были видны только при просмотре сервера. Кроме того сколько ботов добавлять в зависимости от количества игроков, например, одного бота при наличии 4 игроков, двух ботов при 7 игроках и т.д. Имена ботов также должны выбираться случайным образом

PHP:
#pragma semicolon 1

#include <sdktools>

#define PL_VERSION "1.1.1"

static const String:FakeNames[][] = {"РандомЭэээ", "САНТЕХ НИК", "Катька", "ARI$TOKRAT", "Петруха", "Su4ka", "ext77", "Паша Техник", "quality", "Шторм", "ph34r", "1337sp34k", "HardPlayer", "StinG", "Immortal", "achmed", "benthas", "hmmmm", "LOLLOL", "HITM@N", "RUFA", "Metahander", "Meg", "Py6uH", "alyx", "Бутылка_Пива", "Эto_фuaско_брatan", "солдат", "Маршал", "CAT", "ПиздюК", "DoomThird"};

new IsNameUsed[MAXPLAYERS+1] = {-1, ...},
    iMaxBots,
    Float:fDelay;

public Plugin:myinfo =
{
    name        = "FakeClients",
    author        = "LouLoubizou(fixed by Grey83)",
    description    = "Put fake clients in server",
    version        = PL_VERSION,
    url            = "http://sourcemod.net/"
};

public OnPluginStart()
{
    CreateConVar("sm_fakeclients_version", PL_VERSION, "Version of FakeClients plugin", FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);

    new Handle:cvar;
    cvar = CreateConVar("sm_fakeclients_players","1","Number of players to simulate", FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY, true, _, true, 32.0);
    iMaxBots = GetConVarInt(cvar);
    HookConVarChange(cvar, OnChange_MaxBots);

    cvar = CreateConVar("sm_fakeclients_delay","0.1","Delay after map change before fake clients join(seconds)", FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY, true, 0.1, true, 10.0);
    fDelay = GetConVarFloat(cvar);
    HookConVarChange(cvar, OnChange_Delay);
}

public OnChange_MaxBots(Handle:cvar, const String:oldValue[], const String:newValue[])
{
    iMaxBots = StringToInt(newValue);
}

public OnChange_Delay(Handle:cvar, const String:oldValue[], const String:newValue[])
{
    fDelay = StringToFloat(newValue);
}

public OnMapStart()
{
    new numPlayers = GetClientCount(true); // Получаем количество игроков, включая ботов

    if (numPlayers == 0) {
        // Если на сервере нет игроков (только боты), добавляем одного бота
        CreateTimer(fDelay, OnTimedCreateFakeClient, 0);
    }
}

public OnClientPutInServer(client)
{
    if(IsFakeClient(client))
        return;

    // Определяем текущее количество игроков на сервере
    new numPlayers = 0;
    for (new i = 1; i <= MaxClients; i++) {
        if (IsClientInGame(i) && !IsClientSourceTV(i)) {
            numPlayers++;
        }
    }

    if (numPlayers == 1) {
        // Если на сервере только вы, добавляем одного бота
        CreateTimer(fDelay, OnTimedCreateFakeClient, 0);
    }
}


public OnClientDisconnect(client)
{
    CreateTimer(0.1, OnTimedCreateFakeClient, client);
}

public Action:OnTimedCreateFakeClient(Handle:timer, any:client){
    new clientcount = GetClientCount(true);
    if(clientcount == MaxClients || clientcount >= iMaxBots)
        return Plugin_Handled;

    new NumberOfFakeClients;
    for(new i = 1; i <= MaxClients; i++) if(IsClientConnected(i) && IsFakeClient(i) && !IsClientSourceTV(i)) NumberOfFakeClients++;
    if(NumberOfFakeClients >= iMaxBots)
        return Plugin_Handled;

    new RandomName;
    while(CheckName(RandomName)) RandomName = GetRandomInt(0, 31);
    IsNameUsed[CreateFakeClient(FakeNames[RandomName])] = RandomName;
    return Plugin_Handled;
}

bool:CheckName(num)
{
    for(new i = 1; i <= MaxClients; i++) if(IsNameUsed[i] == num) return true;
    return false;
}
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Хотите дальше) С такими запросами, придётся долго ждать. Ни "привет всем", ни "помогите пожалуйста переписать код". Ищите скриптера за деньги.
Вряд-ли кто-то поможет бесплатно, судя по запросу работы не мало
Сообщения автоматически склеены:

Мне нужно переписать плагин так, чтобы при входе игроков автоматически добавлялись боты. Я также хочу, чтобы боты не отображались в списке наблюдателей, но были видны только при просмотре сервера. Кроме того сколько ботов добавлять в зависимости от количества игроков, например, одного бота при наличии 4 игроков, двух ботов при 7 игроках и т.д. Имена ботов также должны выбираться случайным образом

PHP:
#pragma semicolon 1

#include <sdktools>

#define PL_VERSION "1.1.1"

static const String:FakeNames[][] = {"РандомЭэээ", "САНТЕХ НИК", "Катька", "ARI$TOKRAT", "Петруха", "Su4ka", "ext77", "Паша Техник", "quality", "Шторм", "ph34r", "1337sp34k", "HardPlayer", "StinG", "Immortal", "achmed", "benthas", "hmmmm", "LOLLOL", "HITM@N", "RUFA", "Metahander", "Meg", "Py6uH", "alyx", "Бутылка_Пива", "Эto_фuaско_брatan", "солдат", "Маршал", "CAT", "ПиздюК", "DoomThird"};

new IsNameUsed[MAXPLAYERS+1] = {-1, ...},
    iMaxBots,
    Float:fDelay;

public Plugin:myinfo =
{
    name        = "FakeClients",
    author        = "LouLoubizou(fixed by Grey83)",
    description    = "Put fake clients in server",
    version        = PL_VERSION,
    url            = "http://sourcemod.net/"
};

public OnPluginStart()
{
    CreateConVar("sm_fakeclients_version", PL_VERSION, "Version of FakeClients plugin", FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);

    new Handle:cvar;
    cvar = CreateConVar("sm_fakeclients_players","1","Number of players to simulate", FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY, true, _, true, 32.0);
    iMaxBots = GetConVarInt(cvar);
    HookConVarChange(cvar, OnChange_MaxBots);

    cvar = CreateConVar("sm_fakeclients_delay","0.1","Delay after map change before fake clients join(seconds)", FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY, true, 0.1, true, 10.0);
    fDelay = GetConVarFloat(cvar);
    HookConVarChange(cvar, OnChange_Delay);
}

public OnChange_MaxBots(Handle:cvar, const String:oldValue[], const String:newValue[])
{
    iMaxBots = StringToInt(newValue);
}

public OnChange_Delay(Handle:cvar, const String:oldValue[], const String:newValue[])
{
    fDelay = StringToFloat(newValue);
}

public OnMapStart()
{
    new numPlayers = GetClientCount(true); // Получаем количество игроков, включая ботов

    if (numPlayers == 0) {
        // Если на сервере нет игроков (только боты), добавляем одного бота
        CreateTimer(fDelay, OnTimedCreateFakeClient, 0);
    }
}

public OnClientPutInServer(client)
{
    if(IsFakeClient(client))
        return;

    // Определяем текущее количество игроков на сервере
    new numPlayers = 0;
    for (new i = 1; i <= MaxClients; i++) {
        if (IsClientInGame(i) && !IsClientSourceTV(i)) {
            numPlayers++;
        }
    }

    if (numPlayers == 1) {
        // Если на сервере только вы, добавляем одного бота
        CreateTimer(fDelay, OnTimedCreateFakeClient, 0);
    }
}


public OnClientDisconnect(client)
{
    CreateTimer(0.1, OnTimedCreateFakeClient, client);
}

public Action:OnTimedCreateFakeClient(Handle:timer, any:client){
    new clientcount = GetClientCount(true);
    if(clientcount == MaxClients || clientcount >= iMaxBots)
        return Plugin_Handled;

    new NumberOfFakeClients;
    for(new i = 1; i <= MaxClients; i++) if(IsClientConnected(i) && IsFakeClient(i) && !IsClientSourceTV(i)) NumberOfFakeClients++;
    if(NumberOfFakeClients >= iMaxBots)
        return Plugin_Handled;

    new RandomName;
    while(CheckName(RandomName)) RandomName = GetRandomInt(0, 31);
    IsNameUsed[CreateFakeClient(FakeNames[RandomName])] = RandomName;
    return Plugin_Handled;
}

bool:CheckName(num)
{
    for(new i = 1; i <= MaxClients; i++) if(IsNameUsed[i] == num) return true;
    return false;
}
Попробуй обратится в раздел "Требуется", там за деньги помогут сделать
 

khood

Участник
Сообщения
214
Реакции
51
Хотите дальше) С такими запросами, придётся долго ждать. Ни "привет всем", ни "помогите пожалуйста переписать код". Ищите скриптера за деньги.
Я понимаю, что в вашей жизни могли возникнуть трудности или неудачи, и каждый имеет право на свой выбор. Не нужно учить меня, как правильно поступать. Я написал свой запрос, и решение о том, будет ли на него ответ или нет, остается за другими людьми.
 

Max Rhine

Участник
Сообщения
172
Реакции
29
Я понимаю, что в вашей жизни могли возникнуть трудности или неудачи, и каждый имеет право на свой выбор. Не нужно учить меня, как правильно поступать. Я написал свой запрос, и решение о том, будет ли на него ответ или нет, остается за другими людьми.
Все-го хо-ро-ше-го)
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Всем доброе утро, подскажите пожалуйста, можно ли как-то упросить:
Код:
CPrintToChatAll("%t %t", iWinner == 2 ? "Prefix" : "Prefix_CT", iWinner == 2 ? "Cake_Lie_TT" : "Cake_Lie_CT");
?
 

Vit_ amin

Добрая душа
Сообщения
1,504
Реакции
660
Всем доброе утро, подскажите пожалуйста, можно ли как-то упросить:
Код:
CPrintToChatAll("%t %t", iWinner == 2 ? "Prefix" : "Prefix_CT", iWinner == 2 ? "Cake_Lie_TT" : "Cake_Lie_CT");
?

C-подобный:
   #define PREFIX         "Prefix"
   #define CAKE_LIE    "Cake_Lie_"
   bool bIsWinT = iWinner == CS_TEAM_T;
   PrintToChatAll(    "%t %t",
                   bIsWinT ? PREFIX             : PREFIX ... "_CT",
                   bIsWinT ? CAKE_LIE ... "TT" : CAKE_LIE ... "CT");
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
C-подобный:
   #define PREFIX         "Prefix"
   #define CAKE_LIE    "Cake_Lie_"
   bool bIsWinT = iWinner == CS_TEAM_T;
   PrintToChatAll(    "%t %t",
                   bIsWinT ? PREFIX             : PREFIX ... "_CT",
                   bIsWinT ? CAKE_LIE ... "TT" : CAKE_LIE ... "CT");
У меня много другого вывода текста с другими блоками, например "Top_Accuracy_CT" и "Top_Accuracy_TT" и все разные. Не меняется только префикс, он везде одинаковый, так что этот вариант мне не подходит
 

DarkerZ

Участник
Сообщения
395
Реакции
175
Всем доброе утро, подскажите пожалуйста, можно ли как-то упросить:
Код:
CPrintToChatAll("%t %t", iWinner == 2 ? "Prefix" : "Prefix_CT", iWinner == 2 ? "Cake_Lie_TT" : "Cake_Lie_CT");
?
C-подобный:
if(iWinner == 2) CPrintToChatAll("%t %t",  "Prefix", "Cake_Lie_TT");
else CPrintToChatAll("%t %t",  "Prefix_CT", "Cake_Lie_CT");
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
C-подобный:
new prefix[20], cakeLie[20];
format(prefix, sizeof(prefix), "%s", (iWinner == 2) ? "Prefix" : "Prefix_CT");
format(cakeLie, sizeof(cakeLie), "%s", (iWinner == 2) ? "Cake_Lie_TT" : "Cake_Lie_CT");
CPrintToChatAll("%t %t", prefix, cakeLie);
Это ведь тоже самое, только сложнее) Да и кода больше стало в несколько раз
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Этот вариант более лаконичен и выполняет то же самое действие, что и ваш исходный код.
Так то оно да, но слишком много лишних действий. У меня не только проверка на победителя, но еще и на то с какой команды игрок, + много другого текста и если для каждого блока по отдельности все это делать то вместо 20 строк кода, все увеличится до 60-80, а это уже не лаконично)
 

DarkerZ

Участник
Сообщения
395
Реакции
175
C-подобный:
public void PrintPhrase(char[] sPhrase, int iWinner)
{
    if(iWinner == 2) CPrintToChatAll("%t %t", "Prefix", sPhrase);
    else
    {
        Format(sPhrase, 20, "%s%s", sPhrase, "_CT");
        CPrintToChatAll("%t %t", "Prefix_CT", sPhrase);
    }
}
может ещё что-то типа такого
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
C-подобный:
public void PrintPhrase(char[] sPhrase, int iWinner)
{
    if(iWinner == 2) CPrintToChatAll("%t %t", "Prefix", sPhrase);
    else
    {
        Format(sPhrase, 20, "%s%s", sPhrase, "_CT");
        CPrintToChatAll("%t %t", "Prefix_CT", sPhrase);
    }
}
может ещё что-то типа такого
Опять таки сложно, у меня все в 2 проверки обошлось и в 1 строчку кода, а тут 9 строчек кода и 2 вывода текста вместо 1
 
Сверху Снизу