Zoom на киллера после смерти

  • Автор темы Автор темы Shkrest
  • Дата начала Дата начала
Сообщения
36
Реакции
2
Баллы
8
C:
#include <amxmodx>
#include <csstatsx_sql>
#include <hamsandwich>

#define PLUGIN "CSStatsX: Death Info"
#define VERSION "1.7"
#define AUTHOR "Avrora-CSDM.Online"

// Массив для хранения урона между игроками
new g_player_damage[MAX_PLAYERS + 1][MAX_PLAYERS + 1]

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    register_event("DeathMsg", "event_death_msg", "a")
    
    // Регистрируем хам-хуки для учета урона
    RegisterHam(Ham_TakeDamage, "player", "ham_take_damage_post", 1)
    
    // Обнуляем урон при подключении
    register_event("ResetHUD", "event_reset_hud", "be")
    
    // Регистрируем начало раунда для обнуления урона
    register_logevent("event_round_start", 2, "1=Round_Start")
}

public event_reset_hud(id)
{
    arrayset(g_player_damage[id], 0, MAX_PLAYERS + 1)
}

public event_round_start()
{
    for(new i = 1; i <= MAX_PLAYERS; i++)
    {
        arrayset(g_player_damage[i], 0, MAX_PLAYERS + 1)
    }
}

public ham_take_damage_post(victim, inflictor, attacker, Float:damage, damagebits)
{
    if(!is_user_connected(attacker) || !is_user_connected(victim) || attacker == victim)
        return HAM_IGNORED
    
    if(attacker < 1 || attacker > MAX_PLAYERS)
        return HAM_IGNORED
    
    g_player_damage[attacker][victim] += floatround(damage)
    
    return HAM_IGNORED
}

public event_death_msg()
{
    new killer = read_data(1)
    new victim = read_data(2)
    
    if(killer == victim || killer == 0)
        return
        
    if(!is_user_connected(killer) || !is_user_connected(victim))
        return
    
    // Получаем статистику игроков
    new killer_stats[8], killer_hits[8], killer_rank
    new victim_stats[8], victim_hits[8], victim_rank
    
    killer_rank = get_user_stats_sql(killer, killer_stats, killer_hits)
    victim_rank = get_user_stats_sql(victim, victim_stats, victim_hits)
    
    // Получаем урон между игроками
    new damage_to_victim = g_player_damage[killer][victim]
    new damage_from_killer = g_player_damage[victim][killer]
    
    // Вычисляем эффективность урона
    new efficiency_killer, efficiency_victim
    new total_damage = damage_to_victim + damage_from_killer
    
    if(total_damage > 0)
    {
        efficiency_killer = (damage_to_victim * 100) / total_damage
        efficiency_victim = (damage_from_killer * 100) / total_damage
    }
    
    // Формируем сообщения для чата
    new chat_message_victim[128], chat_message_killer[128]
    
    // Сообщение для жертвы
    formatex(chat_message_victim, charsmax(chat_message_victim),
             "[Stats] Убит! Урон: Вы %d | Вам %d, Эфф. урона: %d%%",
             damage_from_killer, damage_to_victim, efficiency_victim)
    
    // Сообщение для убийцы
    formatex(chat_message_killer, charsmax(chat_message_killer),
             "[Stats] Убийство! Урон: Вы %d | Вам %d, Эфф. урона: %d%% Ранг: Вы %d | Жертва %d",
             damage_to_victim, damage_from_killer, efficiency_killer, killer_rank, victim_rank)
    
    // Выводим сообщения в чат
    client_print(victim, print_chat, chat_message_victim)
    
    if(is_user_connected(killer) && killer != victim)
    {
        client_print(killer, print_chat, chat_message_killer)
    }
    
    // Обнуляем урон между этими игроками
    g_player_damage[killer][victim] = 0
    g_player_damage[victim][killer] = 0
}




Сделал плагин хотел еще зум добавить на киллера. Но не знаю как помогите реализовать пожалуйста, если можно конечно.
 
@Shkrest,
Код:
#include <amxmodx>
#include <csstatsx_sql>
#include <hamsandwich>

#define PLUGIN "CSStatsX: Death Info"
#define VERSION "1.7"
#define AUTHOR "Avrora-CSDM.Online"

