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

filipok

Участник
Сообщения
72
Реакции
28
Доброго времени суток, друзья.
Чего хочу добиться: получаем зону карты, в которой находится игрок, если она совпадает с любой из зон, указанной в массиве 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(client, SDKHook_PostThinkPost, OnPostThinkPost);
        CountPlayers = GetClientCount();
    }
}

public void OnPostThinkPost(int client){
    static String:location[16];
    GetEntPropString(client, Prop_Send, "m_szLastPlaceName", location, sizeof(location));
    if( CountPlayers < 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);
            }
        }
    }
}

PHP:
public void OnClientPostAdminCheck(int client){
    if(IsCorrectMap && !IsFakeClient(client)){
        SDKHook(client, SDKHook_PostThinkPost, OnPostThinkPost);
        CountPlayers = GetClientCount();
    }
}
public void OnPostThinkPost(int client){
    static String:location[16];
    GetEntPropString(client, Prop_Send, "m_szLastPlaceName", location, sizeof(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(client, 10.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_MAINNAME, author = PLUGIN_AUTHOR, version = PLUGIN_VERSION}
public OnPluginStart()
{
    HookEvent("round_freeze_end", Event_RoundFreezeEnd, EventHookMode_PostNoCopy);
    RegAdminCmd("sm_place", WhereAmI, ADMFLAG_BAN);
}

public OnConfigsExecuted(){
    decl String:mapname[32];
    GetCurrentMap(mapname, sizeof(mapname));
    IsCorrectMap = StrEqual(mapname, "de_dust2");
}
//////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////CheckZoneNameComand (for test)/////////////////////////////////////////////////////
public Action:WhereAmI(int client, args){
   
    decl String: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 OnClientPostAdminCheck(int client){
    if(IsCorrectMap && !IsFakeClient(client)){
        SDKHook(client, SDKHook_PostThinkPost, OnPostThinkPost);
        CountPlayers = GetClientCount();
    }
}

public void OnPostThinkPost(int client){
    static String:location[16];
    GetEntPropString(client, Prop_Send, "m_szLastPlaceName", location, sizeof(location));
    if( CountPlayers < 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);
            }
        }
    }
}
////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////оповещения вначале раунда///////////////////////////////////////////////

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;
        }
    }
}

Где я ошибся?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
PHP:
static String:de_dust2[] = {
    "OutsideTunnel",
    "UpperTunnel",
    "LowerTunnel",
    "Middle",
    "MidDoors",
    "BDoors"
};
замени на
PHP:
new const String:de_dust2[][] = {
    "OutsideTunnel",
    "UpperTunnel",
    "LowerTunnel",
    "Middle",
    "MidDoors",
    "BDoors"
};
И используй char, раз уже новый синтаксис
 

filipok

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

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #4
@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_MAINNAME, author = PLUGIN_AUTHOR, version = PLUGIN_VERSION}
public void OnPluginStart()
{
    HookEvent("round_freeze_end", Event_RoundFreezeEnd, EventHookMode_PostNoCopy);
    RegAdminCmd("sm_place", WhereAmI, ADMFLAG_BAN);
}

public void OnConfigsExecuted(){
    char mapname[32];
    GetCurrentMap(mapname, sizeof(mapname));
    IsCorrectMap = StrEqual(mapname, "de_dust2");
}
//////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////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 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(de_dust2); ++i){
                LogMessage("StrEqual: %s-%s -> %b", location, de_dust2[i], StrEqual(location, de_dust2[i]));
                if (StrEqual(location, de_dust2[i])){
                    PrintToChat(client, "Не ходи на Б!!!");
                    IgniteEntity(client, 3.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;
        }
    }
}
 

filipok

Участник
Сообщения
72
Реакции
28
@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
 
Сверху Снизу