Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.
Модераторы: Subb98, liFe iS GoOD
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.
В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.
Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.
Marsh » 12 авг 2019, 16:47
Не могу понять, как сделать так, чтобы в следующем раунде убирались все объекты. Помогите пожалуйста.
- Код: Выделить всё
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 {
OBJECT, OPTIONS, USER_ENTITY, USER_SOLID
};
new Array:g_iArrayObjects, g_iObjects[DATA_OBJECTS];
new Array:g_iArrayBase, g_iBase[DATA_BASE], g_iForwards[DATA_FORWARDS];
new Array:g_iArrayBaseList, g_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 (iFile, szBuffer, 511);
if (is_msg_valid(szBuffer) && parse(szBuffer, g_iObjects[OBJ_NAME], 66, g_iObjects[OBJ_MODEL], 66, g_iObjects[OBJ_SIZE], 255, g_iObjects[OBJ_CLASS], 32)) {
format (g_iObjects[OBJ_MODEL], 255, "models/objects/%s.mdl", g_iObjects[OBJ_MODEL]);
engfunc(EngFunc_PrecacheModel, g_iObjects[OBJ_MODEL]);
ArrayPushArray (g_iArrayObjects, g_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_CONTINUE, FP_CELL, FP_CELL);
g_iForwards[FWD_ENTITY_CREATE] = CreateMultiForward("creating_object", ET_CONTINUE, FP_CELL, FP_CELL, FP_CELL, FP_CELL);
}
public client_putinserver (iPlayer) g_iPlayers[iPlayer][OPTIONS] = false;
public ClCmd_SayObjects (iPlayer) {
new szFlags[27];
get_cvar_string("objects_access", szFlags, 26);
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 (szMapname, 31);
format (szDirection, 255, "/addons/amxmodx/logs/objects/%s.ini", szMapname);
new szBuffer[512], iFile = fopen (szDirection, "rt");
if (iFile) {
while (!feof(iFile)) {
fgets (iFile, szBuffer, 512);
if (is_msg_valid(szBuffer) && parse(szBuffer, g_iObjectsList[ORIGIN_X], 9, g_iObjectsList[ORIGIN_Y], 9, g_iObjectsList[ORIGIN_Z], 9, g_iObjectsList[ANGLES_P], 9, g_iObjectsList[ANGLES_Y], 9, g_iObjectsList[ANGLES_R], 9, g_iObjectsList[OBJ_INDEX], 9, g_iObjectsList[OBJ_SOLID], 9, g_iObjectsList[OBJ_SEQ], 9)) {
ArrayPushArray (g_iArrayBaseList, g_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 (szMenu, 511, "%L", iPlayer, "OBJ_MENU_MAIN_TITLE");
iLen += format (szMenu[iLen], 511 - iLen, "%L \w%L", iPlayer, "OBJ_MENU_PAGE", 1, iPlayer, "OBJ_MENU_MAIN_SET");
if (ArraySize(g_iArrayObjects)) {
iLen += format (szMenu[iLen], 511 - iLen, "%L \w%L", iPlayer, "OBJ_MENU_PAGE", 2, iPlayer, "OBJ_MENU_MAIN_NEW");
iKeys |= (1<<1);
}
else iLen += format (szMenu[iLen], 511 - iLen, "%L \d%L", iPlayer, "OBJ_MENU_PAGE", 2, iPlayer, "OBJ_MENU_MAIN_NEW");
if (ArraySize(g_iArrayBase)) {
iLen += format (szMenu[iLen], 511 - iLen, "%L \w%L", iPlayer, "OBJ_MENU_PAGE", 3, iPlayer, "OBJ_MENU_MAIN_DEL");
iKeys |= (1<<2);
}
else iLen += format (szMenu[iLen], 511 - iLen, "%L \d%L", iPlayer, "OBJ_MENU_PAGE", 3, iPlayer, "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", 5, iPlayer, "OBJ_MENU_MAIN_SOLID", iPlayer, "OBJ_SOLID_NOT");
case SOLID_TRIGGER: iLen += format (szMenu[iLen], 511 - iLen, "%L \w%L", iPlayer, "OBJ_MENU_PAGE", 5, iPlayer, "OBJ_MENU_MAIN_SOLID", iPlayer, "OBJ_SOLID_TRIGGER");
case SOLID_BBOX: iLen += format (szMenu[iLen], 511 - iLen, "%L \w%L", iPlayer, "OBJ_MENU_PAGE", 5, iPlayer, "OBJ_MENU_MAIN_SOLID", iPlayer, "OBJ_SOLID_BBOX");
case SOLID_SLIDEBOX: iLen += format (szMenu[iLen], 511 - iLen, "%L \w%L", iPlayer, "OBJ_MENU_PAGE", 5, iPlayer, "OBJ_MENU_MAIN_SOLID", iPlayer, "OBJ_SOLID_SLIDEBOX");
}
format (szMenu[iLen], 511 - iLen, "%L \w%L", iPlayer, "OBJ_MENU_PAGE", 0, iPlayer, "OBJ_MENU_EXIT");
return show_menu (iPlayer, iKeys, szMenu, -1, "Show_ObjMainMenu");
}
public Handle_ObjMainMenu (iPlayer, iKey) {
switch (iKey) {
case 0: {
new Float:fOrigin[3];
fm_get_aim_origin(iPlayer, fOrigin);
UTIL_Create_Object (fOrigin, _, g_iPlayers[iPlayer][OBJECT], _, g_iPlayers[iPlayer][USER_SOLID]);
}
case 1: return Show_ObjectsMenu (iPlayer, 0);
case 2: {
new iBase = ArraySize(g_iArrayBase)-1;
ArrayGetArray (g_iArrayBase, iBase, g_iBase);
if (fm_is_valid_ent(g_iBase[BASE_ENTITY])) {
fm_remove_entity (g_iBase[BASE_ENTITY]);
ArrayDeleteItem (g_iArrayBase, iBase);
}
}
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 (iPlayer, iPos) {
if(iPos < 0) return PLUGIN_HANDLED;
new iItemNums;
for(new i; i < ArraySize(g_iArrayObjects); i++) g_iMenuList[iPlayer][iItemNums++] = i;
new iStart = iPos * 8;
if(iStart > iItemNums) iStart = iItemNums;
iStart = iStart - (iStart % 8);
g_iMenuPosition[iPlayer] = iStart / 8;
new iEnd = iStart + 8;
if(iEnd > iItemNums) iEnd = iItemNums;
new szMenu[512], iLen, iPagesNum = (iItemNums / 8 + ((iItemNums % 8) ? 1 : 0));
switch (iPagesNum) {
case 0: return PLUGIN_HANDLED;
default: iLen = formatex(szMenu, charsmax(szMenu), "%L", iPlayer, "OBJ_MENU_ITEMS_TITLE", iPos + 1, iPagesNum);
}
new iKeys = (1<<9), b;
for (new a = iStart; a < iEnd; a++)
{
ArrayGetArray (g_iArrayObjects, g_iMenuList[iPlayer][a], g_iObjects);
iKeys |= (1<<b);
iLen += format (szMenu[iLen], 511 - iLen, "%L \w%s^n", iPlayer, "OBJ_MENU_PAGE", ++b, g_iObjects[OBJ_NAME]);
}
for(new i = b; i < 8; i++) 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", 9, iPlayer, "OBJ_MENU_NEXT", iPlayer, "OBJ_MENU_PAGE", 0, iPlayer, iPos ? "OBJ_MENU_BACK" : "OBJ_MENU_EXIT");
}
else formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n%L \w%L", iPlayer, "OBJ_MENU_PAGE", 0, iPlayer, iPos ? "OBJ_MENU_BACK" : "OBJ_MENU_EXIT");
return show_menu(iPlayer, iKeys, szMenu, -1, "Show_ObjectsMenu");
}
public Handle_ObjectsMenu (iPlayer, iKey) {
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] * 8 + 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 (szMapname, 31);
format (szDirection, 255, "addons/amxmodx/logs/objects/%s.ini", szMapname);
if (file_exists(szDirection)) delete_file(szDirection);
for (new i; i < ArraySize(g_iArrayBase); i++) {
ArrayGetArray (g_iArrayBase, i, g_iBase);
pev (g_iBase[BASE_ENTITY], pev_origin, fOrigin);
pev (g_iBase[BASE_ENTITY], pev_angles, fAngles);
format (szString, 511, "^"%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 (szDirection, szString, -1);
}
return PLUGIN_HANDLED;
}
public Cmd_Load_Objects () {
new Float:fOrigin[3], Float:fAngles[3];
new iObjId, iSeq, iSolid;
for (new i; i < ArraySize (g_iArrayBaseList); i++) {
ArrayGetArray (g_iArrayBaseList, i, g_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 1: iSolid = SOLID_TRIGGER;
case 2: iSolid = SOLID_BBOX;
case 3: iSolid = SOLID_SLIDEBOX;
default: iSolid = SOLID_NOT;
}
UTIL_Create_Object (fOrigin, fAngles, iObjId, iSeq, iSolid);
}
}
public Ham_PlayerTouch (iEntity, iPlayer) {
if (is_user_alive(iPlayer)) {
if (g_iPlayers[iPlayer][OPTIONS]) {
new iButton = pev (iPlayer, pev_button);
if (iButton & IN_LEFT || iButton & IN_RIGHT) {
new Float:fAngles[3];
pev (iEntity, pev_angles, fAngles);
switch (iButton) {
case IN_LEFT: fAngles[1] += 1.0;
case IN_RIGHT: fAngles[1] -= 1.0;
}
set_pev (iEntity, pev_angles, fAngles);
}
if (iButton & IN_USE || iButton & IN_DUCK) {
new Float:fOrigin[3];
pev (iEntity, pev_origin, fOrigin);
switch (iButton) {
case IN_USE: fOrigin[2] += 0.1;
case IN_DUCK: fOrigin[2] -= 0.1;
}
set_pev (iEntity, pev_origin, fOrigin);
}
}
ExecuteForward(g_iForwards[FWD_ENTITY_TOUCH], g_iForwards[FWD_RESULT], iPlayer, iEntity);
}
}
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 (iPlayer, iMenu, iPosition) {
if (!is_user_connected(iPlayer)) return false;
switch (iMenu) {
case MENU_MAIN: return Show_ObjMainMenu (iPlayer);
case MENU_OBJECTS: return Show_ObjectsMenu (iPlayer, iPosition);
}
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_iArrayObjects, g_iObjects);
return (ArraySize(g_iArrayObjects) - 1);
}
public obj_remove (iObject) {
return ArrayDeleteItem (g_iArrayObjects, iObject);
}
public obj_create (Float:fOrigin[3], Float:fAngles[3], iObject, iSeq, iSolid) {
return UTIL_Create_Object (fOrigin, fAngles, iObject, iSeq, iSolid);
}
bool:UTIL_Create_Object (Float:fOrigin[3], Float:fAngles[3] = {0.0, 0.0, 0.0}, iObject, iSeq = 0, iSolid = 2) {
new szEntitySize[6][128], iEntity = engfunc (EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
if (!fm_is_valid_ent(iEntity)) return false;
RegisterHamFromEntity(Ham_Touch, iEntity, "Ham_PlayerTouch");
ArrayGetArray (g_iArrayObjects, iObject, g_iObjects);
set_pev (iEntity, pev_origin, fOrigin);
set_pev (iEntity, pev_angles, fAngles);
set_pev (iEntity, pev_classname, g_iObjects[OBJ_CLASS]);
set_pev (iEntity, pev_solid, iSolid);
set_pev (iEntity, pev_movetype, MOVETYPE_NONE);
set_pev (iEntity, pev_sequence, iSeq);
set_pev (iEntity, pev_framerate, get_cvar_num ("objects_frame_rand") ? random_float(1.0, 5.0) : 1.0);
set_pev (iEntity, pev_nextthink, get_gametime() + 1.0);
engfunc (EngFunc_SetModel, iEntity, g_iObjects[OBJ_MODEL]);
parse (g_iObjects[OBJ_SIZE], szEntitySize[0], 127, szEntitySize[1], 127, szEntitySize[2], 127, szEntitySize[3], 127, szEntitySize[4], 127, szEntitySize[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_SetSize, iEntity, fSizeBot, fSizeTop);
g_iBase[BASE_ENTITY] = iEntity;
g_iBase[BASE_INDEX] = iObject;
ArrayPushArray (g_iArrayBase, g_iBase);
ExecuteForward (g_iForwards[FWD_ENTITY_CREATE], g_iForwards[FWD_RESULT], iObject, iEntity, iSeq, iSolid);
return true;
}
stock client_printc(index, const text[], any:...) {
new szMsg[128];
vformat(szMsg, sizeof(szMsg) - 1, text, 3);
replace_all(szMsg, sizeof(szMsg) - 1, "!g", "^x04");
replace_all(szMsg, sizeof(szMsg) - 1, "!n", "^x01");
replace_all(szMsg, sizeof(szMsg) - 1, "!t", "^x03");
if(index == 0) {
for(new i; i < g_iMaxPlayers; i++) {
if(!is_user_connected(i)) continue;
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, i);
write_byte(i);
write_string(szMsg);
message_end();
}
} else {
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, index);
write_byte(index);
write_string(szMsg);
message_end();
}
}
-
Marsh
-
- Сообщения: 20
- Зарегистрирован: 24 мар 2018, 13:18
- Благодарил (а): 5 раз.
- Поблагодарили: 0 раз.
- Опыт программирования: Около года
- Языки программирования: C++
PascalABC
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