Here's some real life code from my l4d races to illustrate how easy it is

.
Spawns a ammo pile that lasts for some time, emits light around it and attaches a particle to make sure people don't miss it. (The trace function just gets the location the player aimed at)
public OnMapStart()
{
War3_PrecacheParticle(PARTICLE_AMMOPILE);
War3_PrecacheParticle(PARTICLE_LAUNCHER);
}
public OnUltimateCommand(client,race,bool:pressed)
{
if(ValidPlayer(client, true) &&
race == thisRaceID &&
pressed &&
War3_SkillNotInCooldown(client, thisRaceID, ULTIMATE_AMMOSHARER, true) &&
!Silenced(client) &&
GetClientTeam(client) == TEAM_SURVIVORS &&
!War3_L4D_IsHelpless(client) &&
!War3_IsPlayerIncapped(client))
{
new skill = War3_GetSkillLevel(client, thisRaceID, ULTIMATE_AMMOSHARER);
if (skill > 0)
{
new Float:location[3];
if (!Misc_TraceClientViewToLocation(client, location)) {
GetClientAbsOrigin(client, location);
}
Do_CreateEntity("weapon_ammo_spawn", location);
ThrowAwayLightEmitter(location, "255 250 90 255", "5", 110.0, 20.0);
location[2] += 7;
ThrowAwayParticle(PARTICLE_AMMOPILE, location, 20.0);
War3_CooldownMGR(client, ULT_COOLDOWN, thisRaceID, ULTIMATE_AMMOSHARER);
}
}
}
Do_CreateEntity(const String:name[], Float:location[3]) {
new entity = CreateEntityByName(name);
DispatchSpawn(entity);
ActivateEntity(entity);
TeleportEntity(entity, location, NULL_VECTOR, NULL_VECTOR);
SetVariantString("OnUser1 !self:Kill::20.0:-1");
AcceptEntityInput(entity, "AddOutput");
AcceptEntityInput(entity, "FireUser1");
}
This attaches a green light to a players eyes. Run on spawn, race change, skill level change etc. Looks like
thischeckLightEffect(client)
{
if(ValidPlayer(client, true) && War3_GetRace(client) == thisRaceID && GetClientTeam(client) == TEAM_SURVIVORS)
{
new skill = War3_GetSkillLevel(client, thisRaceID, SKILL_RADIATION);
if (skill > 0 )
{
decl String:className[64];
if(IsValidEdict(g_iRadiationLight[client]))
GetEdictClassname(g_iRadiationLight[client], className, sizeof(className));
if(!StrEqual(className, "light_dynamic"))
{
g_iRadiationLight[client] = AttachLight(client, NULL_VECTOR, "0 255 0 255", "5", 80.0, "eyes");
SetVariantString("OnUser1 !self:Distance:120:0.1:-1");
AcceptEntityInput(g_iRadiationLight[client], "AddOutput");
AcceptEntityInput(g_iRadiationLight[client], "FireUser1");
}
}
else
{
KillLightEntity(client);
}
}
}
And this is some throwaway ultimate particle
public OnUltimateCommand(client,race,bool:pressed)
{
if(ValidPlayer(client, true) &&
race == thisRaceID &&
pressed &&
War3_SkillNotInCooldown(client, thisRaceID, ULT_FIREWAVE, true) &&
!Silenced(client) &&
GetClientTeam(client) == TEAM_SURVIVORS &&
!War3_L4D_IsHelpless(client) &&
!War3_IsPlayerIncapped(client))
{
new skill = War3_GetSkillLevel(client, thisRaceID, ULT_FIREWAVE);
if (skill > 0)
{
new entity = -1;
new Float:VictimPosition[3];
new Float:CasterPosition[3];
decl String:ModelName[128];
//GetClientAbsOrigin(client, CasterPosition);
GetClientEyePosition(client, CasterPosition);
[...] // find entitys, hurt them etc
EmitSoundToAll(UltimateSnd, client);
decl Float:fPos[3];
GetEntPropVector(client, Prop_Send, "m_vecOrigin", fPos);
fPos[2] += 50.0;
ThrowAwayParticle("gas_explosion_pump", fPos, 2.5);
ThrowAwayLightEmitter(fPos, "225 30 0 255", "5", 800.0, 0.4);
War3_CooldownMGR(client, ULT_COOLDOWN, thisRaceID, ULT_FIREWAVE);
}
}
}
As you can see, I provided some easy one liners to fit 90% of your effect needs. Some cases still need some manual work though (Like changing the distance for the green light example ;>).