Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

ExplosionOnSpawn

, >><<
Статус пользователя pulse.
сообщение 6.10.2012, 14:17
Сообщение #1
Стаж: 13 лет

Сообщений: 260
Благодарностей: 12
Полезность: < 0

Hello World, недавно скачал плагин ExplosionOnSpawn на одном сайте, можно сделать чтобы hud сообщения высвечивались без всяких там словарей...
(а именно ExplosionOnSpawn.txt файла)
Прошу сделайте, с меня +
- Вот ланг файл
ExplosionOnSpawn.txt
Код
[ru]
#Countdown = Внимание, до взрыва осталось %d!
#Explosion = Внимание, на месте взрыва осталась радиация!


- Вот исходник.
ExplosionOnSpawn.sma
Код
// Инклуды
#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.0, 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);
    
    // Словарь
    register_dictionary("ExplosionOnSpawn.txt");
    
#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, "%L", LANG_PLAYER, "#Countdown", 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, "%L", LANG_PLAYER, "#Countdown", g_iCountdown);
        #else
    show_hudmessage(0, "%L", LANG_PLAYER, "#Countdown", g_iCountdown);
        #endif
    #else
    set_dhudmessage(HUD_COLOR_1, HUD_XY_1, HUD_EFFECT_1, HUD_TIMES_1, false);
    show_dhudmessage(0, "%L", LANG_PLAYER, "#Countdown", 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, "%L", LANG_PLAYER, "#Countdown", 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, "%L", LANG_PLAYER, "#Countdown", g_iCountdown);
        #else
    show_hudmessage(0, "%L", LANG_PLAYER, "#Countdown", g_iCountdown);
        #endif
    #else
    set_dhudmessage(HUD_COLOR_1, HUD_XY_1, HUD_EFFECT_1, HUD_TIMES_1, false);
    show_dhudmessage(0, "%L", LANG_PLAYER, "#Countdown", 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, "%L", LANG_PLAYER, "#Countdown", --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, "%L", LANG_PLAYER, "#Countdown", --g_iCountdown);
        #else
    show_hudmessage(0, "%L", LANG_PLAYER, "#Countdown", --g_iCountdown);
        #endif
    #else
    set_dhudmessage(HUD_COLOR_1, HUD_XY_1, HUD_EFFECT_1, HUD_TIMES_1, false);
    show_dhudmessage(0, "%L", LANG_PLAYER, "#Countdown", --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, "%L", LANG_PLAYER, "#Explosion", g_iCountdown);
#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, "%L", LANG_PLAYER, "#Explosion", g_iCountdown);
        #else
    show_hudmessage(0, "%L", LANG_PLAYER, "#Explosion", g_iCountdown);
        #endif
    #else
    set_dhudmessage(HUD_COLOR_2, HUD_XY_2, HUD_EFFECT_2, HUD_TIMES_2, false);
    show_dhudmessage(0, "%L", LANG_PLAYER, "#Explosion", g_iCountdown);
    #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]);

blush2.gif pardon.gif

Отредактировал: pulse., - 6.10.2012, 14:21
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
proskill
сообщение 6.10.2012, 14:30
Сообщение #2
Стаж: 13 лет

Сообщений: 187
Благодарностей: 31
Полезность: 0

Я не понял, что нужно сделать, просто чтобы не было txt файла?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Andrei
сообщение 6.10.2012, 14:35
Сообщение #3


Стаж: 15 лет

Сообщений: 1335
Благодарностей: 693
Полезность: 740

Тактично авторство поменяли )
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
PRoSToTeM@
сообщение 6.10.2012, 14:37
Сообщение #4
Стаж: 16 лет

Сообщений: 25
Благодарностей: 2
Полезность: 0

Ого.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя pulse.
сообщение 6.10.2012, 14:42
Сообщение #5
Стаж: 13 лет

Сообщений: 260
Благодарностей: 12
Полезность: < 0

Bos93, Ничего не менял т.к. боюсь ченить испортить
proskill,
Нет чтобы худ сообщение
Код
#Countdown = Внимание, до взрыва осталось %d!
#Explosion = Внимание, на месте взрыва осталась радиация!

Высвечивались без txt, т.к. сервер english да и вообще ошибку выдает какую-то.

PRoSToTeM@,
Надеюсь ты не в обиде на меня... blush.gif


ps.gif добавлять строки не умею sad.gif

Отредактировал: pulse., - 6.10.2012, 14:47
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя S0m3Th1nG_AwFul!
сообщение 7.10.2012, 12:21
Сообщение #6
Стаж: 15 лет

Сообщений: 454
Благодарностей: 323
Полезность: 961

Необходимость в Txt убрана. При компиляции не забудь кинуть dhudmessage.inc в папку include, если такого нет там.
Прикрепленные файлы:
Прикрепленный файл  explosion.sma ( 15,28 килобайт ) Кол-во скачиваний: 16
Прикрепленный файл  dhudmessage_include.zip ( 1,18 килобайт ) Кол-во скачиваний: 9
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя pulse.
сообщение 25.10.2012, 18:37
Сообщение #7
Стаж: 13 лет

Сообщений: 260
Благодарностей: 12
Полезность: < 0

Можно как-нибудь исправить ошибку? (/ Через сколько времени взрывать)
// Р?нклуды
#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
Сообщение #8
Стаж: 13 лет

Сообщений: 140
Благодарностей: 13
Полезность: 78

можно) вот:
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 раз
   + Цитировать сообщение
  Тема закрытаНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: