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

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Нет. Тот же таймер взят неверно - конкретно такому плагину как раз таки подходит не CreateTimer(1.0, CheckPlayer, _, TIMER_REPEAT);, а CreateTimer(1.0, CheckPlayer, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); - если карта верна, то запускаем наш таймер, а при её смене он и сам остановится. Оффтоп
C-подобный:
if(IsClientInGame(client) && IsPlayerAlive(client) && client)
Последнее в цикле вообще ни к чему.
C-подобный:
if( CountPlayers < MAX_PLAYERS_WHITHOUT_MIDDLE )
Перед самым началом таймера хотя бы поставить. Да и if(!SpawnProtect) тоже.
C-подобный:
kvMapLimit = CreateKeyValues("MapZones");
Должно исполняться в OnPluginStart(), иначе чревато утечкой памяти.
C-подобный:
HookEvent("round_end", Event_RoundEnd);
С методом EventHookMode_PostNoCopy.
C-подобный:
static int i;
    for (i = 0; i < sizeof(MZones); ++i){
        MZones[i][0] = 0;
    }
Про это раз 3 говорю: вообще не требуется static - незачем тратить память на то, что исполняется раз за всю карту! И блок OnMapStart() совместить с OnConfigsExecuted().
Дальше смотреть нет смысла...
 

filipok

Участник
Сообщения
72
Реакции
28
Спасибо, обновил первый пост
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
обновил первый пост
C-подобный:
#include <sdkhooks>
Больше не используется, забыл убрать.
C-подобный:
#define PLUGIN_MAINNAME "MapLimit"
#define PLUGIN_NAME "MapLimit"
Опять их два. Ну зачем? Если бы другой, хоть как префикс чата использовался тогда.
C-подобный:
if(!FileToKeyValues(kvMapLimit, "addons/sourcemod/configs/maplimit.ini")){
        SetFailState("Failed to load addons/sourcemod/configs/maplimit.ini");
    }
