CSO Plasmagun

CSO Plasmagun 1.3

Нет прав для скачивания
Код:
/*
    Credits:
        KORD_12.7 - code improvements
        222202939 - model port from CSO
        Koshak      - model&sprite
*/

#include < amxmodx >
#include < engine >
#include < fakemeta >
#include < hamsandwich >
#include < hl_wpnmod >
#include < xs >

// Weapon parameters
#define WEAPON_NAME             "weapon_plasmagun"
#define WEAPON_SLOT            1
#define WEAPON_POSITION            5
#define WEAPON_SECONDARY_AMMO        "" // NULL
#define WEAPON_SECONDARY_AMMO_MAX    -1
#define WEAPON_CLIP            45
#define WEAPON_FLAGS            0
#define WEAPON_WEIGHT            15
#define WEAPON_RELOADTIME        3.36
#define WEAPON_REFIRE_RATE        0.15
#define WEAPON_DAMAGE            50.0
#define WEAPON_RADIUS            125.0

// Ammo parameters
#define AMMO_MODEL            "models/w_plasmabox.mdl"
#define AMMO_NAME            "plasma"
#define AMMO_MAX            200
#define AMMO_DEFAULT            90

// Models
#define MODEL_P                "models/p_plasmagun.mdl"
#define MODEL_V                "models/v_plasmagun.mdl"
#define MODEL_W                "models/w_plasmagun.mdl"

// Sounds
#define SOUND_FIRE            "weapons/plasmagun-1.wav"
#define SOUND_EXPLODE            "weapons/plasmagun_exp.wav"

// Ball sprite
#define PLASMA_MODEL            "sprites/plasmaball.spr"
#define PLASMA_EXPLODE            "sprites/plasmabomb.spr"
#define PLASMA_VELOCITY            1200

// V_ model sequences
#define SEQ_IDLE            0
#define SEQ_DEPLOY            2
#define SEQ_RELOAD            1
#define SEQ_FIRE            3

// Playermodel anim group
#define ANIM_EXTENSION            "gauss"

// HUD sprites
new const HUD_SPRITES[ ][ ]        =
{
    "sprites/weapon_plasmagun.txt",
    "sprites/weapon_plasmagun.spr"
};

new const SOUND_OTHER[ ][ ]        =
{
    "weapons/plasmagun_clipin1.wav",
    "weapons/plasmagun_clipin2.wav",
    "weapons/plasmagun_clipout.wav",
    "weapons/plasmagun_draw.wav",
    "weapons/plasmagun_idle.wav"
};
//===================================================================
new g_sModelIndexExplode;

#define CLASS_PLASMABOX            "ammo_plasmabox"
#define CLASS_PLASMA            "monster_plasma"

