/* AMX Mod X
* Ethereal.
*
* http://aghl.ru/forum/ - Russian Half-Life and Adrenaline Gamer Community
*
* This file is provided as is (no warranties)
*/
#pragma semicolon 1
#pragma ctrlchar '\'
#include <amxmodx>
#include <hamsandwich>
#include <hl_wpnmod>
#include <beams>
#include <xs>
#define PLUGIN "Ethereal"
#define VERSION "1.0"
#define AUTHOR "KORD_12.7"
// Weapon settings
#define WEAPON_NAME "weapon_ethereal"
#define WEAPON_SLOT 2
#define WEAPON_POSITION 5
#define WEAPON_PRIMARY_AMMO "uranium"
#define WEAPON_PRIMARY_AMMO_MAX 100
#define WEAPON_SECONDARY_AMMO "" // NULL
#define WEAPON_SECONDARY_AMMO_MAX -1
#define WEAPON_MAX_CLIP 30
#define WEAPON_DEFAULT_AMMO 30
#define WEAPON_FLAGS 0
#define WEAPON_WEIGHT 15
#define WEAPON_DAMAGE 40.0
// Hud
#define WEAPON_HUD_TXT "sprites/weapon_ethereal.txt"
#define WEAPON_HUD_SPR "sprites/weapon_ethereal.spr"
// Models
#define MODEL_WORLD "models/w_ethereal.mdl"
#define MODEL_VIEW "models/v_ethereal_hev.mdl"
#define MODEL_PLAYER "models/p_ethereal.mdl"
// Sounds
#define SOUND_FIRE "weapons/ethereal-1.wav"
#define SOUND_DRAW "weapons/ethereal_draw.wav"
#define SOUND_IDLE "weapons/ethereal_idle1.wav"
#define SOUND_IMPACT "weapons/shock_impact.wav"
#define SOUND_RELOAD "weapons/ethereal_reload.wav"
// Sprites
#define SPRITE_LIGHTNING "sprites/lgtning.spr"
// Beam
#define BEAM_LIFE 0.09
#define BEAM_COLOR {100.0, 50.0, 253.0}
#define BEAM_BRIGHTNESS 255.0
#define BEAM_SCROLLRATE 10.0
// Animation
#define ANIM_EXTENSION "gauss"
// Animation Sequence
enum _:Animation
{
ANIM_IDLE = 0,
ANIM_RELOAD,
ANIM_DRAW,
ANIM_FIRE_1,
ANIM_FIRE_2,
ANIM_FIRE_3
};
#define Beam_SetLife(%0,%1) \
wpnmod_set_think(%0, "Beam_Remove"); \
set_pev(%0, pev_nextthink, get_gametime() + %1)
//**********************************************
//* Precache resources *
//**********************************************
public plugin_precache()
{
PRECACHE_MODEL(MODEL_VIEW);
PRECACHE_MODEL(MODEL_WORLD);
PRECACHE_MODEL(MODEL_PLAYER);
PRECACHE_MODEL(SPRITE_LIGHTNING);
PRECACHE_SOUND(SOUND_FIRE);
PRECACHE_SOUND(SOUND_DRAW);
PRECACHE_SOUND(SOUND_IDLE);
PRECACHE_SOUND(SOUND_IMPACT);
PRECACHE_SOUND(SOUND_RELOAD);
PRECACHE_GENERIC(WEAPON_HUD_TXT);
PRECACHE_GENERIC(WEAPON_HUD_SPR);
}
//**********************************************
//* Register weapon. *
//**********************************************
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
new iEthereal = wpnmod_register_weapon
(
WEAPON_NAME,
WEAPON_SLOT,
WEAPON_POSITION,
WEAPON_PRIMARY_AMMO,
WEAPON_PRIMARY_AMMO_MAX,
WEAPON_SECONDARY_AMMO,
WEAPON_SECONDARY_AMMO_MAX,
WEAPON_MAX_CLIP,
WEAPON_FLAGS,
WEAPON_WEIGHT
);
wpnmod_register_weapon_forward(iEthereal, Fwd_Wpn_Spawn, "Ethereal_Spawn");
wpnmod_register_weapon_forward(iEthereal, Fwd_Wpn_Deploy, "Ethereal_Deploy");
wpnmod_register_weapon_forward(iEthereal, Fwd_Wpn_Idle, "Ethereal_Idle");
wpnmod_register_weapon_forward(iEthereal, Fwd_Wpn_Reload, "Ethereal_Reload");
wpnmod_register_weapon_forward(iEthereal, Fwd_Wpn_Holster, "Ethereal_Holster");
wpnmod_register_weapon_forward(iEthereal, Fwd_Wpn_PrimaryAttack, "Ethereal_PrimaryAttack");
}
//**********************************************
//* Weapon spawn. *
//**********************************************
public Ethereal_Spawn(const iItem)
{
// Setting world model
SET_MODEL(iItem, MODEL_WORLD);
// Give a default ammo to weapon
wpnmod_set_offset_int(iItem, Offset_iDefaultAmmo, WEAPON_DEFAULT_AMMO);
}
//**********************************************
//* Deploys the weapon. *
//**********************************************
public Ethereal_Deploy(const iItem, const iPlayer)
{
// Start idle sound
engfunc(EngFunc_EmitSound, iPlayer, CHAN_AUTO, SOUND_IDLE, 0.4, ATTN_NORM, 0, PITCH_NORM);
return wpnmod_default_deploy(iItem, MODEL_VIEW, MODEL_PLAYER, ANIM_DRAW, ANIM_EXTENSION);
}
//**********************************************
//* Called when the weapon is holster. *
//**********************************************
public Ethereal_Holster(const iItem, const iPlayer)
{
// Cancel any reload in progress.
wpnmod_set_offset_int(iItem, Offset_iInReload, 0);
// Stop idle sound
engfunc(EngFunc_EmitSound, iPlayer, CHAN_AUTO, SOUND_IDLE, 0.0, 0.0, SND_STOP, PITCH_NORM);
}
//**********************************************
//* Displays the idle animation for the weapon.*
//**********************************************
public Ethereal_Idle(const iItem, const iPlayer)
{
wpnmod_reset_empty_sound(iItem);
if (wpnmod_get_offset_float(iItem, Offset_flTimeWeaponIdle) > 0.0)
{
return;
}
wpnmod_send_weapon_anim(iItem, ANIM_IDLE);
wpnmod_set_offset_float(iItem, Offset_flTimeWeaponIdle, 10.03);
}
//**********************************************
//* The main attack of a weapon is triggered. *
//**********************************************
public Ethereal_PrimaryAttack(const iItem, const iPlayer, const iClip)
{
if (pev(iPlayer, pev_waterlevel) == 3 || iClip <= 0)
{
wpnmod_play_empty_sound(iItem);
wpnmod_set_offset_float(iItem, Offset_flNextPrimaryAttack, 0.15);
return;
}
new Float: vecSrc[3], Float: vecEnd[3], iBeam, iTrace = create_tr2();
wpnmod_get_gun_position(iPlayer, vecSrc);
global_get(glb_v_forward, vecEnd);
xs_vec_mul_scalar(vecEnd, 8192.0, vecEnd);
xs_vec_add(vecSrc, vecEnd, vecEnd);
engfunc(EngFunc_TraceLine, vecSrc, vecEnd, DONT_IGNORE_MONSTERS, iPlayer, iTrace);
get_tr2(iTrace, TR_vecEndPos, vecEnd);
if (pev_valid((iBeam = Beam_Create(SPRITE_LIGHTNING, 25.0))))
{
Beam_PointEntInit(iBeam, vecEnd, iPlayer);
Beam_SetEndAttachment(iBeam, 1);
Beam_SetBrightness(iBeam, BEAM_BRIGHTNESS);
Beam_SetScrollRate(iBeam, BEAM_SCROLLRATE);
Beam_SetColor(iBeam, BEAM_COLOR);
Beam_SetLife(iBeam, BEAM_LIFE);
}
wpnmod_radius_damage2(vecEnd, iPlayer, iPlayer, WEAPON_DAMAGE, WEAPON_DAMAGE * 2.0, CLASS_NONE, DMG_ENERGYBEAM | DMG_ALWAYSGIB);
engfunc(EngFunc_EmitSound, iPlayer, CHAN_AUTO, SOUND_FIRE, 0.9, ATTN_NORM, 0, PITCH_NORM);
engfunc(EngFunc_EmitAmbientSound, 0, vecEnd, SOUND_IMPACT, 0.9, ATTN_NORM, 0, PITCH_NORM);
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vecEnd, 0);
write_byte(TE_DLIGHT);
engfunc(EngFunc_WriteCoord, vecEnd[0]);
engfunc(EngFunc_WriteCoord, vecEnd[1]);
engfunc(EngFunc_WriteCoord, vecEnd[2]);
write_byte(10);
write_byte(100);
write_byte(50);
write_byte(253);
write_byte(255);
write_byte(25);
write_byte(1);
message_end();
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vecEnd, 0);
write_byte(TE_SPARKS);
engfunc(EngFunc_WriteCoord, vecEnd[0]);
engfunc(EngFunc_WriteCoord, vecEnd[1]);
engfunc(EngFunc_WriteCoord, vecEnd[2]);
message_end();
wpnmod_decal_trace(iTrace, engfunc(EngFunc_DecalIndex, "{smscorch1") + random_num(0, 2));
wpnmod_set_offset_int(iItem, Offset_iClip, iClip - 1);
wpnmod_set_offset_int(iPlayer, Offset_iWeaponVolume, LOUD_GUN_VOLUME);
wpnmod_set_offset_int(iPlayer, Offset_iWeaponFlash, BRIGHT_GUN_FLASH);
wpnmod_set_offset_float(iItem, Offset_flNextPrimaryAttack, 0.1);
wpnmod_set_offset_float(iItem, Offset_flTimeWeaponIdle, 1.03);
wpnmod_set_player_anim(iPlayer, PLAYER_ATTACK1);
wpnmod_send_weapon_anim(iItem, random_num(ANIM_FIRE_1, ANIM_FIRE_3));
free_tr2(iTrace);
}
//**********************************************
//* Called when the weapon is reloaded. *
//**********************************************
public Ethereal_Reload(const iItem, const iPlayer, const iClip, const iAmmo)
{
if (iAmmo <= 0 || iClip >= WEAPON_MAX_CLIP)
{
return;
}
wpnmod_default_reload(iItem, WEAPON_MAX_CLIP, ANIM_RELOAD, 3.03);
}
//**********************************************
//* Beam remove think. *
//**********************************************
public Beam_Remove(const iBeam)
{
set_pev(iBeam, pev_flags, FL_KILLME);
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1038\\ f0\\ fs16 \n\\ par }
*/