Files
SMScripts/scripting/include/fartsy/ass_enhancer.inc

951 lines
38 KiB
SourcePawn

//Fartsy's Scene Enhancer (Inspired by Mrbt0907/Weather2Remastered)
char FSE_VER[8] = "2.1.0";
//All background music
enum struct BGM {
char realPath[64];
char songName[64];
float introSeconds;
float loopSeconds;
int SNDLVL;
}
BGM BGMArray[48];
//All sound effects
enum struct SFXARRAY {
char realPath[64];
int SNDLVL;
}
SFXARRAY SFXArray[127];
//Sound preference menu
char sndPrefs[][128] = {
"Sounds are currently DISABLED.",
"Sounds are currently MUSIC ONLY.",
"Sounds are currently SOUND EFFECTS ONLY.",
"Sounds are currently ALL ON.",
"Somehow your sound preference was stored as non-existent 5... Please configure your sounds."
};
Handle cvarSNDDefault = INVALID_HANDLE;
int soundPreference[MAXPLAYERS + 1];
//Get client sound prefs
public void SQL_SNDPrefs(Database db, DBResultSet results, const char[] error, int client) {
if (!results) {
LogError("Failed to query database: %s", error);
return;
}
if (!IsValidClient(client)) return;
if (results.FetchRow()) soundPreference[client] = results.FetchInt(0);
}
//Music system rewrite for the 8th time. I will never make a change. My code will never mend. Still everything's the same and it all just fades to math. Stage 7, Luigi. I don't even know what that is but it's bad!
/**I have rewritten this stupid thing 8 times now. It now exists in its final form.
* This is the audio manager. It plays music. It plays music PER CLIENT. It is good at playing MUSIC.
* It syncs music. It tracks the EXACT MILLISECOND POSITION of the currently playing song.
*/
int g_chanBGM;
int g_indexBGM;
enum struct AUDIOMANAGER {
bool bgmPlaying;
bool EventMode;
bool shouldTick;
bool stopBGM;
bool hasTimeOffset;
bool clientIsFresh;
char cachedPath[128];
char songName[128];
float timeSeconds;
float savedTimeSeconds;
float loopSeconds;
float savedLoopSeconds;
float introSeconds;
float savedIntroSeconds;
int Client;
int savedIndexBGM;
int indexBGM;
int loops;
int savedLoops;
int VIPBGM;
bool isEventMode() {
return this.EventMode;
}
/** Gets the engine time, accounting for intro offset seconds **/
float engineSecondsAdjusted() {
return GetEngineTime() + this.introSeconds;
}
/** Changes the current music.
* @param bgm - The index of the music to be played
* @param instant - True = stops music NOW and changes, False = play current song then change
**/
void ChangeBGM(int bgm, bool instant) {
this.indexBGM = this.VIPBGM > 0 ? this.VIPBGM : bgm == 0 ? g_indexBGM : bgm;
PrintToChatAll("%i = %i > 0 ? %i : %i == 0 ? %i : %i", this.indexBGM, this.VIPBGM, this.VIPBGM, bgm, g_indexBGM, bgm);
PrintToServer("Set %i for %N", this.indexBGM, this.Client);
if (instant) {
this.timeSeconds = 0.0;
CreateTimer(1.0, SyncMusic, this.Client);
}
PrintToServer("%f",GetEngineTime());
this.shouldTick = true;
this.hasTimeOffset = BGMArray[this.indexBGM].introSeconds > 0 ? true : false;
this.stopBGM = !StrEqual(this.cachedPath, BGMArray[this.indexBGM].realPath) && !this.EventMode ? true : false;
PrintToServer(!StrEqual(this.cachedPath, BGMArray[this.indexBGM].realPath) && !this.EventMode ? "true" : "false");
this.bgmPlaying = true;
//if (this.indexBGM >= 20) for (int i = 0; i < MaxClients; i++) for (int s = 19; s < bgm; s++) StopSound(i, this.chanBGM, BGMArray[s].realPath); //Very quick, very dirty, very suboptimal, but gets the job done... This stops all boss music.
}
void EnterEventMode(int bgm) {
PrintToChat(this.Client, "Saving %i for you", this.indexBGM);
this.savedIndexBGM = this.indexBGM;
this.savedTimeSeconds = this.timeSeconds;
this.savedLoopSeconds = this.loopSeconds;
this.savedIntroSeconds = this.introSeconds;
this.savedLoops = this.loops;
this.EventMode = true;
CSEClient(this.Client, BGMArray[this.indexBGM].realPath, BGMArray[this.indexBGM].SNDLVL, true, 1, 0.05, 100);
this.ChangeBGM(bgm, true);
PrintToServer("[AudioManager] Entering event mode with song %s", BGMArray[bgm].songName);
}
void ExitEventMode() {
StopSound(this.Client, g_chanBGM, BGMArray[this.indexBGM].realPath);
this.indexBGM = this.savedIndexBGM;
this.loops = this.savedLoops;
this.introSeconds = this.savedIntroSeconds;
this.loopSeconds = this.savedLoopSeconds;
this.timeSeconds = this.savedTimeSeconds;
CSEClient(this.Client, BGMArray[this.indexBGM].realPath, BGMArray[this.indexBGM].SNDLVL, true, 1, 1.0, 100);
this.EventMode = false;
CreateTimer(1.0, SyncMusic, this.Client);
PrintToServer("[AudioManager] Exiting event mode with song %s", BGMArray[this.indexBGM].songName);
}
void Reset() {
this.stopBGM = true;
this.loops = 0;
this.indexBGM = 0;
this.timeSeconds = 0.0;
if (IsValidClient(this.Client)) for (int s = this.indexBGM; s < sizeof(BGMArray); s++) StopSound(this.Client, g_chanBGM, BGMArray[s].realPath);
AssLogger(LOGLVL_DEBUG, "AudioManager has been reset!");
}
void SetInEvent(bool inEvent){
this.EventMode = inEvent;
}
void Stop() {
this.bgmPlaying = false;
this.indexBGM = 0;
this.loops = 0;
this.stopBGM = true;
this.timeSeconds = 0.0;
this.shouldTick = false;
}
void TickBGM() {
if (!IsValidClient(this.Client)) {
this.Stop();
return;
}
if (this.EventMode) {
if (this.savedIndexBGM != g_indexBGM && this.VIPBGM <= 0) this.savedIndexBGM = g_indexBGM;
if (this.engineSecondsAdjusted() > this.savedTimeSeconds + this.savedLoopSeconds) {
this.savedTimeSeconds = GetEngineTime();
this.savedLoops++;
this.savedIntroSeconds = this.savedLoops >= 1 ? BGMArray[this.savedIndexBGM].introSeconds : 0.0;
this.savedLoopSeconds = BGMArray[this.savedIndexBGM].loopSeconds;
}
}
if (this.indexBGM == 0) this.indexBGM = g_indexBGM;
if (this.engineSecondsAdjusted() > this.timeSeconds + this.loopSeconds) {
PrintToServer("Playing %i for %N", this.indexBGM, this.Client);
this.timeSeconds = GetEngineTime();
this.loops++;
if (this.stopBGM) {
PrintToServer("Stopping %s", this.cachedPath);
StopSound(this.Client, g_chanBGM, this.cachedPath);
this.loops = 0;
}
this.stopBGM = false;
CSEClient(this.Client, BGMArray[this.indexBGM].realPath, BGMArray[this.indexBGM].SNDLVL, true, 1, 1.0, 100);
strcopy(this.songName, sizeof(this.songName), BGMArray[this.indexBGM].songName);
this.introSeconds = this.loops >= 1 ? BGMArray[this.indexBGM].introSeconds : 0.0;
this.loopSeconds = BGMArray[this.indexBGM].loopSeconds;
CreateTimer(1.0, SyncMusic, this.Client);
}
}
/**When a client joins the server, set this audio manager to theirs */
void OnClientConnected(int client) {
if (!IsValidClient(client) || IsFakeClient(client)) {
PrintToServer("Invalid client %N", client);
return;
}
this.Client = client;
this.clientIsFresh = true;
}
/**When a client respawns */
void OnClientRespawned() {
if (this.clientIsFresh && IsValidClient(this.Client)) {
if (soundPreference[this.Client] == 1 || soundPreference[this.Client] == 3) CPrintToChat(this.Client, "[AudioManager v%s] Welcome! We are listening to %s", FSE_VER, BGMArray[g_indexBGM].songName);
this.ChangeBGM(g_indexBGM, true);
this.clientIsFresh = false;
}
}
}
AUDIOMANAGER AudioManager[MAXPLAYERS+1];
enum struct AUDIOCONTROLLER {
bool shouldTick;
int VIPBGM;
int VIPIndex;
void init() {
AssLogger(LOGLVL_INFO, "Initializing Global Audio...");
g_chanBGM = 6;
for (int i = 1; i < MaxClients; ++i) {
AudioManager[i].bgmPlaying = false;
AudioManager[i].stopBGM = false;
AudioManager[i].shouldTick = false;
AudioManager[i].cachedPath = "null";
AudioManager[i].songName = "null";
AudioManager[i].indexBGM = 0;
AudioManager[i].loopSeconds = 0.0;
if (IsValidClient(i)) {
AudioManager[i].Client = i;
for (int x = 0; x < sizeof(BGMArray); ++x) StopSound(i, g_chanBGM, BGMArray[x].realPath);
}
}
g_indexBGM = GetRandomInt(1, 4);
this.VIPBGM = -1;
this.VIPIndex = -1;
this.UpdateBGM();
CreateTimer(1.0, EnableAudio);
}
void Reset() {
g_indexBGM = GetGameMode() < 2 ? GetRandomInt(1, 4) : 28;
for (int i = 0; i < MaxClients; ++i) AudioManager[i].Reset();
}
void setBGM(int bgm, bool instant){
g_indexBGM = bgm == 0 ? GetRandomInt(1,4) : bgm;
for (int i = 0; i < MaxClients; ++i) if(IsValidClient(i)) {
AudioManager[i].ChangeBGM(bgm, instant);
PrintToServer("Setting %N's BGM to %i", i, bgm);
}
}
void Stop() {
for (int i = 0; i < MaxClients; ++i) AudioManager[i].Stop();
}
void Tick() {
for (int i = 0; i < MaxClients; ++i) if (IsValidClient(i) && AudioManager[i].shouldTick) AudioManager[i].TickBGM();
}
/** Sets EVERYONE'S BGM in sync! Unless they're in an event... */
void UpdateBGM() {
for (int i = 0; i < MaxClients; ++i) {
if (IsValidClient(i)) {
if (AudioManager[i].isEventMode() || !IsValidClient(i)) {
PrintToServer("Client %N valid? %s Event Mode? %s", i, IsValidClient(i) ? "true" : "false", AudioManager[i].isEventMode() ? "true" : "false");
continue;
}
AudioManager[i].ChangeBGM(this.VIPBGM > 0 ? this.VIPBGM : AudioManager[i].indexBGM == 0 ? g_indexBGM : AudioManager[i].indexBGM, true);
AudioManager[i].shouldTick = true;
}
}
}
}
AUDIOCONTROLLER GlobalAudio;
public Action EnableAudio(Handle timer){
GlobalAudio.shouldTick = true;
return Plugin_Stop;
}
//Custom sound emitter, I don't know how many fucking times I've rewritten this! See potato.sp
//int flags:
// SND_NOFLAGS= 0, /**< Nothing */
// SND_CHANGEVOL = 1, /**< Change sound volume */
// SND_CHANGEPITCH = 2, /**< Change sound pitch */
// SND_STOP = 3, /**< Stop the sound */
// SND_SPAWNING = 4, /**< Used in some cases for ambients */
// SND_DELAY = 5, /**< Sound has an initial delay */
// SND_STOPLOOPING = 6, /**< Stop looping all sounds on the entity */
// SND_SPEAKER = 7, /**< Being played by a mic through a speaker */
// SND_SHOULDPAUSE = 8 /**< Pause if game is paused */
void CustomSoundEmitter(char[] sndName, int TSNDLVL, bool isBGM, int flags, float vol, int pitch) {
for (int i = 1; i <= MaxClients; i++) {
if (!IsValidClient(i)) continue;
if (isBGM && (soundPreference[i] == 1 || soundPreference[i] == 3) || !isBGM && soundPreference[i] >= 2) EmitSoundToClient(i, sndName, _, g_chanBGM, TSNDLVL, flags, vol, pitch, _, _, _, _, _);
}
}
//Play sound to client. Ripped straight from potato. Allows us to play sounds directly to people when they join.
void CSEClient(int client, char[] sndName, int TSNDLVL, bool isBGM, int flags, float vol, int pitch) {
if (!IsValidClient(client)) return;
if (isBGM && (soundPreference[client] == 1 || soundPreference[client] == 3) || !isBGM && soundPreference[client] >= 2) EmitSoundToClient(client, sndName, _, g_chanBGM, TSNDLVL, flags, vol, pitch, _, _, _, _, _);
}
//VIP Music Menu
public Action Command_Music(int client, int args) {
int steamID = GetSteamAccountID(client);
if (!steamID || steamID <= 10000) return Plugin_Handled;
else ShowFartsyMusicMenu(client);
return Plugin_Handled;
}
//VIP Music Menu
public void ShowFartsyMusicMenu(int client) {
Menu menu = new Menu(MenuHandlerFartsyMusic, MENU_ACTIONS_DEFAULT);
char buffer[100];
menu.SetTitle("Fartsy's Music Menu");
for (int i = 0; i < sizeof(BGMArray); i++) menu.AddItem(buffer, BGMArray[i].songName);
menu.Display(client, MENU_TIME_FOREVER);
menu.ExitButton = true;
}
//Set Fartsy Sound menu
public void FartsysSNDSelected(int client, MenuAction action, any info, char[] buffer, int maxlen) {
if (action == MenuAction_Select) ShowFartsyMenu(client);
}
// Get clients sound preferences then send them the menu
public Action Command_Sounds(int client, int args) {
int steamID = GetSteamAccountID(client);
if (!steamID || steamID <= 10000) return Plugin_Handled;
else {
char queryID[256];
Format(queryID, sizeof(queryID), "SELECT soundprefs from ass_activity WHERE steamid = '%d';", steamID);
Get_Ass_Database().Query(SQL_SNDPrefs, queryID, client);
ShowFartsyMenu(client);
PrintToChat(client, sndPrefs[soundPreference[client]]);
return Plugin_Handled;
}
}
//Send client sound menu
public void ShowFartsyMenu(int client) {
Menu menu = new Menu(MenuHandlerFartsy, MENU_ACTIONS_DEFAULT);
char buffer[100];
menu.SetTitle("Fartsy's Sound Menu");
menu.AddItem(buffer, "Disable ALL");
menu.AddItem(buffer, "Music Only");
menu.AddItem(buffer, "Sound Effects Only");
menu.AddItem(buffer, "Enable ALL");
menu.Display(client, 20);
menu.ExitButton = true;
}
// Handle client choices for sound preference
public int MenuHandlerFartsy(Menu menu, MenuAction action, int param1, int param2) {
if (action == MenuAction_Select) {
char query[256];
int steamID = GetSteamAccountID(param1);
if (!Get_Ass_Database() || !steamID) return 0;
else {
Format(query, sizeof(query), "UPDATE ass_activity SET soundprefs = '%i' WHERE steamid = '%d';", param2, steamID);
Get_Ass_Database().Query(Database_FastQuery, query);
soundPreference[param1] = param2;
Command_Sounds(param1, 0);
}
} else if (action == MenuAction_End) CloseHandle(menu);
return 0;
}
//Light Entities
bool g_PowerOutage;
enum struct MAPLIGHTING {
bool hasCustomPattern;
bool isBroken;
char arcs[32];
char beam[32];
char buzz[32];
char explosion[35];
char light[32];
char status[32];
char stun[32];
char zap[32];
void Explode(){
if(this.isBroken) return;
this.isBroken = true;
FastFire2(this.arcs, "StartSpark", "", 0.0, false);
FastFire2(this.arcs, "StartSpark", "", 0.1, false);
FastFire2(this.beam, "LightOff", "", 0.0, false);
FastFire2(this.buzz, "PlaySound", "", 0.0, false);
FastFire2(this.explosion, "Explode", "", 0.0, false);
FastFire2(this.light, "TurnOff", "", 0.0, false);
FastFire2(this.status, "Color", "255 0 0", 0.0, false);
FastFire2(this.stun, "Enable", "", 0.0, false);
FastFire2(this.zap, "Enable", "", 0.0, false);
}
void Repair(){
this.isBroken = false;
FastFire2(this.arcs, "StopSpark", "", 0.0, false);
FastFire2(this.buzz, "StopSound", "", 0.25, false);
FastFire2(this.status, "Color", "0 255 0", 0.0, false);
FastFire2(this.stun, "Disable", "", 0.0, false);
FastFire2(this.zap, "Disable", "", 0.0, false);
if(!g_PowerOutage) {
FastFire2(this.light, "SetPattern", "", 0.0, false);
FastFire2(this.light, "TurnOff", "", 0.0, false);
FastFire2(this.light, "TurnOn", "", 0.1, false);
FastFire2(this.light, "SetPattern", "", 0.1, false);
FastFire2(this.beam, "LightOff", "", 0.1, false);
FastFire2(this.beam, "LightOn", "", 0.2, false);
}
}
void RestorePower(){
if(!this.isBroken || strcmp(this.light, "MapLighting.StreetLamp0C.light") == 0){
FastFire2(this.light, "TurnOn", "", 0.0, false);
FastFire2(this.beam, "LightOn", "", 0.0, false);
FastFire2(this.beam, "LightOn", "", 1.0, false);
FastFire2(this.beam, "LightOn", "", 3.0, false);
FastFire2(this.light, "SetPattern", "", 0.0, false);
this.hasCustomPattern = false;
}
}
}
MAPLIGHTING MapLighting[15];
//Weather Manager
BULKFIRE lightningStrike[16];
BULKFIRE lightningFlash[17];
enum struct WEATHERMANAGER {
bool canTornado;
bool hasTornado;
bool powerSurging;
bool reset;
bool sirenExplode;
bool sirenExploded;
bool tickWeather;
bool TornadoTimerActive;
bool TornadoWarning;
char defFogStartDist[5];
char defFogEndDist[5];
char defRainDensity;
char rainDensity;
float fogDensity;
float defFogDensity;
float fogTarget;
float fogChangeRate;
float fogChangeRateRGB;
float sirenPitch;
float sirenPitchRate;
float sirenPitchTarget;
float fogColorR;
float fogColorG;
float fogColorB;
float fogColorRTarget;
float fogColorGTarget;
float fogColorBTarget;
int intensity;
int mIntensity;
void Activate(){
this.Reset();
sudo(1001); //Stop any BGM
this.tickWeather = true;
if (GetGameMode() != 2) this.PerformRandomWeather(); //Start weather system ONLY IF NOT IN GAMEMODE 2.
}
void doLightning(){
sudo(1003);
FastFire2(lightningStrike[GetRandomInt(0, sizeof(lightningStrike)-1)].fireStr, "", "", 0.0, true);
FastFire2("Weather.LightningHurt*", "Disable", "", 0.07, false);
CustomSoundEmitter(SFXArray[GetRandomInt(27, 34)].realPath, 65, false, 0, 1.0, 100);
//Affect lights
int i = GetRandomInt(this.intensity, 15);
AssLogger(LOGLVL_DEBUG, "Doing light interactions with %i", i);
switch(i){
case 2,3,5:{
int index = GetRandomInt(0, 12);
float f = GetRandomFloat(0.5, 3.0);
FastFire2(MapLighting[index].light, "TurnOff", "", 0.0, false);
FastFire2(MapLighting[index].beam, "LightOff", "", 0.0, false);
FastFire2(MapLighting[index].light, "TurnOn", "", f, false);
FastFire2(MapLighting[index].beam, "LightOn", "", f, false);
}
case 11,15:{
g_PowerOutage = true;
if(!this.hasTornado) CreateTimer(GetRandomFloat(5.0, 30.0), RestorePower, GetRandomInt(0, 3));
FastFire2("MapLighting.*", "LightOff", "", 0.0, false);
FastFire2("MapLighting.*", "TurnOff", "", 0.0, false);
FastFire2("MapLighting.*", "LightOff", "", 1.0, false);
FastFire2("MapLighting.*", "LightOff", "", 2.0, false);
FastFire2("MapLighting.*", "LightOff", "", 3.0, false);
FastFire2("MapLighting.*", "LightOff", "", 4.0, false);
FastFire2("MapLighting.*", "LightOff", "", 5.0, false);
}
}
}
void Dissipate(){
this.sirenPitchTarget = 0.0;
this.sirenPitchRate = 0.25;
this.fogTarget = this.defFogDensity;
g_PowerOutage = false;
this.hasTornado = false;
if(GetCoreData().isWave){
this.mIntensity = 5;
this.intensity = 7;
} else {
this.mIntensity = 0;
this.intensity = 0;
}
if (this.sirenExploded) {
this.sirenPitch = 0.0;
this.sirenExploded = false;
}
this.TornadoWarning = false;
CreateTimer(GetRandomFloat(45.0, 135.0), ResetTornado);
for (int i = 0; i < sizeof(MapLighting); i++) if (!MapLighting[i].isBroken) FastFire2(MapLighting[i].light, "TurnOn", "", 0.0, false);
FastFire2("Weather.FogOutdoor", "SetStartDistLerp", this.defFogStartDist, 0.0, false);
FastFire2("Weather.FogOutdoor", "SetEndDistLerp", this.defFogEndDist, 0.0, false);
FastFire2("Weather.FogOutdoor", "StartFogTransition", "", 0.0, false);
FastFire2("tornadof1", "Stop", "", 0.0, false);
FastFire2("TornadoKill", "Disable", "", 0.0, false);
FastFire2("tornadof1wind", "Disable", "", 0.0, false);
FastFire2("tornadowindf1", "StopSound", "", 0.0, false);
FastFire2("shaketriggerf1", "Disable", "", 0.0, false);
FastFire2("tornadobutton", "Unlock", "", 30.0, false);
FastFire2("FB.FakeTankTank01", "Kill", "", 0.0, false);
FastFire2("FB.FakeTankPhys01", "Kill", "", 0.0, false);
FastFire2("Weather.EASScreen", "Disable", "", 0.0, false);
FastFire2("Weather.Siren.ExplodeParticle", "Stop", "", 0.0, false);
FastFire2("Weather.Siren", "StopSound", "", 5.0, false);
}
void FormTornado(){
this.hasTornado = true;
this.mIntensity = 15;
this.intensity = 15;
CreateTimer(1.5, TornadoShaker);
FastFire2("TornadoKill", "Enable", "", 0.0, false);
FastFire2("tornadobutton", "Lock", "", 0.0, false);
FastFire2("tornadof1", "Start", "", 20.0, false);
FastFire2("shaketriggerf1", "Enable", "", 20.0, false);
FastFire2("tornadowindf1", "PlaySound", "", 20.0, false);
FastFire2("tornadof1wind", "Enable", "", 21.50, false);
float f = GetRandomFloat(60.0, 120.0);
CreateTimer(f, TimedOperator, 42);
}
void IssueTornadoWarning(){
this.TornadoWarning = true;
this.sirenPitchTarget = 100.0;
this.sirenPitchRate = 0.1;
FastFire2("Weather.EASScreen", "Enable", "", 0.0, false);
FastFire2("Weather.EAS", "PlaySound", "", 0.0, false);
CreateTimer(GetRandomFloat(1.0, 3.0), ModulateSiren);
}
void PerformRandomWeather(){
if (!this.tickWeather) return;
AssLogger(LOGLVL_DEBUG, "[Fartsy's Enhancer] Storm Intensity @ %f% (%i)", (this.intensity / 15.0), this.intensity);
this.doLightning();
float flStormMin;
float flStormMax;
switch(GetRandomInt(this.mIntensity, this.intensity)){
case 0:{
this.SetFogStartQueued("500");
this.SetFogEndQueued("3000");
this.StartFogTransition();
flStormMin = 15.0;
flStormMax = 35.0;
this.fogTarget = 0.55;
FastFire2("rain", "Alpha", "15", 0.0, false);
CustomSoundEmitter(SFXArray[108].realPath, 65, false, 1, 0.1, 100); //Rain, no wind, reduced volume
}
case 1:{
this.SetFogStartQueued("500");
this.SetFogEndQueued("2700");
this.StartFogTransition();
flStormMin = 12.0;
flStormMax = 32.0;
this.fogTarget = 0.60;
FastFire2("rain", "Alpha", "30", 0.0, false);
CustomSoundEmitter(SFXArray[108].realPath, 65, false, 1, 0.1, 100); //Rain, no wind, reduced volume
}
case 2:{
this.SetFogStartQueued("500");
this.SetFogEndQueued("2500");
this.StartFogTransition();
this.mIntensity = 1;
flStormMin = 12.0;
flStormMax = 30.0;
FastFire2("rain", "Alpha", "50", 0.0, false);
CustomSoundEmitter(SFXArray[108].realPath, 65, false, 1, 0.1, 100); //Rain, no wind, increased volume
}
case 3:{
this.SetFogStartQueued("500");
this.SetFogEndQueued("2500");
this.StartFogTransition();
flStormMin = 10.0;
flStormMax = 28.5;
this.fogTarget = 0.70;
FastFire2("rain", "Alpha", "65", 0.0, false);
CustomSoundEmitter(SFXArray[108].realPath, 65, false, 1, 0.1, 100); //Rain, no wind, increased volume
}
case 4:{
flStormMin = 9.0;
flStormMax = 26.5;
FastFire2("rain", "Alpha", "75", 0.0, false);
CustomSoundEmitter(SFXArray[108].realPath, 65, false, 1, 1.0, 100); //Rain, no wind, increased volume
CustomSoundEmitter(SFXArray[107].realPath, 65, false, 1, 0.1, 100); //Rain, wind, decreased volume
CustomSoundEmitter(SFXArray[109].realPath, 65, false, 1, 0.01, 100); //Extra wind
}
case 5:{
this.SetFogStartQueued("500");
this.SetFogEndQueued("2100");
this.StartFogTransition();
this.mIntensity = 3;
flStormMin = 7.0;
flStormMax = 25.0;
this.fogTarget = 0.75;
FastFire2("rain", "Alpha", "95", 0.0, false);
CustomSoundEmitter(SFXArray[108].realPath, 65, false, 1, 0.1, 100); //Rain, no wind, decreased volume
CustomSoundEmitter(SFXArray[107].realPath, 65, false, 1, 0.15, 100); //Rain, wind
CustomSoundEmitter(SFXArray[109].realPath, 65, false, 1, 0.05, 100); //Extra wind
}
case 6:{
this.mIntensity = 4;
flStormMin = 7.0;
flStormMax = 23.5;
FastFire2("rain", "Alpha", "125", 0.0, false);
CustomSoundEmitter(SFXArray[108].realPath, 65, false, 1, 0.05, 100); //Rain, no wind, decreased volume
CustomSoundEmitter(SFXArray[107].realPath, 65, false, 1, 0.21, 100); //Rain, wind, increased volume
CustomSoundEmitter(SFXArray[109].realPath, 65, false, 1, 0.125, 100); //Extra wind
}
case 7:{
this.SetFogStartQueued("500");
this.SetFogEndQueued("2000");
this.StartFogTransition();
flStormMin = 6.0;
flStormMax = 21.0;
this.fogTarget = 0.80;
FastFire2("rain", "Alpha", "155", 0.0, false);
CreateTimer(GetRandomFloat(0.1, 1.25), GetRandomWind, 0);
CustomSoundEmitter(SFXArray[108].realPath, 65, false, 1, 0.05, 100); //Rain, no wind, decreased volume
CustomSoundEmitter(SFXArray[107].realPath, 65, false, 1, 0.26, 100); //Rain, wind, increased volume
CustomSoundEmitter(SFXArray[109].realPath, 65, false, 1, 0.25, 100); //Extra wind
}
case 8:{
this.mIntensity = 6;
this.SetFogStartQueued("470");
this.SetFogEndQueued("2000");
this.StartFogTransition();
flStormMin = 5.0;
flStormMax = 20.0;
this.fogTarget = 0.875;
FastFire2("rain", "Alpha", "175", 0.0, false);
CreateTimer(GetRandomFloat(0.1, 1.25), GetRandomWind, 1);
CustomSoundEmitter(SFXArray[107].realPath, 65, false, 1, 0.37, 100); //Rain, wind, increased volume
CustomSoundEmitter(SFXArray[109].realPath, 65, false, 1, 0.35, 100); //Extra wind
}
case 9:{
this.SetFogStartQueued("425");
this.SetFogEndQueued("1500");
this.StartFogTransition();
this.mIntensity = 7;
flStormMin = 5.0;
flStormMax = 19.0;
FastFire2("rain", "Alpha", "200", 0.0, false);
CreateTimer(GetRandomFloat(0.1, 1.25), GetRandomWind, 2);
CustomSoundEmitter(SFXArray[107].realPath, 65, false, 1, 0.41, 100); //Rain, wind, increased volume
CustomSoundEmitter(SFXArray[109].realPath, 65, false, 1, 0.42, 100); //Extra wind
}
case 10:{
this.SetFogStartQueued("375");
this.SetFogEndQueued("1500");
this.StartFogTransition();
flStormMin = 5.0;
flStormMax = 18.0;
this.fogTarget = 0.925;
FastFire2("rain", "Alpha", "215", 0.0, false);
CreateTimer(GetRandomFloat(0.1, 1.25), GetRandomWind, 3);
CustomSoundEmitter(SFXArray[107].realPath, 65, false, 1, 0.45, 100); //Rain, wind, increased volume
CustomSoundEmitter(SFXArray[109].realPath, 65, false, 1, 0.56, 100); //Extra wind
}
case 11:{
this.mIntensity = 9;
flStormMin = 5.0;
flStormMax = 17.0;
FastFire2("rain", "Alpha", "235", 0.0, false);
CreateTimer(GetRandomFloat(0.1, 1.25), GetRandomWind, 4);
CustomSoundEmitter(SFXArray[107].realPath, 65, false, 1, 0.63, 100); //Rain, wind, increased volume
CustomSoundEmitter(SFXArray[109].realPath, 65, false, 1, 0.69, 100); //Extra wind
}
case 12:{
this.mIntensity = 10;
flStormMin = 5.0;
flStormMax = 15.0;
this.fogTarget = 1.0;
this.SetFogStartQueued("225");
this.SetFogEndQueued("700");
this.StartFogTransition();
FastFire2("rain", "Alpha", "255", 0.0, false);
CreateTimer(GetRandomFloat(0.1, 1.25), GetRandomWind, 5);
CustomSoundEmitter(SFXArray[107].realPath, 65, false, 1, 0.72, 100); //Rain, wind, increased volume
CustomSoundEmitter(SFXArray[109].realPath, 65, false, 1, 0.76, 100); //Extra wind
if (!this.TornadoTimerActive) sudo(1004);
}
case 13:{
this.SetFogStartQueued("200");
this.SetFogEndQueued("700");
this.StartFogTransition();
this.mIntensity = 12;
flStormMin = 5.0;
flStormMax = 14.0;
this.fogTarget = 1.0;
FastFire2("rain", "Alpha", "255", 0.0, false);
CreateTimer(GetRandomFloat(0.1, 1.25), GetRandomWind, 6);
CustomSoundEmitter(SFXArray[107].realPath, 65, false, 1, 0.85, 100); //Rain, wind, increased volume
CustomSoundEmitter(SFXArray[109].realPath, 65, false, 1, 0.83, 100); //Extra wind
if (!this.TornadoTimerActive) sudo(1004);
}
case 14:{
this.mIntensity = 13;
this.SetFogStartQueued("100");
this.SetFogEndQueued("700");
this.StartFogTransition();
flStormMin = 5.0;
flStormMax = 13.0;
this.fogTarget = 1.0;
FastFire2("rain", "Alpha", "255", 0.0, false);
CreateTimer(GetRandomFloat(0.1, 1.25), GetRandomWind, 7);
CustomSoundEmitter(SFXArray[107].realPath, 65, false, 1, 0.9, 100); //Rain, wind, increased volume
CustomSoundEmitter(SFXArray[109].realPath, 65, false, 1, 0.92, 100); //Extra wind
if (!this.TornadoTimerActive) sudo(1004);
}
case 15:{
this.mIntensity = 14;
this.SetFogStartQueued("50");
this.SetFogEndQueued("500");
this.StartFogTransition();
flStormMin = 5.0;
flStormMax = 12.0;
this.fogTarget = 1.0;
FastFire2("rain", "Alpha", "255", 0.0, false);
CreateTimer(GetRandomFloat(0.1, 1.25), GetRandomWind, 7);
CustomSoundEmitter(SFXArray[107].realPath, 65, false, 1, 1.0, 100); //Rain, wind, increased volume
CustomSoundEmitter(SFXArray[109].realPath, 65, false, 1, 1.0, 100); //Extra wind
if (!this.TornadoTimerActive) sudo(1004);
}
default:{
}
}
CreateTimer(GetRandomFloat(flStormMin, flStormMax), GetRandomWeather);
}
void Reset(){
AssLogger(LOGLVL_DEBUG, "[Fartsy's Enhancer] WeatherManager has been reset!");
this.fogDensity = 0.50;
this.fogColorRTarget = 35.0;
this.fogColorGTarget = 55.0;
this.fogColorBTarget = 55.0;
this.Dissipate();
this.reset = true;
this.tickWeather = false;
FastFire2("rain", "Alpha", "0", 0.0, false);
FastFire2("Weather.Sky", "Enable", "", 0.0, false);
FastFire2("Weather.Sky", "Skin", "0", 0.0, false);
FastFire2("Weather.FogSky", "Enable", "", 2.0, false);
for (int i = 0; i < sizeof(MapLighting); i++) MapLighting[i].Repair();
}
void SetFogStartQueued(const char[] fsq){
FastFire2("Weather.FogOutdoor", "SetStartDistLerpTo", fsq, 0.0, false);
}
void SetFogEndQueued(const char[] feq){
FastFire2("Weather.FogOutdoor", "SetEndDistLerpTo", feq, 0.0, false);
}
void StartFogTransition(){
FastFire2("Weather.FogOutdoor", "StartFogTransition", "", 0.0, false);
}
void TickFog(){
if(this.fogDensity != this.fogTarget || this.reset){
char targetAlpha[4];
char targetDensity[24];
this.fogDensity = (this.fogDensity < this.fogTarget) ? FloatMin(this.fogDensity+=this.fogChangeRate, this.fogTarget) : FloatMax(this.fogDensity-=this.fogChangeRate, this.fogTarget);
IntToString(RoundFloat(FloatMin(255.0 * (this.fogDensity * 1.20), 255.0)), targetAlpha, sizeof(targetAlpha));
FloatToString(this.fogDensity, targetDensity, sizeof(targetDensity));
FastFire2("Weather.FogOutdoor", "SetMaxDensity", targetDensity, 0.0, false);
FastFire2("Weather.FogSky", "Alpha", targetAlpha, 0.0, false);
}
if(this.fogColorR != this.fogColorRTarget || this.fogColorG != this.fogColorGTarget || this.fogColorB != this.fogColorBTarget || this.reset){
char target[24];
this.fogColorR = (this.fogColorR < this.fogColorRTarget) ? FloatMin(this.fogColorR+=this.fogChangeRateRGB, this.fogColorRTarget) : FloatMax(this.fogColorR-=this.fogChangeRateRGB, this.fogColorRTarget);
this.fogColorG = (this.fogColorG < this.fogColorGTarget) ? FloatMin(this.fogColorG+=this.fogChangeRateRGB, this.fogColorGTarget) : FloatMax(this.fogColorG-=this.fogChangeRateRGB, this.fogColorGTarget);
this.fogColorB = (this.fogColorB < this.fogColorBTarget) ? FloatMin(this.fogColorB+=this.fogChangeRateRGB, this.fogColorBTarget) : FloatMax(this.fogColorB-=this.fogChangeRateRGB, this.fogColorBTarget);
Format(target, sizeof(target), "%i %i %i", RoundFloat(this.fogColorR), RoundFloat(this.fogColorG), RoundFloat(this.fogColorB));
FastFire2("Weather.FogIndoor", "SetColor", target, 0.0, false);
FastFire2("Weather.FogIndoor", "SetColorSecondary", target, 0.0, false);
FastFire2("Weather.FogOutdoor", "SetColor", target, 0.0, false);
FastFire2("Weather.FogOutdoor", "SetColorSecondary", target, 0.0, false);
FastFire2("Weather.FogSky", "Color", target, 0.0, false);
this.reset = false;
}
}
void TickSiren(){
if(this.TornadoWarning){
if(!this.sirenExploded && (this.sirenPitch > 165.0)){
FastFire2("Weather.Siren", "Pitch", "50", 0.0, false);
FastFire2("Weather.Siren", "Pitch", "40", 0.1, false);
FastFire2("Weather.Siren", "Pitch", "30", 0.2, false);
FastFire2("Weather.Siren", "Pitch", "20", 0.3, false);
FastFire2("Weather.Siren", "Pitch", "10", 0.4, false);
FastFire2("Weather.Siren", "Pitch", "0", 0.5, false);
FastFire2("Weather.Siren.ExplodeParticle", "Start", "", 0.0, false);
FastFire2("Weather.Siren.ExplodeSND", "PlaySound", "", 0.0, false);
FastFire2("Weather.Siren", "StopSound", "", 5.0, false);
FastFire2("Weather.Siren.ExplodeParticle", "Stop", "", 5.0, false);
FastFire2("Weather.Siren.ExplodeParticle", "Start", "", 5.1, false);
this.sirenExploded = true;
}
if(this.sirenPitch != this.sirenPitchTarget && !this.sirenExploded){
char targetPitch[24];
this.sirenPitch = (this.sirenPitch < this.sirenPitchTarget) ? FloatMin(this.sirenPitch+=this.sirenPitchRate, this.sirenPitchTarget) : FloatMax(this.sirenPitch-=this.sirenPitchRate, this.sirenPitchTarget);
FloatToString(this.sirenPitch, targetPitch, sizeof(targetPitch));
FastFire2("Weather.Siren", "Pitch", targetPitch, 0.0, false);
PrintToServer("SirenPitch = %s", targetPitch);
}
}
}
}
WEATHERMANAGER WeatherManager;
//Ghosties
enum struct GHOSTHANDLER {
bool placeholder;
void SpawnRandom(){
switch(GetRandomInt(0,3)){
case 0:{
FastFire2("gTrain", "TeleportToPathTrack", "gPath00_0", 0.0, false);
}
case 1:{
FastFire2("gTrain", "TeleportToPathTrack", "gPath01_0", 0.0, false);
}
case 2:{
FastFire2("gTrain", "TeleportToPathTrack", "gPath02_0", 0.0, false);
}
case 3:{
FastFire2("gTrain", "TeleportToPathTrack", "gPath03_0", 0.0, false);
}
}
}
}
GHOSTHANDLER GhostHandler;
//Timers
public Action GetRandomWeather(Handle timer){
if(WeatherManager.tickWeather){
switch(GetRandomInt (0, 10)){
case 0,4,8:{
if(WeatherManager.intensity > 9) GhostHandler.SpawnRandom();
if (WeatherManager.intensity > 0 && (WeatherManager.intensity-1 > WeatherManager.mIntensity)) WeatherManager.intensity--;
}
case 1,2,3,5,6,7,9,10:{
if (WeatherManager.intensity < 15) WeatherManager.intensity++;
}
}
WeatherManager.PerformRandomWeather();
}
return Plugin_Stop;
}
public Action GetRandomWind(Handle timer, int intensity){
switch(intensity){
case 0:{
CustomSoundEmitter(SFXArray[GetRandomInt(113, 114)].realPath, 65, true, 1, 0.125, 100);
}
case 1:{
CustomSoundEmitter(SFXArray[GetRandomInt(113, 114)].realPath, 65, true, 1, 0.20, 100);
}
case 2:{
CustomSoundEmitter(SFXArray[GetRandomInt(113, 114)].realPath, 65, true, 1, 0.30, 100);
}
case 3:{
CustomSoundEmitter(SFXArray[GetRandomInt(113, 115)].realPath, 65, true, 1, 0.45, 100);
}
case 4:{
CustomSoundEmitter(SFXArray[GetRandomInt(113, 115)].realPath, 65, true, 1, 0.55, 100);
}
case 5:{
CustomSoundEmitter(SFXArray[GetRandomInt(113, 115)].realPath, 65, true, 1, 0.65, 100);
}
case 6:{
CustomSoundEmitter(SFXArray[GetRandomInt(113, 116)].realPath, 65, true, 1, 0.80, 100);
}
case 7:{
CustomSoundEmitter(SFXArray[GetRandomInt(113, 116)].realPath, 65, true, 1, 1.0, 100);
}
}
return Plugin_Stop;
}
public Action ModulateSiren(Handle timer){
if(WeatherManager.TornadoWarning && !WeatherManager.sirenExplode){
WeatherManager.sirenPitchTarget = WeatherManager.powerSurging ? GetRandomFloat(95.0, 210.0) : GetRandomFloat(85.0, 125.0);
WeatherManager.sirenPitchRate = WeatherManager.powerSurging ? GetRandomFloat(0.0525, 0.20) : GetRandomFloat(0.01, 0.125);
CreateTimer(GetRandomFloat(1.0, 3.0), ModulateSiren);
}
return Plugin_Stop;
}
public Action ResetTornado(Handle timer){
WeatherManager.canTornado = true;
WeatherManager.TornadoTimerActive = false;
return Plugin_Stop;
}
public Action RestorePower(Handle timer, int surge){
g_PowerOutage = false;
WeatherManager.powerSurging = ((surge == 1) ? true : false);
if (surge == 1){
CreateTimer(1.0, SurgePower);
}
for (int i = 0; i < sizeof(MapLighting); i++) MapLighting[i].RestorePower();
FastFire2("MapLighting.Indoor*", "TurnOn", "", 0.0, false);
FastFire2("MapLighting.Indoor*", "LightOn", "", 0.0, false);
return Plugin_Stop;
}
char LightingPatterns[][25] = {
/////Allistor/////
"sduehrjkihwerte",
"ihqopeiruhiqwer",
"sadnpiudghsfiod",
"kjahbfihkabweoi",
"djfohoaeiufgawt",
"ewrtyvghbvfczfr",
"aesrergtafdcgvz",
"aeradyjdghnyjxc",
"oihaecpnefijanle",
"oaihbewrpoijnae",
//////Jeffy///////
"gewsaadgfhgtfsr",
"kuyijyterytdfsadfvgzs",
"bvcxfgtertyaetr",
"gyukkjtyasde",
"bxcvmvbnhkgfj",
"ewrhrtmhgjf",
"bfgmghntjy",
"afsdgdsfayrwte",
"hfgjgfdiyet",
"fsdbvxfgkytestry"
};
public Action SurgePower(Handle timer){
if (WeatherManager.powerSurging){
int target = GetRandomInt(0, 12);
if (MapLighting[target].isBroken) target = GetRandomInt(0, 12);
if(!MapLighting[target].isBroken){
if (GetRandomInt(0, 7) == 5) MapLighting[target].Explode();
FastFire2(MapLighting[target].light, "SetPattern", LightingPatterns[GetRandomInt(0, 19)], 0.0, false);
FastFire2(MapLighting[target].light, "TurnOn", "", 0.0, false);
FastFire2(MapLighting[target].beam, "LightOn", "", 0.0, false);
CreateTimer(GetRandomFloat(7.5, 15.0), RestorePower, 0);
CreateTimer(GetRandomFloat(0.1, 3.0), SurgePower);
CreateTimer(GetRandomFloat(1.5, 2.0), SurgePowerFX);
}
}
return Plugin_Stop;
}
public Action SurgePowerFX(Handle timer){
for (int i = 0; i < sizeof(MapLighting); i++){
if(WeatherManager.powerSurging && !MapLighting[i].isBroken){
FastFire2(MapLighting[i].light, "SetPattern", LightingPatterns[GetRandomInt(0, 19)], 0.0, false);
FastFire2(MapLighting[i].beam, "LightOff", "", 0.0, false);
FastFire2(MapLighting[i].beam, "LightOn", "", GetRandomFloat(0.1, 0.35), false);
FastFire2(MapLighting[i].beam, "LightOff", "", GetRandomFloat(0.4, 0.75), false);
FastFire2(MapLighting[i].beam, "LightOn", "", GetRandomFloat(1.0, 1.35), false);
}
}
return Plugin_Stop;
}
public Action TornadoShaker(Handle timer){
if(WeatherManager.hasTornado){
FastFire2("tornadoshake_f1", "StartShake", "", 0.0, false);
CreateTimer(1.5, TornadoShaker);
}
return Plugin_Stop;
}