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

filipok

Участник
Сообщения
72
Реакции
28
  • Автор ресурса
  • #41
C-подобный:
kvMapLimit = CreateKeyValues("MapZones");
Лучше бы это в OnPluginStart() делать, а там просто сброс "древа" и считывать.
P.S Желательно чтобы настройки maplimit.ini применялись простой сменой карты (сейчас нужно останавливать сервер).
Делай загрузку в OnMapStart()
Вот почему так сделано
C-подобный:
static int i;
    for(
Ничего подобного. Здесь нужен просто int в цикле.
Сделал, но смысла не уловил.
C-подобный:
void OnConfigsExecuted()
Тогда ничем не оправдан вызов OnMapStart(). Сделать всё в одном, во втором.
Увы, так не получается, пробовал так:
PHP:
}
public void OnConfigsExecuted(){
    char MapName[16];
    GetCurrentMap(MapName, sizeof(MapName));
   
    for (int i = 0; i < sizeof(MZones); ++i){
        MZones[i][0] = 0;
    }
   
    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);
        ......................................
    }
}
Зоны не заполняются, точнее видимо они обнуляются сразу же в ячейках массива. Потому сначала в OnMapStart() обнуляю массив (иначе при смене карты он не обнулится) и потом уже в OnConfigsExecuted распихиваю зоны по массиву MZones.
C-подобный:
if (IsClientInGame(i)){
            AlreadyNotifyed[i] = false;
А там без разницы, в игре игрок или нет. Просто ставь массив в false.
Спасибо, буду иметь ввиду.
C-подобный:
CreateTimer((BURY_TIME - 1.0), ResetNotification, client);
    CreateTimer(BURY_TIME, Timer_Callout, client);
Лучше запускай один таймер, более ранний, а после его исполнения - второй, прямо в нём (с секундной задержкой, если по коду).
Угу, сделано.
C-подобный:
void OnClientPostAdminCheck(int client)
Как было запущено, так и осталось... Но, вроде собираешься менять способы хука, так что, посмотрим.

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 "2.0.1"

#define MAX_PLAYERS_WHITHOUT_MIDDLE        20
#define BURY_TIME                            3.0

bool    AlreadyNotifyed[MAXPLAYERS+1];
bool    IsPlayerInZone[MAXPLAYERS+1];
bool    OneTimeNotify;
bool    IsCorrectMap;
bool    SpawnProtect;
int        CountPlayers;
char    MZones[12][PLATFORM_MAX_PATH];
Handle kvMapLimit;

public void OnPluginStart(){
    HookEvent("round_freeze_end", Event_RoundFreezeEnd, EventHookMode_PostNoCopy);
    HookEvent("player_footstep", OnPlayerFootStep);
    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 OnMapStart(){
    kvMapLimit = CreateKeyValues("MapZones");
    if(!FileToKeyValues(kvMapLimit, "addons/sourcemod/configs/maplimit.ini")){
        SetFailState("Failed to load addons/sourcemod/configs/maplimit.ini");
    }
   
    int i;
    for (i = 0; i < sizeof(MZones); ++i){
        MZones[i][0] = 0;
    }
}
public void OnConfigsExecuted(){
    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 Action:OnPlayerFootStep(Handle:event, const String:name[], bool:dontBroadcast){
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    if(IsPlayerAlive(client) && IsCorrectMap && !IsFakeClient(client)){
        static char location[16];
        static int i;
        GetEntPropString(client, Prop_Send, "m_szLastPlaceName", location, sizeof(location));
        if( CountPlayers < MAX_PLAYERS_WHITHOUT_MIDDLE ){
            for (i = 0; i < sizeof(MZones); ++i){
                    if ((StrEqual(location, MZones[i])) && !SpawnProtect){
                        IgniteEntity(client, 0.5);
                        IsPlayerInZone[client] = true;
                        if(!AlreadyNotifyed[client]){
                            NotifyAndBury(client);
                            LogMessage("OnPlayerFootStep AlreadyNotifyed %b", AlreadyNotifyed[client]);
                            LogMessage("OnPlayerFootStep IsPlayerInZone %b", IsPlayerInZone[client]);
                            //LogMessage("OnPlayerFootStep Stripped %b", Stripped[client]);
                        }
                        return;
                    }
            }
        }
    }
}
public NotifyAndBury(client){
    PrintHintText(client, "Запрещенная зона, на сервере менее %d игроков", (MAX_PLAYERS_WHITHOUT_MIDDLE +1));
    AlreadyNotifyed[client] = true;
    LogMessage("NotifyAndBury AlreadyNotifyed %b", AlreadyNotifyed[client]);
    CreateTimer(2.0, ResetNotification, client);
}
public Action ResetNotification(Handle timer, any client){
    IsPlayerInZone[client] = false;
    AlreadyNotifyed[client] = false;
    LogMessage("ResetNotification AlreadyNotifyed %b", AlreadyNotifyed[client]);
    LogMessage("ResetNotification IsPlayerInZone %b", IsPlayerInZone[client]);
    CreateTimer(1.0, Timer_Callout, client);
}
public Action Timer_Callout(Handle timer, any client){
    if(IsPlayerInZone[client]){
        new entity = CreateEntityByName("player_weaponstrip");
        AcceptEntityInput(entity, "strip", client);
        AcceptEntityInput(entity, "kill");
        PrintHintText(client, "Вы разоружены");
        LogMessage("StripWeapon %N", client);
    }
}
public Action Event_RoundEnd(Handle event, const char[] name, bool dontBroadcast){
    SpawnProtect = true;
}
public Event_RoundFreezeEnd(Handle:event, const String:name[], bool:dontBroadcast) {
    CountPlayers = GetClientCount();
    SpawnProtect = false;
    if(IsCorrectMap){
        if (CountPlayers < MAX_PLAYERS_WHITHOUT_MIDDLE){
            PrintHintTextToAll("Проходы на Б и мидл запрещены, на сервере менее %d игроков", MAX_PLAYERS_WHITHOUT_MIDDLE);
            OneTimeNotify = true;
        }
        else if(OneTimeNotify){
            PrintHintTextToAll("Играет полная карта");
            OneTimeNotify = false;
        }
    }
}
Оптимизация налицо. Если работать через SDKHook все это вызывалось примерно 130 раз в секунду:
PHP:
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
L 03/12/2016 - 18:15:39: [MapLimit.smx] zone MidDoors, AlreadyNotifyed: 0
L 03/12/2016 - 18:15:39: [MapLimit.smx] NotifyAndBury AlreadyNotifyed: 1
L 03/12/2016 - 18:15:39: [MapLimit.smx] Initialized Notify (AlreadyNotifyed: 1)
L 03/12/2016 - 18:15:39: [MapLimit.smx] Обнуляем AlreadyNotifyed
А с OnPlayerFootStep это вызывается 2!!!!! раза в секунду
PHP:
L 03/14/2016 - 22:10:16: [MapLimit.smx] NotifyAndBury AlreadyNotifyed 1
L 03/14/2016 - 22:10:16: [MapLimit.smx] OnPlayerFootStep AlreadyNotifyed 1
L 03/14/2016 - 22:10:16: [MapLimit.smx] OnPlayerFootStep IsPlayerInZone 1
L 03/14/2016 - 22:10:18: [MapLimit.smx] ResetNotification AlreadyNotifyed 0
L 03/14/2016 - 22:10:18: [MapLimit.smx] ResetNotification IsPlayerInZone 0
А в итоге получаем почти то же самое.
kvMapLimit = CreateKeyValues("MapZones");
Лучше бы это в OnPluginStart() делать, а там просто сброс "древа" и считывать.
KvGetString(kvMapLimit, "Zone_0", MZones[0], PLATFORM_MAX_PATH);
Эта куча ужасает... И я сомневаюсь, что всё это количество зон есть на всех картах. Здесь бы счётчик вести, чтобы цикл в дальнейшем был минимален (и продуктивен, не проходился по пустым "ячейкам").
 

Вложения

  • MapLimit.sp
    5.3 КБ · Просмотры: 9

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #42
@filipok,
PHP:
new entity = CreateEntityByName("player_weaponstrip");

new client = GetClientOfUserId(GetEventInt(event, "userid"));
Ты уж пиши на одном синтаксисе. И пора бы уже использовать metodmap.

Утечку показать?
PHP:
public OnMapStart(){
    kvMapLimit = CreateKeyValues("MapZones");
Несколько суток включенного сервера (в лучшем случае) с регулярной сменой карт и сервер в краш.

Про Action уже писали.

PHP:
new client = GetClientOfUserId(GetEventInt(event, "userid"));
    if(IsPlayerAlive(client) && IsCorrectMap && !IsFakeClient(client)){
        static char location[16];
        static int i;
тоесть i и location в OnPlayerFootStep каждый раз создавать слишком жирно, а client пофиг?

PHP:
if ((StrEqual(location, MZones[i])) && !SpawnProtect){
Может !SpawnProtect стояло проверить еще до получения клиента?
как и
PHP:
if( CountPlayers < MAX_PLAYERS_WHITHOUT_MIDDLE ){

PHP:
new client = GetClientOfUserId(GetEventInt(event, "userid"));
    if(IsPlayerAlive(client) && IsCorrectMap && !IsFakeClient(client)){
Ну а если IsCorrectMap == false то зря создавали переменную, получали в неё индекс, проверяли жив ли игрок..
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Вот почему так сделано
Конкретную строку я указал, которой там не место. Остальное стоит оставить, если хочется, чтобы изменения в конфиге карт чаще считывались, а не раз за всю работу плагина.
смысла не уловил
Например, в том же OnMapStart() - сразу виден смысл хотя бы в экономии памяти. Для столь редкого вызова её тратить просто нецелесообразно.
Увы, так не получается
Что там может не получаться? С OnMapStart() переносишь всё в самое начало OnConfigsExecuted() и готово. С KvGetString можно всё в один цикл слить.
через SDKHook все это вызывалось примерно 130 раз в секунду
Так то 128 скорее. Количество вызовов в секунду равно установленному TickRate. Логи для подобного - это "приблизительно показательное".
2!!!!! раза в секунду
Не забываем, что даже для этих 2 раз нужно буквально бежать... Т.е. все мёртвые/наблюдатели не считаются, вызовы отсутствуют. Правда, здесь получение индекса игрока через event, но относительно - мелочь.
С другой стороны, обхитрить можно, сам же указывал... Я надеялся, что-то другое приспособишь.
 

Lima

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

Что насчет этого? Если что-то подобное реализовать (не обязательно цветом), можно как-то и по-другому, чтобы игрок визуально понимал куда можно, а куда нет.
И еще идейка, как насчет того чтобы подсвечивать запрещенные зоны красным цветом (если это вообще можно реализовать), чтобы игроку было наглядно видно куда проход запрещен.
 
Последнее редактирование:

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Блин, замечаний масса. Плагин очень не грамотно сделан. К примеру, почему обход кв не сделать через цикл? Или почему ты используешь хук SDKHook_PostThinkPost, если он тебе не нужен и оптимальней использовать таймер. Если ты считаешь игроков когда игрок заходит, то почему не считаешь игроков когда кто-то вышел. 140 строчек, а напартачить умудрились)
Исполнение 2/10
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
используешь хук SDKHook_PostThinkPost, если он тебе не нужен и оптимальней использовать таймер
Самое лучшее первое, что приходит на ум - сделать через SDKHooks с касанием к нужным зонам. Если не получиться - таймером. Подходящих хуков вроде больше и нет (вспоминая CS:S, для CS:GO не смотрел).
Тот же player_footstep можно буквально обойти медленным шагом (не бежать). И пусть это долго и нудно, отбросить, но также можно ещё допрыгать в запретную зону, а это, учитывая бинихоп - быстро и удобно. Т.е., как минимум , нужно хук player_jump ещё прикручивать даже к "временному исполнению". Оффтоп
 

filipok

Участник
Сообщения
72
Реакции
28
  • Автор ресурса
  • #47
@gibs я так понял вы из первого поста скачали сурс.
SDKHook В плагине уже нет.
Можно пример цикла обхода кв? Этот минус уже упоминали. Я не могу въехать как его сделать.
Нынче игроки считаются 1 раз за раунд (раунл фриз энд). Подсчёт игроков при дисконнекте не делал намеренно, т.к. При дисконнекте скажем 10-го игрока, проходы на б становились недоступными, и там мог находиться игрок.
В общем не важно это уже.
Как я понял можно тупо при коннекте игрока запускать циклический таймер где все и проверять? Это будет грамотно с точки зрения скриптинга?
Если нет, то не могли бы вы сурс из моего предидущего поста посмотреть? Ссылку дать не могу к сожалению, с телефона сижу. Спасибо.
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
PHP:
ArrayList zones;
zones.Clear();

KvRewind(kvMapLimit);
if(KvJumpToKey(kvMapLimit, MapName, false) && KvGotoFirstSubKey(kvMapLimit, false))
{
    char[] szBuffer = new char[64];
  
    do
    {
        KvGetString(kvMapLimit, NULL_STRING, szBuffer, 64);
        if(szBuffer[0])
            zones.PushString(szBuffer);
    }
    while (KvGotoNextKey(kvMapLimit, false));
}
Избавься от обычного массива и используй контейнер.

Кстати, вот представь ситуация: человек зашёл на форум, нашёл тему, скачал исходник. Угадай из какого поста он скачает этот исходник. Метод решения загадки можешь использовать любой. Монетку там кинь, на картах погадай.
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Можно пример цикла обхода кв?
C-подобный:
public OnMapStart(){
    ...
    int i;
    for (i = 0; i < sizeof(MZones); ++i){
        MZones[i][0] = 0;
    }
}
public void OnConfigsExecuted(){
    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;
    }
}
Хорошо преобразуется в одно:
PHP:
public void OnConfigsExecuted(){
    ...
    char MapName[32];
    GetCurrentMap(MapName, sizeof(MapName));
   
    KvRewind(kvMapLimit);
    if(KvJumpToKey(kvMapLimit, MapName, false)){
        for (int i = 0; i < sizeof(MZones); ++i){
            FormatEx(MapName, sizeof(MapName), "Zone_i", i);
            MZones[i][0] = 0;
            KvGetString(kvMapLimit, MapName, MZones[i], PLATFORM_MAX_PATH);
        }
        IsCorrectMap = true;
    }
}
Думаю, так наиболее показательно понятно.
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
C-подобный:
public OnMapStart(){
    ...
    int i;
    for (i = 0; i < sizeof(MZones); ++i){
        MZones[i][0] = 0;
    }
}
public void OnConfigsExecuted(){
    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;
    }
}
Хорошо преобразуется в одно:
PHP:
public void OnConfigsExecuted(){
    ...
    char MapName[32];
    GetCurrentMap(MapName, sizeof(MapName));
  
    KvRewind(kvMapLimit);
    if(KvJumpToKey(kvMapLimit, MapName, false)){
        for (int i = 0; i < sizeof(MZones); ++i){
            FormatEx(MapName, sizeof(MapName), "Zone_i", i);
            MZones[i][0] = 0;
            KvGetString(kvMapLimit, MapName, MZones[i], PLATFORM_MAX_PATH);
        }
        IsCorrectMap = true;
    }
}
Думаю, так наиболее показательно понятно.
Не обижайся, но выдал ты ваще конкретно)))))
 

