330 lines
8.7 KiB
SourcePawn
330 lines
8.7 KiB
SourcePawn
/*
|
|
* ============================================================================
|
|
*
|
|
* Zombie:Reloaded
|
|
*
|
|
* File: visualeffects.inc
|
|
* Description: Visual effects such as map darkening, fog, etc..
|
|
*
|
|
* ============================================================================
|
|
*/
|
|
|
|
/**
|
|
* Handle of cvar "sv_skyname."
|
|
*/
|
|
new Handle:g_hSkyname = INVALID_HANDLE;
|
|
|
|
/**
|
|
* Default sky of current map.
|
|
*/
|
|
new String:g_VEffectsDefaultSky[PLATFORM_MAX_PATH];
|
|
|
|
/**
|
|
* Get cvar data and downloadable content to add to download table.
|
|
*/
|
|
VEffectsLoad()
|
|
{
|
|
// Get sv_skyname's convar handle, if invalid, log error, then stop.
|
|
g_hSkyname = FindConVar("sv_skyname");
|
|
if (g_hSkyname == INVALID_HANDLE)
|
|
{
|
|
// TODO LOG.
|
|
|
|
return;
|
|
}
|
|
|
|
// Store map's default sky before applying new one.
|
|
GetConVarString(g_hSkyname, g_VEffectsDefaultSky, sizeof(g_VEffectsDefaultSky));
|
|
|
|
// If sky path is empty, then stop.
|
|
if (!g_VEffectsDefaultSky[0])
|
|
{
|
|
return;
|
|
}
|
|
|
|
decl String:downloadpath[PLATFORM_MAX_PATH];
|
|
|
|
// Prepend materials/skybox to the path.
|
|
Format(downloadpath, sizeof(downloadpath), "materials/skybox/%s", g_VEffectsDefaultSky);
|
|
|
|
// Add skybox file to downloads table.
|
|
AddFileToDownloadsTable(downloadpath);
|
|
}
|
|
|
|
/**
|
|
* The round is starting.
|
|
*/
|
|
VEffectsOnRoundStart()
|
|
{
|
|
// If lightstyle is disabled, then disable.
|
|
new bool:lightstyle = GetConVarBool(g_hCvarsList[CVAR_VEFFECTS_LIGHTSTYLE]);
|
|
|
|
// Apply light style.
|
|
VEffectsApplyLightStyle(!lightstyle);
|
|
|
|
// If sky is disabled, then disable.
|
|
new bool:sky = GetConVarBool(g_hCvarsList[CVAR_VEFFECTS_SKY]);
|
|
|
|
// Apply new sky.
|
|
VEffectsApplySky(!sky);
|
|
|
|
// If fog is disabled, then disable.
|
|
new bool:fogoverride = GetConVarBool(g_hCvarsList[CVAR_VEFFECTS_FOG_OVERRIDE]);
|
|
|
|
// Apply fog.
|
|
VEffectsApplyFog(fogoverride);
|
|
}
|
|
|
|
VEffectsApplyLightStyle(bool:disable = false)
|
|
{
|
|
// If default, then set to normal light style.
|
|
if (disable)
|
|
{
|
|
// Set light style.
|
|
SetLightStyle(0, "n");
|
|
|
|
return;
|
|
}
|
|
|
|
// Get light value.
|
|
decl String:lightstylevalue[4];
|
|
GetConVarString(g_hCvarsList[CVAR_VEFFECTS_LIGHTSTYLE_VALUE], lightstylevalue, sizeof(lightstylevalue));
|
|
|
|
// Set light style.
|
|
SetLightStyle(0, lightstylevalue);
|
|
}
|
|
|
|
VEffectsApplySky(bool:disable = false)
|
|
{
|
|
// If default, then set to default sky.
|
|
if (disable)
|
|
{
|
|
// Set new sky on all clients.
|
|
SetConVarString(g_hSkyname, g_VEffectsDefaultSky, true);
|
|
|
|
return;
|
|
}
|
|
|
|
// Get sky path.
|
|
decl String:skypath[PLATFORM_MAX_PATH];
|
|
GetConVarString(g_hCvarsList[CVAR_VEFFECTS_SKY_PATH], skypath, sizeof(skypath));
|
|
|
|
// Set new sky on all clients.
|
|
SetConVarString(g_hSkyname, skypath, true);
|
|
}
|
|
|
|
VEffectsApplyFog(bool:override = false)
|
|
{
|
|
// Find current fog index
|
|
new fogindex = FindEntityByClassname(-1, "env_fog_controller");
|
|
|
|
// If override is enabled, then continue.
|
|
if (override)
|
|
{
|
|
// If there is fog, then continue.
|
|
if (fogindex != -1)
|
|
{
|
|
// Delete fog.
|
|
RemoveEdict(fogindex);
|
|
}
|
|
}
|
|
|
|
// If fog is disabled, then stop.
|
|
new bool:fog = GetConVarBool(g_hCvarsList[CVAR_VEFFECTS_FOG]);
|
|
if (!fog)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// If there is no fog on the map, create new fog.
|
|
if (fogindex == -1)
|
|
{
|
|
// Create and spawn fog.
|
|
fogindex = CreateEntityByName("env_fog_controller");
|
|
DispatchSpawn(fogindex);
|
|
}
|
|
|
|
decl String:fogcolor[16];
|
|
|
|
// Set primary fog color.
|
|
GetConVarString(g_hCvarsList[CVAR_VEFFECTS_FOG_PCOLOR], fogcolor, sizeof(fogcolor));
|
|
VEffectsSetFogColor(fogindex, fogcolor, true);
|
|
|
|
// Set secondary fog color.
|
|
GetConVarString(g_hCvarsList[CVAR_VEFFECTS_FOG_SCOLOR], fogcolor, sizeof(fogcolor));
|
|
VEffectsSetFogColor(fogindex, fogcolor, false);
|
|
|
|
// Set fog's density.
|
|
new Float:fogdensity = GetConVarFloat(g_hCvarsList[CVAR_VEFFECTS_FOG_DENSITY]);
|
|
VEffectsSetFogDensity(fogindex, fogdensity);
|
|
|
|
// Set fog's start distance.
|
|
new fogstart = GetConVarInt(g_hCvarsList[CVAR_VEFFECTS_FOG_STARTDIST]);
|
|
VEffectsSetFogStartDist(fogindex, fogstart);
|
|
|
|
// Set fog's end distance.
|
|
new fogend = GetConVarInt(g_hCvarsList[CVAR_VEFFECTS_FOG_ENDDIST]);
|
|
VEffectsSetFogEndDist(fogindex, fogend);
|
|
|
|
// Set fog's far z distance.
|
|
new fogfarz = GetConVarInt(g_hCvarsList[CVAR_VEFFECTS_FOG_FARZ]);
|
|
VEffectsSetFogFarZ(fogindex, fogfarz);
|
|
}
|
|
|
|
/**
|
|
* Set fog's primary or secondary color.
|
|
*
|
|
* @param fogindex Edict index of the fog to modify.
|
|
* @param color The rgb color of the fog.
|
|
* @param primary (Optional) True to set primary, false otherwise.
|
|
*/
|
|
VEffectsSetFogColor(fogindex, const String:color[], bool:primary = true)
|
|
{
|
|
// Set primary color.
|
|
if (primary)
|
|
{
|
|
// Set new color.
|
|
SetVariantString(color);
|
|
AcceptEntityInput(fogindex, "SetColor");
|
|
}
|
|
// Set secondary color.
|
|
else
|
|
{
|
|
// Set new color.
|
|
SetVariantString(color);
|
|
AcceptEntityInput(fogindex, "SetColorSecondary");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set fog's density.
|
|
*
|
|
* @param fogindex Edict index of the fog to modify.
|
|
* @param density The density of the fog.
|
|
*/
|
|
VEffectsSetFogDensity(fogindex, Float:density)
|
|
{
|
|
// Set density.
|
|
DispatchKeyValueFloat(fogindex, "fogmaxdensity", density);
|
|
}
|
|
|
|
/**
|
|
* Set fog's start distance.
|
|
*
|
|
* @param fogindex Edict index of the fog to modify.
|
|
* @param startdist The start distance of the fog.
|
|
*/
|
|
VEffectsSetFogStartDist(fogindex, startdist)
|
|
{
|
|
// Set start distance.
|
|
SetVariantInt(startdist);
|
|
AcceptEntityInput(fogindex, "SetStartDist");
|
|
}
|
|
|
|
/**
|
|
* Set fog's end distance.
|
|
*
|
|
* @param fogindex Edict index of the fog to modify.
|
|
* @param enddist The end distance of the fog.
|
|
*/
|
|
VEffectsSetFogEndDist(fogindex, enddist)
|
|
{
|
|
// Set end distance.
|
|
SetVariantInt(enddist);
|
|
AcceptEntityInput(fogindex, "SetEndDist");
|
|
}
|
|
|
|
/**
|
|
* Set fog's far z distance.
|
|
*
|
|
* @param fogindex Edict index of the fog to modify.
|
|
* @param farz The far z distance of the fog.
|
|
*/
|
|
VEffectsSetFogFarZ(fogindex, farz)
|
|
{
|
|
// Set far z distance.
|
|
SetVariantInt(farz);
|
|
AcceptEntityInput(fogindex, "SetFarZ");
|
|
}
|
|
|
|
/**
|
|
* Create an energy splash effect.
|
|
*
|
|
* @param client The client index.
|
|
* @param origin The origin of the effect.
|
|
* @param direction The direction of the effect.
|
|
*/
|
|
VEffectsCreateEnergySplash(const Float:origin[3], const Float:direction[3], bool:explosive)
|
|
{
|
|
TE_SetupEnergySplash(origin, direction, explosive);
|
|
TE_SendToAll();
|
|
}
|
|
|
|
/**
|
|
* Create an explosion effect with strict flags.
|
|
*
|
|
* @param origin The (x, y, z) coordinate of the explosion.
|
|
* @param flags The flags to set on the explosion.
|
|
*/
|
|
VEffectsCreateExplosion(const Float:origin[3], flags)
|
|
{
|
|
// Create an explosion entity.
|
|
new explosion = CreateEntityByName("env_explosion");
|
|
|
|
// If explosion entity isn't valid, then stop.
|
|
if (explosion == -1)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Get and modify flags on explosion.
|
|
new spawnflags = GetEntProp(explosion, Prop_Data, "m_spawnflags");
|
|
spawnflags = spawnflags | EXP_NODAMAGE | EXP_NODECAL | flags;
|
|
|
|
// Set modified flags on entity.
|
|
SetEntProp(explosion, Prop_Data, "m_spawnflags", spawnflags);
|
|
|
|
// Spawn the entity into the world.
|
|
DispatchSpawn(explosion);
|
|
|
|
// Set the origin of the explosion.
|
|
DispatchKeyValueVector(explosion, "origin", origin);
|
|
|
|
// Set fireball material.
|
|
PrecacheModel("materials/sprites/xfireball3.vmt");
|
|
DispatchKeyValue(explosion, "fireballsprite", "materials/sprites/xfireball3.vmt");
|
|
|
|
// Tell the entity to explode.
|
|
AcceptEntityInput(explosion, "Explode");
|
|
|
|
// Remove entity from world.
|
|
RemoveEdict(explosion);
|
|
}
|
|
|
|
/**
|
|
* Shake a client's screen with specific parameters.
|
|
*
|
|
* @param client The client index.
|
|
* @param amplitude The amplitude (intensity) of the shaking.
|
|
* @param frequency The frequency (speed) of the shaking.
|
|
* @param duration The duration (time) of the shaking.
|
|
*/
|
|
VEffectsShakeClientScreen(client, Float:amplitude, Float:frequency, Float:duration)
|
|
{
|
|
// If shake usermsg isn't invalid, then stop.
|
|
new Handle:hShake = StartMessageOne("Shake", client);
|
|
if (hShake == INVALID_HANDLE)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Write shake information to usermsg handle.
|
|
BfWriteByte(hShake, 0);
|
|
BfWriteFloat(hShake, amplitude);
|
|
BfWriteFloat(hShake, frequency);
|
|
BfWriteFloat(hShake, duration);
|
|
|
|
// End usermsg and send to client.
|
|
EndMessage();
|
|
}
|