Тут дело личное, но, похоже перестарался - файл теперь обновлять бесполезно без перезагрузки сервера/плагина.
C-подобный:
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);
}
Зачем ReplyToCommand? Мы же не будем узнавать, где находится Консоль сервера. :mosking: Сделай перед всем кодом общую проверку if (client) и пропиши обычный PrintToChat.
C-подобный:
/*}
public void OnConfigsExecuted(){*/
Почему наоборот, решил оставить OnMapStart()? Он всё равно вызывается, когда ни один игрок не переподключился к серверу, так зачем заранее запускать наш таймер? Лучше делать это позже, в том, что ты закомментировал.
C-подобный:
for (i = 0; i < sizeof(MZones); ++i){
        MZones[i][0] = 0;
...
MZones[a][0] = '\0';
Тогда зачем цикл выше? Ты же делаешь одно и то же, только выглядит это с другой переменной счётчика цикла.
C-подобный:
if(!SpawnProtect)
Уже лишний в таймере будет.
А ещё смущает return; - на одном "плохом" игроке обрываешь цикл.

Ну и хватит пока, остальное вроде более-менее верно.
 
Последнее редактирование:

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Есть два стандартных оператора, которые можно использовать в цикле: break и continue.
Первый производит выход из цикла, но не из функции. Второй говорит циклу перейти к следующей итерации.
Вместо return, который производит выход из функции, вписывай continue. Так ты сможешь пройти всех клиентов.
PHP:
for (int client = 1; client <= MaxClients; client++)
{
 if(!IsClientInGame(client))
 continue;
 
 //do staff
}
Оффтоп
 

filipok

Участник
Сообщения
72
Реакции
28
@AlmazON , спасибо большое, обновил первый пост.
Оффтоп
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
может забудет кто конфиг положить, пусть ошибка будет видна в консоли
Речь была о другом. Но ладно, как я говорил, это не критично, дело личное - нагрузка только меньше.
C-подобный:
Action WhereAmI
Для исполняемых команд - всегда return Plugin_Handled; в конце. Это избавит от "неизвестной команды" в консоли.
Первый цикл обнуляет массив с зонами
И второй тоже. Смотри:
C-подобный:
for (i = 0; i < sizeof(MZones); ++i)
for (a = 0; a < MAX_ZONES_MAP; ++a)
Названия переменных разные, но это не важно. Оффтоп Оба цикла начинаются с нуля (i = a = 0). Один цикл заканчивается sizeof(MZones) - это 12, Оффтоп другой - MAX_ZONES_MAP и это тоже 12. Оффтоп Так где же разница?
C-подобный:
char MapName[16];
Мал массив, карты и длиннее могут быть (нестандартные, если там найдутся всё-таки зоны). А вот: char MZones[12][PLATFORM_MAX_PATH]; чрезмерно большой, будто ты туда путь к файлу собрался записывать, а не название карты.
C-подобный:
if(!SpawnProtect)
Опять не на месте. Он должен быть в самом начале, но раз!
если убрать, то почему-то не срабатывает
Замени на break;
 

filipok

Участник
Сообщения
72
Реакции
28
@AlmazON , спасибо, все поправил кроме:
Названия переменных разные, но это не важно. Оффтоп Вообще, зря дважды переменную вводил. Оба цикла начинаются с нуля (i = a = 0). Один цикл заканчивается sizeof(MZones) - это 12, Оффтоп char MZones[12][PLATFORM_MAX_PATH]; другой - MAX_ZONES_MAP и это тоже 12. Оффтоп #define MAX_ZONES_MAP 12 Так где же разница?
Вот видео
Суть следующая: запускаю сервер, карта inferno, зона Truck для этой карты у меня в конфиге не заблокирована, на видео видно, что перемещаюсь там без последствий.
Далее выбираем карту mirage зона truck в этой карте заблокирована, сразу же меняю обратно, на inferno и теперь на инферно зона с таким же названием заблокирована.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
все поправил кроме
Это загвоздка в:
C-подобный:
if (MZones[a][0] == '\0') break;
Убери эту строчку и все названия зон будут очищены. Я то считал количество запрещаемых зон, а у тебя нет ничего подобного, поэтому нужно проходить весь цикл.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
C-подобный:
char    MZones[12][PLATFORM_MAX_PATH];
Должно быть:
C-подобный:
char    MZones[MAX_ZONES_MAP][32];
MAX_ZONES_MAP потому, что #define MAX_ZONES_MAP 12 может быть изменён: если в большую сторону, то часть новых зон плагин не станет проверять, а меньше - зря выделяется память + циклам проходить никогда неиспользуемые "номера" зон.
32 потому, что это приблизительная максимальная длина названия карты. Меньше - карты с похожим названием могут считаться из списка запрета, а больше - память тратиться ни на что.
C-подобный:
CountPlayers = GetClientCount();
	SpawnProtect = false;
	if ( IsCorrectMap ) {
        if (GetClientCount()
Сохраняешь в переменную, а затем заново вызываешь натив количества игроков. Отталкивайся от переменной.

В остальном, вроде, нормально.
 

NIKOLYA-PRODIGY

ANPORTGAMES.RU
Сообщения
496
Реакции
135
идея классная
поставил у себя плагин

но вот есть проблемка ... у меня 10ти слотовые серверы
поставил ограничение в 6 человек, т.е. 3х3 уже играется фулмап
но бывают моменты когда кто то отключается и за КТ остается 2, а за Т 4 человека

собственно настройка именно по кол-ву игроков в команде думаю будет правильнее

второе - это возможность отключить плагин в вармапе
потому что люди подключаются во время вармапа, на сервере уже 10 человек, а ограничение по карте работает, пока не начнется раунд

потом есть какой то глюк, когда в начале раунда все подгорают на 3 хп, вроде как в первом раунде только замечал

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

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

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
люди подключаются во время вармапа, на сервере уже 10 человек
По-моему, я сделал ещё лучше: как только в обеих командах набирается нужное количество игроков, то запрет сразу отключается. Или речь конкретно о 1 раунде, чтобы вообще не было запретных зон?
 

NIKOLYA-PRODIGY

ANPORTGAMES.RU
Сообщения
496
Реакции
135
По-моему, я сделал ещё лучше: как только в обеих командах набирается нужное количество игроков, то запрет сразу отключается. Или речь конкретно о 1 раунде, чтобы вообще не было запретных зон?
вот нужное кол-во игроков в команде это гуд, да, я об этом
и то, что плагин сразу отключается это тоже лучше гораздо
но еще нужно сделать возможность отключать плагин в вармапе
--- Добавлено позже ---
@AlmazON, #define MAX_PLAYERS_WHITHOUT_MIDDLE 20
это лимит на команду? или общее кол-во игроков?
--- Добавлено позже ---
@AlmazON, с твоим плагином люди некоторые плошмя ходят)
--- Добавлено позже ---
@AlmazON, я поставил MAX_PLAYERS_WHITHOUT_MIDDLE 3
плагин понимал как я понял, что людей играет меньше 3х в команде
но когда нас стало всего 3 (1кт и 2 т), то игралась полная карта
 
Последнее редактирование:

andrey19992

Участник
Сообщения
487
Реакции
101
Оффтоп
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
#define MAX_PLAYERS_WHITHOUT_MIDDLE
Лимит на обе команды: КТ + Т, не считая спеков.
люди некоторые плошмя ходят
В смысле? Обойти можно, говорилось уже. То был пример автору на тему хоть какой-то оптимальности.
@andrey19992, уже говорили, что это не так. Knife-карты тоже блоками устилать до самой балки-прохода?
 

andrey19992

Участник
Сообщения
487
Реакции
101
Лимит на обе команды: КТ + Т, не считая спеков.В смысле? Обойти можно, говорилось уже. То был пример автору на тему хоть какой-то оптимальности.
@andrey19992, уже говорили, что это не так. Knife-карты тоже блоками устилать до самой балки-прохода?
можно постараться, сразу наглядно видно и ГЛАВНОЕ ПРОЙТИ ХОТЬ ОПУПЕЙ НЕЛЬЗЯ :-) для no brain игроков :-) а так зашел в эту зону, начал гореть, чет в чате писать начало, испугался и вышел с серва... я когда своих админов например поджигаю, обижаются заразы :D а тут просто так зашел не туда и ппц :-) я считаю что надо продумывать так что бы было понятно и не причиняла вреда и не отпугивало, что самое главное :-)
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
надо продумывать так что бы было понятно и не причиняла вреда и не отпугивало, что самое главное
Тогда какие варианты? Телепортировать на последнюю точку до запретной зоны? Оффтоп
 

andrey19992

Участник
Сообщения
487
Реакции
101
Тогда какие варианты? Телепортировать на последнюю точку до запретной зоны? Оффтоп
Дети будут с телепортом этим фанится))) нужны наглядные стены и всё :-) вреда не приносят, сразу понятно что пройти нельзя, игроки не пугаются и бегут туда куда можно. Просто есть люди которые читать не умеют и думаю, ОООО админ ***** со мной что-то сделал, пойду я отсюда..... Вот вся проблема :-)
 
Сверху Снизу