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

alexmy

Участник
Сообщения
284
Реакции
13
Привет, "Раш- это идти напролом, бросает команду и убегает в перед собирая все не попади", так то это отличная идея, если бы игрок убежал на определенное расстояние и начал загораться=)).
 

filipok

Участник
Сообщения
72
Реакции
28
  • Автор ресурса
  • #22
@alexmy , тут немного другой принцип. Карты в кс гоу разбиты на зоны. Плагин чекает в какой зоне находится игрок, если зона запретная, игрок загорается. Это основной принцип его работы. В твоем же случае принцип иной, так что подправить и подстроить не получится, прости, нужен совершенно другой плагин.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Оффтоп
Нет, здесь лучше всего подходит const String:, а не static.
#define PLUGIN_NAME "MapLimit"
Не увидел использования, а потому - лучше убрать. Оффтоп
OnPlayerFootStep, EventHookMode_Post
Здесь тип хука вовсе не обязательно писать - он идёт по умолчанию.
public void OnClientPostAdminCheck(int client){
if(
IsCorrectMap && !IsFakeClient(client)){
CountPlayers = GetClientCount();
}
}
Боты всё равно подсчитываются функцией, а потому проверка на бота - бесполезный груз.
Action: в событиях работает только для метод-хука EventHookMode_Pre. Содержимое события вполне нормально. Оффтоп
Далее тоже заменить на переменную, раз уж её ввели. Я писал пример ещё по старой схеме подсчёта количества игроков.
В целом, неплохо, но лучше хукать/анхукать по количеству игроков сразу. Тогда и сама переменная подсчёта будет не нужна.
 

filipok

Участник
Сообщения
72
Реакции
28
  • Автор ресурса
  • #27
Работает на 100% плагин, который в первом посте. Тот, что в моем предидущем сообщении ещё не тестил. Я не дома, пока не могу проверить его.
 

Lima

Участник
Сообщения
159
Реакции
57
Есть проблема, террористы умудряются добежать до Б через мидл, вопрос в следующем как увеличить урон от огня?
 

Ярость

Участник
Сообщения
8
Реакции
2
Данное ограничение прохода на Б плент, действует только на карте de_dust2, или другие карты тоже?
 

filipok

Участник
Сообщения
72
Реакции
28
  • Автор ресурса
  • #32
Есть проблема, террористы умудряются добежать до Б через мидл, вопрос в следующем как увеличить урон от огня?
Есть такая проблема. Костыльно это можно решить способом, который указан ниже. Там не урон увеличивается, но время горения. К этому сообщению я файл приложил, в нем закрыты верхняя темка и Б плент (находясь там люди будут гореть).

Пробовал, но это увеличивает площадь огня и игроки начинают гореть даже на длине(
Это время горения IgniteEntity · sdktools_functions · SourceMod Scripting API Reference
Его можно увеличить и тогда игрок сгорит уже после выхода из запрещенной зоны.
Данное ограничение прохода на Б плент, действует только на карте de_dust2, или другие карты тоже?
Пока только на карте de_dust2, но в планах добавить и другие популярные карты.

Меня неделю не было (вернулся только вчера), как только разберусь с домашними хлопотами, продолжу, есть нереализованные предложения от AlmazOn. Но мне еще самому разобраться нужно что к чему там.
--- Добавлено позже ---
Не работает конструкция с массивом
PHP:
static String:de_dust2[] = {
    "MidDoors",
    "UpperTunnel",
    "LowerTunnel",
    "Middle",
    "OutsideTunnel",
    "BDoors"
};
public Action:OnPlayerFootStep(Handle:event, const String:name[], bool:dontBroadcast){
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    static String:location[16];
    GetEntPropString(client, Prop_Send, "m_szLastPlaceName", location, sizeof(location));
    if( GetClientCount() < MAX_PLAYERS_WHITHOUT_MIDDLE ){
        for (new i = 0; i < sizeof(de_dust2); i++){
            if (StrEqual(location, de_dust2[i])){
                PrintToChat(client, "Не ходи на Б!!!");
                if(IsPlayerAlive(client)) IgniteEntity(client, 3.8);
                break;
            }
        }
    }
}
Горение срабатывает только когда находишься на том участке, который первый в массиве de_dust2[] ("MidDoors")

Вообще, может вместо SDKHooks использовать событие player_footstep? Конечно, плохо, что индекс игрока ещё нужно получать, но вызывается куда реже и не требует проверки на "жив/не жив" + не грузит сервер от наблюдателей. Оффтоп
Попробовал, есть один конкретный баг, когда останавливаешься, горение прекращается. Этак вышел на мидл с авп, стал и пуляй по респе ТТ (как пример).
--- Добавлено позже ---
Плагин в первом посте обновлен: теперь проверка зон осуществляется циклом. Спасибо @R1KO за доработку.
 

Вложения

  • MapLimit.sp
    3.6 КБ · Просмотры: 15
Последнее редактирование:

Lima

Участник
Сообщения
159
Реакции
57
Плагин отличный, жду реализацию под следующие карты (inferno, mirage, cache, nuke).
 

Lima

Участник
Сообщения
159
Реакции
57
@filipok, Все работает отлично, но нужно отключать плагин на картах не прописанных в maplimit.ini, так как инферно у меня не прописано в конфиге но на карте я сгораю в миде), пока решил проблему загрузкой плагина на нужные мне карты.