new const Float:gVecZero[ ]        = { 0.0, 0.0, 0.0 };
//
// Precache resources
//
public plugin_precache( )
{
    new i;
    
    // Models
    PRECACHE_MODEL( MODEL_P );
    PRECACHE_MODEL( MODEL_V );
    PRECACHE_MODEL( MODEL_W );
    PRECACHE_MODEL( AMMO_MODEL );
    // Sounds
    PRECACHE_SOUND( SOUND_FIRE );
    PRECACHE_SOUND( SOUND_EXPLODE );
    for( i = 0; i < sizeof SOUND_OTHER; i++ )
        PRECACHE_SOUND( SOUND_OTHER[ i ] );
    // Sprites
    PRECACHE_MODEL( PLASMA_MODEL );
    g_sModelIndexExplode = PRECACHE_MODEL( PLASMA_EXPLODE );
    // HUD
    for( i = 0; i < sizeof HUD_SPRITES; i++ )
        PRECACHE_GENERIC( HUD_SPRITES[ i ] );
}
//
// Create the weapon and the ammo box
//
public plugin_init( )
{
    register_plugin( "[HL] Weapon Plasmagun", "1.3", "NiHiLaNTh" );
    //
    // Weapon
    //
    new pWeapon = wpnmod_register_weapon
    (
        WEAPON_NAME,
        WEAPON_SLOT,
        WEAPON_POSITION,
        AMMO_NAME,
        AMMO_MAX,
        WEAPON_SECONDARY_AMMO,
        WEAPON_SECONDARY_AMMO_MAX,
        WEAPON_CLIP,
        WEAPON_FLAGS,
        WEAPON_WEIGHT
    );
    
    wpnmod_register_weapon_forward( pWeapon, Fwd_Wpn_Spawn,         "CPlasma__Spawn" );
    wpnmod_register_weapon_forward( pWeapon, Fwd_Wpn_Deploy,     "CPlasma__Deploy" );
    wpnmod_register_weapon_forward( pWeapon, Fwd_Wpn_Idle,         "CPlasma__WeaponIdle" );
    wpnmod_register_weapon_forward( pWeapon, Fwd_Wpn_PrimaryAttack,    "CPlasma__PrimaryAttack" );
    wpnmod_register_weapon_forward( pWeapon, Fwd_Wpn_Reload,     "CPlasma__Reload" );
    wpnmod_register_weapon_forward( pWeapon, Fwd_Wpn_Holster,     "CPlasma__Holster" );
    //
    // Ammo
    //
    new pAmmo = wpnmod_register_ammobox( CLASS_PLASMABOX );
    
    wpnmod_register_ammobox_forward( pAmmo, Fwd_Ammo_Spawn,         "CPlasmaAmmo__Spawn" );
    wpnmod_register_ammobox_forward( pAmmo, Fwd_Ammo_AddAmmo,    "CPlasmaAmmo__AddAmmo" );
}
//
// Spawn
//
public CPlasma__Spawn( pItem )
{
    // Set the model
    SET_MODEL( pItem, MODEL_W );
    
    // Give some default ammo
    wpnmod_set_offset_int( pItem, Offset_iDefaultAmmo, AMMO_DEFAULT );
}
//
// Deploy
//
public CPlasma__Deploy( pItem )
{
    // Set models, player deploy anim and set correct anim extension for the
    // player model.
    return wpnmod_default_deploy( pItem, MODEL_V, MODEL_P, SEQ_DEPLOY, ANIM_EXTENSION );
}
//
// Hide the weapon
//
public CPlasma__Holster( pItem, pPlayer )
{
    // Cancel any reload in progress.
    wpnmod_set_offset_int( pItem, Offset_iInReload, 0 );
}
// 
// Reload the weapon
//
public CPlasma__Reload( pItem, pPlayer, iClip, iAmmo )
{
    if( iAmmo <= 0 || iClip >= WEAPON_CLIP )
        return;
    
    // Call for reloading
    wpnmod_default_reload( pItem, WEAPON_CLIP, SEQ_RELOAD, WEAPON_RELOADTIME );
}
//
// Primary attack
//
public CPlasma__PrimaryAttack( pItem, pPlayer, iClip, rgAmmo )
{
    if( iClip <= 0 || entity_get_int( pPlayer, EV_INT_waterlevel ) == 3 )
    {
        wpnmod_play_empty_sound( pItem );
        wpnmod_set_offset_float( pItem, Offset_flNextPrimaryAttack, 0.25 );
        return;
    }
    
    if( CPlasmab__Spawn( pPlayer ) )
    {
        //fire effects
        wpnmod_set_offset_int( pPlayer, Offset_iWeaponVolume, NORMAL_GUN_VOLUME );
        wpnmod_set_offset_int( pPlayer, Offset_iWeaponFlash, DIM_GUN_FLASH );
        
        //remove ammo
        wpnmod_set_offset_int( pItem, Offset_iClip, iClip -= 1 );
        
        entity_set_int( pPlayer, EV_INT_effects, entity_get_int( pPlayer, EV_INT_effects ) | EF_MUZZLEFLASH );
        wpnmod_set_player_anim( pPlayer, PLAYER_ATTACK1 );
    
        wpnmod_set_offset_float( pItem, Offset_flNextPrimaryAttack, WEAPON_REFIRE_RATE );
        wpnmod_set_offset_float( pItem, Offset_flTimeWeaponIdle, WEAPON_REFIRE_RATE + 3.0 );
        
        emit_sound( pPlayer, CHAN_WEAPON, SOUND_FIRE, 0.9, ATTN_NORM, 0, PITCH_NORM );
        wpnmod_send_weapon_anim( pItem, SEQ_FIRE );
        entity_set_vector( pPlayer, EV_VEC_punchangle, Float:{ -5.0, 0.0, 0.0 } );
    }
}
//
// Weapon idle
//
public CPlasma__WeaponIdle( pItem, pPlayer, iClip, iAmmo )
{
    // Reset empty sound
    wpnmod_reset_empty_sound( pItem );
    
    if( wpnmod_get_offset_float( pItem, Offset_flTimeWeaponIdle ) > 0.0 )
        return;
    
    wpnmod_send_weapon_anim( pItem, SEQ_IDLE );
    wpnmod_set_offset_float( pItem, Offset_flTimeWeaponIdle, random_float( 5.0, 15.0 ) );
}
//
// Plasma ball spawn
//
CPlasmab__Spawn( pPlayer )
{
    new pPlasma = create_entity( "env_sprite" );
    
    if( pPlasma <= 0 )
        return 0;
        
    // Kill any old beams
    message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
    write_byte( TE_KILLBEAM );
    write_short( pPlasma );
    message_end( );
        
    // classname
    entity_set_string( pPlasma, EV_SZ_classname, CLASS_PLASMA );
    
    // model
    entity_set_model( pPlasma, PLASMA_MODEL );
    
    // origin
    static Float:vecSrc[ 3 ];
    wpnmod_get_gun_position( pPlayer, vecSrc, 25.0, 16.0, -7.0 );
    entity_set_origin( pPlasma, vecSrc );

    entity_set_int( pPlasma, EV_INT_movetype, MOVETYPE_FLY );
    entity_set_int( pPlasma, EV_INT_solid, SOLID_BBOX );
    
    // null size
    entity_set_size( pPlasma, gVecZero, gVecZero );
    
    // remove black square around the sprite
    entity_set_float( pPlasma, EV_FL_renderamt, 255.0 );
    entity_set_float( pPlasma, EV_FL_scale, 0.3 );
    entity_set_int( pPlasma, EV_INT_rendermode, kRenderTransAdd );
    entity_set_int( pPlasma, EV_INT_renderfx, kRenderFxGlowShell );
    
    // velocity
    static Float:vecVelocity[ 3 ];
    velocity_by_aim( pPlayer, PLASMA_VELOCITY, vecVelocity );
    entity_set_vector( pPlasma, EV_VEC_velocity, vecVelocity );
     
    // angles
    static Float:vecAngles[ 3 ];
    engfunc( EngFunc_VecToAngles, vecVelocity, vecAngles );
    entity_set_vector( pPlasma, EV_VEC_angles, vecAngles );
    
    // owner
    entity_set_edict( pPlasma, EV_ENT_owner, pPlayer );
    
    wpnmod_set_touch( pPlasma, "CPlasmab__Touch" );
    
    return 1;
}
// 
// Plasma ball hit the world
//
public CPlasmab__Touch( pPlasma, pOther )
{
    if( !is_valid_ent( pPlasma ) )
        return;
    
    static Float:vecSrc[ 3 ];
    entity_get_vector( pPlasma, EV_VEC_origin, vecSrc );
    
    engfunc( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vecSrc, 0 );
    write_byte( TE_EXPLOSION );
    engfunc( EngFunc_WriteCoord, vecSrc[ 0 ] );
    engfunc( EngFunc_WriteCoord, vecSrc[ 1 ] );
    engfunc( EngFunc_WriteCoord, vecSrc[ 2 ] );
    write_short( g_sModelIndexExplode );
    write_byte( 5 );
    write_byte( 15 );
    write_byte( TE_EXPLFLAG_NOPARTICLES | TE_EXPLFLAG_NOSOUND );
    message_end( );
    
    emit_sound( pPlasma, CHAN_WEAPON, SOUND_EXPLODE, 1.0, 1.0, 0, 100 );
        
    wpnmod_radius_damage( vecSrc, pPlasma, entity_get_edict( pPlasma, EV_ENT_owner ), WEAPON_DAMAGE, WEAPON_RADIUS, CLASS_NONE, DMG_ACID | DMG_ENERGYBEAM );    
    remove_entity( pPlasma );    
}
//
// Fuel spawn
//
public CPlasmaAmmo__Spawn( pItem )
{
    // Apply new model
    SET_MODEL( pItem, AMMO_MODEL );
}
//
// Give some fuel to the player
//
public CPlasmaAmmo__AddAmmo( pItem, pPlayer )
{
    new iResult = 
    (
        ExecuteHamB
        (
            Ham_GiveAmmo, 
            pPlayer, 
            WEAPON_CLIP, 
            AMMO_NAME,
            AMMO_MAX
        ) != -1
    );
    
    if( iResult )
    {
        emit_sound( pItem, CHAN_ITEM, "items/9mmclip1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM );
    }
    
    return iResult;
}
Назад
Верх