Run it
Copy the script and paste it into your executor.
Players = :()
Lighting = :()
TweenService = :()
RunService = :()
UserInputService = :()
HttpService = :()
Debris = :()
player = Players.LocalPlayer
camera = .CurrentCamera
currentLang =
i18nListeners = {}
I18N = {
EN = {
appTitle = ,
searchPlaceholder = ,
btnResetAll = ,
btnHideUI = ,
stateOn = ,
stateOff = ,
tab_SkyWeather = ,
tab_LightShadows = ,
tab_StudioRig = ,
tab_AtmoWorld = ,
tab_PostFX = ,
tab_Camera = ,
tab_Configs = ,
sec_Sunset = ,
sec_TimeCelestial = ,
sec_Weather = ,
sec_LightMode = ,
sec_DirectShadows = ,
sec_AmbientPBR = ,
sec_ManualRGB = ,
sec_StudioRig = ,
sec_Atmosphere = ,
sec_ClassicFog = ,
sec_CloudsWind = ,
sec_Water = ,
sec_LUTs = ,
sec_ColorCorrection = ,
sec_BloomRaysBlur = ,
sec_DoF = ,
sec_LensCinema = ,
sec_Freecam = ,
sec_BuiltInPresets = ,
sec_CustomConfigs = ,
sec_ImportExport = ,
style_Realistic = ,
style_PastelPink = ,
style_ColdNordic = ,
style_WarmCinema = ,
w_Clear = ,
w_Cloudy = ,
w_Overcast = ,
w_Rain = ,
w_Snow = ,
w_Fog = ,
w_Cyberpunk = ,
qt_Dawn = ,
qt_Sunrise = ,
qt_Noon = ,
qt_Sunset = ,
qt_Dusk = ,
qt_Midnight = ,
sunsetWarmth = ,
clockTime = ,
autoTime = ,
timeSpeed = ,
latitude = ,
sunSize = ,
moonSize = ,
starCount = ,
celestialShown = ,
rainRate = ,
wetReflectance = ,
rainVolume = ,
rainSplashes = ,
dustRate = ,
btnLightning = ,
sp_SharpRTX = ,
sp_SoftReal = ,
sp_HighContrast = ,
sp_SoftDiffused = ,
sp_DarkCinema = ,
sp_MaxFPS = ,
fullManualMode = ,
globalShadows = ,
rtxReflections = ,
colorTemp = ,
tempTint = ,
brightnessMult = ,
manualBrightness = ,
exposure = ,
shadowSoftness = ,
outdoorBoost = ,
ambientBoost = ,
specularScale = ,
diffuseScale = ,
manualLightColors = ,
col_Top = ,
col_Bot = ,
col_Outdoor = ,
col_Ambient = ,
rigEnabled = ,
rigMode_Camera = ,
rigMode_Char = ,
rigMode_World = ,
rigShadows = ,
rigDistance = ,
keyBright = ,
keyRange = ,
col_Key = ,
fillBright = ,
fillRange = ,
col_Fill = ,
rimBright = ,
rimRange = ,
col_Rim = ,
atmoEnabled = ,
atmoDensity = ,
atmoOffset = ,
atmoHaze = ,
atmoGlare = ,
manualAtmoColors = ,
col_Atmo = ,
col_Decay = ,
fogStart = ,
fogEnd = ,
col_Fog = ,
cloudsEnabled = ,
cloudCover = ,
cloudDensity = ,
manualCloudColor = ,
col_Cloud = ,
windSpeed = ,
windAngle = ,
waterWaveSize = ,
waterWaveSpeed = ,
waterReflect = ,
waterTrans = ,
col_Water = ,
lut_Natural = ,
lut_Clean = ,
lut_Film = ,
lut_Blockbuster = ,
lut_Pastel = ,
lut_Nordic = ,
lut_Cyber = ,
lut_Noir = ,
ccEnabled = ,
ccBrightness = ,
ccSaturation = ,
ccContrast = ,
col_Tint = ,
bloomEnabled = ,
bloomIntensity = ,
bloomSize = ,
bloomThreshold = ,
sunRaysEnabled = ,
sunRaysMult = ,
sunRaysSpread = ,
blurSize = ,
motionBlur = ,
motionBlurStrength = ,
dofEnabled = ,
dofAuto = ,
dofFar = ,
dofNear = ,
dofDist = ,
dofRadius = ,
fov = ,
camRoll = ,
cinemaBars = ,
cinemaHeight = ,
vignette = ,
vignetteOpacity = ,
lensFlare = ,
flareIntensity = ,
freecam = ,
freecamSpeed = ,
walkSpeed = ,
gravity = ,
cfgNamePlaceholder = ,
btnSaveCfg = ,
btnExportCurrent = ,
btnImportBox = ,
jsonPlaceholder = ,
cfgSavedMsg = ,
cfgLoadedMsg = ,
cfgInvalidMsg = ,
btnLoad = ,
btnDelete = ,
},
RU = {
appTitle = ,
searchPlaceholder = ,
btnResetAll = ,
btnHideUI = ,
stateOn = ,
stateOff = ,
tab_SkyWeather = ,
tab_LightShadows = ,
tab_StudioRig = ,
tab_AtmoWorld = ,
tab_PostFX = ,
tab_Camera = ,
tab_Configs = ,
sec_Sunset = ,
sec_TimeCelestial = ,
sec_Weather = ,
sec_LightMode = ,
sec_DirectShadows = ,
sec_AmbientPBR = ,
sec_ManualRGB = ,
sec_StudioRig = ,
sec_Atmosphere = ,
sec_ClassicFog = ,
sec_CloudsWind = ,
sec_Water = ,
sec_LUTs = ,
sec_ColorCorrection = ,
sec_BloomRaysBlur = ,
sec_DoF = ,
sec_LensCinema = ,
sec_Freecam = ,
sec_BuiltInPresets = ,
sec_CustomConfigs = ,
sec_ImportExport = ,
style_Realistic = ,
style_PastelPink = ,
style_ColdNordic = ,
style_WarmCinema = ,
w_Clear = ,
w_Cloudy = ,
w_Overcast = ,
w_Rain = ,
w_Snow = ,
w_Fog = ,
w_Cyberpunk = ,
qt_Dawn = ,
qt_Sunrise = ,
qt_Noon = ,
qt_Sunset = ,
qt_Dusk = ,
qt_Midnight = ,
sunsetWarmth = ,
clockTime = ,
autoTime = ,
timeSpeed = ,
latitude = ,
sunSize = ,
moonSize = ,
starCount = ,
celestialShown = ,
rainRate = ,
wetReflectance = ,
rainVolume = ,
rainSplashes = ,
dustRate = ,
btnLightning = ,
sp_SharpRTX = ,
sp_SoftReal = ,
sp_HighContrast = ,
sp_SoftDiffused = ,
sp_DarkCinema = ,
sp_MaxFPS = ,
fullManualMode = ,
globalShadows = ,
rtxReflections = ,
colorTemp = ,
tempTint = ,
brightnessMult = ,
manualBrightness = ,
exposure = ,
shadowSoftness = ,
outdoorBoost = ,
ambientBoost = ,
specularScale = ,
diffuseScale = ,
manualLightColors = ,
col_Top = ,
col_Bot = ,
col_Outdoor = ,
col_Ambient = ,
rigEnabled = ,
rigMode_Camera = ,
rigMode_Char = ,
rigMode_World = ,
rigShadows = ,
rigDistance = ,
keyBright = ,
keyRange = ,
col_Key = ,
fillBright = ,
fillRange = ,
col_Fill = ,
rimBright = ,
rimRange = ,
col_Rim = ,
atmoEnabled = ,
atmoDensity = ,
atmoOffset = ,
atmoHaze = ,
atmoGlare = ,
manualAtmoColors = ,
col_Atmo = ,
col_Decay = ,
fogStart = ,
fogEnd = ,
col_Fog = ,
cloudsEnabled = ,
cloudCover = ,
cloudDensity = ,
manualCloudColor = ,
col_Cloud = ,
windSpeed = ,
windAngle = ,
waterWaveSize = ,
waterWaveSpeed = ,
waterReflect = ,
waterTrans = ,
col_Water = ,
lut_Natural = ,
lut_Clean = ,
lut_Film = ,
lut_Blockbuster = ,
lut_Pastel = ,
lut_Nordic = ,
lut_Cyber = ,
lut_Noir = ,
ccEnabled = ,
ccBrightness = ,
ccSaturation = ,
ccContrast = ,
col_Tint = ,
bloomEnabled = ,
bloomIntensity = ,
bloomSize = ,
bloomThreshold = ,
sunRaysEnabled = ,
sunRaysMult = ,
sunRaysSpread = ,
blurSize = ,
motionBlur = ,
motionBlurStrength = ,
dofEnabled = ,
dofAuto = ,
dofFar = ,
dofNear = ,
dofDist = ,
dofRadius = ,
fov = ,
camRoll = ,
cinemaBars = ,
cinemaHeight = ,
vignette = ,
vignetteOpacity = ,
lensFlare = ,
flareIntensity = ,
freecam = ,
freecamSpeed = ,
walkSpeed = ,
gravity = ,
cfgNamePlaceholder = ,
btnSaveCfg = ,
btnExportCurrent = ,
btnImportBox = ,
jsonPlaceholder = ,
cfgSavedMsg = ,
cfgLoadedMsg = ,
cfgInvalidMsg = ,
btnLoad = ,
btnDelete = ,
}
}
(key)
dict = I18N[currentLang] I18N.EN
dict[key] I18N.EN[key] key
(fn)
.(i18nListeners, fn)
()
internalWrite =
currentClockTime =
currentWeather =
rtxEnabled =
autoTimeEnabled =
secondsPerGameMinute =
isLightningActive =
baseSunRays =
defaultConfig = {
fullManualMode = ,
sunsetStyle = ,
sunsetWarmth = ,
geographicLatitude = ,
sunAngularSize = ,
moonAngularSize = ,
starCount = ,
celestialShown = ,
globalShadows = ,
shadowSoftness = ,
exposure = ,
brightnessMult = ,
manualBrightness = ,
diffuseScale = ,
specularScale = ,
colorTempKelvin = ,
tempTintShift = ,
ambientBoost = ,
outdoorAmbientBoost = ,
manualLightColors = ,
manualTopColor = .(, , ),
manualBotColor = .(, , ),
manualOutdoorColor = .(, , ),
manualAmbientColor = .(, , ),
rigEnabled = ,
rigAttachMode = ,
rigShadows = ,
rigDistance = ,
keyBrightness = ,
keyRange = ,
keyColor = .(, , ),
fillBrightness = ,
fillRange = ,
fillColor = .(, , ),
rimBrightness = ,
rimRange = ,
rimColor = .(, , ),
atmoEnabled = ,
atmoDensityMult = ,
atmoOffset = ,
atmoHazeOffset = ,
atmoGlareMult = ,
manualAtmoColors = ,
manualAtmoColor = .(, , ),
manualAtmoDecay = .(, , ),
fogStart = ,
fogEnd = ,
fogColor = .(, , ),
cloudsEnabled = ,
cloudCoverOverride = -,
cloudDensityOverride = -,
manualCloudColor = ,
cloudCustomColor = .(, , ),
windSpeed = ,
windAngle = ,
rainRateMult = ,
rainSplashes = ,
wetReflectanceMax = ,
rainVolumeMult = ,
dustRate = ,
waterWaveSize = ,
waterWaveSpeed = ,
waterReflectance = ,
waterTransparency = ,
waterColor = .(, , ),
ccEnabled = ,
brightnessCC = ,
saturationOffset = ,
contrastOffset = ,
tintColor = .(, , ),
bloomEnabled = ,
bloomIntensity = ,
bloomSize = ,
bloomThreshold = ,
sunRaysEnabled = ,
sunRaysMult = ,
sunRaysSpread = ,
blurSize = ,
motionBlurEnabled = ,
motionBlurStrength = ,
dofEnabled = ,
dofAutoFocus = ,
dofFarIntensity = ,
dofNearIntensity = ,
dofFocusDist = ,
dofRadius = ,
fov = ,
cameraRoll = ,
cinemaBars = ,
cinemaBarHeight = ,
vignetteEnabled = ,
vignetteOpacity = ,
lensFlareEnabled = ,
lensFlareIntensity = ,
}
customConfig = {}
k, v (defaultConfig)
customConfig[k] = v
lockedSettings = {
GlobalShadows = ,
ShadowSoftness = ,
GeographicLatitude = ,
ExposureCompensation = ,
EnvironmentDiffuseScale = ,
EnvironmentSpecularScale = ,
ClockTime = currentClockTime,
Brightness = ,
Ambient = .(, , ),
OutdoorAmbient = .(, , ),
ColorShift_Top = .(, , ),
ColorShift_Bottom = .(, , ),
FogStart = ,
FogEnd = ,
FogColor = .(, , ),
}
(props)
internalWrite =
k, v (props)
lockedSettings[k] = v
Lighting[k] = v
internalWrite =
(lockedSettings)
ourEffects = {}
(className, name)
effect = Lighting:(name)
effect effect:(className)
effect effect:()
effect = .(className)
effect.Name = name
effect.Parent = Lighting
ourEffects[effect] =
effect
sky = (, )
bloom = (, )
dof = (, )
colorCorrection = (, )
sunRays = (, )
atmosphere = (, )
blurEffect = (, )
blurEffect.Size =
terrain = :()
clouds = terrain terrain:()
clouds terrain
_, c (terrain:())
c:() c:()
clouds = .()
clouds.Name =
clouds.Cover =
clouds.Density =
clouds.Color = .(, , )
clouds.Parent = terrain
blockedClasses = {
[] = , [] = , [] = ,
[] = , [] = ,
[] = , [] = ,
}
(inst)
ourEffects[inst]
blockedClasses[inst.ClassName]
.(()
(()
inst:() inst.Enabled =
inst:()
)
)
_, child (Lighting:())
(child)
Lighting.ChildAdded:(purgeForeignEffects)
Lighting.Changed:((prop)
internalWrite
lockedSettings[prop] ~= Lighting[prop] ~= lockedSettings[prop]
internalWrite =
Lighting[prop] = lockedSettings[prop]
internalWrite =
)
(a, b, t) a + (b - a) * t
(c, factor)
.(
.(c.R * factor, , ),
.(c.G * factor, , ),
.(c.B * factor, , )
)
(c1, c2)
.(
.(c1.R * c2.R, , ),
.(c1.G * c2.G, , ),
.(c1.B * c2.B, , )
)
(c)
.(,
.(.(c.R * + ), , ),
.(.(c.G * + ), , ),
.(.(c.B * + ), , )
)
(hex)
hex = (hex):(, ):(, )
#hex ==
r = (hex:(, ), )
g = (hex:(, ), )
b = (hex:(, ), )
r g b
.(r, g, b)
(kelvin, tintShift)
k = .(kelvin, , )
r, g, b = , ,
k <
t = ( - k) /
g = (, , t)
b = (, , t)
t = (k - ) /
r = (, , t)
g = (, , t)
ts = .(tintShift , -, )
ts <
g = .(g + (-ts) * , , )
ts >
r = .(r + ts * , , )
b = .(b + ts * , , )
.(.(r, , ), .(g, , ), .(b, , ))
timeKeyframes = {
{
time = ,
top = .(, , ), bot = .(, , ),
atCol = .(, , ), atDec = .(, , ), tint = .(, , ),
haze = , glare = , rays = , sat = , cont = , bright = ,
amb = .(, , ), inAmb = .(, , ), cloudCol = .(, , )
},
{
time = ,
top = .(, , ), bot = .(, , ),
atCol = .(, , ), atDec = .(, , ), tint = .(, , ),
haze = , glare = , rays = , sat = , cont = , bright = ,
amb = .(, , ), inAmb = .(, , ), cloudCol = .(, , )
},
{
time = ,
top = .(, , ), bot = .(, , ),
atCol = .(, , ), atDec = .(, , ), tint = .(, , ),
haze = , glare = , rays = , sat = , cont = , bright = ,
amb = .(, , ), inAmb = .(, , ), cloudCol = .(, , )
},
{
time = ,
top = .(, , ), bot = .(, , ),
atCol = .(, , ), atDec = .(, , ), tint = .(, , ),
haze = , glare = , rays = , sat = , cont = , bright = ,
amb = .(, , ), inAmb = .(, , ), cloudCol = .(, , )
},
{
time = ,
top = .(, , ), bot = .(, , ),
atCol = .(, , ), atDec = .(, , ), tint = .(, , ),
haze = , glare = , rays = , sat = , cont = , bright = ,
amb = .(, , ), inAmb = .(, , ), cloudCol = .(, , )
},
{
time = ,
top = .(, , ), bot = .(, , ),
atCol = .(, , ), atDec = .(, , ), tint = .(, , ),
haze = , glare = , rays = , sat = , cont = , bright = ,
amb = .(, , ), inAmb = .(, , ), cloudCol = .(, , )
},
{
time = ,
top = .(, , ), bot = .(, , ),
atCol = .(, , ), atDec = .(, , ), tint = .(, , ),
haze = , glare = , rays = , sat = , cont = , bright = ,
amb = .(, , ), inAmb = .(, , ), cloudCol = .(, , )
},
{
time = ,
top = .(, , ), bot = .(, , ),
atCol = .(, , ), atDec = .(, , ), tint = .(, , ),
haze = , glare = , rays = , sat = , cont = , bright = ,
amb = .(, , ), inAmb = .(, , ), cloudCol = .(, , )
},
{
time = ,
top = .(, , ), bot = .(, , ),
atCol = .(, , ), atDec = .(, , ), tint = .(, , ),
haze = , glare = , rays = , sat = , cont = , bright = ,
amb = .(, , ), inAmb = .(, , ), cloudCol = .(, , )
},
{
time = ,
top = .(, , ), bot = .(, , ),
atCol = .(, , ), atDec = .(, , ), tint = .(, , ),
haze = , glare = , rays = , sat = , cont = , bright = ,
amb = .(, , ), inAmb = .(, , ), cloudCol = .(, , )
},
{
time = ,
top = .(, , ), bot = .(, , ),
atCol = .(, , ), atDec = .(, , ), tint = .(, , ),
haze = , glare = , rays = , sat = , cont = , bright = ,
amb = .(, , ), inAmb = .(, , ), cloudCol = .(, , )
},
}
(clockTime)
ct = clockTime %
prop =
i = , #timeKeyframes -
k1 = timeKeyframes[i]
k2 = timeKeyframes[i + ]
ct >= k1.time ct <= k2.time
alpha = (ct - k1.time) / (k2.time - k1.time)
prop = {
top = k1.top:(k2.top, alpha),
bot = k1.bot:(k2.bot, alpha),
atCol = k1.atCol:(k2.atCol, alpha),
atDec = k1.atDec:(k2.atDec, alpha),
tint = k1.tint:(k2.tint, alpha),
haze = (k1.haze, k2.haze, alpha),
glare = (k1.glare, k2.glare, alpha),
rays = (k1.rays, k2.rays, alpha),
sat = (k1.sat, k2.sat, alpha),
cont = (k1.cont, k2.cont, alpha),
bright = (k1.bright, k2.bright, alpha),
amb = k1.amb:(k2.amb, alpha),
inAmb = k1.inAmb:(k2.inAmb, alpha),
cloudCol = k1.cloudCol:(k2.cloudCol, alpha)
}
prop prop = timeKeyframes[]
isTwilight = (ct >= ct <= ) (ct >= ct <= )
isTwilight
customConfig.sunsetStyle ==
prop.top = prop.top:(.(, , ), )
prop.atCol = prop.atCol:(.(, , ), )
prop.atDec = prop.atDec:(.(, , ), )
prop.cloudCol = prop.cloudCol:(.(, , ), )
customConfig.sunsetStyle ==
prop.top = prop.top:(.(, , ), )
prop.atCol = prop.atCol:(.(, , ), )
prop.atDec = prop.atDec:(.(, , ), )
prop.amb = prop.amb:(.(, , ), )
prop.cloudCol = prop.cloudCol:(.(, , ), )
prop.glare = prop.glare *
customConfig.sunsetStyle ==
prop.top = prop.top:(.(, , ), )
prop.atCol = prop.atCol:(.(, , ), )
prop.glare = prop.glare *
prop.sat = prop.sat +
w = customConfig.sunsetWarmth
w <
coolAlpha = .( - w, , )
prop.top = prop.top:(.(, , ), coolAlpha * )
prop.atCol = prop.atCol:(.(, , ), coolAlpha * )
prop.cloudCol = prop.cloudCol:(.(, , ), coolAlpha * )
w >
warmAlpha = .((w - ) / , , )
prop.top = prop.top:(.(, , ), warmAlpha * )
prop.atCol = prop.atCol:(.(, , ), warmAlpha * )
prop.cloudCol = prop.cloudCol:(.(, , ), warmAlpha * )
prop
fxFolder = :() .()
fxFolder.Name =
fxFolder.Parent =
weatherDome = .()
weatherDome.Name =
weatherDome.Size = .(, , )
weatherDome.Transparency =
weatherDome.CanCollide =
weatherDome.CanQuery =
weatherDome.CanTouch =
weatherDome.Anchored =
weatherDome.Parent = fxFolder
rigLockedWorldCF = .()
(name)
p = .()
p.Name = name
p.Size = .(, , )
p.Transparency =
p.CanCollide =
p.CanQuery =
p.CanTouch =
p.Anchored =
p.Parent = fxFolder
pl = .()
pl.Enabled =
pl.Parent = p
p, pl
keyPart, keyLight = ()
fillPart, fillLight = ()
rimPart, rimLight = ()
rainEmitter = .()
rainEmitter.Texture =
rainEmitter.Orientation = .ParticleOrientation.VelocityParallel
rainEmitter.Size = NumberSequence.(, )
rainEmitter.Transparency = NumberSequence.({
NumberSequenceKeypoint.(, ),
NumberSequenceKeypoint.(, )
})
rainEmitter.Color = ColorSequence.(.(, , ))
rainEmitter.Lifetime = NumberRange.(, )
rainEmitter.Rate =
rainEmitter.Speed = NumberRange.(, )
rainEmitter.SpreadAngle = .(, )
rainEmitter.EmissionDirection = .NormalId.Bottom
rainEmitter.Parent = weatherDome
dustEmitter = .()
dustEmitter.Texture =
dustEmitter.Size = NumberSequence.({
NumberSequenceKeypoint.(, ),
NumberSequenceKeypoint.(, ),
NumberSequenceKeypoint.(, )
})
dustEmitter.Transparency = NumberSequence.({
NumberSequenceKeypoint.(, ),
NumberSequenceKeypoint.(, ),
NumberSequenceKeypoint.(, )
})
dustEmitter.Color = ColorSequence.(.(, , ))
dustEmitter.LightEmission =
dustEmitter.Lifetime = NumberRange.(, )
dustEmitter.Rate = customConfig.dustRate
dustEmitter.Speed = NumberRange.(, )
dustEmitter.SpreadAngle = .(, )
dustEmitter.Parent = weatherDome
rainSound = .()
rainSound.Name =
rainSound.SoundId =
rainSound.Looped =
rainSound.Volume =
rainSound.Parent = weatherDome
(() rainSound:() )
wetPartsCache = {}
reflectMaterials = {
[.Material.Concrete] = , [.Material.Asphalt] = ,
[.Material.SmoothPlastic] = , [.Material.Slate] = ,
[.Material.Cobblestone] = , [.Material.Pavement] = ,
[.Material.Metal] = , [.Material.WoodPlanks] = ,
}
()
part, origRef (wetPartsCache)
part part.Parent
TweenService:(part, TweenInfo.(), { Reflectance = origRef }):()
.(wetPartsCache)
()
currentWeather ~= rtxEnabled
(wetPartsCache) ~=
()
overlap = OverlapParams.()
overlap.FilterDescendantsInstances = { fxFolder, player.Character }
overlap.FilterType = .RaycastFilterType.Exclude
overlap.MaxParts =
parts = :(.(camera.CFrame.Position), .(, , ), overlap)
_, part (parts)
part:() part.Anchored part.Transparency == reflectMaterials[part.Material]
wetPartsCache[part] ==
wetPartsCache[part] = part.Reflectance
targetRef = .(wetPartsCache[part] + customConfig.wetReflectanceMax * , , customConfig.wetReflectanceMax)
TweenService:(part, TweenInfo.(), { Reflectance = targetRef }):()
()
isLightningActive
isLightningActive =
.(()
prevBright = lockedSettings.Brightness
prevExp = lockedSettings.ExposureCompensation
({ Brightness = , ExposureCompensation = })
.()
({ Brightness = prevBright, ExposureCompensation = prevExp })
.()
({ Brightness = , ExposureCompensation = })
.()
({ Brightness = prevBright, ExposureCompensation = prevExp })
isLightningActive =
)
()
tp = (currentClockTime)
dayFactor = .(tp.bright / , , )
wSoftness = customConfig.shadowSoftness
wBright = customConfig.fullManualMode customConfig.manualBrightness tp.bright
wOutAmb = tp.amb
wInAmb = tp.inAmb
wTop = tp.top
wBot = tp.bot
wSat = customConfig.fullManualMode tp.sat
wCont = customConfig.fullManualMode tp.cont
wTint = customConfig.fullManualMode .(, , ) tp.tint
wAtDens =
wAtCol = tp.atCol
wAtDec = tp.atDec
wHaze = tp.haze
wGlare = tp.glare
wCloudCov =
wCloudDens =
wCloudCol = tp.cloudCol
sky.SunAngularSize = customConfig.sunAngularSize
sky.MoonAngularSize = customConfig.moonAngularSize
sky.StarCount = customConfig.starCount
currentWeather ==
sky.CelestialBodiesShown = customConfig.celestialShown
rainEmitter.Rate =
dustEmitter.Rate = customConfig.dustRate
baseSunRays = tp.rays
currentWeather ==
sky.CelestialBodiesShown = customConfig.celestialShown
rainEmitter.Rate =
dustEmitter.Rate = .(customConfig.dustRate * )
baseSunRays = tp.rays *
wSoftness = .(customConfig.shadowSoftness + , , )
wBright = wBright *
wOutAmb = tp.amb:(.(, , ), )
wInAmb = tp.inAmb:(.(, , ), )
wTop = tp.top:(.(, , ), )
wSat = wSat *
wCont = wCont *
wAtDens =
wAtCol = tp.atCol:(.(, , ), )
wHaze = tp.haze *
wGlare = tp.glare *
wCloudCov =
wCloudDens =
currentWeather ==
sky.CelestialBodiesShown =
rainEmitter.Rate =
dustEmitter.Rate =
baseSunRays =
wSoftness = .(customConfig.shadowSoftness + , , )
wBright = * dayFactor
wOutAmb = (.(, , ), dayFactor)
wInAmb = (.(, , ), dayFactor)
wTop = (.(, , ), dayFactor)
wBot = (.(, , ), dayFactor)
wSat = -
wCont =
wTint = .(, , )
wAtDens =
wAtCol = (.(, , ), dayFactor)
wAtDec = (.(, , ), dayFactor)
wHaze =
wGlare =
wCloudCov =
wCloudDens =
wCloudCol = (.(, , ), dayFactor)
currentWeather ==
sky.CelestialBodiesShown =
rainEmitter.Rate = .( * customConfig.rainRateMult)
dustEmitter.Rate =
baseSunRays =
wSoftness = .(customConfig.shadowSoftness + , , )
wBright = * dayFactor
wOutAmb = (.(, , ), dayFactor)
wInAmb = (.(, , ), dayFactor)
wTop = (.(, , ), dayFactor)
wBot = (.(, , ), dayFactor)
wSat = -
wCont =
wTint = .(, , )
wAtDens =
wAtCol = (.(, , ), dayFactor)
wAtDec = (.(, , ), dayFactor)
wHaze =
wGlare =
wCloudCov =
wCloudDens =
wCloudCol = (.(, , ), dayFactor)
currentWeather ==
sky.CelestialBodiesShown = customConfig.celestialShown
rainEmitter.Rate =
dustEmitter.Rate =
baseSunRays =
wSoftness = .(customConfig.shadowSoftness + , , )
wBright = * dayFactor
wOutAmb = (.(, , ), dayFactor)
wInAmb = (.(, , ), dayFactor)
wTop = (.(, , ), dayFactor)
wBot = (.(, , ), dayFactor)
wSat = -
wCont =
wTint = .(, , )
wAtDens =
wAtCol = (.(, , ), dayFactor)
wAtDec = (.(, , ), dayFactor)
wHaze =
wGlare =
wCloudCov =
wCloudDens =
wCloudCol = (.(, , ), dayFactor)
currentWeather ==
sky.CelestialBodiesShown =
rainEmitter.Rate =
dustEmitter.Rate = customConfig.dustRate
baseSunRays =
wSoftness = .(customConfig.shadowSoftness + , , )
wBright = * dayFactor
wOutAmb = (.(, , ), dayFactor)
wInAmb = (.(, , ), dayFactor)
wSat = -
wCont =
wTint = .(, , )
wAtDens =
wAtCol = (.(, , ), dayFactor)
wAtDec = (.(, , ), dayFactor)
wHaze =
wGlare =
wCloudCov =
wCloudDens =
currentWeather ==
sky.CelestialBodiesShown = customConfig.celestialShown
rainEmitter.Rate = .( * customConfig.rainRateMult)
dustEmitter.Rate =
baseSunRays =
wBright =
wOutAmb = .(, , )
wInAmb = .(, , )
wTop = .(, , )
wBot = .(, , )
wSat =
wCont =
wTint = .(, , )
wAtDens =
wAtCol = .(, , )
wAtDec = .(, , )
wHaze =
wGlare =
wCloudCov =
wCloudDens =
wCloudCol = .(, , )
tempMult = (customConfig.colorTempKelvin, customConfig.tempTintShift)
useManualRGB = customConfig.manualLightColors customConfig.fullManualMode
finalTop = useManualRGB (customConfig.manualTopColor, tempMult) (wTop, tempMult)
finalBot = useManualRGB (customConfig.manualBotColor, tempMult) (wBot, tempMult)
finalOutAmb = useManualRGB ((customConfig.manualOutdoorColor, tempMult), customConfig.outdoorAmbientBoost)
((wOutAmb, tempMult), customConfig.outdoorAmbientBoost)
finalInAmb = useManualRGB ((customConfig.manualAmbientColor, tempMult), customConfig.ambientBoost)
((wInAmb, tempMult), customConfig.ambientBoost)
baseSunRays = baseSunRays * customConfig.sunRaysMult
sunRays.Enabled = customConfig.sunRaysEnabled
sunRays.Spread = customConfig.sunRaysSpread
({
ClockTime = currentClockTime,
GlobalShadows = customConfig.globalShadows,
ShadowSoftness = wSoftness,
GeographicLatitude = customConfig.geographicLatitude,
ExposureCompensation = customConfig.exposure,
EnvironmentDiffuseScale = customConfig.diffuseScale,
EnvironmentSpecularScale = rtxEnabled customConfig.specularScale ,
Brightness = (customConfig.fullManualMode customConfig.manualBrightness wBright) * customConfig.brightnessMult,
OutdoorAmbient = finalOutAmb,
Ambient = finalInAmb,
ColorShift_Top = finalTop,
ColorShift_Bottom = finalBot,
FogStart = customConfig.atmoEnabled customConfig.fogStart,
FogEnd = customConfig.atmoEnabled customConfig.fogEnd,
FogColor = customConfig.fogColor,
})
colorCorrection.Enabled = customConfig.ccEnabled
colorCorrection.Brightness = customConfig.brightnessCC
colorCorrection.Saturation = .(wSat + customConfig.saturationOffset, -, )
colorCorrection.Contrast = .(wCont + customConfig.contrastOffset, -, )
colorCorrection.TintColor = (wTint, customConfig.tintColor)
bloom.Enabled = customConfig.bloomEnabled
bloom.Intensity = customConfig.bloomIntensity
bloom.Size = customConfig.bloomSize
bloom.Threshold = customConfig.bloomThreshold
customConfig.motionBlurEnabled
blurEffect.Enabled = (customConfig.blurSize > )
blurEffect.Size = customConfig.blurSize
dof.Enabled = customConfig.dofEnabled
dof.FarIntensity = customConfig.dofFarIntensity
dof.NearIntensity = customConfig.dofNearIntensity
dof.InFocusRadius = customConfig.dofRadius
customConfig.dofAutoFocus
dof.FocusDistance = customConfig.dofFocusDist
customConfig.atmoEnabled
atmosphere.Parent = Lighting
atmosphere.Density = .(wAtDens * customConfig.atmoDensityMult, , )
atmosphere.Offset = customConfig.atmoOffset
atmosphere.Color = (customConfig.manualAtmoColors customConfig.fullManualMode) customConfig.manualAtmoColor wAtCol
atmosphere.Decay = (customConfig.manualAtmoColors customConfig.fullManualMode) customConfig.manualAtmoDecay wAtDec
atmosphere.Haze = .(wHaze + customConfig.atmoHazeOffset, , )
atmosphere.Glare = .(wGlare * customConfig.atmoGlareMult, , )
atmosphere.Parent =
clouds
clouds.Enabled = customConfig.cloudsEnabled
clouds.Cover = (customConfig.cloudCoverOverride >= ) customConfig.cloudCoverOverride wCloudCov
clouds.Density = (customConfig.cloudDensityOverride >= ) customConfig.cloudDensityOverride wCloudDens
clouds.Color = (customConfig.manualCloudColor customConfig.fullManualMode) customConfig.cloudCustomColor wCloudCol
rad = .(customConfig.windAngle)
.GlobalWind = .(.(rad) * customConfig.windSpeed, , .(rad) * customConfig.windSpeed)
terrain
terrain.WaterWaveSize = customConfig.waterWaveSize
terrain.WaterWaveSpeed = customConfig.waterWaveSpeed
terrain.WaterReflectance = customConfig.waterReflectance
terrain.WaterTransparency = customConfig.waterTransparency
terrain.WaterColor = customConfig.waterColor
keyLight.Enabled = customConfig.rigEnabled
keyLight.Brightness = customConfig.keyBrightness
keyLight.Range = customConfig.keyRange
keyLight.Color = customConfig.keyColor
keyLight.Shadows = customConfig.rigShadows
fillLight.Enabled = customConfig.rigEnabled
fillLight.Brightness = customConfig.fillBrightness
fillLight.Range = customConfig.fillRange
fillLight.Color = customConfig.fillColor
fillLight.Shadows =
rimLight.Enabled = customConfig.rigEnabled
rimLight.Brightness = customConfig.rimBrightness
rimLight.Range = customConfig.rimRange
rimLight.Color = customConfig.rimColor
rimLight.Shadows = customConfig.rigShadows
currentWeather ~=
rainSound.Volume =
uiSyncCallbacks = {}
()
_, fn (uiSyncCallbacks)
()
()
data = {
_clockTime = currentClockTime,
_weather = currentWeather,
_rtx = rtxEnabled,
cfg = {}
}
k, v (customConfig)
(v) ==
data.cfg[k] = { __colorHex = (v) }
data.cfg[k] = v
HttpService:(data)
(jsonStr)
ok, decoded = (()
HttpService:(jsonStr)
)
ok (decoded) ~= (decoded.cfg) ~=
(decoded._clockTime) == currentClockTime = decoded._clockTime %
(decoded._weather) == currentWeather = decoded._weather
(decoded._rtx) == rtxEnabled = decoded._rtx
k, v (decoded.cfg)
defaultConfig[k] ~=
(v) == v.__colorHex
c = (v.__colorHex)
c customConfig[k] = c
(v) == (defaultConfig[k])
customConfig[k] = v
camera.FieldOfView = customConfig.fov
()
()
()
(presetTbl)
k, v (defaultConfig)
customConfig[k] = v
currentClockTime = presetTbl._clockTime
currentWeather = presetTbl._weather
k, v (presetTbl)
k ~= k ~= k ~= defaultConfig[k] ~=
customConfig[k] = v
camera.FieldOfView = customConfig.fov
()
()
()
builtInPresets = {
{
name = ,
_clockTime = , _weather = ,
sunsetStyle = , sunsetWarmth = , exposure = ,
bloomIntensity = , shadowSoftness = , colorTempKelvin =
},
{
name = ,
_clockTime = , _weather = ,
sunsetStyle = , sunsetWarmth = , exposure = ,
colorTempKelvin = , saturationOffset = -, contrastOffset = ,
atmoHazeOffset =
},
{
name = ,
_clockTime = , _weather = ,
exposure = , bloomIntensity = , bloomThreshold = ,
saturationOffset = , contrastOffset = , wetReflectanceMax =
},
{
name = ,
_clockTime = , _weather = ,
exposure = -, shadowSoftness = , diffuseScale = ,
saturationOffset = -, contrastOffset = , cinemaBars = ,
vignetteEnabled = , vignetteOpacity =
},
{
name = ,
_clockTime = , _weather = ,
sunsetStyle = , sunsetWarmth = , exposure = ,
bloomIntensity = , bloomSize = , shadowSoftness = ,
saturationOffset = , contrastOffset = -
},
{
name = ,
_clockTime = , _weather = ,
fullManualMode = , manualBrightness = , colorTempKelvin = ,
rigEnabled = , rigAttachMode = ,
atmoDensityMult = , dofEnabled =
},
}
savedCustomConfigs = {}
screenGui = .()
screenGui.Name =
screenGui.ResetOnSpawn =
screenGui.IgnoreGuiInset =
screenGui.Parent = player:()
topCinemaBar = .()
topCinemaBar.Size = .(, , , )
topCinemaBar.BackgroundColor3 = .(, , )
topCinemaBar.BorderSizePixel =
topCinemaBar.ZIndex =
topCinemaBar.Parent = screenGui
botCinemaBar = .()
botCinemaBar.Size = .(, , , )
botCinemaBar.AnchorPoint = .(, )
botCinemaBar.Position = .(, , , )
botCinemaBar.BackgroundColor3 = .(, , )
botCinemaBar.BorderSizePixel =
botCinemaBar.ZIndex =
botCinemaBar.Parent = screenGui
()
targetSize = customConfig.cinemaBars .(, , customConfig.cinemaBarHeight, ) .(, , , )
TweenService:(topCinemaBar, TweenInfo.(, .EasingStyle.Quart, .EasingDirection.Out), { Size = targetSize }):()
TweenService:(botCinemaBar, TweenInfo.(, .EasingStyle.Quart, .EasingDirection.Out), { Size = targetSize }):()
vignetteFrame = .()
vignetteFrame.Size = .(, , , )
vignetteFrame.BackgroundTransparency =
vignetteFrame.BorderSizePixel =
vignetteFrame.ZIndex =
vignetteFrame.Parent = screenGui
vignetteStroke = .()
vignetteStroke.Color = .(, , )
vignetteStroke.Thickness =
vignetteStroke.Transparency =
vignetteStroke.Parent = vignetteFrame
sunGlareOverlay = .()
sunGlareOverlay.Size = .(, , , )
sunGlareOverlay.BackgroundColor3 = .(, , )
sunGlareOverlay.BackgroundTransparency =
sunGlareOverlay.BorderSizePixel =
sunGlareOverlay.ZIndex =
sunGlareOverlay.Parent = screenGui
bokehData = {
{ scale = -, size = , col = .(, , ), maxAlpha = },
{ scale = , size = , col = .(, , ), maxAlpha = },
{ scale = , size = , col = .(, , ), maxAlpha = },
{ scale = , size = , col = .(, , ), maxAlpha = },
}
bokehCircles = {}
_, data (bokehData)
f = .()
f.Size = .(, data.size, , data.size)
f.AnchorPoint = .(, )
f.BackgroundColor3 = data.col
f.BackgroundTransparency =
f.BorderSizePixel =
f.ZIndex =
f.Parent = screenGui
corner = .()
corner.CornerRadius = .(, )
corner.Parent = f
stroke = .()
stroke.Color = .(, , )
stroke.Thickness =
stroke.Transparency =
stroke.Parent = f
.(bokehCircles, { frame = f, stroke = stroke, data = data })
toggleBtn = .()
toggleBtn.Size = .(, , , )
toggleBtn.Position = .(, , , -)
toggleBtn.BackgroundColor3 = .(, , )
toggleBtn.TextColor3 = .(, , )
toggleBtn.Text =
toggleBtn.TextSize =
toggleBtn.Font = .Font.GothamBold
toggleBtn.ZIndex =
toggleBtn.Parent = screenGui
toggleCorner = .()
toggleCorner.CornerRadius = .(, )
toggleCorner.Parent = toggleBtn
toggleStroke = .()
toggleStroke.Color = .(, , )
toggleStroke.Thickness =
toggleStroke.Parent = toggleBtn
mainFrame = .()
mainFrame.Size = .(, , , )
mainFrame.Position = .(, , , -)
mainFrame.BackgroundColor3 = .(, , )
mainFrame.BackgroundTransparency =
mainFrame.BorderSizePixel =
mainFrame.ClipsDescendants =
mainFrame.ZIndex =
mainFrame.Parent = screenGui
mainCorner = .()
mainCorner.CornerRadius = .(, )
mainCorner.Parent = mainFrame
mainStroke = .()
mainStroke.Color = .(, , )
mainStroke.Thickness =
mainStroke.Parent = mainFrame
toggleBtn.MouseButton1Click:(()
mainFrame.Visible = mainFrame.Visible
)
headerBar = .()
headerBar.Size = .(, , , )
headerBar.BackgroundColor3 = .(, , )
headerBar.BorderSizePixel =
headerBar.ZIndex =
headerBar.Parent = mainFrame
titleLabel = .()
titleLabel.Size = .(, , , )
titleLabel.Position = .(, , , )
titleLabel.BackgroundTransparency =
titleLabel.Font = .Font.GothamBlack
titleLabel.TextColor3 = .(, , )
titleLabel.TextSize =
titleLabel.TextXAlignment = .TextXAlignment.Left
titleLabel.ZIndex =
titleLabel.Parent = headerBar
(()
titleLabel.Text = ()
)
fpsLabel = .()
fpsLabel.Size = .(, , , )
fpsLabel.Position = .(, -, , -)
fpsLabel.BackgroundColor3 = .(, , )
fpsLabel.Font = .Font.GothamBold
fpsLabel.Text =
fpsLabel.TextColor3 = .(, , )
fpsLabel.TextSize =
fpsLabel.ZIndex =
fpsLabel.Parent = headerBar
fpsCor = .()
fpsCor.CornerRadius = .(, )
fpsCor.Parent = fpsLabel
langBtn = .()
langBtn.Size = .(, , , )
langBtn.Position = .(, -, , -)
langBtn.BackgroundColor3 = .(, , )
langBtn.Font = .Font.GothamBlack
langBtn.Text =
langBtn.TextColor3 = .(, , )
langBtn.TextSize =
langBtn.ZIndex =
langBtn.Parent = headerBar
langCor = .()
langCor.CornerRadius = .(, )
langCor.Parent = langBtn
langBtn.MouseButton1Click:(()
currentLang = (currentLang == )
langBtn.Text = .. currentLang
_, fn (i18nListeners)
()
)
isMinimized =
minBtn = .()
minBtn.Size = .(, , , )
minBtn.Position = .(, -, , -)
minBtn.BackgroundColor3 = .(, , )
minBtn.Font = .Font.GothamBlack
minBtn.Text =
minBtn.TextColor3 = .(, , )
minBtn.TextSize =
minBtn.ZIndex =
minBtn.Parent = headerBar
minCor = .()
minCor.CornerRadius = .(, )
minCor.Parent = minBtn
minBtn.MouseButton1Click:(()
isMinimized = isMinimized
minBtn.Text = isMinimized
targetSize = isMinimized .(, , , ) .(, , , )
TweenService:(mainFrame, TweenInfo.(, .EasingStyle.Quart, .EasingDirection.Out), { Size = targetSize }):()
)
closeBtn = .()
closeBtn.Size = .(, , , )
closeBtn.Position = .(, -, , -)
closeBtn.BackgroundColor3 = .(, , )
closeBtn.Font = .Font.GothamBlack
closeBtn.Text =
closeBtn.TextColor3 = .(, , )
closeBtn.TextSize =
closeBtn.ZIndex =
closeBtn.Parent = headerBar
closeCor = .()
closeCor.CornerRadius = .(, )
closeCor.Parent = closeBtn
closeBtn.MouseButton1Click:(()
mainFrame.Visible =
)
draggingWindow =
dragStart, startPos
headerBar.InputBegan:((input)
input.UserInputType == .UserInputType.MouseButton1 input.UserInputType == .UserInputType.Touch
draggingWindow =
dragStart = input.Position
startPos = mainFrame.Position
)
UserInputService.InputEnded:((input)
input.UserInputType == .UserInputType.MouseButton1 input.UserInputType == .UserInputType.Touch then
draggingWindow = false
end
end)
UserInputService.InputChanged:Connect(function(input)
if draggingWindow and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
local delta = input.Position - dragStart
mainFrame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
end
end)
-- Левая боковая панель навигации (Sidebar)
local sidebar = Instance.new("Frame")
sidebar.Size = UDim2.new(0, 158, 1, -42)
sidebar.Position = UDim2.new(0, 0, 0, 42)
sidebar.BackgroundColor3 = Color3.fromRGB(18, 19, 27)
sidebar.BorderSizePixel = 0
sidebar.ZIndex = 6
sidebar.Parent = mainFrame
local sideTabContainer = Instance.new("Frame")
sideTabContainer.Size = UDim2.new(1, -14, 1, -86)
sideTabContainer.Position = UDim2.new(0, 7, 0, 8)
sideTabContainer.BackgroundTransparency = 1
sideTabContainer.ZIndex = 7
sideTabContainer.Parent = sidebar
local sideLayout = Instance.new("UIListLayout")
sideLayout.SortOrder = Enum.SortOrder.LayoutOrder
sideLayout.Padding = UDim.new(0, 5)
sideLayout.Parent = sideTabContainer
-- Нижние кнопки в сайдбаре (Сброс всего и Скрыть GUI)
local resetAllBtn = Instance.new("TextButton")
resetAllBtn.Size = UDim2.new(1, -14, 0, 30)
resetAllBtn.Position = UDim2.new(0, 7, 1, -72)
resetAllBtn.BackgroundColor3 = Color3.fromRGB(125, 42, 45)
resetAllBtn.Font = Enum.Font.GothamBold
resetAllBtn.TextColor3 = Color3.fromRGB(255, 240, 240)
resetAllBtn.TextSize = 11
resetAllBtn.ZIndex = 7
resetAllBtn.Parent = sidebar
local raCor = Instance.new("UICorner")
raCor.CornerRadius = UDim.new(0, 7)
raCor.Parent = resetAllBtn
local hideGuiBtn = Instance.new("TextButton")
hideGuiBtn.Size = UDim2.new(1, -14, 0, 28)
hideGuiBtn.Position = UDim2.new(0, 7, 1, -36)
hideGuiBtn.BackgroundColor3 = Color3.fromRGB(32, 36, 50)
hideGuiBtn.Font = Enum.Font.GothamBold
hideGuiBtn.TextColor3 = Color3.fromRGB(200, 210, 230)
hideGuiBtn.TextSize = 11
hideGuiBtn.ZIndex = 7
hideGuiBtn.Parent = sidebar
local hgCor = Instance.new("UICorner")
hgCor.CornerRadius = UDim.new(0, 7)
hgCor.Parent = hideGuiBtn
onLangChanged(function()
resetAllBtn.Text = tr("btnResetAll")
hideGuiBtn.Text = tr("btnHideUI")
end)
resetAllBtn.MouseButton1Click:Connect(function()
for k, v in pairs(defaultConfig) do
customConfig[k] = v
end
currentClockTime = 17.85
currentWeather = "Clear"
rtxEnabled = true
camera.FieldOfView = 70
syncAllUI()
updateCinemaBars()
updateEnvironment()
updateWetSurfaces()
end)
hideGuiBtn.MouseButton1Click:Connect(function()
mainFrame.Visible = false
toggleBtn.Visible = false
end)
-- Правая рабочая область (Поисковая строка + Контейнер страниц)
local rightArea = Instance.new("Frame")
rightArea.Size = UDim2.new(1, -158, 1, -42)
rightArea.Position = UDim2.new(0, 158, 0, 42)
rightArea.BackgroundTransparency = 1
rightArea.ZIndex = 6
rightArea.Parent = mainFrame
local searchBox = Instance.new("TextBox")
searchBox.Size = UDim2.new(1, -20, 0, 30)
searchBox.Position = UDim2.new(0, 10, 0, 8)
searchBox.BackgroundColor3 = Color3.fromRGB(22, 24, 35)
searchBox.Font = Enum.Font.GothamMedium
searchBox.PlaceholderColor3 = Color3.fromRGB(130, 138, 160)
searchBox.Text = ""
searchBox.TextColor3 = Color3.fromRGB(240, 245, 255)
searchBox.TextSize = 11
searchBox.ClearTextOnFocus = false
searchBox.TextXAlignment = Enum.TextXAlignment.Left
searchBox.ZIndex = 7
searchBox.Parent = rightArea
local sbPad = Instance.new("UIPadding")
sbPad.PaddingLeft = UDim.new(0, 10)
sbPad.PaddingRight = UDim.new(0, 28)
sbPad.Parent = searchBox
local sbCor = Instance.new("UICorner")
sbCor.CornerRadius = UDim.new(0, 8)
sbCor.Parent = searchBox
local sbStroke = Instance.new("UIStroke")
sbStroke.Color = Color3.fromRGB(48, 54, 74)
sbStroke.Thickness = 1
sbStroke.Parent = searchBox
local clearSearchBtn = Instance.new("TextButton")
clearSearchBtn.Size = UDim2.new(0, 22, 0, 22)
clearSearchBtn.Position = UDim2.new(1, 2, 0.5, -11)
clearSearchBtn.BackgroundTransparency = 1
clearSearchBtn.Font = Enum.Font.GothamBold
clearSearchBtn.Text = "✕"
clearSearchBtn.TextColor3 = Color3.fromRGB(160, 168, 190)
clearSearchBtn.TextSize = 11
clearSearchBtn.Visible = false
clearSearchBtn.ZIndex = 8
clearSearchBtn.Parent = searchBox
clearSearchBtn.MouseButton1Click:Connect(function()
searchBox.Text = ""
end)
onLangChanged(function()
searchBox.PlaceholderText = tr("searchPlaceholder")
end)
local pagesContainer = Instance.new("Frame")
pagesContainer.Size = UDim2.new(1, -20, 1, -48)
pagesContainer.Position = UDim2.new(0, 10, 0, 44)
pagesContainer.BackgroundTransparency = 1
pagesContainer.ZIndex = 6
pagesContainer.Parent = rightArea
local tabsInfo = {
{ id = "SkyWeather", key = "tab_SkyWeather" },
{ id = "LightShadows", key = "tab_LightShadows" },
{ id = "StudioRig", key = "tab_StudioRig" },
{ id = "AtmoWorld", key = "tab_AtmoWorld" },
{ id = "PostFX", key = "tab_PostFX" },
{ id = "Camera", key = "tab_Camera" },
{ id = "Configs", key = "tab_Configs" },
}
local tabPages = {}
local tabButtons = {}
local searchableItems = {} -- { frame = Instance, getSearchText = fn }
local function applySearchFilter()
local query = string.lower(searchBox.Text or "")
clearSearchBtn.Visible = (#query > 0)
for _, item in ipairs(searchableItems) do
if #query == 0 then
item.frame.Visible = true
else
local txt = string.lower(item.getSearchText() or "")
item.frame.Visible = (string.find(txt, query, 1, true) ~= nil)
end
end
end
searchBox:GetPropertyChangedSignal("Text"):Connect(applySearchFilter)
local function switchTab(tabId)
for id, page in pairs(tabPages) do
page.Visible = (id == tabId)
end
for id, btn in pairs(tabButtons) do
if id == tabId then
btn.BackgroundColor3 = Color3.fromRGB(218, 132, 42)
btn.TextColor3 = Color3.fromRGB(255, 255, 255)
else
btn.BackgroundColor3 = Color3.fromRGB(26, 28, 40)
btn.TextColor3 = Color3.fromRGB(185, 192, 210)
end
end
end
for idx, tInfo in ipairs(tabsInfo) do
local tBtn = Instance.new("TextButton")
tBtn.Size = UDim2.new(1, 0, 0, 34)
tBtn.BackgroundColor3 = Color3.fromRGB(26, 28, 40)
tBtn.Font = Enum.Font.GothamBold
tBtn.TextSize = 11
tBtn.TextXAlignment = Enum.TextXAlignment.Left
tBtn.TextColor3 = Color3.fromRGB(185, 192, 210)
tBtn.LayoutOrder = idx
tBtn.ZIndex = 8
tBtn.Parent = sideTabContainer
local tPad = Instance.new("UIPadding")
tPad.PaddingLeft = UDim.new(0, 10)
tPad.Parent = tBtn
local tc = Instance.new("UICorner")
tc.CornerRadius = UDim.new(0, 8)
tc.Parent = tBtn
onLangChanged(function()
tBtn.Text = tr(tInfo.key)
end)
local page = Instance.new("ScrollingFrame")
page.Name = "Page_" .. tInfo.id
page.Size = UDim2.new(1, 0, 1, 0)
page.BackgroundTransparency = 1
page.BorderSizePixel = 0
page.ScrollBarThickness = 4
page.ScrollBarImageColor3 = Color3.fromRGB(235, 155, 65)
page.AutomaticCanvasSize = Enum.AutomaticSize.Y
page.CanvasSize = UDim2.new(0, 0, 0, 0)
page.Visible = false
page.ZIndex = 6
page.Parent = pagesContainer
local layout = Instance.new("UIListLayout")
layout.SortOrder = Enum.SortOrder.LayoutOrder
layout.Padding = UDim.new(0, 6)
layout.Parent = page
local pad = Instance.new("UIPadding")
pad.PaddingRight = UDim.new(0, 8)
pad.PaddingBottom = UDim.new(0, 16)
pad.Parent = page
tabPages[tInfo.id] = page
tabButtons[tInfo.id] = tBtn
tBtn.MouseButton1Click:Connect(function()
switchTab(tInfo.id)
end)
end
--------------------------------------------------------------------
-- 8. УЛУЧШЕННЫЕ UI-КОМПОНЕНТЫ (С ВВОДОМ ЧИСЕЛ, СБРОСОМ И HEX)
--------------------------------------------------------------------
local orderCounter = 0
local function nextOrder()
orderCounter = orderCounter + 1
return orderCounter
end
local function registerSearchable(frame, i18nKey)
table.insert(searchableItems, {
frame = frame,
getSearchText = function()
return (I18N.EN[i18nKey] or "") .. " " .. (I18N.RU[i18nKey] or "") .. " " .. tostring(i18nKey)
end
})
end
local function createSectionHeader(parent, i18nKey)
local lbl = Instance.new("TextLabel")
lbl.Size = UDim2.new(1, 0, 0, 22)
lbl.BackgroundTransparency = 1
lbl.Font = Enum.Font.GothamBlack
lbl.TextColor3 = Color3.fromRGB(255, 198, 105)
lbl.TextSize = 11
lbl.TextXAlignment = Enum.TextXAlignment.Left
lbl.LayoutOrder = nextOrder()
lbl.ZIndex = 7
lbl.Parent = parent
onLangChanged(function()
lbl.Text = tr(i18nKey)
end)
return lbl
end
local activeSliderUpdate = nil
UserInputService.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
activeSliderUpdate = nil
end
end)
UserInputService.InputChanged:Connect(function(input)
if activeSliderUpdate and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
activeSliderUpdate(input.Position.X)
end
end)
-- Улучшенный слайдер с ручным вводом значения и кнопкой сброса ↺
local function createSlider(parent, i18nKey, minVal, maxVal, defaultVal, decimals, callback)
local container = Instance.new("Frame")
container.Size = UDim2.new(1, 0, 0, 44)
container.BackgroundColor3 = Color3.fromRGB(22, 24, 34)
container.BorderSizePixel = 0
container.LayoutOrder = nextOrder()
container.ZIndex = 7
container.Parent = container.Parent or parent
local cor = Instance.new("UICorner")
cor.CornerRadius = UDim.new(0, 8)
cor.Parent = container
local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, -105, 0, 18)
title.Position = UDim2.new(0, 10, 0, 4)
title.BackgroundTransparency = 1
title.Font = Enum.Font.GothamMedium
title.TextColor3 = Color3.fromRGB(225, 230, 242)
title.TextSize = 11
title.TextXAlignment = Enum.TextXAlignment.Left
title.TextTruncate = Enum.TextTruncate.AtEnd
title.ZIndex = 8
title.Parent = container
local valBox = Instance.new("TextBox")
valBox.Size = UDim2.new(0, 56, 0, 18)
valBox.Position = UDim2.new(1, -86, 0, 4)
valBox.BackgroundColor3 = Color3.fromRGB(32, 35, 48)
valBox.Font = Enum.Font.GothamBold
valBox.TextColor3 = Color3.fromRGB(255, 210, 130)
valBox.TextSize = 10
valBox.ClearTextOnFocus = false
valBox.ZIndex = 8
valBox.Parent = container
local vbCor = Instance.new("UICorner")
vbCor.CornerRadius = UDim.new(0, 5)
vbCor.Parent = valBox
local resetBtn = Instance.new("TextButton")
resetBtn.Size = UDim2.new(0, 20, 0, 18)
resetBtn.Position = UDim2.new(1, -26, 0, 4)
resetBtn.BackgroundColor3 = Color3.fromRGB(36, 40, 54)
resetBtn.Font = Enum.Font.GothamBold
resetBtn.Text = "↺"
resetBtn.TextColor3 = Color3.fromRGB(185, 195, 215)
resetBtn.TextSize = 11
resetBtn.ZIndex = 8
resetBtn.Parent = container
local rbCor = Instance.new("UICorner")
rbCor.CornerRadius = UDim.new(0, 5)
rbCor.Parent = resetBtn
local track = Instance.new("Frame")
track.Size = UDim2.new(1, -24, 0, 6)
track.Position = UDim2.new(0, 12, 0, 30)
track.BackgroundColor3 = Color3.fromRGB(40, 44, 60)
track.BorderSizePixel = 0
track.ZIndex = 8
track.Parent = container
local tc = Instance.new("UICorner")
tc.CornerRadius = UDim.new(1, 0)
tc.Parent = track
local fill = Instance.new("Frame")
fill.Size = UDim2.new(0, 0, 1, 0)
fill.BackgroundColor3 = Color3.fromRGB(235, 145, 45)
fill.BorderSizePixel = 0
fill.ZIndex = 9
fill.Parent = track
local fc = Instance.new("UICorner")
fc.CornerRadius = UDim.new(1, 0)
fc.Parent = fill
local knob = Instance.new("Frame")
knob.Size = UDim2.new(0, 13, 0, 13)
knob.AnchorPoint = Vector2.new(0.5, 0.5)
knob.Position = UDim2.new(1, 0, 0.5, 0)
knob.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
knob.ZIndex = 10
knob.Parent = fill
local kc = Instance.new("UICorner")
kc.CornerRadius = UDim.new(1, 0)
kc.Parent = knob
local fmt = "%." .. tostring(decimals or 2) .. "f"
local currentVal = defaultVal
local api = {}
onLangChanged(function()
title.Text = tr(i18nKey)
end)
function api:SetValue(val, silent)
currentVal = math.clamp(val, minVal, maxVal)
local alpha = (currentVal - minVal) / (maxVal - minVal)
fill.Size = UDim2.new(alpha, 0, 1, 0)
valBox.Text = string.format(fmt, currentVal)
if not silent and callback then
callback(currentVal)
end
end
function api:SetCustomDisplay(displayStr, alpha)
fill.Size = UDim2.new(math.clamp(alpha, 0, 1), 0, 1, 0)
valBox.Text = displayStr
end
valBox.FocusLost:Connect(function()
local num = tonumber(valBox.Text)
if num then
api:SetValue(num, false)
else
valBox.Text = string.format(fmt, currentVal)
end
end)
resetBtn.MouseButton1Click:Connect(function()
api:SetValue(defaultVal, false)
end)
local function updateFromX(inputX)
local rel = math.clamp((inputX - track.AbsolutePosition.X) / track.AbsoluteSize.X, 0, 1)
local val = minVal + rel * (maxVal - minVal)
api:SetValue(val, false)
end
track.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
activeSliderUpdate = updateFromX
updateFromX(input.Position.X)
end
end)
registerSearchable(container, i18nKey)
api:SetValue(defaultVal, true)
return api
end
-- Компактный сворачиваемый RGB + HEX пикер
local function createRGBPicker(parent, i18nKey, defaultColor, callback)
local expanded = false
local box = Instance.new("Frame")
box.Size = UDim2.new(1, 0, 0, 32)
box.BackgroundColor3 = Color3.fromRGB(21, 23, 33)
box.BorderSizePixel = 0
box.ClipsDescendants = true
box.LayoutOrder = nextOrder()
box.ZIndex = 7
box.Parent = parent
local cor = Instance.new("UICorner")
cor.CornerRadius = UDim.new(0, 8)
cor.Parent = box
local stroke = Instance.new("UIStroke")
stroke.Color = Color3.fromRGB(45, 50, 66)
stroke.Thickness = 1
stroke.Parent = box
local lbl = Instance.new("TextLabel")
lbl.Size = UDim2.new(1, -175, 0, 32)
lbl.Position = UDim2.new(0, 10, 0, 0)
lbl.BackgroundTransparency = 1
lbl.Font = Enum.Font.GothamBold
lbl.TextColor3 = Color3.fromRGB(228, 234, 245)
lbl.TextSize = 11
lbl.TextXAlignment = Enum.TextXAlignment.Left
lbl.TextTruncate = Enum.TextTruncate.AtEnd
lbl.ZIndex = 8
lbl.Parent = box
onLangChanged(function()
lbl.Text = tr(i18nKey)
end)
local hexBox = Instance.new("TextBox")
hexBox.Size = UDim2.new(0, 64, 0, 20)
hexBox.Position = UDim2.new(1, -158, 0, 6)
hexBox.BackgroundColor3 = Color3.fromRGB(32, 35, 48)
hexBox.Font = Enum.Font.GothamBold
hexBox.TextColor3 = Color3.fromRGB(235, 240, 255)
hexBox.TextSize = 10
hexBox.ClearTextOnFocus = false
hexBox.ZIndex = 8
hexBox.Parent = box
local hc = Instance.new("UICorner")
hc.CornerRadius = UDim.new(0, 5)
hc.Parent = hexBox
local previewBtn = Instance.new("TextButton")
previewBtn.Size = UDim2.new(0, 54, 0, 20)
previewBtn.Position = UDim2.new(1, -88, 0, 6)
previewBtn.BackgroundColor3 = defaultColor
previewBtn.Text = "▼"
previewBtn.Font = Enum.Font.GothamBold
previewBtn.TextSize = 9
previewBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
previewBtn.TextStrokeTransparency = 0.4
previewBtn.ZIndex = 8
previewBtn.Parent = box
local pc = Instance.new("UICorner")
pc.CornerRadius = UDim.new(0, 5)
pc.Parent = previewBtn
local resetBtn = Instance.new("TextButton")
resetBtn.Size = UDim2.new(0, 20, 0, 20)
resetBtn.Position = UDim2.new(1, -28, 0, 6)
resetBtn.BackgroundColor3 = Color3.fromRGB(36, 40, 54)
resetBtn.Font = Enum.Font.GothamBold
resetBtn.Text = "↺"
resetBtn.TextColor3 = Color3.fromRGB(185, 195, 215)
resetBtn.TextSize = 11
resetBtn.ZIndex = 8
resetBtn.Parent = box
local rc = Instance.new("UICorner")
rc.CornerRadius = UDim.new(0, 5)
rc.Parent = resetBtn
local rVal = math.floor(defaultColor.R * 255 + 0.5)
local gVal = math.floor(defaultColor.G * 255 + 0.5)
local bVal = math.floor(defaultColor.B * 255 + 0.5)
local channels = {
{ name = "R", col = Color3.fromRGB(235, 75, 75), y = 40 },
{ name = "G", col = Color3.fromRGB(75, 215, 105), y = 60 },
{ name = "B", col = Color3.fromRGB(80, 155, 245), y = 80 },
}
local fills = {}
local valLabels = {}
local api = {}
local function refreshUI(silent)
local c = Color3.fromRGB(rVal, gVal, bVal)
previewBtn.BackgroundColor3 = c
hexBox.Text = colorToHex(c)
fills[1].Size = UDim2.new(rVal / 255, 0, 1, 0)
fills[2].Size = UDim2.new(gVal / 255, 0, 1, 0)
fills[3].Size = UDim2.new(bVal / 255, 0, 1, 0)
valLabels[1].Text = "R: " .. rVal
valLabels[2].Text = "G: " .. gVal
valLabels[3].Text = "B: " .. bVal
if not silent and callback then
callback(c)
end
end
for idx, ch in ipairs(channels) do
local cLbl = Instance.new("TextLabel")
cLbl.Size = UDim2.new(0, 46, 0, 16)
cLbl.Position = UDim2.new(0, 10, 0, ch.y - 4)
cLbl.BackgroundTransparency = 1
cLbl.Font = Enum.Font.GothamBold
cLbl.TextColor3 = ch.col
cLbl.TextSize = 10
cLbl.TextXAlignment = Enum.TextXAlignment.Left
cLbl.ZIndex = 8
cLbl.Parent = box
valLabels[idx] = cLbl
local trk = Instance.new("Frame")
trk.Size = UDim2.new(1, -68, 0, 7)
trk.Position = UDim2.new(0, 56, 0, ch.y)
trk.BackgroundColor3 = Color3.fromRGB(38, 42, 56)
trk.BorderSizePixel = 0
trk.ZIndex = 8
trk.Parent = box
local tc = Instance.new("UICorner")
tc.CornerRadius = UDim.new(1, 0)
tc.Parent = trk
local fl = Instance.new("Frame")
fl.Size = UDim2.new(0, 0, 1, 0)
fl.BackgroundColor3 = ch.col
fl.BorderSizePixel = 0
fl.ZIndex = 9
fl.Parent = trk
local fc = Instance.new("UICorner")
fc.CornerRadius = UDim.new(1, 0)
fc.Parent = fl
fills[idx] = fl
local function updateChannelFromX(inputX)
local rel = math.clamp((inputX - trk.AbsolutePosition.X) / trk.AbsoluteSize.X, 0, 1)
local v = math.floor(rel * 255 + 0.5)
if idx == 1 then rVal = v elseif idx == 2 then gVal = v else bVal = v end
refreshUI(false)
end
trk.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
activeSliderUpdate = updateChannelFromX
updateChannelFromX(input.Position.X)
end
end)
end
previewBtn.MouseButton1Click:Connect(function()
expanded = not expanded
previewBtn.Text = expanded and "▲" or "▼"
box.Size = expanded and UDim2.new(1, 0, 0, 96) or UDim2.new(1, 0, 0, 32)
end)
hexBox.FocusLost:Connect(function()
local parsed = hexToColor(hexBox.Text)
if parsed then
api:SetColor(parsed, false)
else
hexBox.Text = colorToHex(Color3.fromRGB(rVal, gVal, bVal))
end
end)
resetBtn.MouseButton1Click:Connect(function()
api:SetColor(defaultColor, false)
end)
function api:SetColor(c, silent)
rVal = math.floor(c.R * 255 + 0.5)
gVal = math.floor(c.G * 255 + 0.5)
bVal = math.floor(c.B * 255 + 0.5)
refreshUI(silent)
end
registerSearchable(box, i18nKey)
refreshUI(true)
return api
end
local function createToggle(parent, i18nKey, defaultState, callback)
local btn = Instance.new("TextButton")
btn.Size = UDim2.new(1, 0, 0, 30)
btn.Font = Enum.Font.GothamBold
btn.TextColor3 = Color3.fromRGB(240, 245, 255)
btn.TextSize = 11
btn.LayoutOrder = nextOrder()
btn.ZIndex = 7
btn.Parent = parent
local cor = Instance.new("UICorner")
cor.CornerRadius = UDim.new(0, 8)
cor.Parent = btn
local state = defaultState
local api = {}
local function updateVisual()
btn.BackgroundColor3 = state and Color3.fromRGB(36, 86, 60) or Color3.fromRGB(26, 28, 40)
btn.Text = tr(i18nKey) .. ": " .. (state and tr("stateOn") or tr("stateOff"))
end
onLangChanged(updateVisual)
function api:SetState(newState, silent)
state = newState
updateVisual()
if not silent and callback then
callback(state)
end
end
btn.MouseButton1Click:Connect(function()
api:SetState(not state, false)
end)
registerSearchable(btn, i18nKey)
return api
end
local function createGridFrame(parent, columns, cellHeight)
local holder = Instance.new("Frame")
holder.Size = UDim2.new(1, 0, 0, cellHeight)
holder.AutomaticSize = Enum.AutomaticSize.Y
holder.BackgroundTransparency = 1
holder.LayoutOrder = nextOrder()
holder.ZIndex = 7
holder.Parent = parent
local grid = Instance.new("UIGridLayout")
grid.CellSize = UDim2.new(1 / columns, -6, 0, cellHeight)
grid.CellPadding = UDim2.new(0, 6, 0, 6)
grid.SortOrder = Enum.SortOrder.LayoutOrder
grid.Parent = holder
return holder
end
local function createGridButton(gridParent, i18nKeyOrRaw, bgCol, callback, isRawText)
local b = Instance.new("TextButton")
b.BackgroundColor3 = bgCol or Color3.fromRGB(30, 33, 46)
b.Font = Enum.Font.GothamBold
b.TextColor3 = Color3.fromRGB(245, 245, 255)
b.TextSize = 11
b.LayoutOrder = nextOrder()
b.ZIndex = 8
b.Parent = gridParent
local c = Instance.new("UICorner")
c.CornerRadius = UDim.new(0, 7)
c.Parent = b
local s = Instance.new("UIStroke")
s.Color = Color3.fromRGB(56, 62, 82)
s.Thickness = 1
s.Parent = b
if isRawText then
b.Text = i18nKeyOrRaw
else
onLangChanged(function()
b.Text = tr(i18nKeyOrRaw)
end)
end
if callback then
b.MouseButton1Click:Connect(callback)
end
return b, s
end
local function bindSlider(parent, i18nKey, cfgKey, minV, maxV, dec, extraFn)
local s = createSlider(parent, i18nKey, minV, maxV, customConfig[cfgKey], dec, function(v)
customConfig[cfgKey] = v
if extraFn then extraFn(v) end
updateEnvironment()
end)
table.insert(uiSyncCallbacks, function() s:SetValue(customConfig[cfgKey], true) end)
return s
end
local function bindToggle(parent, i18nKey, cfgKey, extraFn)
local t = createToggle(parent, i18nKey, customConfig[cfgKey], function(st)
customConfig[cfgKey] = st
if extraFn then extraFn(st) end
updateEnvironment()
end)
table.insert(uiSyncCallbacks, function() t:SetState(customConfig[cfgKey], true) end)
return t
end
local function bindColor(parent, i18nKey, cfgKey, extraFn)
local p = createRGBPicker(parent, i18nKey, customConfig[cfgKey], function(c)
customConfig[cfgKey] = c
if extraFn then extraFn(c) end
updateEnvironment()
end)
table.insert(uiSyncCallbacks, function() p:SetColor(customConfig[cfgKey], true) end)
return p
end
--------------------------------------------------------------------
-- 9. ЗАПОЛНЕНИЕ 7 ВКЛАДОК НАСТРОЕК
--------------------------------------------------------------------
-- ==================== TAB 1: SKY & WEATHER ====================
local pSky = tabPages["SkyWeather"]
createSectionHeader(pSky, "sec_Sunset")
local sunsetGrid = createGridFrame(pSky, 2, 28)
local sunsetDefs = {
{ id = "Realistic", key = "style_Realistic" },
{ id = "PastelPink", key = "style_PastelPink" },
{ id = "ColdNordic", key = "style_ColdNordic" },
{ id = "WarmCinema", key = "style_WarmCinema" },
}
local sunsetBtns = {}
local function refreshSunsetButtons()
for id, b in pairs(sunsetBtns) do
b.BackgroundColor3 = (id == customConfig.sunsetStyle) and Color3.fromRGB(205, 118, 45) or Color3.fromRGB(28, 30, 42)
end
end
for _, st in ipairs(sunsetDefs) do
local b = createGridButton(sunsetGrid, st.key, Color3.fromRGB(28, 30, 42), function()
customConfig.sunsetStyle = st.id
refreshSunsetButtons()
updateEnvironment()
end)
sunsetBtns[st.id] = b
end
table.insert(uiSyncCallbacks, refreshSunsetButtons)
refreshSunsetButtons()
bindSlider(pSky, "sunsetWarmth", "sunsetWarmth", 0.0, 1.8, 2)
createSectionHeader(pSky, "sec_TimeCelestial")
local timeSlider = createSlider(pSky, "clockTime", 0, 24, currentClockTime, 2, function(val)
currentClockTime = val % 24
local h = math.floor(currentClockTime)
local m = math.floor((currentClockTime - h) * 60)
updateEnvironment()
end)
local function syncTimeUI()
local h = math.floor(currentClockTime)
local m = math.floor((currentClockTime - h) * 60)
timeSlider:SetCustomDisplay(string.format("%02d:%02d", h, m), (currentClockTime % 24) / 24)
end
table.insert(uiSyncCallbacks, syncTimeUI)
local qtGrid = createGridFrame(pSky, 3, 28)
local quickTimes = {
{ key = "qt_Dawn", time = 5.15, col = Color3.fromRGB(68, 76, 112) },
{ key = "qt_Sunrise", time = 6.3, col = Color3.fromRGB(172, 115, 90) },
{ key = "qt_Noon", time = 12.0, col = Color3.fromRGB(58, 112, 172) },
{ key = "qt_Sunset", time = 17.85, col = Color3.fromRGB(185, 112, 82) },
{ key = "qt_Dusk", time = 18.6, col = Color3.fromRGB(142, 82, 102) },
{ key = "qt_Midnight", time = 0.0, col = Color3.fromRGB(32, 42, 72) },
}
for _, qt in ipairs(quickTimes) do
createGridButton(qtGrid, qt.key, qt.col, function()
currentClockTime = qt.time
syncTimeUI()
updateEnvironment()
end)
end
createToggle(pSky, "autoTime", false, function(st) autoTimeEnabled = st end)
createSlider(pSky, "timeSpeed", 0.1, 10.0, secondsPerGameMinute, 1, function(v) secondsPerGameMinute = v end)
bindSlider(pSky, "latitude", "geographicLatitude", -90, 90, 0)
bindSlider(pSky, "sunSize", "sunAngularSize", 1, 60, 0)
bindSlider(pSky, "moonSize", "moonAngularSize", 1, 60, 0)
bindSlider(pSky, "starCount", "starCount", 0, 5000, 0)
bindToggle(pSky, "celestialShown", "celestialShown")
createSectionHeader(pSky, "sec_Weather")
local weatherDefs = {
{ id = "Clear", key = "w_Clear" },
{ id = "Cloudy", key = "w_Cloudy" },
{ id = "Overcast", key = "w_Overcast" },
{ id = "Rain", key = "w_Rain" },
{ id = "Snow", key = "w_Snow" },
{ id = "Fog", key = "w_Fog" },
{ id = "Cyberpunk", key = "w_Cyberpunk" },
}
local weatherGrid = createGridFrame(pSky, 2, 28)
local weatherBtns = {}
local function refreshWeatherButtons()
for id, item in pairs(weatherBtns) do
item.btn.BackgroundColor3 = (id == currentWeather) and Color3.fromRGB(45, 82, 136) or Color3.fromRGB(26, 28, 40)
item.stroke.Color = (id == currentWeather) and Color3.fromRGB(100, 175, 255) or Color3.fromRGB(56, 62, 82)
end
end
for _, wd in ipairs(weatherDefs) do
local b, s = createGridButton(weatherGrid, wd.key, Color3.fromRGB(26, 28, 40), function()
currentWeather = wd.id
refreshWeatherButtons()
updateEnvironment()
updateWetSurfaces()
end)
weatherBtns[wd.id] = { btn = b, stroke = s }
end
table.insert(uiSyncCallbacks, refreshWeatherButtons)
refreshWeatherButtons()
bindSlider(pSky, "rainRate", "rainRateMult", 0.1, 2.5, 2)
bindSlider(pSky, "wetReflectance", "wetReflectanceMax", 0.0, 0.85, 2, function() updateWetSurfaces() end)
bindSlider(pSky, "rainVolume", "rainVolumeMult", 0.0, 2.0, 2)
bindToggle(pSky, "rainSplashes", "rainSplashes")
bindSlider(pSky, "dustRate", "dustRate", 0, 250, 0)
local lGrid = createGridFrame(pSky, 1, 30)
createGridButton(lGrid, "btnLightning", Color3.fromRGB(62, 82, 145), triggerLightningStrike)
-- ==================== TAB 2: LIGHT & SHADOWS ====================
local pLight = tabPages["LightShadows"]
createSectionHeader(pLight, "sec_LightMode")
bindToggle(pLight, "fullManualMode", "fullManualMode")
local spGrid = createGridFrame(pLight, 2, 28)
local shadowPresets = {
{ key = "sp_SharpRTX", shadows = true, soft = 0.03, exp = 0.05, diff = 1.0, spec = 1.0 },
{ key = "sp_SoftReal", shadows = true, soft = 0.22, exp = 0.05, diff = 0.9, spec = 0.9 },
{ key = "sp_HighContrast", shadows = true, soft = 0.0, exp = -0.05, diff = 0.55, spec = 1.0 },
{ key = "sp_SoftDiffused", shadows = true, soft = 0.65, exp = 0.12, diff = 1.0, spec = 0.65 },
{ key = "sp_DarkCinema", shadows = true, soft = 0.10, exp = -0.18, diff = 0.35, spec = 1.0 },
{ key = "sp_MaxFPS", shadows = false, soft = 0.5, exp = 0.05, diff = 0.7, spec = 0.3 },
}
for _, sp in ipairs(shadowPresets) do
createGridButton(spGrid, sp.key, Color3.fromRGB(34, 38, 54), function()
customConfig.globalShadows = sp.shadows
customConfig.shadowSoftness = sp.soft
customConfig.exposure = sp.exp
customConfig.diffuseScale = sp.diff
customConfig.specularScale = sp.spec
syncAllUI()
updateEnvironment()
end)
end
createSectionHeader(pLight, "sec_DirectShadows")
bindToggle(pLight, "globalShadows", "globalShadows")
local rtxTog = createToggle(pLight, "rtxReflections", rtxEnabled, function(st)
rtxEnabled = st
updateEnvironment()
updateWetSurfaces()
end)
table.insert(uiSyncCallbacks, function() rtxTog:SetState(rtxEnabled, true) end)
bindSlider(pLight, "colorTemp", "colorTempKelvin", 2000, 11000, 0)
bindSlider(pLight, "tempTint", "tempTintShift", -1.0, 1.0, 2)
bindSlider(pLight, "brightnessMult", "brightnessMult", 0.0, 4.0, 2)
bindSlider(pLight, "manualBrightness", "manualBrightness", 0.0, 6.0, 2)
bindSlider(pLight, "exposure", "exposure", -2.5, 2.5, 2)
bindSlider(pLight, "shadowSoftness", "shadowSoftness", 0.0, 1.0, 2)
createSectionHeader(pLight, "sec_AmbientPBR")
bindSlider(pLight, "outdoorBoost", "outdoorAmbientBoost", 0.0, 2.5, 2)
bindSlider(pLight, "ambientBoost", "ambientBoost", 0.0, 2.5, 2)
bindSlider(pLight, "specularScale", "specularScale", 0.0, 1.0, 2)
bindSlider(pLight, "diffuseScale", "diffuseScale", 0.0, 1.0, 2)
createSectionHeader(pLight, "sec_ManualRGB")
bindToggle(pLight, "manualLightColors", "manualLightColors")
bindColor(pLight, "col_Top", "manualTopColor")
bindColor(pLight, "col_Bot", "manualBotColor")
bindColor(pLight, "col_Outdoor", "manualOutdoorColor")
bindColor(pLight, "col_Ambient", "manualAmbientColor")
-- ==================== TAB 3: 3-POINT STUDIO RIG ====================
local pRig = tabPages["StudioRig"]
createSectionHeader(pRig, "sec_StudioRig")
bindToggle(pRig, "rigEnabled", "rigEnabled")
local rigModeGrid = createGridFrame(pRig, 3, 28)
local rigModes = {
{ id = "Camera", key = "rigMode_Camera" },
{ id = "Character", key = "rigMode_Char" },
{ id = "World", key = "rigMode_World" },
}
local rigModeBtns = {}
local function refreshRigModeBtns()
for id, b in pairs(rigModeBtns) do
b.BackgroundColor3 = (id == customConfig.rigAttachMode) and Color3.fromRGB(205, 118, 45) or Color3.fromRGB(28, 30, 42)
end
end
for _, rm in ipairs(rigModes) do
local b = createGridButton(rigModeGrid, rm.key, Color3.fromRGB(28, 30, 42), function()
customConfig.rigAttachMode = rm.id
if rm.id == "World" then
local char = player.Character
local root = char and char:FindFirstChild("HumanoidRootPart")
rigLockedWorldCF = root and root.CFrame or camera.CFrame
end
refreshRigModeBtns()
end)
rigModeBtns[rm.id] = b
end
table.insert(uiSyncCallbacks, refreshRigModeBtns)
refreshRigModeBtns()
bindToggle(pRig, "rigShadows", "rigShadows")
bindSlider(pRig, "rigDistance", "rigDistance", 3, 35, 1)
bindSlider(pRig, "keyBright", "keyBrightness", 0.0, 6.0, 2)
bindSlider(pRig, "keyRange", "keyRange", 5, 60, 0)
bindColor(pRig, "col_Key", "keyColor")
bindSlider(pRig, "fillBright", "fillBrightness", 0.0, 6.0, 2)
bindSlider(pRig, "fillRange", "fillRange", 5, 60, 0)
bindColor(pRig, "col_Fill", "fillColor")
bindSlider(pRig, "rimBright", "rimBrightness", 0.0, 6.0, 2)
bindSlider(pRig, "rimRange", "rimRange", 5, 60, 0)
bindColor(pRig, "col_Rim", "rimColor")
-- ==================== TAB 4: ATMOSPHERE & WORLD ====================
local pAtmo = tabPages["AtmoWorld"]
createSectionHeader(pAtmo, "sec_Atmosphere")
bindToggle(pAtmo, "atmoEnabled", "atmoEnabled")
bindSlider(pAtmo, "atmoDensity", "atmoDensityMult", 0.0, 2.5, 2)
bindSlider(pAtmo, "atmoOffset", "atmoOffset", 0.0, 1.0, 2)
bindSlider(pAtmo, "atmoHaze", "atmoHazeOffset", -1.0, 5.0, 2)
bindSlider(pAtmo, "atmoGlare", "atmoGlareMult", 0.0, 3.0, 2)
bindToggle(pAtmo, "manualAtmoColors", "manualAtmoColors")
bindColor(pAtmo, "col_Atmo", "manualAtmoColor")
bindColor(pAtmo, "col_Decay", "manualAtmoDecay")
createSectionHeader(pAtmo, "sec_ClassicFog")
bindSlider(pAtmo, "fogStart", "fogStart", 0, 1500, 0)
bindSlider(pAtmo, "fogEnd", "fogEnd", 20, 5000, 0)
bindColor(pAtmo, "col_Fog", "fogColor")
createSectionHeader(pAtmo, "sec_CloudsWind")
bindToggle(pAtmo, "cloudsEnabled", "cloudsEnabled")
local cCovSlider = createSlider(pAtmo, "cloudCover", -0.05, 1.0, -0.05, 2, function(v)
customConfig.cloudCoverOverride = (v < 0) and -1 or v
updateEnvironment()
end)
local cDenSlider = createSlider(pAtmo, "cloudDensity", -0.05, 1.0, -0.05, 2, function(v)
customConfig.cloudDensityOverride = (v < 0) and -1 or v
updateEnvironment()
end)
table.insert(uiSyncCallbacks, function()
cCovSlider:SetValue(customConfig.cloudCoverOverride < 0 and -0.05 or customConfig.cloudCoverOverride, true)
cDenSlider:SetValue(customConfig.cloudDensityOverride < 0 and -0.05 or customConfig.cloudDensityOverride, true)
end)
bindToggle(pAtmo, "manualCloudColor", "manualCloudColor")
bindColor(pAtmo, "col_Cloud", "cloudCustomColor")
bindSlider(pAtmo, "windSpeed", "windSpeed", 0, 65, 0)
bindSlider(pAtmo, "windAngle", "windAngle", 0, 360, 0)
createSectionHeader(pAtmo, "sec_Water")
bindSlider(pAtmo, "waterWaveSize", "waterWaveSize", 0.0, 1.0, 2)
bindSlider(pAtmo, "waterWaveSpeed", "waterWaveSpeed", 0, 85, 0)
bindSlider(pAtmo, "waterReflect", "waterReflectance", 0.0, 1.0, 2)
bindSlider(pAtmo, "waterTrans", "waterTransparency", 0.0, 1.0, 2)
bindColor(pAtmo, "col_Water", "waterColor")
-- ==================== TAB 5: COLOR & POST-FX ====================
local pPost = tabPages["PostFX"]
createSectionHeader(pPost, "sec_LUTs")
local lutGrid = createGridFrame(pPost, 2, 28)
local lutPresets = {
{ key = "lut_Natural", sat = 0.0, cont = 0.0, tint = Color3.fromRGB(255, 255, 255) },
{ key = "lut_Clean", sat = -0.08, cont = 0.04, tint = Color3.fromRGB(255, 255, 255) },
{ key = "lut_Film", sat = -0.05, cont = 0.12, tint = Color3.fromRGB(248, 246, 240) },
{ key = "lut_Blockbuster", sat = 0.08, cont = 0.20, tint = Color3.fromRGB(242, 248, 255) },
{ key = "lut_Pastel", sat = -0.14, cont = 0.08, tint = Color3.fromRGB(255, 240, 225) },
{ key = "lut_Nordic", sat = -0.25, cont = 0.16, tint = Color3.fromRGB(215, 235, 255) },
{ key = "lut_Cyber", sat = 0.32, cont = 0.24, tint = Color3.fromRGB(250, 230, 255) },
{ key = "lut_Noir", sat = -1.0, cont = 0.38, tint = Color3.fromRGB(255, 255, 255) },
}
for _, lut in ipairs(lutPresets) do
createGridButton(lutGrid, lut.key, Color3.fromRGB(34, 38, 52), function()
customConfig.saturationOffset = lut.sat
customConfig.contrastOffset = lut.cont
customConfig.tintColor = lut.tint
syncAllUI()
updateEnvironment()
end)
end
createSectionHeader(pPost, "sec_ColorCorrection")
bindToggle(pPost, "ccEnabled", "ccEnabled")
bindSlider(pPost, "ccBrightness", "brightnessCC", -0.4, 0.4, 2)
bindSlider(pPost, "ccSaturation", "saturationOffset", -1.0, 1.0, 2)
bindSlider(pPost, "ccContrast", "contrastOffset", -0.8, 1.0, 2)
bindColor(pPost, "col_Tint", "tintColor")
createSectionHeader(pPost, "sec_BloomRaysBlur")
bindToggle(pPost, "bloomEnabled", "bloomEnabled")
bindSlider(pPost, "bloomIntensity", "bloomIntensity", 0.0, 3.0, 2)
bindSlider(pPost, "bloomSize", "bloomSize", 0, 56, 0)
bindSlider(pPost, "bloomThreshold", "bloomThreshold", 0.1, 2.5, 2)
bindToggle(pPost, "sunRaysEnabled", "sunRaysEnabled")
bindSlider(pPost, "sunRaysMult", "sunRaysMult", 0.0, 2.5, 2)
bindSlider(pPost, "sunRaysSpread", "sunRaysSpread", 0.0, 1.0, 2)
bindSlider(pPost, "blurSize", "blurSize", 0.0, 24.0, 1)
bindToggle(pPost, "motionBlur", "motionBlurEnabled")
bindSlider(pPost, "motionBlurStrength", "motionBlurStrength", 0.1, 1.5, 2)
-- ==================== TAB 6: CAMERA & OPTICS ====================
local pCam = tabPages["Camera"]
createSectionHeader(pCam, "sec_DoF")
bindToggle(pCam, "dofEnabled", "dofEnabled")
bindToggle(pCam, "dofAuto", "dofAutoFocus")
bindSlider(pCam, "dofFar", "dofFarIntensity", 0.0, 1.0, 2)
bindSlider(pCam, "dofNear", "dofNearIntensity", 0.0, 1.0, 2)
bindSlider(pCam, "dofDist", "dofFocusDist", 5, 250, 0)
bindSlider(pCam, "dofRadius", "dofRadius", 5, 150, 0)
createSectionHeader(pCam, "sec_LensCinema")
bindSlider(pCam, "fov", "fov", 20, 115, 0, function(v) camera.FieldOfView = v end)
bindSlider(pCam, "camRoll", "cameraRoll", -45, 45, 0)
bindToggle(pCam, "cinemaBars", "cinemaBars", updateCinemaBars)
bindSlider(pCam, "cinemaHeight", "cinemaBarHeight", 0.04, 0.22, 2, function()
if customConfig.cinemaBars then updateCinemaBars() end
end)
bindToggle(pCam, "vignette", "vignetteEnabled")
bindSlider(pCam, "vignetteOpacity", "vignetteOpacity", 0.1, 0.9, 2)
bindToggle(pCam, "lensFlare", "lensFlareEnabled")
bindSlider(pCam, "flareIntensity", "lensFlareIntensity", 0.1, 1.5, 2)
createSectionHeader(pCam, "sec_Freecam")
local freecamActive = false
local freecamPos = Vector3.zero
local freecamAngles = Vector2.zero
local freecamSpeed = 45
local function setFreecam(state)
freecamActive = state
local char = player.Character
local root = char and char:FindFirstChild("HumanoidRootPart")
if freecamActive then
freecamPos = camera.CFrame.Position
local rx, ry, _ = camera.CFrame:ToOrientation()
freecamAngles = Vector2.new(rx, ry)
camera.CameraType = Enum.CameraType.Scriptable
if root then root.Anchored = true end
else
camera.CameraType = Enum.CameraType.Custom
if root then root.Anchored = false end
end
end
createToggle(pCam, "freecam", false, setFreecam)
createSlider(pCam, "freecamSpeed", 5, 180, freecamSpeed, 0, function(v) freecamSpeed = v end)
createSlider(pCam, "walkSpeed", 8, 100, 16, 0, function(v)
local hum = player.Character and player.Character:FindFirstChildOfClass("Humanoid")
if hum then hum.WalkSpeed = v end
end)
createSlider(pCam, "gravity", 15, 196.2, workspace.Gravity, 1, function(v) workspace.Gravity = v end)
-- ==================== TAB 7: CONFIGS & PRESETS ====================
local pCfg = tabPages["Configs"]
createSectionHeader(pCfg, "sec_BuiltInPresets")
local presetGrid = createGridFrame(pCfg, 2, 30)
for _, pr in ipairs(builtInPresets) do
createGridButton(presetGrid, pr.name, Color3.fromRGB(34, 42, 60), function()
applyPresetTable(pr)
updateCinemaBars()
end, true)
end
createSectionHeader(pCfg, "sec_CustomConfigs")
local cfgNameBox = Instance.new("TextBox")
cfgNameBox.Size = UDim2.new(1, 0, 0, 30)
cfgNameBox.BackgroundColor3 = Color3.fromRGB(22, 24, 35)
cfgNameBox.Font = Enum.Font.GothamMedium
cfgNameBox.PlaceholderColor3 = Color3.fromRGB(130, 138, 160)
cfgNameBox.Text = ""
cfgNameBox.TextColor3 = Color3.fromRGB(240, 245, 255)
cfgNameBox.TextSize = 11
cfgNameBox.ClearTextOnFocus = false
cfgNameBox.LayoutOrder = nextOrder()
cfgNameBox.ZIndex = 7
cfgNameBox.Parent = pCfg
local cnbCor = Instance.new("UICorner")
cnbCor.CornerRadius = UDim.new(0, 7)
cnbCor.Parent = cfgNameBox
local saveCfgBtn = Instance.new("TextButton")
saveCfgBtn.Size = UDim2.new(1, 0, 0, 30)
saveCfgBtn.BackgroundColor3 = Color3.fromRGB(38, 92, 64)
saveCfgBtn.Font = Enum.Font.GothamBold
saveCfgBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
saveCfgBtn.TextSize = 11
saveCfgBtn.LayoutOrder = nextOrder()
saveCfgBtn.ZIndex = 7
saveCfgBtn.Parent = pCfg
local scbCor = Instance.new("UICorner")
scbCor.CornerRadius = UDim.new(0, 7)
scbCor.Parent = saveCfgBtn
local savedListFrame = Instance.new("Frame")
savedListFrame.Size = UDim2.new(1, 0, 0, 0)
savedListFrame.AutomaticSize = Enum.AutomaticSize.Y
savedListFrame.BackgroundTransparency = 1
savedListFrame.LayoutOrder = nextOrder()
savedListFrame.ZIndex = 7
savedListFrame.Parent = pCfg
local slLayout = Instance.new("UIListLayout")
slLayout.SortOrder = Enum.SortOrder.LayoutOrder
slLayout.Padding = UDim.new(0, 5)
slLayout.Parent = savedListFrame
createSectionHeader(pCfg, "sec_ImportExport")
local jsonBox = Instance.new("TextBox")
jsonBox.Size = UDim2.new(1, 0, 0, 58)
jsonBox.BackgroundColor3 = Color3.fromRGB(20, 22, 32)
jsonBox.Font = Enum.Font.Code
jsonBox.PlaceholderColor3 = Color3.fromRGB(120, 128, 150)
jsonBox.Text = ""
jsonBox.TextColor3 = Color3.fromRGB(185, 235, 195)
jsonBox.TextSize = 10
jsonBox.TextWrapped = true
jsonBox.ClearTextOnFocus = false
jsonBox.TextXAlignment = Enum.TextXAlignment.Left
jsonBox.TextYAlignment = Enum.TextYAlignment.Top
jsonBox.LayoutOrder = nextOrder()
jsonBox.ZIndex = 7
jsonBox.Parent = pCfg
local jbPad = Instance.new("UIPadding")
jbPad.PaddingLeft = UDim.new(0, 8)
jbPad.PaddingRight = UDim.new(0, 8)
jbPad.PaddingTop = UDim.new(0, 6)
jbPad.Parent = jsonBox
local jbCor = Instance.new("UICorner")
jbCor.CornerRadius = UDim.new(0, 7)
jbCor.Parent = jsonBox
local ieGrid = createGridFrame(pCfg, 2, 30)
local exportBtn = createGridButton(ieGrid, "btnExportCurrent", Color3.fromRGB(48, 75, 125), function()
jsonBox.Text = serializeCurrentConfig()
end)
local importBtn = createGridButton(ieGrid, "btnImportBox", Color3.fromRGB(195, 115, 42), function()
local ok = applySerializedConfig(jsonBox.Text)
if ok then
updateCinemaBars()
else
jsonBox.Text = tr("cfgInvalidMsg")
end
end)
local function rebuildSavedConfigsList()
for _, ch in ipairs(savedListFrame:GetChildren()) do
if ch:IsA("Frame") then ch:Destroy() end
end
for idx, item in ipairs(savedCustomConfigs) do
local row = Instance.new("Frame")
row.Size = UDim2.new(1, 0, 0, 30)
row.BackgroundColor3 = Color3.fromRGB(24, 27, 38)
row.ZIndex = 7
row.Parent = savedListFrame
local rCor = Instance.new("UICorner")
rCor.CornerRadius = UDim.new(0, 7)
rCor.Parent = row
local nameLbl = Instance.new("TextLabel")
nameLbl.Size = UDim2.new(1, -135, 1, 0)
nameLbl.Position = UDim2.new(0, 10, 0, 0)
nameLbl.BackgroundTransparency = 1
nameLbl.Font = Enum.Font.GothamBold
nameLbl.Text = "📄 " .. item.name
nameLbl.TextColor3 = Color3.fromRGB(235, 240, 255)
nameLbl.TextSize = 11
nameLbl.TextXAlignment = Enum.TextXAlignment.Left
nameLbl.ZIndex = 8
nameLbl.Parent = row
local loadBtn = Instance.new("TextButton")
loadBtn.Size = UDim2.new(0, 82, 0, 22)
loadBtn.Position = UDim2.new(1, -116, 0.5, -11)
loadBtn.BackgroundColor3 = Color3.fromRGB(48, 88, 145)
loadBtn.Font = Enum.Font.GothamBold
loadBtn.Text = tr("btnLoad")
loadBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
loadBtn.TextSize = 10
loadBtn.ZIndex = 8
loadBtn.Parent = row
local lCor = Instance.new("UICorner")
lCor.CornerRadius = UDim.new(0, 5)
lCor.Parent = loadBtn
local delBtn = Instance.new("TextButton")
delBtn.Size = UDim2.new(0, 24, 0, 22)
delBtn.Position = UDim2.new(1, -28, 0.5, -11)
delBtn.BackgroundColor3 = Color3.fromRGB(130, 42, 45)
delBtn.Font = Enum.Font.GothamBold
delBtn.Text = tr("btnDelete")
delBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
delBtn.TextSize = 10
delBtn.ZIndex = 8
delBtn.Parent = row
local dCor = Instance.new("UICorner")
dCor.CornerRadius = UDim.new(0, 5)
dCor.Parent = delBtn
loadBtn.MouseButton1Click:Connect(function()
applySerializedConfig(item.json)
jsonBox.Text = item.json
updateCinemaBars()
end)
delBtn.MouseButton1Click:Connect(function()
table.remove(savedCustomConfigs, idx)
rebuildSavedConfigsList()
end)
end
end
onLangChanged(function()
cfgNameBox.PlaceholderText = tr("cfgNamePlaceholder")
saveCfgBtn.Text = tr("btnSaveCfg")
jsonBox.PlaceholderText = tr("jsonPlaceholder")
rebuildSavedConfigsList()
end)
saveCfgBtn.MouseButton1Click:Connect(function()
local name = cfgNameBox.Text
if not name or #name:gsub("%s+", "") == 0 then
name = "Config #" .. tostring(#savedCustomConfigs + 1)
end
local encoded = serializeCurrentConfig()
table.insert(savedCustomConfigs, { name = name, json = encoded })
cfgNameBox.Text = ""
jsonBox.Text = encoded
rebuildSavedConfigsList()
end)
UserInputService.InputBegan:Connect(function(input, gpe)
if gpe then return end
if input.KeyCode == Enum.KeyCode.H then
local vis = not toggleBtn.Visible
toggleBtn.Visible = vis
mainFrame.Visible = vis
end
end)
switchTab("SkyWeather")
--------------------------------------------------------------------
-- 10. ГЛАВНЫЙ ЦИКЛ РЕНДЕРА (FREECAM, MOTION BLUR, RIG, DOF, ОСАДКИ)
--------------------------------------------------------------------
local snowAccumulator = 0
local splashAccumulator = 0
local wetTimer = 0
local lightningTimer = 0
local smoothGlare = 0
local fpsCounter = 60
local prevLookVec = camera.CFrame.LookVector
local rayParams = RaycastParams.new()
rayParams.FilterType = Enum.RaycastFilterType.Exclude
local function spawnRainSplash(pos, normal)
local splash = Instance.new("Part")
splash.Size = Vector3.new(0.15, 0.02, 0.15)
splash.Material = Enum.Material.Neon
splash.Color = Color3.fromRGB(200, 225, 255)
splash.Transparency = 0.45
splash.Anchored = true
splash.CanCollide = false
splash.CanQuery = false
splash.CanTouch = false
splash.CastShadow = false
splash.CFrame = CFrame.lookAt(pos + normal * 0.03, pos + normal) * CFrame.Angles(math.rad(90), 0, 0)
splash.Parent = fxFolder
local mesh = Instance.new("CylinderMesh")
mesh.Parent = splash
TweenService:Create(splash, TweenInfo.new(0.28, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {
Size = Vector3.new(1.1, 0.02, 1.1),
Transparency = 1
}):Play()
Debris:AddItem(splash, 0.3)
end
RunService.RenderStepped:Connect(function(dt)
fpsCounter = lerp(fpsCounter, 1 / math.max(dt, 0.001), 0.1)
local h = math.floor(currentClockTime)
local m = math.floor((currentClockTime - h) * 60)
fpsLabel.Text = string.format("FPS: %d | %02d:%02d", math.floor(fpsCounter + 0.5), h, m)
if autoTimeEnabled and not activeSliderUpdate then
local hoursPerSecond = 1 / (secondsPerGameMinute * 60)
currentClockTime = (currentClockTime + dt * hoursPerSecond) % 24
syncTimeUI()
updateEnvironment()
end
-- Freecam & Camera Roll
if freecamActive then
if UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton2) then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local delta = UserInputService:GetMouseDelta()
freecamAngles = Vector2.new(
math.clamp(freecamAngles.X - delta.Y * 0.004, -math.rad(89), math.rad(89)),
freecamAngles.Y - delta.X * 0.004
)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
local rotCF = CFrame.fromOrientation(freecamAngles.X, freecamAngles.Y, math.rad(customConfig.cameraRoll))
local moveVec = Vector3.zero
if UserInputService:IsKeyDown(Enum.KeyCode.W) then moveVec = moveVec + rotCF.LookVector end
if UserInputService:IsKeyDown(Enum.KeyCode.S) then moveVec = moveVec - rotCF.LookVector end
if UserInputService:IsKeyDown(Enum.KeyCode.D) then moveVec = moveVec + rotCF.RightVector end
if UserInputService:IsKeyDown(Enum.KeyCode.A) then moveVec = moveVec - rotCF.RightVector end
if UserInputService:IsKeyDown(Enum.KeyCode.E) then moveVec = moveVec + Vector3.new(0, 1, 0) end
if UserInputService:IsKeyDown(Enum.KeyCode.Q) then moveVec = moveVec - Vector3.new(0, 1, 0) end
local speedMult = UserInputService:IsKeyDown(Enum.KeyCode.LeftShift) and 2.2 or 1.0
freecamPos = freecamPos + moveVec * freecamSpeed * speedMult * dt
camera.CFrame = CFrame.new(freecamPos) * rotCF
elseif math.abs(customConfig.cameraRoll) > 0.1 then
camera.CFrame = camera.CFrame * CFrame.Angles(0, 0, math.rad(customConfig.cameraRoll))
end
-- Dynamic Camera Motion Blur
local curLook = camera.CFrame.LookVector
if customConfig.motionBlurEnabled then
local angularSpeed = (curLook - prevLookVec).Magnitude / math.max(dt, 0.001)
local targetBlur = customConfig.blurSize + math.clamp(angularSpeed * 2.2 * customConfig.motionBlurStrength, 0, 22)
blurEffect.Size = lerp(blurEffect.Size, targetBlur, dt * 14)
blurEffect.Enabled = (blurEffect.Size > 0.1)
end
prevLookVec = curLook
local camPos = camera.CFrame.Position
weatherDome.Position = camPos + Vector3.new(0, 28, 0)
rayParams.FilterDescendantsInstances = { fxFolder, player.Character }
-- Позиционирование 3-точечного студийного света (Key, Fill, Rim)
if customConfig.rigEnabled then
local anchorCF = camera.CFrame
if customConfig.rigAttachMode == "Character" then
local root = player.Character and player.Character:FindFirstChild("HumanoidRootPart")
if root then anchorCF = root.CFrame end
elseif customConfig.rigAttachMode == "World" then
anchorCF = rigLockedWorldCF
end
local d = customConfig.rigDistance
keyPart.CFrame = anchorCF * CFrame.new(d * 0.7, d * 0.45, -d * 0.75)
fillPart.CFrame = anchorCF * CFrame.new(-d * 0.8, d * 0.15, -d * 0.6)
rimPart.CFrame = anchorCF * CFrame.new(0, d * 0.55, d * 0.85)
end
vignetteStroke.Transparency = customConfig.vignetteEnabled and (1 - customConfig.vignetteOpacity) or 1
if customConfig.dofEnabled and customConfig.dofAutoFocus then
local focusHit = workspace:Raycast(camPos, camera.CFrame.LookVector * 250, rayParams)
local targetDist = focusHit and (focusHit.Position - camPos).Magnitude or 85
dof.FocusDistance = lerp(dof.FocusDistance, math.clamp(targetDist, 6, 220), dt * 8)
end
-- Оптические блики солнца (Lens Flare & Bokeh)
if rtxEnabled and customConfig.lensFlareEnabled and sky.CelestialBodiesShown then
local sunDir = Lighting:GetSunDirection()
if sunDir.Y > -0.04 then
local lookDot = math.clamp(camera.CFrame.LookVector:Dot(sunDir), 0, 1)
local sunHit = workspace:Raycast(camPos, sunDir * 700, rayParams)
local sunVisible = (sunHit == nil) and 1 or 0
local targetGlare = (lookDot ^ 3.0) * sunVisible * customConfig.lensFlareIntensity
smoothGlare = lerp(smoothGlare, targetGlare, dt * 8)
sunRays.Intensity = baseSunRays + smoothGlare * 0.28
bloom.Intensity = customConfig.bloomIntensity + smoothGlare * 0.45
sunGlareOverlay.BackgroundTransparency = math.clamp(1 - smoothGlare * 0.10, 0.88, 1)
local sunScreenPos, onScreen = camera:WorldToViewportPoint(camPos + sunDir * 1000)
local vpCenter = camera.ViewportSize * 0.5
local sun2D = Vector2.new(sunScreenPos.X, sunScreenPos.Y)
local delta = vpCenter - sun2D
for _, item in ipairs(bokehCircles) do
if smoothGlare > 0.05 and onScreen then
local pos = vpCenter + delta * item.data.scale
item.frame.Position = UDim2.new(0, pos.X, 0, pos.Y)
local vis = math.clamp(smoothGlare, 0, 1)
item.frame.BackgroundTransparency = lerp(1, item.data.maxAlpha, vis)
item.stroke.Transparency = lerp(1, item.data.maxAlpha - 0.08, vis)
else
item.frame.BackgroundTransparency = 1
item.stroke.Transparency = 1
end
end
else
smoothGlare = lerp(smoothGlare, 0, dt * 6)
sunRays.Intensity = lerp(sunRays.Intensity, 0, dt * 6)
bloom.Intensity = lerp(bloom.Intensity, customConfig.bloomIntensity, dt * 6)
sunGlareOverlay.BackgroundTransparency = 1
for _, item in ipairs(bokehCircles) do
item.frame.BackgroundTransparency = 1
item.stroke.Transparency = 1
end
end
else
sunRays.Intensity = lerp(sunRays.Intensity, baseSunRays, dt * 6)
bloom.Intensity = lerp(bloom.Intensity, customConfig.bloomIntensity, dt * 6)
sunGlareOverlay.BackgroundTransparency = 1
for _, item in ipairs(bokehCircles) do
item.frame.BackgroundTransparency = 1
item.stroke.Transparency = 1
end
end
-- Дождь, лужи и гроза
if currentWeather == "Rain" then
local roofCheck = workspace:Raycast(camPos, Vector3.new(0, 50, 0), rayParams)
local targetVol = (roofCheck and 0.22 or 0.70) * customConfig.rainVolumeMult
local targetPitch = roofCheck and 0.8 or 1.0
rainSound.Volume = lerp(rainSound.Volume, targetVol, dt * 5)
rainSound.PlaybackSpeed = lerp(rainSound.PlaybackSpeed, targetPitch, dt * 5)
if customConfig.rainSplashes then
splashAccumulator = splashAccumulator + dt
if splashAccumulator >= 0.03 then
splashAccumulator = 0
for _ = 1, 2 do
local rx = math.random(-35, 35)
local rz = math.random(-35, 35)
local origin = camPos + Vector3.new(rx, 25, rz)
local hit = workspace:Raycast(origin, Vector3.new(0, -60, 0), rayParams)
if hit and hit.Normal.Y > 0.5 then
spawnRainSplash(hit.Position, hit.Normal)
end
end
end
end
wetTimer = wetTimer + dt
if wetTimer > 1.5 then
wetTimer = 0
updateWetSurfaces()
end
lightningTimer = lightningTimer + dt
if lightningTimer > math.random(12, 22) and not isLightningActive then
lightningTimer = 0
triggerLightningStrike()
end
end
end)
-- Физические 3D-снежинки
RunService.Heartbeat:Connect(function(dt)
if currentWeather ~= "Snow" then return end
snowAccumulator = snowAccumulator + dt
if snowAccumulator < 0.03 then return end
snowAccumulator = 0
local camPos = camera.CFrame.Position
local windVec = workspace.GlobalWind * 0.25
for _ = 1, 3 do
local rx = math.random(-45, 45)
local rz = math.random(-45, 45)
local spawnPos = camPos + Vector3.new(rx, math.random(22, 32), rz)
local roofHit = workspace:Raycast(spawnPos + Vector3.new(0, 30, 0), Vector3.new(0, -35, 0), rayParams)
if not roofHit then
local flake = Instance.new("Part")
local flakeSize = math.random(14, 24) / 100
flake.Size = Vector3.new(flakeSize, flakeSize, flakeSize)
flake.Shape = Enum.PartType.Ball
flake.Material = Enum.Material.Neon
flake.Color = Color3.fromRGB(245, 250, 255)
flake.Transparency = math.random(15, 40) / 100
flake.CanCollide = false
flake.CanTouch = false
flake.CanQuery = false
flake.CastShadow = false
flake.Massless = true
flake.CFrame = CFrame.new(spawnPos)
flake.Parent = fxFolder
flake.AssemblyLinearVelocity = Vector3.new(
math.random(-4, 4) + windVec.X,
-math.random(8, 13),
math.random(-4, 4) + windVec.Z
)
Debris:AddItem(flake, 3.5)
end
end
end)
syncTimeUI()
updateEnvironment()ai slop warning made by gemini 4 argon

Universal