Описание: Дает возможность создавать пружины на карте через удобное меню. Гибкая настройка плагина, позволит сделать все так, как Вам нужно на Вашем сервере в зависимости от мода.
Автор:
wellasgood
Совместимость:
Amx Mod X 1.9.0, Amx Mod X 1.10.0 dev
Что умеет (процесс начальной разработки):
- Создание начальных основ, продумка идеи и тп. - Реализовано создание необходимых директорий и файлов. (которые неообходимы по замыслу плагина) - Реализован функционал задействования клавишей клавиатуры прыжка на пружине - Реализован функционал феерверка (гибкая настройка) при прыжке (вкл/выкл) - Сбор и подготовка необходимых Stock функций (в конце кода) для функционирования всего. - Реализована настройка плагина в конфиге. (spring/spring.cfg) - Возможность сохранения расставленных пружин через меню, для последующего воспроизведения на каждой отдельной карте какой хотите. - Добавлена слышимость производимых звуков для Steam и Non-Steam игроков. - Разработана с нуля модель пружинного борда. - Реализована функция расставления сохраненных моделей на карте при запуске карты. (запуске сервера, перезапуске, смены карты; :D) - Реализовано удобное меню создания пружины на карте, с доп. возможностями. - Реализовано меню перемещения пружины после создания (через доп. меню) - Добавлена функция свечения модели (яркость свечения оболчки модели) - Сделана продуманная выдача бессмертия после прыжка на пружине (дабы после прыжка когда игрок падает не тратилось здоровье) - Реализовано удаление как 1 пружины при наведении, так и всех расставленных сразу на карте. - Добавлена возможноть разрешить использовать пружину только админам или мульти-флаг игрокам. - Оптимизация кода и небольшие поправки в части разных функций. - Все сообщения выведены в LANG файл. - Проверка на работоспособность в игре == успешно. * - Информация о других версиях и доработках (в спойлере: 'Обновления').
Мультиязычность:
RU, EN
Требования:
ReSemiclip (желательно) или ReGameDLL (mp_kill_filled_spawn), иначе Unstuck или Stuck RBS, для мода с клеткой.
Открытие главного меню: /sp-menu Команды для игроков: /freedom, /pardon
Установка:
Скомпилируйте плагин. Скопируйте скомпилированный файл .amxx в директорию: amxmodx/plugins/ Пропишите .amxx в файле amxmodx/configs/plugins.ini Скопируйте словарь плагина .txt в директорию amxmodx/data/lang/ Скопируйте конфиг плагина .cfg в директорию amxmodx/configs/spring/ Скопируйте файлы .mdl в директорию models/spring/ Скопируйте файлы .wav в директорию sound/spring/ Скопируйте файлы .spr в директорию sprites/spring/ Смените карту или перезапустите сервер.
Настройки:
В .sma:
Код:
#define SPRING_NEW_MODEL //(откомментировать если используется новая модель пружинного борда) new const ACCESS_MENU_FLAG = ADMIN_CFG; //для доступа (главное меню, создание и тп) new const ACCESS_ADMIN_FLAG = ADMIN_BAN; //если использование прыжка только для админов (также фигурирует в доступе к главному меню, перемещение для админов) new const ACCESS_VIP_FLAG = ADMIN_LEVEL_H; //для подстановки в коде! (флаг который есть у випов на вашем сервере!) new const ACCESS_MULTI_FLAG = (ADMIN_BAN|ADMIN_LEVEL_H); //мульти флаг (на данном примере будет разрешено использование только админам и вип) new const ACCESS_CAGE_FLAG = ADMIN_IMMUNITY; //флаг для иммунитета от перемещения в клетку. (игрок будет прозрачным от нажатия в меню)
В .cfg:
Код
/*--- НАСТРОЙКИ ПЛАГИНА ПРУЖИНЫ ---*/
//Настройка возможности использования пружины для отдельных категорий:
sp_access_en "2" //Всем/Админы/Мульти-Флаг - 0/1/2 кому можно использовать.
//Настройка сброса бессмертия для прыгающего игрока. (зависит от длинны прыжка вверх, т.е чем дальше прыжок вверх (значения sp_jmspeed_min(max)), тем больше нужно выставлять время.
sp_time_offdmg "5.0" //время до отключения бессмертия (бессмертие действует только для victim, т.е для игрока который прыгает. Другие смогут его убить.) fmt Float.
//Настройка прыжка (для подстановки в рандом функцию, т.е дальность отскока от пружины вверх, будет рандомным числом между минимальным и максимальным значением):
sp_jmspeed_min "400.0" //Мин. скорость прыжка вверх (отскок от пружины) fmt Float.
sp_jmspeed_max "600.0" //Макс. скорость прыжка вверх (отскок от пружины) fmt Float.
//Настройка свечения модели пружины (оболочка):
sp_render_amount "80" //Яркость свечения оболочки модели
//Настройка функций феерверка при прыжке:
sp_firework_en "1" //Вкл/Выкл - 1/0 запуск феерверка при прыжке.
sp_firework_num "3" //Кол-во раз подряд запуска феерверка при прыжке.
sp_firework_time1 "0.3" //время до запуска первого феерверка. fmt Float.
sp_firework_time2 "0.8" //время до повторного заряда феерверка fmt Float.
sp_firework_msg "1" //Одному/Всем - 1/0 видимость феерверка около игрока.
sp_сage_offdmg "1" //Убивать в клетке между Т и КТ? (0/1 - выкл/вкл) в клетке
spcage_jmspeed_min "400.0" //Мин. скорость прыжка вверх fmt Float. в клетке
spcage_jmspeed_max "600.0" //Макс. скорость прыжка вверх fmt Float. в клетке
sp_cagetime_en "1" //Вкл/Выкл - 1/0 возможность сажать в клетку на время.
sp_cagetime_1 "3" //Время на которое сажать игрока в клетку (мин).
sp_cagetime_2 "7" //Время на которое сажать игрока в клетку (мин).
sp_cagetime_3 "10" //Время на которое сажать игрока в клетку (мин).
sp_cagetime_4 "15" //Время на которое сажать игрока в клетку (мин).
sp_cagetime_5 "20" //Время на которое сажать игрока в клетку (мин).
sp_cagekill_en "1" //Вкл/Выкл - 1/0 убивать игрока(ов) в клетке через время (дабы избежать такого, что в клетке кто-то есть, а раунд все идет и подобных случаев)
sp_cagekill_time "5.0" //через сколько сек убивать игрока(ов) в клетке
sp_cagekill_info "1" //Вкл/Выкл - 1/0 инфо игрокам в клетке, сколько им осталось до смерти
//Перемещение объектов
sp_move_cvar "10.0" //значение для функции перемещения (подстановка в коде, дальность, чем больше значение, тем быстрее Вы передвинете объект)
/* * - ---------- Плагин - "Spring" // Rus: "Пружина" * - ---------- Описание - Суть плагина в том, что можно расставлять по карте пружины, на которых можно прыгать игрокам. * - ---------- Благодарность за помощь (содействие): - voed, d3m37r4, fantom, Denzer, WILL_BE, fl0wer, Jumper, w0w, Mistrick, BlackSignature * - ---------- Благодарность за перевод на разные языки: wellasgood * - ---------- Поддержка плагина: * - ---------- Dev-Cs: @wellasgood vk: Telegram: @WellAsGood * - ---------- * - ---------- * - Версии: * - ---------- * - ---------- * - ver 1.0: - Создание начальных основ, продумка идеи и тп. - Реализовано создание необходимых директорий и файлов. (которые неообходимы по замыслу плагина) - Реализован функционал задействования клавишей клавиатуры прыжка на пружине - Реализован функционал феерверка (гибкая настройка) при прыжке (вкл/выкл) - Сбор и подготовка необходимых Stock функций (в конце кода) для функционирования всего. - Реализована настройка плагина в конфиге. (spring/spring.cfg) - Возможность сохранения расставленных пружин через меню, для последующего воспроизведения на каждой отдельной карте какой хотите. - Добавлена слышимость производимых звуков для Steam и Non-Steam игроков. - Разработана с нуля модель пружинного борда. - Реализована функция расставления сохраненных моделей на карте при запуске карты. (запуске сервера, перезапуске, смены карты; :D) - Реализовано удобное меню создания пружины на карте, с доп. возможностями. - Реализовано меню перемещения пружины после создания (через доп. меню) - Добавлена функция свечения модели (яркость свечения оболчки модели) - Сделана продуманная выдача бессмертия после прыжка на пружине (дабы после прыжка когда игрок падает не тратилось здоровье) - Реализовано удаление как 1 пружины при наведении, так и всех расставленных сразу на карте. - Добавлена возможноть разрешить использовать пружину только админам или мульти-флаг игрокам. - Оптимизация кода и небольшие поправки в части разных функций. - Все сообщения выведены в LANG файл. - Проверка на работоспособность в игре == успешно. * - ver 1.1: - Правка кода функции феерверка (был обнаружен потанциальный краш), cпасибо: voed - Небольшая правка кода (изменил расположение g_UserFlags, удалил return FMRES_IGNORED; где вывод сообщений), спасибо: d3m37r4, fantom - Изменено бессмертие (fm_set_user_godmode) на отлов события (Ham_TakeDamage), дабы в полете урон можно было наносить другим игрокам, спасибо: Denzer, WILL_BE - Реализовано мультиязычное меню (теперь пункты меню в LANG файле) - Из внутриностей менюшек убраны не нужные значения, которые лишь захломляли код, спасибо: fl0wer - Из кода убраны переменные и значения которые больше не нужны, а также добавлено нужное новое. - Добавлен квар (sp_time_offdmg). время до отключения бессмертия (бессмертие действует только для victim, т.е для игрока который прыгает. Другие смогут его убить.) * - ver 1.2: - Функция SendAudio заменена на Emit_Sound, что бы звук не распростронялся на всю карту, спасибо: Jumper, w0w - Добавлен новый квар (SPRING_SOUND_CHECK) == выбор между слышимостью всем или 1 игроку который использует звук. (0/1 - всем/одному; настройка в .cfg), спасибо: Jumper - Добавлено уничтожение меню после его использования (menu_destroy), дабы не утекала память (могло привести к лагам на сервере и тп), спасибо: Mistrick - Критичное обновление (рекомендация обновиться, так как, обновление касающееся утечки памяти не стоит игнорировать.) * - ver 1.3: - Исправлен код в части выдачи прыжка совместно с fw_TakeDamage, конкретно переменная g_NoDamage сделана массивом, так как, если несколько прыгают на пружине сразу, все бы ломалось, спасибо: Denzer, Mistrick - Добавлено уничтожение менюшек в еще несколько частей кода (menu_destroy(menu);), дабы не утекала память!, спасибо: Mistrick - Опять же, обновление критично из-за утечки памяти (возможны лаги на предыдущих версиях), обязательно к обновлению! * - ver 1.4: - Добавлен отдельная система этого плагина, под названием: 'Spring Cage'; Rus: 'Пружинная клетка': - Для чего и как работает: После создания клетки-пружины на карте, можно поместить любого игрока через доп. меню выбора. (это может быть наказание или еще что-то; флуд, спам, подумать над поведением). - Добавлена возможность разместить игрока в клетку на время (выбирается в меню), если игрок находится в клетке, и настанет новый раунд, он всеравно окажется там же, если его время выхода еще непришло! - Созданы необходимые квары, функции, меню и тп. - Оптимизация кода по замечаниям. - Создано меню телепорта игрока в клетку. - Внедрена система времени на которое перемещается игрок в клетку - Добавлена команда для чата /freedom, узнать сколько времени перемещенному в клетку осталось там сидеть. - Добавлены новые переменные, счетчики + массивы и переключатели bool, для разных функций связанных с клеткой. (гибче настройка под Ваши нужды) - Добавлено: Игрок из клетки может попросить прощения у присутствующих админов на сервере, админам придет уведомление, что игрок в клетке. - Добавлено: Меню для досрочного освобождения из клетки (для админов) - Реализовано сохранение тех игроков, которые хотят обойти клетку. (т.е при выходе инфа сохраняется, и при входе такого игрока он опять окажется в клетке), спасибо: BlackSignature - Правки в коде с учетом новых переменных. (+ оптимизация) - Все логи теперь выводятся в отдельный файл. (logs/spring/) * - ver 1.5: - В ходе длительной проверки на сервере с реальными игроками, были обнаружены баги. - Правки в коде (часть игнора игроков в меню перемещения и освобождения; get_user_flags(id) заменено на get_user_flags(iPlayer)), игнорились все (из-за id) - Правки в коде (часть события spawn, добавлена проверка поиска по классу, так как игроки не телепортировались в новом раунде в клетку!) - Критическое обновление! * - ver 1.5: - В ходе длительной проверки на сервере с реальными игроками, были обнаружены баги. - Правки в коде (часть игнора игроков в меню перемещения и освобождения; get_user_flags(id) заменено на get_user_flags(iPlayer)), игнорились все (из-за id) - Правки в коде (часть события spawn, добавлена проверка поиска по классу, так как игроки не телепортировались в новом раунде в клетку!) - Критическое обновление! * - ver 1.6: - Оптимизирован код, улучшена читабельность. - Подправлены комментарии или в некоторых местах где и так все понятно убраны вообще. - Исправлено вызов меню из другого меню (когда освобождаешь игрока из клетки (меню освобождение), то после вызывалось меню телепортации в клетку). - Убраны большое кол-во stock в пользу public, остались только необходимые stock. - Убран из события SPAWN, цикл и функция user_slap (вместо этого добавлены в описание плагина необходимые требования для использования (желательно)) - Убраны лишнии строки в различных случаях где это можно сделать, дабы уменьшить код. - Требования: ReSemiclip (желательно) или ReGameDLL (mp_kill_filled_spawn), иначе Unstuck или Stuck RBS (выталкивание игрока из игрока) * - ver 1.7: - Оптимизирован код в части циклов while, подправлены скобки, освобождение места в пользу меньших строк кода. * - ver 1.8: - Исправлена утечка в меню (!is_user_connected) перемещено в другое место во всех меню. - В событии Ham_TakeDamage, далее выполняемой функции > 'fw_TakeDamage' изменена проверка, убрано (!is_user_connected) и оставлено только (is_user_alive), так как (is_user_alive), проверяет сначала подключен ли игрок. * - ver 1.9: - Реализована возможность убивать игрока(ов) в клетке через заданное время (дабы избежать простаивания раунда, если все игроки за клеткой мертвы и подобных случаев) - Добавлены новые переменные, квары, функции. - Сделано событие смерти игрокаов в клетке без сообщения в верхнем правом углу, т.е игроки в клетке будут незаметно убиты, будто их и нет в игре (не мешают игровому процессу остальным). - Реализовано эффектная смерть в клетке игрока. - Добавлена const переменная (флаг иммунитета от попадания в клетку) - Добавлены новые сообщения в LANG файл. - Добавлены новые квары в CFG файл. * - ver 2.0: - Добавлены новый квар, который устанавливает на сколько по дальности перемещать объекты по координатам. - Вывод логов сделаны мультиязычными (спасибо: ребятам с форума Dev-Cs (w0w, the_hunter) за пояснения). - Были внесены изменения в LANG файл. - Были внесены изменения в CFG файл. * - ver 2.0.1: - Добавлены новый #define SPRING_NEW_MODEL (если закомментирован, то используется старая модель пружинного борда, если откомментировано, то используется новая модель) - Переход на трех значную систему версий. =) * - ---------- * - ---------- * - Актуальная версия плагина (конечная с учетом переделок: ver 2.0.1) * - ---------- */
//#define SPRING_NEW_MODEL //(откомментировать если используется новая модель пружинного борда)
//Необходимые сonst для разных предназначений new const PLUGIN[] = "Spring"; new const VERSION[] = "2.0.1"; new const AUTHOR[] = "wellasgood";
new const ACCESS_MENU_FLAG = ADMIN_CFG; //для доступа (главное меню, создание и тп) new const ACCESS_ADMIN_FLAG = ADMIN_BAN; //если использование прыжка только для админов (также фигурирует в доступе к главному меню, перемещение для админов) new const ACCESS_VIP_FLAG = ADMIN_LEVEL_H; //для подстановки в коде! (флаг который есть у випов на вашем сервере!) new const ACCESS_MULTI_FLAG = (ADMIN_BAN|ADMIN_LEVEL_H); //мульти флаг (на данном примере будет разрешено использование только админам и вип) new const ACCESS_CAGE_FLAG = ADMIN_IMMUNITY; //флаг для иммунитета от перемещения в клетку. (игрок будет прозрачным от нажатия в меню)
new const SPRING_SND[] = "spring/spring.wav";
#if !defined SPRING_NEW_MODEL new const SPRING_MDL[] = "models/spring/spring.mdl"; #else new const SPRING_MDL[] = "models/spring/spring-new.mdl"; #endif
new const SPRING_CAGE1_MDL[] = "models/spring/Cage_1.mdl"; new const SPRING_CAGE2_MDL[] = "models/spring/Cage_2.mdl"; new const SPRING_CAGE3_MDL[] = "models/spring/Cage_3.mdl"; new const SPRING_CAGE4_MDL[] = "models/spring/Cage_4.mdl"; new const SPRING_CAGE5_MDL[] = "models/spring/Cage_5.mdl";
new const SPRING_DIR[] = "spring"; new const SPRING_SAVE[] = "spring_save"; new const SPRING_LOG_DIR[] = "logs/spring"; new const SPRING_CFG[] = {"addons/amxmodx/configs/spring/spring.cfg"};
new const Float:SPRING_MIN[3] = {-14.86, 0.00, -35.88}; //Размеры для пружины (была произведена колибровка) new const Float:SPRING_MAX[3] = {14.86, 14.83, 35.88}; //Размеры для пружины (была произведена колибровка) new const Float:SPRING_CAGE1_MIN[3] = {-76.06, -50.92, -76.17}; //Размеры для части пружины-клетки (была произведена колибровка) new const Float:SPRING_CAGE1_MAX[3] = {-74.27, 50.42, 400.92}; //Размеры для части пружины-клетки (была произведена колибровка) new const Float:SPRING_CAGE2_MIN[3] = {-76.06, -60.00, -76.17}; //Размеры для части пружины-клетки (была произведена колибровка) new const Float:SPRING_CAGE2_MAX[3] = {76.27, -58.42, 400.92}; //Размеры для части пружины-клетки (была произведена колибровка) new const Float:SPRING_CAGE3_MIN[3] = {-76.06, 35.92, -76.17}; //Размеры для части пружины-клетки (была произведена колибровка) new const Float:SPRING_CAGE3_MAX[3] = {76.27, 36.42, 400.92}; //Размеры для части пружины-клетки (была произведена колибровка) new const Float:SPRING_CAGE4_MIN[3] = {76.06, -50.92, -76.17}; //Размеры для части пружины-клетки (была произведена колибровка) new const Float:SPRING_CAGE4_MAX[3] = {77.27, 50.42, 400.92}; //Размеры для части пружины-клетки (была произведена колибровка) new const Float:SPRING_CAGE5_MIN[3] = {-76.06, -58.92, -76.17}; //Размеры для части пружины-клетки (была произведена колибровка) new const Float:SPRING_CAGE5_MAX[3] = {76.27, 35.28, 5.27}; //Размеры для части пружины-клетки (была произведена колибровка)
//Необходимые переменные, счетчики, массивы и др.: new SPRING_BUTTON, SPRING_JUMPSPEED_MIN, SPRING_JUMPSPEED_MAX, SPRING_RENDER_AMOUNT, SPRING_TIME_OFFDAMAGE, SPRING_SOUND_CHECK, SPRING_ACCESS_EN; new SPRING_FIREWORK_EN, SPRING_FIREWORK_NUM, SPRING_FIREWORK_MSG, SPRING_FIREWORK_TIME1, SPRING_FIREWORK_TIME2; new SPRING_CAGETIME_EN, SPRING_CAGETIME_1, SPRING_CAGETIME_2, SPRING_CAGETIME_3, SPRING_CAGETIME_4, SPRING_CAGETIME_5; new SPRINGCAGE_OFFDAMAGE, SPRINGCAGE_JUMPSPEED_MIN, SPRINGCAGE_JUMPSPEED_MAX, SPRING_CAGEKILL_EN, SPRING_CAGEKILL_TIME, SPRING_CAGEKILL_INFO, SPRING_MOVE_CVAR;
new g_NoDamage[MAX_PLAYERS+1], g_FireworkCount, g_SpringEnt, g_szLogPath[64]; new bool:g_Player[MAX_PLAYERS+1], g_Time[MAX_PLAYERS+1], g_CheckPlayer; new Float:g_pOrigin[MAX_PLAYERS+1][3]; new Trie:g_tTrie;
new g_shortSpr[6]; new g_short[6][] = { "sprites/spring/3dmflared.spr", "sprites/spring/3dmflaora.spr" , "sprites/spring/frostgib.spr" , "sprites/spring/ledglow.spr" , "sprites/spring/pink.spr" , "sprites/spring/star_gib.spr" };
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR);
// Отключаем не нужные карты (на картах, начинающихся на эти префиксы, не будет работать плагин (если не нужно, то '//' строки)) new mapname[MAX_MAPNAME_LENGTH]; get_mapname(mapname, charsmax(mapname)); new maps[][] = { "$", "fy_", "aim_" }; for(new i; i < sizeof maps; i++){ if(containi(mapname, maps[i]) != -1){ pause("ad"); return; } }
public client_authorized(iPlayer, const szAuthID[]) //Получаем данные если игрок зашел { if(TrieGetCell(g_tTrie, szAuthID, g_Time[iPlayer])){ TrieDeleteKey(g_tTrie, szAuthID) } }
public client_disconnected(iPlayer) //Сохраняем данные если игрок вышел { if(g_Player[iPlayer] == true || g_Time[iPlayer] == -1 || g_Time[iPlayer] > 1){ new szAuthID[MAX_AUTHID_LENGTH];
//Убиваем тех кто в клетке через время (дабы избежать такого, что в клетке кто-то есть, а раунд все идет и подобных случаев) if(get_pcvar_num(SPRING_CAGEKILL_EN) == 1){ if(get_pcvar_num(SPRING_CAGEKILL_INFO) == 1){ client_print_color(iPlayer, print_team_default, "%l", "SPRING_CAGE_KILLINFO", iPlayer, get_pcvar_num(SPRING_CAGEKILL_TIME)); } remove_task(iPlayer); set_task(get_pcvar_float(SPRING_CAGEKILL_TIME), "Spring_Cage_Kill_Eff1", iPlayer); }
//Инфа по поводу возможности не поподать в клетку впринципе (как получить иммунитет) client_print_color(iPlayer, print_team_default, "%l", "SPRING_CAGE_IMMUNINFO"); }
return HAM_IGNORED; }
public Spring_Cage_Kill_Eff1(iPlayer) //эффект при убийстве игроков в клетке / часть 1. { new Float:velocity1[3];
public Spring_Cage_Kill(iPlayer) //Функция смерти игроков которые в клетке / часть 5. { fm_set_user_godmode(iPlayer, 0); //если стояло бессмертие убираем для килла. user_silentkill(iPlayer); //убиваем, что никто не увидет сообщения об этом, в верхнем правом углу. }
public cmdFreedom(iPlayer) //узнать сколько осталось сидеть в клетке по команде { if(!is_user_alive(iPlayer)) return PLUGIN_HANDLED;
public read_spring() //Расстановка уже сохраненных точек на карте. { new mapname[MAX_MAPNAME_LENGTH], springfile[128]; get_mapname(mapname, MAX_MAPNAME_LENGTH-1);
//Выводим сообщения об ограниченном доступе если это обычный игрок: if(get_pcvar_num(SPRING_ACCESS_EN) == 2 && g_UserFlags & ADMIN_USER){ client_print_color(id, print_team_default, "%l", "SPRING_ACCESS_ERR2"); } else if(get_pcvar_num(SPRING_ACCESS_EN) == 1 && g_UserFlags & (ACCESS_VIP_FLAG|ADMIN_USER)){ client_print_color(id, print_team_default, "%l", "SPRING_ACCESS_ERR1"); }
return FMRES_IGNORED; }
public Action_Jump_Spring(id) //функция для подстановки события прыжка и тп { //Даем звук пружины emit_sound(get_pcvar_num(SPRING_SOUND_CHECK) == 1 ? id : 0, CHAN_AUTO, SPRING_SND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
//Отскок от пружины new Float:velocity[3]; entity_get_vector(id,EV_VEC_velocity,velocity)
//Задаем значение переменной (для проверки в fw_TakeDamage) g_NoDamage[id] = id; //Kill процесс если быстро нажали еще раз (прыгают несколько раз подряд и более..) remove_task(id); //Отрубаем бессмертие путем сброса значения массива g_NoDamage set_task(get_pcvar_float(SPRING_TIME_OFFDAMAGE), "NoDamage_Off", id);
//Далее менюшки и все что с ними связано-завязано :)
public spring_makemenu(id) //главное меню пружины { if(!is_user_connected(id)) return;
new g_SpringMenu[64];
formatex(g_SpringMenu, 63, "%L", id, "SPRING_MENU_TITLE"); new menu = menu_create(g_SpringMenu, "springmenufunc"); new callback = menu_makecallback("ignormenufunc_2");
ent = 0; p_Origin[2] += 60; g_pOrigin[id] = p_Origin; //тп игрока через меню
spring_playermenu(id); return PLUGIN_HANDLED; } case 7: //меню досрочного освобождения из клетки { spring_menufreedom(id); return PLUGIN_HANDLED; } }
spring_makemenu(id); return PLUGIN_HANDLED; }
public spring_menufreedom(id) //меню выбора игроков для досрочного освобождения { if(!is_user_connected(id)) return;
new g_SpringMenuFreedom[64];
formatex(g_SpringMenuFreedom, 63, "%L", id, "SPRING_MENUFREEDOM_TITLE"); new menu = menu_create(g_SpringMenuFreedom, "springfreedomfunc"); new callback = menu_makecallback("ignormenufunc_3");
new szName[MAX_NAME_LENGTH], szInfo[3], iPlayers[MAX_PLAYERS], iPlayer, iNum; get_players_ex(iPlayers, iNum, GetPlayers_ExcludeDead|GetPlayers_ExcludeBots|GetPlayers_ExcludeHLTV);
public springfreedomfunc(id, menu, item) //внутринности для меню досрочного освобождения из клетки { if(item == MENU_EXIT){ menu_destroy(menu); spring_makemenu(id); return PLUGIN_HANDLED; }
public springcheckfunc(id, menu, item) //внутринности для меню выбора клетки или пружины { if(item == MENU_EXIT){ menu_destroy(menu); spring_makemenu(id); return PLUGIN_HANDLED; }
switch(key) { case 1: //создание пружина борда { makeBox(id, 1, "Spring"); client_print_color(id, print_team_default, "%l", "SPRING_CREATED"); } case 2: //создание из частей клетки пружины { new ent, check;
public springplayerfunc(id, menu, item) //внутринности для меню перемещения игрока в клетку { if(item == MENU_EXIT){ menu_destroy(menu); spring_makemenu(id); return PLUGIN_HANDLED; }
public springtimefunc(id, menu, item) //внутринности для меню выбора времени на которое перемещается игрок { if(item == MENU_EXIT){ menu_destroy(menu); return PLUGIN_HANDLED; }
if(get_pcvar_num(SPRING_CAGETIME_EN) == 1){ new Min = g_Time[iPlayer] - time(); log_to_file(g_szLogPath, "%L", LANG_PLAYER, "SPRING_MULTI_LOG5", id, iPlayer, Min / 60); } else{ log_to_file(g_szLogPath, "%L", LANG_PLAYER, "SPRING_MULTI_LOG6", id, iPlayer); }
spring_playermenu(id); }
public ignormenufunc_1(id, menu, item) //игнорим кого уже переместили или у игрока флаг иммуна (для меню перемещения) или мертв { new szInfo[3], buffer; menu_item_getinfo(menu, item, buffer, szInfo, charsmax(szInfo), .callback = buffer);
public ignormenufunc_2(id, menu, item) //игнорим основные настройки от обычных админов { if(get_user_flags(id) & (ACCESS_ADMIN_FLAG|ACCESS_MENU_FLAG) == (ACCESS_ADMIN_FLAG|ACCESS_MENU_FLAG)){ return ITEM_IGNORE; } else if(get_user_flags(id) & ACCESS_ADMIN_FLAG){ return ITEM_DISABLED; }
return ITEM_IGNORE; }
public ignormenufunc_3(id, menu, item) //игнорим игроков которые не в клетке (меню досрочное освобождение) и с иммуном { new szInfo[3], buffer; menu_item_getinfo(menu, item, buffer, szInfo, charsmax(szInfo), .callback = buffer);
if(id){ //ставит игрок new Float:vOrigin[3]; fm_get_aim_origin(id, vOrigin) vOrigin[2] += 22.0 //положить на пол engfunc(EngFunc_SetOrigin, ent, vOrigin); } else{ //ставит функция read_spring engfunc(EngFunc_SetOrigin, ent, pOrigin) }
stock fm_set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16) //свечение модели { new Float:RenderColor[3];
stock fm_get_aim_origin(index, Float:origin[3]) //fm_get_aim_origin - портирована из функции ядра AMXX get_user_origin(..., 3) { new Float:start[3], Float:view_ofs[3];
- Добавлена новая модель (spring-new.mdl), более оптимизированная версия пружинного борда. (спасибо quasar) - Добавлен новый #define SPRING_NEW_MODEL (если закомментирован, то используется старая модель пружинного борда, если откомментировано, то используется новая модель) - Переход на трех значную систему версий. :good2:
Обновление до версии (2.0)
[Added]:
- Добавлен новый квар, который устанавливает на сколько по дальности перемещать объекты по координатам. (значение для функции перемещения (подстановка в коде, дальность, чем больше значение, тем быстрее Вы передвинете объект) - Вывод логов сделаны мультиязычными (спасибо: ребятам с форума Dev-Cs (w0w, the_hunter) за пояснения).
[Fixed]:
- Были внесены изменения в LANG файл. - Были внесены изменения в CFG файл.
Обновление до версии (1.9)
[Added]:
- Реализована возможность убивать игрока(ов) в клетке через заданное время (дабы избежать простаивания раунда, если все игроки за клеткой мертвы и подобных случаев, игроки и заключенные в клетке не зависят друг от друга). - Добавлены новые переменные, квары, функции. - Сделано событие смерти игроков в клетке без сообщения в верхнем правом углу, т.е игроки в клетке будут незаметно убиты, будто их и нет в игре (не мешают игровому процессу остальным). - Реализовано эффектная смерть в клетке игрока. - Добавлена const переменная (флаг иммунитета от попадания в клетку). - Добавлены новые сообщения в LANG файл. - Добавлены новые квары в CFG файл.
Обновление до версии (1.8)
[Fixed]:
- Исправлена утечка в меню (!is_user_connected) перемещено в другое место во всех меню. Спасибо: Denzer - В событии Ham_TakeDamage, далее выполняемой функции > 'fw_TakeDamage' изменена проверка, убрано (is_user_connected) и оставлено только (is_user_alive), так как (is_user_alive), проверяет сначала подключен ли игрок.
Обновление до версии (1.7)
[Optimized]:
- Оптимизирован код в части циклов while, подправлены скобки, освобождение места в пользу меньших строк кода.
Обновление до версии (1.6)
[Added]:
- Добавлены требования: ReSemiclip (желательно) или ReGameDLL (mp_kill_filled_spawn), иначе Unstuck или Stuck RBS. (что бы было выталкивание игрока из игрока)
[Fixed]:
- Подправлены комментарии или в некоторых местах где и так все понятно убраны вообще. - Исправлено вызов меню из другого меню (когда освобождаешь игрока из клетки (меню освобождение), то после вызывалось меню телепортации в клетку). - Убран из события SPAWN, цикл и функция user_slap (вместо этого добавлены в описание плагина необходимые требования для использования (желательно)).
[Optimized]:
- Оптимизирован код, улучшена читабельность. - Убраны большое кол-во stock в пользу public, остались только необходимые stock. - Убраны лишние строки в различных случаях где это можно сделать, дабы уменьшить код.
Обновление до версии (1.5)
!-- [Very Critical Update] --!
[Fixed]:
- В ходе длительной проверки на сервере с реальными игроками, были обнаружены баги. - Правки в коде (часть игнора игроков в меню перемещения и освобождения; get_user_flags(id) заменено на get_user_flags(iPlayer)), игнорились все (из-за id) - Правки в коде (часть события spawn, добавлена проверка поиска по классу, так как игроки не телепортировались в новом раунде в клетку!) - Критическое обновление!
Обновление до версии (1.4)
!-- [Global Update] --!
[Added]:
- Добавлена отдельная система этого плагина, под названием: 'Spring Cage'; Rus: 'Пружинная клетка'. - Для чего и как работает: После создания клетки-пружины на карте, можно поместить любого игрока через доп. меню выбора. (это может быть наказание или еще что-то; флуд, спам, подумать над поведением). - Добавлена возможность разместить игрока в клетку на время (выбирается в меню), если игрок находится в клетке, и настанет новый раунд, он всеравно окажется там же, если его время выхода еще непришло! - Созданы необходимые квары, функции, меню и тп. - Создано меню телепорта игрока в клетку. - Внедрена система времени на которое перемещается игрок в клетку - Добавлена команда для чата, узнать сколько времени перемещенному в клетку осталось там сидеть. (say /freedom) - Добавлены новые переменные, счетчики + массивы и переключатели bool, для разных функций связанных с клеткой. (гибче настройка под Ваши нужды) - Добавлено: Игрок из клетки может попросить прощения у присутствующих админов на сервере, админам придет уведомление, что игрок в клетке. (say /pardon) - Добавлено: Меню для досрочного освобождения из клетки (для админов) - Реализовано сохранение тех игроков, которые хотят обойти клетку. (т.е при выходе инфа сохраняется, и при входе такого игрока он опять окажется в клетке), спасибо: BlackSignature
[Fixed]:
- Все логи теперь выводятся в отдельный файл. (logs/spring/)
[Optimized]:
- Оптимизация кода по замечаниям. (с прежней версии) - Правки в коде с учетом новых переменных. (+ оптимизация)
Обновление без изменения версии
- У файла с расширением '.sma' была кривая кодировка.
Обновление до версии (1.3)
[Added]: - Добавлено уничтожение менюшек в еще несколько частей кода (menu_destroy(menu);), дабы не утекала память!, спасибо: Mistrick
[Fixed]: - Исправлен код в части выдачи прыжка совместно с fw_TakeDamage, конкретно переменная g_NoDamage сделана массивом, так как, если несколько прыгают на пружине сразу, все бы ломалось, спасибо: Denzer, Mistrick
[Update is critical]: - Опять же, обновление критично из-за утечки памяти (возможны лаги на предыдущих версиях), обязательно к обновлению!
Обновление до версии (1.2)
[Added]: - Функция SendAudio заменена на Emit_Sound, что бы звук не распростронялся на всю карту, спасибо: Jumper, w0w - Добавлен новый квар (SPRING_SOUND_CHECK) == выбор между слышимостью всем или 1 игроку который использует звук. (0/1 - всем/одному; настройка в .cfg), спасибо: Jumper
[Fixed]: - Добавлено уничтожение меню после его использования (menu_destroy), дабы не утекала память (могло привести к лагам на сервере и тп), спасибо: Mistrick
[Update is critical]: - Критичное обновление (рекомендация обновиться, так как, обновление касающееся утечки памяти не стоит игнорировать.)
Обновление до версии (1.1)
[Added]: - Реализовано мультиязычное меню (теперь пункты меню в LANG файле) - Добавлен квар (sp_time_offdmg). время до отключения бессмертия (бессмертие действует только для victim, т.е для игрока который прыгает. Другие смогут его убить.)
[Fixed]: - Правка кода функции феерверка (был обнаружен потанциальный краш), cпасибо: voed - Небольшая правка кода (изменил расположение g_UserFlags, удалил return FMRES_IGNORED; где вывод сообщений), спасибо: d3m37r4, fantom - Изменено бессмертие (fm_set_user_godmode) на отлов события (Ham_TakeDamage), дабы в полете урон можно было наносить другим игрокам, спасибо: Denzer, WILL_BE
[Optimized]: - Из внутриностей менюшек убраны не нужные значения, которые лишь захломляли код, спасибо: fl0wer - Из кода убраны переменные и значения которые больше не нужны, а также добавлено нужное новое.
К сожалению, у меня пока что нету прав редактировать первый пост для изменений оформления и добавления новой версии. По этому, обновление буду выкладывать по средствам сообщений.
Для плугина пружины, было сделано достаточно большое обновление, было многое оптимизировано, сокращен код и другое.
Информация обновления (ver 2.0.2)
* - ver 2.0.2: - Поправлен код в месте выбора времени на которое сажать в клетку (switch заменен на легкую конструкцию кода) спасибо: flower, Denzer (оптимизация). - Добавлен выбор между объектами перед перемещением. (новое меню и функции). - Изменен способ перемещения для клетки. (будут двигаться сразу все части клетки одновременно. раньше они двигались по одной и криво), спасибо за помощь в реализации: zhorzh78. - Изменен способ удаления частей клетки (изменена конструкия кода, его стало меньше, переделана работа с циклами), спасибо за помощь в реализации: zhorzh78, flower. - Изменен способ сохранения частей клетки (переработан код, его стало меньше). - Добавлен новый #include <fakemeta_util> (дабы неплодить лишнии stock, раз много их используется в плугине оттуда). - Добавлена новая проверка на класснейм (фича от удалений посторонних объектов на карте, которые можно нечайно удалить из-за особенностей карты.), спасибо за идею: BlackSignature, jumper. - Были внесены изменения в LANG файл. (добавлены новые строки, редактирование старых) - Некоторые переменные (массивы), переделаны с оптимизацией (например, обычные переменные для подстановки, превратились в двухмерный массив, сократился код) - Убраны лишнии строки захломаляющии код (которые по сути не нужны, например код в plugin_init по отключениям не нужных карт) - Переработано создание пунктов во всех меню. (сокращен код) - Исправлен баг с созданием 2го объекта если была пустая строка в файле сохранений координат, спасибо за помощь: BlackSignature - Убран #include <xs>, так как #include <fakemeta_util> сам его цепляет. - Добавлены новые #define позволяющие отключить скачивание пружино клетки или пружино-борда игроками, в зависимости от того, какой мод Вам нужен на сервере. (для удобства) -- Пояснение: --- Минимум 1 #define среди #define SPRING_MODE_CAGE и SPRING_MODE_BOARD, должен быть откомментирован. --- Если закомментирован #define SPRING_MODE_BOARD, то модель не качается, соответсвенно плугин нужно использовать только функции пружино-клетки (пункты меню настроек). --- Если закомментирован #define SPRING_MODE_CAGE, то модели не качаются, соотвественно плугин нужно использовать только для пружино-борда (пункты меню настроек). --- Если оба define откомментированы, то все модели качаются игроками, соотвественно плугин можно использовать целиком. (все пункты меню настроек). --- Если какой-то из #define среди #define SPRING_MODE_CAGE и SPRING_MODE_BOARD откомментирован, то нельзя нажимать пункты меню закомментированного мода!!! (иначе будут ошибки) --- Т.е: если пружино-борд, то не трогаем пункты (перемещение в клетку, создание пружины-клектки, перемещение пружино-клетки), иначе, не трогаем пункты (создание пружино-борда, перемещение пружино-борда) - Добавлен новый #define позволяющий отключить скачивание спрайтов от феерверка. (для удобства) -- Пояснение: --- Если закомментирован #define SPRING_FIREWORK, то спрайты не качаются, соответственно феерверк работать не будет. --- Если откомментирован #define SPRING_FIREWORK, то спрайты качаются, соответственно возможность работы феерверка будет, можно использовать настройки кваров феерверка.
Информация обновления (ver 2.0.3)
* - ver 2.0.3: - Исправлена функция .callback, (была ошибка в условие скрытия меню (просвечивания) от обычных админов, суть в том, если мод клетка, то обычным админам (ACCESS_ADMIN_FLAG) оставлять только 2 пункта (перемещение в клетку и освобождение из клетки), а системное просвечивать. (условие: if(str_to_num(data) > 5), заменено на: if(str_to_num(data) <= 5), пояснение: пункты 6 и 7, как раз необходимо оставлять, а остальное просвечивать).