Иконка ресурса

Sky Dynamic Lighting (MSK Timezone) 1.4.1

Нет прав для скачивания
Код:
#include <amxmodx>
#include <fakemeta>
#include <amxmisc>

#define PLUGIN "Sky Dynamic Lighting (MSK Timezone)"
#define VERSION "1.4.1"
#define AUTHOR "Deep+Avrora"

// Настройки по умолчанию
new const DEFAULT_SKY_DAY[] = "trainyard"
new const DEFAULT_SKY_MORNING[] = "morningdew"
new const DEFAULT_SKY_EVENING[] = "blue"
new const DEFAULT_SKY_NIGHT[] = "hav"

new const DEFAULT_LIGHT_NIGHT[] = "x"
new const DEFAULT_LIGHT_MORNING[] = "y"
new const DEFAULT_LIGHT_DAY[] = "y"
new const DEFAULT_LIGHT_EVENING[] = "t"

// Переменные для хранения настроек
new g_szSkyDay[32], g_szSkyMorning[32], g_szSkyEvening[32], g_szSkyNight[32]
new g_szLightNight[2], g_szLightMorning[2], g_szLightDay[2], g_szLightEvening[2]
new g_iTimeNightStart, g_iTimeMorningStart, g_iTimeDayStart, g_iTimeEveningStart
new bool:g_bPluginEnabled, bool:g_bChangeSky, bool:g_bChangeLighting

// Имя конфигурационного файла
new const CONFIG_FILE[] = "sky_time_my.cfg"

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
 
    // Регистрируем консольные команды для ручного управления
    register_concmd("amx_reload_skycfg", "cmd_reload_config", ADMIN_CFG, "Reload dynamic sky configuration")
 
    // Загружаем конфигурацию
    load_config()
 
    if(g_bPluginEnabled)
    {
        // Проверка каждую минуту + при смене раунда
        set_task(60.0, "update_environment", _, _, _, "b")
        register_event("HLTV", "on_new_round", "a", "1=0")
   
        // Первое обновление с задержкой
        set_task(3.0, "update_environment")
    }
}

public plugin_cfg()
{
    // Автоматически создаем конфиг если его нет
    auto_create_config()
}

public cmd_reload_config(id, level, cid)
{
    if(!cmd_access(id, level, cid, 1))
        return PLUGIN_HANDLED
   
    load_config()
    update_environment()
 
    client_print(id, print_chat, "[SkyControl] Configuration reloaded!")
    server_print("[SkyControl] Configuration reloaded by player %d", id)
 
    return PLUGIN_HANDLED
}

public on_new_round()
{
    if(g_bPluginEnabled)
        update_environment()
}

public update_environment()
{
    if(!g_bPluginEnabled)
        return
   
    new hour = get_msk_hour()
    new sky[32], light[2]
 
    // Определяем период суток по московскому времени
    if (hour >= g_iTimeNightStart || hour < g_iTimeMorningStart)        // Ночь
    {
        if(g_bChangeSky) copy(sky, charsmax(sky), g_szSkyNight)
        if(g_bChangeLighting) copy(light, charsmax(light), g_szLightNight)
    }
    else if (hour >= g_iTimeMorningStart && hour < g_iTimeDayStart)     // Утро
    {
        if(g_bChangeSky) copy(sky, charsmax(sky), g_szSkyMorning)
        if(g_bChangeLighting) copy(light, charsmax(light), g_szLightMorning)
    }
    else if (hour >= g_iTimeDayStart && hour < g_iTimeEveningStart)     // День
    {
        if(g_bChangeSky) copy(sky, charsmax(sky), g_szSkyDay)
        if(g_bChangeLighting) copy(light, charsmax(light), g_szLightDay)
    }
    else                                                                // Вечер
    {
        if(g_bChangeSky) copy(sky, charsmax(sky), g_szSkyEvening)
        if(g_bChangeLighting) copy(light, charsmax(light), g_szLightEvening)
    }
 
    // Применяем изменения
    if(g_bChangeSky && strlen(sky) > 0)
        apply_sky(sky)
   
    if(g_bChangeLighting && strlen(light) > 0)
        apply_lighting(light)
 
    // Отладочная информация
    server_print("[SkyControl] MSK Time: %d:00 | Sky: %s | Light: %s | SkyChange: %d | LightChange: %d",
        hour, g_bChangeSky ? sky : "DISABLED", g_bChangeLighting ? light : "DISABLED", g_bChangeSky, g_bChangeLighting)
}

