Иконка ресурса

No Deagle on AWP maps 1.1

khood

Участник
Сообщения
214
Реакции
51
  • Автор ресурса
  • #1

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
К сожалению у меня не работает, плагин запустился, ошибок нет, но дигл как был так и остался. И разве не лучше будет в начале раунда просто удалять дигл? И я не заметил в коде проверку на карту, в названии плагина указано что работает на АВП картах, а на деле проверки на карту нет
Пример кода:
Block Deagle:
#include <sdktools_functions>

#pragma newdecls required
#pragma semicolon 1

public Plugin myinfo =
{
    name     = "Deagle Block",
    author     = "Ало, Ва-Вадик?",
    version = "1.0",
    url     = "https://vk.com/kopojlebckuu_7pelllhuk"
};

public void OnPluginStart() { HookEvent("player_spawn", Event_PS); }

public Action Event_PS(Event hEvent, const char[] sName, bool bDontBroadcast)
{
    char sMap[64];
    GetCurrentMap(sMap, sizeof(sMap));
 
    if (StrContains(sMap, "awp_") == 0)
    {
        int iClient = GetClientOfUserId(hEvent.GetInt("userid")),
        iDeagle = GetPlayerWeaponSlot(iClient, 1);
   
        if (iDeagle > -1) RemovePlayerItem(iClient, iDeagle);
    }
}
 
Последнее редактирование:

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Посмотреть вложение 116096

  1. Плагин очень простой, его логика не зависит от карты. Он просто дает оружие игрокам в начале раунда.
  2. Нет никаких побочных эффектов от запуска на других картах. Если это случится, плагин просто будет давать оружие на любых картах.
  3. Это упростит код и сэкономит ресурсы сервера, так как не нужно будет каждый раз проверять карту.
Всегда забываю на требования смотреть)
1) По идее суть плагина в том чтоб блокировать дигл на картах AWP, тогда почему бы не упростить жизнь серверу просто удаляя дигл если он есть у игрока, а не выдавать каждый раз AWP и нож
2) Проверку на текущую карту можно добавить после старта карты или же после старта плагина (проверяться тогда будет 1 раз)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Посмотреть вложение 116096

  1. Плагин очень простой, его логика не зависит от карты. Он просто дает оружие игрокам в начале раунда.
  2. Нет никаких побочных эффектов от запуска на других картах. Если это случится, плагин просто будет давать оружие на любых картах.
  3. Это упростит код и сэкономит ресурсы сервера, так как не нужно будет каждый раз проверять карту.
1) если снова не забуду, то приду с работы и таки гляну код
2) см. п.1
3) достаточно использовать глобальную булеву переменную и задавать ей значение при старте карты
или создавать хук спавна игрока на картах awp_*, а на прочих его выключать
ну и при спавне awp на таких картах удалять её в следующем же тике

я, собственно, когда-то давно такое писал, емнип
может даже несколько разных версий, но найти будет тяжело (слишком много сообщений у меня тут, а исходник я себе на винт не сохранял, скорей всего)
Сообщения автоматически склеены:

Вот мой вариант.

Плагин не запустится на серверах, если это не CS:S или CS:GO.
Включается только на картах awp_* (даже с картами из Мастерской должно работать).
Блочится всё оружие, кроме awp и ножа.
По окончанию фризтайма всё запрещённое оружие отбирается у игроков и удаляется со всей карты.

Работоспособность не проверял.
 

Вложения

  • only_awp_allowed.sp
    2.3 КБ · Просмотры: 39
Последнее редактирование:

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Немного получше код


C++:
#include <sdktools_functions>

public Plugin myinfo = { author = "[ Khood ] [ DISCORD: serafimhl ]", version = "1.1", };

static char mapName[32];

public void OnPluginStart() { HookEvent("player_spawn", Event_Player_removedeagle, EventHookMode_PostNoCopy); }

public void OnMapStart() { GetCurrentMap(mapName, sizeof(mapName)); }

