#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)
}