stock get_msk_hour()
{
    new time[3], hour
    get_time("%H", time, 2)
 
    // Конвертируем в московское время (+3 часа)
    hour = (str_to_num(time) + 3) % 24
 
    return hour
}

apply_sky(const sky[])
{
    // Серверная команда
    server_cmd("sv_skyname %s", sky)
 
    // Клиентская синхронизация
    new players[32], pnum
    get_players(players, pnum, "ch")
 
    for(new i = 0; i < pnum; i++)
    {
        client_cmd(players, "sv_skyname ^"%s^"; wait; sv_skyname ^"%s^"", sky, sky)
    }
}

apply_lighting(const light[])
{
    // Двойное применение освещения
    engfunc(EngFunc_LightStyle, 0, light)
    message_begin(MSG_ALL, SVC_LIGHTSTYLE)
    write_byte(0)
    write_string(light)
    message_end()
}

load_config()
{
    new configsDir[64]
    get_configsdir(configsDir, charsmax(configsDir))
   
    new configPath[128]
    formatex(configPath, charsmax(configPath), "%s/%s", configsDir, CONFIG_FILE)
   
    if(!file_exists(configPath))
    {
        server_print("[SkyControl] Config file not found: %s", configPath)
        return
    }
   
    // Загружаем настройки
    g_bPluginEnabled = bool:read_config_int(configPath, "ENABLE_PLUGIN", 1)
    g_bChangeSky = bool:read_config_int(configPath, "ENABLE_SKY_CHANGES", 1)
    g_bChangeLighting = bool:read_config_int(configPath, "ENABLE_LIGHTING_CHANGES", 1)
   
    // Временные интервалы
    g_iTimeNightStart = read_config_int(configPath, "NIGHT_START_HOUR", 22)
    g_iTimeMorningStart = read_config_int(configPath, "MORNING_START_HOUR", 5)
    g_iTimeDayStart = read_config_int(configPath, "DAY_START_HOUR", 9)
    g_iTimeEveningStart = read_config_int(configPath, "EVENING_START_HOUR", 18)
   
    // Текстуры неба
    read_config_string(configPath, "SKY_DAY", g_szSkyDay, charsmax(g_szSkyDay), DEFAULT_SKY_DAY)
    read_config_string(configPath, "SKY_MORNING", g_szSkyMorning, charsmax(g_szSkyMorning), DEFAULT_SKY_MORNING)
    read_config_string(configPath, "SKY_EVENING", g_szSkyEvening, charsmax(g_szSkyEvening), DEFAULT_SKY_EVENING)
    read_config_string(configPath, "SKY_NIGHT", g_szSkyNight, charsmax(g_szSkyNight), DEFAULT_SKY_NIGHT)
   
    // Освещение
    read_config_string(configPath, "LIGHTING_DAY", g_szLightDay, charsmax(g_szLightDay), DEFAULT_LIGHT_DAY)
    read_config_string(configPath, "LIGHTING_MORNING", g_szLightMorning, charsmax(g_szLightMorning), DEFAULT_LIGHT_MORNING)
    read_config_string(configPath, "LIGHTING_EVENING", g_szLightEvening, charsmax(g_szLightEvening), DEFAULT_LIGHT_EVENING)
    read_config_string(configPath, "LIGHTING_NIGHT", g_szLightNight, charsmax(g_szLightNight), DEFAULT_LIGHT_NIGHT)
   
    server_print("[SkyControl] Configuration loaded successfully from: %s", configPath)
}

auto_create_config()
{
    new configsDir[64]
    get_configsdir(configsDir, charsmax(configsDir))
   
    new configPath[128]
    formatex(configPath, charsmax(configPath), "%s/%s", configsDir, CONFIG_FILE)
   
    if(file_exists(configPath))
        return
       
    server_print("[SkyControl] Creating default configuration file: %s", configPath)
   
    new file = fopen(configPath, "wt")
   
    if(!file)
    {
        server_print("[SkyControl] ERROR: Cannot create config file: %s", configPath)
        return
    }
   
    // Записываем конфигурационный файл с подробными комментариями
    write_file_header(file)
    write_plugin_settings(file)
    write_time_settings(file)
    write_sky_settings(file)
    write_lighting_settings(file)
   
    fclose(file)
    server_print("[SkyControl] Default configuration file created successfully!")
}