// Массив для хранения урона между игроками
new g_player_damage[MAX_PLAYERS + 1][MAX_PLAYERS + 1]
new cvar_zoom_distance, g_msgfov

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    register_event("DeathMsg", "event_death_msg", "a")
    
    // Регистрируем хам-хуки для учета урона
    RegisterHam(Ham_TakeDamage, "player", "ham_take_damage_post", 1)
    
    // Обнуляем урон при подключении
    register_event("ResetHUD", "event_reset_hud", "be")
    
    // Регистрируем начало раунда для обнуления урона
    register_logevent("event_round_start", 2, "1=Round_Start")
    
    cvar_zoom_distance = register_cvar("zoom_distance", "20")
    
    g_msgfov = get_user_msgid("SetFOV")
}

public event_reset_hud(id)
{
    arrayset(g_player_damage[id], 0, MAX_PLAYERS + 1)
}

public event_round_start()
{
    for(new i = 1; i <= MAX_PLAYERS; i++)
    {
        arrayset(g_player_damage[i], 0, MAX_PLAYERS + 1)
    }
}

public ham_take_damage_post(victim, inflictor, attacker, Float:damage, damagebits)
{
    if(!is_user_connected(attacker) || !is_user_connected(victim) || attacker == victim)
        return HAM_IGNORED
    
    if(attacker < 1 || attacker > MAX_PLAYERS)
        return HAM_IGNORED
    
    g_player_damage[attacker][victim] += floatround(damage)
    
    return HAM_IGNORED
}

public event_death_msg()
{
    new killer = read_data(1)
    new victim = read_data(2)
    
    if(killer == victim || killer == 0)
        return
        
    if(!is_user_connected(killer) || !is_user_connected(victim))
        return
    
    set_task(0.1, "zoom_effect", victim)
    
    // Получаем статистику игроков
    new killer_stats[8], killer_hits[8], killer_rank
    new victim_stats[8], victim_hits[8], victim_rank
    
    killer_rank = get_user_stats_sql(killer, killer_stats, killer_hits)
    victim_rank = get_user_stats_sql(victim, victim_stats, victim_hits)
    
    // Получаем урон между игроками
    new damage_to_victim = g_player_damage[killer][victim]
    new damage_from_killer = g_player_damage[victim][killer]
    
    // Вычисляем эффективность урона
    new efficiency_killer, efficiency_victim
    new total_damage = damage_to_victim + damage_from_killer
    
    if(total_damage > 0)
    {
        efficiency_killer = (damage_to_victim * 100) / total_damage
        efficiency_victim = (damage_from_killer * 100) / total_damage
    }
    
    // Формируем сообщения для чата
    new chat_message_victim[128], chat_message_killer[128]
    
    // Сообщение для жертвы
    formatex(chat_message_victim, charsmax(chat_message_victim),
             "[Stats] Убит! Урон: Вы %d | Вам %d, Эфф. урона: %d%%",
             damage_from_killer, damage_to_victim, efficiency_victim)
    
    // Сообщение для убийцы
    formatex(chat_message_killer, charsmax(chat_message_killer),
             "[Stats] Убийство! Урон: Вы %d | Вам %d, Эфф. урона: %d%% Ранг: Вы %d | Жертва %d",
             damage_to_victim, damage_from_killer, efficiency_killer, killer_rank, victim_rank)
    
    // Выводим сообщения в чат
    client_print(victim, print_chat, chat_message_victim)
    
    if(is_user_connected(killer) && killer != victim)
    {
        client_print(killer, print_chat, chat_message_killer)
    }
    
    // Обнуляем урон между этими игроками
    g_player_damage[killer][victim] = 0
    g_player_damage[victim][killer] = 0
}

public zoom_effect(id)
{
    message_begin(MSG_ONE, g_msgfov, _, id)
    write_byte(get_pcvar_num(cvar_zoom_distance))
    message_end()
}
 
@Shkrest,
Код:
#include <amxmodx>
#include <csstatsx_sql>
#include <hamsandwich>

#define PLUGIN "CSStatsX: Death Info"
#define VERSION "1.7"
#define AUTHOR "Avrora-CSDM.Online"

// Массив для хранения урона между игроками
new g_player_damage[MAX_PLAYERS + 1][MAX_PLAYERS + 1]
new cvar_zoom_distance, g_msgfov

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    register_event("DeathMsg", "event_death_msg", "a")
   
    // Регистрируем хам-хуки для учета урона
    RegisterHam(Ham_TakeDamage, "player", "ham_take_damage_post", 1)
   
    // Обнуляем урон при подключении
    register_event("ResetHUD", "event_reset_hud", "be")
   
    // Регистрируем начало раунда для обнуления урона
    register_logevent("event_round_start", 2, "1=Round_Start")
   
    cvar_zoom_distance = register_cvar("zoom_distance", "20")
   
    g_msgfov = get_user_msgid("SetFOV")
}