P.S Желательно чтобы настройки maplimit.ini применялись простой сменой карты (сейчас нужно останавливать сервер).
--- Добавлено позже ---
P.S.S Также добавить более быструю скорость сгорания в огне, есть "индивиды" которые напролом бегут с бомбой на запрещенный плент и успевают поставить бомбу(
--- Добавлено позже ---
И последнее можно убрать дикий спам игроку в чат "Не ходи на Б!!! точка где игрок находится", пусть пишет 1 или 2 раза.
 
Последнее редактирование:

filipok

Участник
Сообщения
72
Реакции
28
  • Автор ресурса
  • #36
@filipok, Все работает отлично, но нужно отключать плагин на картах не прописанных в maplimit.ini, так как инферно у меня не прописано в конфиге но на карте я сгораю в миде), пока решил проблему загрузкой плагина на нужные мне карты.

... убрать дикий спам игроку в чат "Не ходи на Б!!! точка где игрок находится", пусть пишет 1 или 2 раза.
@nikita1811 , постарался устранить эти замечания, но к сожалению не тестил и смогу это сделать не раньше сегодняшней ночи (работа), потому прилагаю правленный исходник в этом посте, а не в первом.
P.S Желательно чтобы настройки maplimit.ini применялись простой сменой карты (сейчас нужно останавливать сервер).
Мне кажется это невозможно, насколько успел разобраться, конфиг читается при старте сервера, могу ошибаться
P.S.S Также добавить более быструю скорость сгорания в огне, есть "индивиды" которые напролом бегут с бомбой на запрещенный плент и успевают поставить бомбу(
В самой функции, которая воспламеняет игрока есть только параметр времени. Как на счет варианта, который бы закапывал игрока при нахождении в запретной зоне n секунд? Ну а там уже он просто догорал. Думаю это можно реализовать.
 

Вложения

  • MapLimit.sp
    4.4 КБ · Просмотры: 7

Lima

Участник
Сообщения
159
Реакции
57
@nikita1811 , постарался устранить эти замечания, но к сожалению не тестил и смогу это сделать не раньше сегодняшней ночи (работа), потому прилагаю правленный исходник в этом посте, а не в первом.
Не работает, логи:
C-подобный:
L 02/29/2016 - 13:45:07: [SM] Plugin encountered error 15: Array index is out of bounds
L 02/29/2016 - 13:45:07: [SM] Displaying call stack trace for plugin "MapLimit.smx":
L 02/29/2016 - 13:45:07: [SM]   [0]  Line 42, C:\Users\Admin\Desktop\CSGO\scripting\MapLimit.sp::OnConfigsExecuted()
В самой функции, которая воспламеняет игрока есть только параметр времени. Как на счет варианта, который бы закапывал игрока при нахождении в запретной зоне n секунд? Ну а там уже он просто догорал. Думаю это можно реализовать.
Думаю тоже выход :)

