Здравствуйте! Скажите пожалуйста почему плагин отказывается компилироватся под все версии? Так-то компилировался нормально когда функция спрайтов в плагине: #define SB_SPRITE // Включить поддержку спрайтов (Закомментируйте для отключения) была включенна! (не закоментированная двомя палочками "//") а так когда выключенна функция не хочет компилироватся. Отключил бо место в прекеше нужно. Сами ошибки:
zp_supplyboxes.sma(317) : error 017: undefined symbol "iKey"
zp_supplyboxes.sma(317) : warning 215: expression has no effect
zp_supplyboxes.sma(317) : error 001: expected token: ";", but found ")"
zp_supplyboxes.sma(317) : error 029: invalid expression, assumed zero
zp_supplyboxes.sma(317) : fatal error 107: too many error messages on one line
И плагин:
Код:
#include <amxmodx> #include <hamsandwich> #include <fakemeta> #include <xs> #include <zombieplague> /*---------------Настроечки---------------*/ // Настройка и установка координат #define OPTION_MODE // Включить режим настроек (Закомментируйте для отключения) #if defined OPTION_MODE new const g_szSbClcmd[] = "zpsb_open"; // Команда для открытия меню с настройками #define g_iBitAdminFlag ADMIN_RCON // Алмин-флаг доступа к меню new g_szSbPresentPosFile[128] = "addons/amxmodx/data/zpsb_positions/" // Путь к файлам с координатами #endif // Загрузка Extra Items new const g_szSbPresentIdsFile[] = "addons/amxmodx/configs/zpsb_extraitems.ini" // Путь к файлу с Extra Items // Настройка модели new const g_szSbModel[] = "models/zpsb_model.mdl"; // Путь к модели //#define g_iSbSubModel 0 // Номер сабмодели. Для использования модели с несколькими сабмоделями (Раскомментируйте, чтобы использовать) new const Float:g_flSbModelMin[] = {-25.0, -25.0, -1.0}; // Минимальные координаты для бокса модели new const Float:g_flSbModelMax[] = {25.0, 25.0, 15.0}; // Максимальные координаты для бокса модели // Настройка звуков new const g_szSbSoundSpawn[] = "zpsb_spawn.wav" // Звук спавна подарка new const g_szSbSoundGet[] = "zpsb_get.wav" // Звук подбирания подарка //Настройка сообщений new const g_szSbMsgSpawn[] = "Подарок доставлен >> Подберите его, чтобы получить бонус" // Текст сообщения прибытия подарка new const g_szSbMsgGet[] = "подобрал подарок" // Текст соощения, когда кто-то из людей подбирает подарок (Перед этим текстом пишется никнейм игрока, который подобрал подарок) #define g_flSbInterval 45.0 // Интервал времени, через который будут появляться подарки (В секундах) //Настройка спрайта //#define SB_SPRITE // Включить поддержку спрайтов (Закомментируйте для отключения) #if defined SB_SPRITE #define UNIT_TO_METER 20.0 // Множитель перевода юнитов в метры (Количество юнитов в одном метре) #define g_fSpriteScale 0.5 // Размер спрайта new const g_szSbModelSprite[] = "sprites/zpsb_long.spr"; // Путь к спрайту //#define REMOVE_KONFLICT // Включите эту функцию, если будут конфликты с GroupInfo #endif /*----------------------------------------*/ #define TASK_INTERVAL 666999 #define TASK_DELSPRKEY 969696 #define IMPULSE_PRESENT 6969 #if defined SB_SPRITE #if defined REMOVE_KONFLICT #define BitGroup(%0) (1<<((%0+33) & 31)) #else #define BitGroup(%0) (1<<((%0) & 31)) #endif #endif #define SetBit(%0,%1) ((%0) |= (1 << (%1))) #define ClearBit(%0,%1) ((%0) &= ~(1 << (%1))) #define IsSetBit(%0,%1) ((%0) & (1 << (%1))) new Array:g_aPresentEI, g_iaPresentEISize, Array:g_aPresentPosO, Array:g_aPresentPosA, Array:g_aPresentEnt, g_iaPresentPosSize, bool:g_iPluginWork, g_iPresentsSpawned, #if defined SB_SPRITE HamHook:g_hPlayerPrethink, g_iBitUserViewSpr, Array:g_aUserSprites[33], g_iUserViewSprCount, #endif #if defined OPTION_MODE bool:g_iOptionMode, Array:g_aPresentOptPosO, Array:g_aPresentOptPosA, g_iaPresentOptPosSize, Array:g_aPresentOptSpawned, bool:g_iSaveINIOpt, #endif g_iMaxPlayers, bool:g_iRoundEnd, g_iszInfoTarget; public plugin_precache() { engfunc(EngFunc_PrecacheModel, g_szSbModel); #if defined SB_SPRITE engfunc(EngFunc_PrecacheModel, g_szSbModelSprite); #endif engfunc(EngFunc_PrecacheSound, g_szSbSoundSpawn); engfunc(EngFunc_PrecacheSound, g_szSbSoundGet); } public plugin_init() { register_plugin("[ZP] SupplyBoxes", "1.0", "Docaner"); g_iMaxPlayers = get_maxplayers(); g_iszInfoTarget = engfunc(EngFunc_AllocString, "info_target"); register_event("HLTV", "Event_HLTV", "a", "1=0", "2=0"); RegisterHam(Ham_Touch, "info_target", "HM_TargetTouch"); RegisterHam(Ham_Spawn, "player", "HM_PlayerSpawn_Post", 1); #if defined SB_SPRITE DisableHamForward(g_hPlayerPrethink = RegisterHam(Ham_Player_PreThink, "player", "HM_PlayerPreThink")); #endif #if defined OPTION_MODE register_clcmd(g_szSbClcmd, "Show_OpenMenu"); register_menucmd(register_menuid("Show_OpenMenu"), (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<9), "Handle_OpenMenu"); #endif } public plugin_cfg() { g_aPresentEI = ArrayCreate(); g_aPresentPosO = ArrayCreate(3); g_aPresentPosA = ArrayCreate(); g_aPresentEnt = ArrayCreate(); new szMapName[32]; get_mapname(szMapName, charsmax(szMapName)); add(g_szSbPresentPosFile, charsmax(g_szSbPresentPosFile), szMapName); add(g_szSbPresentPosFile, charsmax(g_szSbPresentPosFile), ".ini"); load_presents_ids(); load_presents_positions(); if(g_iaPresentEISize && g_iaPresentPosSize) g_iPluginWork = true; else log_amx("[ZP|SB] Плагин не работает. Не загружены координаты со спавнами или EIs."); } #if defined SB_SPRITE public client_putinserver(id) set_pev(id, pev_groupinfo, pev(id, pev_groupinfo) | BitGroup(0)); #if AMXX_VERSION_NUM < 183 public client_disconnect(id) #else public client_disconnected(id) #endif { set_pev(id, pev_groupinfo, pev(id, pev_groupinfo) & ~BitGroup(0)); if(g_iPluginWork) set_view_spr(id, 0); } #endif load_presents_ids() { if(!file_exists(g_szSbPresentIdsFile)) { log_amx("[ZP|SB] Файл %s не найден.", g_szSbPresentIdsFile); return; } new szBuffer[64], iLine, iLen, i; while(read_file(g_szSbPresentIdsFile, iLine++, szBuffer, charsmax(szBuffer), iLen)) { if(!iLen || szBuffer[0] == ';') continue; i = zp_get_extra_item_id(szBuffer); if(i == -1) { log_amx("[ZP|SB] Extra Item [%s] не найден.", szBuffer); continue; } ArrayPushCell(g_aPresentEI, i); } g_iaPresentEISize = ArraySize(g_aPresentEI); } load_presents_positions() { if(!file_exists(g_szSbPresentPosFile)) { log_amx("[ZP|SB] Файл %s не найден.", g_szSbPresentPosFile); return; } new szBuffer[128], iLine, iLen, Float:szOrigin[3], szNumbers[4][16]; while(read_file(g_szSbPresentPosFile, iLine++, szBuffer, charsmax(szBuffer), iLen)) { if(!iLen || szBuffer[0] == ';') continue; parse(szBuffer, szNumbers[0], charsmax(szNumbers[]), szNumbers[1], charsmax(szNumbers[]), szNumbers[2], charsmax(szNumbers[]), szNumbers[3], charsmax(szNumbers[])); for(new i; i <= charsmax(szOrigin); i++) szOrigin[i] = str_to_float(szNumbers[i]); ArrayPushArray(g_aPresentPosO, szOrigin); ArrayPushCell(g_aPresentPosA, str_to_float(szNumbers[3])); ArrayPushCell(g_aPresentEnt, 0); } g_iaPresentPosSize = ArraySize(g_aPresentPosO); } public zp_round_started(iGameMode) { if(g_iPluginWork && iGameMode != MODE_SURVIVOR) { set_task(g_flSbInterval, "task_SbInterval", TASK_INTERVAL, _, _, "b"); #if defined SB_SPRITE for(new i = 1; i <= g_iMaxPlayers; i++) if(is_user_alive(i) && !zp_get_user_zombie(i)) set_view_spr(i, 1); #endif } } public zp_round_ended() { if(g_iPluginWork) remove_task(TASK_INTERVAL); g_iRoundEnd = true; } public Event_HLTV() { if(g_iPluginWork) { new iEnt; while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", "zpsb"))) set_pev(iEnt, pev_flags, FL_KILLME); for(new i; i < g_iaPresentPosSize; i++) ArraySetCell(g_aPresentEnt, i, 0); #if defined SB_SPRITE set_view_spr(0, 0); #endif g_iPresentsSpawned = 0; } g_iRoundEnd = false; } public task_SbInterval() { new iRandom, Float:szOrigin[3], Float:flAngle, iEnt; if(g_iaPresentPosSize > 1) { new Array:aValues = ArrayCreate(); for(new i; i < g_iaPresentPosSize; i++) { if(ArrayGetCell(g_aPresentEnt, i)) continue; ArrayPushCell(aValues, i); } iRandom = ArrayGetCell(aValues, random_num(0, ArraySize(aValues) - 1)); ArrayDestroy(aValues); } ArrayGetArray(g_aPresentPosO, iRandom, szOrigin); flAngle = Float:ArrayGetCell(g_aPresentPosA, iRandom); iEnt = create_present(szOrigin, flAngle); ArraySetCell(g_aPresentEnt, iRandom, iEnt); g_iPresentsSpawned++; for(new i = 1; i <= g_iMaxPlayers; i++) { if(!is_user_alive(i) || zp_get_user_zombie(i)) continue; client_cmd(i, "spk sound/%s", g_szSbSoundSpawn); client_print(i, print_center, g_szSbMsgSpawn); } if(g_iPresentsSpawned == g_iaPresentPosSize) remove_task(TASK_INTERVAL); #if defined SB_SPRITE if(g_iPresentsSpawned == 1) EnableHamForward(g_hPlayerPrethink); #endif } create_present(Float:szOrigin[3], Float:flAngleRoll = 0.0) { new iEnt = engfunc(EngFunc_CreateNamedEntity, g_iszInfoTarget); if(!pev_valid(iEnt)) return 0; new Float:szAngles[3]; szAngles[1] = flAngleRoll; engfunc(EngFunc_SetModel, iEnt, g_szSbModel); set_pev(iEnt, pev_origin, szOrigin); set_pev(iEnt, pev_solid, SOLID_TRIGGER); #if defined g_iSbSubModel set_pev(iEnt, pev_body, g_iSbSubModel); #endif set_pev(iEnt, pev_classname, "zpsb"); set_pev(iEnt, pev_impulse, IMPULSE_PRESENT); set_pev(iEnt, pev_angles, szAngles); engfunc(EngFunc_SetSize, iEnt, g_flSbModelMin, g_flSbModelMax); return iEnt; } public HM_TargetTouch(iEnt, id) { if(!g_iPluginWork || !pev_valid(iEnt) || !is_user_alive(id) || pev(iEnt, pev_impulse) != IMPULSE_PRESENT || zp_get_user_zombie(id) || zp_get_user_survivor(id)) return HAM_IGNORED; new szName[32], #if defined SB_SPRITE iKey, #endif iSprEnt; zp_force_buy_extra_item(id, ArrayGetCell(g_aPresentEI, g_iaPresentEISize == 1 ? 0 : random_num(0, g_iaPresentEISize - 1)), 1); get_user_name(id, szName, charsmax(szName)); #if defined SB_SPRITE #if AMXX_VERSION_NUM < 183 for(new i; i <= g_iaPresentPosSize; i++) { if(ArrayGetCell(g_aPresentEnt, i) != iEnt) continue; iKey = i; break; } #else iKey = ArrayFindValue(g_aPresentEnt, iEnt) #endif #endif ArraySetCell(g_aPresentEnt, iKey, 0); for(new i = 1; i <= g_iMaxPlayers; i++) { if(is_user_alive(i) && !zp_get_user_zombie(i)) client_print(i, print_center, "%s %s", szName, g_szSbMsgGet); #if defined SB_SPRITE if(IsSetBit(g_iBitUserViewSpr, i)) { iSprEnt = ArrayGetCell(g_aUserSprites[i], iKey) if(iSprEnt) { set_pev(ArrayGetCell(g_aUserSprites[i], iKey), pev_flags, FL_KILLME); ArraySetCell(g_aUserSprites[i], iKey, 0); } } #endif } emit_sound(iEnt, CHAN_AUTO, g_szSbSoundGet, VOL_NORM, ATTN_NORM, 0, PITCH_NORM); if(g_iPresentsSpawned == g_iaPresentPosSize && !g_iRoundEnd) set_task(g_flSbInterval, "task_SbInterval", TASK_INTERVAL, _, _, "b"); g_iPresentsSpawned--; #if defined SB_SPRITE if(!g_iPresentsSpawned) DisableHamForward(g_hPlayerPrethink); #endif set_pev(iEnt, pev_flags, FL_KILLME); return HAM_IGNORED; } #if defined SB_SPRITE public HM_PlayerSpawn_Post(id) if(g_iPluginWork && is_user_alive(id) && !g_iRoundEnd && zp_has_round_started() == 1 && !zp_is_survivor_round()) set_view_spr(id, 1); public HM_PlayerKilled_Post(iVictim) if(g_iPluginWork) set_view_spr(iVictim, 0); public zp_user_infected_post(id) if(g_iPluginWork) set_view_spr(id, 0); public zp_user_humanized_post(id) if(g_iPluginWork && !g_iRoundEnd && zp_has_round_started() == 1 && !zp_is_survivor_round()) set_view_spr(id, 1); set_view_spr(id, iValue) { if(id) set_spr(id, iValue); else for(new i; i <= g_iMaxPlayers; i++) if(is_user_connected(i)) set_spr(i, iValue); } set_spr(id, iValue) { if(iValue) { if(IsSetBit(g_iBitUserViewSpr, id)) return; if(!g_iUserViewSprCount && !g_iPresentsSpawned) EnableHamForward(g_hPlayerPrethink); g_iUserViewSprCount++; set_pev(id, pev_groupinfo, pev(id, pev_groupinfo) | BitGroup(id)); g_aUserSprites[id] = ArrayCreate(); for(new i; i < g_iaPresentPosSize; i++) ArrayPushCell(g_aUserSprites[id], 0); SetBit(g_iBitUserViewSpr, id); } else { if(!IsSetBit(g_iBitUserViewSpr, id)) return; new iEnt; ClearBit(g_iBitUserViewSpr, id); g_iUserViewSprCount--; if(!g_iUserViewSprCount) DisableHamForward(g_hPlayerPrethink); for(new i; i < g_iaPresentPosSize; i++) { iEnt = ArrayGetCell(g_aUserSprites[id], i); if(!iEnt) continue; set_pev(iEnt, pev_flags, FL_KILLME); } ArrayDestroy(g_aUserSprites[id]); set_pev(id, pev_groupinfo, pev(id, pev_groupinfo) & ~BitGroup(id)); } } public HM_PlayerPreThink(id) { if(!IsSetBit(g_iBitUserViewSpr, id)) return; new iEnt, Float:szEntOrigin[3], Float:fDistance, ptr, Float:fVecEnd[3], Float:fVecNormal[3], Float:fFraction, Float:szPlayerOrigin[3]; pev(id, pev_origin, szPlayerOrigin); for(new i; i < g_iaPresentPosSize; i++) { if(!ArrayGetCell(g_aPresentEnt, i)) continue; iEnt = ArrayGetCell(g_aUserSprites[id], i); ArrayGetArray(g_aPresentPosO, i, szEntOrigin); fDistance = get_distance_f(szPlayerOrigin, szEntOrigin) if(fDistance < UNIT_TO_METER * 100.0) { ptr = create_tr2(); engfunc(EngFunc_TraceLine, szPlayerOrigin, szEntOrigin, IGNORE_MONSTERS, 0, ptr); get_tr2(ptr, TR_flFraction, fFraction); if(fFraction != 1.0) { get_tr2(ptr, TR_vecEndPos, fVecEnd); get_tr2(ptr, TR_vecPlaneNormal, fVecNormal); xs_vec_mul_scalar(fVecNormal, 7.0, fVecNormal); xs_vec_add(fVecEnd, fVecNormal, fVecNormal); fVecNormal[2] += 10.0; } else { fVecNormal = szEntOrigin; fVecNormal[2] += 40.0; } free_tr2(ptr); if(iEnt) engfunc(EngFunc_SetOrigin, iEnt, fVecNormal); else { ArraySetCell(g_aUserSprites[id], i, iEnt = create_sprite(fVecNormal)); set_pev(iEnt, pev_groupinfo, BitGroup(id)); } set_pev(iEnt, pev_frame, fDistance / UNIT_TO_METER); } else if(iEnt) { set_pev(iEnt, pev_flags, FL_KILLME); ArraySetCell(g_aUserSprites[id], i, 0); } } } create_sprite(Float:szOrigin[3]) { new iEnt = engfunc(EngFunc_CreateNamedEntity, g_iszInfoTarget); if(!pev_valid(iEnt)) return 0; engfunc(EngFunc_SetOrigin, iEnt, szOrigin); engfunc(EngFunc_SetModel, iEnt, g_szSbModelSprite); set_pev(iEnt, pev_movetype, MOVETYPE_FLYMISSILE); set_pev(iEnt, pev_rendermode, kRenderTransAdd); set_pev(iEnt, pev_renderamt, 255.0); set_pev(iEnt, pev_scale, g_fSpriteScale); return iEnt; } #endif #if defined OPTION_MODE public Show_OpenMenu(id) { if(~get_user_flags(id) & g_iBitAdminFlag) return PLUGIN_HANDLED; new szMenu[512], iKeys = (1<<0|1<<9), iLen = formatex(szMenu, charsmax(szMenu), "\yМеню настроек координат^n^n"); iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r1\y] \w%s режим настроек^n", g_iOptionMode ? "Выключить" : "Включить"); if(g_iOptionMode) { iKeys |= (1<<1); iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r2\y] \wСоздать новый спавн^n"); if(g_iaPresentOptPosSize) { iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r3\y] \wПовернуть модель^n"); iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r4\y] \wУдалить предыдущий спавн^n"); iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r5\y] \wУдалить все спавны^n"); iKeys |= (1<<2|1<<3|1<<4); } else { iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r3\y] \dПовернуть модель^n"); iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r4\y] \dУдалить предыдущий спавн^n"); iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r5\y] \dУдалить все спавны^n"); } if(g_iaPresentPosSize) { iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r6\y] \wПерезагрузить спавны^n"); iKeys |= (1<<5); } else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r6\y] \dПерезагрузить спавны^n"); if(g_iSaveINIOpt && g_iaPresentOptPosSize) { iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r7\y] \wСохранить текущие настройки^n^n^n"); iKeys |= (1<<6); } else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r7\y] \dСохранить текущие настройки^n^n^n"); } else { iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r2\y] \dСоздать новый спавн^n"); iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r3\y] \dПовернуть модель^n"); iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r4\y] \dУдалить предыдущий спавн^n"); iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r5\y] \dУдалить все спавны^n"); iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r6\y] \dПерезагрузить спавны^n"); iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[\r7\y] \dСохранить текущие настройки^n^n^n"); } formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y[\r0\y] \wВыход"); return show_menu(id, iKeys, szMenu, -1, "Show_OpenMenu"); } public Handle_OpenMenu(id, iKey) { if(~get_user_flags(id) & g_iBitAdminFlag) return PLUGIN_HANDLED; switch(iKey) { case 0: { new iEnt; while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", "zpsb"))) set_pev(iEnt, pev_flags, FL_KILLME); if(g_iOptionMode) { ArrayDestroy(g_aPresentOptSpawned); ArrayDestroy(g_aPresentOptPosO); ArrayDestroy(g_aPresentOptPosA); g_iaPresentOptPosSize = 0; g_iSaveINIOpt = false; if(g_iaPresentEISize && g_iaPresentPosSize && !g_iRoundEnd && zp_has_round_started() == 1 && !zp_is_survivor_round()) { g_iPluginWork = true; set_task(g_flSbInterval, "task_SbInterval", TASK_INTERVAL, _, _, "b"); for(new i = 1; i <= g_iMaxPlayers; i++) if(is_user_alive(i) && !zp_get_user_zombie(i)) set_view_spr(i, 1); } UTIL_SayText(id, "!g[ZP|SB] !yРежим настроек !tвыключен!y."); } else { g_iPluginWork = false; remove_task(TASK_INTERVAL); set_view_spr(0, 0); new Float:szOrigin[3], Float:Angle; for(new i; i < g_iaPresentPosSize; i++) ArraySetCell(g_aPresentEnt, i, 0); g_iPresentsSpawned = 0; g_aPresentOptSpawned = ArrayCreate(); #if AMXX_VERSION_NUM < 183 g_aPresentOptPosO = ArrayCloneOrigin(g_aPresentPosO, g_iaPresentPosSize); g_aPresentOptPosA = ArrayCloneCell(g_aPresentPosA, g_iaPresentPosSize); #else g_aPresentOptPosO = ArrayClone(g_aPresentPosO); g_aPresentOptPosA = ArrayClone(g_aPresentPosA); #endif g_iaPresentOptPosSize = g_iaPresentPosSize; if(g_iaPresentOptPosSize) { for(new i; i < g_iaPresentOptPosSize; i++) { ArrayGetArray(g_aPresentOptPosO, i, szOrigin); Angle = ArrayGetCell(g_aPresentOptPosA, i); iEnt = create_present(szOrigin, Angle); ArrayPushCell(g_aPresentOptSpawned, iEnt); } } UTIL_SayText(id, "!g[ZP|SB] !yРежим настроек !tвключен!y."); } g_iOptionMode = !g_iOptionMode; } case 1: { if(g_iOptionMode) { new Float:szOrigin[3]; fm_get_aiming_position(id, szOrigin); ArrayPushCell(g_aPresentOptSpawned, create_present(szOrigin)); ArrayPushArray(g_aPresentOptPosO, szOrigin); ArrayPushCell(g_aPresentOptPosA, 0.0); g_iaPresentOptPosSize++; g_iSaveINIOpt = true; UTIL_SayText(id, "!g[ZP|SB] !yСпавн !tсоздан!y."); } } case 2: { if(g_iaPresentOptPosSize) { new Float:flAngLes[3], iEnt = ArrayGetCell(g_aPresentOptSpawned, g_iaPresentOptPosSize - 1); pev(iEnt, pev_angles, flAngLes); flAngLes[1] += 10.0; if(flAngLes[1] >= 360.0) flAngLes[1] = 0.0; set_pev(iEnt, pev_angles, flAngLes); ArraySetCell(g_aPresentOptPosA, g_iaPresentOptPosSize - 1, flAngLes[1]); g_iSaveINIOpt = true; } } case 3: { if(g_iaPresentOptPosSize) { set_pev(ArrayGetCell(g_aPresentOptSpawned, g_iaPresentOptPosSize - 1), pev_flags, FL_KILLME); ArrayDeleteItem(g_aPresentOptSpawned, g_iaPresentOptPosSize - 1); ArrayDeleteItem(g_aPresentOptPosO, g_iaPresentOptPosSize - 1); ArrayDeleteItem(g_aPresentOptPosA, g_iaPresentOptPosSize - 1); g_iaPresentOptPosSize--; g_iSaveINIOpt = true; UTIL_SayText(id, "!g[ZP|SB] !yСпавн !tудалён!y."); } } case 4: { if(g_iaPresentOptPosSize) { new iEnt; while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", "zpsb"))) set_pev(iEnt, pev_flags, FL_KILLME); ArrayClear(g_aPresentOptSpawned); ArrayClear(g_aPresentOptPosO); ArrayClear(g_aPresentOptPosA); g_iaPresentOptPosSize = 0; g_iSaveINIOpt = false; UTIL_SayText(id, "!g[ZP|SB] !yСпавны !tудалены!y."); } } case 5: { if(g_iOptionMode && g_iaPresentPosSize) { new iEnt, Float:szOrigin[3], Float:Angle; while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", "zpsb"))) set_pev(iEnt, pev_flags, FL_KILLME); ArrayDestroy(g_aPresentOptSpawned); ArrayDestroy(g_aPresentOptPosO); ArrayDestroy(g_aPresentOptPosA); g_aPresentOptSpawned = ArrayCreate(); #if AMXX_VERSION_NUM < 183 g_aPresentOptPosO = ArrayCloneOrigin(g_aPresentPosO, g_iaPresentPosSize); g_aPresentOptPosA = ArrayCloneCell(g_aPresentPosA, g_iaPresentPosSize); #else g_aPresentOptPosO = ArrayClone(g_aPresentPosO); g_aPresentOptPosA = ArrayClone(g_aPresentPosA); #endif g_iaPresentOptPosSize = g_iaPresentPosSize; if(g_iaPresentOptPosSize) { for(new i; i < g_iaPresentOptPosSize; i++) { ArrayGetArray(g_aPresentOptPosO, i, szOrigin); Angle = ArrayGetCell(g_aPresentOptPosA, i); iEnt = create_present(szOrigin, Angle); ArrayPushCell(g_aPresentOptSpawned, iEnt); } } g_iSaveINIOpt = false; UTIL_SayText(id, "!g[ZP|SB] !yСпавны !tперезагружены!y."); } } case 6: { if(g_iSaveINIOpt && g_iaPresentOptPosSize) { ArrayClear(g_aPresentPosO); ArrayClear(g_aPresentPosA); #if AMXX_VERSION_NUM < 183 g_aPresentPosO = ArrayCloneOrigin(g_aPresentOptPosO, g_iaPresentOptPosSize); g_aPresentPosA = ArrayCloneCell(g_aPresentOptPosA, g_iaPresentOptPosSize); ArrayClear(g_aPresentEnt); for(new i; i < g_iaPresentOptPosSize; i++) ArrayPushCell(g_aPresentEnt, 0); #else g_aPresentPosO = ArrayClone(g_aPresentOptPosO); g_aPresentPosA = ArrayClone(g_aPresentOptPosA); ArrayResize(g_aPresentEnt, g_iaPresentOptPosSize); for(new i; i < g_iaPresentOptPosSize; i++) ArraySetCell(g_aPresentEnt, i, 0); #endif g_iaPresentPosSize = g_iaPresentOptPosSize; save_positions(); g_iSaveINIOpt = false; UTIL_SayText(id, "!g[ZP|SB] !yСпавны !tсохранены!y."); } } case 9: return PLUGIN_HANDLED; } return Show_OpenMenu(id); } #if AMXX_VERSION_NUM < 183 Array:ArrayCloneOrigin(Array:aOrigin, iSize) { new Array:aCloneOrigin = ArrayCreate(3), Float:szOrigin[3]; for(new i; i < iSize; i++) { ArrayGetArray(aOrigin, i, szOrigin); ArrayPushArray(aCloneOrigin, szOrigin); } return aCloneOrigin; } Array:ArrayCloneCell(Array:aOrigin, iSize) { new Array:aCloneOrigin = ArrayCreate(); for(new i; i < iSize; i++) ArrayPushCell(aCloneOrigin, ArrayGetCell(aOrigin, i)); return aCloneOrigin; } #endif save_positions() { new szBuffer[256], Float:szOrigin[3]; if(file_exists(g_szSbPresentPosFile)) delete_file(g_szSbPresentPosFile); for(new i; i < g_iaPresentPosSize; i++) { ArrayGetArray(g_aPresentPosO, i, szOrigin); formatex(szBuffer, charsmax(szBuffer), "%.2f %.2f %.2f %.2f", szOrigin[0], szOrigin[1], szOrigin[2], ArrayGetCell(g_aPresentPosA, i)); write_file(g_szSbPresentPosFile, szBuffer); } } #endif stock UTIL_SayText(pPlayer, const szMessage[], any:...) { new szBuffer[190]; if(numargs() > 2) vformat(szBuffer, charsmax(szBuffer), szMessage, 3); else copy(szBuffer, charsmax(szBuffer), szMessage); while(replace(szBuffer, charsmax(szBuffer), "!y", "^1")) {} while(replace(szBuffer, charsmax(szBuffer), "!t", "^3")) {} while(replace(szBuffer, charsmax(szBuffer), "!g", "^4")) {} switch(pPlayer) { case 0: { for(new iPlayer = 1; iPlayer <= g_iMaxPlayers; iPlayer++) { if(!is_user_connected(iPlayer)) continue; engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, 76, {0.0, 0.0, 0.0}, iPlayer); write_byte(iPlayer); write_string(szBuffer); message_end(); } } default: { engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, 76, {0.0, 0.0, 0.0}, pPlayer); write_byte(pPlayer); write_string(szBuffer); message_end(); } } } #if defined OPTION_MODE stock fm_get_aiming_position(pPlayer, Float:vecReturn[3]) { new Float:vecOrigin[3], Float:vecViewOfs[3], Float:vecAngle[3], Float:vecForward[3]; pev(pPlayer, pev_origin, vecOrigin); pev(pPlayer, pev_view_ofs, vecViewOfs); xs_vec_add(vecOrigin, vecViewOfs, vecOrigin); pev(pPlayer, pev_v_angle, vecAngle); engfunc(EngFunc_MakeVectors, vecAngle); global_get(glb_v_forward, vecForward); xs_vec_mul_scalar(vecForward, 8192.0, vecForward); xs_vec_add(vecOrigin, vecForward, vecForward); engfunc(EngFunc_TraceLine, vecOrigin, vecForward, DONT_IGNORE_MONSTERS, pPlayer, 0); get_tr2(0, TR_vecEndPos, vecReturn); } #endif /* Автор: Docaner Контакты: https://vk.com/docaner */