AlmazON

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

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Есть конкретная ошибка, мешающая работе или просто "не очень"?Твой метод он всё равно не поймёт, а с этим никаких глобальных изменений делать не надо. Оффтоп
Но тем не менее обход ключей самое идеальное. Контейнер можно убрать, в принципе, и поставить лимит ключей для обхода. Да и понять как оно работает тоже не так тяжело.
А твой метод какой-то варварский. Вообще не очень.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
твой метод какой-то варварский
ОффтопПродолжаю варварство: :biggrin:
PHP:
new iZonesCount;

public void OnConfigsExecuted(){
    ...
    char MapName[32];
    GetCurrentMap(MapName, sizeof(MapName));
 
    KvRewind(kvMapLimit);
    if(KvJumpToKey(kvMapLimit, MapName, false)){
        int i;
        for (i = 0; i < sizeof(MZones); ++i){
            FormatEx(MapName, sizeof(MapName), "Zone_i", i);
            MZones[i][0] = '\0';
            KvGetString(kvMapLimit, MapName, MZones[i], PLATFORM_MAX_PATH);
            if (MZones[i][0] == '\0') break;
        }
        iZonesCount = i;
        IsCorrectMap = true;
    }
}
И тогда плюс наблюдаем:
C-подобный:
for (i = 0; i < sizeof(MZones); ++i){
if ((StrEqual(location, MZones[i])) && !SpawnProtect)
Заменяя на:
PHP:
for (int i = 0; i < iZonesCount; ++i)
Оффтоп
Для простого понимания и лёгкого развития)
 