write_file_header(file)
{
    fprintf(file, "// ===================================================^n")
    fprintf(file, "// Dynamic Sky & Lighting Configuration^n")
    fprintf(file, "// ===================================================^n")
    fprintf(file, "//^n")
    fprintf(file, "// This file controls the automatic sky and lighting changes^n")
    fprintf(file, "// based on Moscow time (MSK UTC+3)^n")
    fprintf(file, "//^n")
    fprintf(file, "// File automatically generated by plugin^n")
    fprintf(file, "// ===================================================^n^n")
}

write_plugin_settings(file)
{
    fprintf(file, "// ===================================================^n")
    fprintf(file, "// PLUGIN SETTINGS^n")
    fprintf(file, "// ===================================================^n")
    fprintf(file, "//^n")
    fprintf(file, "// Enable or disable the entire plugin^n")
    fprintf(file, "// 0 = Disabled, 1 = Enabled^n")
    fprintf(file, "ENABLE_PLUGIN ^"%d^"^n^n", 1)
   
    fprintf(file, "// Enable sky texture changes^n")
    fprintf(file, "// 0 = Disabled, 1 = Enabled^n")
    fprintf(file, "ENABLE_SKY_CHANGES ^"%d^"^n^n", 1)
   
    fprintf(file, "// Enable lighting changes^n")
    fprintf(file, "// 0 = Disabled, 1 = Enabled^n")
    fprintf(file, "ENABLE_LIGHTING_CHANGES ^"%d^"^n^n", 1)
}

write_time_settings(file)
{
    fprintf(file, "// ===================================================^n")
    fprintf(file, "// TIME SETTINGS (MSK TIMEZONE - UTC+3)^n")
    fprintf(file, "// ===================================================^n")
    fprintf(file, "//^n")
    fprintf(file, "// All times are in 24-hour format (0-23)^n")
    fprintf(file, "// Night:   22:00 - 04:59^n")
    fprintf(file, "// Morning: 05:00 - 08:59^n")
    fprintf(file, "// Day:     09:00 - 17:59^n")
    fprintf(file, "// Evening: 18:00 - 21:59^n")
    fprintf(file, "//^n")
    fprintf(file, "NIGHT_START_HOUR ^"%d^"^n", 22)
    fprintf(file, "MORNING_START_HOUR ^"%d^"^n", 5)
    fprintf(file, "DAY_START_HOUR ^"%d^"^n", 9)
    fprintf(file, "EVENING_START_HOUR ^"%d^"^n^n", 18)
}

write_sky_settings(file)
{
    fprintf(file, "// ===================================================^n")
    fprintf(file, "// SKY TEXTURES SETTINGS^n")
    fprintf(file, "// ===================================================^n")
    fprintf(file, "//^n")
    fprintf(file, "// Available built-in CS 1.6 sky textures:^n")
    fprintf(file, "// trainyard, morningdew, blue, hav, space, desert, snow,^n")
    fprintf(file, "// jungle, urban, water, 2sky, 4sky, 5sky, 8sky, 9sky^n")
    fprintf(file, "//^n")
    fprintf(file, "// Day sky texture (09:00-17:59)^n")
    fprintf(file, "SKY_DAY ^"%s^"^n^n", DEFAULT_SKY_DAY)
   
    fprintf(file, "// Morning sky texture (05:00-08:59)^n")
    fprintf(file, "SKY_MORNING ^"%s^"^n^n", DEFAULT_SKY_MORNING)
   
    fprintf(file, "// Evening sky texture (18:00-21:59)^n")
    fprintf(file, "SKY_EVENING ^"%s^"^n^n", DEFAULT_SKY_EVENING)
   
    fprintf(file, "// Night sky texture (22:00-04:59)^n")
    fprintf(file, "SKY_NIGHT ^"%s^"^n^n", DEFAULT_SKY_NIGHT)
}