public event_reset_hud(id)
{
    arrayset(g_player_damage[id], 0, MAX_PLAYERS + 1)
}

public event_round_start()
{
    for(new i = 1; i <= MAX_PLAYERS; i++)
    {
        arrayset(g_player_damage[i], 0, MAX_PLAYERS + 1)
    }
}

public ham_take_damage_post(victim, inflictor, attacker, Float:damage, damagebits)
{
    if(!is_user_connected(attacker) || !is_user_connected(victim) || attacker == victim)
        return HAM_IGNORED
   
    if(attacker < 1 || attacker > MAX_PLAYERS)
        return HAM_IGNORED
   
    g_player_damage[attacker][victim] += floatround(damage)
   
    return HAM_IGNORED
}

public event_death_msg()
{
    new killer = read_data(1)
    new victim = read_data(2)
   
    if(killer == victim || killer == 0)
        return
       
    if(!is_user_connected(killer) || !is_user_connected(victim))
        return
   
    set_task(0.1, "zoom_effect", victim)
   
    // Получаем статистику игроков
    new killer_stats[8], killer_hits[8], killer_rank
    new victim_stats[8], victim_hits[8], victim_rank
   
    killer_rank = get_user_stats_sql(killer, killer_stats, killer_hits)
    victim_rank = get_user_stats_sql(victim, victim_stats, victim_hits)
   
    // Получаем урон между игроками
    new damage_to_victim = g_player_damage[killer][victim]
    new damage_from_killer = g_player_damage[victim][killer]
   
    // Вычисляем эффективность урона
    new efficiency_killer, efficiency_victim
    new total_damage = damage_to_victim + damage_from_killer
   
    if(total_damage > 0)
    {
        efficiency_killer = (damage_to_victim * 100) / total_damage
        efficiency_victim = (damage_from_killer * 100) / total_damage
    }
   
    // Формируем сообщения для чата
    new chat_message_victim[128], chat_message_killer[128]
   
    // Сообщение для жертвы
    formatex(chat_message_victim, charsmax(chat_message_victim),
             "[Stats] Убит! Урон: Вы %d | Вам %d, Эфф. урона: %d%%",
             damage_from_killer, damage_to_victim, efficiency_victim)
   
    // Сообщение для убийцы
    formatex(chat_message_killer, charsmax(chat_message_killer),
             "[Stats] Убийство! Урон: Вы %d | Вам %d, Эфф. урона: %d%% Ранг: Вы %d | Жертва %d",
             damage_to_victim, damage_from_killer, efficiency_killer, killer_rank, victim_rank)
   
    // Выводим сообщения в чат
    client_print(victim, print_chat, chat_message_victim)
   
    if(is_user_connected(killer) && killer != victim)
    {
        client_print(killer, print_chat, chat_message_killer)
    }
   
    // Обнуляем урон между этими игроками
    g_player_damage[killer][victim] = 0
    g_player_damage[victim][killer] = 0
}

public zoom_effect(id)
{
    message_begin(MSG_ONE, g_msgfov, _, id)
    write_byte(get_pcvar_num(cvar_zoom_distance))
    message_end()
}
Спасибо. Проверю вернусь.
 
Код:
#include <amxmodx>
#include <csstatsx_sql>
#include <hamsandwich>
#include <fakemeta>

#define PLUGIN "CSStatsX: Death Info"
#define VERSION "1.9"
#define AUTHOR "Avrora-CSDM.Online"

// Массив для хранения уронa между игроками
new g_player_damage[MAX_PLAYERS + 1][MAX_PLAYERS + 1]
new bool:g_plugin_working = true

// Переменные для зума
new g_msgSetFOV
new g_cvar_zoom_distance

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    register_event("DeathMsg", "event_death_msg", "a")
    
    // Регистрируем хам-хуки для учета уронa
    if(!RegisterHam(Ham_TakeDamage, "player", "ham_take_damage_post", 1))
    {
        log_amx("ERROR: Failed to register Ham_TakeDamage hook")
        g_plugin_working = false
        return
    }
    
    // Обнуляем урон при подключении
    register_event("ResetHUD", "event_reset_hud", "be")
    
    // Регистрируем начало раунда для обнуления уронa
    register_logevent("event_round_start", 2, "1=Round_Start")
    
    // Инициализация зума
    g_msgSetFOV = get_user_msgid("SetFOV")
    g_cvar_zoom_distance = register_cvar("csstats_zoom_distance", "60")
    
    // Проверяем наличие CSStatsX SQL
    if(!is_csstatsx_loaded())
    {
        log_amx("ERROR: CSStatsX SQL plugin not found")
        g_plugin_working = false
    }
}