filipok

Участник
Сообщения
72
Реакции
28
  • Автор ресурса
  • #54
Кстати, вот представь ситуация: человек зашёл на форум, нашёл тему, скачал исходник. Угадай из какого поста он скачает этот исходник. Метод решения загадки можешь использовать любой. Монетку там кинь, на картах погадай.
Кстати, этот плагин стоит на моем сервере и работает. Появился он в разделе тестовых плагинов, потому что я не нашёл плагина с подобным функционалом (возможно плохо искал, но факт остаётся фактом). Я до сих пор радуюсь, когда мои поделки компилируются без ошибок. Это что б ты понял мой уровень в скриптинге.
Ну и последнее, обрати внимание на мелкий текст, который написан в первом посте.
Ты его сразу видимо не разглядел, там не было ни слова про сарказм. Метод решения задачки с мелким текстом можешь использовать любой, хоть очки надень, хоть увеличь масштаб страницы в браузере (ctrl + колесо).
А за помощь с пекбором кВ признателен. Как будет время обязательно постараюсь понять принцип работы.
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
ОффтопПродолжаю варварство: :biggrin:
PHP:
new iZonesCount;

public void OnConfigsExecuted(){
    ...
    char MapName[32];
    GetCurrentMap(MapName, sizeof(MapName));

    KvRewind(kvMapLimit);
    if(KvJumpToKey(kvMapLimit, MapName, false)){
        int i;
        for (i = 0; i < sizeof(MZones); ++i){
            FormatEx(MapName, sizeof(MapName), "Zone_i", i);
            MZones[i][0] = '\0';
            KvGetString(kvMapLimit, MapName, MZones[i], PLATFORM_MAX_PATH);
            if (MZones[i][0] == '\0') break;
        }
        iZonesCount = i;
        IsCorrectMap = true;
    }
}
И тогда плюс наблюдаем:
C-подобный:
for (i = 0; i < sizeof(MZones); ++i){
if ((StrEqual(location, MZones[i])) && !SpawnProtect)
Заменяя на:
PHP:
for (int i = 0; i < iZonesCount; ++i)
Оффтоп
Для простого понимания и лёгкого развития)