public Action Event_Player_removedeagle(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));

    if (StrContains(mapName, "awp_", false) == 0) RemoveDeagle(client);

/*
    //Лишния проверка, мы и так уверены что игрок с правильный айди и в игре
    if (client > 0 && client <= MaxClients && IsClientInGame(client))
    {
        static char mapName[64];
        GetCurrentMap(mapName, sizeof(mapName)); //Не зачем получать имя карты каждый спавн игрока, лучше один раз при старте карты
        if (StrContains(mapName, "awp_", false) == 0)
        {
            RemoveDeagle(client);
        }
    }
*/
    return Plugin_Continue;
}

void RemoveDeagle(int client)
{
    int weapon = GetPlayerWeaponSlot(client, 1);

    if (weapon != INVALID_ENT_REFERENCE)
    {
        //static char className[64]; //Старайтесь меньше выдeлять памяти если знаете что больше не нужно,
        // в данном cлучие нету имя оружий с таким длиным названием на 64 байта
        static char className[20];
        GetEdictClassname(weapon, className, sizeof(className));

        //if (StrEqual(className, "weapon_deagle", false)) //StrEqual - работает медлее чем strcmp, где то на форуме тестили это
        if (strcmp(className, "weapon_deagle") == 0)
        {
            RemovePlayerItem(client, weapon);
            RemoveEdict(weapon);
        }
    }
}
 

DarkerZ

Участник
Сообщения
395
Реакции
175
как вариант можно через Stripper:
C-подобный:
;Remove weapon from map
filter:
{
    ;"classname" "weapon_*"
    "classname" "weapon_deagle"
}
;Remove buyzones
filter:
{
    "classname" "func_buyzone"
}
;Remove game_player_equip
filter:
{
    "classname" "game_player_equip"
}
;AutoGive awp+knife
add:
{
    "classname" "game_player_equip"
    "spawnflags" "0"
    "weapon_knife" "1"
    "weapon_awp" "1"
    ;"weapon_hegrenade" "1"
    ;"item_assaultsuit" "1"
}
Сообщения автоматически склеены:

Немного получше код


C++:
#include <sdktools_functions>

public Plugin myinfo = { author = "[ Khood ] [ DISCORD: serafimhl ]", version = "1.1", };

static char mapName[32];

public void OnPluginStart() { HookEvent("player_spawn", Event_Player_removedeagle, EventHookMode_PostNoCopy); }

public void OnMapStart() { GetCurrentMap(mapName, sizeof(mapName)); }

public Action Event_Player_removedeagle(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));

    if (StrContains(mapName, "awp_", false) == 0) RemoveDeagle(client);

/*
    //Лишния проверка, мы и так уверены что игрок с правильный айди и в игре
    if (client > 0 && client <= MaxClients && IsClientInGame(client))
    {
        static char mapName[64];
        GetCurrentMap(mapName, sizeof(mapName)); //Не зачем получать имя карты каждый спавн игрока, лучше один раз при старте карты
        if (StrContains(mapName, "awp_", false) == 0)
        {
            RemoveDeagle(client);
        }
    }
*/
    return Plugin_Continue;
}

void RemoveDeagle(int client)
{
    int weapon = GetPlayerWeaponSlot(client, 1);

    if (weapon != INVALID_ENT_REFERENCE)
    {
        //static char className[64]; //Старайтесь меньше выдeлять памяти если знаете что больше не нужно,
        // в данном cлучие нету имя оружий с таким длиным названием на 64 байта
        static char className[20];
        GetEdictClassname(weapon, className, sizeof(className));

        //if (StrEqual(className, "weapon_deagle", false)) //StrEqual - работает медлее чем strcmp, где то на форуме тестили это
        if (strcmp(className, "weapon_deagle") == 0)
        {
            RemovePlayerItem(client, weapon);
            RemoveEdict(weapon);
        }
    }
}
или даже как-то так
C-подобный:
#include <sdktools_functions>