write_lighting_settings(file)
{
    fprintf(file, "// ===================================================^n")
    fprintf(file, "// LIGHTING SETTINGS^n")
    fprintf(file, "// ===================================================^n")
    fprintf(file, "//^n")
    fprintf(file, "// Available lighting values:^n")
    fprintf(file, "// a - pitch black (darkest)^n")
    fprintf(file, "// b - very dark^n")
    fprintf(file, "// c - dark^n")
    fprintf(file, "// d - dim^n")
    fprintf(file, "// e - slightly dim^n")
    fprintf(file, "// f - neutral^n")
    fprintf(file, "// g - slightly bright^n")
    fprintf(file, "// h - bright^n")
    fprintf(file, "// i - very bright^n")
    fprintf(file, "// j - extremely bright^n")
    fprintf(file, "// k - brightest (almost white)^n")
    fprintf(file, "// m - neutral bright^n")
    fprintf(file, "// n - outdoor daylight^n")
    fprintf(file, "// o - warehouse style^n")
    fprintf(file, "// p - foggy style^n")
    fprintf(file, "// q - rainy style^n")
    fprintf(file, "// r - desert style^n")
    fprintf(file, "// s - overcast^n")
    fprintf(file, "// t - evening style^n")
    fprintf(file, "// u - industrial^n")
    fprintf(file, "// v - cave style^n")
    fprintf(file, "// w - underwater^n")
    fprintf(file, "// x - night (default dark)^n")
    fprintf(file, "// y - normal daylight (default bright)^n")
    fprintf(file, "// z - medium bright^n")
    fprintf(file, "//^n")
    fprintf(file, "// Day lighting (09:00-17:59)^n")
    fprintf(file, "LIGHTING_DAY ^"%s^"^n^n", DEFAULT_LIGHT_DAY)
   
    fprintf(file, "// Morning lighting (05:00-08:59)^n")
    fprintf(file, "LIGHTING_MORNING ^"%s^"^n^n", DEFAULT_LIGHT_MORNING)
   
    fprintf(file, "// Evening lighting (18:00-21:59)^n")
    fprintf(file, "LIGHTING_EVENING ^"%s^"^n^n", DEFAULT_LIGHT_EVENING)
   
    fprintf(file, "// Night lighting (22:00-04:59)^n")
    fprintf(file, "LIGHTING_NIGHT ^"%s^"^n^n", DEFAULT_LIGHT_NIGHT)
}

// Исправленные функции чтения конфига
stock read_config_int(const config_path[], const key[], default_value)
{
    new value = default_value
    new file = fopen(config_path, "rt")
   
    if(!file)
        return value
       
    new line[128], current_key[64], current_value[64]
   
    while(!feof(file))
    {
        fgets(file, line, charsmax(line))
       
        // Пропускаем комментарии и пустые строки
        if(line[0] == ';' || line[0] == '/' || line[0] == '^n' || strlen(line) < 3)
            continue
           
        // Парсим ключ и значение
        if(parse(line, current_key, charsmax(current_key), current_value, charsmax(current_value)) == 2)
        {
            if(equal(current_key, key))
            {
                // Убираем кавычки если есть
                if(current_value[0] == '"' && current_value[strlen(current_value)-1] == '"')
                {
                    current_value[strlen(current_value)-1] = 0
                    value = str_to_num(current_value[1])
                }
                else
                {
                    value = str_to_num(current_value)
                }
                break
            }
        }
    }
   
    fclose(file)
    server_print("[SkyControl] Config: %s = %d", key, value)
    return value
}

stock read_config_string(const config_path[], const key[], buffer[], buffer_size, const default_value[])
{
    copy(buffer, buffer_size, default_value)
    new file = fopen(config_path, "rt")
   
    if(!file)
        return
       
    new line[128], current_key[64], current_value[64]
   
    while(!feof(file))
    {
        fgets(file, line, charsmax(line))
       
        // Пропускаем комментарии и пустые строки
        if(line[0] == ';' || line[0] == '/' || line[0] == '^n' || strlen(line) < 3)
            continue
           
        // Парсим ключ и значение
        if(parse(line, current_key, charsmax(current_key), current_value, charsmax(current_value)) == 2)
        {
            if(equal(current_key, key))
            {
                // Убираем кавычки если есть
                if(current_value[0] == '"' && current_value[strlen(current_value)-1] == '"')
                {
                    current_value[strlen(current_value)-1] = 0
                    copy(buffer, buffer_size, current_value[1])
                }
                else
                {
                    copy(buffer, buffer_size, current_value)
                }
                break
            }
        }
    }
   
    fclose(file)
    server_print("[SkyControl] Config: %s = %s", key, buffer)
}
Назад
Верх