Русское сообщество по скриптингу

set objects. remove в следующем раунде

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

set objects. remove в следующем раунде

Сообщение Marsh » 12 авг 2019, 16:47

Не могу понять, как сделать так, чтобы в следующем раунде убирались все объекты. Помогите пожалуйста.
Код: Выделить всё
#define _obj_block_natives

#include amxmodx
#include hamsandwich
#include fakemeta_util
#include objects

#define is_msg_valid(%0)                    (%0 && %0[0] != ';' && %0[0] != '/' && %0[0] != '#')

enum _:DATA_OBJECTS {
    
OBJ_NAME    [67],
    
OBJ_MODEL    [256],
    
OBJ_SIZE    [256],
    
OBJ_CLASS    [33]
};

enum _:DATA_FORWARDS {
    
FWD_ENTITY_TOUCH,
    
FWD_ENTITY_CREATE,
    
FWD_RESULT
};

enum _:DATA_OBJECT_LIST {
    
ORIGIN_X[10], ORIGIN_Y[10], ORIGIN_Z[10],
    
ANGLES_P[10], ANGLES_Y[10], ANGLES_R[10],
    
OBJ_INDEX[10], OBJ_SEQ[10], OBJ_SOLID[10]
};

enum _:DATA_BASE {
    
BASE_ENTITY,
    
BASE_INDEX
};

enum DATA_PLAYERS {
    
OBJECTOPTIONSUSER_ENTITYUSER_SOLID
};

new Array:
g_iArrayObjectsg_iObjects[DATA_OBJECTS];
new Array:
g_iArrayBaseg_iBase[DATA_BASE], g_iForwards[DATA_FORWARDS];
new Array:
g_iArrayBaseListg_iObjectsList[DATA_OBJECT_LIST];
new 
g_iPlayers[33][DATA_PLAYERS], g_iMenuPosition[33], g_iMenuList[33][128], g_iMaxPlayers;

public 
plugin_precache () {
    
g_iArrayObjects ArrayCreate (DATA_OBJECTS);
    
g_iArrayBase ArrayCreate (DATA_BASE);
    
    new 
szBuffer[512], iFile fopen ("/addons/amxmodx/configs/objects.ini""rt");
    
    while (!
feof(iFile)) {
        
fgets (iFileszBuffer511);
        
        if (
is_msg_valid(szBuffer) && parse(szBufferg_iObjects[OBJ_NAME], 66g_iObjects[OBJ_MODEL], 66g_iObjects[OBJ_SIZE], 255g_iObjects[OBJ_CLASS], 32)) {
            
format (g_iObjects[OBJ_MODEL], 255"models/objects/%s.mdl"g_iObjects[OBJ_MODEL]);
            
engfunc(EngFunc_PrecacheModelg_iObjects[OBJ_MODEL]);
            
            
ArrayPushArray (g_iArrayObjectsg_iObjects);
        }
    }
    
    return 
fclose (iFile);
}

public 
plugin_init () {
    
register_plugin ("Set Objects""A2-U2""OverGame");
    
register_dictionary ("objects.txt");
    
    
register_cvar ("objects_access",        "l");
    
register_cvar ("objects_gmode",            "1");
    
register_cvar ("objects_noclip",        "1");
    
register_cvar ("objects_frame_rand",    "1");
    
    
register_menucmd (register_menuid("Show_ObjMainMenu"), (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<9), "Handle_ObjMainMenu");
    
register_menucmd (register_menuid("Show_ObjectsMenu"), (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9), "Handle_ObjectsMenu");
    
    
register_clcmd ("objects""ClCmd_SayObjects");
    
register_clcmd ("say /objects""ClCmd_SayObjects");
    
register_clcmd ("say_team /objects""ClCmd_SayObjects");
    
register_clcmd ("set_obj""ClCmd_SayObjects");
    
register_clcmd ("say /set_obj""ClCmd_SayObjects");
    
register_clcmd ("say_team /set_obj""ClCmd_SayObjects");
    
    
g_iMaxPlayers get_maxplayers ();
    
g_iForwards[FWD_ENTITY_TOUCH]    = CreateMultiForward("player_touch_object"ET_CONTINUEFP_CELLFP_CELL);
    
g_iForwards[FWD_ENTITY_CREATE]    = CreateMultiForward("creating_object",        ET_CONTINUEFP_CELLFP_CELLFP_CELLFP_CELL);
}