public event_reset_hud(id)
{
    if(!g_plugin_working) return
    
    arrayset(g_player_damage[id], 0, MAX_PLAYERS + 1)
}

public event_round_start()
{
    if(!g_plugin_working) return
    
    for(new i = 1; i <= MAX_PLAYERS; i++)
    {
        arrayset(g_player_damage[i], 0, MAX_PLAYERS + 1)
    }
}

public ham_take_damage_post(victim, inflictor, attacker, Float:damage, damagebits)
{
    if(!g_plugin_working) return HAM_IGNORED
    
    if(!is_user_connected(attacker) || !is_user_connected(victim) || attacker == victim)
        return HAM_IGNORED
    
    if(attacker < 1 || attacker > MAX_PLAYERS)
        return HAM_IGNORED
    
    // Защита от переполнения
    if(g_player_damage[attacker][victim] < 10000) // Максимум 10000 уронa
    {
        g_player_damage[attacker][victim] += floatround(damage)
    }
    
    return HAM_IGNORED
}

public event_death_msg()
{
    if(!g_plugin_working) return
    
    new killer = read_data(1)
    new victim = read_data(2)
    
    if(killer == victim || killer == 0)
        return
        
    if(!is_user_connected(killer) || !is_user_connected(victim))
        return
    
    // Защита от некорректных индексов
    if(killer < 1 || killer > MAX_PLAYERS || victim < 1 || victim > MAX_PLAYERS)
        return
    
    // Получаем статистику игроков с проверкой
    new killer_stats[8], killer_hits[8], killer_rank
    new victim_stats[8], victim_hits[8], victim_rank
    
    killer_rank = get_user_stats_sql(killer, killer_stats, killer_hits)
    victim_rank = get_user_stats_sql(victim, victim_stats, victim_hits)
    
    // Проверяем валидность данных
    if(killer_rank < 0 || victim_rank < 0)
        return
    
    // Получаем урон между игроками
    new damage_to_victim = g_player_damage[killer][victim]
    new damage_from_killer = g_player_damage[victim][killer]
    
    // Защита от деления на ноль
    new efficiency_killer = 0, efficiency_victim = 0
    new total_damage = damage_to_victim + damage_from_killer
    
    if(total_damage > 0)
    {
        efficiency_killer = (damage_to_victim * 100) / total_damage
        efficiency_victim = (damage_from_killer * 100) / total_damage
    }
    
    // Выводим в чат
    client_print(victim, print_chat, "[Stats] Урон: Вы %d | Вам %d, Эфф: %d%%",
                 damage_from_killer, damage_to_victim, efficiency_victim)
    
    if(is_user_connected(killer) && killer != victim)
    {
        client_print(killer, print_chat, "[Stats] Убил! Урон: Вы %d | Вам %d, Эфф: %d%% Ранг: %d/%d",
                     damage_to_victim, damage_from_killer, efficiency_killer, killer_rank, victim_rank)
    }
    
    // Применяем зум для жертвы
    if(is_user_connected(killer) && is_user_alive(killer))
    {
        set_task(0.5, "apply_zoom_effect", victim)
    }
    
    // Обнуляем урон
    g_player_damage[killer][victim] = 0
    g_player_damage[victim][killer] = 0
}

// Функция для применения зума
public apply_zoom_effect(victim)
{
    if(!is_user_connected(victim))
        return
    
    // Устанавливаем зум
    message_begin(MSG_ONE, g_msgSetFOV, _, victim)
    write_byte(get_pcvar_num(g_cvar_zoom_distance)) // Уровень зума (60 = приближение)
    message_end()
    
    // Возвращаем нормальный обзор через 3 секунды
    set_task(3.0, "reset_zoom_effect", victim)
}

// Функция для сброса зума
public reset_zoom_effect(victim)
{
    if(!is_user_connected(victim))
        return
    
    // Возвращаем нормальный FOV
    message_begin(MSG_ONE, g_msgSetFOV, _, victim)
    write_byte(90) // Нормальный FOV
    message_end()
}

// Функция для проверки загруженности CSStatsX SQL
bool:is_csstatsx_loaded()
{
    new filename[64]
    new plugin_count = get_pluginsnum()
    
    for(new i = 0; i < plugin_count; i++)
    {
        get_plugin(i, filename, charsmax(filename), _, _, _, _, _, _, _)
        
        if(containi(filename, "csstatsx_sql") != -1 || containi(filename, "CSStatsX SQL") != -1)
        {
            return true
        }
    }
    
    return false
}
 

Кто просматривает тему

Назад
Верх