Не работает цикл....

Тема в разделе "Программирование / Скриптинг", создана пользователем filipok, 23 фев 2016.

  1. filipok

    filipok

    Сообщения:
    73
    Симпатии:
    8
    Доброго времени суток, друзья.
    Чего хочу добиться: получаем зону карты, в которой находится игрок, если она совпадает с любой из зон, указанной в массиве de_dust2[] ---> поджигаем игрока.
    Но не получается ничего. Цикл не срабатывает. Код выполняется только в отношении первой ячейки массива de_dust2[] ("OutsideTunnel"). Т.е. при нахождении игрока на зонах карты кроме "OutsideTunnel" ничего не происходит. Игрок горит только находясь в зоне "OutsideTunnel".
    PHP:
    static String:de_dust2[] = {
        
    "OutsideTunnel",
        
    "UpperTunnel",
        
    "LowerTunnel",
        
    "Middle",
        
    "MidDoors",
        
    "BDoors"
    };


    public 
    void OnClientPostAdminCheck(int client){
        if(
    IsCorrectMap && !IsFakeClient(client)){
            
    SDKHook(clientSDKHook_PostThinkPostOnPostThinkPost);
            
    CountPlayers GetClientCount();
        }
    }

    public 
    void OnPostThinkPost(int client){
        static 
    String:location[16];
        
    GetEntPropString(clientProp_Send"m_szLastPlaceName"locationsizeof(location));
        if( 
    CountPlayers MAX_PLAYERS_WHITHOUT_MIDDLE ){
            for (new 
    0sizeof(de_dust2); i++){
                if (
    StrEqual(locationde_dust2[i])){
                    
    PrintToChat(client"Не ходи на Б!!!");
                    if(
    IsPlayerAlive(client)) IgniteEntity(client3.8);
                }
            }
        }
    }

    PHP:
    public void OnClientPostAdminCheck(int client){
        if(
    IsCorrectMap && !IsFakeClient(client)){
            
    SDKHook(clientSDKHook_PostThinkPostOnPostThinkPost);
            
    CountPlayers GetClientCount();
        }
    }
    public 
    void OnPostThinkPost(int client){
        static 
    String:location[16];
        
    GetEntPropString(clientProp_Send"m_szLastPlaceName"locationsizeof(location));
        if( 
    CountPlayers MAX_PLAYERS_WHITHOUT_MIDDLE ){
            if((
    StrEqual(location"OutsideTunnel")) || (StrEqual(location"MidDoors")) || (StrEqual(location"BDoors")) || (StrEqual(location"LowerTunnel")) || (StrEqual(location"UpperTunnel")) || (StrEqual(location"BombsiteB"))){
                
    PrintToChat(client"Не ходи на Б!!!");
                if(
    IsPlayerAlive(client)) IgniteEntity(client10.8);
            }
        }
    }

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

    #define MAX_PLAYERS_WHITHOUT_MIDDLE        10

    static String:de_dust2[] = {
        
    "OutsideTunnel",
        
    "UpperTunnel",
        
    "LowerTunnel",
        
    "Middle",
        
    "MidDoors",
        
    "BDoors"
    };

    new 
    bool:OneTimeNotify;
    new 
    bool:IsCorrectMap;
    new 
    CountPlayers;

    public 
    Plugin myinfo = {name PLUGIN_MAINNAMEauthor PLUGIN_AUTHORversion PLUGIN_VERSION}
    public 
    OnPluginStart()
    {
        
    HookEvent("round_freeze_end"Event_RoundFreezeEndEventHookMode_PostNoCopy);
        
    RegAdminCmd("sm_place"WhereAmIADMFLAG_BAN);
    }

    public 
    OnConfigsExecuted(){
        
    decl String:mapname[32];
        
    GetCurrentMap(mapnamesizeof(mapname));
        
    IsCorrectMap StrEqual(mapname"de_dust2");
    }
    //////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////CheckZoneNameComand (for test)/////////////////////////////////////////////////////
    public Action:WhereAmI(int clientargs){
       
        
    decl String:location[32];
        
    GetEntPropString(clientProp_Send"m_szLastPlaceName"locationsizeof(location));
        
    ReplyToCommand(client"%N is in %s"clientlocation);
        
    LogMessage("client %N is in %s"clientlocation);
    }
    //////////////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////

    public void OnClientPostAdminCheck(int client){
        if(
    IsCorrectMap && !IsFakeClient(client)){
            
    SDKHook(clientSDKHook_PostThinkPostOnPostThinkPost);
            
    CountPlayers GetClientCount();
        }
    }

    public 
    void OnPostThinkPost(int client){
        static 
    String:location[16];
        
    GetEntPropString(clientProp_Send"m_szLastPlaceName"locationsizeof(location));
        if( 
    CountPlayers MAX_PLAYERS_WHITHOUT_MIDDLE ){
            for (new 
    0sizeof(de_dust2); i++){
                if (
    StrEqual(locationde_dust2[i])){
                    
    PrintToChat(client"Не ходи на Б!!!");
                    if(
    IsPlayerAlive(client)) IgniteEntity(client3.8);
                }
            }
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////оповещения вначале раунда///////////////////////////////////////////////

    public Event_RoundFreezeEnd(Handle:event, const String:name[], bool:dontBroadcast) {
        if ( 
    IsCorrectMap ) {
            if (
    GetClientCount() < MAX_PLAYERS_WHITHOUT_MIDDLE){
                
    PrintHintTextToAll("Проходы на Б и мидл запрещены, на сервере менее %d игроков"MAX_PLAYERS_WHITHOUT_MIDDLE);
                
    OneTimeNotify true;
            }
            else if (
    OneTimeNotify){
                
    PrintHintTextToAll("Играет полная карта");
                
    OneTimeNotify false;
            }
        }
    }

    Где я ошибся?
     
  2. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.005
    Симпатии:
    2.994
    замени на
    PHP:
    new const String:de_dust2[][] = {
        
    "OutsideTunnel",
        
    "UpperTunnel",
        
    "LowerTunnel",
        
    "Middle",
        
    "MidDoors",
        
    "BDoors"
    };
    И используй char, раз уже новый синтаксис
     
  3. filipok

    filipok

    Сообщения:
    73
    Симпатии:
    8
    @R1KO , спасибо, но эффекта это не дало. Проблема осталась.
    --- Добавлено позже ---
    Может проблема заключаться в том, что OnPostThinkPost вызывается слишком часто и цикл просто не успевает перебрать все варианты?
    --- Добавлено позже ---
    Цикл каждый раз запускается заново
     
    Последнее редактирование: 23 фев 2016
  4. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.005
    Симпатии:
    2.994
    @filipok, так попробуй (+ добавил вывод в лог)
    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 "0.0.9"

    #define MAX_PLAYERS_WHITHOUT_MIDDLE        10

    char de_dust2[][] = {
        
    "OutsideTunnel",
        
    "UpperTunnel",
        
    "LowerTunnel",
        
    "Middle",
        
    "MidDoors",
        
    "BDoors"
    };

    bool    OneTimeNotify;
    bool    IsCorrectMap;
    int        CountPlayers;

    public 
    Plugin myinfo = {name PLUGIN_MAINNAMEauthor PLUGIN_AUTHORversion PLUGIN_VERSION}
    public 
    void OnPluginStart()
    {
        
    HookEvent("round_freeze_end"Event_RoundFreezeEndEventHookMode_PostNoCopy);
        
    RegAdminCmd("sm_place"WhereAmIADMFLAG_BAN);
    }

    public 
    void OnConfigsExecuted(){
        
    char mapname[32];
        
    GetCurrentMap(mapnamesizeof(mapname));
        
    IsCorrectMap StrEqual(mapname"de_dust2");
    }
    //////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////CheckZoneNameComand (for test)/////////////////////////////////////////////////////
    public Action WhereAmI(int clientint args){

        
    char location[32];
        
    GetEntPropString(clientProp_Send"m_szLastPlaceName"locationsizeof(location));
        
    ReplyToCommand(client"%N is in %s"clientlocation);
        
    LogMessage("client %N is in %s"clientlocation);
    }
    //////////////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////

    public void OnClientPostAdminCheck(int client){
        if(
    IsCorrectMap && !IsFakeClient(client)){
            
    SDKHook(clientSDKHook_PostThinkPostOnPostThinkPost);
            
    CountPlayers GetClientCount();
        }
    }

    public 
    void OnPostThinkPost(int client){
        if(
    IsPlayerAlive(client))
        {
            static 
    char location[16];
            static 
    int i;
            
    GetEntPropString(clientProp_Send"m_szLastPlaceName"locationsizeof(location));
            
    LogMessage("m_szLastPlaceName: %s"location);
            if( 
    CountPlayers MAX_PLAYERS_WHITHOUT_MIDDLE ){
                for (
    0sizeof(de_dust2); ++i){
                    
    LogMessage("StrEqual: %s-%s -> %b"locationde_dust2[i], StrEqual(locationde_dust2[i]));
                    if (
    StrEqual(locationde_dust2[i])){
                        
    PrintToChat(client"Не ходи на Б!!!");
                        
    IgniteEntity(client3.8);
                        return;
                    }
                }
            }
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////оповещения вначале раунда///////////////////////////////////////////////

    public Event_RoundFreezeEnd(Handle:event, const String:name[], bool:dontBroadcast) {
        if ( 
    IsCorrectMap ) {
            if (
    GetClientCount() < MAX_PLAYERS_WHITHOUT_MIDDLE){
                
    PrintHintTextToAll("Проходы на Б и мидл запрещены, на сервере менее %d игроков"MAX_PLAYERS_WHITHOUT_MIDDLE);
                
    OneTimeNotify true;
            }
            else if (
    OneTimeNotify){
                
    PrintHintTextToAll("Играет полная карта");
                
    OneTimeNotify false;
            }
        }
    }
     
  5. filipok

    filipok

    Сообщения:
    73
    Симпатии:
    8
    @R1KO, спасибо вам огромное, все заработало как часики. return, вот что было нужно в конце цикла.
    L 02/23/2016 - 19:31:48: [MapLimit.smx] m_szLastPlaceName: LowerTunnel
    L 02/23/2016 - 19:31:48: [MapLimit.smx] StrEqual: LowerTunnel-OutsideTunnel -> 0
    L 02/23/2016 - 19:31:48: [MapLimit.smx] StrEqual: LowerTunnel-UpperTunnel -> 0
    L 02/23/2016 - 19:31:48: [MapLimit.smx] StrEqual: LowerTunnel-LowerTunnel -> 1
     
  6. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.005
    Симпатии:
    2.994
    @filipok, лог можешь убрать
     
    filipok нравится это.