ExplosionOnSpawn, >><< |
Здравствуйте, гость Вход | Регистрация
Наши новости:
|
|
|
ExplosionOnSpawn, >><< |
proskill
|
6.10.2012, 14:30
Сообщение
|
|
|
Я не понял, что нужно сделать, просто чтобы не было txt файла?
|
Поблагодарили 1 раз
|
|
Andrei
|
6.10.2012, 14:35
Сообщение
|
![]() |
Тактично авторство поменяли )
|
Поблагодарили 1 раз
|
|
PRoSToTeM@
|
6.10.2012, 14:37
Сообщение
|
|
|
Ого.
|
Поблагодарили 1 раз
|
|
S0m3Th1nG_AwFul!
|
7.10.2012, 12:21
Сообщение
|
|
|
Необходимость в Txt убрана. При компиляции не забудь кинуть dhudmessage.inc в папку include, если такого нет там.
Прикрепленные файлы:
explosion.sma ( 15,28 килобайт )
Кол-во скачиваний: 16
dhudmessage_include.zip ( 1,18 килобайт )
Кол-во скачиваний: 9 |
Поблагодарили 1 раз
|
|
pulse.
|
25.10.2012, 18:37
Сообщение
|
|
|
Можно как-нибудь исправить ошибку? (/ Через сколько времени взрывать) // Р?нклуды #include <amxmodx> #include <cstrike> #include <dhudmessage> #include <engine> #include <fakemeta> #include <hamsandwich> // http://wiki.alliedmods.net/CBaseToggle_%28CS%29 #define m_bitsDamageInflict 71 #define CBaseToggle 4 // http://wiki.alliedmods.net/CEnvExplosion_%28CS%29 РјРѕР№ вклад =) #define m_iMagnitude 96 #define m_spriteScale 97 #define CEnvExplosion 5 // Настройки #define EXPLOSION_TIME 20.0 // Через сколько времени взрывать #define EXPLOSION_SPRITESCALE 30 // Размер спрайта взрыва, 0 - рассчитывать РїРѕ магнитуде #define EXPLOSION_MAGNITUDEMULTI 1.5 // Множитель магнитуды #define EXPLOSION_MAGNITUDERADIUS 3.5 // !!!РќР• МЕНЯТЬ!!! Р’Рѕ сколько раз радиус больше магнитуды #define RADIATION_ZONEMULTI 1.2 // Множитель Р·РѕРЅС‹ радиации #define RADIATION_DAMAGE 50.0 // Количество СѓСЂРѕРЅР° РІ секунду #define PROTECTION_TIME 10.0 // Время протекции (0.0 - выключить) #define COUNTDOWN_SOUND 1 // Включить Р·РІСѓРєРё РїСЂРё отсчёте #define COUNTDOWN_WORD "explosion attention radiation" // РџСЂРѕРёР·РЅРѕСЃРёРјРѕРµ слово/словосочетание/предложение РїСЂРё взрыве #define COUNTDOWN_HUD 2 // Как показывать отсчёт (0 - print_center, 1 - HUD, 2 - DHUD) #define HUD_COLOR_1 255, 0, 0 // Цвет С…СѓРґР° отсчёта #define HUD_XY_1 -1.0, 0.3 // Координаты С…СѓРґР° отсчёта #define HUD_EFFECT_1 0 // Рффект С…СѓРґР° отсчёта #define HUD_TIMES_1 0.0, 1.01, 0.0, 0.0 // Время С…СѓРґР° отсчёта #define HUD_COLOR_2 0, 255, 255 // Цвет С…СѓРґР° взрыва #define HUD_XY_2 -1.0, 0.3 // Координаты С…СѓРґР° взрыва #define HUD_EFFECT_2 2 // Рффект С…СѓРґР° взрыва #define HUD_TIMES_2 0.0, 5.0, 0.05, 0.9 // Время С…СѓРґР° взрыва #define HUD_CHANNEL -1 // Канал С…СѓРґР° // Отсчёт new g_iCountdown; #if PROTECTION_TIME // Протекция new Float:g_flPlayerProtection[33]; #endif // Размеры Р·РѕРЅС‹ радиации new Float:g_vecSize[2][3]; // Рнтити создающая взрыв new g_pExplo; // Рнтити наносящая СѓСЂРѕРЅ new g_pDamage; #if COUNTDOWN_HUD == 1 && HUD_CHANNEL == -1 // Канал С…СѓРґР° new g_sync; #endif // Р?РЅРёС‚ public plugin_init() { // Регистрируем плагин register_plugin("Explosion on spawn", "Epsilon", "Microbe"); // Копирайт :D set_pcvar_string(register_cvar("Explosion_on_spawn", "Epsilon, Microbe", FCVAR_SERVER | FCVAR_SPONLY), "Epsilon, Microbe"); // Событие РЅРѕРІРѕРіРѕ раунда register_event("HLTV", "EventRoundStart", "a", "1=0", "2=0"); #if PROTECTION_TIME // Событие спавна РёРіСЂРѕРєР° RegisterHam(Ham_Spawn, "player", "PlayerSpawnPost", 1); // Событие получения СѓСЂРѕРЅР° РёРіСЂРѕРєРѕРј RegisterHam(Ham_TakeDamage, "player", "PlayerTakeDamagePre", 0); #endif // Событие смерти РёРіСЂРѕРєР° RegisterHam(Ham_Killed, "player", "PlayerKilledPre", 0); RegisterHam(Ham_Killed, "player", "PlayerKilledPost", 1); #if COUNTDOWN_HUD == 1 && HUD_CHANNEL == -1 // Создаём новый канал С…СѓРґР° g_sync = CreateHudSyncObj(); #endif // Получаем координаты new Float:vecOrigin[3]; FindCentreSpawnCoordSize(vecOrigin, g_vecSize); // Получаем координаты Рё размеры // Создаём энтити g_pExplo = create_entity("env_explosion"); // Устанавливаем координаты entity_set_origin(g_pExplo, vecOrigin); // Выставляем флаги entity_set_int(g_pExplo, EV_INT_spawnflags, SF_ENVEXPLOSION_REPEATABLE); // Выставляем магнитуду set_pdata_int(g_pExplo, m_iMagnitude, floatround(VectorLength(g_vecSize[0]) / RADIATION_ZONEMULTI / EXPLOSION_MAGNITUDERADIUS * EXPLOSION_MAGNITUDEMULTI), CEnvExplosion); // Р?митируем спаун DispatchSpawn(g_pExplo); #if EXPLOSION_SPRITESCALE // Размер спрайта set_pdata_int(g_pExplo, m_spriteScale, EXPLOSION_SPRITESCALE, CEnvExplosion); #endif // Создаём энтити g_pDamage = create_entity("trigger_hurt"); // Устанавливаем координаты entity_set_origin(g_pDamage, vecOrigin); // Устанавливаем СѓСЂРѕРЅ entity_set_float(g_pDamage, EV_FL_dmg, RADIATION_DAMAGE); // Устанавливаем тип СѓСЂРѕРЅР° set_pdata_int(g_pDamage, m_bitsDamageInflict, DMG_RADIATION, CBaseToggle); // Р?митируем спаун DispatchSpawn(g_pDamage); // Выключаем энтити entity_set_int(g_pDamage, EV_INT_solid, SOLID_NOT); entity_set_float(g_pDamage, EV_FL_nextthink, 0.0); // Отсчёт g_iCountdown = floatround(EXPLOSION_TIME, floatround_floor); #if !COUNTDOWN_HUD client_print(0, print_center, "Внимание! До взрыва осталось %d!", g_iCountdown); #else #if COUNTDOWN_HUD == 1 set_hudmessage(HUD_COLOR_1, HUD_XY_1, HUD_EFFECT_1, HUD_TIMES_1, HUD_CHANNEL); #if HUD_CHANNEL == -1 ShowSyncHudMsg(0, g_sync, "Внимание! До взрыва осталось %d!", g_iCountdown); #else show_hudmessage(0, "Внимание! До взрыва осталось %d!", g_iCountdown); #endif #else set_dhudmessage(HUD_COLOR_1, HUD_XY_1, HUD_EFFECT_1, HUD_TIMES_1, false); show_dhudmessage(0, "Внимание! До взрыва осталось %d!", g_iCountdown); #endif #endif set_task(1.0, "TaskCountdown", _, _, _, "a", g_iCountdown - 1); #if COUNTDOWN_SOUND // Проигрываем Р·РІСѓРє new szWord[32]; num_to_word(g_iCountdown, szWord, 31); client_cmd(0, "spk ^"%s^"", szWord); #endif // Взрываем через время set_task(EXPLOSION_TIME, "TaskExplode"); } // Новый раунд public EventRoundStart() { // Выключаем энтити entity_set_int(g_pDamage, EV_INT_solid, SOLID_NOT); entity_set_float(g_pDamage, EV_FL_nextthink, 0.0); // Убираем таск remove_task(); // Отсчёт g_iCountdown = floatround(EXPLOSION_TIME, floatround_floor); #if !COUNTDOWN_HUD client_print(0, print_center, "Внимание! До взрыва осталось %d!", g_iCountdown); #else #if COUNTDOWN_HUD == 1 set_hudmessage(HUD_COLOR_1, HUD_XY_1, HUD_EFFECT_1, HUD_TIMES_1, HUD_CHANNEL); #if HUD_CHANNEL == -1 ShowSyncHudMsg(0, g_sync, "Внимание! До взрыва осталось %d!", g_iCountdown); #else show_hudmessage(0, "Внимание! До взрыва осталось %d!", g_iCountdown); #endif #else set_dhudmessage(HUD_COLOR_1, HUD_XY_1, HUD_EFFECT_1, HUD_TIMES_1, false); show_dhudmessage(0, "Внимание! До взрыва осталось %d!", g_iCountdown); #endif #endif set_task(1.0, "TaskCountdown", _, _, _, "a", g_iCountdown - 1); #if COUNTDOWN_SOUND // Проигрываем Р·РІСѓРє new szWord[32]; num_to_word(g_iCountdown, szWord, 31); client_cmd(0, "spk ^"%s^"", szWord); #endif // Взрываем через время set_task(EXPLOSION_TIME, "TaskExplode"); } #if PROTECTION_TIME // Событие спауна РёРіСЂРѕРєР° public PlayerSpawnPost(pPlayer) g_flPlayerProtection[pPlayer] = get_gametime() + PROTECTION_TIME; // Событие получения СѓСЂРѕРЅР° РёРіСЂРѕРєРѕРј public PlayerTakeDamagePre(pPlayer, pInflictor, pAttacker, Float:flDamage, bitsDamage) { // Если СѓСЂРѕРЅ наносит РЅРµ взрыв Рё РЅРµ радиация if (pAttacker != g_pExplo && pAttacker != g_pDamage) return HAM_IGNORED; // Если СѓР¶Рµ РЅРµ время протекции if (g_flPlayerProtection[pPlayer] <= get_gametime()) return HAM_IGNORED; // Блокируем return HAM_SUPERCEDE; } #endif // Событие смерти РёРіСЂРѕРєР° (ДО) public PlayerKilledPre(pPlayer, pAttacker, iShouldGib) { // Если СѓР±РёР» РЅРµ взрыв Рё РЅРµ радиация if (pAttacker != g_pExplo && pAttacker != g_pDamage) return; // Блокируем смерти set_msg_block(get_user_msgid("ScoreInfo"), BLOCK_SET); } // Событие смерти РёРіСЂРѕРєР° public PlayerKilledPost(pPlayer, pAttacker, iShouldGib) { // Если СѓР±РёР» РЅРµ взрыв Рё РЅРµ радиация if (pAttacker != g_pExplo && pAttacker != g_pDamage) return; // Возвращаем смерти cs_set_user_deaths(pPlayer, cs_get_user_deaths(pPlayer) - 1); set_msg_block(get_user_msgid("ScoreInfo"), BLOCK_NOT); } // Отсчёт public TaskCountdown() { // Показываем #if !COUNTDOWN_HUD client_print(0, print_center, "Внимание! До взрыва осталось %d!", --g_iCountdown); #else #if COUNTDOWN_HUD == 1 set_hudmessage(HUD_COLOR_1, HUD_XY_1, HUD_EFFECT_1, HUD_TIMES_1, HUD_CHANNEL); #if HUD_CHANNEL == -1 ShowSyncHudMsg(0, g_sync, "Внимание! До взрыва осталось %d!", --g_iCountdown); #else show_hudmessage(0, "Внимание! До взрыва осталось %d!", --g_iCountdown); #endif #else set_dhudmessage(HUD_COLOR_1, HUD_XY_1, HUD_EFFECT_1, HUD_TIMES_1, false); show_dhudmessage(0, "%Внимание! До взрыва осталось %d!", --g_iCountdown); #endif #endif #if COUNTDOWN_SOUND // Проигрываем Р·РІСѓРє new szWord[32]; num_to_word(g_iCountdown, szWord, 31); client_cmd(0, "spk ^"%s^"", szWord); #endif } // Взрываем public TaskExplode() { #if COUNTDOWN_SOUND // Р—РІСѓРє РїСЂРё взрыве client_cmd(0, "spk ^"%s^"", COUNTDOWN_WORD); #endif // Взрываем ExecuteHamB(Ham_Use, g_pExplo, 0, 0, 0, 0); // Включаем entity_set_int(g_pDamage, EV_INT_solid, SOLID_TRIGGER); entity_set_float(g_pDamage, EV_FL_nextthink, get_gametime()); entity_set_size(g_pDamage, g_vecSize[0], g_vecSize[1]); // Показываем сообщение #if !COUNTDOWN_HUD client_print(0, print_center, "Внимание, РЅР° месте взрыва осталась радиация!"); #else #if COUNTDOWN_HUD == 1 set_hudmessage(HUD_COLOR_2, HUD_XY_2, HUD_EFFECT_2, HUD_TIMES_2, HUD_CHANNEL); #if HUD_CHANNEL == -1 ShowSyncHudMsg(0, g_sync, "Внимание! РќР° месте взрыва осталась радиация!"); #else show_hudmessage(0, "Внимание! РќР° месте взрыва осталась радиация!"); #endif #else set_dhudmessage(HUD_COLOR_2, HUD_XY_2, HUD_EFFECT_2, HUD_TIMES_2, false); show_dhudmessage(0, "Внимание! РќР° месте взрыва осталась радиация!"); #endif #endif } // Р?щем центральные координаты FindCentreSpawnCoordSize(Float:vecOrigin[3], Float:vecSize[2][3]) { new iSpawns; // Количество спавнов new Float:vecOrigin2[3]; // Координаты спавна new pEntity; // Рнтити спавна // Р?щем энтити спавна while ((pEntity = find_ent_by_class(pEntity, "info_player_start"))) { // Получаем её координаты entity_get_vector(pEntity, EV_VEC_origin, vecOrigin2); // Находим крайнюю точку if (iSpawns) VectorMin(vecSize[0], vecOrigin2, vecSize[0]); else vecSize[0] = vecOrigin2; // Прибавляем Рє тоталу координат VectorAdd(vecOrigin, vecOrigin2, vecOrigin); // Ещё РѕРґРёРЅ iSpawns++; } // Делим тотал коодинат РЅР° количество спавнов VectorDivide(vecOrigin, float(iSpawns), vecOrigin); // Получаем минусовые размеры VectorSubtract(vecSize[0], vecOrigin, vecSize[0]); // Увеличиваем РёС… РІ N раз VectorScale(vecSize[0], RADIATION_ZONEMULTI, vecSize[0]); // Получаем положительные размеры VectorNegative(vecSize[0], vecSize[1]); // Прибавляем дополнительную высоту для Р·РѕРЅС‹ vecSize[0][2] += -36.0; vecSize[1][2] += 36.0; } // Найти меньший вектор VectorMin(const Float:vec1[3], const Float:vec2[3], Float:vecOut[3]) { vecOut[0] = floatmin(vec1[0], vec2[0]); vecOut[1] = floatmin(vec1[1], vec2[1]); vecOut[2] = floatmin(vec1[2], vec2[2]); } // Сложить векторы VectorAdd(const Float:vec1[3], const Float:vec2[3], Float:vecOut[3]) { vecOut[0] = vec1[0] + vec2[0]; vecOut[1] = vec1[1] + vec2[1]; vecOut[2] = vec1[2] + vec2[2]; } // Вычесть векторы VectorSubtract(const Float:vec1[3], const Float:vec2[3], Float:vecOut[3]) { vecOut[0] = vec1[0] - vec2[0]; vecOut[1] = vec1[1] - vec2[1]; vecOut[2] = vec1[2] - vec2[2]; } // Получить вектор противоположный РїРѕ знакам данному VectorNegative(const Float:vec[3], Float:vecOut[3]) { vecOut[0] = -vec[0]; vecOut[1] = -vec[1]; vecOut[2] = -vec[2]; } // Поделить вектор РЅР° число VectorDivide(const Float:vec[3], const Float:fl, Float:vecOut[3]) { vecOut[0] = vec[0] / fl; vecOut[1] = vec[1] / fl; vecOut[2] = vec[2] / fl; } // Умножить вектор РЅР° число VectorScale(const Float:vec[3], const Float:fl, Float:vecOut[3]) { vecOut[0] = vec[0] * fl; vecOut[1] = vec[1] * fl; vecOut[2] = vec[2] * fl; } // Получить длину вектора Float:VectorLength(const Float:vec[3]) return floatsqroot(vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]);
Отредактировал: pulse., - 25.10.2012, 18:38
|
|
|
|
freeone
|
25.10.2012, 18:58
Сообщение
|
|
|
можно) вот:
plugin // Инклуды #include <amxmodx> #include <cstrike> #include <dhudmessage> #include <engine> #include <fakemeta> #include <hamsandwich> // http://wiki.alliedmods.net/CBaseToggle_%28CS%29 #define m_bitsDamageInflict 71 #define CBaseToggle 4 // http://wiki.alliedmods.net/CEnvExplosion_%28CS%29 мой вклад =) #define m_iMagnitude 96 #define m_spriteScale 97 #define CEnvExplosion 5 // Настройки #define EXPLOSION_TIME 20.0 // Через сколько времени взрывать #define EXPLOSION_SPRITESCALE 30 // Размер спрайта взрыва, 0 - рассчитывать по магнитуде #define EXPLOSION_MAGNITUDEMULTI 1.5 // Множитель магнитуды #define EXPLOSION_MAGNITUDERADIUS 3.5 // !!!НЕ МЕНЯТЬ!!! Во сколько раз радиус больше магнитуды #define RADIATION_ZONEMULTI 1.2 // Множитель зоны радиации #define RADIATION_DAMAGE 50.0 // Количество урона в секунду #define PROTECTION_TIME 10.0 // Время протекции (0.0 - выключить) #define COUNTDOWN_SOUND 1 // Включить звуки при отсчёте #define COUNTDOWN_WORD "explosion attention radiation" // Произносимое слово/словосочетание/предложение при взрыве #define COUNTDOWN_HUD 2 // Как показывать отсчёт (0 - print_center, 1 - HUD, 2 - DHUD) #define HUD_COLOR_1 255, 0, 0 // Цвет худа отсчёта #define HUD_XY_1 -1.0, 0.3 // Координаты худа отсчёта #define HUD_EFFECT_1 0 // Эффект худа отсчёта #define HUD_TIMES_1 0.0, 1.01, 0.0, 0.0 // Время худа отсчёта #define HUD_COLOR_2 0, 255, 255 // Цвет худа взрыва #define HUD_XY_2 -1.0, 0.3 // Координаты худа взрыва #define HUD_EFFECT_2 2 // Эффект худа взрыва #define HUD_TIMES_2 0.0, 5.0, 0.05, 0.9 // Время худа взрыва #define HUD_CHANNEL -1 // Канал худа // Отсчёт new g_iCountdown; #if PROTECTION_TIME // Протекция new Float:g_flPlayerProtection[33]; #endif // Размеры зоны радиации new Float:g_vecSize[2][3]; // Энтити создающая взрыв new g_pExplo; // Энтити наносящая урон new g_pDamage; #if COUNTDOWN_HUD == 1 && HUD_CHANNEL == -1 // Канал худа new g_sync; #endif // Инит public plugin_init() { // Регистрируем плагин register_plugin("Explosion on spawn", "Epsilon", "Microbe"); // Копирайт :D set_pcvar_string(register_cvar("Explosion_on_spawn", "Epsilon, Microbe", FCVAR_SERVER | FCVAR_SPONLY), "Epsilon, Microbe"); // Событие нового раунда register_event("HLTV", "EventRoundStart", "a", "1=0", "2=0"); #if PROTECTION_TIME // Событие спавна игрока RegisterHam(Ham_Spawn, "player", "PlayerSpawnPost", 1); // Событие получения урона игроком RegisterHam(Ham_TakeDamage, "player", "PlayerTakeDamagePre", 0); #endif // Событие смерти игрока RegisterHam(Ham_Killed, "player", "PlayerKilledPre", 0); RegisterHam(Ham_Killed, "player", "PlayerKilledPost", 1); #if COUNTDOWN_HUD == 1 && HUD_CHANNEL == -1 // Создаём новый канал худа g_sync = CreateHudSyncObj(); #endif // Получаем координаты new Float:vecOrigin[3]; FindCentreSpawnCoordSize(vecOrigin, g_vecSize); // Получаем координаты и размеры // Создаём энтити g_pExplo = create_entity("env_explosion"); // Устанавливаем координаты entity_set_origin(g_pExplo, vecOrigin); // Выставляем флаги entity_set_int(g_pExplo, EV_INT_spawnflags, SF_ENVEXPLOSION_REPEATABLE); // Выставляем магнитуду set_pdata_int(g_pExplo, m_iMagnitude, floatround(VectorLength(g_vecSize[0]) / RADIATION_ZONEMULTI / EXPLOSION_MAGNITUDERADIUS * EXPLOSION_MAGNITUDEMULTI), CEnvExplosion); // Имитируем спаун DispatchSpawn(g_pExplo); #if EXPLOSION_SPRITESCALE // Размер спрайта set_pdata_int(g_pExplo, m_spriteScale, EXPLOSION_SPRITESCALE, CEnvExplosion); #endif // Создаём энтити g_pDamage = create_entity("trigger_hurt"); // Устанавливаем координаты entity_set_origin(g_pDamage, vecOrigin); // Устанавливаем урон entity_set_float(g_pDamage, EV_FL_dmg, RADIATION_DAMAGE); // Устанавливаем тип урона set_pdata_int(g_pDamage, m_bitsDamageInflict, DMG_RADIATION, CBaseToggle); // Имитируем спаун DispatchSpawn(g_pDamage); // Выключаем энтити entity_set_int(g_pDamage, EV_INT_solid, SOLID_NOT); entity_set_float(g_pDamage, EV_FL_nextthink, 0.0); // Отсчёт g_iCountdown = floatround(EXPLOSION_TIME, floatround_floor); #if !COUNTDOWN_HUD client_print(0, print_center, "Внимание! До взрыва осталось %d!", g_iCountdown); #else #if COUNTDOWN_HUD == 1 set_hudmessage(HUD_COLOR_1, HUD_XY_1, HUD_EFFECT_1, HUD_TIMES_1, HUD_CHANNEL); #if HUD_CHANNEL == -1 ShowSyncHudMsg(0, g_sync, "Внимание! До взрыва осталось %d!", g_iCountdown); #else show_hudmessage(0, "Внимание! До взрыва осталось %d!", g_iCountdown); #endif #else set_dhudmessage(HUD_COLOR_1, HUD_XY_1, HUD_EFFECT_1, HUD_TIMES_1, false); show_dhudmessage(0, "Внимание! До взрыва осталось %d!", g_iCountdown); #endif #endif set_task(1.0, "TaskCountdown", _, _, _, "a", g_iCountdown - 1); #if COUNTDOWN_SOUND // Проигрываем звук new szWord[32]; num_to_word(g_iCountdown, szWord, 31); client_cmd(0, "spk ^"%s^"", szWord); #endif // Взрываем через время set_task(EXPLOSION_TIME, "TaskExplode"); } // Новый раунд public EventRoundStart() { // Выключаем энтити entity_set_int(g_pDamage, EV_INT_solid, SOLID_NOT); entity_set_float(g_pDamage, EV_FL_nextthink, 0.0); // Убираем таск remove_task(); // Отсчёт g_iCountdown = floatround(EXPLOSION_TIME, floatround_floor); #if !COUNTDOWN_HUD client_print(0, print_center, "Внимание! До взрыва осталось %d!", g_iCountdown); #else #if COUNTDOWN_HUD == 1 set_hudmessage(HUD_COLOR_1, HUD_XY_1, HUD_EFFECT_1, HUD_TIMES_1, HUD_CHANNEL); #if HUD_CHANNEL == -1 ShowSyncHudMsg(0, g_sync, "Внимание! До взрыва осталось %d!", g_iCountdown); #else show_hudmessage(0, "Внимание! До взрыва осталось %d!", g_iCountdown); #endif #else set_dhudmessage(HUD_COLOR_1, HUD_XY_1, HUD_EFFECT_1, HUD_TIMES_1, false); show_dhudmessage(0, "Внимание! До взрыва осталось %d!", g_iCountdown); #endif #endif set_task(1.0, "TaskCountdown", _, _, _, "a", g_iCountdown - 1); #if COUNTDOWN_SOUND // Проигрываем звук new szWord[32]; num_to_word(g_iCountdown, szWord, 31); client_cmd(0, "spk ^"%s^"", szWord); #endif // Взрываем через время set_task(EXPLOSION_TIME, "TaskExplode"); } #if PROTECTION_TIME // Событие спауна игрока public PlayerSpawnPost(pPlayer) g_flPlayerProtection[pPlayer] = get_gametime() + PROTECTION_TIME; // Событие получения урона игроком public PlayerTakeDamagePre(pPlayer, pInflictor, pAttacker, Float:flDamage, bitsDamage) { // Если урон наносит не взрыв и не радиация if (pAttacker != g_pExplo && pAttacker != g_pDamage) return HAM_IGNORED; // Если уже не время протекции if (g_flPlayerProtection[pPlayer] <= get_gametime()) return HAM_IGNORED; // Блокируем return HAM_SUPERCEDE; } #endif // Событие смерти игрока (ДО) public PlayerKilledPre(pPlayer, pAttacker, iShouldGib) { // Если убил не взрыв и не радиация if (pAttacker != g_pExplo && pAttacker != g_pDamage) return; // Блокируем смерти set_msg_block(get_user_msgid("ScoreInfo"), BLOCK_SET); } // Событие смерти игрока public PlayerKilledPost(pPlayer, pAttacker, iShouldGib) { // Если убил не взрыв и не радиация if (pAttacker != g_pExplo && pAttacker != g_pDamage) return; // Возвращаем смерти cs_set_user_deaths(pPlayer, cs_get_user_deaths(pPlayer) - 1); set_msg_block(get_user_msgid("ScoreInfo"), BLOCK_NOT); } // Отсчёт public TaskCountdown() { // Показываем #if !COUNTDOWN_HUD client_print(0, print_center, "Внимание! До взрыва осталось %d!", --g_iCountdown); #else #if COUNTDOWN_HUD == 1 set_hudmessage(HUD_COLOR_1, HUD_XY_1, HUD_EFFECT_1, HUD_TIMES_1, HUD_CHANNEL); #if HUD_CHANNEL == -1 ShowSyncHudMsg(0, g_sync, "Внимание! До взрыва осталось %d!", --g_iCountdown); #else show_hudmessage(0, "Внимание! До взрыва осталось %d!", --g_iCountdown); #endif #else set_dhudmessage(HUD_COLOR_1, HUD_XY_1, HUD_EFFECT_1, HUD_TIMES_1, false); show_dhudmessage(0, "%Внимание! До взрыва осталось %d!", --g_iCountdown); #endif #endif #if COUNTDOWN_SOUND // Проигрываем звук new szWord[32]; num_to_word(g_iCountdown, szWord, 31); client_cmd(0, "spk ^"%s^"", szWord); #endif } // Взрываем public TaskExplode() { #if COUNTDOWN_SOUND // Звук при взрыве client_cmd(0, "spk ^"%s^"", COUNTDOWN_WORD); #endif // Взрываем ExecuteHamB(Ham_Use, g_pExplo, 0, 0, 0, 0); // Включаем entity_set_int(g_pDamage, EV_INT_solid, SOLID_TRIGGER); entity_set_float(g_pDamage, EV_FL_nextthink, get_gametime()); entity_set_size(g_pDamage, g_vecSize[0], g_vecSize[1]); // Показываем сообщение #if !COUNTDOWN_HUD client_print(0, print_center, "Внимание, на месте взрыва осталась радиация!"); #else #if COUNTDOWN_HUD == 1 set_hudmessage(HUD_COLOR_2, HUD_XY_2, HUD_EFFECT_2, HUD_TIMES_2, HUD_CHANNEL); #if HUD_CHANNEL == -1 ShowSyncHudMsg(0, g_sync, "Внимание! На месте взрыва осталась радиация!"); #else show_hudmessage(0, "Внимание! На месте взрыва осталась радиация!"); #endif #else set_dhudmessage(HUD_COLOR_2, HUD_XY_2, HUD_EFFECT_2, HUD_TIMES_2, false); show_dhudmessage(0, "Внимание! На месте взрыва осталась радиация!"); #endif #endif } // Ищем центральные координаты FindCentreSpawnCoordSize(Float:vecOrigin[3], Float:vecSize[2][3]) { new iSpawns; // Количество спавнов new Float:vecOrigin2[3]; // Координаты спавна new pEntity; // Энтити спавна // Ищем энтити спавна while ((pEntity = find_ent_by_class(pEntity, "info_player_start"))) { // Получаем её координаты entity_get_vector(pEntity, EV_VEC_origin, vecOrigin2); // Находим крайнюю точку if (iSpawns) VectorMin(vecSize[0], vecOrigin2, vecSize[0]); else vecSize[0] = vecOrigin2; // Прибавляем к тоталу координат VectorAdd(vecOrigin, vecOrigin2, vecOrigin); // Ещё один iSpawns++; } // Делим тотал коодинат на количество спавнов VectorDivide(vecOrigin, float(iSpawns), vecOrigin); // Получаем минусовые размеры VectorSubtract(vecSize[0], vecOrigin, vecSize[0]); // Увеличиваем их в N раз VectorScale(vecSize[0], RADIATION_ZONEMULTI, vecSize[0]); // Получаем положительные размеры VectorNegative(vecSize[0], vecSize[1]); // Прибавляем дополнительную высоту для зоны vecSize[0][2] += -36.0; vecSize[1][2] += 36.0; } // Найти меньший вектор VectorMin(const Float:vec1[3], const Float:vec2[3], Float:vecOut[3]) { vecOut[0] = floatmin(vec1[0], vec2[0]); vecOut[1] = floatmin(vec1[1], vec2[1]); vecOut[2] = floatmin(vec1[2], vec2[2]); } // Сложить векторы VectorAdd(const Float:vec1[3], const Float:vec2[3], Float:vecOut[3]) { vecOut[0] = vec1[0] + vec2[0]; vecOut[1] = vec1[1] + vec2[1]; vecOut[2] = vec1[2] + vec2[2]; } // Вычесть векторы VectorSubtract(const Float:vec1[3], const Float:vec2[3], Float:vecOut[3]) { vecOut[0] = vec1[0] - vec2[0]; vecOut[1] = vec1[1] - vec2[1]; vecOut[2] = vec1[2] - vec2[2]; } // Получить вектор противоположный по знакам данному VectorNegative(const Float:vec[3], Float:vecOut[3]) { vecOut[0] = -vec[0]; vecOut[1] = -vec[1]; vecOut[2] = -vec[2]; } // Поделить вектор на число VectorDivide(const Float:vec[3], const Float:fl, Float:vecOut[3]) { vecOut[0] = vec[0] / fl; vecOut[1] = vec[1] / fl; vecOut[2] = vec[2] / fl; } // Умножить вектор на число VectorScale(const Float:vec[3], const Float:fl, Float:vecOut[3]) { vecOut[0] = vec[0] * fl; vecOut[1] = vec[1] * fl; vecOut[2] = vec[2] * fl; } // Получить длину вектора Float:VectorLength(const Float:vec[3]) return floatsqroot(vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]); |
Поблагодарили 1 раз
|
|
![]() ![]() |