Я тогда запишусь в клуб варваров и убери переменную i))
PHP:
new iZonesCount;

public void OnConfigsExecuted(){
    ...
    char MapName[32];
    GetCurrentMap(MapName, sizeof(MapName));
    KvRewind(kvMapLimit);
    if(KvJumpToKey(kvMapLimit, MapName, false)){
        for (iZonesCount = 0; iZonesCount < sizeof(MZones); ++iZonesCount){
            FormatEx(MapName, sizeof(MapName), "Zone_%i", iZonesCount);
            MZones[iZonesCount][0] = '\0';
            KvGetString(kvMapLimit, MapName, MZones[iZonesCount], PLATFORM_MAX_PATH);
            if (MZones[iZonesCount][0] == '\0') break;
        }
        IsCorrectMap = true;
    }
}

Какие же мы плохие парни.
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Двойка вам за подобный совет, сударь. Разве вам не говорили, что применять глобальные переменные в качестве счётчика цикла - плохо?
Кто не умеет рисковать, тот не пьёт шампанского. Видимо, вы вообще не пьющий.
 

AlmazON

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

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Оффтоп Для общего развития просто скажу, что в некоторых языках программирования, если указать глобальную переменную в качестве счётчика цикла, то компилятор выдаст предупреждение. Оффтоп
В данном случае переменная изменяется в одном единственном месте. Так что никакого риска конкретно в данной ситуации не существует. И действовать так не будет ошибочно.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
@filipok, набросал всё то, о чём я говорил (или почти). Ошибки и неточности не исключены - доработка за тобой) Оффтоп В частности, добавь механизм отключения наказаний до конца раунда, когда выходит последний игрок, после того, как должно "не пускать" на запрещенные места. А то получается следующая ситуация:
игроков много, плагин пускает кого-то на запрещённую зону и неожиданно один-два игрока вышли/вылетели и в итоге невезучих "настигнет кара серверная", хотя они и не виноваты.
С ботами неадекватно потом подсчитывает - только для серверов с людьми. Считает только играющих (наблюдатели и подключающиеся игнорируются).
И те таймеры мне не понравились, сделал довольно просто: если вступил в запретную зону и не выходишь (пусть даже игрок просто в ней стоит), то его всё равно разоружит через время STRIP_TIME.
В целом, работает.
 

Вложения

  • MapLimit.sp
    5.2 КБ · Просмотры: 24
Сверху Снизу