public 
client_putinserver (iPlayerg_iPlayers[iPlayer][OPTIONS]        = false;
public 
ClCmd_SayObjects (iPlayer) {
    new 
szFlags[27];
    
get_cvar_string("objects_access"szFlags26);
    
    if    (
get_user_flags(iPlayer) & read_flags(szFlags)) {
        
Show_ObjMainMenu (iPlayer);
    }
    else {
        
client_printc (iPlayer"%L"iPlayer"OBJ_SAY_ID_NOT_ACCESS");
    }
    
    return 
PLUGIN_HANDLED;
}

public 
plugin_cfg () {
    
g_iArrayBaseList ArrayCreate (DATA_OBJECT_LIST);
    
    new 
szMapname[32], szDirection[256];
    
get_mapname (szMapname31);
    
format (szDirection255"/addons/amxmodx/logs/objects/%s.ini"szMapname);
    
    new 
szBuffer[512], iFile fopen (szDirection"rt");
    
    if (
iFile) {
        while (!
feof(iFile)) {
            
fgets (iFileszBuffer512);
            
            if (
is_msg_valid(szBuffer) && parse(szBufferg_iObjectsList[ORIGIN_X], 9g_iObjectsList[ORIGIN_Y], 9g_iObjectsList[ORIGIN_Z], 9g_iObjectsList[ANGLES_P], 9g_iObjectsList[ANGLES_Y], 9g_iObjectsList[ANGLES_R], 9g_iObjectsList[OBJ_INDEX], 9g_iObjectsList[OBJ_SOLID], 9g_iObjectsList[OBJ_SEQ], 9)) {
                
ArrayPushArray (g_iArrayBaseListg_iObjectsList);
            }
        }
        
        
Cmd_Load_Objects ();
    }
    else {
        
log_amx ("Объекты не загружены! Файл отсутствует.");
    }
    
    return 
fclose (iFile);
}

public 
Show_ObjMainMenu (iPlayer) {
    new 
szMenu[512], iKeys = (1<<0|1<<3|1<<4|1<<5|1<<9), iLen format (szMenu511"%L"iPlayer"OBJ_MENU_MAIN_TITLE");
    
    
iLen += format (szMenu[iLen], 511 iLen"%L \w%L"iPlayer"OBJ_MENU_PAGE"1iPlayer"OBJ_MENU_MAIN_SET");
    
    if (
ArraySize(g_iArrayObjects)) {
        
iLen += format (szMenu[iLen], 511 iLen"%L \w%L"iPlayer"OBJ_MENU_PAGE"2iPlayer"OBJ_MENU_MAIN_NEW");
        
iKeys |= (1<<1);
    }
    else 
iLen += format (szMenu[iLen], 511 iLen"%L \d%L"iPlayer"OBJ_MENU_PAGE"2iPlayer"OBJ_MENU_MAIN_NEW");
    
    if (
ArraySize(g_iArrayBase)) {
        
iLen += format (szMenu[iLen], 511 iLen"%L \w%L"iPlayer"OBJ_MENU_PAGE"3iPlayer"OBJ_MENU_MAIN_DEL");
        
iKeys |= (1<<2);
    }
    else 
iLen += format (szMenu[iLen], 511 iLen"%L \d%L"iPlayer"OBJ_MENU_PAGE"3iPlayer"OBJ_MENU_MAIN_DEL");
    
    
    switch (
g_iPlayers[iPlayer][USER_SOLID]) {
        case 
SOLID_NOT:            iLen += format (szMenu[iLen], 511 iLen"%L \w%L"iPlayer"OBJ_MENU_PAGE"5iPlayer"OBJ_MENU_MAIN_SOLID"iPlayer"OBJ_SOLID_NOT");
        case 
SOLID_TRIGGER:        iLen += format (szMenu[iLen], 511 iLen"%L \w%L"iPlayer"OBJ_MENU_PAGE"5iPlayer"OBJ_MENU_MAIN_SOLID"iPlayer"OBJ_SOLID_TRIGGER");
        case 
SOLID_BBOX:        iLen += format (szMenu[iLen], 511 iLen"%L \w%L"iPlayer"OBJ_MENU_PAGE"5iPlayer"OBJ_MENU_MAIN_SOLID"iPlayer"OBJ_SOLID_BBOX");
        case 
SOLID_SLIDEBOX:    iLen += format (szMenu[iLen], 511 iLen"%L \w%L"iPlayer"OBJ_MENU_PAGE"5iPlayer"OBJ_MENU_MAIN_SOLID"iPlayer"OBJ_SOLID_SLIDEBOX");
    }
    
    
format (szMenu[iLen], 511 iLen"%L \w%L"iPlayer"OBJ_MENU_PAGE"0iPlayer"OBJ_MENU_EXIT");
    return 
show_menu (iPlayeriKeysszMenu, -1"Show_ObjMainMenu");
}

public 
Handle_ObjMainMenu (iPlayeriKey) {
    switch (
iKey) {
        case 
0: {
            new 
Float:fOrigin[3];
            
fm_get_aim_origin(iPlayerfOrigin);
            
            
UTIL_Create_Object (fOrigin_g_iPlayers[iPlayer][OBJECT], _g_iPlayers[iPlayer][USER_SOLID]);
        }
        case 
1: return Show_ObjectsMenu (iPlayer0);
        case 
2: {
            new 
iBase ArraySize(g_iArrayBase)-1;
            
ArrayGetArray (g_iArrayBaseiBaseg_iBase);
            
            if (
fm_is_valid_ent(g_iBase[BASE_ENTITY])) {
                
fm_remove_entity (g_iBase[BASE_ENTITY]);
                
ArrayDeleteItem (g_iArrayBaseiBase);
            }
        }
        case 
3: {
            switch (
g_iPlayers[iPlayer][USER_SOLID]) {
                case 
3:        g_iPlayers[iPlayer][USER_SOLID] = 0;
                default:    
g_iPlayers[iPlayer][USER_SOLID]++;
            }
        }
        default: return 
PLUGIN_HANDLED;
    }
    
    return 
Show_ObjMainMenu (iPlayer);
}

Show_ObjectsMenu (iPlayeriPos) {
    if(
iPos 0) return PLUGIN_HANDLED;
    
    new 
iItemNums;
    for(new 
iArraySize(g_iArrayObjects); i++) g_iMenuList[iPlayer][iItemNums++] = i;
    
    new 
iStart iPos 8;
    if(
iStart iItemNumsiStart iItemNums;
    
iStart iStart - (iStart 8);
    
g_iMenuPosition[iPlayer] = iStart 8;
    new 
iEnd iStart 8;
    if(
iEnd iItemNumsiEnd iItemNums;
    new 
szMenu[512], iLeniPagesNum = (iItemNums + ((iItemNums 8) ? 0));
    
    switch (
iPagesNum) {
        case 
0: return PLUGIN_HANDLED;
        default: 
iLen formatex(szMenucharsmax(szMenu), "%L"iPlayer"OBJ_MENU_ITEMS_TITLE"iPos 1iPagesNum);
    }
    
    new 
iKeys = (1<<9), b;
    for (new 
iStartiEnda++)
    {
        
ArrayGetArray (g_iArrayObjectsg_iMenuList[iPlayer][a], g_iObjects);
        
        
iKeys |= (1<<b);
        
iLen += format (szMenu[iLen], 511 iLen"%L \w%s^n"iPlayer"OBJ_MENU_PAGE", ++bg_iObjects[OBJ_NAME]);
    }
    
    for(new 
b8i++) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen"^n");
    if(
iEnd iItemNums)
    {
        
iKeys |= (1<<8);
        
formatex(szMenu[iLen], charsmax(szMenu) - iLen"^n%L \w%L^n%L \w%L"iPlayer"OBJ_MENU_PAGE"9iPlayer"OBJ_MENU_NEXT"iPlayer"OBJ_MENU_PAGE"0iPlayeriPos "OBJ_MENU_BACK" "OBJ_MENU_EXIT");
    }
    else 
formatex(szMenu[iLen], charsmax(szMenu) - iLen"^n^n%L \w%L"iPlayer"OBJ_MENU_PAGE"0iPlayeriPos "OBJ_MENU_BACK" "OBJ_MENU_EXIT");
    return 
show_menu(iPlayeriKeysszMenu, -1"Show_ObjectsMenu");
}

public 
Handle_ObjectsMenu (iPlayeriKey) {
    switch(
iKey)
    {
        case 
8: return Show_ObjectsMenu(iPlayer, ++g_iMenuPosition[iPlayer]);
        case 
9: return Show_ObjectsMenu(iPlayer, --g_iMenuPosition[iPlayer]);
        default: {
            
g_iPlayers[iPlayer][OBJECT] = g_iMenuList[iPlayer][g_iMenuPosition[iPlayer] * iKey];
            
Show_ObjMainMenu (iPlayer);
        }
    }
    
    return 
PLUGIN_HANDLED;
}

public 
Cmd_Save_Objects () {
    new 
szString[512], szMapname[32], szDirection[256], Float:fOrigin[3], Float:fAngles[3];
    
    
get_mapname (szMapname31);
    
format (szDirection255"addons/amxmodx/logs/objects/%s.ini"szMapname);
    if (
file_exists(szDirection)) delete_file(szDirection);
    
    for (new 
iArraySize(g_iArrayBase); i++) {
        
ArrayGetArray (g_iArrayBaseig_iBase);
        
        
pev (g_iBase[BASE_ENTITY], pev_originfOrigin);
        
pev (g_iBase[BASE_ENTITY], pev_anglesfAngles);
        
        
format (szString511"^"%f^" ^"%f^" ^"%f^" ^"%f^" ^"%f^" ^"%f^" ^"%d^" ^"%d^" ^"%d^""fOrigin[0], fOrigin[1], fOrigin[2], fAngles[0], fAngles[1], fAngles[2], g_iBase[BASE_INDEX], pev(g_iBase[BASE_ENTITY], pev_solid), pev(g_iBase[BASE_ENTITY], pev_sequence));
        
write_file (szDirectionszString, -1);
    }
    
    return 
PLUGIN_HANDLED;
}

public 
Cmd_Load_Objects () {
    new 
Float:fOrigin[3], Float:fAngles[3];
    new 
iObjIdiSeqiSolid;
    
    for (new 
iArraySize (g_iArrayBaseList); i++) {
        
ArrayGetArray (g_iArrayBaseListig_iObjectsList);
        
        
fOrigin[0]    = str_to_float (g_iObjectsList[ORIGIN_X]);
        
fOrigin[1]    = str_to_float (g_iObjectsList[ORIGIN_Y]);
        
fOrigin[2]    = str_to_float (g_iObjectsList[ORIGIN_Z]);
        
        
fAngles[0]    = str_to_float (g_iObjectsList[ANGLES_P]);
        
fAngles[1]    = str_to_float (g_iObjectsList[ANGLES_Y]);
        
fAngles[2]    = str_to_float (g_iObjectsList[ANGLES_R]);
        
        
iObjId        str_to_num(g_iObjectsList[OBJ_INDEX]);
        
iSeq        str_to_num(g_iObjectsList[OBJ_SEQ]);
        
        switch (
str_to_num(g_iObjectsList[OBJ_SOLID])) {
            case 
1iSolid SOLID_TRIGGER;
            case 
2iSolid SOLID_BBOX;
            case 
3iSolid SOLID_SLIDEBOX;
            default: 
iSolid SOLID_NOT;
        }
        
        
UTIL_Create_Object (fOriginfAnglesiObjIdiSeqiSolid);
    }
}

public 
Ham_PlayerTouch (iEntityiPlayer) {
    if (
is_user_alive(iPlayer)) {
        
        
        if (
g_iPlayers[iPlayer][OPTIONS]) {
            new 
iButton pev (iPlayerpev_button);
            
            if (
iButton IN_LEFT || iButton IN_RIGHT) {
                new 
Float:fAngles[3];
                
pev (iEntitypev_anglesfAngles);
                
                switch (
iButton) {
                    case 
IN_LEFT:    fAngles[1] += 1.0;
                    case 
IN_RIGHT:    fAngles[1] -= 1.0;
                }
                
                
set_pev (iEntitypev_anglesfAngles);
            }
            
            if (
iButton IN_USE || iButton IN_DUCK) {
                new 
Float:fOrigin[3];
                
pev (iEntitypev_originfOrigin);
                
                switch (
iButton) {
                    case 
IN_USE:    fOrigin[2] += 0.1;
                    case 
IN_DUCK:    fOrigin[2] -= 0.1;
                }
                
                
set_pev (iEntitypev_originfOrigin);
            }
        }
        
        
ExecuteForward(g_iForwards[FWD_ENTITY_TOUCH], g_iForwards[FWD_RESULT], iPlayeriEntity);
    }
}

public 
plugin_natives () {
    
register_native ("obj_register",    "obj_register",        true);
    
register_native ("obj_remove",        "obj_remove",        true);
    
register_native ("obj_create",        "obj_create",        true);
    
register_native ("obj_show_menu",    "obj_show_menu",    true);
}

public 
obj_show_menu (iPlayeriMenuiPosition) {
    if (!
is_user_connected(iPlayer)) return false;
    
    switch (
iMenu) {
        case 
MENU_MAIN:        return Show_ObjMainMenu (iPlayer);
        case 
MENU_OBJECTS:    return Show_ObjectsMenu (iPlayeriPosition);
    }
    
    return 
false;
}

public 
obj_register (const szName[], const szModel[], const szSize[], const szClassname[]) {
    
param_convert(1);
    
param_convert(2);
    
param_convert(3);
    
param_convert(4);
    
    
copy (g_iObjects[OBJ_NAME],        66,        szName);
    
copy (g_iObjects[OBJ_MODEL],    255,    szModel);
    
copy (g_iObjects[OBJ_SIZE],        255,    szSize);
    
copy (g_iObjects[OBJ_CLASS],    32,        szClassname);
    
    
ArrayPushArray (g_iArrayObjectsg_iObjects);
    return (
ArraySize(g_iArrayObjects) - 1);
}

public 
obj_remove (iObject) {
    return 
ArrayDeleteItem (g_iArrayObjectsiObject);
}

public 
obj_create (Float:fOrigin[3], Float:fAngles[3], iObjectiSeqiSolid) {
    return 
UTIL_Create_Object (fOriginfAnglesiObjectiSeqiSolid);
}

bool:UTIL_Create_Object (Float:fOrigin[3], Float:fAngles[3] = {0.00.00.0}, iObjectiSeq 0iSolid 2) {
    new 
szEntitySize[6][128], iEntity engfunc (EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"info_target"));
    if (!
fm_is_valid_ent(iEntity)) return false;
    
    
RegisterHamFromEntity(Ham_TouchiEntity"Ham_PlayerTouch");
    
ArrayGetArray (g_iArrayObjectsiObjectg_iObjects);
    
    
set_pev (iEntitypev_originfOrigin);
    
set_pev (iEntitypev_anglesfAngles);
    
set_pev (iEntitypev_classnameg_iObjects[OBJ_CLASS]);
    
set_pev (iEntitypev_solidiSolid);
    
set_pev (iEntitypev_movetypeMOVETYPE_NONE);
    
set_pev (iEntitypev_sequenceiSeq);
    
set_pev (iEntitypev_framerateget_cvar_num ("objects_frame_rand") ? random_float(1.05.0) : 1.0);
    
set_pev (iEntitypev_nextthinkget_gametime() + 1.0);
    
    
engfunc (EngFunc_SetModeliEntityg_iObjects[OBJ_MODEL]);
    
    
parse (g_iObjects[OBJ_SIZE], szEntitySize[0], 127szEntitySize[1], 127szEntitySize[2], 127szEntitySize[3], 127szEntitySize[4], 127szEntitySize[5], 127);
    
    new 
Float:fSizeBot[3], Float:fSizeTop[3];
    
fSizeBot[0] = str_to_float(szEntitySize[0]);
    
fSizeBot[1] = str_to_float(szEntitySize[1]);
    
fSizeBot[2] = str_to_float(szEntitySize[2]);
    
    
fSizeTop[0] = str_to_float(szEntitySize[3]);
    
fSizeTop[1] = str_to_float(szEntitySize[4]);
    
fSizeTop[2] = str_to_float(szEntitySize[5]);
    
    
engfunc (EngFunc_SetSizeiEntityfSizeBotfSizeTop);
    
    
g_iBase[BASE_ENTITY] = iEntity;
    
g_iBase[BASE_INDEX] = iObject;
    
    
ArrayPushArray (g_iArrayBaseg_iBase);
    
ExecuteForward (g_iForwards[FWD_ENTITY_CREATE], g_iForwards[FWD_RESULT], iObjectiEntityiSeqiSolid);
    
    return 
true;
}

stock client_printc(index, const text[], any:...) {
    new 
szMsg[128];
    
vformat(szMsgsizeof(szMsg) - 1text3);

    
replace_all(szMsgsizeof(szMsg) - 1"!g""^x04");
    
replace_all(szMsgsizeof(szMsg) - 1"!n""^x01");
    
replace_all(szMsgsizeof(szMsg) - 1"!t""^x03");
    
    if(
index == 0) {
        for(new 
ig_iMaxPlayersi++) {
            if(!
is_user_connected(i)) continue;
            
            
message_begin(MSG_ONE_UNRELIABLEget_user_msgid("SayText"), _i);
            
write_byte(i);
            
write_string(szMsg);
            
message_end();
        }        
    } else {
        
message_begin(MSG_ONE_UNRELIABLEget_user_msgid("SayText"), _index);
        
write_byte(index);
        
write_string(szMsg);
        
message_end();
    }
}
 
Аватара пользователя
Marsh
 
Сообщения: 20
Зарегистрирован: 24 мар 2018, 13:18
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около года
Языки программирования: C++
PascalABC

Re: set objects. remove в следующем раунде

Сообщение flymic24 » 14 авг 2019, 13:05

Marsh, Отлавливай момент начала/конец раунда. В нём уже проходись по все записям g_iArrayObjects получая их класснеймы (g_iObjects[OBJ_CLASS]) и удаляй их.
Или другой вариант: В UTIL_Create_Object при создании объекта присваивай ему какой либо уникальный индификатор, а в момент начала/конец раунда проходись по всем обьектам и если уникальный индикаторы совпадают - удаляй
Аватара пользователя
flymic24
 
Сообщения: 209
Зарегистрирован: 05 окт 2012, 17:29
Откуда: Bryansk
Благодарил (а): 4 раз.
Поблагодарили: 76 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6


Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 12