Мой maplimit.ini, может пригодится кому:
C-подобный:
"MapZones"
{
    "de_dust2"
    {
        "Zone_0"    "OutsideTunnel"
        "Zone_1"    "UpperTunnel"
        "Zone_2"    "LowerTunnel"
        "Zone_3"    "Middle"
        "Zone_4"    "MidDoors"
        "Zone_5"    "BDoors"
        "Zone_6"    "BombsiteB"
    }
    "de_mirage"
    {
        //"Zone_0"    "SideAlley"
        //"Zone_1"    "Middle"
        "Zone_2"    "Tunnel"
        "Zone_3"    "TunnelStairs"
        "Zone_4"    "BackAlley"
        "Zone_5"    "House"
        "Zone_6"    "Apartments"
        "Zone_7"    "Balcony"
        "Zone_8"    "Truck"
        "Zone_9"    "BombsiteB"
        "Zone_10"    "Catwalk"
        "Zone_11"    "Shop"
    }
    "de_inferno"
    {
        "Zone_0"    "Banana"
        "Zone_1"    "Truck"
        "Zone_2"    "Garden"
        "Zone_3"    "BombsiteB"
    }
    "de_nuke"
    {
        "Zone_0"    "Radio"
        "Zone_1"    "SideRoom"
        "Zone_2"    "Ramp"
        "Zone_3"    "BombsiteB"
        "Zone_4"    "SideRoom"
        "Zone_5"    "Ducts"
        "Zone_6"    "Tunnel"
        "Zone_7"    "TunnelStairs"
    }
    "de_cache"
    {
        "Zone_0"    "Back"
        "Zone_1"    "LongHall"
        "Zone_2"    "Window"
        "Zone_3"    "BombsiteB"
        "Zone_4"    "StorageRoom"
        "Zone_5"    "Ducts"
        "Zone_6"    "Entrance"
        "Zone_7"    "Rafters"
    }
    "de_train"
    {
        "Zone_0"    "BackofB"
        "Zone_1"    "Scaffolding"
        "Zone_2"    "BombsiteB"
        //"Zone_3"    "BPlatform"
    }
    "de_cbble"
    {
        //"Zone_0"    "TSideUpper"
        //"Zone_1"    "Tunnels"
        //"Zone_2"    "UpperTunnel"
        "Zone_3"    "BombsiteB"
        //"Zone_4"    "LowerTunnel"
        "Zone_5"    "SideDoor"
        "Zone_6"    "TMain"
        "Zone_7"    "BPlatform"
        //"Zone_8"    "Connector"
        //"Zone_9"    "Hut"
        //"Zone_10"    "Balcony"
    }
}

И еще идейка, как насчет того чтобы подсвечивать запрещенные зоны красным цветом (если это вообще можно реализовать), чтобы игроку было наглядно видно куда проход запрещен.
--- Добавлено позже ---
P.S Проблемка, когда игроков на карте становится меньше MAX_PLAYERS_WHITHOUT_MIDDLE проходы не блокируются!
 

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
Мне кажется это невозможно, насколько успел разобраться, конфиг читается при старте сервера, могу ошибаться
Делай загрузку в OnMapStart()
В самой функции, которая воспламеняет игрока есть только параметр времени. Как на счет варианта, который бы закапывал игрока при нахождении в запретной зоне n секунд? Ну а там уже он просто догорал. Думаю это можно реализовать.
Можно использовать env_fire,насколько я знаю та можно менять дамаг.

Ошибка в:
for (int i = 0; i <= sizeof(MZones); i++)
Значения от 0 до максимум-1
--- Добавлено позже ---
PHP:
#pragma semicolon 1
#include <sourcemod>
#include <sdkhooks>
#include <sdktools>

#define PLUGIN_MAINNAME "MapLimit"
#define PLUGIN_NAME "MapLimit"
#define PLUGIN_AUTHOR "filip fixed by AlmazON"
#define PLUGIN_VERSION "1.0.0"

