Дабы априори избежать циклов, можно, при создании динамической зоны, записывать некоторую дополнительную информацию о ней в отдельный массив данных (в данном случае - закреплена ли зона за каким-либо бизнесом и, если да - то является ли эта зона входом, либо выходом).
Примерный вариант (не тестировал):
PHP код:
/*
Definitions
*/
#define INVALID_BUSINESS_ID (-1)
#define AREA_BUSINESS_STATUS_ENTRANCE (0)
#define AREA_BUSINESS_STATUS_EXIT (1)
/*
Global variables
*/
enum E_DYNAMIC_AREA_DATA
{
area_bussiness_id,
area_bussiness_status
}
new
gDynamicAreaExtraData[/*кол-во зон*/][E_DYNAMIC_AREA_DATA]; // заполнять информацию при создании зон
new
gPlayerCurrentDynamicAreaId[MAX_PLAYERS] = {INVALID_DYNAMIC_AREA_ID, ...};
/*
Publics
*/
public OnPlayerEnterDynamicArea(playerid, areaid)
{
gPlayerCurrentDynamicAreaId[playerid] = areaid;
return 1;
}
public OnPlayerLeaveDynamicArea(playerid, areaid)
{
gPlayerCurrentDynamicAreaId[playerid] = INVALID_DYNAMIC_AREA_ID;
return 1;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(newkeys & KEY_WALK)
{
new
player_dynamic_area_id = gPlayerCurrentDynamicAreaId[playerid];
if(player_dynamic_area_id != INVALID_DYNAMIC_AREA_ID)
{
if(gDynamicAreaExtraData[player_dynamic_area_id][area_bussiness_id] != INVALID_BUSINESS_ID)
{
new
dynamic_area_business_status = gDynamicAreaExtraData[player_dynamic_area_id][area_bussiness_status];
// ID бизнеса указан в структуре динамических зон, так что получать координаты входа/выхода не сосавит труда
if(dynamic_area_business_status == AREA_BUSINESS_STATUS_ENTRANCE)
{
// вход
return 1;
}
else if(dynamic_area_business_status == AREA_BUSINESS_STATUS_EXIT)
{
// elise if дабы избежать возможных ошибок в коде (присвоение значения отличного от 0 или 1)
// выход
return 1;
}
}
}
}
return 1;
}