public Plugin myinfo = { author = "[ Khood ] [ DISCORD: serafimhl ]", version = "1.1", };

bool g_bAWP;

public void OnPluginStart() { HookEvent("player_spawn", Event_Player_removedeagle, EventHookMode_PostNoCopy); }

public void OnMapStart()
{
    static char mapName[5];
    GetCurrentMap(mapName, sizeof(mapName));
    if (StrContains(mapName, "awp_", false) == 0) g_bAWP = true;
    else g_bAWP = false;
}

public Action Event_Player_removedeagle(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));

    if (g_bAWP) RemoveDeagle(client);

/*
    //Лишния проверка, мы и так уверены что игрок с правильный айди и в игре
    if (client > 0 && client <= MaxClients && IsClientInGame(client))
    {
        static char mapName[64];
        GetCurrentMap(mapName, sizeof(mapName)); //Не зачем получать имя карты каждый спавн игрока, лучше один раз при старте карты
        if (StrContains(mapName, "awp_", false) == 0)
        {
            RemoveDeagle(client);
        }
    }
*/
    return Plugin_Continue;
}

void RemoveDeagle(int client)
{
    int weapon = GetPlayerWeaponSlot(client, 1);

    if (weapon != INVALID_ENT_REFERENCE)
    {
        //static char className[64]; //Старайтесь меньше выдeлять памяти если знаете что больше не нужно,
        // в данном cлучие нету имя оружий с таким длиным названием на 64 байта
        static char className[20];
        GetEdictClassname(weapon, className, sizeof(className));

        //if (StrEqual(className, "weapon_deagle", false)) //StrEqual - работает медлее чем strcmp, где то на форуме тестили это
        if (strcmp(className, "weapon_deagle") == 0)
        {
            RemovePlayerItem(client, weapon);
            RemoveEdict(weapon);
        }
    }
}
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@DarkerZ, а как же ты узнаешь ЮзерАйди, если у тебя PostNoCopy? =)

И да, после спавна не помешает хотя бы проверить в какой команде находится игрок.


P.S. Да StrEqual() работает медленнее, чем strcmp(). Потому что это обёртка вокруг этого самого strcmp(). Достаточно инклюд для работы с текстом глянуть.
Ну и я был одним из тех кто скорость работы тестил (и где-то в теме должен быть исходник для самостоятельного сравнения скорости работы).
 

DarkerZ

Участник
Сообщения
395
Реакции
175
@DarkerZ, а как же ты узнаешь ЮзерАйди, если у тебя PostNoCopy? =)

И да, после спавна не помешает хотя бы проверить в какой команде находится игрок.


P.S. Да StrEqual() работает медленнее, чем strcmp(). Потому что это обёртка вокруг этого самого strcmp(). Достаточно инклюд для работы с текстом глянуть.
Ну и я был одним из тех кто скорость работы тестил (и где-то в теме должен быть исходник для самостоятельного сравнения скорости работы).
Я не полностью проверял код, а исправил тот что выше. Нету смысла при каждом спавне проверять является ли карта с префиксом awp или нет
Сообщения автоматически склеены:

Тут даже не при спавне игрока надо проверять, а при подборе оружия
Сообщения автоматически склеены:

SDKHook(iClient, SDKHook_WeaponCanUse, OnWeaponCanUse);
Сообщения автоматически склеены:

Или даже спавна
C-подобный:
public void OnEntityCreated(int iEntity, const char[] sClassname)
{
    if(IsValidEntity(iEntity) && IsValidEdict(iEntity) &&
strcmp(sClassname,"weapon_deagle", false) == 0) SDKHook(iEntity, SDKHook_SpawnPost, OnItemSpawned);
}
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@DarkerZ, если пролистать вверх, то можно увидеть мою версию.
Там проверка карты только один раз при старте карты. Если карта awp_*, то активируются хуки, если нет, то они вырубаются.
Так что у меня ещё меньше нагрузка должна быть. =)
 
Сверху Снизу