#define MAX_PLAYERS_WHITHOUT_MIDDLE        10

bool    OneTimeNotify;
bool    IsCorrectMap;
int        CountPlayers;
char    MZones[12][PLATFORM_MAX_PATH];
bool    SpawnProtect;
bool    AlreadyNotified[MAXPLAYERS+1];
Handle kvMapLimit;
public OnMapStart()
{
    kvMapLimit = CreateKeyValues("MapZones");
    if(!FileToKeyValues(kvMapLimit, "addons/sourcemod/configs/maplimit.ini")){
        SetFailState("Failed to load addons/sourcemod/configs/maplimit.ini");
    }
}
public void OnPluginStart(){
    /*kvMapLimit = CreateKeyValues("MapZones");
    if(!FileToKeyValues(kvMapLimit, "addons/sourcemod/configs/maplimit.ini")){
        SetFailState("Failed to load addons/sourcemod/configs/maplimit.ini");
    }*/
    HookEvent("round_freeze_end", Event_RoundFreezeEnd, EventHookMode_PostNoCopy);
    HookEvent("round_end", Event_RoundEnd);
    RegAdminCmd("sm_place", WhereAmI, ADMFLAG_BAN);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////CheckZoneNameComand (for test)/////////////////////////////////////////////////
public Action WhereAmI(int client, int args){
    char location[32];
    GetEntPropString(client, Prop_Send, "m_szLastPlaceName", location, sizeof(location));
    ReplyToCommand(client, "%N is in %s", client, location);
    LogMessage("client %N is in %s", client, location);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
public void OnConfigsExecuted(){
    for (int i = 0; i < sizeof(MZones); i++){
        MZones[i][0] = 0;
    }
    char MapName[16];
    GetCurrentMap(MapName, sizeof(MapName));

    KvRewind(kvMapLimit);
    if(KvJumpToKey(kvMapLimit, MapName, false)){
        KvGetString(kvMapLimit, "Zone_0", MZones[0], PLATFORM_MAX_PATH);
        KvGetString(kvMapLimit, "Zone_1", MZones[1], PLATFORM_MAX_PATH);
        KvGetString(kvMapLimit, "Zone_2", MZones[2], PLATFORM_MAX_PATH);
        KvGetString(kvMapLimit, "Zone_3", MZones[3], PLATFORM_MAX_PATH);
        KvGetString(kvMapLimit, "Zone_4", MZones[4], PLATFORM_MAX_PATH);
        KvGetString(kvMapLimit, "Zone_5", MZones[5], PLATFORM_MAX_PATH);
        KvGetString(kvMapLimit, "Zone_6", MZones[6], PLATFORM_MAX_PATH);
        KvGetString(kvMapLimit, "Zone_7", MZones[7], PLATFORM_MAX_PATH);
        KvGetString(kvMapLimit, "Zone_8", MZones[8], PLATFORM_MAX_PATH);
        KvGetString(kvMapLimit, "Zone_9", MZones[9], PLATFORM_MAX_PATH);
        KvGetString(kvMapLimit, "Zone_10", MZones[10], PLATFORM_MAX_PATH);
        KvGetString(kvMapLimit, "Zone_11", MZones[11], PLATFORM_MAX_PATH);
        IsCorrectMap = true;
    }
}
public void OnClientPostAdminCheck(int client){
    if(IsCorrectMap && !IsFakeClient(client)){
        SDKHook(client, SDKHook_PostThinkPost, OnPostThinkPost);
        CountPlayers = GetClientCount();
    }
}
public void OnPostThinkPost(int client){
    if(IsPlayerAlive(client)){
        static char location[16];
        static int i;
        GetEntPropString(client, Prop_Send, "m_szLastPlaceName", location, sizeof(location));
    //    LogMessage("m_szLastPlaceName: %s", location);
        if( CountPlayers < MAX_PLAYERS_WHITHOUT_MIDDLE ){
            for (i = 0; i < sizeof(MZones); ++i){
    //            LogMessage("StrEqual: %s-%s -> %b", location, MZones[i], StrEqual(location, MZones[i]));
                    if ((StrEqual(location, MZones[i])) && !SpawnProtect){
                        Notification(client);
                        IgniteEntity(client, 0.5);
                        return;
                    }else{
                        AlreadyNotified[client] = false;
                    }
            }
        }
    }
}
public Action Notification(int client){
    if (!AlreadyNotified[client]){
        PrintHintText(client, "%N, эта запрещенная зона");
        //PrintToChat(client, "%N, зона %s под запретом", location);
        AlreadyNotified[client] = true;
    }
}
public Action Event_RoundEnd(Handle event, const char[] name, bool dontBroadcast){
    SpawnProtect = true;
}
public Event_RoundFreezeEnd(Handle:event, const String:name[], bool:dontBroadcast) {
    SpawnProtect = false;
    if ( IsCorrectMap ) {
        if (GetClientCount() < MAX_PLAYERS_WHITHOUT_MIDDLE){
            PrintHintTextToAll("Проходы на Б и мидл запрещены, на сервере менее %d игроков", MAX_PLAYERS_WHITHOUT_MIDDLE);
            OneTimeNotify = true;
        }
        else if (OneTimeNotify){
            PrintHintTextToAll("Играет полная карта");
            OneTimeNotify = false;
        }
    }
}
 

filipok

Участник
Сообщения
72
Реакции
28
  • Автор ресурса
  • #39
@filipok, Все работает отлично, но нужно отключать плагин на картах не прописанных в maplimit.ini, так как инферно у меня не прописано в конфиге но на карте я сгораю в миде), пока решил проблему загрузкой плагина на нужные мне карты.

P.S Желательно чтобы настройки maplimit.ini применялись простой сменой карты (сейчас нужно останавливать сервер).
Сделано, плагин перезалил в первом посте. Спасибо за разметку карт, ее тоже добавил в первый пост.
P.S.S Также добавить более быструю скорость сгорания в огне, есть "индивиды" которые напролом бегут с бомбой на запрещенный плент и успевают поставить бомбу(

И последнее можно убрать дикий спам игроку в чат "Не ходи на Б!!! точка где игрок находится", пусть пишет 1 или 2 раза.
Это реализую попозже (неделя м.б.), времени к сожалению очень мало.

@Саша Шеин , спасибо большое, вы очень помогли с циклом. А вот env_fire не работает в кс гоу AlliedModders - View Single Post - Moving env_fire with player does not work...
--- Добавлено позже ---
@nikita1811 теперь в чат не спамит, если игрок находится в запретной зоне более 3 секунд, у него исчезнет все оружие (включая нож и бомбу), это что бы напролом не бежали.
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
C-подобный:
new Float:vec[3];
Лучше decl, либо новый синтаксис.
C-подобный:
kvMapLimit = CreateKeyValues("MapZones");
Лучше бы это в OnPluginStart() делать, а там просто сброс "древа" и считывать.
C-подобный:
static int i;
    for(
Ничего подобного. Здесь нужен просто int в цикле.
C-подобный:
void OnConfigsExecuted()
Тогда ничем не оправдан вызов OnMapStart(). Сделать всё в одном, во втором.
C-подобный:
KvGetString(kvMapLimit, "Zone_0", MZones[0], PLATFORM_MAX_PATH);
Эта куча ужасает... И я сомневаюсь, что всё это количество зон есть на всех картах. Здесь бы счётчик вести, чтобы цикл в дальнейшем был минимален (и продуктивен, не проходился по пустым "ячейкам").
C-подобный:
void OnClientPostAdminCheck(int client)
Как было запущено, так и осталось... Но, вроде собираешься менять способы хука, так что, посмотрим.
C-подобный:
if (IsClientInGame(i)){
            AlreadyNotifyed[i] = false;
А там без разницы, в игре игрок или нет. Просто ставь массив в false.
C-подобный:
CreateTimer((BURY_TIME - 1.0), ResetNotification, client);
    CreateTimer(BURY_TIME, Timer_Callout, client);
Лучше запускай один таймер, более ранний, а после его исполнения - второй, прямо в нём (с секундной задержкой, если по коду).
Оффтоп
 
Сверху Снизу